SMB知识汇总
SMB是什么
SMB(全称是Server Message Block)是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (Application Program Interface,简称API),一般端口使用为139,445。其中,使用计算机名访问时,SMB服务工作在NetBIOS协议之上,用的是TCP的139端口;使用IP地址访问时,用的是TCP的445端口。
Samba是Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网的不同计算机之间提供文件及打印机等资源的共享服务。配置SMB服务就是启用网络发现和打印机共享(如果网络配置为公用默认不开启,需要手工开启)
SMB流量分析
[链接](https://www.cnblogs.com/yuzly/p/10480438.html)
Negotiate
首先客户端发送一个SMB negotiate protocol request请求数据报,并列出它所支持的所有SMB协议版本。
服务器收到请求信息后响应请求,并列出希望使用的协议版本。如果没有可使用的协议版本则返回0XFFFFH,结束通信。可以看到下图服务端希望使用的版本是SMB2.1
0x0202 SMB 2.002
0x0210 SMB 2.1
0x0300 SMB 3.0
0x0302 SMB 3.02
0x02FF SMB2
Session Setup
协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送session setup request请求数据报实现的。客户端发送一对用户名和密码或一个简单密码到服务器
然后服务器通过发送一个Session setup response应答数据报来允许或拒绝本次连接。
Tree Connect
当客户端和服务器完成了磋商和认证之后,它会发送一个Tree connect rerquest SMB数据报并列出它想访问网络资源的名称
之后服务器会发送一个tree connect response应答数据报以表示此次连接是否被接受或拒绝
SMB Message Structure
翻译自微软官方文档
SMB Command Code-SMB Message Structure
y由三部分组成:
- A fixed-length header 报头将消息标识为SMB消息,指定要执行的命令,并提供上下文。在响应消息中,头还包含状态信息,指示命令是成功还是失败(以及如何成功)。
- A variable length parameter block 参数块是一个包含2 Byte(word)数组,而数据块是一个大小为64 KB的数组。每个SMB消息的参数块和数据块都不同。
- A variable length data block 参数值表示传入函数的参数。data部分将包含更大的结构或数据缓冲区,例如要使用SMB_COM_WRITE命令写入的数据块。
SMB Message分类
- Session management
- Transaction subprotocol
- File/directory access methods
- Read/write/lock methods
- Query directory information
- Query/set attributes methods
- Printing methods
- Other
- Obsolete
- Reserved but not implemented
SMB Header结构
SMB_Header //SMB Header 为32-bytes
{
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;
}
protocol4 bytes 包含'\xFF' 'S''M''B'
Command1 byte 也就是CommandCode 如0x73-建立会话
**Status **4 bytes 服务器向客户端传递错误信息
Flag 1 byte 标志Messgae特性,如value设为0x01含义如下:
如果服务器支持SMB_COM_LOCK_AND_READ (0x13)和SMB_COM_WRITE_AND_UNLOCK (0x14)命令,则SMB_COM_NEGOTIATE (0x72)响应中设置(1)这个位。
Flags2 2 bytes //也是标志特性 略过
PIDHigh 2 bytes 如果不为0,为PID的高位字节,与PIDLow字段一起传输PID
SecurityFeatures 8 bytes //没怎么看懂 不协商的时候 值为0 忽略此字段;当command为0x72协议磋商时,SecurityFeatures存储的实际上是SecuritySignature的值
SecuritySignature 8 bytes 协商过程完成后会生成8bytes的加密消息签名,用于判断message在传输过程中是否被修改,不适用于无连接传输
如果CIFS是通过无连接传输,SecuritySignature格式如下:
SecurityFeatures
{
ULONG Key;//4 bytes 用于验证消息的加密密钥
USHORT CID;//2 bytes 连接标识符
USHORT SequenceNumber; 2 bytes 传输标识消息序列
}
Reserved 2 bytes 0x0000
TID 2 bytes Tree标识符
PIDLow 2 bytes
UID 2 bytes user标识符
MID 2 bytes multiplex 标识符
Parameter Block
结构如下:
SMB_Parameters
{
UCHAR WordCount; //1 byte
USHORT Words[WordCount] (variable);// variable
}
Data Block
结构如下:
SMB_Data
{
USHORT ByteCount; //2 bytes
UCHAR Bytes[ByteCount] (variable);//variable
}
SMB协议协商、断开等流程
Negotiate and Tree Connect Example
C:\> net use y: \\10.9.9.47\testshare1
Disconnect Example
C:\> net use y: /d
Message Signing Example
CIFS消息签名
第一步:
将SMB_COM_Negotiate请求中的SecuritySignature字段设置为0x0000000000000000,此时未生成安全签名
第二步:
协商响应清除了Flags2字段中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位,SecuritySignature字段被设置为0x0000000000000000
第三步:
下一个交换利用ANDX消息批处理。两个请求一起发送;第一个SMB_COM_SESSION_SETUP_ANDX请求(第2.2.4.53.1节)与SMB_COM_TREE_CONNECT_ANDX请求(第2.2.4.55.1节)一起发送。在这个请求中清除Flags2字段中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位,并将SecuritySignature字段设置为0x0000000000000000。连接尝试是到IPC$。
第四步:
ANDX响应包含一个SecuritySignature字段,设置为0x0000000000000000,清除Flags2字段位中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位。
第五步:
发送另一个由SMB_COM_SESSION_SETUP_ANDX请求和另一个SMB_COM_TREE_CONNECT_ANDX请求组成的ANDX请求。这是连接到共享的尝试。
第六步:
发送另一个由SMB_COM_SESSION_SETUP_ANDX请求和另一个SMB_COM_TREE_CONNECT_ANDX请求组成的ANDX请求。这是连接到共享的尝试。
获取文件属性
C:\> attrib y:\text.txt
SMB认证过程
Packet1. SMB_COM_NEGOTIATE
Direction:C->S
Description:client想server发送smb dialect的确认信息,server返回一个包含着dialects
的字符串的数据包。
Packet2. SMB_COM_NEGOTIATE
Direction:S->C
Description:server相应client的请求,确定将在session中使用的smb dialect。server返回
的数据包中还包括一个8字节的随机字符串,该字符串将在系一部中用于在登录过程中对客户端
进行身份验证。
Packet3. SMB_COM_SESSION_SETUP_ANDX
Direction:C->S
Description:该数据包包含着有关client功能的信息,因此即使server实现了share-level
security model,也必须要发送该数据包。
Packet4. SMB_COM_SESSION_SETUP_ANDX
Direction:S->C
Description:如果server接受了challenge/response,则返回给client的数据包中将包含
一个有效的UID。如果不接受,则在数据包中返回error code,并拒绝访问。
Packet5. SMB_COM_TREE_CONNECT_ANDX
Direction:C->S
Description:client对share发起访问,该数据包中包含UNC格式的绝对共享路径。
Packet6. SMB_COM_TREE_CONNECT_ANDX
Direction:S->C
Description:如果server授予了client访问权限,则server返回与该数据包中的share对应的
16位的TID。如果share不存在或者client没有足够的权限,则server返回error code并拒绝访问。
Packet7. SMB_COM_OPEN_ANDX
Direction:C->S
Description:client请求server代表自己在share中打开文件,该数据包中包含要打开的文件的名称。
Packet8. SMB_COM_OPEN_ANDX
Direction:S->C
Description:如果授予了对文件的访问权限,则server返回请求文件的ID;如果文件不存在或者
用户没有足够的权限访问该文件,则返回error code并拒绝client的访问。
Packet9. SMB_COM_READ_ANDX
Direction:C->S
Description:client请求server代替自己读取文件中的数据并返回给自己。打开文件时client
获取的文件ID包含在该数据包中,以便识别server应该从哪个打开的文件中读取数据。
Packet10. SMB_COM_READ_ANDX
Direction:S->C
Description:server返回client请求的文件数据。由于已授予对server,share和文件的访问
权限,一般不会出现问题。但是在某些特殊情况下会发生错误,例如在打开文件和从文件中读取数据
这两步之间,对share的访问权限遭到了更改,就会发生错误。
转自链接:https://www.jianshu.com/p/a883ec21f994
——————————————————————————————————————————————————————————————
如图-2所示,一个普通的SMB会话从开始到结束一般会经过以下六个生命阶段:
1. SMB协议协商(Negotiate)
在一个SMB还没有开始的时候,由客户端率先发出一个协商请求。在请求中,客户端会列出所有它所支持协议版本以及所支持的一些特性(比如加密Encryption、持久句柄Persistent Handle、客户端缓存Leasing等等)。而服务端在回复中则会指定一个SMB版本且列出客户端与服务端共同支持的特性。
2. 建立SMB会话(Session Setup)
客户端选择一个服务端支持的协议来进行用户认证,可以选择的认证协议一般包括NTLM、Kerberos等。按照选择的认证协议的不同,这个阶段可能会进行一次或多次SESSION_SETOP请求/回复的网络包交换。至于NTLM或Kerberos认证协议的细节,我们会另文再叙。
3. 连接一个文件分享(Tree Connect)
在会话建立之后,客户端会发出连接文件分享的请求。源于文件系统的树形结构,该请求被命名为树连接(Tree Connect)。以SMB协议的阿里云NAS为例,一般的SMB挂载命令为:
net use z: \\XXX.nas.aliyuncs.com\myshare
其中的“ \\XXX.nas.aliyuncs.com\myshare”便是我们将要连接的那个文件分享,也便是那棵“树”。如果在“myshare”中创建有子目录“abc”,那直接连接“abc”这棵子树也是可以的:
net use z: \\XXX.nas.aliyuncs.com\myshare\abc
4. 文件系统操作
在文件分享连接成功之后,用户通过SMB客户端进行真正的对于目标文件分享的业务操作。这个阶段可以用到的指令有CREATE、CLOSE、FLUSH、READ、WRITE、SETINFO、GETINFO等等。
5. 断开文件分享连接(Tree Disconnect)
当一个SMB会话被闲置一定时间之后,Windows会自动断开文件分享连接并随后中止SMB会话。这个闲置时间可以通过Windows注册表进行设定[9]。当然,用户也可以主动发起断开连接请求。
6. 终止SMB会话(Logoff)
当客户端发出会话中止请求并得到服务端发回的中止成功的回复之后,这个SMB会话至此便正式结束了。