從活動目錄獲取域管理員權限的各類姿式

修碼的馬修 · 2016/01/12 12:38python

Author:Sean Metcalfgit

From: Attack Methods for Gaining Domain Admin Rights in Active Directorygithub

0x00 前言


對於一個攻擊者來講,有不少方法能在活動目錄中得到域管理員權限。這篇文章旨在介紹一些當下比較流行的方法,這裏介紹的方法都基於一個前提——攻擊者已經得到內網中一臺(或幾臺)機器的權限而且得到了普通域用戶的帳戶。算法

0x01 SYSVOL中的密碼和組策略


這種方法是最簡單的,由於不須要特殊的工具就能實現。攻擊者只須要打開文件管理器搜索 SYSVOL DFS 共享中的XML文件。大多數時候,groups.xmlscheduledtasks.xmlServices.xml文件中都會含有用戶憑證。shell

SYSVOL 是活動目錄中的全域共享文件夾,全部認證用戶都擁有讀權限。SYSVOL 中包含了登錄腳本,組策略以及其餘域控制器須要須要用到的數據(由於SYSVOL會在全部域控之間自動同步和共享)。全部的組策略文件會存放在:\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\數據庫

當一個GPP(組策略)被新建,就會有相關的組策略文件在SYSVOL中被建立,若是提供了密碼,組策略文件中會同時包含AES-256位的加密後的密碼數據,這加密彷佛是足夠安全了。windows

除了Windows 2012以前的某些系統,微軟在MSDN中提供了解密所須要的AES私鑰。由於認證用戶(信任域中的用戶)都具備SYSVOL的讀權限,任何人均可以搜索包含「cpassword」字段的XML文件,而裏面正好有AES加密後的密碼。promise

GroupPolicyPreferences-Password-XMLFileContents

有了這類XML的訪問權限,攻擊者能夠用AES私鑰解密GPP密碼。PowerSploit的Get-GPPPassword函數被認爲最好用的攻擊實現,下面的截圖展現了一個相似的PowerShell函數正在解密在SYSVOL中找到的XML文件中包含的密碼。安全

GroupPolicyPreferences-Decrypted-Password

其餘文件類型,例如.vbs.bat也可能包含嵌入的密碼(常常是明文)。服務器

VBS-Scripts-In-SYSVOL

你可能會以爲已經發布的補丁可以防止用戶憑證被放置在組策略配置文件中,因此這個問題獲得了證實。事實證實,筆者在滲透測試中仍然能在SYSVOL目錄中中找到用戶憑證。

對策:

  • 在每臺電腦上都安裝上KB2962486補丁,能夠防止新的用戶憑證被放到組策略配置文件當中。
  • 刪除SYSVOL目錄中包含密碼的GPP xml文件。
  • 不要把密碼放在全部認證用戶都有權訪問的文件當中。

關於這種攻擊方法的更多信息能夠參考這篇文章:Finding Passwords in SYSVOL & Exploiting Group Policy Preferences

0x02 針對沒打補丁的域控利用MS14-068漏洞


距離MS14-068的補丁KB3011780發佈已經有超過一年時間了,也出現了不少方法來確保針對MS14-068的攻擊被檢測和識別出來。然而這並不意味着域控就必定打上了補丁或者配置了監測系統。不少公司機構在補丁發佈後的一個月內打上了補丁;可是不能保證每臺新上線的域控都在被配置好以前就打上了補丁。

感謝Gavin Milard(@gmillard on Twitter),咱們有了如下的圖,很好地解釋這個漏洞。

Kerb-MS14-068-twitterpic-BoardingPass-Pilot

簡單來說,經過MS14-048,攻擊者能夠在五分鐘內重寫有效的Kerberos TGT 認證票據而且成爲域管理員(企業管理員)。攻擊原理就像上面的機票同樣,隨便寫上「飛行員」字樣就能經過認證,登上飛機就能理所固然地坐到駕駛艙冒充飛行員享受咖啡福利。

第一個EXP在補丁發佈後的兩週後被公佈,叫作PyKEK,做者是Sylvain Monné (@BiDOrD). PyKEK是一個能在全部安裝了python的機器(Raspberry Pi?)上運行的腳本,只要機器能鏈接到一臺沒打補丁的域控就能發揮做用。它會生成一個ccache文件。用Mimikatz能夠把這個生成的ccache文件注入到內存當中,攻擊者就能成爲域管理員!有了這個票據,就能被容許訪問域控上面的admin$共享!

