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