微軟SMB和空會話介紹?
微軟SMB和空會話介紹
空會話(Null sessions)
SMB是我在微軟工作期間接觸最多的技術之一。您也可能通過其他常用名稱知道SMB: CIFS和Samba。雖然這在技術上是三種不同的東西,但許多人可以互換使用這個術語來描述同一個的網絡文件系統協議。為什么?這是一個涉及IBM、微軟、Linux大約35年歷史的漫長故事。你所需要知道的是,在微軟我們使用術語SMB(服務器消息塊)。
但是如果您一定要知道,簡化的版本是這樣的:SMB是協議,CIFS是SMB的一種古老方言,而Samba是SMB協議的Linux/ unix的實現。人們和公司熟悉其中一個術語并堅持使用它,這使得這三個名稱在技術文檔之外可以互換。
你可能會問什么是空會話?空會話意味著對網絡資源的訪問是在沒有身份驗證的情況下授予的。也稱為匿名或訪客訪問,最常見的是IPC$ "Windows Named Pipe"共享。Windows已經很長一段時間不允許null或匿名訪問了。
憑證和SMB
大多數入侵檢測軟件似乎不了解在Active Directory (AD)環境中,Windows如何認證SMB,這通常是導致誤報的原因。Windows和SMB確實希望人們成功地連接到文件共享,因此他們想盡辦法嘗試所有可用憑證來完成連接。
人們傾向于認為用戶名是唯一的身份驗證機制,在工作組中,這基本上是正確的。添加AD后,身份驗證情況就會發生變化。將計算機加入域的動作創建了一個計算機對象。計算機對象($)是AD中有效的身份認證對象,可用于對Windows和SMB共享進行身份驗證。雖然SMB很少退回到計算機或機器、帳戶,但這是可能的。
例如,Hyper-V可以被設置為在不使用S2D或SAN的情況下通過SMB 3訪問虛擬硬盤。這種設置使用Hyper-V主機的機器帳戶來訪問SMB共享,而不是使用用戶或服務帳戶。
如果沒有顯式提供帳戶,SMB將嘗試隱式憑證。首先是登錄用戶的帳戶,然后有時是計算機對象。一些具有特定權限的共享和第三方文件服務器將允許計算機帳戶連接。您可能權限受限或沒有訪問權限,但它將進行身份驗證。
使用隱式憑證不是空會話連接,因為提供了憑據;即使它們并沒有被顯式提供。這意味著SMB會話正在被授權,因此不是空會話。
究竟什么是隱式和顯式憑證?顯式憑證是作為身份驗證的一部分提供的憑證。這就像點擊“使用不同憑證連接”復選框時,映射一個驅動器與文件資源管理器,或“net use /user”。隱式憑證與此相反。如果沒有提供顯式憑證,則意味著操作系統應該使用當前登錄用戶的憑證。
測試
你不相信我,對吧?滲透測試說這是一個空會話。你甚至用命令來證明。現在你會認為微軟又在玩老把戲了。20年了空會話錯誤仍然沒有修復!
好吧,我證明給你看。這些都是任何人都可以做的測試。我將使用行業標準的包捕獲和分析工具Wireshark,并通過三個主要測試來打動您。
- 工作組到工作組-兩個沒加入域的Windows 10 1903(2019年春季更新)系統。所有更新已安裝,截止2019年10月。除了設置文件共享外,沒有做任何更改。
- 工作站到工作站-兩個加入域的Windows 10 1903(春季2019更新)系統。所有更新已安裝,截止2019年10月。除了加入域和設置文件共享外,沒有進行任何更改。
- 工作站到域控制器(DC) -個加入域的工作站到DC。工作站運行完全補丁的Win10 1903, DC運行完全補丁的Windows Server 2019。默認域策略,無需加固,無需額外的策略或配置。
通常有兩個命令用于測試空會話,我將使用這兩個命令進行測試,外加一個額外的基于場景的測試。第一個命令顯式地設置了一個不存在用戶(/user:)和密碼("")
net use \\\IPC$ "" /user:
第二個命令不設置顯式憑證。這是更有趣的行為,因為它為Windows留出了嘗試隱式憑證的空間。
net use \\\IPC$
non-IPC$ 共享測試
net use \\\share
對于域測試,我將使用域的SYSVOL共享
net use \\\SYSVOL
理解 IPC$
進程間通信共享(inter-process communication share,IPC$)是一種特殊情況。正是這個共享允許遠程命名管道(Named Pine)訪問。管道是一種老式的方法,用于允許兩個服務相互通信,甚至在一個網絡連接上。IPC$功能已經存在很長時間了,IPC$的默認訪問規則隨著Windows的每個版本而改變。舊版本的Windows的行為可能與這些測試不同。
網絡配置:
Subnet: 10.19.0.0/24
服務器: 10.19.0.1
RedWrk: 10.19.0.2
BlueWrk: 10.19.0.3
域用戶賬戶:
RedUser
BlueUser
域:
CONSTOSO
本地賬戶:
LclRed
LclBlue
計算機名:
RedWrk
BlueWrk
SMB如何連接
在我們繼續之前可能需要一些基本知識。有三個關鍵的SMB命令用于認證和授權:Negotiate, Session Setup和Tree Connect。
- Negotiate(協商)-這個命令決定SMB使用哪種方式(主要.次要版本),發現基本設置,取決于使用方式,執行一些預認證。
- Session Setup(會話設置)—執行身份驗證的地方。在這里交換憑證、Kerberos票據或安全令牌,在這一步批準或拒絕常規授權。
- Tree Connect(樹連接)—從授權到共享。Tree Connect從上一步Session Setup獲得安全帳戶,并使用該帳戶來確定是否應該批準對單獨共享的訪問權。
由于SMB的工作方式,可以成功地進行身份驗證,但不能訪問任何資源。這就是為什么在做出最后的判斷之前,要深入了解到底發生了什么。
開始測試…
工作組到工作組(Workgroup to Workgroup)
這是基本的家用場景。兩臺電腦都是常規使用,他們一輩子都不想打開設置控制臺,只想讓東西正常工作。
net use \\10.19.0.3\IPC$ "" /user:
結果:沒有批準訪問

