常見域后門技術總結與分析利用
0x00 前言
當獲取到域控的權限后,為了防止對域控權限的丟失,hacker 也會使用一些技術來維持已獲取到的域權限。因此,本文對常見的域后門技術進行了總結并對其利用方式進行了詳細的說明,希望可以對大家的學習提供一些幫助。
0x01 創(chuàng)建 Skeleton Key 域后門
Skeleton Key 即 “萬能鑰匙”。通過在域控上安裝 Skeleton Key,所有域用戶賬戶都可以使用一個相同的密碼進行認證,同時原有密碼仍然有效。
該技術通過注入 lsass.exe 進程實現(xiàn),并且創(chuàng)建的 Skeleton Key 只是保存在內存中,域控只要重啟,Skeleton Key 就會失效。
注意:利用該技術需要擁有域管理員的權限
1. 常規(guī)利用
將 Mimikatz 上傳到域控制器,執(zhí)行以下命令:
執(zhí)行后,將成功創(chuàng)建 Skeleton Key 域后門,為所有的域賬戶設置一個相同的密碼 “mimikatz”,從而使其他機器可以成功登錄域控。
2. 緩解措施
微軟在 2014 年 3 月添加了 LSA(Local Security Authority,本地安全機構)保護策略,用來防止對 lsass.exe 進程的內存讀取和代碼注入。通過執(zhí)行以下命令,可以開啟或關閉 LSA 保護。
開啟LSA 保護策略并重啟系統(tǒng)后,Mimikatz 的相關操作都會失敗。此時即使已經獲取了 Debug 權限也無法讀取用戶哈希值,更無法安裝 Skeleton Key。
不過,Mimikatz 可以繞過 LSA 保護。該功能需要 Minikatz 項目中的 mimidrv.sys 驅動文件,相應的 Skeleton Key 安裝命令也變?yōu)榱巳缦拢?/p>
0x02 創(chuàng)建 DSRM 域后門
DSRM(Directory Services Restore Mode,目錄服務還原模式)是域控的安全模式啟動選項,用于使服務器脫機,以進行緊急維護。在初期安裝 Windows 域服務時,安裝向導會提示用戶設置 DSRM 的管理員密碼。有了該密碼后,網絡管理員可以在后期域控發(fā)生問題時修復、還原或重建活動目錄數(shù)據庫。
在域控上,DSRM 賬戶實際上就是本地管理員賬戶(Administrator),并且該賬戶的密碼在創(chuàng)建后幾乎很少使用。通過在域控上運行 NTDSUtil,可以為 DSRM 賬戶修改密碼,相關命令如下:
hacker 可以通過修改 DSRM 賬戶的密碼,以維持對域控的權限。
該技術適用于 Windows Server 2008 及以后版本的服務器,并需要擁有域管理員的權限
利用過程:
① 執(zhí)行以下命令,通過 Mimikatz 讀取域控的 SAM 文件,獲取 DSRM 賬戶的哈希值。
② 修改 DSRM 賬戶的登錄模式,以允許該賬戶遠程登錄??梢酝ㄟ^編輯注冊表的DsrmAdminLogonBehavior 鍵值來實現(xiàn),可選用的登錄模式有以下3種:
0:默認值,只有當域控制器重啟并進入 DSRM 模式時,才可以使用 DSRM 管理員賬號。
1:只有當本地 AD DS 服務停止時,才可以使用 DSRM 管理員賬號登錄域控制器。
2:在任何情況下,都可以使用 DSRM 管理員賬號登錄域控制器。
執(zhí)行以下命令,將 DSRM 的登錄模式改為 “2”,允許 DSRM 賬戶在任何情況下都可以登錄域控。
③ 這時,hacker 就可以通過 DSRM 賬戶對域控制器進行控制了。
執(zhí)行以下命令,使用 DSRM 賬戶對域控執(zhí)行哈希傳遞攻擊并成功獲取域控權限:
0x03 SID History 的利用
1. SID & SID History
在 Windows 系統(tǒng)中,SID(Security Identifiers)是指安全標識符,是用戶、用戶組或其他安全主體的唯一、不可變標識符。
Windows 根據 ACL(訪問控制列表)授予或拒絕對資源的訪問和特權,ACL 使用 SID 來唯一標識用戶及其組成員身份。當用戶登錄到計算機時,會生成一個訪問令牌,其中包含用戶和組 SID 和用戶權限級別。當用戶請求訪問資源時,將根據 ACL 檢查訪問令牌以允許或拒絕對特定對象的特定操作。
如果將賬戶刪除,然后使用相同的名字創(chuàng)建另一個賬戶,那么新賬戶不會具有前一個賬戶的特權或訪問權限,這是因為兩個賬戶的 SID 不同。
SID History 是一個支持域遷移方案的屬性,使得一個賬戶的訪問權限可以有效地克隆到另一個賬戶,這在域遷移過程中非常有用。例如,當 Domain A 中的用戶遷移到 Domain B 時,會在 Domain B 中新創(chuàng)建一個賬號。此時,將 Domain A 用戶的 SID 添加到 Domain B 的用戶賬戶的 SID History 屬性中。這就確保了 Domain B 用戶仍然擁有訪問 Domain A 中資源的權限。
2. 利用方法
在實戰(zhàn)中,hacker 可以將域管理員用戶的 SID 添加到其他域用戶的 SID History 屬性中,以此建立一個隱蔽的域后門。
利用該技術需要擁有域管理員權限
下面在域控制器(Win 2012)上進行實操:
在 Windows Server 2019 上進行測試時可能會報錯
① 創(chuàng)建域用戶 Alice
② 向域控制器上傳 Mimikatz,并執(zhí)行以下命令,將域管理員 Administrator 的 SID 添加到域用戶 Alice 的 SID History 屬性中:
③ 通過 Powershell 查看 Alice 用戶的屬性,可以發(fā)現(xiàn)其 SID History 屬性值已經與 Administrator 用戶的 SID 相同,這說明 Alice 用戶將繼承 Administrator 用戶的所有權限。
④ 通過 Alice 用戶連接域控,執(zhí)行 “whoami /priv” 命令,可以看到該用戶擁有域管理員的所有特權。
0x04 利用 AdminSDHolder 打造域后門
1. AdminSDHolder
AdminSDHolder 是一個特殊的 Active Directory 容器對象,位于 Domain NC 的 System 容器下。
AdminSDHolder 通常作為系統(tǒng)中某些受保護對象的安全模板,以防止這些對象遭受惡意修改或濫用。
受保護對象通常包括系統(tǒng)的特權用戶和重要的組,如 Administrator、Domain Admins、Enterprise Admins 以及 Schema Admins 等。
在活動目錄中,屬性 adminCount 用來標記特權用戶和組。對于特權用戶和組來說,該屬性值被設為 1。
通過 ADFind 查詢 adminCount 屬性設置為 1 的對象,可以找到所有受 AdminSDHolder 保護的特權用戶和組。
在默認情況下,系統(tǒng)將定期(每60分鐘)檢查受保護對象的安全描述符,將受保護對象的 ACL 與 AdminSDHolder 容器的 ACL 進行比較,如果二者不一致,系統(tǒng)就會將受保護對象的 ACL 強制修改為 AdminSDHolder 容器的 ACL。該工作通過 SDProp 進程來完成,該進程以 60 分鐘為一個工作周期。
2. 利用方法
在實戰(zhàn)中,hacker 可以篡改 AdminSDHolder 容器的 ACL 配置。當系統(tǒng)調用 SDProp 進程執(zhí)行相關工作時,被篡改的 ACL 配置將同步到受保護的 ACL 中,以此建立一個隱蔽的域后門。
利用該技術需要擁有域管理員權限
執(zhí)行以下命令,通過 PowerView 向 AdminSDHolder 容器對象添加一個 ACL,使普通域用戶 Alice 擁有對 AdminSDHolder 的 “完全控制” 權限。
執(zhí)行后,Alice 用戶成功擁有 AdminSDHolder 容器對象的完全控制權限
等待 60 分鐘后,Alice 用戶將獲得對系統(tǒng)中的特權用戶和組完全控制權限。
此時,Alice 用戶可成功向 Domain Admins 等關鍵用戶組內添加成員。
如果清除 Alice 用戶對 AdminSDHolder 的完全控制權限,可以執(zhí)行以下命令:
3. 改變 SDProp 的工作周期
方法1:修改注冊表
hacker 也可以通過注冊表手動修改 SDProp 進程的工作周期,以縮短等待的時長(最小值1分鐘,最大值2小時)。該注冊表需要慎重修改, 當修改的頻率變高時,CPU處理LSASS的開銷也就越大,這很容易導致系統(tǒng)變得卡頓,該注冊表鍵默認是不存在的。
方法2:強制 SDProp 執(zhí)行
① 運行 Ldp.exe(C:\Windows\System32\Ldp.exe)
② 點擊連接 -> 連接,輸入當前機器的機器名或IP,端口默認為 389
③ 點擊連接 -> 綁定,選擇綁定為當前登錄的用戶
④ 在修改窗口這里針對不同版本的域控制器有不同的情況:
當域控為Windows Server 2008時,點擊瀏覽 -> 修改,在屬性選項卡中輸入 FixUpInheritance ,在值字段輸入 yes。操作選擇添加,然后點擊輸入,最后運行即可。
當域控為Windows Server 2008 R2或Windows Server 2012及以上時,點擊瀏覽 -> 修改,在屬性選項卡中輸入 RunProtectAdminGroupsTask ,在值字段輸入 1。操作選擇添加,然后點擊輸入,最后運行即可。
0x05 HOOK PasswordChangeNotify
PasswordChangeNotify 在微軟官方文檔中的名稱為 PsamPasswordNotificationRoutine,是一個 Windows API。當用戶重置密碼時,Windows 會先檢查新密碼是否符合復雜性要求,如果密碼符合要求,LSA 會調用 PasswordChangeNotify 函數(shù)在系統(tǒng)中同步密碼。該函數(shù)的語法如下:
當調用 PasswordChangeNotify 時,用戶名和密碼將以明文的形式傳入。hacker 可以通過 Hook 技術,劫持 PasswordChangeNotify 函數(shù)的執(zhí)行流程,從而獲取傳入的明文密碼。
下面進行演示:
① 生成 DLL 文件,需在項目屬性中將MFC的使用設為 ”在靜態(tài)庫中使用MFC“
② 將編譯好的 HookPasswordChange.dll 和 Invoke-ReflectivePEInjection.ps1 上傳到域控制器,并通過 Invoke-ReflectivePEInjection.ps1 將 HookPasswordChange.dll 注入 lsass.exe 進程。
建議在 Windows Server 2012 上進行測試,Window Server 2019 親測運行腳本會報錯
③ 當管理員修改密碼時,用戶的新密碼將記錄在 c:\windows\temp 目錄的 password.txt 文件中。
此外,password.txt 文件的保存路徑可以自定義,需要在 HookPasswordChange.cpp 文件中修改
我們還可以在源碼的基礎上通過 WinINet API 添加一個簡單的 HTTP 請求功能,將獲取到的用戶密碼傳回遠程服務器,相關代碼如下:
重新編譯生成 HookPasswordChange.dll 并注入 lsass.exe 進程,當管理員修改密碼時,將通過 HTTP POST 方法將用戶密碼外帶到遠程服務器。
加入HTTP 請求功能后重新編譯時,如果出現(xiàn)報錯:無法解析的外部符合 _imp_XXXXX,可以參考:??解決方案??
0x06 總結
本文僅僅只對常見的域后門技術進行了總結,希望可以對大家的學習有幫助。如有不對,歡迎指正。
本文作者:LHzzzzz, 轉載請注明來自????