SMB协议简介

一、背景

永恒之蓝是美国国家安全局开发的漏洞利用程序,该工具利用445/TCP端口的文件分享协议(SMB)的漏洞进行散播。在了解永恒之蓝前需要先要知道什么是SMB,以及SMB连接过程发生了什么事情。

二、概括

SMB( Server Message Block ),服务消息块,是 IBM 公司在 80 年代中期发明的一种文件共享协议,电脑上的网上邻居就是靠它实现的 。它只是系统之间通信的一种方式(协议),并不是一款特殊的软件。

SMB 协议被设计成为允许计算机通过本地局域网(LAN)在远程主机上读写文件。远程主机上通过 SMB 协议开放访问的目录称为共享文件夹。(ServerMessage Block)服务消息块通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB从ISO/OSI网络分层的眼光来看是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。如果以TCP/IP协议划分的眼光来看,则SMB是一个工作在应用层的协议

端口:139,445,使用NetBIOS的应用程序接口,或者TCP接口。

三、SMB消息结构

SMB 消息可分为三个部分:

  1. 固定长度的标头
  2. 可变长度参数块
  3. 可变长度数据块

报头将消息标识为SMB消息,指定要执行的命令并提供上下文。在响应消息中,标题还包含指示命令成功或失败(以及如何)的状态信息。

参数块是是可变长的,用来存放SMB执行的命令的参数。

数据块是也是边长的,最大为64 KB,结构与参数块相似,但有一点不同。

3.1、SMB标头:

SMB_Header结构的长度是固定的 32 字节。

 SMB_Header
   {
   UCHAR  Protocol[4];
   UCHAR  Command;
   SMB_ERROR Status;
   UCHAR  Flags;
   USHORT Flags2;
   USHORT PIDHigh;
   UCHAR  SecurityFeatures[8];
   USHORT Reserved;
   USHORT TID;
   USHORT PIDLow;
   USHORT UID;
   USHORT MID;
   }

在这里插入图片描述

Protocol (4 bytes): 这个字段必须包含4字节的字符串’\ xFF’,‘S’,‘M’,‘B’,其中所显示的顺序由各自的ASCII值表示。在最早的可用SMB文档中,该字段被定义为一个字节的消息类型(0xFF),后跟一个三字节的服务器类型标识符。

**Command (1 byte)😗*一个字节的命令代码

**Status (4 bytes)😗*一个32位字段,用于将错误消息从服务器传送到客户端。

**Flags (1 byte)😗*一个字节的标志位,用于描述消息的各种有效功能。

**Flags2 (2 bytes)😗*两个字节的标志位2,表示消息的各种有效功能。 未指定的位是保留的,并且必须为零。

**PIDHigh (2 bytes)😗*如果设置为非零值,则该字段表示进程标识符(PID)的高位字节。它与下面的PIDLow字段组合形成一个完整的PID

SecurityFeatures (8 bytes): 这个8字节的字段有三种可能的解释(具体参考:[MS-CIFS]:SMB 标头 |Microsoft学习)

TID (2 bytes): 树标识符(TID),用来标识这个CIFS数据包指的是什么资源(通常为磁盘共享或者打印机)。当数据包交换没有牵涉到某个资源时,这个域是无意义的,可以忽略的。

**PIDLow (2 bytes)😗*PID的低16位

**UID (2 bytes)😗*用户标识符(UID)

**MID (2 bytes)😗*多路复用标识符(MID),用来标示一对请求和应答。

3.2、SMB参数块:

参数块的通用格式

 SMB_Parameters
   {
   UCHAR  WordCount;
   USHORT Words[WordCount] (variable);
   }

在这里插入图片描述

WordCount(1字节):参数的长度,单位是2字节。此字段可以为零,表示Words字段为空。请注意,此字段的大小为一个字节,位于固定的32字节SMB标头之后,这会导致Words字段不对齐。
Words(variable):消息特定的参数结构。此字段的大小必须为(2 x WordCount)字节。如果WordCount为0x00,则不包括此字段。

3.3、SMB数据块:

数据块的一般结构与此类似 参数块,但缓冲区部分的长度为 以字节为单位。

 SMB_Data
   {
   USHORT ByteCount;
   UCHAR  Bytes[ByteCount] (variable);
   } 

在这里插入图片描述

ByteCount(2字节):字节字段的大小(以字节为单位)。此字段可以是0x0000,表示Bytes字段为空。因为SMB_Parameters的Words字段未对齐,并且SMB_Data的ByteCount字段大小为两个字节,即SMB_Data的第一个字节也是未对齐的。
字节(变量):特定于消息的数据结构。此字段的大小必须为ByteCount字节。如果ByteCount为0x0000,则不包括此字段。

注:通过上述对结构的描述我们可以看出数据块和参数块在结构上是相似的,但是,数据块长度的单位是1bytes而参数块长度的单位是2bytes。

