SMB知识汇总
SMB是什么
SMB(全稱是Server Message Block)是一個協(xié)議名,它能被用于Web連接和客戶端與服務(wù)器之間的信息溝通。SMB 是在會話層(session layer)和表示層(presentation layer)以及小部分應(yīng)用層(application layer)的協(xié)議。SMB使用了NetBIOS的應(yīng)用程序接口 (Application Program Interface,簡稱API),一般端口使用為139,445。其中,使用計(jì)算機(jī)名訪問時,SMB服務(wù)工作在NetBIOS協(xié)議之上,用的是TCP的139端口;使用IP地址訪問時,用的是TCP的445端口。
Samba是Linux和UNIX系統(tǒng)上實(shí)現(xiàn)SMB協(xié)議的一個免費(fèi)軟件,由服務(wù)器及客戶端程序構(gòu)成。SMB(Server Messages Block,信息服務(wù)塊)是一種在局域網(wǎng)上共享文件和打印機(jī)的一種通信協(xié)議,它為局域網(wǎng)的不同計(jì)算機(jī)之間提供文件及打印機(jī)等資源的共享服務(wù)。配置SMB服務(wù)就是啟用網(wǎng)絡(luò)發(fā)現(xiàn)和打印機(jī)共享(如果網(wǎng)絡(luò)配置為公用默認(rèn)不開啟,需要手工開啟)
SMB流量分析
[鏈接](https://www.cnblogs.com/yuzly/p/10480438.html)
Negotiate
首先客戶端發(fā)送一個SMB negotiate protocol request請求數(shù)據(jù)報(bào),并列出它所支持的所有SMB協(xié)議版本。
服務(wù)器收到請求信息后響應(yīng)請求,并列出希望使用的協(xié)議版本。如果沒有可使用的協(xié)議版本則返回0XFFFFH,結(jié)束通信。可以看到下圖服務(wù)端希望使用的版本是SMB2.1
0x0202 SMB 2.002
0x0210 SMB 2.1
0x0300 SMB 3.0
0x0302 SMB 3.02
0x02FF SMB2
Session Setup
協(xié)議確定后,客戶端進(jìn)程向服務(wù)器發(fā)起一個用戶或共享的認(rèn)證,這個過程是通過發(fā)送session setup request請求數(shù)據(jù)報(bào)實(shí)現(xiàn)的。客戶端發(fā)送一對用戶名和密碼或一個簡單密碼到服務(wù)器
然后服務(wù)器通過發(fā)送一個Session setup response應(yīng)答數(shù)據(jù)報(bào)來允許或拒絕本次連接。
Tree Connect
當(dāng)客戶端和服務(wù)器完成了磋商和認(rèn)證之后,它會發(fā)送一個Tree connect rerquest SMB數(shù)據(jù)報(bào)并列出它想訪問網(wǎng)絡(luò)資源的名稱
之后服務(wù)器會發(fā)送一個tree connect response應(yīng)答數(shù)據(jù)報(bào)以表示此次連接是否被接受或拒絕
SMB Message Structure
翻譯自微軟官方文檔
SMB Command Code-SMB Message Structure
y由三部分組成:
A fixed-length header 報(bào)頭將消息標(biāo)識為SMB消息,指定要執(zhí)行的命令,并提供上下文。在響應(yīng)消息中,頭還包含狀態(tài)信息,指示命令是成功還是失敗(以及如何成功)。
A variable length parameter block 參數(shù)塊是一個包含2 Byte(word)數(shù)組,而數(shù)據(jù)塊是一個大小為64 KB的數(shù)組。每個SMB消息的參數(shù)塊和數(shù)據(jù)塊都不同。
A variable length data block 參數(shù)值表示傳入函數(shù)的參數(shù)。data部分將包含更大的結(jié)構(gòu)或數(shù)據(jù)緩沖區(qū),例如要使用SMB_COM_WRITE命令寫入的數(shù)據(jù)塊。
SMB Message分類
Session management
Transaction subprotocol
File/directory access methods
Read/write/lock methods
Query directory information
Query/set attributes methods
Printing methods
Other
Obsolete
Reserved but not implemented
SMB Header結(jié)構(gòu)
SMB_Header //SMB Header 為32-bytes
{
UCHAR Protocol[4];
UCHAR Command;
SMB_ERROR Status;
UCHAR Flags;
USHORT Flags2;
USHORT PIDHigh;
UCHAR SecurityFeatures[8];
USHORT Reserved;
USHORT TID;
USHORT PIDLow;
USHORT UID;
USHORT MID;
}
protocol4 bytes 包含'xFF' 'S''M''B'
Command1 byte 也就是CommandCode 如0x73-建立會話
**Status **4 bytes 服務(wù)器向客戶端傳遞錯誤信息
Flag 1 byte 標(biāo)志Messgae特性,如value設(shè)為0x01含義如下:
如果服務(wù)器支持SMB_COM_LOCK_AND_READ (0x13)和SMB_COM_WRITE_AND_UNLOCK (0x14)命令,則SMB_COM_NEGOTIATE (0x72)響應(yīng)中設(shè)置(1)這個位。
Flags2 2 bytes //也是標(biāo)志特性 略過
PIDHigh 2 bytes 如果不為0,為PID的高位字節(jié),與PIDLow字段一起傳輸PID
SecurityFeatures 8 bytes //沒怎么看懂 不協(xié)商的時候 值為0 忽略此字段;當(dāng)command為0x72協(xié)議磋商時,SecurityFeatures存儲的實(shí)際上是SecuritySignature的值
SecuritySignature 8 bytes 協(xié)商過程完成后會生成8bytes的加密消息簽名,用于判斷message在傳輸過程中是否被修改,不適用于無連接傳輸
如果CIFS是通過無連接傳輸,SecuritySignature格式如下:
SecurityFeatures
{
ULONG Key;//4 bytes 用于驗(yàn)證消息的加密密鑰
USHORT CID;//2 bytes 連接標(biāo)識符
USHORT SequenceNumber; 2 bytes 傳輸標(biāo)識消息序列
}
Reserved 2 bytes 0x0000
TID 2 bytes Tree標(biāo)識符
PIDLow 2 bytes
UID 2 bytes user標(biāo)識符
MID 2 bytes multiplex 標(biāo)識符
Parameter Block
結(jié)構(gòu)如下:
SMB_Parameters
{
UCHAR WordCount; //1 byte
USHORT Words[WordCount] (variable);// variable
}
Data Block
結(jié)構(gòu)如下:
SMB_Data
{
USHORT ByteCount; //2 bytes
UCHAR Bytes[ByteCount] (variable);//variable
}
SMB協(xié)議協(xié)商、斷開等流程
Negotiate and Tree Connect Example
C:> net use y: \10.9.9.47 estshare1
Disconnect Example
C:> net use y: /d
Message Signing Example
CIFS消息簽名
第一步:
將SMB_COM_Negotiate請求中的SecuritySignature字段設(shè)置為0x0000000000000000,此時未生成安全簽名
第二步:
協(xié)商響應(yīng)清除了Flags2字段中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位,SecuritySignature字段被設(shè)置為0x0000000000000000
第三步:
下一個交換利用ANDX消息批處理。兩個請求一起發(fā)送;第一個SMB_COM_SESSION_SETUP_ANDX請求(第2.2.4.53.1節(jié))與SMB_COM_TREE_CONNECT_ANDX請求(第2.2.4.55.1節(jié))一起發(fā)送。在這個請求中清除Flags2字段中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位,并將SecuritySignature字段設(shè)置為0x0000000000000000。連接嘗試是到IPC$。
第四步:
ANDX響應(yīng)包含一個SecuritySignature字段,設(shè)置為0x0000000000000000,清除Flags2字段位中的SMB_FLAGS2_SMB_SECURITY_SIGNATURE位。
第五步:
發(fā)送另一個由SMB_COM_SESSION_SETUP_ANDX請求和另一個SMB_COM_TREE_CONNECT_ANDX請求組成的ANDX請求。這是連接到共享的嘗試。
第六步:
發(fā)送另一個由SMB_COM_SESSION_SETUP_ANDX請求和另一個SMB_COM_TREE_CONNECT_ANDX請求組成的ANDX請求。這是連接到共享的嘗試。
獲取文件屬性
C:> attrib y: ext.txt
SMB認(rèn)證過程
Packet1. SMB_COM_NEGOTIATE
Direction:C->S
Description:client想server發(fā)送smb dialect的確認(rèn)信息,server返回一個包含著dialects
的字符串的數(shù)據(jù)包。
Packet2. SMB_COM_NEGOTIATE
Direction:S->C
Description:server相應(yīng)client的請求,確定將在session中使用的smb dialect。server返回
的數(shù)據(jù)包中還包括一個8字節(jié)的隨機(jī)字符串,該字符串將在系一部中用于在登錄過程中對客戶端
進(jìn)行身份驗(yàn)證。
Packet3. SMB_COM_SESSION_SETUP_ANDX
Direction:C->S
Description:該數(shù)據(jù)包包含著有關(guān)client功能的信息,因此即使server實(shí)現(xiàn)了share-level
security model,也必須要發(fā)送該數(shù)據(jù)包。
Packet4. SMB_COM_SESSION_SETUP_ANDX
Direction:S->C
Description:如果server接受了challenge/response,則返回給client的數(shù)據(jù)包中將包含
一個有效的UID。如果不接受,則在數(shù)據(jù)包中返回error code,并拒絕訪問。
Packet5. SMB_COM_TREE_CONNECT_ANDX
Direction:C->S
Description:client對share發(fā)起訪問,該數(shù)據(jù)包中包含UNC格式的絕對共享路徑。
Packet6. SMB_COM_TREE_CONNECT_ANDX
Direction:S->C
Description:如果server授予了client訪問權(quán)限,則server返回與該數(shù)據(jù)包中的share對應(yīng)的
16位的TID。如果share不存在或者client沒有足夠的權(quán)限,則server返回error code并拒絕訪問。
Packet7. SMB_COM_OPEN_ANDX
Direction:C->S
Description:client請求server代表自己在share中打開文件,該數(shù)據(jù)包中包含要打開的文件的名稱。
Packet8. SMB_COM_OPEN_ANDX
Direction:S->C
Description:如果授予了對文件的訪問權(quán)限,則server返回請求文件的ID;如果文件不存在或者
用戶沒有足夠的權(quán)限訪問該文件,則返回error code并拒絕client的訪問。
Packet9. SMB_COM_READ_ANDX
Direction:C->S
Description:client請求server代替自己讀取文件中的數(shù)據(jù)并返回給自己。打開文件時client
獲取的文件ID包含在該數(shù)據(jù)包中,以便識別server應(yīng)該從哪個打開的文件中讀取數(shù)據(jù)。
Packet10. SMB_COM_READ_ANDX
Direction:S->C
Description:server返回client請求的文件數(shù)據(jù)。由于已授予對server,share和文件的訪問
權(quán)限,一般不會出現(xiàn)問題。但是在某些特殊情況下會發(fā)生錯誤,例如在打開文件和從文件中讀取數(shù)據(jù)
這兩步之間,對share的訪問權(quán)限遭到了更改,就會發(fā)生錯誤。
轉(zhuǎn)自鏈接:https://www.jianshu.com/p/a883ec21f994
——————————————————————————————————————————————————————————————
如圖-2所示,一個普通的SMB會話從開始到結(jié)束一般會經(jīng)過以下六個生命階段:
1. SMB協(xié)議協(xié)商(Negotiate)
在一個SMB還沒有開始的時候,由客戶端率先發(fā)出一個協(xié)商請求。在請求中,客戶端會列出所有它所支持協(xié)議版本以及所支持的一些特性(比如加密Encryption、持久句柄Persistent Handle、客戶端緩存Leasing等等)。而服務(wù)端在回復(fù)中則會指定一個SMB版本且列出客戶端與服務(wù)端共同支持的特性。
2. 建立SMB會話(Session Setup)
客戶端選擇一個服務(wù)端支持的協(xié)議來進(jìn)行用戶認(rèn)證,可以選擇的認(rèn)證協(xié)議一般包括NTLM、Kerberos等。按照選擇的認(rèn)證協(xié)議的不同,這個階段可能會進(jìn)行一次或多次SESSION_SETOP請求/回復(fù)的網(wǎng)絡(luò)包交換。至于NTLM或Kerberos認(rèn)證協(xié)議的細(xì)節(jié),我們會另文再敘。
3. 連接一個文件分享(Tree Connect)
在會話建立之后,客戶端會發(fā)出連接文件分享的請求。源于文件系統(tǒng)的樹形結(jié)構(gòu),該請求被命名為樹連接(Tree Connect)。以SMB協(xié)議的阿里云NAS為例,一般的SMB掛載命令為:
net use z: \XXX.nas.aliyuncs.commyshare
其中的“ \XXX.nas.aliyuncs.commyshare”便是我們將要連接的那個文件分享,也便是那棵“樹”。如果在“myshare”中創(chuàng)建有子目錄“abc”,那直接連接“abc”這棵子樹也是可以的:
net use z: \XXX.nas.aliyuncs.commyshareabc
4. 文件系統(tǒng)操作
在文件分享連接成功之后,用戶通過SMB客戶端進(jìn)行真正的對于目標(biāo)文件分享的業(yè)務(wù)操作。這個階段可以用到的指令有CREATE、CLOSE、FLUSH、READ、WRITE、SETINFO、GETINFO等等。
5. 斷開文件分享連接(Tree Disconnect)
當(dāng)一個SMB會話被閑置一定時間之后,Windows會自動斷開文件分享連接并隨后中止SMB會話。這個閑置時間可以通過Windows注冊表進(jìn)行設(shè)定[9]。當(dāng)然,用戶也可以主動發(fā)起斷開連接請求。
6. 終止SMB會話(Logoff)
當(dāng)客戶端發(fā)出會話中止請求并得到服務(wù)端發(fā)回的中止成功的回復(fù)之后,這個SMB會話至此便正式結(jié)束了。
SMB協(xié)議版本
參考鏈接:https://yq.aliyun.com/articles/675647?type=2
總結(jié)
- 上一篇: Windows Update服务启动方法
- 下一篇: 雀梅叶的功效与作用 雀梅叶的副作用_中药