在內(nèi)部滲透測試中,我們經(jīng)??梢栽趲讉€(gè)小時(shí)以內(nèi)獲取域管訪問權(quán)限,原因在于相關(guān)系統(tǒng)并沒有經(jīng)過足夠的安全加固,運(yùn)維人員使用了默認(rèn)的不安全的Active Directory(活動(dòng)目錄)設(shè)置。在這種場景中,許多公開工具可以幫助我們查找并利用這些缺陷,最終獲得域管理員訪問權(quán)限。在本文中我們描述了一種滲透場景,其中我們無法使用標(biāo)準(zhǔn)的攻擊方法,只能深入挖掘才能獲得目標(biāo)域中的高等級(jí)權(quán)限。我們介紹了如何使用訪問控制列表(Acccess Control Lists)來提升權(quán)限,也發(fā)布了Invoke-Aclpwn這款新型工具,該工具是ntlmrelayx的擴(kuò)充,可以自動(dòng)執(zhí)行這種高級(jí)的攻擊步驟。
隨著大家對(duì)網(wǎng)絡(luò)安全方面的理解變得更加成熟也更加深刻,我們不得不深入研究才能在Active Directory(AD)中提升權(quán)限。在這類場景中,枚舉是一項(xiàng)非常關(guān)鍵的技術(shù)。AD目錄中的ACL(訪問控制列表)經(jīng)常容易被人忽視。ACL指的就是一組規(guī)則,定義了哪些實(shí)體在特定的AD對(duì)象上具備哪些權(quán)限。這些對(duì)象可以是用戶賬戶、組、計(jì)算機(jī)賬戶、域本身等等。ACL可以在某個(gè)對(duì)象(比如用戶賬戶)上進(jìn)行配置,也可以在Organizational Unit(OU,類似于AD內(nèi)的一個(gè)目錄)上配置。在OU上配置ACL的主要優(yōu)點(diǎn)在于,如果配置得當(dāng),所有的后繼對(duì)象都將繼承ACL。對(duì)象所屬的OU對(duì)應(yīng)的ACL中包含一個(gè)ACE(Access Control Entry,訪問控制項(xiàng)),定義了OU以及/或者子對(duì)象上對(duì)應(yīng)的標(biāo)識(shí)以及權(quán)限。ACE中的標(biāo)識(shí)不一定是用戶賬戶本身;將權(quán)限應(yīng)用于AD的安全組(security groups)是一種常見的做法。將用戶賬戶添加為該安全組的成員后,該用戶賬戶就可以被賦予ACE中配置的權(quán)限,因?yàn)橛脩糍~戶與安全組為隸屬關(guān)系。
AD中的組成員關(guān)系屬于遞歸從屬關(guān)系,舉個(gè)例子,假設(shè)我們有3個(gè)組:
Group_C為Group_B的成員,而Group_B自己又是Group_A的成員。當(dāng)我們將Bob添加為Group_C的成員,Bob不僅是Group_C的成員,也是Group_B以及Group_A的間接成員。這意味著當(dāng)Group_A具備某個(gè)對(duì)象或者資源的訪問權(quán)限時(shí),Bob也同樣具備該資源的訪問權(quán)限。被訪問的資源可以是NTFS文件共享、打印機(jī)或者某個(gè)AD對(duì)象(比如用戶、計(jì)算機(jī)、組或者域本身)。
為AD安全組提供權(quán)限以及訪問控制權(quán)是維護(hù)和管理(訪問)IT基礎(chǔ)架構(gòu)的好方法。然而,如果嵌套關(guān)系過于復(fù)雜,可能就會(huì)存在一些安全隱患。前面提到過,如果某個(gè)用戶是某個(gè)組的直接或者間接成員,那么該用戶就會(huì)繼承該組對(duì)某個(gè)資源的所有權(quán)限。如果Group_A被賦予修改AD中域?qū)ο蟮臋?quán)限,那么Bob自然就會(huì)繼承這些權(quán)限。然而,如果某個(gè)用戶僅屬于某個(gè)組,是該組的直接成員,但這個(gè)組又是其他50個(gè)組的間接成員,那么想理清這種權(quán)限繼承關(guān)系顯然要花費(fèi)不少精力。
在最近的滲透測試中,我們成功獲取了某個(gè)用戶賬戶權(quán)限,該用戶為Organization Management
組的成員。當(dāng)安裝Exhcange時(shí)會(huì)創(chuàng)建這個(gè)組,賦予其訪問Exchange相關(guān)活動(dòng)的訪問權(quán)限。除了能訪問這些Exchange設(shè)置選項(xiàng)以外,該組的成員還可以修改其他Exchange安全組的組成員關(guān)系,比如Exchange Trusted Subsystem
安全組。這個(gè)組是Exchange Windows Permissions
安全組的成員之一。
默認(rèn)情況下,如果某個(gè)域安裝了Exchange,那么Exchange Windows Permissions
安全組就具備該域?qū)ο蟮?code>writeDACL權(quán)限[1]。
writeDACL
權(quán)限可以允許持有者修改特定對(duì)象的權(quán)限(換句話說就是修改ACL),這意味著只要成為Organization Management
組的成員,我們就可以提升成為域管理員權(quán)限。
為了利用這一點(diǎn),我們將之前已獲得的用戶賬戶添加至Exchange Trusted Subsystem
組中。再次登錄后(因?yàn)橹挥性诘卿洉r(shí)才會(huì)加載安全組成員關(guān)系),現(xiàn)在我們已成為Exchange Trusted Subsystem
以及Exchange Windows Permission
組的成員,這樣我們就可以修改域的ACL。
如果我們可以修改某個(gè)AD對(duì)象的ACL,我們就可以給某個(gè)賬戶分配權(quán)限,使其可以向某個(gè)屬性(比如包含電話號(hào)碼的屬性)中寫入數(shù)據(jù)。除了為這些屬性分配讀寫權(quán)限之外,我們還可以進(jìn)一步分配,使其具備更多的權(quán)限。這些權(quán)限為預(yù)定義的任務(wù),包括修改密碼的權(quán)限、往郵箱發(fā)送電子郵件等等[2]。我們還可以為任意賬戶添加如下擴(kuò)展權(quán)限,使其成為當(dāng)前域的復(fù)制(replication)同伴:
Replicating Directory Changes
Replicating Directory Changes All
當(dāng)我們給這個(gè)用戶賬戶設(shè)置這些權(quán)限后,我們就可以請(qǐng)求域中任何用戶的密碼散列,其中也包括域的krbtgt
賬戶。大家可以參考GitHub深入了解這種權(quán)限提升技術(shù)。
當(dāng)然,成功控制Organization Management
組下某個(gè)用戶賬戶并不是經(jīng)常出現(xiàn)的事情。盡管如此,我們還是可以在更廣泛的層面上使用這種技術(shù)。Organization Management
組很有可能受另一個(gè)小組管理,而這個(gè)組又有可能被其他組管理,以此類推。這意味著域環(huán)境中存在一條難以發(fā)現(xiàn)的關(guān)系鏈,如果某一環(huán)出問題,整個(gè)域就可能淪陷。
為了幫助大家利用關(guān)系鏈存在的這種安全風(fēng)險(xiǎn),F(xiàn)ox-IT編寫了兩款工具。第一款工具使用PowerShell編寫,可以在AD環(huán)境內(nèi)部或者外部運(yùn)行。第二款工具是ntlmrelayx工具的擴(kuò)展,這個(gè)擴(kuò)展可以讓攻擊者將身份標(biāo)識(shí)(用戶賬戶以及計(jì)算機(jī)賬戶)轉(zhuǎn)發(fā)至活動(dòng)目錄,修改域?qū)ο蟮腁CL。
Invoke-ACLPwn是一個(gè)Powershell腳本,可以使用集成的憑據(jù)或者指定的憑據(jù)來運(yùn)行。這款工具的工作原理是使用SharpHound導(dǎo)出域內(nèi)所有ACL以及當(dāng)前用戶賬戶下的組成員關(guān)系。如果用戶不具備域?qū)ο蟮?code>writeDACL權(quán)限,該工具會(huì)枚舉域內(nèi)ACL的所有ACE。ACE中的每個(gè)標(biāo)識(shí)都擁有自己的ACL,也會(huì)被添加到枚舉隊(duì)列中進(jìn)行處理。為了枚舉所有信息,整個(gè)過程需要一點(diǎn)時(shí)間,但最終很有可能理出一條關(guān)系鏈,獲得域?qū)ο蟮?code>writeDACL權(quán)限。
當(dāng)算出關(guān)系鏈后,腳本就會(huì)開始處理鏈中可能被利用的每一環(huán):
1、將用戶加入必要的組中;
2、將兩個(gè)ACE(Replicating Directory Changes
、Replicating Directory Changes All
)添加到域?qū)ο蟮腁CL中:
3、如果有必要,則使用Mimikatz的DCSync功能請(qǐng)求給定用戶賬戶的哈希值。默認(rèn)情況下會(huì)使用krbtgt
賬戶。
利用過程結(jié)束后,該腳本會(huì)移除利用過程中添加的組成員關(guān)系,也會(huì)刪掉域?qū)ο驛CL中的ACE。
為了測試腳本是否能正常工作,我們創(chuàng)建了26個(gè)安全組。每個(gè)組都是另一個(gè)組的成員(即testgroup_a
是testgroup_b
,而testgroup_b
又是testgroup_c
的成員,以此類推,直到testgroup_z
為止)。
testgroup_z
安全組具備修改Organization Management
安全組的成員關(guān)系權(quán)限。前面提到過,這個(gè)組有權(quán)修改Exchange Trusted Subsystem
安全組的組成員關(guān)系。只要我們成為該組的成員,就有權(quán)修改活動(dòng)目錄中域?qū)ο蟮腁CL。
現(xiàn)在我們擁有包含31條鏈接的一條關(guān)系鏈:
1、26個(gè)安全組的間接成員關(guān)系;
2、具備修改Organization Management
安全組成員關(guān)系的權(quán)限;
3、已成為Organization Management
組的成員;
4、具備修改Exchange Trusted Subsystem
安全組成員關(guān)系的權(quán)限;
5、已成為Exchange Trusted Subsystem
以及Exchange Windows Permission
安全組的成員。
工具的輸出結(jié)果如下圖所示:
需要注意的是,雖然這個(gè)例子中我們使用了ACL配置信息(Exchange安裝過程中會(huì)進(jìn)行配置),然而這款工具并不需要依賴Exchange或者其他產(chǎn)品來查找或者利用關(guān)系鏈。
目前該工具只能枚舉并利用域?qū)ο笊系?code>writeDACL權(quán)限,我們還可以利用其他對(duì)象上的其他類型的訪問權(quán)限,比如owner
、writeOwner
、genericAll
等。
BloodHound團(tuán)隊(duì)在一篇白皮書中詳細(xì)解釋了這些訪問權(quán)限,我們將在未來更新這款工具時(shí)將這些權(quán)限的利用方法包含在內(nèi)。大家可以從我們的GitHub上下載Invoke-ACLPwn工具。
去年我們?yōu)閚tlmrelay編寫了新的擴(kuò)充,使其支持中繼至LDAP功能,這樣就能將新用戶添加到活動(dòng)目錄中,實(shí)現(xiàn)域枚舉并提升至域管權(quán)限。之前ntlmrelayx中的LDAP攻擊會(huì)檢查中繼賬戶是否為域管(Domain Admins)或者企業(yè)管理員(Enterprise Admins)組,如果是則會(huì)提升權(quán)限。
雖然這種方法的確有效,但并沒有考慮中繼賬戶可能擁有的任何特殊權(quán)限。根據(jù)本文介紹的研究成果,我們?cè)趎tlmrelayx中引入了新的攻擊方法。這種攻擊首先會(huì)請(qǐng)求重要域?qū)ο蟮腁CL,然后將二進(jìn)制格式解析成工具能夠理解的格式,接著枚舉中繼賬戶的權(quán)限。
這樣就能將中繼賬戶所屬的所有組(包括遞歸的組成員關(guān)系)考慮在內(nèi)。一旦枚舉完權(quán)限,ntlmrelayx就會(huì)檢查用戶是否具備足夠高的權(quán)限,以便新用戶或者現(xiàn)有用戶提升權(quán)限。
為了提升權(quán)限,我們可以使用兩種不同的攻擊方法。第一種攻擊稱為“ACL攻擊”,其中域?qū)ο蟮腁CL被修改,攻擊者可控的某個(gè)賬戶被賦予域中的Replication-Get-Changes-All
權(quán)限,這樣就可以使用前面提到過的DCSync方法。如果無法修改ACL,則使用“Group攻擊”將成員添加到域的高權(quán)限組中,這些高權(quán)限組包括:
Enterprise Admins
Domain Admins
Backup Operators(可以備份域控制器上的關(guān)鍵文件)
Account Operators(可以控制域中幾乎所有的組)
如果使用--escalate-user
標(biāo)志指定已有的某個(gè)用戶,那么在可以執(zhí)行ACL攻擊的前提下,該用戶將被賦予Replication
權(quán)限。如果使用的是“Group攻擊”,則會(huì)將該用戶添加到高權(quán)限組中。如果沒有指定已有的用戶,則可以考慮創(chuàng)建新的用戶。用戶可以創(chuàng)建在User容器中(用戶賬戶的默認(rèn)位置),或者在OrganizationalUnit
中(類似IT部門等成員具備該容器的管理權(quán)限)。
可能會(huì)有人注意到我們提到的是中繼賬戶,而不是中繼用戶。這是因?yàn)檫@種攻擊對(duì)具備高權(quán)限的計(jì)算機(jī)賬戶來說同樣適用。比如Exchange服務(wù)器的計(jì)算機(jī)賬戶就屬于這類賬戶,在默認(rèn)配置下該賬戶屬于Exchange Windows Permissions組的成員。如果攻擊者能夠讓Exchange服務(wù)器向攻擊者的主機(jī)發(fā)起身份認(rèn)證請(qǐng)求(比如使用mitm6這種網(wǎng)絡(luò)層的攻擊技術(shù)),那么攻擊者就能立即將權(quán)限提升為域管理員權(quán)限。
現(xiàn)在我們可以使用impacket的secretsdump.py
或者M(jìn)imikatz導(dǎo)出NTDS.dit
的哈希值。
同樣,如果攻擊者具備Exchange服務(wù)器的管理員權(quán)限,也有可能不需要導(dǎo)出任何密碼或者機(jī)器賬戶哈希,就能實(shí)現(xiàn)域權(quán)限的提升。如果以NT AuthoritySYSTEM
身份連接到攻擊者的主機(jī)并使用NTLM進(jìn)行身份認(rèn)證,這樣就足以向LDAP進(jìn)行身份認(rèn)證。如下圖中,我們以SYSTEM
權(quán)限使用psexec.py
調(diào)用Invoke-Webrequest
這個(gè)PowerShell函數(shù),使用-UseDefaultCredentials
啟動(dòng)NTLM的自動(dòng)身份驗(yàn)證:
備注:這里出現(xiàn)404錯(cuò)誤非常正常,因?yàn)槿绻欣^攻擊完成后,ntlmrelayx.py
會(huì)提供一個(gè)404頁面。
需要注意的是,在默認(rèn)配置的Active Directory中,針對(duì)LDAP的中繼攻擊有可能順利完成。如果啟用LDAP簽名就能在一定程度上緩解這種攻擊,然而LDAP簽名默認(rèn)處于禁用狀態(tài)。即便啟用了LDAP簽名,攻擊者還是有可能中繼至LDAPS(基于SSL/TLS的LDAP),因?yàn)長DAPS可以當(dāng)成一個(gè)簽名通道。針對(duì)此類攻擊的唯一緩解方法是在注冊(cè)表中為LDAP綁定通道。
如果想獲取ntlmrelayx中的新功能,只需更新到GitHub上最新版本的impacket即可。
為了緩解這類安全風(fēng)險(xiǎn),F(xiàn)ox-IT有如下幾點(diǎn)建議:
1、移除危險(xiǎn)的ACL。
使用Bloodhound之類的工具來檢查危險(xiǎn)的ACL[3]。Bloodhound可以導(dǎo)出域內(nèi)的所有ACL,幫助我們識(shí)別危險(xiǎn)的ACL。
2、移除Exchange Exterprise Servers的writeDACL
權(quán)限。
移除Exchange Exterprise Servers的writeDACL
權(quán)限。更多信息請(qǐng)參考這篇.aspx)技術(shù)文檔。
3、監(jiān)控安全組。
監(jiān)控可能對(duì)域產(chǎn)生重大影響的安全組(的成員關(guān)系),比如Exchange Trusted Subsystem
以及Exchange Windows Permissions
。
4、審核并監(jiān)控對(duì)ACL的修改操作。
審核域內(nèi)ACL的修改操作。如果尚未部署這種機(jī)制,那么我們需要修改域控制器的策略。大家可以參考TechNet上的這篇文章了解更多細(xì)節(jié)。
當(dāng)域?qū)ο蟮腁CL被修改后,就會(huì)出現(xiàn)ID為5136的一條事件日志。我們可以使用PowerShell查詢Windows事件日志,比如我們可以使用如下一行語句查詢Security事件日志中ID為5136的事件:
Get-WinEvent -FilterHashtable @{logname='security'; id=5136}
該事件中包含帳戶名以及以SDDL(Security Descriptor Definition Language)格式表示ACL。
我們無法直接查看這個(gè)數(shù)據(jù),但在Windows 10中有一個(gè)PowerShell cmdlet:ConvertFrom-SDDL
[4],這個(gè)cmdlet可以將SDDL字符串轉(zhuǎn)化為可讀性較好的ACL對(duì)象。
如果服務(wù)器運(yùn)行的是Windows Server 2016操作系統(tǒng),我們還可能看到原始的以及修改后的描述符。大家可以參考此鏈接了解更多信息。
獲得這個(gè)信息后,我們就可以開始著手調(diào)查,發(fā)現(xiàn)哪些條目被修改過,研究背后的真實(shí)原因。
[1] https://technet.microsoft.com/en-us/library/ee681663.aspx
[2] https://technet.microsoft.com/en-us/library/ff405676.aspx
[3] https://github.com/BloodHoundAD/SharpHound