尋找活動目錄中使用可逆加密儲存密碼的賬戶
密碼安全問題一直都受到個人和企業的關注。對於個人而言,或許僅僅只是個人隱私的被公開,而對於企業而言則可能會是災難性的。為了避免出現這種情況,越來越多的企業都開始使用一些不可逆,且強度高的加密演算法來加密其賬戶密碼。但一些安全意識薄弱的企業或個人,仍在使用可逆加密儲存其賬戶密碼。一旦使用可逆加密,即使你的密碼設定的非常長也可以被攻擊者輕易的破解。
說到破解,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)中的帳戶屬性,會顯示使用可逆加密儲存密碼的複選框。如下所示:
你可以使用以下Shell/">PowerShell命令,來查詢AD活動目錄中UserAccountControl屬性中設定了可逆加密標誌的任何使用者:
Get-ADUser-Filter‘useraccountcontrol-band128’-Properties useraccountcontrol| Format-Table name, samaccountname,useraccountcontrol
那麼,為什麼要支援這種不安全的可逆加密儲存呢?答案是為了滿足某些應用程式的需要。因此,微軟為需要知道使用者密碼值的應用程式提供了一種機制,就是強制儲存可逆加密的密碼,以便對使用者進行身份驗證。我所知道的需要可逆加密的應用程式是MS CHAP, SASL Digest身份驗證,需要對Windows域進行身份驗證的舊版MacOS主機。也很可能還有其他一些我不知道的,第三方應用程式也需要用到。
以下是 ofollow,noindex" target="_blank">微軟關於該設定的最佳實踐提示 :
- 即使它需要域管理員使用上面的方法,從Active Directory資料庫中提取雜湊值,也意味著DA(或被盜取的DA帳戶)可以輕鬆地學習其他使用者的密碼。這違反了不可否認原則。不可否認性的目的是為解決有關事件或行為是否發生過糾紛,而對涉及被聲稱事件或行為不可辯駁的證據進行收集、維護和使其可用並且證實。
- 我們經常發現包含VSS快照的備份可以訪問AD資料庫。備份檔案通常可由較低許可權的帳戶訪問,甚至是所有的域使用者。在這種情況下,任何域使用者都可以輕鬆訪問,使用可逆加密儲存的任何帳戶密碼。
下面,我來分解下之前那條使用PowerShell從AD中提取使用可逆加密儲存密碼使用者的命令。
Get-ADUser-Filter‘useraccountcontrol-band128’-Properties useraccountcontrol| Format-Table name, samaccountname,useraccountcontrol
Get-ADUser –是Active Directory PowerShell模組中的cmdlet,預設情況下安裝在Windows Server 2008 R2及更高版本上。可以使用Import-Module命令匯入它。
Filter –使用PowerShell表示式告訴cmdlet搜尋引數是什麼。這裡,我們搜尋的是具有特定UserAccountControl屬性值的使用者帳戶。
你也可以使用LDAP/">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-band128’-Properties useraccountcontrol| Format-Table name, samaccountname,useraccountcontrol | Out-File -Encoding ascii MyOutput.txt
*參考來源: blackhillsinfosec ,FB小編secist編譯,轉載請註明來自FreeBuf.COM