四、批量消息:“AndX” Messages

批处理消息通过在单个消息中发送多个命令请求或响应来减少完成一系列命令所需的消息数量。应用AndX构造的SMB命令称为“AndX命令”,并通过在命令名称后附加“_AndX”的NT LAN Manager约定进行标识。这种类型的消息被称为AndX消息。
在AndX消息中,仅发送一个SMB头。标头后面跟着零个或多个参数和数据块对,每个块对对应于一个额外的命令请求/响应。消息中的块对数量没有限制,具体来说,只有消息的总大小。批处理消息的总大小不得超过协商的MaxBufferSize。AndX消息包含一个结构,概念上类似于链表,用于连接批处理块对。生成的列表称为AndX链。此结构的结构如下所示。

 AndX
   {
   UCHAR  AndXCommand;
   UCHAR  AndXReserved;
   USHORT AndXOffset;
   }

在这里插入图片描述

AndXCommand(1字节):与AndX链中的下一个块对相关联的命令代码。
AndXReserved(1字节):此字段为保留字段,必须为0x00。
AndXOffset(2字节):相对于SMB头的开始,AndX消息中下一个Parameter块相对于SMB报头起始字节的偏移量(以字节为单位)。此偏移与命令中的任何其他尺寸参数或偏移无关。该偏移可以指向经过当前块对的末尾的位置。

五、功能和命令

功能:服务器信息块(SMB)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源。

命令:目前SMB协议共包含75种命令,不同命令通过SMB_Header中1字节大小的Command字段来区别定义,其中:SMB_COM_TRANSACTION2命令用于打开或创建一个共享文件或文件夹,设置它们的扩展属性。SMB_COM_NT_TRANSACT命令用于打开或创建一个文件或文件夹,并应用扩展属性EA或安全描述符SD。

六、SMB生命周期

一次普通的SMB会话一般经历以下六方面:

SMB协议协商(Negotiate)

在一个SMB还没有开始的时候,由客户端率先发出一个协商请求。在请求中,客户端会列出所有它所支持协议版本以及所支持的一些特性(比如加密Encryption、持久句柄Persistent Handle、客户端缓存Leasing等等)。而服务端在回复中则会指定一个SMB版本且列出客户端与服务端共同支持的特性。

建立SMB会话(Session Setup)

客户端选择一个服务端支持的协议来进行用户认证,可以选择的认证协议一般包括NTLM、Kerberos等。按照选择的认证协议的不同,这个阶段可能会进行一次或多次SESSION_SETOP请求/回复的网络包交换。

连接一个文件分享(Tree Connect)

在会话建立之后,客户端会发出连接文件分享的请求。源于文件系统的树形结构,该请求被命名为树连接(Tree Connect)。

文件系统操作

在文件分享连接成功之后,用户通过SMB客户端进行真正的对于目标文件分享的业务操作。这个阶段可以用到的指令有CREATE、CLOSE、FLUSH、READ、WRITE、SETINFO、GETINFO等等。

断开文件分享连接(Tree Disconnect)

当一个SMB会话被闲置一定时间之后,Windows会自动断开文件分享连接并随后中止SMB会话。这个闲置时间可以通过Windows注册表进行设定。当然,用户也可以主动发起断开连接请求。

终止SMB会话(Logoff)

当客户端发出会话中止请求并得到服务端发回的中止成功的回复之后,这个SMB会话至此便正式结束了。
在这里插入图片描述

七、利用WireShark抓包分析SMB

从上面分析SMB协议可知,SMB数据包的格式可分为三个部分:

  • 固定长度的标头(32字节)
  • 可变长度参数块
  • 可变长度数据块(最大64 KB)

**

抓包分析:

**

7.1、协商

在这里插入图片描述

首先由客户端向服务端发送数据包,并且包含其支持的所有协议版本

服务端接收请求之后,选择客户端所支持的最高版本,返回给客户端
在这里插入图片描述

7.2、认证

协议确定后, 开始进行认证,客户端通过发送用户名/密码进行认证
在这里插入图片描述

服务端返回数据包们进行应答是否连接成功
在这里插入图片描述

7.3、连接

此命令用于建立到服务器共享的客户端连接。共享由名称标识,连接一旦建立,就由返回给客户端的TID标识。

发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称
在这里插入图片描述

回复包提供回复连接成功或者拒绝,并且列出的操作的权限
在这里插入图片描述
之后就是文件的读写,具体可以去官网查询具体功能命令,就不一一描述了

最后就是断开分享连接并终止会话,释放资源和锁

参考:1.[MS-CIFS]:SMB 消息结构 :https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/4d330f4c-151c-4d79-b207-40bd4f754da9
2.https://www.cnblogs.com/zhang293/p/8328017.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值