Mimikatz-PTC-PyKEK-ccacheFile

限制條件:打了補丁或者域中有Win2012/2012R2 域控

利用MS14-068的步驟:

  1. 做爲普通用戶向域控請求一個沒有PAC的Kerberos TGT認證的票據,域控會返回一個TGT(不包含PAC,PAC一般包含有用戶組中的成員關係)
  2. 生成一個僞造的PAC,由於沒有密鑰,因此生成的PAC「被標記」有MD5算法,而不是帶有域用戶密碼數據的HMAC_MD5類型。
  3. 把僞造的PAC結合上TGT構造認證數據,做爲TGS服務的一部分發送到域控。
  4. 域控會混淆構造的數據,因此直接丟棄以前用戶發送沒帶有PAC的TGT,而後新構造一個TGT並用本身的認證數據插入到僞造的PAC當中,再把新TGT發送給用戶
  5. 這樣帶有僞造PAC的TGT就能使用戶成爲有漏洞域控上的域管理員。

Benjamin Delpy(Mimikatz 的做者)寫了一個MS14-068的利用工具,叫Kekeo,是PyKEK的升級版。它可以找到並定位有漏洞的域控,在打了補丁和有2012/2012R2域控的狀況下仍能奏效。實現的步驟和PyKEK基本相同,不過在最後加了一個步驟,以此得到一個能在域中全部域控利用的TGT。它利用攻擊生成的TGT來獲取一個處處都能用的TGT。

MS14068-01

對策:

  • 確保機器在運行DCPromo命令(被提高爲域控)前就安裝上了KB3011780補丁。一個快速簡單的方法是用PowerShell命令:get-hotfix 3011780
  • 同時,爲機器開啓自動安裝關鍵補丁的選項。

0x03 Kerberos TGS 服務 Ticket離線破解(Kerberoast)


Kerberoast 可以在不對目標系統發送任何數據的狀況下用普通用戶身份從活動目錄中提取服務的帳戶憑證。人們老是設置弱口令,因此這種攻擊每每可以得逞。這種攻擊可以成功的緣由是:大多數服務帳戶的密碼都和域的密碼最短長度限制同樣長(一般是10個或12個字符),這意味着即便是採用暴力破解的方式,所花費的時間也不太可能超過密碼過時時限。有的服務帳戶甚至尚未設置密碼過時時限,因此同一個密碼可以用個一年半載的也不足爲奇。更好玩的是,大多數服務帳戶都有權限過大的問題,一般仍是域管理員組的成員,有着對活動目錄的所有權限(儘管有時候服務帳戶只須要修改某些特定對象的屬性或者只需在特定服務上擁有管理權限)。

注意:這種攻擊對Windows系統管理的目標服務不會成功,由於這類服務會在活動目錄中映射成爲一個有着128位長密碼的帳戶,這麼長的密碼不可能在短期內破解出來。

攻擊的步驟包括爲目標的服務帳戶的服務器主體名稱(Service Principle Name—— SPN)請求一個Kerbero服務票據 (TGS) 。這裏會採用一個有效的用戶認證票據(TGT)來請求一個或幾個運行在服務器上的目標服務票據。域控不會檢測用戶是否真正鏈接到了這些資源上(即便用戶可能真的有權限訪問)。域控會在活動目錄中查找SPN而且用SPN關聯的用戶帳戶把票據進行加密,以此賦予用戶訪問服務的權限。請求的Kerbero服務票據的加密類型是 RC4_HMAC_MD5, 這意味着服務帳戶的NTLM密碼哈希會被用來加密服務票據。因此Kerberoast可以經過嘗試不一樣的NTLM哈希來解開kerberos票據,一旦票據被成功解開,它的密碼也就到手了。

注意:得到服務票據不須要提權,同時也不會發送數據到目標機器。

Kerberoast-03

Tim Medin 在 DerbyCon 2014 上做了相關的報告:「Attacking Microsoft Kerberos Kicking the Guard Dog of Hades」 (幻燈片 & 視頻),同時也發佈了Kerberoast Python TGS cracker

