SMB(Server Message Block) Protocal Research

Andrew.Hann發表於2017-05-30

catalogue

1. 什麼是SMB
2. 基礎SMB協議
3. SMB Clients and Servers

 

1. 什麼是SMB

全世界有很多的客戶端和服務端軟體實現了SMB協議,全部windows工作站,windows 95,windows NT系統都同時支援SMB客戶端和服務端

SMB本質上一種服務訊息塊(Server Message Block),它可以實現

1. 檔案共享
2. 印表機共享
3. 串列埠共享
4. 通訊抽象: 例如named pipes命名管道、計算機間的mail slots、RPC API呼叫

從上圖可見,SMB是一個C/S request-response挑戰響應協議

客戶端和SMB服務端的連線可以基於TCP/IP、NetBEUI、或者IPX/SPX,下圖展示了各層協議的支援關係

1. SMB was also sent over the DECnet protocol. Digital (now Compaq) did this for their PATHWORKS product.
2. NetBIOS over TCP/IP seems to be referred to by many names. Microsoft refers to it as NBT in some places and NetBT in others (specifically in their Windows NT documentation and in the Windows NT registry). 
3. Others refer to it as RFCNB. NetBEUI is sometimes refered to as NBF (NetBIOS Frame Format?) by Microsoft

一旦建立起連線,SMB客戶端可以傳送SMB指令(SMB commands),用於訪問共享資源,開啟檔案,讀寫檔案等檔案操作,看起來就和在本地操作檔案系統一樣,只不過是通過SMB協議遠端進行

0x1: NetBIOS Names

如果SMB下層基於TCP/IP、DECnet、或者NetBEUI,那麼NetBIOS name就會在很多情況下被使用到和出現,NetBIOS name最多15位元組,在預設情況下,這個名字就是GetComputerName() API獲取的值,例如我本機這裡是WINDOWS-2181810,在網路間傳輸時,這個NetBIOS name會被填充到16位元組,最後一個位元組用於標識這個NetBIOS name的型別

1. Unique names
2. Global Names 
3. Internet Group
4. Domain
5. Multihomed

0x2: SMB Protocol Variants

為了適應不斷出現的新的應用場景,最原始的SMB協議也在不斷產生新的變種

1. PC NETWORK PROGRAM 1.0(Core Protocol): 
The original version of SMB as defined in IBM's PC Network Program. Some versions were called PCLAN1.0, It could handle a fairly basic set of operations that included:
    1) connecting to and disconnecting from file and print shares
    2) opening and closing files
    3) opening and closing print files
    4) reading and writing files
    5) creating and deleting files and directories
    6) searching directories
    7) getting and setting file attributes
    8) locking and unlocking byte ranges in files

2. MICROSOFT NETWORKS 1.03(Core Plus Protocol): Included Lock&Read and Write&Unlock SMBs with different versions of raw read and raw write SMBs
3. MICROSOFT NETWORKS 3.0(DOS LAN Manager 1.0): The same as LANMAN1.0, but OS/2 errors must be translated to DOS errors.
4. LANMAN1.0(LAN Manager 1.0): The full LANMAN1.0 protocol.
5. DOS LM1.2X002(LAN Manager 2.0): The same as LM1.2X002, but errors must be translated to DOS errors.
6. LM1.2X002(LAN Manager 2.0): The full LANMAN2.0 protocol.
7. DOS LANMAN2.1(LAN Manager 2.1): The same as LANMAN2.1, but errors must be translated to DOS errors.
8. LANMAN2.1(LAN Manager 2.1): The full LANMAN2.1 protocol.
9. Windows for Workgroups 3.1a(LAN Manager 2.1): Windows for Workgroups 1.0 
10. NT LM 0.12(NT LAN Manager 1.0): Contains special SMBs for NT
11. Samba(NT LAN Manager 1.0): Samba's version of NT LM 0.12
12. CIFS 1.0(NT LAN Manager 1.0): Really NT LM 0.12 plus a bit

這裡我們重點關注一下最後也是最新的一項SMB協議變種CIFS

