安能辨SMB协议雌雄

SAS在5.6.10 SP02版本里新增了对文件共享协议SMB2.0的支持,由于SMB(Server Message Block)协议版本较多,对搭建环境系统有一定要求,但网上对版本介绍的资料却甚少,导致前期测试发现在Wireshark上很多抓包显示为smb2的数据,设备却无法审计。所以此次借着SP02发布的东风,给各产品草船撒一把SMB版本问题分析的箭,大家接好了哈!

SMB协议

在互联网的大街小巷你都可以搜到SMB协议的相关介绍,本文就不再赘述它的数据报文构成、会话流程及配置方法等问题,总之它最初是由微软、IBM和因特尔公司基于NetBIOS设定的一套文件共享协议,可用于在计算机间共享文件、打印机、串口等,比如电脑上的网上邻居就是靠它实现的。由下图SMB OSI七层协议所在的位置可知SMB 协议工作在应用层和会话层,可用在因特网的TCP/IP协议之上,也可用在其它网络协议如IPX和NetBEUI 之上。

smb%e5%8d%8f%e8%ae%ae

版本和平台

作为一个开放性协议,SMB的可扩展性让它在多个系统平台上发挥着强大的功能,Linux平台是通过samba来支持,而windows系统则基本与SMB同步在进行开发。这多平台的交互,以及版本的更替使得只有熟知产品每个版本的特性才能更好的进行SMB协议的测试,但是茫茫网海,资料寥寥,所以不可避免的碰壁了多次,导致了问题的发生。以下整理SMB版本和各平台的信息方便各位同学在搭建环境时作参考。

  1. Windows系统不同版本服务器和客户端之间通信SMB协议对应版本如下

smb1

注:早期的win10用的协议是SMB3.1;而Vista之前的版本有CIFS(Common Internet File System)和传统SMB1.0之分:

CIFS——使用在Microsoft Windows NT 4.0 (原始的SMB通用版本名称,SMB1之后windows已弃用)

SMB 1.0 (or SMB1)——使用在Windows 2000, Windows XP, Windows Server 2003 和Windows Server 2003 R2

2. SMB协议在Linux系统又名CIFS协议,与windows NT早期通用版本名称一样,Linux对SMB协议的支持取决于Samba版本,手动整理如下:

smb2

注:服务器与客户端之间SMB协议协商版本依赖于版本最低的那端,当高版本不支持低版本时则无法正常通信。

  1. 版本信息查看
  • Windows可根据以上整理的安装版本信息查看SMB默认的版本,如需查看版本的具体信息则需要cmdlect
  • Linux则需要查看samba是否安装和版本,方法如截图:

smb3

Wireshark SMB 抓包奇怪现象

知晓不同系统之间通信遵循的SMB协议版本后,便可尝试搭建各种系统环境来实现设备遍历SMB协议各版本的测试,Wireshark这个常用工具肯定需要出场发挥对协议抓包的重要功能。但是无论用哪个windows版本或在不同系统平台测试(如win10与win10 PC间进行文件共享),都无法抓取到展示为SMB3及3以上版本的数据包,Win vista之后版本的会话均如截图显示为SMB2协议。

smb4

首先,我们来看一下Wireshark支持的SMB协议版本,可通过点击菜单 Edit >Preference >Protocols进行查看。如图可知,Wireshark并不支持除smb\smb2\smbdirect之外版本的smb协议:

smb5

此时我们心中不禁升起了两个疑问:

  1. 为何支持SMBv3的系统平台间通信使用Wireshark抓包却显示为SMB2?
  2. 如何才能分辨Wireshark抓包中服务器和客户端使用的SMB协议确切版本?

剖析Wireshark抓包

事实上微软官方文档[MS-SMB2]里有提到SMBv2和SMBv3可统称为SMB 2协议,所以在Wireshark以及其他工具中便将高于smb2.0之后的协议统一为smb2。如果设备间使用了smbv3中新特性RDMA功能的则显示为SMBDirect协议。

然而如果需要分辨系统间smb协议的确切版本,还是需要通过Wireshark抓包来分析。如图所示,Smb2的协商请求的协议会话过程可以分为smb会话和smb2会话:

smb6

无论是哪种会话,smb2协议具体版本的协商和设备的具体信息都是在 NEGTIATE Request和NEGTIATE Response步骤中展示的,但在查看抓包中版本信息的过程中我又遇到了以下几个问题。

  1. Q: 由于smb2协议协商的NEGTIATE Request可以为smb协议,怎么分辨请求它是请求的smb1还是smb2呢?
  2. A: 通过分析smb1和smb2会话中smb NEGTIATE request的抓包,发现如果客户端请求的是SMB2的版本,request的Dialect里会多1到2个Dialect,表示为Dialect smb 2.002或Dialect smb 2.???,其中2.???即为smbv2以上的版本。

smb7

  1. Q: smb2抓包NEGTIATE request中Dialect未显示SMB2.002或SMB2.???,怎么分辨其准确版本?
  2. A: request抓包中,Dialect会带有一串16进制的code,这些code就对应着SMB的不同版本,从而可知客户端支持的smb2协议的具体版本

smb8

  1. Q: SMB文件远程服务的协议最后是如何决定的?
  2. A:服务器与客户端可能会支持多个版本的SMB协议,如果他们之间进行SMB文件共享通信,会取两者同时支持版本中的最高版本进行SMB通信,最终协商的版本会显示在服务器回复的NEGTIATE Response Dialect 中。

smb9

总结

SMB对于windows和linux平台的支持,以及其提供端-端数据加密功能,可以在保证数据在复杂网络环境中的安全性的同时运用到各个领域,所以对我们SAS的产品提出了更高的审计要求。我们的工具如Wireshark虽然在日常开发和测试中提供了很大的帮助,但是像SMB这样狡黠和强大的协议仍需要我们手动对它抽丝剥茧,将其版本字段协商请求过程在脑海中形成如下图所示流程,便能深入了解了。

smb10

如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669

Spread the word. Share this post!

Meet The Author

Leave Comment