SMB2 Protocol – 简介
SMB协议简介:
服务器信息块(SMB)协议是一个应用层协议主要用于在计算机间共享文件、打印机、串口等。
在介绍SMB协议的时候,一般提到使用的端口为139,445。 但是在Wiki里面是这样描述端口信息的。这儿以后研究。
The Server Message Block protocol can run on top of the Session (and lower) network layers in several ways:
- directly over TCP, port 445;[4]
- via the NetBIOS API, which in turn can run on several transports:[5]
- on UDP ports 137, 138 & TCP ports 137, 139 – see NetBIOS over TCP/IP;
- on several legacy protocols such as NBF (incorrectly referred to as NetBEUI).
SMB 一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过 SMB 协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(named pipe)等资源。
在SMB协议中,每个特定的版本叫做一个dialect,在MS文档中指出CIFS其实就是一个SMB的一个版本,这儿笔者理解的应该就是SMB2。SMB2是一个新的版本,是对老版本SMB进行了重新设计。虽然后面出现了3.0的版本,但是由于是基于SMB2进行的改动,所以很多时候,我们统一都叫做SMB2。那么如果区分这个小版本的信息呢,我们可以通过dialect来判断。现在已经有了四个dialect:2.0,2.1, 3.0, 3.02 区分的方法会在学习Negotiation Protocol的时候详细介绍。
SMB在TCP/IP Model中的位置:
SMB更多的介绍,可以参考Wikipedia, 本文中我们学习的SMB2协议。
SMB2协议的工作过程
1. Negotiate Protocol Request: 在在用户输入“服务器名”之后,首先要做的就是把服务器名解析为IP,可以通过DNS还是NetBIOS解析。得到IP地址后,客户端就向服务器发送第一个SMB请求:“Negotiate Protocol Request”。这个请求包含了客户端所支持的各种 SMB Dialect。
2. Negotiate Protocol Response: 服务器收到该请求后,选择一个它支持的最新版本(比如NT LM 0.12),再通过“Negotiate Protocol Response”回复给客户端
3. Session Setup Request: Negotiation 结束之后,,客户端请求和服务器建立一个session,在客户端发送的Session Setup Request里,包含了身份验证请求(如Kerberos的AP_REQ)。
4. Session Setup Response: 服务器回复Session Setup Response,包含了验证结果(如Kerberos的AP_REP)。关于认证协议Kerberos和NTLM,以后会再学习结束
5. Tree Connect Request: Session Setup通过后,客户端就成功的连上了服务器。客户端发送的Tree Connect Request来访问具体的共享,如果前面没有指定共享名(服务器名),客户端访问的是命名管道$IPC , 如果指定了服务器共享名 ,那么这儿就是访问共享名的部分了。
6. Tree Connect Response:,服务器在检查过用户对该路径的权限后,回复Tree Connect Response。检查用户权限是这样进行的:服务器从Session Setup Request中已经得到用户所属的组,再通过和该路径上的ACL对比,即可得到用户权限。至此,用户就进入了共享文件夹。
7. 下面就是文件或文件夹操作的相关命令,如新建,打开,重命名,删除,关闭。读写操作等。我们在以后的文章里详细介绍。
SMB2的命令共有19个,如下。关于每个SMB2 数据包所用的命令,可以Packet Header里面的Command Flag里看到。
· 0x00 SMB2/NegotiateProtocol
· 0x01 SMB2/SessionSetup
· 0x02 SMB2/SessionLogoff
· 0x03 SMB2/TreeConnect
· 0x04 SMB2/TreeDisconnect
· 0x05 SMB2/Create
· 0x06 SMB2/Close
· 0x07 SMB2/Flush
· 0x08 SMB2/Read
· 0x09 SMB2/Write
· 0x0a SMB2/Lock
· 0x0b SMB2/Ioctl
· 0x0c SMB2/Cancel
· 0x0d SMB2/KeepAlive
· 0x0e SMB2/Find
· 0x0f SMB2/Notify
· 0x10 SMB2/GetInfo
· 0x11 SMB2/SetInfo
· 0x12 SMB2/Break
SMB2实验:
实验环境:
一台加入域的Windows 7机器A, 这台主机上,通过VMware建了一个Windows 8的虚拟机B。B访问A的时候,在B上抓取的数据包。SMB||SMB2的数据包如下。关于具体每个Command的分析,我会在以后的Blog中介绍。
References:
1. http://en.wikipedia.org/wiki/Server_Message_Block
2. http://wiki.wireshark.org/SMB2
3. Microsoft SMB Protocol and CIFS Protocol Overview: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365233(v=vs.85).aspx
4. [MS-SMB2]: Server Message Block (SMB) Version 2 Protocol Specification
5. Implementing CIFS http://ubiqx.org/cifs/Book.html
6. http://msdn.microsoft.com/en-us/library/cc246482.aspx
7. http://channel9.msdn.com/Blogs/Darryl/Troubleshooting-Windows-SMBSMB2-Issues 8
8. P神的Blog: http://blog.sina.com.cn/s/blog_70398db50100yzuf.html
9. Common Internet File System: http://technet.microsoft.com/en-us/library/cc939973.aspx
https://tonglol.wordpress.com/2014/08/17/smb2-protocol-%E7%AE%80%E4%BB%8B/
https://tonglol.wordpress.com/category/cifs/page/2/