0x00
在内网利用PTH进行横向移动时常使用的atexec/smbexec/psexec等都有smb协议的身影,而笔者对smb协议理解的也比较粗浅,所以对smb协议进行一个系统的学习,并作个记录。
0x01 SMBv1
CIFS协议是SMB协议的一个特定版本的特定叫法,本质还是SMB协议。其它的SMB协议版本对应有其它的叫法,这个叫法也可以说是方言。
服务器消息块 (SMB) 协议是网络文件共享协议,如 Microsoft Windows中实现的称为 Microsoft SMB 协议。 定义特定版本的协议的消息数据包集称为方言。 常见的 Internet 文件系统 (CIFS) 协议是 SMB 的方言。
CIFS协议可以进行客户端和服务器之间传输文件,也可以用于访问集中式打印队列,以及使用命名管道进行进程间通信。
0x010 SMBv1 消息结构
SMBv1消息由三部分构成
固定长度的SMB标头(SMB_Header)
可变长度的参数块(SMB_Parameters)
可变长度的数据块(SMB_Data)
0x0100 SMB_Header
SMB_Header结构如下
SMB_Header{
UCHAR Protocol[4];
UCHAR Command;
SMB_ERROR Status;
UCHAR Flags;
USHORT Flags2;
USHORT PIDHigh;
UCHAR SecurityFeatures[8];
USHORT Reserved;
USHORT TID;
USHORT PIDLow;
USHORT UID;
USHORT MID;
}
Command位用于表示发送的是什么命令,用命令对应的命令代码表示,比如我要发送SMB_COM_CREATE_DIRECTORY命令,则填充Command位为0x00,SMB_COM_CREATE_DIRECTORY命令的意思是创建一个新目录。其它命令可查看文档
SMB_Header结构的其它位的含义可以查看文档
0x0101 SMB_Parameters
SMB_Parameters结构如下
SMB_Parameters{
UCHAR WordCount;
USHORT Words[WordCount] (variable);
}
WordCount作为Words数组的宽度决定SMB_Parameters的大小,当WordCount为0时SMB_Parameters大小为1字节。
0x0102 SMB_Data
SMB_Data结构如下
SMB_Data{
USHORT ByteCount;
UCHAR Bytes[ByteCount] (variable);
}
WordCount作为Bytes数组的宽度决定SMB_Data的大小,当ByteCount为0时SMB_Data大小为2字节。