SMB(Server Message Block) Protocal Research


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM