SMB(Server Message Block) Protocal Research

cataloguephp

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

 

1. 什麼是SMBhtml

全世界有不少的客戶端和服務端軟件實現了SMB協議,所有windows工做站,windows 95,windows NT系統都同時支持SMB客戶端和服務端git

SMB本質上一種服務消息塊(Server Message Block),它能夠實現數據庫

1. 文件共享
2. 打印機共享
3. 串口共享
4. 通訊抽象: 例如named pipes命名管道、計算機間的mail slots、RPC API調用

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

客戶端和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的類型app

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

0x2: SMB Protocol Variantsdom

爲了適應不斷出現的新的應用場景,最原始的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

相關文章
相關標籤/搜索