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/