serviceFu
在近期所進行的安全審計活動中,我們的團隊設計出了一種新的安全工具,并希望能跟整個社區一起分享。
當時在進行安全審計開始前,我們首先需要嘗試獲取到客戶網絡系統的初始訪問權。這位特殊的客戶之前曾投入過大量的人力和物力資源來提升企業網絡系統的安全性。在客戶域名系統中的大多數客戶都需要進行智能卡認證,并且禁用了憑證緩存(Mimikatz的sekurlsa::logonPasswords無效),而且還設置了基于主機的日志記錄系統(Powershell, Sysmon, HIPS)。
在進行了仔細分析之后,我們把注意力放在了一臺更有“價值”的服務器上。這臺服務器之所以“有價值”,是因為擁有高等級權限的網絡管理員需要使用這臺服務器來執行管理員任務。我們成功在這臺服務器上發現了一個0 day漏洞,并且通過手動編碼的形式設計出了漏洞利用代碼,最終成功拿到了SYSTEM權限。
有了SYSTEM權限之后,我們就能夠偽裝成一些經常會登錄目標系統的用戶了,比如說通過注入用戶進程或直接竊取他們的用戶令牌。雖然這種技術可以有效實現提權和橫向滲透,但是它要求我們能尋找到活動會話才能實現身份偽裝。因此,這個過程可能需要我們等待用戶登錄才能實現提權,當他們注銷賬號之后,我們就無法使用他們的賬號了。所以,這種技術只能用來尋找那些使用賬號憑證登錄的用戶信息,而無法適用于采用智能卡認證的情況。
不過幸運的是,客戶的活動目錄在安裝和配置時使用的是多個高等級權限的服務賬號,而且涉及到域中的多臺服務器。這些域服務賬號使用了賬號憑證來實現登錄認證。Windows會在注冊表HKLM:\Security\Policy\Secrets中為每一個服務的域服務賬號服務賬號存儲一個加密后的憑證在lsadump::secrets module(Mimikatz)的幫助下,我們能夠直接解密這些憑證。
接下來,我們的主要問題就變成了如何找出目標域服務賬號下運行了那些服務組件:我們是對每一個系統手動運行mimikatz,還是在收集到系統信息和注冊表鍵內容后在線下執行分析?雖然這并不是一個技術難點,但是我們很懶,能自動化完成的我們肯定不會手動進行。下面的截圖顯示的是mimikatz導出的每一個服務賬號的憑證信息:
假設我們的工具運行在一臺登錄了管理員權限賬號的目標主機上,我們將能夠利用Win32 API來遠程查詢目標主機中運行的服務。我們可以通過解析服務啟動名稱來判斷當前運行環境是否為系統級賬號。如果確定了運行環境,我們就可以使用遠程注冊表API來存儲系統信息和注冊表信息了。接下來,在拿到相關注冊表鍵之后,我們可以使用mimikatz來對其進行解析和解密,并獲取到服務賬號憑證。需要注意的是,我們之所以采用C++來開發這款工具,主要也是考慮到之后可以輕松將其以模塊的形式整合進原生的C2框架之中。
不過我們得承認,這款工具只適用于這種特定情況,在其他特殊情況下該工具可能無法完成你所要求的任務。但不管怎樣,它都能夠幫助你遠程掃描出整個目標域中域服務憑證的明文文本信息,這一點還是非常有用的。如果你對本項目感興趣的話,歡迎到我們的GitHub上留言或提交代碼。
|