對策:

  • 對付這種攻擊最有效的對策實際上是保證服務帳戶的密碼在25位以上。
  • 託管服務帳戶(Managed Service Accounts)和用戶組託管服務帳戶(Group Managed Service Accounts)是可以確保帳戶密碼足夠長、足夠複雜、而且按期更改。一些第三方的密碼管理器也是管理服務帳戶的不錯的解決方案。

關於這種攻擊方法的更多信息能夠參考這篇文章:Cracking Kerberos TGS Tickets Using Kerberoast – Exploiting Kerberos to Compromise the Active Directory Domain

0x04 「瞞天過海」


我把下面這一部分叫作「瞞天過海」,由於很難把這類攻擊進行具體的歸類。能夠把它比做一種舞蹈。拿下一臺機器,提權,導出憑證。而後用憑證跳到另外的機器上,提權,再拿下更多的憑證。

這種攻擊在域中一般能很快見效,由於大多數活動目錄管理員都是用一個帳戶登錄到一臺機器上,並切會用到RunAs(使得管理員的憑證留在了本地機器上面)或者用RDP鏈接到一臺服務器(憑證就能經過鍵盤記錄器記錄下來)。

  • 第一步: 攻下一臺機器,經過提權漏洞獲取本地管理員權限。用Mimikatz或者其餘相似的工具導出最近登錄過本機的用戶憑證。
  • 第二步: 用本地管理員的憑證嘗試登錄到別的機器上。這經常頗有效,由於本地管理員的帳戶密碼曾經很難被配置正確(如今你能夠用微軟提供的 LAPS)。假如不少(甚至是全部)機器上都用着一樣的帳戶密碼,那麼獲得一組帳戶密碼就至關於擁有了全部機器的管理員權限。你能夠用憑證登錄到不一樣的機器上,直到找到域管理員的憑證。用本地帳戶登錄到不一樣機器是一種理想的作法,由於這樣的登錄不須要鏈接到域控上面,也不多有公司機構把機器的安全日誌都發送到日誌中心繫統(SIEM)。
  • 第三步:利用獲取的憑證登錄到服務器上以得到更多的憑證。運行着像Microsoft Exchange Client Access Servers(CAS), Microsoft Exchange OWA, Microsoft SQL 和 Terminal Services(RDP)這類服務的服務器,極可能在內存中存留大量用戶的憑證(或者是一些有域管理員權限的服務)。
  • 第四步:收網!

有了域管理員的憑證,就沒什麼可以阻止攻擊者導出全部的域憑證,並在內網中維持權限。

若是有服務以域管理員的權限在全部的工做站或服務器上運行,只須要攻下一個臺機器就至關與攻下了整個域活動目錄。

一般來講,經過PowerShell來進行遠程管理是一個很好的方法,由於PowerShell採用的是的是網絡登錄(不會有憑證保存在遠程機器的內存中)。這很好,微軟也把RDP管理模式逐步移向這種模式。還有種方法可以用PowerShell鏈接到遠程系統進行管理,而且可以經過CredSSP調用憑證。問題是CredSSP不夠安全。

Joe Bialek 在PowerShellMagazine.com中寫道:

管理員用PowerShell遠程管理時遇到一個很常見的問題就是「雙躍點」問題。管理員用PowerShell遠程鏈接到服務器A上面,而且嘗試在從服務器A鏈接到服務器B。這種狀況下第二次鏈接不會成功。

