
密碼安全問題一直都受到個(gè)人和企業(yè)的關(guān)注。對(duì)于個(gè)人而言,或許僅僅只是個(gè)人隱私的被公開,而對(duì)于企業(yè)而言則可能會(huì)是災(zāi)難性的。為了避免出現(xiàn)這種情況,越來越多的企業(yè)都開始使用一些不可逆,且強(qiáng)度高的加密算法來加密其賬戶密碼。但一些安全意識(shí)薄弱的企業(yè)或個(gè)人,仍在使用可逆加密存儲(chǔ)其賬戶密碼。一旦使用可逆加密,即使你的密碼設(shè)置的非常長也可以被攻擊者輕易的破解。
說到破解,Hashcat絕對(duì)是我的首選工。我可以一邊開著Hashcat,一邊做其它的事情。可能只需幾分鐘,幾個(gè)小時(shí)或短短的幾天,Hashcat就能為我得到我想要的一切!
Hashcat的工作原理也很簡單。首先,它會(huì)獲取潛在的密碼(例如Autumn2018)并計(jì)算其哈希值。然后,Hashcat將新計(jì)算的代表Autumn2018的哈希值,與你給出的哈希值列表進(jìn)行比較。如果找到一個(gè)或多個(gè)匹配項(xiàng),則表示這些帳戶使用的密碼為Autumn2018。


好了,話不多說!下面進(jìn)入我們的正題。
這一切都始于從域控中提取哈希值。通常我們需要先將權(quán)限提升為域管并登錄到域控才能獲取到這些文件。但在某些特殊情況下,可能會(huì)存在一個(gè)可供較低權(quán)限帳戶訪問的備份文件,該文件包含Active Directory(AD)數(shù)據(jù)庫。
由于當(dāng)前的AD數(shù)據(jù)庫出于活動(dòng)運(yùn)行狀態(tài),因此我們無法復(fù)制該文件(使用時(shí)會(huì)被系統(tǒng)鎖定)。為此,我創(chuàng)建了一個(gè)VSS快照并將ntds.dit文件與包含提取哈希所需的BOOTKEY的SYSTEM注冊(cè)表hive一起復(fù)制。我通常使用內(nèi)置的ntdsutil命令來執(zhí)行此操作,如下所示:

然后,我們可以使用Impacket secretsdump Python腳本來從數(shù)據(jù)庫中提取哈希值。
secretsdump.py -system SYSTEM -ntds ntds.dit LOCAL -outputfile breakme
我原本只想獲取包含NTLM哈希值的*.NTDS文件。但在測(cè)試中我意外的發(fā)現(xiàn),腳本還會(huì)輸出了擴(kuò)展名為“.CLEARTEXT”的文件。

secretsdump腳本使用outputfile參數(shù)指定,將所有哈希寫入前綴為“breakme”的文件。在這個(gè)過程中我們發(fā)現(xiàn)了NTLM哈希,cleartext哈希,以及Kerberos 密鑰。在“CLEARTEXT”文件中包含了相關(guān)用戶的明文密碼,其中包括幾個(gè)長度為128個(gè)字符的密碼!

說實(shí)話,做了這么多的測(cè)試任務(wù)這是我頭一次碰到這種情況。文件中包含的用戶賬戶和相應(yīng)的密碼一目了然,沒有任何的加密保護(hù)措施!我立即檢查了其中的一些賬戶(呵呵~其中竟有一個(gè)域管理員的賬戶),經(jīng)過驗(yàn)證域管的賬戶密碼為真實(shí)可用密碼!經(jīng)過一番調(diào)查,我了解到至少有幾種不同的機(jī)制會(huì)強(qiáng)制存儲(chǔ)明文憑據(jù)。
注:Cleartext(明文)并不意味著密碼就是按原樣存儲(chǔ)。它們一般會(huì)使用RC4加密形式存儲(chǔ)。而用于加密和解密的密鑰是SYSKEY,它被存儲(chǔ)在注冊(cè)表中,可以由域管理員提取。這意味著哈希值可逆為明文,因此我們稱它為“可逆加密”。
對(duì)于使用可逆加密存儲(chǔ)密碼的帳戶,Active Directory用戶和計(jì)算機(jī)(ADUC)中的帳戶屬性,會(huì)顯示使用可逆加密存儲(chǔ)密碼的復(fù)選框。如下所示:

你可以使用以下PowerShell命令,來查詢AD活動(dòng)目錄中UserAccountControl屬性中設(shè)置了可逆加密標(biāo)志的任何用戶:
Get-ADUser -Filter ‘useraccountcontrol -band 128’ -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol

