首页
社区
课程
招聘
windows smb协议简单分析
发表于: 2019-4-5 11:39 11719

windows smb协议简单分析

2019-4-5 11:39
11719

client和server首先要建立全双工的TCP连接,然后client建立并发送一个NetBIOS session请求包。
如果请求包格式化正确,server返回一个包含着确认session建立成功的消息包。然后,client
开始想server发送第一个smb协议数据包。

Packet1. SMB_COM_NEGOTIATE

Packet2. SMB_COM_NEGOTIATE

Packet3. SMB_COM_SESSION_SETUP_ANDX

Packet4. SMB_COM_SESSION_SETUP_ANDX

Packet5. SMB_COM_TREE_CONNECT_ANDX

Packet6. SMB_COM_TREE_CONNECT_ANDX

Packet7. SMB_COM_OPEN_ANDX

Packet8. SMB_COM_OPEN_ANDX

Packet9. SMB_COM_READ_ANDX

Packet10. SMB_COM_READ_ANDX

SMB Message包括一个固定长度的header(32字节)、一个可变长度的Parameter block(最大为64kb)、一个可变长度的Data block。

The SMB Message Header
32字节的固定长度。

简单说一下比较重要的部分:

Parameter Block
在CIFS方言中,SMB_Parameters.Words数组可以包含任意结构。 SMB_Parameters.Words结构的格式是针对每个命令消息单独定义的。 Words数组的大小仍然被测量为字节对的计数。其结构如下所示:

Data Block
结构与Parameter Block相似:

Batched Message(AndX Messages)
主要是为了在一个message中发送多个request或者response command,而只需要一个smb header即可。
In AndX Messages, only one SMB Header (section 2.2.3.1) is sent. The header is then followed by zero or more Parameter and Data block pairs, each corresponding to an additional command request/response. There is no limit on the number of block pairs in a message specifically, only on the total message size. The total size of a Batched Message MUST NOT exceed the negotiated MaxBufferSize. AndX Messages contain a construct, conceptually similar to a linked-list, that is used to connect the batched block pairs. The resulting list is referred to as an AndX Chain.
其结构如下:

AndXOffset (2 bytes): The offset in bytes, relative to the start of the SMB Header, of the next Parameter block in the AndX Message. This offset is independent of any other size parameters or offsets within the command. This offset can point to a location past the end of the current block pair.

The AndX construct is located at the start of the Parameter block of an AndX command request/response.

由于commands数量较多,此处给出微软官方的命令解释地址。

这是SMB协议的第一步,首先进行的是Negotite and Tree Connect。在该过程中,使用的SMB命令为SMB_COM_NEGOTIATE(0x72),此命令用于启动客户端和服务器之间的SMB连接。 在将任何其他SMB消息发送到服务器之前,必须完成SMB_COM_NEGOTIATE交换。需要注意的是每个SMB连接只能有一个SMB_COM_NEGOTIATE交换。 必须拒绝服务器收到的后续SMB_COM_NEGOTIATE请求以及错误响应。 服务器不得采取任何其他行动。

从图中可以看出,在完成了SMB_COM_NEGOTIATE交换之后,再进行session的建立和Tree的连接,完成这三个步骤之后,一个SMB的连接基本配置完成。

在SMB连接和会话已经完成时,客户端会按照此示例从共享服务端断开连接。

该过程中基本只涉及到一个SMB_COM_TREE_DISCONNECT(0x71)命令,相对来说比较简单。客户端响应收到response后,SMB连接正式中断。

最后说一个稍微复杂一点的例子,获取共享文件的相关属性的过程。

在连接建立后,客户端向共享服务端发起文件访问请求,在该过程中,双方要确认访问的文件的相关属性以确定客户端是否有权访问或者具体访问哪个文件。
从图中可以看出,该过程是分多次完成的。客户端发起SMB_FIND_FIRST(0X32)请求告诉共享服务端要执行的操作,然后客户端传输一个SMB_COM_QUERY_INFORMATION(0x08),共享服务端返回相应的文件数据,这样就完成了一次文件属性的获取。然后,客户端和共享服务端将通过多次请求以确定所有的待访问文件属性的确认,最后客户端在获取到自己需要的所有信息后发起SMB_COM_FIND_CLOSE(0x34)终止该过程。

 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-4-23 17:35 被有毒编辑 ,原因: 格式修改
收藏
免费 2
支持
分享
最新回复 (4)
雪    币: 284
活跃值: (3604)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
2
赞一下
2019-4-6 16:12
0
雪    币: 2375
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主用的什么抓包工具呢?
2019-4-25 06:48
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark
2019-4-25 08:08
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
5
petersonhz 楼主用的什么抓包工具呢?
wireshark
2019-4-25 11:59
0
游客
登录 | 注册 方可回帖
返回
//