Author:Sean Metcalf
From: Attack Methods for Gaining Domain Admin Rights in Active Directory
對于一個攻擊者來說,有很多方法能在活動目錄中獲得域管理員權限。這篇文章旨在介紹一些當下比較流行的方法,這里介紹的方法都基于一個前提——攻擊者已經獲得內網中一臺(或幾臺)機器的權限并且獲得了普通域用戶的賬戶。
這種方法是最簡單的,因為不需要特殊的工具就能實現。攻擊者只需要打開文件管理器搜索 SYSVOL DFS 共享中的XML文件。大多數時候,groups.xml
、scheduledtasks.xml
、Services.xml
文件中都會含有用戶憑證。
SYSVOL 是活動目錄中的全域共享文件夾,所有認證用戶都擁有讀權限。SYSVOL 中包含了登陸腳本,組策略以及其他域控制器需要需要用到的數據(因為SYSVOL會在所有域控之間自動同步和共享)。所有的組策略文件會存放在:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
當一個GPP(組策略)被新建,就會有相關的組策略文件在SYSVOL中被創建,如果提供了密碼,組策略文件中會同時包含AES-256位的加密后的密碼數據,這加密似乎是足夠安全了。
除了Windows 2012之前的某些系統,微軟在MSDN中提供了解密所需要的AES私鑰。因為認證用戶(信任域中的用戶)都具有SYSVOL的讀權限,任何人都可以搜索包含“cpassword”字段的XML文件,而里面正好有AES加密后的密碼。
有了這類XML的訪問權限,攻擊者可以用AES私鑰解密GPP密碼。PowerSploit的Get-GPPPassword
函數被認為最好用的攻擊實現,下面的截圖展示了一個類似的PowerShell函數正在解密在SYSVOL中找到的XML文件中包含的密碼。
其他文件類型,例如.vbs
和.bat
也可能包含嵌入的密碼(經常是明文)。
你可能會覺得已經發布的補丁能夠防止用戶憑證被放置在組策略配置文件中,所以這個問題得到了證明。事實證明,筆者在滲透測試中仍然能在SYSVOL目錄中中找到用戶憑證。
對策:
關于這種攻擊方法的更多信息可以參考這篇文章:Finding Passwords in SYSVOL & Exploiting Group Policy Preferences
距離MS14-068的補丁KB3011780發布已經有超過一年時間了,也出現了很多方法來確保針對MS14-068的攻擊被檢測和識別出來。然而這并不意味著域控就一定打上了補丁或者配置了監測系統。很多公司機構在補丁發布后的一個月內打上了補丁;但是不能保證每臺新上線的域控都在被配置好之前就打上了補丁。
感謝Gavin Milard(@gmillard on Twitter),我們有了以下的圖,很好地解釋這個漏洞。
簡單來講,通過MS14-048,攻擊者可以在五分鐘內重寫有效的Kerberos TGT 認證票據并且成為域管理員(企業管理員)。攻擊原理就像上面的機票一樣,隨便寫上“飛行員”字樣就能通過認證,登上飛機就能理所當然地坐到駕駛艙冒充飛行員享受咖啡福利。
第一個EXP在補丁發布后的兩周后被公布,叫做PyKEK,作者是Sylvain Monné (@BiDOrD). PyKEK是一個能在所有安裝了python的機器(Raspberry Pi?)上運行的腳本,只要機器能連接到一臺沒打補丁的域控就能發揮作用。它會生成一個ccache文件。用Mimikatz可以把這個生成的ccache文件注入到內存當中,攻擊者就能成為域管理員!有了這個票據,就能被允許訪問域控上面的admin$共享!
限制條件:打了補丁或者域中有Win2012/2012R2 域控
利用MS14-068的步驟:
Benjamin Delpy(Mimikatz 的作者)寫了一個MS14-068的利用工具,叫Kekeo,是PyKEK的升級版。它能夠找到并定位有漏洞的域控,在打了補丁和有2012/2012R2域控的情況下仍能奏效。實現的步驟和PyKEK基本相同,不過在最后加了一個步驟,以此獲得一個能在域中所有域控利用的TGT。它利用攻擊生成的TGT來獲取一個到處都能用的TGT。
對策:
get-hotfix 3011780
Kerberoast 能夠在不對目標系統發送任何數據的情況下用普通用戶身份從活動目錄中提取服務的賬戶憑證。人們總是設置弱口令,所以這種攻擊往往能夠得逞。這種攻擊能夠成功的原因是:大多數服務賬戶的密碼都和域的密碼最短長度限制一樣長(通常是10個或12個字符),這意味著即使是采用暴力破解的方式,所花費的時間也不太可能超過密碼過期時限。有的服務賬戶甚至還沒有設置密碼過期時限,所以同一個密碼能夠用個一年半載的也不足為奇。更好玩的是,大多數服務賬戶都有權限過大的問題,通常還是域管理員組的成員,有著對活動目錄的全部權限(盡管有時候服務賬戶只需要修改某些特定對象的屬性或者只需在特定服務上擁有管理權限)。
注意:這種攻擊對Windows系統管理的目標服務不會成功,因為這類服務會在活動目錄中映射成為一個有著128位長密碼的賬戶,這么長的密碼不可能在短時間內破解出來。
攻擊的步驟包括為目標的服務賬戶的服務器主體名稱(Service Principle Name—— SPN)請求一個Kerbero服務票據 (TGS) 。這里會采用一個有效的用戶認證票據(TGT)來請求一個或幾個運行在服務器上的目標服務票據。域控不會檢測用戶是否真正連接到了這些資源上(即使用戶可能真的有權限訪問)。域控會在活動目錄中查找SPN并且用SPN關聯的用戶賬戶把票據進行加密,以此賦予用戶訪問服務的權限。請求的Kerbero服務票據的加密類型是 RC4_HMAC_MD5, 這意味著服務賬戶的NTLM密碼哈希會被用來加密服務票據。所以Kerberoast能夠通過嘗試不同的NTLM哈希來解開kerberos票據,一旦票據被成功解開,它的密碼也就到手了。
注意:獲得服務票據不需要提權,同時也不會發送數據到目標機器。
Tim Medin 在 DerbyCon 2014 上作了相關的報告:“Attacking Microsoft Kerberos Kicking the Guard Dog of Hades” (幻燈片 & 視頻),同時也發布了Kerberoast Python TGS cracker。
對策:
關于這種攻擊方法的更多信息可以參考這篇文章:Cracking Kerberos TGS Tickets Using Kerberoast – Exploiting Kerberos to Compromise the Active Directory Domain
我把下面這一部分叫做“瞞天過海”,因為很難把這類攻擊進行具體的歸類。可以把它比作一種舞蹈。拿下一臺機器,提權,導出憑證。然后用憑證跳到另外的機器上,提權,再拿下更多的憑證。
這種攻擊在域中通常能很快見效,因為大多數活動目錄管理員都是用一個賬戶登陸到一臺機器上,并切會用到RunAs(使得管理員的憑證留在了本地機器上面)或者用RDP連接到一臺服務器(憑證就能通過鍵盤記錄器記錄下來)。
有了域管理員的憑證,就沒什么能夠阻止攻擊者導出所有的域憑證,并在內網中維持權限。
如果有服務以域管理員的權限在所有的工作站或服務器上運行,只需要攻下一個臺機器就相當與攻下了整個域活動目錄。
通常來說,通過PowerShell來進行遠程管理是一個很好的方法,因為PowerShell采用的是的是網絡登陸(不會有憑證保存在遠程機器的內存中)。這很好,微軟也把RDP管理模式逐步移向這種模式。還有種方法能夠用PowerShell連接到遠程系統進行管理,并且能夠通過CredSSP調用憑證。問題是CredSSP不夠安全。
Joe Bialek 在PowerShellMagazine.com中寫道:
管理員用PowerShell遠程管理時遇到一個很常見的問題就是“雙躍點”問題。管理員用PowerShell遠程連接到服務器A上面,并且嘗試在從服務器A連接到服務器B。這種情況下第二次連接不會成功。
原因是:默認情況下,PowerShell遠程認證的方式是“網絡登陸”。網絡登陸只需要向服務器證明你擁有登陸的憑證而不需要把憑證發送過去(詳情見:Kerberos 和 NTLM認證)。既然遠程服務器沒有你登陸的憑證,那么當你進行一次雙躍點登陸(從服務器A登陸到服務器B)的時候,結果當然會失敗。
為了解決這個問題,PowerShell提供了CredSSP(Credential Security Support Provider)選項。當選擇了CredSSP模式,PowerShell不會進行“網絡登陸”,而是進行“網絡明文登陸”。網絡明文登陸的工作原理是直接把用戶的密碼明文發送到遠程服務器上。通過這種方式,服務器A獲得了用戶的明文密碼,所以也能用它來登陸到服務器B,雙躍點登陸成功。
更新:以上測試是在Windows Server 2012上面進行的。微軟已經在Windows Server 2012R2和Windows8.1中限制了在內存中存放明文憑證。這意味著使用Mimikatz的攻擊者們可能將不會直接看到有明文密碼。不過攻擊者仍能看到NT密碼哈希和Kerberos TGT,這兩者都能和密碼產生同樣的效果,可以被用于網絡的登陸認證。
另外,即使明文憑證沒有被存放在內存當中,它依然被發送到了遠程服務器。攻擊者能夠向本地安全認證子系統服務(LSASS.exe)注入惡意代碼并且在傳輸過程中截獲明文密碼。所以即使用Mimikatz找不到明文密碼了,攻擊者還是會有辦法獲得它。
綜上所述,不要用CredSSP就對了。
還有一個類似的問題就是WinRM(PowerShell遠程操作用到的東西)的“AllowUnencrypted”配置。把這個值設為“True”會禁用掉系統WinRM連接時的加密,包括PowerShell的遠程操作時的密碼加密。
大多數人都聽說過哈希傳遞攻擊(PtH),它通過找到賬戶相關的密碼哈希(通常是NTLM密碼哈希)來進行攻擊。有趣的是有了PtH,就不必費時間破解密碼的哈希值來獲得密碼明文了,因為在Windows網絡中,哈希值就是用來證明身份的(知道了用戶名和密碼哈希值就能夠通過驗證)。微軟自家的產品和攻擊顯然不會支持這種攻擊,所以我們需要第三方工具來完成任務,例如:Mimikatz。
一旦攻擊者找到了密碼哈希,很多大門都會向他們打開,但是他們可不只有PtH這一種選擇。
票據傳遞攻擊(Pass-the-Ticket——PtT)是通過抓取現有的Kerberos票據來冒充一個用戶。Mimikatz能夠抓取當前用戶的Kerberos票據,也能抓取每一個通過系統認證的用戶的所有票據(如果配置了Kerberos委派機制的不受限訪問,這可成了大問題)。一旦獲得了Kerberos票據,攻擊者就能用Mimikatz來傳遞它并訪問到目標資源(當然是在Kerberos票據的有效時間內)。
超-哈希傳遞攻擊(OverPass-the-Hash)也就是秘鑰傳遞攻擊,通過獲得的密碼哈希來獲得Kerberos票據。這種技巧會清除當前用戶的所有Kerberos秘鑰(哈希值)然后把得到的哈希值注入到內存當中,以此請求獲得Kerberos票據。下次訪問資源需要用到Kerberos票據的時候,被注入的哈希值(現在是內存中的Kerberos秘鑰)會被用來請求Kerberos票據。Mimikatz提供了實現這種攻擊的功能,相比起PtH,這是更加隱秘的一種手段,因為現在已經有好幾種方法能夠檢測到PtH。
注意: 如果獲得哈希值的類型是NTLM,Kerberos票據的類型是RC4.如果哈希類型是AES,Kerberos票據類型也會是ABS。
其實還有其他種類的盜取憑證的手段,不過這幾種是最常見的:
對策:
活動目錄數據庫(ntds.dit)包含了活動目錄域中所有對象的所有信息。這個數據庫中的數據會被復制到域中的所有域控。這個文件照樣包含了所有域用戶和計算機賬戶的密碼哈希值。只有能登陸到域控上的用戶才能訪問到ntds.dit文件。
顯然,保護好這個文件是很重要滴,因為攻擊者訪問它就能導致整個域和目錄林(forest)被攻陷。
下面列出了幾種不用成為域管理員就能獲取ntds.dit數據的方法:
備份路徑(備份服務器儲存,媒體,網絡共享)
攻擊者訪問到域控的備份并在備份共享的ntds.dit文件安放后門。管理員應該確保所有能通過網絡訪問的保存域備份的目錄都是安全的。只有域管理員可以訪問它們,只要有其他人能訪問,那個人就能搖身一變成為域管理員。
在準備配置成域控的服務器上找NTDS.dit文件
DCPromo 中會有一個叫IFA的步驟,也就是“從媒體安裝”,這個步驟可以使服務器不通過網絡來復制域中的數據。這個IFA集是NTDS.dit的拷貝,它可能出現在為新域控準備的共享目錄中,也可能在還沒配置成域控的服務器上找到,這樣的服務器就是不安全的。
有虛擬機的管理權限,就能克隆虛擬的域控并離線獲取數據
獲得虛擬域控的訪問權并獲取域中的憑證。你有用VMWare嗎?VCenter的管理員是擁有全部權限的。有了VCenter的管理員權限,就能克隆域控直接把數據拷貝到本地。
在VM被掛起的情況下,還可以從虛擬機內存直接提取LSASS數據。不要小看虛擬機管理員在虛擬域控上所擁有的能力。
如果你的VCenter管理員組在活動目錄里,你應該考慮改掉它。
對合適的用戶組賦予恰當的權限,不要給攻擊者提供通過服務器管理員權限給整個活動目錄安裝后門的能力。
你的虛擬機管理員應該被視作是與管理員(如果有虛擬域控的話)
獲取一個有權登陸域控的賬戶
在活動目錄中有幾個組不應該有登陸域控的默認權限。
以下是默認有權登陸域控的用戶組:
這意味著如果一個攻擊者能夠拿下Account Operators或者Print Operators中的一個賬戶,整個活動目錄就可能被攻陷,因為這些用戶組有登陸到域控的權限。
對策:
那么問題來了,如果一個賬戶被賦予登陸域控的權限,接下來會發生什么?
如果一個賬戶有權登陸域控,二話不說當然是把域控的用戶憑證拖下來。
用Mimitaz導出域中所有憑證
神器Mimikatz能夠從域控中到存儲域中的所有用戶憑證。
用Mimitaz導出LSASS內存信息(獲得域管理員憑證)
Mimikatz能夠在不同系統中的LSASS.dmp
中導出LSASS然后提取出登陸過的用戶憑證。在域控上,這樣總能拿到域管理員的憑證。
用任務管理器來導出LSASS內存信息(獲得域管理員憑證)
一旦LSASS被導出來,Mimikatz就能提取到登陸過的用戶憑證。在域控上,這也總能拿到域管理員的憑證。
用NTDSUtil創建媒體安裝集(IFM) (抓取NTDS.dit文件)
NTDSUtil一個本地運行的針對活動目錄數據庫(ntds.dit)的命令,同時允許為DCPromo命令準備IFM集。IFM是用于DCPromo命令中“從媒體安裝”的步驟的,有了它配置域控時就不需要通過網絡從其他域控拷貝數據。IFM集同時也會在c:\temp
目錄下生成的一份NTDS.dit拷貝。
此文件可能出現在為新域控準備的共享目錄中,也可能在還沒配置成域控的服務器上找到,這樣的服務器就是不安全的。
從NTDS.dit文件中提取活動目錄域憑證(注冊表系統單元)
一旦攻擊者有了一份NTDS.dit文件的拷貝(還有指定的注冊表鍵值來解密數據庫文件中的加密部分),在活動目錄數據庫文件中的憑證數據就能被提取出來。
一旦攻擊者有了注冊表系統單一和NTDS.dit 文件,他就能獲取所有的活動目錄憑證!下面的截圖來自安裝有Impacket python工具的Kali系統。DIT通過Impacket中的secrectdump.py
腳本被導出。
在2015年十月,DSInternals.com發布了一個用于從NTDS.dit導出用戶憑證(注冊表系統單元)的PowerShell方法,叫做Get-ADDBAcount
(盡管只能用于Windows 8和Windows 2012系統以上,因為早前的系統有bug)。
一但攻擊者導出了域數據庫,就有很多選擇來維持保留高級權限,包括創建并使用Golden Tickets,這種方法能在拿下一個域的情況下對整個目錄林(forest)進行攻擊。
參考鏈接:
drops和zone上已經有很多域滲透相關的資料了,尤其是三好學生發表的一系列文章,在實戰中具有很好的參考意義。翻譯的這篇文章里面大多數方法的詳細利用步驟都能在drops上找到,文章的意義在于給剛進入內網的同學提供思路和方向。
至于工具方面個人也有一些體會,首先Mimikatz是域滲透中必不可少的神器,就像豬豬俠說的:
擼域控,就是先搞定域里面的任何一臺機器,想辦法弄到SYSTEM權限,mimikataz一上,就收工了。
域滲透,mimikataz出來后,幾乎沒有新思路了。
其實思路還是有的,就像上面就提供了不少出了Mimikatz之外的思路。一個新趨勢就是域滲透逐漸在往PowerShell上做文章,攻防兩方都在PowerShell研究出了不少新方法。工具方面一個是PowerTools,集合了很多神奇好用的PowerShell腳本,包括提權,維持權限,還有一些SMB相關的攻擊應用等。另一個就是Empire,可謂是PowerShell在后滲透階段的集大成者。
最后不能不提的當然是以上兩個工具作者harmj0y的博客,上面經常會發布很多域滲透相關的猥瑣思路。