@H_4040@<span style="color: #ff0000; font-size: 18pt;">SMB协议原理抓包分析
@H4040@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">目录:
@H4040@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">1.SMB概述
@H4040@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">2.SMB原理
@H4040@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">3.SMB配置
@H4040@<span style="color: #ff0000; font-size: 18px;"><span style="color: #000000;">一、SMB概述
@H404_0@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。
@H_404_0@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机等资源。
@H_4040@<span style="color: #ff0000; font-size: 18pt;"><span style="font-size: 15px; color: #000000;">SMB一开始的设计是在NetBIOS协议上运行的,而NetBIOS本身则运行在NetBEUI、IPX/SPX或TCP/IP协议上。
@H404_0@<span style="font-size: 15px;">NetBIOS 使用下列端口:UDP/137(NetBIOS 名称服务)、UDP/138(NetBIOS 数据报服务)、TCP/139(NetBIOS 会话服务);SMB 使用下列端口:TCP/139、TCP/445。 #NetBIOS用于局域网内主机名发现。
@H_4040@<span style="font-size: 18px;">二、SMB服务工作原理
@H404_0@<span style="font-size: 15px;">① 首先客户端发送一个SMB negprot请求数据报,并列出它所支持的所有SMB协议版本。服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0XFFFFH,结束通信。
@H_404_0@<span style="font-size: 15px;">② 协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SesssetupX请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器,然后服务器通过发送一个SesssetupX应答数据报来允许或拒绝本次连接。
@H_404_0@<span style="font-size: 15px;">③ 当客户端和服务器完成了磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问网络资源的名称,之后服务器会发送一个TconX应答数据报以表示此次连接是否被接受或拒绝。
@H_404_0@<span style="font-size: 15px;">④ 连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过close SMB关闭文件。
@H_4040@<span style="font-size: 15px; color: #ff0000;">抓包分析如下:
@H404_0@<span style="font-size: 15px;">实验环境,win10(客户端)开启SMB协议,win7(SMB协议服务端)开启SMB协议并建立一个共享文件的夹,用于测试SMB协议的通信过程
@H_4040@<span style="font-size: 15px;">1.开启SMB协议
@H404_0@<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/a9e6f062836d0cc5816a47b4fc2a483e.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">2.服务端创建一个共享文件夹
@H_404_0@<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/3b56267659bc84fd217ca970d990c27d.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">3.客户端开启抓包,通过UNC路径访问共享文件夹,输入用户名和密码
@H_4040@<span style="font-size: 15px;">4.可以分析SMB工作原理
@H404_0@<span style="font-size: 15px;">4.1首先客户端发送一个SMB negotiate protocol request请求数据报,并列出它所支持的所有SMB协议版本<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/77438e80b39069fc30447c34ebbe1ef0.jpg" alt="">
@H_4040@<span style="font-size: 15px;">4.2服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0XFFFFH,结束通信。可以看到下图服务端希望使用的版本是SMB2.1 <span style="color: #ff0000;">注意:win7虽然默认开启smbv1(只要开启共享服务),但是由于windows的安全机制,版本协商就高不就低,除非客户端版本只有SMBv1或者服务端只有SMBv1,这里就可以利用了:客户端可以恶意把版本设置为只能是SMBv1,这样服务端和客户端协商通过只能用SMBv1了。
@H4040@<span style="font-size: 15px;">版本对应关系如下:
@H404_0@<span style="font-size: 15px;">0x0202 SMB 2.002
<span style="font-size: 15px;">0x0210 SMB 2.1
<span style="font-size: 15px;">0x0300 SMB 3.0
<span style="font-size: 15px;">0x0302 SMB 3.02
<span style="font-size: 15px;">0x02FF SMB2<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/cbf04056a60783777ec9789d38cf593c.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">4.3协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送session setup request请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器。<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/86897fc19732d0e4ec55be0ce5dc7989.jpg" alt="">
@H_404_0@4.5然后服务器<span style="font-size: 15px;">通过发送一个Session setup response应答数据报来允许或拒绝本次连接。<span style="font-size: 15px;">
<img style="font-size: 15px;" src="/res/2019/03-11/19/401a85d9380581bf46227d9c2a815156.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">4.6当客户端和服务器完成了磋商和认证之后,它会发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/dcb4709fc71c03fdc16b38fc34f7484c.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">4.7之后服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/9e39bfba2c0b12545d4619ef799dae8a.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">4.8连接到相应资源后,SMB客户端就能够干一些读、写(需要有权限)等操作了<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/0609a26fe9ecfa5a5c20cee2b34e53ef.jpg" alt="">
@H_4040@<span style="font-size: 15px;"> 三、SMB服务配置管理
@H4040@<span style="font-size: 15px;">1.启动网络共享,见上面的图
@H4040@<span style="font-size: 15px;">2. Windows 7、Windows Server 2008 上检测是否开启SMB
@H4040@
@H404_0@<span style="font-size: 15px;">SMB 服务器上的 SMB v1:<span style="color: #ff0000;">powershell 方法 <span style="color: #ff0000;">默认启用,(未创建注册表项),所以不会返回 SMB1 值
@H_4040@<span style="font-size: 15px;">2.1检测:Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $.pspath}
@H_404_0@
<img src="/res/2019/03-11/19/a4479f4434f5f390b151fdbac8af4cac.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">2.2禁用SMB1 <span style="color: #ff0000;">#这是再检测就可以看到有SMB1,因为禁用是在修改注册表
@H_4040@<span style="font-size: 15px;">Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force
@H4040@
@H404_0@
<img src="/res/2019/03-11/19/a07fe5156543e856de9ec4dc239991a6.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">2.3启用SMB1 #就是修改注册表的SMB对应的为1
<p align="left"><span style="font-size: 15px;">Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force
<p align="left">
<img src="/res/2019/03-11/19/5d666b80aaeb90a5903fa3550d488cdd.jpg" alt="">
@H_404_0@<span style="font-size: 15px;">2.4检测SMBV2和v3,禁用和启用和上面的方法一样。
<p align="left"><span style="color: #ff0000; font-size: 15px;">注册表编辑器:
<p align="left"><span style="font-size: 15px;">若要在 SMB 服务器上启用或禁用 SMBv1,请配置以下注册表项:
<p align="left"><span style="font-size: 15px;">注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
<p align="left"><span style="font-size: 15px;">注册表项: SMB1
<p align="left"><span style="font-size: 15px;">REG_DWORD: 0 = 已禁用
<p align="left"><span style="font-size: 15px;">REG_DWORD: 1 = 已启用
<p align="left"><span style="font-size: 15px;">默认值: 1 = 已启用(未创建注册表项)
<p align="left"><span style="font-size: 15px;">若要在 SMB 服务器上启用或禁用 SMBv2,请配置以下注册表项:
<p align="left"><span style="font-size: 15px;">注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
<p align="left"><span style="font-size: 15px;">注册表项: SMB2
<p align="left"><span style="font-size: 15px;">REG_DWORD: 0 = 已禁用
<p align="left"><span style="font-size: 15px;">REG_DWORD: 1 = 已启用
<p align="left"><span style="font-size: 15px;">默认值: 1 = 已启用(未创建注册表项)
@H_4040@<span style="font-size: 15px; color: #ff0000;">注意进行这些更改后,必须重启计算机。
@H4040@<span style="font-size: 15px; color: #000000;">3.设置把WIN7的SMBV2禁用掉(这时只留下SMBV1了),测试客户端和服务端是否协商用smbv1版本进行通信。
@H404_0@<span style="font-size: 15px; color: #000000;">
<img src="/res/2019/03-11/19/2626a1eacb8d313a6bee8fb8a6e26c15.jpg" alt="">
@H_404_0@<span style="font-size: 15px; color: #000000;">4.抓包分析文件共享过程,这里只分析客户端发送协商之后,服务器响应给的版本,其他过程和上面的分析类似。<span style="font-size: 15px;">
<img src="/res/2019/03-11/19/82ddf03dac7d97e50f17c66f8027bb26.jpg" alt="">
@H_404_0@<span style="font-size: 15px; color: #000000;">