在NetBIOS出現之後,Microsoft就使用NetBIOS實現了一個網路檔案/列印服務系統,這個系統基於NetBIOS設定了一套檔案共享協 議,Microsoft稱之為SMB(Server Message Block)協議。這個協議被Microsoft用於它們Lan Manager和Windows NT伺服器系統中,而Windows系統均包括這個協議的客戶軟體,因而這個協議在區域網系統中影響很大。
隨著Internet的流行,Microsoft希望將這個協議擴充套件到Internet上去,成為Internet上計算機之間相互共享資料的一種標 準。因此它將原有的幾乎沒有多少技術文件的SMB協議進行整理,重新命名為CIFS(Common Internet File System),並打算將它與NetBIOS相脫離,試圖使它成為Internet上的一個標準協議

0x3: SMB Security

SMB定義瞭如下兩個層級的安全,注意在User Level這個層次可以衍生出不同的認證體系,有基於系統的,有基於域的,有基於資料庫的

1. Share level. 
Protection is applied at the share level on a server. Each share can have a password, and a client only needs that password to access all files under that share. This was the first security model that SMB had and is the only security model available in the Core and CorePlus protocols. Windows for Workgroups' vserver.exe implements share level security by default, as does Windows 95.

2. User Level.
Protection is applied to individual files in each share and is based on user access rights. Each user (client) must log in to the server and be authenticated by the server. When it is authenticated, the client is given a UID which it must present on all subsequent accesses to the server. This model has been available since LAN Manager 1.0.

Under both of these security levels, the password is encrypted before it is sent to the server. NTLM and the older LAN Manager (LM) encryption are supported by Microsoft SMB Protocol. Both encryption methods use challenge-response authentication, where the server sends the client a random string and the client returns a computed response string that proves the client has sufficient credentials for access.

0x4: Browsing the network

在一箇中大型網路中,往往有很多SMB Server,並且隨時可能有新的Server加入舊的Server退出,為了讓網路中的Client能感知到這些變化,每一個SMB Server都會通過廣播的方式來傳送自己的相關資訊,但是這裡存在一個問題,廣播包跨網段傳輸的問題

1. 在NetBEUI網路中,這個問題不存在
2. 但是在TCP/IP網路中,子網路的路由器會選擇性地過濾一些廣播包,為了解決這個問題,微軟引入了Browser servers以及Windows Internet Name Service(WINS)

Relevant Link:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365234(v=vs.85).aspx

 

2. 基礎SMB協議

SMB包頭部分

0x1: SMB Command Header

SMB Command Header的長度不是固定的,不同的命令有不同的長度,上圖中的SMB Command Header在實際的協議中並不是真的就叫這個名字,而是根據對應的協議有對應的名字。下面列舉了一些SMB中常用到的Command,但是要明白的是,SMB協議是一個在不斷擴充套件和更新的協議,包括像CIFS這種SMB增強版有很多擴充套件出來支援的協議,實際在使用的使用我們只要查詢對應的datasheet獲得實際的用途即可

1. SMB_COM_DELETE_DIRECTORY (0x01): 這是原始核心協議的一個命令,用來刪除一個空的目錄 
2. SMB_COM_CLOSE (0x04): 這是原始核心協議的一個命令,用來關閉和一個有效的FID關聯的物件的一個例項。Client closes the file represented by Tid   and Fid.  Server responds with success  code.
3. SMB_COM_FLUSH (0x05): 這是原始核心協議的一個命令,用來要求伺服器將當前檔案的所有資料和資訊都寫回到儲存器上 
4. SMB_COM_DELETE (0x06): 這是原始核心協議的一個命令,用來刪除一個或多個常規檔案。支援檔名中有萬用字元,允許一次刪除多個檔案 
5. SMB_COM_RENAME (0x07): 這是原始核心協議的一個命令,用來重新命名一個或多個檔案或目錄 
6. SMB_COM_CHECK_DIRECTORY (0x10): 這是原始核心協議的一個命令。用來檢查指定的路徑是否在伺服器上存在 
7. SMB_COM_LOCKING_ANDX (0x24): 此命令在LAN Manager 1.0中引入,不適用大於32-bit的檔案。支援最大64-bit的實現在NT LAN Manager中引入。此命令用來鎖定一個普通檔案中一段連續的資料。支援鎖定任一指定檔案中任意多的資料段,前提是這些資料段沒有重疊的部分。鎖定可以防止其他程式使用一個獨立的檔案控制程式碼(FID)對檔案鎖定部分進行鎖、讀和寫操作。任何程式使用獲取鎖的檔案的FID都可以訪問被鎖定的資料。
此命令也可以被伺服器用來傳送一個OpLock中斷通知訊息給客戶端,客戶端收到後傳送確認訊息。這是CIFS協議中伺服器傳送請求訊息的一個例子。
下面列舉的是SMB_COM_LOCKING_ANDX後可能傳送的命令
    ·SMB_COM_CLOSE
    ·SMB_COM_FLUSH
    ·SMB_COM_LOCKING_ANDX
    ·SMB_COM_READ
    ·SMB_COM_READ_ANDX
    ·SMB_COM_WRITE
    ·SMB_COM_WRITE_ANDX
