傳遞哈希攻擊的原理介紹
在滲透測試期間,為了提高審核員對信息系統的權限,很多人都會選擇橫向移動方法。在這種情況下,稱為Pass The Hash(傳遞哈希)的技術被廣泛應用,使審核員成為計算機上的管理員。
NTLM協議
NTLM協議是在Microsoft環境中使用的一種身份驗證協議,特別是,它允許用戶向服務器證明自己是誰,以便使用該服務器提供的服務。
注意:在本文中,術語“服務器”是在客戶端/服務器意義上使用的,“服務器”很可能是一個工作站。
有兩種可能的情況:
1. 用戶使用服務器的本地帳戶的憑據,在這種情況下,服務器在其本地數據庫中便含有用戶的秘密,將能夠對用戶進行身份驗證。
2. 在Active Directory環境中,用戶在身份驗證期間使用域帳戶,在這種情況下,服務器必須要求域控制器驗證用戶提供的信息。
在這兩種情況下,身份驗證都是從客戶端和服務器之間的挑戰/響應階段開始的。
挑戰/響應
使用挑戰/響應原則,以便服務器驗證用戶是否知道他正在驗證的帳戶的秘密,而不需要通過網絡傳遞密碼。這被稱為零知識證明。整個過程分3步:
1.協商:客戶端告訴服務器它想要對其進行身份驗證(NEGOTIATE_MESSAGE)。
2.挑戰:服務器向客戶端發送一個挑戰。這只不過是一個64位的隨機值,隨每個身份驗證請求而變化(CHALLENGE_MESSAGE)。
3.響應:客戶端使用其密碼的哈希版本作為密鑰加密先前接收到的挑戰,并將此加密版本連同其用戶名和域(AUTHENTICATE_MESSAGE)返回給服務器。
NTLM交換框頂部是紅色的,底部是服務器響應CHALLENGE_MESSAGE中包含的信息。在這些交換之后,服務器擁有兩件東西:
1. 發送給客戶端的挑戰;
2. 客戶端的響應被自身的秘密加密了。
要完成身份驗證,服務器只需檢查客戶端發送的響應的有效性。但在那之前,讓我們來檢查一下客戶的秘密。
身份驗證的秘密
我們說過,客戶端使用一個哈希版本的密碼作為密鑰,原因如下:為了避免在服務器上以明文形式存儲用戶密碼,它是存儲的密碼的哈希值。現在,此哈希是NT哈希,它不過是MD4函數的結果,不含鹽值。
- NThash = MD4(password)
綜上所述,當客戶端進行身份驗證時,它使用其密碼的MD4指紋來加密挑戰。然后,讓我們看看接收到此響應后服務器端會發生什么。
身份驗證
如前所述,有兩種不同的身份驗證情況。首先,用于身份驗證的帳戶是一個本地帳戶,因此服務器知道這個帳戶,并擁有該帳戶的秘密副本。第二種是使用域帳戶,在這種情況下服務器不知道這個帳戶或它的秘密,它必須將身份驗證委托給域控制器。
本地帳戶
在使用本地帳戶進行身份驗證的情況下,服務器將使用用戶的密鑰(更確切地說是用戶秘密的MD4哈希) 對發送給客戶端的挑戰進行加密。然后,它將檢查其操作的結果是否等于客戶端的響應,從而證明用戶擁有正確的秘密。如果沒有,則用戶使用的密鑰不是正確的,因為挑戰的加密沒有給出預期的密鑰。
為了執行此操作,服務器需要存儲本地用戶及其密碼的哈希。這個數據庫的名稱是SAM(安全帳戶管理器)。可以在注冊表中找到SAM,特別是使用regedit工具時,但只能作為系統訪問。不過,還可以使用psexec打開:
- psexec.exe -i -s regedit.exe
副本也位于C:\Windows\System32\SAM的磁盤上,因此,它包含本地用戶列表及其哈希密碼,以及本地組列表。更準確地說,它包含了哈希的加密版本。但是,由于解密它們所需的所有信息也在注冊表(SAM和SYSTEM)中,所以我們可以肯定地說哈希存儲在其中。如果你想了解解密機制是如何工作的,你可以查看secretsdump.py代碼或Mimikatz代碼。
可以備份SAM和SYSTEM數據庫,以提取用戶的哈希密碼數據庫。
首先,我們將兩個數據庫保存在一個文件中。
- reg.exe save hklm\sam save.save
- reg.exe save hklm\system system.save
- secretsdump.py -sam sam.save -system system.save LOCAL
由于服務器發送了挑戰(1),并且客戶端使用其秘密的哈希值對該挑戰進行加密,然后使用其用戶名(2)將其發送回服務器,因此服務器將在其SAM中查找用戶密碼的哈希值數據庫(3)。收到挑戰后,它還將加密先前使用此哈希(4)發送的挑戰,并將其結果與用戶返回的挑戰進行比較。如果相同(5),則說明用戶已通過身份驗證!否則,用戶沒有提供正確的秘密。
域帳戶
當使用域帳戶進行身份驗證時,用戶的NT哈希不再存儲在服務器上,而是存儲在域控制器上。用戶希望對其進行身份驗證的服務器接收其挑戰的答案,但無法檢查該答案是否有效。它將把這個任務委托給域控制器。
為此,它將使用Netlogon服務,該服務能夠與域控制器建立安全連接。此安全連接稱為安全通道,之所以可以進行這種安全連接,是因為服務器知道自己的密碼,而域控制器也知道服務器密碼的哈希值,他們可以安全地交換會話密鑰并安全地進行通信。
我不會詳細介紹,但是想法是服務器將以NETLOGON_NETWORK_INFO的結構將不同的元素發送到域控制器:
1. 客戶端的用戶名(Identity);
2. 先前發送給客戶端的挑戰(LmChallenge);
3. 客戶端發送的對挑戰的響應(NtChallengeResponse)。
域控制器將在其數據庫中查找用戶的NT哈希,對于域控制器,它不在SAM中,因為它是一個試圖進行身份驗證的域帳戶。這次它位于一個名為NTDS.DIT的文件中,該文件是所有域用戶的數據庫。檢索NT哈希后,它將使用該哈希和挑戰計算預期的響應,并將此結果與客戶的響應進行比較。
然后,一條消息將被發送到服務器(NETLOGON_VALIDATION_SAM_INFO4),指示客戶端是否經過身份驗證,它還將發送一組關于用戶的信息。這與使用Kerberos身份驗證時在PAC中發現的信息相同。
以下就是一個域控制器的驗證過程:
與以前一樣,服務器發送挑戰(1),客戶端使用其秘密的哈希值對該挑戰進行加密,并將其連同用戶名和域名一起發送回服務器(2)。這次服務器將使用Netlogon服務(3)在安全通道中將此信息發送到域控制器。掌握了這些信息后,域控制器還將使用在其NTDS.DIT數據庫(4)中找到的用戶哈希來對挑戰進行加密,然后將其結果與用戶返回的結果進行比較。如果相同(5),則對用戶進行身份驗證。否則,用戶未提供正確的秘密。在這兩種情況下,域控制器都將信息發送到服務器(6)。
NT哈希的安全隱患
在這些交換中從來不使用明文密碼,而是使用名為NT哈希的哈希密碼,它是明文密碼的簡單哈希。
仔細想想,竊取明文密碼或竊取哈希值是完全相同的。因為它是用來響應挑戰/響應的哈希,所以擁有該哈希可以對服務器進行身份驗證。因此,將密碼以明文顯示根本沒用。
可以這么說,在大多數情況下,使用NT哈希與使用明文密碼是一樣的。
傳遞哈希
如果攻擊者知道一臺計算機的本地管理員的NT哈希,那么他可以使用這個哈希輕松地對該計算機進行身份驗證。類似地,如果他擁有主機上本地管理組成員的域用戶的NT哈希,他也可以作為本地管理員向該主機進行身份驗證。
本地管理員
現在,讓我們看看它在實際環境中是如何工作的:一名新員工來到公司,公司為他/她提供了一個工作站。IT部門沒有足夠的時間為每個員工從頭安裝和配置Windows系統。因此,先設置一個安裝和配置Windows系統的版本,以滿足一個新員工的所有基本需求和要求。然后,這個稱為master的基本版本保存在某處,并且該版本的副本提供給每個新手。
這意味著,本地管理員帳戶在所有使用相同主服務器初始化的工作站中是相同的。如果其中一臺主機被破壞,并且攻擊者從工作站的本地管理員帳戶提取NT哈希,因為所有其他工作站都具有相同的管理員帳戶和相同的密碼,那么它們也將具有相同的NT哈希。然后,攻擊者可以使用在受損主機上找到的哈希,并在所有其他主機上重播該哈希,以便在這些主機上進行身份驗證,以上的整個過程就叫做傳遞哈希。
沒錯,這個哈希也可以在新主機上使用,而且我們在它上面有一個管理員shell。
特權域帳戶
還有另一種使用傳遞哈希技術的方法,假設對于遠程公園管理,在Active Directory中有一個“HelpDesk”組。為了使該組的成員能夠管理用戶的工作站,將該組添加到每個主機的本地“Administrators”組中。此時,這個本地組包含在計算機上具有管理權限的所有對象中。
你可以使用以下命令列出它們:
- # Machine française
- net localgroup Administrateurs
- # ~Reste du monde
- net localgroup Administrators
- Nom alias Administrateur
- Commentaire Les membres du groupe Administrateurs disposent d'un accès complet et illimité à l'ordinateur et au domaine
- Membres
- -------------------------
- Administrateur
- ADSEC\Admins du domaine
- ADSEC\HelpDesk
因此,我們擁有ADSEC \ HelpDesk域組,該域組是主機的本地管理員組的成員。如果攻擊者從該組中的一個成員那里竊取了NT哈希,則他可以使用管理員列表中的ADSEC \ HelpDesk在所有主機上進行身份驗證。
與本地帳戶相比,其優勢在于,無論使用什么主機來設置計算機,GPO都會將該組添加到主機的配置中。該帳戶具有更廣泛的管理權限的可能性更大,而與操作系統和計算機設置過程無關。
因此,當請求身份驗證時,服務器會將身份驗證委派給域控制器,如果身份驗證成功,則域控制器將向服務器發送有關用戶的信息,例如用戶名,用戶所屬的組列表,密碼到期日期等。
然后,服務器將知道該用戶是HelpDesk組的一部分,并向該用戶授予管理員訪問權限。
另一個示例:我們發現用戶jsnow的NT哈希為89db9cd74150fc8d8559c3c19768ca3f。此帳戶是HelpDesk組的一部分,該組是所有用戶工作站的本地管理員,讓我們在另一臺主機上使用他的哈希。
同樣,身份驗證成功了,我們成為了目標設備的管理員。
自動化
既然我們已經了解了NTLM身份驗證的工作方式,以及為什么可以使用NT哈希對其他主機進行身份驗證,那么通過并行化任務來自動對不同目標進行身份驗證以獲取盡可能多的信息將是非常有用的。
在此,我建議使用CrackMapExec工具。
- # Compte local d'administration
- crackmapexec smb --local-auth -u Administrateur -H 20cc650a5ac276a1cfc22fbc23beada1 10.10.0.1 -x whoami
- # Compte de domaine
- crackmapexec smb -u jsnow -H 89db9cd74150fc8d8559c3c19768ca3f -d adsec.local 10.10.0.1 -x whoami
傳遞哈希是在一些計算機上執行,然后計算機隨后遭到破壞。已經向CrackMapExec傳遞了一個參數,來列出當前登錄到這些計算機上的用戶。
擁有連接的用戶列表很好,但是擁有他們的密碼或NT哈希會更好!為此,我開發了lsassy,——遠程提取lsass秘密的工具。
我們從連接的用戶中檢索所有NT哈希,由于我們已經是這些計算機的管理員,所以不會顯示來自計算機帳戶的文件。
傳遞哈希限制
傳遞哈希值是一項在服務器上啟用NTLM身份驗證時始終有效的技術,默認情況下,該技術是有效的。但是,Windows中有一些機制可以限制或可能限制管理任務。
在Windows上,使用訪問令牌執行權限管理,從而可以知道誰有權做什么。“Administrators”組的成員有兩個令牌。一個具有標準用戶權限,另一個具有管理員權限。默認情況下,當管理員執行任務時,它是在標準的、有限的上下文中執行的。另一方面,如果需要管理任務,那么Windows將顯示這個稱為UAC(用戶帳戶控制)的眾所周知的窗口。
可以看到出現用戶警告:應用程序請求管理權限。
那么遠程執行的管理任務是什么呢?有兩種可能。
1. 屬于主機“Administrators”組成員的域帳戶都可以請求它們,在這種情況下,不會為此帳戶激活UAC,他可以執行其管理任務。
2. 是由主機的“Administrators”組成員的本地帳戶請求的,在這種情況下,UAC在某些情況下是啟用的,但不是一直啟用。
為了理解第二種情況,讓我們看一下兩個注冊表項,這兩個注冊表項有時是未知的,但是當使用本地管理帳戶進行NTLM身份驗證后嘗試執行管理任務時,有兩個注冊表項(LocalAccountTokenFilterPolicy,FilterAdministratorToken)扮演了關鍵角色。
下表總結了這兩個注冊表項的每種組合,每種組合都可以通過主機的身份驗證。
總結
如今,NTLM身份驗證仍在公司中廣泛使用。以我的經驗,我從未見過能夠在整個網絡上禁用NTLM的環境。這意味著,傳遞哈希的攻擊仍然非常有效。
該技術是NTLM協議固有的,但是可以通過避免在所有工作站上使用相同的本地管理密碼來緩解。微軟的LAPS 解決方案是其中一種解決方案,它可以通過確保所有工作站上的密碼(也包括NT哈希)都不同。
本文翻譯自:https://en.hackndo.com/pass-the-hash/如若轉載,請注明原文地址。