net use \\10.19.0.3\IPC$
結果:沒有批準訪問

注意:Windows在沒有提供憑證的情況下拒絕完成連接。
net use \\10.19.0.3\share
結果:沒有批準訪問

注意:Windows在沒有提供憑證的情況下拒絕完成連接。
這都是意料之中的行為,因為RedWrk和BlueWrk兩臺電腦之間沒有內在的信任。沒有集中式的身份驗證方法意味著每個工作組成員必須依賴于其本地安全數據庫,該數據庫不包含關于其他工作組成員的詳細信息,除非顯式地添加這些詳細信息。這意味著所有匿名和隱式身份驗證方法都將失敗。
工作站到工作站(加入域)Workstation to Workstation (Domain-joined)
RedWrk和BlueWrk在下一步加入了域。RedWrk運行同樣的“net use”命令到BlueWrk。這就是我們開始感興趣的地方。
net use \\10.19.0.3\IPC$ "" /user:
結果:沒有批準訪問

在這個例子中,使用“/user:”參數,這是一個顯示空憑證,被windows拒絕
net use \\10.19.0.3\IPC$

“啊哈!好用了!”我聽見你在大喊。“這是一個空會話!”
嗯,不!
還記得我說過Windows真的想讓這種連接生效嗎?嗯,我們確實這樣做了,當沒有輸入憑證時,Windows將自動嘗試用戶的域憑證。這就是我一直在說的隱含憑證。
讓我們看看抓取的數據包捕。具體來說,是會話設置部分,身份驗證發生在這里

你會注意到,RedWrk發送了CONTOSO\RedUser帳戶,即使我們沒有顯式設置這個憑證。這與允許您通過Windows資源管理器連接到您的工作共享驅動器的機制是相同的,無需顯式地輸入您的Windows憑據,只是以命令行形式。
由于傳遞并接受了有效的域憑據,因此這不是一個空會話。盡管表面上看起來很像。
您可能注意到,SMB在某些測試中使用的是NTLM身份驗證,而不是Kerberos。當使用IP地址而不是主機名或完整域名(Fully Qualified Domain Name,FQDN)時,就會發生這種情況。
這是因為IP地址需要一些額外的設置才能成為有效的Kerberos對象。此外,NTLM是純文本的,這使得在文章的上下文中更容易理解身份驗證。
net use \\10.19.0.3\share

與前面的命令相同。使用登錄用戶的域帳號,連接成功。
以下是抓取數據包:

工作站到域控制器
net use \\10.19.0.1\IPC$ "" /user:

結果:空會話不允許
net use \\10.19.0.1\IPC$
這個命令生效,因為已經傳遞了Windows用戶憑證。這里沒有空會話

net use \\10.19.0.1\SYSVOL

包捕獲中的所有內容看起來都應該連接,但是SYSVOL是一個特例。
SYSVOL和NETLOGON共享需要在現代Windows上進行Keberos身份驗證。這可以通過策略來改變,但我們只推薦這種方式,當您有一個老舊系統,而您又無法說服管理層擺脫它的時候,Kerberos確實是可行的方法。
切換到域名,也就是切換到Kerberos,并正確登錄:

下邊是Wireshark 抓取的數據

了解是成功的一半
滲透測試的分析只能達到這樣的深度。收集和分析數據包超出了大多數產品的能力。當你有疑問的時候,自己驗證一下這是誤報還是錯報。
(完)