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