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


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

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

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

說實話,做了這么多的測試任務這是我頭一次碰到這種情況。文件中包含的用戶賬戶和相應的密碼一目了然,沒有任何的加密保護措施!我立即檢查了其中的一些賬戶(呵呵~其中竟有一個域管理員的賬戶),經過驗證域管的賬戶密碼為真實可用密碼!經過一番調查,我了解到至少有幾種不同的機制會強制存儲明文憑據。
注: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主機。也很可能還有其他一些我不知道的,第三方應用程序也需要用到。
以下是微軟關于該設置的最佳實踐提示:

即使它需要域管理員使用上面的方法,從Active Directory數據庫中提取哈希值,也意味著DA(或被盜取的DA帳戶)可以輕松地學習其他用戶的密碼。這違反了不可否認原則。不可否認性的目的是為解決有關事件或行為是否發生過糾紛,而對涉及被聲稱事件或行為不可辯駁的證據進行收集、維護和使其可用并且證實。我們經常發現包含VSS快照的備份可以訪問AD數據庫。備份文件通常可由較低權限的帳戶訪問,甚至是所有的域用戶。在這種情況下,任何域用戶都可以輕松訪問,使用可逆加密存儲的任何帳戶密碼。
下面,我來分解下之前那條使用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搜索參數是什么。這里,我們搜索的是具有特定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屬性是與用戶帳戶的設置相關聯的屬性,長度為32位。每個位代表有關該用戶帳戶的特定設置。例如,當帳戶被禁用時,第二個低位被設置為“1”。在可逆加密的情況下,將第8個低位設置為“1”。第8個低位對應于十進制值128。
要訪問其中特定位的值,必須使用邏輯位級操作。了解有關更多按位操作的信息,請點擊這里(或此處)查看。在我們的示例中,-band 128表示使用值為128的按位AND運算,來確定其是否設置了第8個低位(無論在32位數內設置了哪些其它位)。

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

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

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

|