SMB(Server Message Block)协议,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。SMB使用了NetBIOS的应用程序接口 (Application Program Interface,简称API)。另外,它是一个开放性的协议,允许了协议扩展——使得它变得更大而且复杂;大约有65个最上层的作业,而每个作业都超过120个函数,甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(Common Internet File System),并且加入了许多新的特色。SMB协议一般端口使用为139,445。
CIFS协议有三个版本:SMB、SMB2、SMB3,下面用wireshark针对smbv3协议分析。具体SMB协议请参考微软的官方文档

0x01 TCP三次握手

这个不用多说,懂的都懂
Snipaste_2020-08-04_23-07-07.png

0x02 SMB协商

客户端对对服务端发起Negotiate Protocol Request,Dialects字段列出客户端支持的SMB版本,SMB2_PREAUTH_INTEGRITY_CAPABILITIES 字段表示客户端支持哪种预身份验证完整性哈希算法,并提供哈希盐值。SMB2_ENCRYPTION_CAPABILITIES 字段表示客户端支持哪种加密算法。
Snipaste_2020-08-05_11-29-24.png
随后服务端回应Negotiate Protocol Response,确定协商的SMB版本信息等,服务器会以支持的最高SMB版本作为回应。
Snipaste_2020-08-11_12-51-08.png

0x03 Session Setup

Session Setup最主要任务是身份认证,常用的方式有Kerberos和NTLM。StructureSize表明请求结构大小,Security mode表明安全模式字段指定在客户端启用还是要求SMB签名。客户端请求NTLMSSP_NEGOTIATE,进行NTLMSSP的协商。可以看到Security Blob中选用GSS-API(通用安全服务应用程序接口),其中选用了NTLM认证方式,也就是常见的账号密码认证。
Snipaste_2020-08-16_17-31-33.png
服务端返回NTLMSSP协商信息,其中最重要的是ntlmssp.ntlmserverchallenge字段,客户端随后会根据这个字段结合账号密码等信息加密返回认证信息。NTLM概述及解密可以看以下两篇文章:Windows内网协议学习NTLM篇之NTLM基础介绍“九步曲”——从.pcap文件破解NTLMv2 Hash
Snipaste_2020-08-16_18-45-53.png
客户端将正确的ntlmssp.ntlmv2_response和用户名、域名发送出去后,服务器返回认证完成。
Snipaste_2020-08-16_19-02-44.png

0x04 Tree Connect

认证完成后,客户端发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称。
Snipaste_2020-08-16_19-12-11.png
服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝。
Snipaste_2020-08-16_19-15-35.png

0x05 Ioctl Request

客户端发送SMB2 IOCTL请求数据包,以在网络上发出特定于实现的文件系统控制 或设备控制(FSCTL / IOCTL)命令。详解微软文档。我这里抓包抓到的是Ioctl Request FSCTL_QUERY_NETWORK_INTERFACE_INFO,这是SMB3中特有的,提供TreeConnect的句柄。详见3.2.4.20.10 Application Requests Querying Server's Network Interfaces
Snipaste_2020-08-18_22-23-37.png

0x06 Create Request

客户端发送SMB2 CREATE Request数据包,以请求创建或访问文件。如果是命名管道或打印机,则服务器必须创建一个新文件。我这里抓的包是客户端发送SMB2 CREATE请求以打开命名管道“ srvsvc”。
Snipaste_2020-08-18_22-50-41.png
SMB就研究到这里吧,总体来说,这个协议还是很复杂的,具体细节以后再研究吧。

参考文档:
wireshark网络分析就这么简单-林沛满
https://www.cnblogs.com/yuzly/p/10480438.html
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/5606ad47-5ee0-437a-817e-70c366052962
Last modification:August 18th, 2020 at 11:42 pm