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


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

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

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

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

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

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

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

Filter – 使用PowerShell表達式告訴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屬性是與用戶帳戶的設置相關(guān)聯(lián)的屬性,長度為32位。每個位代表有關(guān)該用戶帳戶的特定設置。例如,當帳戶被禁用時,第二個低位被設置為“1”。在可逆加密的情況下,將第8個低位設置為“1”。第8個低位對應于十進制值128。
要訪問其中特定位的值,必須使用邏輯位級操作。了解有關(guān)更多按位操作的信息,請點擊這里(或此處)查看。在我們的示例中,-band 128表示使用值為128的按位AND運算,來確定其是否設置了第8個低位(無論在32位數(shù)內(nèi)設置了哪些其它位)。

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

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

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

|