8. SMB_COM_TRANSACTION_SECONDARY (0x26): 此命令在LAN Manager 1.0中引入。用來完成SMB_COM_TRANSACTION中未傳輸完畢資料的傳輸。
9. SMB_COM_ECHO (0x2B): 此命令在LAN Manager 1.0中引入。客戶端傳送此命令測試和伺服器的傳輸層連線。
10. SMB_COM_OPEN_ANDX (0x2D): 此命令在LAN Manager 1.0中引入。用來建立並開啟一個檔案,或者開啟一個已存在的普通檔案,並執行命令鏈中的命令。命令中包含客戶端要開啟的檔名,命名管道或裝置。如果執行成功,伺服器響應訊息中要攜帶一個合法的FID。客戶端在後續對此檔案的操作請求中要提供相同的FID。
下面這些命令是可以放在SMB_COM_OPEN_ANDX命令的AndX鏈中:
    ·SMB_COM_READ
    ·SMB_COM_READ_ANDX
    ·SMB_COM_IOCTL
    ·SMB_COM_NO_ANDX_COMMAND
11. SMB_COM_READ_ANDX (0x2E): 此命令在LAN Manager 1.0中引入,在NT LAN Manager中對其進行了擴充套件。用來讀取資料,可以讀取普通檔案,命名管道,或直接訪問設別,比如串列埠(COM)或印表機介面(LPT)。如果客戶端用NT LAN Manager或以後的版本協商,應該傳送帶有12個引數的請求,這個版本支援最大64-bit的檔案。此命令是唯一一個支援讀取64-bit大小檔案的讀取命令。
下面這些命令是可以放在SMB_COM_READ_ANDX命令的AndX鏈中:
    ·SMB_COM_CLOSE
12. SMB_COM_WRITE_ANDX (0x2F): 此命令在LAN Manager 1.0中引入。用來向普通檔案,命名管道,或直接訪問裝置,比如串列埠(COM)或印表機介面(LPT)中寫入資料。如果客戶端用NT LAN Manager或以後的版本協商,應該傳送帶有14個引數的請求,這個版本支援最大64-bit的檔案。此命令是唯一一個支援寫64-bit大小檔案的讀取命令。
下面這些命令是可以放在SMB_COM_WRITE_ANDX命令的AndX鏈中:
    ·SMB_COM_READ
    ·SMB_COM_READ_ANDX
    ·SMB_COM_LOCK_AND_READ
    ·SMB_COM_CLOSE
13. SMB_COM_TRANSACTION2 (0x32): 此命令在LAN Manager 1.2中引入。支援伺服器檔案系統更豐富的語義集。允許客戶端設定和獲取擴充套件的key/value屬性對,支援長檔名(比原始的8.3名字格式要長),可以執行目錄搜尋及其他任務。
14. SMB_COM_TRANSACTION2_SECONDARY (0x33): 此命令在LAN Manager 1.2中引入。用來完成SMB_COM_TRANSACTION2中未傳完的資料。
15. SMB_COM_FIND_CLOSE2 (0x34): 此命令在LAN Manager 1.2中引入。用來關閉由命令TRANS2_FIND_FIRST2而開啟的搜尋控制程式碼,伺服器釋放所有和此控制程式碼相關的資源。
16. SMB_COM_TREE_DISCONNECT (0x71): 這是一個原始核心協議命令。用來關閉客戶端訪問伺服器資源時使用的一條邏輯連線,連線依靠SMB頭部的TID識別,斷開後伺服器將此TID視為無效的TID。所有和此TID相關的檔案、目錄及其他資源都被釋放,檔案和目錄的鎖也會被釋放。