那么,為什么要支持這種不安全的可逆加密存儲(chǔ)呢?答案是為了滿足某些應(yīng)用程序的需要。因此,微軟為需要知道用戶密碼值的應(yīng)用程序提供了一種機(jī)制,就是強(qiáng)制存儲(chǔ)可逆加密的密碼,以便對(duì)用戶進(jìn)行身份驗(yàn)證。我所知道的需要可逆加密的應(yīng)用程序是MS CHAP, SASL Digest身份驗(yàn)證,需要對(duì)Windows域進(jìn)行身份驗(yàn)證的舊版MacOS主機(jī)。也很可能還有其他一些我不知道的,第三方應(yīng)用程序也需要用到。
以下是微軟關(guān)于該設(shè)置的最佳實(shí)踐提示:

即使它需要域管理員使用上面的方法,從Active Directory數(shù)據(jù)庫中提取哈希值,也意味著DA(或被盜取的DA帳戶)可以輕松地學(xué)習(xí)其他用戶的密碼。這違反了不可否認(rèn)原則。不可否認(rèn)性的目的是為解決有關(guān)事件或行為是否發(fā)生過糾紛,而對(duì)涉及被聲稱事件或行為不可辯駁的證據(jù)進(jìn)行收集、維護(hù)和使其可用并且證實(shí)。我們經(jīng)常發(fā)現(xiàn)包含VSS快照的備份可以訪問AD數(shù)據(jù)庫。備份文件通常可由較低權(quán)限的帳戶訪問,甚至是所有的域用戶。在這種情況下,任何域用戶都可以輕松訪問,使用可逆加密存儲(chǔ)的任何帳戶密碼。
下面,我來分解下之前那條使用PowerShell從AD中提取使用可逆加密存儲(chǔ)密碼用戶的命令。
Get-ADUser -Filter ‘useraccountcontrol -band 128’ -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol
Get-ADUser – 是Active Directory PowerShell模塊中的cmdlet,默認(rèn)情況下安裝在Windows Server 2008 R2及更高版本上。可以使用Import-Module命令導(dǎo)入它。

Filter – 使用PowerShell表達(dá)式告訴cmdlet搜索參數(shù)是什么。這里,我們搜索的是具有特定UserAccountControl屬性值的用戶帳戶。
你也可以使用LDAPFilter,它與Filter是相同的,但使用的是LDAP查詢語法。查找所需UserAccountControl值的正確語法如下:
Get-ADUser -LDAPFilter “(&(objectCategory=Person)(UserAccountControl:1.2.840.113556.1.4.803:=128))” -Properties useraccountcontrol | Format-Table name,samaccountname

useraccountcontrol -band 128
AD中的UserAccountControl屬性是與用戶帳戶的設(shè)置相關(guān)聯(lián)的屬性,長度為32位。每個(gè)位代表有關(guān)該用戶帳戶的特定設(shè)置。例如,當(dāng)帳戶被禁用時(shí),第二個(gè)低位被設(shè)置為“1”。在可逆加密的情況下,將第8個(gè)低位設(shè)置為“1”。第8個(gè)低位對(duì)應(yīng)于十進(jìn)制值128。
要訪問其中特定位的值,必須使用邏輯位級(jí)操作。了解有關(guān)更多按位操作的信息,請(qǐng)點(diǎn)擊這里(或此處)查看。在我們的示例中,-band 128表示使用值為128的按位AND運(yùn)算,來確定其是否設(shè)置了第8個(gè)低位(無論在32位數(shù)內(nèi)設(shè)置了哪些其它位)。

如果使用LDAPFilter,則可以通過LDAP語法1.2.840.113556.1.4.803來指定按位操作。通過指定值128,我們請(qǐng)求返回第8個(gè)低位設(shè)置為“1”的所有記錄。

Properties useraccountcontrol
由于Get-ADUser命令檢索不包含UserAccountControl屬性的默認(rèn)屬性集,因此必須使用-Properties參數(shù)在結(jié)果中明確進(jìn)行詢問。
Format-Table name, samaccountname,useraccountcontrol
Format-Table命令將告訴PowerShell格式化輸出以及要顯示的屬性。如果你希望結(jié)果垂直列出而不是以表格的形式列出,那么你可以使用Format-List命令。

當(dāng)然,你也可以將結(jié)果全部輸出到一個(gè)文件中….
Get-ADUser -Filter ‘useraccountcontrol -band 128’ -Properties useraccountcontrol | Format-Table name, samaccountname,useraccountcontrol | Out-File -Encoding ascii MyOutput.txt

|