緣由是:默認狀況下,PowerShell遠程認證的方式是「網絡登錄」。網絡登錄只須要向服務器證實你擁有登錄的憑證而不須要把憑證發送過去(詳情見:KerberosNTLM認證)。既然遠程服務器沒有你登錄的憑證,那麼當你進行一次雙躍點登錄(從服務器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的遠程操做時的密碼加密。

從哈希傳遞攻擊(Pass-the-hash)到憑證傳遞攻擊(Pass-the-Credential)

大多數人都據說過哈希傳遞攻擊(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。

其實還有其餘種類的盜取憑證的手段,不過這幾種是最多見的:

  • 哈希傳遞攻擊:抓取哈希值並用來訪問資源。直到用戶改密碼哈希值都是有效的。
  • 票據傳遞攻擊:抓取Kerberos票據用來訪問資源。在票據有效期限內票據都會有效(通常是7天)。
  • 超-哈希傳遞攻擊:用密碼哈希值來得到Kerberos票據。哈希值在用戶改密碼以前都有效。

對策:

  • 管理員應該爲管理事務劃分出專門的管理員機器。管理員的帳戶永遠不要登錄到用來收發郵件和上網的普通機器上。這樣就能下降憑證被盜取的機會。 須要注意的是智能卡不可以防止憑證被盜取,由於在訪問資源的時候仍會用到帳戶所對應的密碼哈希值。智能卡只能保證正在登錄的用戶擁有智能卡,一旦被用來登錄系統,智能卡的兩個驗證因素就會變爲一個,就是用戶的密碼哈希值(被存放在內存裏)。還有就是,當帳戶設置爲用智能卡登錄的時候,系統會爲帳戶設置一個新的密碼(還永遠不會改變)。
  • 在工做機和服務器上的全部本地管理員帳戶都應該足夠長,足夠複雜,足夠隨機,能夠用微軟 LAPS之類的產品來保證這點
  • 配置組策略來放置本地管理員帳戶經過網絡來認證登錄。下面幾條簡單的GPO就能阻止本地帳戶在經過網絡登錄(包括RDP),同時也能阻止域管理員和企業管理員登錄到本地。GPO有一些幾條: *禁止如下用戶組從網絡登錄到這臺電腦:本地帳戶,企業管理員,域管理員 *禁止如下用戶組從遠程桌面登錄:本地帳戶,企業管理員,域管理員 *禁止如下用戶組本地登錄:企業管理員,域管理員

GroupPolicy-Prevent-LocalAccount-LogonOverNetwork

獲取訪問活動目錄數據庫文件的權限(ntds.dit)

活動目錄數據庫(ntds.dit)包含了活動目錄域中全部對象的全部信息。這個數據庫中的數據會被複制到域中的全部域控。這個文件照樣包含了全部域用戶和計算機帳戶的密碼哈希值。只有能登錄到域控上的用戶才能訪問到ntds.dit文件。

顯然,保護好這個文件是很重要滴,由於攻擊者訪問它就能致使整個域和目錄林(forest)被攻陷。

下面列出了幾種不用成爲域管理員就能獲取ntds.dit數據的方法:

備份路徑(備份服務器儲存,媒體,網絡共享)

攻擊者訪問到域控的備份並在備份共享的ntds.dit文件安放後門。管理員應該確保全部能經過網絡訪問的保存域備份的目錄都是安全的。只有域管理員能夠訪問它們,只要有其餘人能訪問,那我的就能搖身一變成爲域管理員。

在準備配置成域控的服務器上找NTDS.dit文件

DCPromo 中會有一個叫IFA的步驟,也就是「從媒體安裝」,這個步驟可使服務器不經過網絡來複制域中的數據。這個IFA集是NTDS.dit的拷貝,它可能出如今爲新域控準備的共享目錄中,也可能在還沒配置成域控的服務器上找到,這樣的服務器就是不安全的。

有虛擬機的管理權限,就能克隆虛擬的域控並離線獲取數據

得到虛擬域控的訪問權並獲取域中的憑證。你有用VMWare嗎?VCenter的管理員是擁有所有權限的。有了VCenter的管理員權限,就能克隆域控直接把數據拷貝到本地。

在VM被掛起的狀況下,還能夠從虛擬機內存直接提取LSASS數據。不要小看虛擬機管理員在虛擬域控上所擁有的能力。

若是你的VCenter管理員組在活動目錄裏,你應該考慮改掉它。

對合適的用戶組賦予恰當的權限,不要給攻擊者提供經過服務器管理員權限給整個活動目錄安裝後門的能力。

你的虛擬機管理員應該被視做是與管理員(若是有虛擬域控的話)

獲取一個有權登錄域控的帳戶

在活動目錄中有幾個組不該該有登錄域控的默認權限。

Default-DC-LogOnLocallyGroups

如下是默認有權登錄域控的用戶組:

  • Enterprise Admins (目錄林管理員組)
  • Domain Admins(域管理員組)
  • Administrators
  • Backup Operators
  • Account Operators
  • Print Operators

這意味着若是一個攻擊者可以拿下Account Operators或者Print Operators中的一個帳戶,整個活動目錄就可能被攻陷,由於這些用戶組有登錄到域控的權限。

對策:

  • 限制用戶組/帳戶登錄到域控的權限
  • 避免用戶組/帳戶擁有對活動目錄的所有權限,尤爲是服務帳戶
  • 保護好每個活動目錄數據庫(ntds.dit)的拷貝,不要把它放在信任級別低於域控的任何地方。

那麼問題來了,若是一個帳戶被賦予登錄域控的權限,接下來會發生什麼?

若是一個帳戶有權登錄域控,二話不說固然是把域控的用戶憑證拖下來。

用Mimitaz導出域中全部憑證

神器Mimikatz可以從域控中到存儲域中的全部用戶憑證。

Mimikatz-LSADump-LSA

用Mimitaz導出LSASS內存信息(得到域管理員憑證)

Mimikatz可以在不一樣系統中的LSASS.dmp中導出LSASS而後提取出登錄過的用戶憑證。在域控上,這樣總能拿到域管理員的憑證。

Mimikatz-Sekurlsa-Minidump

用任務管理器來導出LSASS內存信息(得到域管理員憑證)

一旦LSASS被導出來,Mimikatz就能提取到登錄過的用戶憑證。在域控上,這也總能拿到域管理員的憑證。

TaskManager-DumpLSASS

用NTDSUtil建立媒體安裝集(IFM) (抓取NTDS.dit文件)

NTDSUtil一個本地運行的針對活動目錄數據庫(ntds.dit)的命令,同時容許爲DCPromo命令準備IFM集。IFM是用於DCPromo命令中「從媒體安裝」的步驟的,有了它配置域控時就不須要經過網絡從其餘域控拷貝數據。IFM集同時也會在c:\temp目錄下生成的一份NTDS.dit拷貝。

此文件可能出如今爲新域控準備的共享目錄中,也可能在還沒配置成域控的服務器上找到,這樣的服務器就是不安全的。

NTDSUtil-CreateIFM

從NTDS.dit文件中提取活動目錄域憑證(註冊表系統單元)

一旦攻擊者有了一份NTDS.dit文件的拷貝(還有指定的註冊表鍵值來解密數據庫文件中的加密部分),在活動目錄數據庫文件中的憑證數據就能被提取出來。

一旦攻擊者有了註冊表系統單一和NTDS.dit 文件,他就能獲取全部的活動目錄憑證!下面的截圖來自安裝有Impacket python工具的Kali系統。DIT經過Impacket中的secrectdump.py腳本被導出。

IMPacket-Dump-Credentials-NTDSdit

在2015年十月,DSInternals.com發佈了一個用於從NTDS.dit導出用戶憑證(註冊表系統單元)的PowerShell方法,叫作Get-ADDBAcount(儘管只能用於Windows 8和Windows 2012系統以上,由於早前的系統有bug)。

一但攻擊者導出了域數據庫,就有不少選擇來維持保留高級權限,包括建立並使用Golden Tickets,這種方法能在拿下一個域的狀況下對整個目錄林(forest)進行攻擊。

參考連接:

0x05 譯後記


drops和zone上已經有不少域滲透相關的資料了,尤爲是三好學生發表的一系列文章,在實戰中具備很好的參考意義。翻譯的這篇文章裏面大多數方法的詳細利用步驟都能在drops上找到,文章的意義在於給剛進入內網的同窗提供思路和方向。

至於工具方面我的也有一些體會,首先Mimikatz是域滲透中必不可少的神器,就像豬豬俠說的:

擼域控,就是先搞定域裏面的任何一臺機器,想辦法弄到SYSTEM權限,mimikataz一上,就收工了。
域滲透,mimikataz出來後,幾乎沒有新思路了。

其實思路仍是有的,就像上面就提供了很多出了Mimikatz以外的思路。一個新趨勢就是域滲透逐漸在往PowerShell上作文章,攻防兩方都在PowerShell研究出了很多新方法。工具方面一個是PowerTools,集合了不少神奇好用的PowerShell腳本,包括提權,維持權限,還有一些SMB相關的攻擊應用等。另外一個就是Empire,可謂是PowerShell在後滲透階段的集大成者。

最後不能不提的固然是以上兩個工具做者harmj0y的博客,上面常常會發布不少域滲透相關的猥瑣思路。

相關文章
相關標籤/搜索