17. SMB_COM_NEGOTIATE (0x72): 這是一個原始核心協議命令。用來初始化伺服器和客戶端之間的SMB會話,必須在其他任何SMB命令傳送之前完成。
每個SMB會話只能有一次協商過程,後續的SMB_COM_NEGOTIATE會被伺服器拒絕並返回一個錯誤響應。

18、SMB_COM_SESSION_SETUP_ANDX (0x73): 此命令用來配置一個SMB會話。如果伺服器執行在user級訪問控制模式,至少傳送一個SMB_COM_SESSION_SETUP_ANDX命令,執行使用者登入伺服器並建立一個有效的UID。
在CIFS協議中,在SMB_COM_SESSION_SETUP_ANDX命令執行成功之前傳送SMB_COM_TREE_CONNECT或SMB_COM_TREE_CONNECT_ANDX是違反協議的,即使伺服器執行在share級的訪問控制模式。在SMB_COM_SESSION_SETUP_ANDX請求之後,包含SMB_COM_TREE_CONNECT_ANDX批處理請求的AndX鏈可以滿足這一需求,匿名認證也可以滿足這一需求。
一個SMB會話用允許有多個SMB_COM_SESSION_SETUP_ANDX,用來建立額外的UID或建立額外的虛擬鏈路。
下面的命令可以放在SMB_COM_SESSION_SETUP_ANDX後面的AndX鏈中:
    ·SMB_COM_TREE_CONNECT_ANDX
    ·SMB_COM_OPEN
    ·SMB_COM_OPEN_ANDX
    ·SMB_COM_CREATE
    ·SMB_COM_CREATE_NEW
    ·SMB_COM_CREATE_DIRECTORY
    ·SMB_COM_DELETE
    ·SMB_COM_DELETE_DIRECTORY
    ·SMB_COM_FIND
    ·SMB_COM_FIND_UNIQUE
    ·SMB_COM_RENAME
    ·SMB_COM_NT_RENAME
    ·SMB_COM_CHECK_DIRECTORY
    ·SMB_COM_QUERY_INFORMATION
    ·SMB_COM_SET_INFORMATION
    ·SMB_COM_OPEN_PRINT_FILE
    ·SMB_COM_TRANSACTION
19. SMB_COM_LOGOFF_ANDX (0x74): SMB頭部UID標記的使用者被登出,伺服器將釋放所有此UID相關的資源,包括釋放鎖,關閉所有的檔案,斷開連線,取消所有沒有處理完的命令,標記此UID無效。
下面的命令可以放在SMB_COM_LOGOFF_ANDX後面的AndX鏈中:
    ·SMB_COM_SESSION_SETUP_ANDX.
20. SMB_COM_TREE_CONNECT_ANDX (0x75): 此命令在LAN Manager 1.0中引入。用來建立一條客戶端和伺服器之間的連線,共享資源依靠共享名確定。連線建立後,此連線將用伺服器返回的TID作為識別標記。
下面的命令可以放在SMB_COM_TREE_CONNECT_ANDX後面的AndX鏈中:
    ·SMB_COM_OPEN
    ·SMB_COM_OPEN_ANDX
    ·SMB_COM_CREATE
    ·SMB_COM_CREATE_NEW
    ·SMB_COM_CREATE_DIRECTORY
    ·SMB_COM_DELETE
    ·SMB_COM_DELETE_DIRECTORY
    ·SMB_COM_SEARCH
    ·SMB_COM_FIND
    ·SMB_COM_FIND_UNIQUE
    ·SMB_COM_RENAME
    ·SMB_COM_NT_RENAME
    ·SMB_COM_CHECK_DIRECTORY
    ·SMB_COM_QUERY_INFORMATION
    ·SMB_COM_SET_INFORMATION
    ·SMB_COM_OPEN_PRINT_FILE
    ·SMB_COM_TRANSACTION
21. SMB_COM_NT_TRANSACT (0xA0): 此命令在NT LAN Manager中引入。擴充套件了由SMB_COM_TRANSACTION2提供的檔案系統訪問服務,允許處理非常大的引數和資料塊。
22. SMB_COM_NT_TRANSACT_SECONDARY (0xA1): 此命令用來完成SMB_COM_NT_TRANSACT中未傳完的資料。

