SMB协议原理抓包分析

SMB协议原理抓包分析

SMB协议原理抓包分析

目录:

1.SMB概述

2.SMB原理

3.SMB配置

一、SMB概述

SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。

SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机等资源。

SMB一开始的设计是在NetBIOS协议上运行的,而NetBIOS本身则运行在NetBEUI、IPX/SPX或TCP/IP协议上。

NetBIOS 使用下列端口:UDP/137(NetBIOS 名称服务)、UDP/138(NetBIOS 数据报服务)、TCP/139(NetBIOS 会话服务);SMB 使用下列端口:TCP/139、TCP/445。  #NetBIOS用于局域网内主机名发现。

二、SMB服务工作原理

① 首先客户端发送一个SMB negprot请求数据报,并列出它所支持的所有SMB协议版本。服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0XFFFFH,结束通信。

② 协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SesssetupX请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器,然后服务器通过发送一个SesssetupX应答数据报来允许或拒绝本次连接。

③ 当客户端和服务器完成了磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问网络资源的名称,之后服务器会发送一个TconX应答数据报以表示此次连接是否被接受或拒绝。

④ 连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。

抓包分析如下:

实验环境,win10(客户端)开启SMB协议,win7(SMB协议服务端)开启SMB协议并建立一个共享文件的夹,用于测试SMB协议的通信过程

1.开启SMB协议

2.服务端创建一个共享文件夹

  

3.客户端开启抓包,通过UNC路径访问共享文件夹,输入用户名和密码

4.可以分析SMB工作原理

4.1首先客户端发送一个SMB negotiate protocol request请求数据报,并列出它所支持的所有SMB协议版本  

4.2服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0XFFFFH,结束通信。可以看到下图服务端希望使用的版本是SMB2.1 注意:win7虽然默认开启smbv1(只要开启共享服务),但是由于windows的安全机制,版本协商就高不就低,除非客户端版本只有SMBv1或者服务端只有SMBv1,这里就可以利用了:客户端可以恶意把版本设置为只能是SMBv1,这样服务端和客户端协商通过只能用SMBv1了。

版本对应关系如下:

0x0202   SMB 2.002
0x0210    SMB 2.1
0x0300    SMB 3.0
0x0302    SMB 3.02
0x02FF    SMB2  

4.3协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送session setup request请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器。  

4.5然后服务器通过发送一个Session setup response应答数据报来允许或拒绝本次连接。 

4.6当客户端和服务器完成了磋商和认证之后,它会发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称  

4.7之后服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝  

4.8连接到相应资源后,SMB客户端就能够干一些读、写(需要有权限)等操作了  

 三、SMB服务配置管理

1.启动网络共享,见上面的图

2. Windows 7、Windows Server 2008 上检测是否开启SMB

SMB 服务器上的 SMB v1:powershell 方法  默认启用,(未创建注册表项),所以不会返回 SMB1 值

2.1检测:Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}

  

2.2禁用SMB1   #这是再检测就可以看到有SMB1,因为禁用是在修改注册表

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force

   

2.3启用SMB1  #就是修改注册表的SMB对应的为1

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force

  

2.4检测SMBV2和v3,禁用和启用和上面的方法一样。

注册表编辑器:

若要在 SMB 服务器上启用或禁用 SMBv1,请配置以**册表项:

注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

注册表项: SMB1

REG_DWORD: 0 = 已禁用

REG_DWORD: 1 = 已启用

默认值: 1 = 已启用(未创建注册表项)

若要在 SMB 服务器上启用或禁用 SMBv2,请配置以**册表项:

注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

注册表项: SMB2

REG_DWORD: 0 = 已禁用

REG_DWORD: 1 = 已启用

默认值: 1 = 已启用(未创建注册表项)

注意进行这些更改后,必须重启计算机。

3.设置把WIN7的SMBV2禁用掉(这时只留下SMBV1了),测试客户端和服务端是否协商用smbv1版本进行通信。

  

4.抓包分析文件共享过程,这里只分析客户端发送协商之后,服务器响应给的版本,其他过程和上面的分析类似。 

 

 

https://www.cocosec.com/archives/323.html

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

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

Snipaste_2020-08-05_11-29-24.png
随后服务端回应Negotiate Protocol Response,确定协商的SMB版本信息等,服务器会以支持的最高SMB版本作为回应。
Snipaste_2020-08-11_12-51-08.pngSnipaste_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

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.pngSnipaste_2020-08-16_18-45-53.png
客户端将正确的ntlmssp.ntlmv2_response和用户名、域名发送出去后,服务器返回认证完成。
Snipaste_2020-08-16_19-02-44.pngSnipaste_2020-08-16_19-02-44.png

 

 

0x04 Tree Connect

认证完成后,客户端发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称。
Snipaste_2020-08-16_19-12-11.png

Snipaste_2020-08-16_19-12-11.png
服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝。
Snipaste_2020-08-16_19-15-35.pngSnipaste_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

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

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
posted @ 2022-11-21 14:29  bonelee  阅读(1538)  评论(0编辑  收藏  举报