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三次握手
这个不用多说,懂的都懂
0x02 SMB协商
客户端对对服务端发起Negotiate Protocol Request
,Dialects字段列出客户端支持的SMB版本,SMB2_PREAUTH_INTEGRITY_CAPABILITIES 字段表示客户端支持哪种预身份验证完整性哈希算法,并提供哈希盐值。SMB2_ENCRYPTION_CAPABILITIES 字段表示客户端支持哪种加密算法。
随后服务端回应Negotiate Protocol Response
,确定协商的SMB版本信息等,服务器会以支持的最高SMB版本作为回应。
0x03 Session Setup
Session Setup
最主要任务是身份认证,常用的方式有Kerberos和NTLM。StructureSize表明请求结构大小,Security mode表明安全模式字段指定在客户端启用还是要求SMB签名。客户端请求NTLMSSP_NEGOTIATE
,进行NTLMSSP的协商。可以看到Security Blob中选用GSS-API(通用安全服务应用程序接口),其中选用了NTLM认证方式,也就是常见的账号密码认证。
服务端返回NTLMSSP协商信息,其中最重要的是ntlmssp.ntlmserverchallenge
字段,客户端随后会根据这个字段结合账号密码等信息加密返回认证信息。NTLM概述及解密可以看以下两篇文章:Windows内网协议学习NTLM篇之NTLM基础介绍 和 “九步曲”——从.pcap文件破解NTLMv2 Hash。
客户端将正确的ntlmssp.ntlmv2_response
和用户名、域名发送出去后,服务器返回认证完成。
0x04 Tree Connect
认证完成后,客户端发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称。
服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝。
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。
0x06 Create Request
客户端发送SMB2 CREATE Request数据包,以请求创建或访问文件。如果是命名管道或打印机,则服务器必须创建一个新文件。我这里抓的包是客户端发送SMB2 CREATE请求以打开命名管道“ srvsvc”。
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