23. SMB_COM_NT_CREATE_ANDX (0xA2): 此命令在NT LAN Manager中引入。用來建立並開啟一個新檔案,或者開啟一個已存在的檔案,或開啟並清空一個已存在的檔案,或建立一個目錄,或建立一個命名管道。返回的FID可以用在後續的請求訊息中。
訊息中包含客戶端想要建立或開啟的檔名,目錄,或命名管道和RootDirectoryFID。如果執行成功,伺服器返回一個FID標記開啟的資源。客戶端在後續的請求訊息中必須攜帶此FID。客戶端必須擁有對資源所在目錄的寫許可權,才能建立一個新的檔案或目錄;或者擁有檔案的寫許可權來執行截斷檔案的操作。
下面的命令可以放在SMB_COM_NT_CREATE_ANDX後面的AndX鏈中:
    ·SMB_COM_READ
    ·SMB_COM_READ_ANDX
    ·SMB_COM_IOCTL

24. SMB_COM_NO_ANDX_COMMAND (0xFF): 此命令在LAN Manager 1.0中引入。設計此命令的目的是用來指明一個AndX鏈的結束

例如這裡在SMB認證的第一個包,SMB Command Header是這樣的

0x2: SMB Header

typedef unsigned char UCHAR;          // 8 unsigned bits
typedef unsigned short USHORT;        // 16 unsigned bits
typedef unsigned long ULONG;          // 32 unsigned bits
 
typedef struct {
    ULONG LowPart;
    LONG HighPart;
} LARGE_INTEGER;                      // 64 bits of data
 
typedef struct  {
    UCHAR Protocol[4];                // Contains 0xFF,'SMB'
    UCHAR Command;                 // Command code
    union {
        struct {
            UCHAR ErrorClass;         // Error class
            UCHAR Reserved;           // Reserved for future use
            USHORT Error;             // Error code
        } DosError;
        ULONG Status;                 // 32-bit error code
    } Status;
    UCHAR Flags;                      // Flags
    USHORT Flags2;                    // More flags
    union {
        USHORT Pad[6];                // Ensure section is 12 bytes long
        struct {
            USHORT PidHigh;           // High part of PID
            ULONG  Unused;            // Not used
            ULONG  Unused2;
    } Extra;
    };
    USHORT Tid;                       // Tree identifier
    USHORT Pid;                       // Caller's process id
    USHORT Uid;                       // Unauthenticated user id
    USHORT Mid;                       // multiplex id
} SMB_HEADER;

Relevant Link:

http://blog.sina.com.cn/s/blog_705eb43a0100o5ah.html
http://blog.csdn.net/qq_33336155/article/details/53307308
https://msdn.microsoft.com/en-us/library/aa302274.aspx
http://www.cnblogs.com/xunbu7/p/3232968.html
http://blog.nsfocus.net/resolution-smb-protocol/
file:///C:/Users/Administrator/Downloads/[MS-CIFS].pdf
https://msdn.microsoft.com/en-us/library/ff470014.aspx
https://msdn.microsoft.com/en-us/library/ff470072.aspx
http://blog.chinaunix.net/uid-28193347-id-3420341.html
https://wiki.samba.org/index.php/Samba3/SMB2
https://msdn.microsoft.com/en-us/library/ff469916.aspx

 

3. SMB Clients and Servers

如今支援SMB的廠商有非常多,包括

clients
1. Microsoft Windows for WorkGroups 3.x, Windows 95, and Windows NT.
    1) File Manager 
    2) the Windows 95 Explorer
    3) connect to servers across the network
    4) open files using a UNC (universal naming convention).
2. smbclient from Samba
3. smbfs for Linux
4. SMBlib (an SMB client library that is in development)
 
Server  
1. Samba
2. Microsoft Windows for Workgroups 3.x
3. Microsoft Windows 95
4. Microsoft Windows NT
5. The PATHWORKS family of servers from Digital
6. LAN Manager for OS/2, SCO, etc
7. VisionFS from SCO
8. TotalNET Advanced Server from Syntax
9. Advanced Server for UNIX from AT&T (NCR?)
10. LAN Server for OS/2 from IBM

Relevant Link:

https://www.samba.org/cifs/docs/what-is-smb.html

Copyright (c) 2017 LittleHann All rights reserved

相關文章