1.背景介紹
本文主要是對域環境下的權限維持手法進行攻擊檢測以及清理,攻擊的方法不著重描述,檢測的方法只針對終端日誌(windows,sysmon),權限維持的手法也只涉及域環境獨有的,像普通終端也存在的啟動項計畫任務服務等不考慮在內,利用漏洞的也直接排除了直接打補丁就好了。
2.域持久化
1.黃金票據
黃金票據(Golden Ticket):它能在擁有普通域用戶權限和krbtgt hash的情況下,獲取域管理員權限。krbtgt賬戶:每個域控制器都有一個”krbtgt”的用戶賬戶,是KDC的服務賬戶,用來創建票據授予服務(TGS)加密的密鑰。
圖中我偽造了一個名為ceshi的賬戶,這裡其實任何賬戶都行域裡不存在賬戶也可以隨便偽造(微軟的MS-KILE解釋:Kerberos V5不提供對TGS請求的帳戶撤銷檢查,只要TGT有效,即使該帳戶已被刪除,TGT更新和服務票據也可以發佈。KILE提供了一個可以將利用時間限制在較短的時間內(20分內)。當TGT大於20分鐘時,KILE KDC需要在域中檢查賬戶。
)
windows4624記錄了安全IDadministrator在10.43.120.26地址登陸,並且賬戶名與安全ID(500代表了域管賬號)並不一致,安全ID其實就是SID,事件查看器會自動嘗試解析 SID 並顯示帳戶名。 如果無法解析 SID,將在事件中看到源數據,正常來說賬戶名應該與安全ID對應,這裡很明顯ceshi賬戶是偽造的,但是攻擊者只要偽造administrator名字來偽造票據就可以躲過了,但是administrator在非常用的IP地址段出現就是異常的了這裡也可以檢測一下。黃金票據攻擊在終端日誌側不是很明顯的能夠檢測,很難區分他是不是正常的,正常來說認證訪服務的流程是先4768(TGT)-4769(TGS)-4624(logon),但是黃金票據攻擊的話只會有4769-4624,因為TGT已經離線生成了。但是kerberos票據的有效期一般是4個小時(特殊組的用戶)或者是10個小時,也就是說TGT在之前申請過了就可以保留4-10個小時之間那麼這個時間觸發攻擊還是只有4769-4624,最好還是流量檢測黃金票據攻擊。
如果通過告警已經確定了攻擊者已經拿下了域控那麼肯定會導出所有賬號密碼,黃金票據是肯定是存在的,這個時候就需要修改krbtgt賬號的密碼了,需要修改兩次。(Active Directory中對定期迭代的帳戶防止密碼重用,默認密碼策略被設置為記住24個歷史密碼,而且至少也要迭代一次保存於電腦帳戶。即使密碼已更新,也會繼續使用前面的密碼散列進行身份驗證),如果不是很緊急的話最好不要連續修改2次密碼,這樣會引起域內工作不正常,最好是10個小時以後再修改第二次krbtgt的密碼。官方有專門的重置密碼的腳本https://github.com/microsoft/New-KrbtgtKeys.ps1,建議使用官方腳本進行重置,並且定期重置一次。
2.DCSYNC維持權限
DCSync是mimikatz的一個功能,能夠模擬域控制器並從域控制器導出帳戶密碼hash,如果我們在域內一台主機上獲得了域管理員權限,可以使用如下命令直接導出域內所有用戶的hash:默認情況下,只有Domain Controllers和Enterprise Domain Admins權限能夠使用DCSync但我們可以對域內普通用戶添加如下兩條ACL實現普通用戶調用DCSync導出域內所有用戶的hash
DS-Replication-GetChanges(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)和DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
可以使用powerview添加ACL:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
我這裡給win10用戶添加了dcsync的權限,這樣我在win10機器上也可以導出域內用戶hash
從windows日誌4662可以清楚的看到DS-Replication-GetChanges(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)和DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)在win10終端與域控上都產生了兩條特殊的acl被添加的信息
使用zbang工具可以檢測當前域環境是否已遭受dcsync攻擊,還有一些工具也可以檢測後面會提到
可以使用powerview腳本來清除acl
Remove-DomainObjectAcl -TargetIdentity “DC=wlaq,DC=com” -PrincipalIdentity win10 -Rights DCSync
3.白銀票據
白銀票據就是偽造服務票據,為了創建或偽造白銀票據,攻擊者需要獲得目標服務賬號的密碼hash值,並且此攻擊與域控制器沒有AS-REQ 和 AS-REP通信,也沒有TGS-REQ / TGS-REP通信。任何事件日誌都在目標服務器上
我這裡偽造了一個叫(win7-win10)的用戶去訪問win10機器的cifs服務
攻擊發生後可以在目標機器看到4624日誌這裡的異常點就是IP地址是否是常用地址以及用戶名是否是存在的域賬戶,以及用戶名是否是管理員賬戶(SID500是系統管理員的用戶帳戶。 每台計算機都有一個本地管理員帳戶,每個域都有一個域管理員帳戶)
這裡我偽造了一個(win7-yukong)的用戶去訪問域控的cifs服務
可以看到利用白銀票據同樣可以攻擊域控同時與黃金票據攻擊在終端上產生的可以檢測的日誌信息是一樣都是4624事件
檢測白銀票據比檢測黃金票據更加困難流量特徵也是存在誤報的,如果目標機器不是域控那麼也不會再域控機器產生任何日誌來幫忙我們進行檢測。從windows日誌維度來看檢測方法主要還是看4624的登陸IP地址是否異常登陸用戶是否是真實存在的用戶,用戶是否跟sid能夠匹配來檢測。雖然這一步攻擊很難檢測但是攻擊者入侵機器後肯定有後續的攻擊行為我們根本後續的攻擊行為來判斷是否失陷。
銀票攻擊一般使用的是機器賬戶的hash,默認情況下加入域的計算機機器帳戶密碼每30次自動更新一次,機器賬戶的密碼也存在域控的數據庫中,並且他跟krbtgt賬戶類似一旦攻擊者竊取了密碼,那麼我們需要修改兩次才能防止攻擊者再次利用,不然他的上一次的密碼hash同樣有效。這30天也可以改成永久不修改密碼的。只需要把下面註冊表的值改為1就行了HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\ Parameters\DisablePasswordChange。這個註冊表鍵值的修改也是需要作為檢測規則日常監控的,這是白銀票據維持更長時間持久化的方式。
如果發現某個機器賬戶已經被竊取了,可以使用powershell腳本重置2次密碼https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/reset-computermachinepassword?view=powershell-5.1。如果域控的機器賬戶hash被竊取並且被用於白銀票據,我們重置域控的機器賬戶的話需要使用netdom命令來重置密碼不然會影響域正常工作。
4.Skeleton Key
Skeleton Key與Golden Ticket後門均不需要域控重啟即能立即生效。Skeleton Key一般在64位的域控服務器上使用,支持Windows Server2003到Windows Server2012 R2(對於Server 2012 R2以上系統版本,需要mimidrv.sys文件),能夠讓所有域用戶使用同一個萬能密碼(默認是mimikatz)進行登錄,現有的所有域用戶使用原密碼仍能繼續登錄,注意並不能更改用戶權限,這裡需要注意的是重啟將失效。被稱為萬能鑰匙,是一種域控制器權限維持工具。它無須破解域用戶的任何密碼,進行此攻擊時,需要運行在64位操作系統的域控制器中,並且擁有域管理員權限。
我們在域控制器上運行mimikatz.exe,執行 misc::skeleton 命令,這會將Kerberos認證加密降級到RC4_HMAC_MD5,並以內存更新的方式將主密碼修補到 lsass.exe 進程。
看了一下產生的sysmon日誌或者windows日誌仍只能看到4624日誌無法準確的識別出該攻擊。由於該攻擊是對lsass進程進行了注入, 從Windows 8.1(和Server 2012 R2)開始,Microsoft引入了一項稱為LSA保護的功能。此功能基於PPL技術,它是一種縱深防禦的安全功能,旨在“防止非管理員非PPL進程通過打開進程之類的函數串改PPL進程的代碼和數據”。防止對進程 lsass.exe 的代碼注入,這樣一來就無法使用 mimikatz 對 lsass.exe 進行注入,相關操作也會失敗。在註冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
添加RunAsPPL=dword:00000001,重啟就可以開啟了PPL保護了。在windows2012上加載mimidrv.sys可以繞過這一保護,不過筆者在win2016上測試即使加載了mimidrv.sys仍然無法正常攻擊。下圖分別是2016跟2012域控上執行的攻擊2016失敗2012成功
筆者在win2016系統上利用mimidrv驅動無法關閉PPL保護,刪除註冊表鍵值重啟後仍無法關閉保護,具體原因後面有時間看下是什麼原因,2012系統上加載驅動後可以關閉PPL保護
無論是否可以攻擊,加載驅動這一行為已經有明顯的特徵可以供我們進行檢測。
windows日誌4697記錄了mimidrv.sys驅動的安裝
sysmon日誌13可以很明顯看到mimidrv服務以及對應的驅動程序
sysmon日誌6可以看到驅動加載了並且是未簽名的
可以使用zBang 工具檢測掃瞄網絡中潛在的特權帳戶威脅。
(https://github.com/cyberark/zBang)其中有5種檢測項
1.ACLight 掃瞄- 發現必須保護的最高特權帳戶,包括可疑的影子管理員。
2.Skeleton Key scan – 發現可能被 Skeleton Key 惡意軟件感染的域控制器。
3.SID 歷史掃瞄- 發現具有輔助 SID(SID 歷史屬性)的域帳戶中的隱藏權限。
4.RiskySPNs 掃瞄- 發現可能導致域管理員憑據被盜的 SPN 的風險配置
5.神秘掃瞄- 發現網絡中存在風險的 Kerberos 委派配置
檢測圖如下
也可以使用skeletonkeyscanner腳本掃瞄因為該攻擊主要是代碼注入lsass進程可以掃內存二進制特徵識別
因為 Skeleton Key 是被注入到 lsass.exe 進程的,所以它只存在於內存中,如果域控制器重啟,注入的 Skeleton Key 將會失效
5.DSRM ABUSE
域控上有個賬戶,名字為目錄服務還原模式賬戶又名DSRM賬戶,它的密碼是安裝DC的時候設置的,一般不會修改。但是當DSRM賬戶被修改的時候,域控的本地管理員administrator賬戶密碼的hash也會被修改,並且與DSRM賬戶的hash是一樣的。這時候即使再次修改了本地管理員administrator賬戶的明文密碼,sam文件的hash也不會更改,只會更改ntds.dit文件中的hash。綜上,意味著只要我們能夠更改DSRM的賬號密碼,我們就能夠通過DSRM的密碼的hash登陸域控主機,並且即使域控主機的本地管理員密碼改變了,DSRM的hash也不會變,我們依舊可以利用pth攻擊來登陸。該攻擊需要使用域控上的ntdsutil工具修改DSRM賬戶的密碼(保證自己知道的密碼),然後需要修改dsrm的登錄方式因為在windows server 2000以後版本的操作系統中,對DSRM使用控制台登錄域控制器進行了限制
在註冊表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior項。
DSRM的三種登錄方式:
0:默認值,只有當域控制器重啟並進入DSRM模式時,才可以使用DSRM管理員賬號。
1:只有當本地AD、DS服務停止時,才可以使用DSRM管理員賬號登錄域控制器。
2:在任何情況下,都可以使用DSRM管理員賬號登錄域控制器。
如果要使用DSRM賬號通過網絡登錄域控制器,需要將該值設置為2
經過測試可以使用DSRMhsah訪問域控
由於需要先使用域控自帶的工具ntdsutil來修改以前的DSRM賬戶的密碼,我這裡將密碼修改為與域賬號win10相同的密碼。
查看windows日誌可以看到4688事件 ntdsutil工具使用,sysmon事件1同理
同時會看到4794事件 試圖設置目錄服務還原模式密碼的日誌
在註冊表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior項,如果是使用regedit工具打開註冊表添加的話sysmon13可以檢測到regedit進程對註冊表的修改的操作,如果是使用命令行cmd,wmic,powershell等程序操作註冊表的話通常來說是可疑的可以監控起來
檢測當前註冊表HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior項如果是2說明已經遭受過攻擊。修複方案需要將註冊表鍵值改為0並且重置dsrm密碼
6.custom ssp
SSP(Security Support Provider)是Windows操作系統安全機制的提供者。簡單地說,SSP是個DLL文件,主要用來實現Windows操作系統的身份認證功能,例如NTLM、Ketberos,Negotiare. Seure Channe (Schannel )、Digest、Credental ( CredSSP )。
SSPI ( Security Support Provider Interfce.安全支持提供程序接口)是Windows操作系統在執行認證操作時使用的API接口。可以說,SSPI是SSP的API接口。
如果獲得了網絡中目標機器的System權限,可以使用該方法進行持久化操作。其主要原理是: LSA (Local Security Authority)用於身份驗證; lsass.exe 作為Windows的系統進程,用於本地安全和登錄策略;在系統啟動時,SSP 將被加載到lsass.exe進程中。但是,假如攻擊者對LSA進行了擴展,自定義了惡意的DLL文件,在系統啟動時將其加載到lsass.exe進程中,就能夠獲取lsass.exe進程中的明文密碼。這樣,即使用戶更改密碼並重新登錄,攻擊者依然可以獲取該賬號的新密碼。
主要有兩種攻擊方式:
第一種memssp:主要通過往lsass進程注入代碼來patch其加載的msv1_0.dll中的SpAcceptCredentials函數,以便恢復憑據信息。我們可以通過pchunter發現該hook,這樣攻擊不會在系統中留下二進制文件,但如果域控制器重啟,被注人的代碼就會失效。主要實現的功能是在登錄過程中獲取明文密碼並存儲在日誌文件C:\Windows\System32\mimilsa.log中。
第二種:mimikatz自帶一個Mimilib.dll該dll也實現了ssp功能,該dll有個SpLsaModeInitialize導出函數,lsass會使用該函數來初始化包含多個回調函數的一個結構體,其中回調函數SpAcceptCredentials用來接收LSA傳遞的明文憑據,以便SSP緩存,mimikatz利用AddSecurityPackage這個API來加載SSP,這樣可以在不重啟的情況下添加Mimilib。當添加成功後,我們發現每次進行身份認證時,憑據信息都會被寫入kiwissp.log文件中。實現的方法有很多種powershell腳本,手動添加等本質的操作都是
將mimilib.dll複製到域控c:\windows\system32然後在註冊表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages下添加mimilib.dll之後只要觸發了身份認證就會記錄登錄的密碼
memssp攻擊目前只能通過sysmon監控到mimilsa.log創建的日誌
加載dll實現的SSP攻擊,windows日誌4622記錄了lsass進程加載mimilib的過程,sysmon日誌11記錄mimilib落盤的過程,日誌13記錄了註冊表修改的操作,sysmon7也記錄了dll加載的過程(dll加載日誌終端日誌量太大,這裡用的kibana的圖片)
1.檢測是否已經被memssp攻擊,需要使用ARK工具查看msv1_0.dll是否已經被inlinehook,或者查看電腦裡面是否有mimilsa.log文件,如果已經被攻擊要麼取消hook,pchunter工具可以恢復,也可以重啟機器解決。
2.通過查看機器是否有kiwissp.log以及註冊表的鍵值,mimilib.dll是否存在在機器上都可以有效檢測當前機器是否已經被留下後門,清除方法就是註冊表的值刪除mimilib.dll,刪除system32目錄下的mimilib.dll
7.利用委派維持持久化
第一種利用基於資源的約束委派實現後門,攻擊者可以通過某種方式利用msDS-AllowedToActOnBehalfOfOtherIdentity屬性,以便在AD基礎設施中隱藏特權訪問權限。
如果在krbtgt賬戶的msDS-AllowedToActOnBehalfOfOtherIdentity屬性中設置某個用戶賬戶的SID,那麼任意賬戶就可以獲取KDC(Key Distribution Centre)服務的TGS,最終獲得一個有效的TGT,這也意味著攻擊者成功獲得了黃金票據。擁有黃金票據後,攻擊者可以完全控制整個AD域。
假設攻擊者已經獲得域管(Domain Admins)權限,並且想利用msDS-AllowedToActOnBehalfOfOtherIdentity屬性來實現目標環境的持久化訪問。利用該賬戶,攻擊者可以執行如下步驟:
尋找具備SPN並且密碼永不過期的用戶賬戶。在企業環境中這種情況非常常見,比如許多服務賬戶就會滿足這種條件。然後使用Mimikatz中的“DCSync”功能提取該賬戶對應的哈希。在krbtgt賬戶上設置msDS-AllowedToActOnBehalfOfOtherIdentity屬性。在本例中,我使用的具備SPN並且密碼永不過期的用戶賬戶win10,並且對其設置msDS-AllowedToActOnBehalfOfOtherIdentity屬性
利用後門重新獲取管理員權限
第二種利用約束委派實現後門攻擊步驟前2步與前面一致
1.識別出密碼不過期且帶有SPN的用戶賬戶
2.提取該賬戶的哈希值
3.在域控上配置該用戶到域控制器的cifs協議的約束性委派
利用後門重新獲取管理員權限
約束性委派後門我這裡配置的是win10用戶到域控的cifs服務可以看到5136同樣記錄了相關屬性的更改
終端上進行攻擊後在域控日誌中觀察到4769日誌請求的服務票據是0x17加密也就是RC4-HMAC加密,微軟從Windows Server 2008和Windows Vista開始,添加了Kerberos AES(128和256)加密,這意味著在任何現代Windows操作系統中大多數的Kerberos請求將使用AES進行加密。任何一個使用Kerberos RC4加密請求的票證都是異常情況。Kerberos RC4加密和Kerberos DES加密都不安全出現這些類型加密都可能是攻擊行為
利用基於資源的約束委派後門需要在krbtgt賬戶上設置msDS-AllowedToActOnBehalfOfOtherIdentity屬性可以看到windows日誌5136有記錄相關屬性變更
同樣的不安全的RC4加密
由於委派攻擊需要尋找具備SPN並且密碼永不過期的用戶賬戶,攻擊者很有可能自己偽造一個通過4738可以檢測哪些用戶被設置為密碼永不過期,4688可以檢測可疑的setspn程序來添加修改spn,sysmon事件1同理檢測進程setspn
Sean Metcalf在2020年6月17日的TrimarcWebcast的演講中,涉及到了許多安全檢查以解決Active Directory(AD)潛在安全問題域。其中腳本可用於執行AD安全檢查。名稱為Invoke-TrimarcADChecks.ps1,執行僅需要運行AD用戶權限。可以檢查當前的域委派情況還有很多檢查項,前面提到的zbang也可以 後面還有一些工具都可以檢測
清除基於資源的約束委派可以使用powershell腳本
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount $null
清除約束性委派可以直接對相應用戶清除
這種委派後門需要設置SPN,並且要求目標賬戶永遠不更新密碼。因此,我們需要檢查一下當前域內環境是否存在異常的這種賬戶,特別是AD環境中帶有敏感權限的組,這些組的每個成員都不應該帶有SPN屬性,否則攻擊者就可以利用Kerberoast以及委派後門技術發起攻擊。可以使用powershell查詢當前環境密碼不更新並且有SPN的賬戶
Get-ADUser -Filter * -Properties ServicePrincipalName, PasswordNeverExpires | ? {($.ServicePrincipalName -ne “”) -and ($.PasswordNeverExpires -eq $true)},對可疑的賬戶或者SPN進行清除。
將所有高權限的管理員帳戶配置為“帳戶敏感且無法委派”
8.SID History
每個用戶都有自己的SID,SID的作用主要是跟蹤安全主體控制用戶連接資源時的訪問權限,SID History是在域遷移過程中需要使用的一個屬性。如果A域中的域用戶遷移到B域中,那麼該用戶的SID值就會改變,進而其權限也會改變。導致遷移後的用戶無法訪問以前可以訪問的資源。SID History的作用是在域遷移過程中保持域用戶的訪問權限,如果遷移後用戶的SID值改變,系統會將原來的SID添加到遷移後用戶的SID History屬性中,使遷移後的用戶保持原有權限、能夠訪問其原來可以訪問的資源。使用mimikatz可以將SID History屬性添加到任意用戶的SID History屬性中。在滲透測試中,如果獲得了域管理員權限(或者等同於域管理員權限),就可以將SID History作為實現持久化的方法。
我這裡更改普通用戶的sid屬性後成功獲取了域管權限
windows日誌4738,5136很好的記錄了sid的屬性變更
4765,4766應該也能檢測由於筆者2012,2016的系統未產生4765,4766日誌,也可以把這兩個日誌加上
我們可以使用工具zbang檢查是否存在有sid history的賬戶,這裡發現了2個賬戶
也可以用powershell查詢 這裡查詢的是sid以500為結尾的
Get-ADUser -Filter ‘SIDHistory -like ““‘ -SearchScope Subtree -Properties sidhistory|?{$_.sidhistory -like “500”}
清除的話可以也可以使用powershell
Get-ADUser -filter ‘sidhistory -like ““‘ -searchbase “cn=chz-win7test,cn=users,dc=wlaq,dc=co
m” -searchscope subtree -properties sidhistory | foreach {Set-ADUser $ -remove @{sidhistory=$.sidhistory.value}}
Get-ADUser -filter ‘sidhistory -like ““‘ -searchbase “cn=chz,cn=users,dc=wlaq,dc=com” -searchscope subtree -properties sidhistory | foreach {Set-ADUser $ -remove @{sidhistory=$.sidhistory.value}}
也可以使用mimikatz 筆者這裡已經清理過了 sid::clear /sam:win7
9.AdminSDHolder
AdminSDHolder是一個特殊的ad容器,具備一些默認安全權限,用於受保護的ad賬戶和組的模板 active directory將採用AdminSDHolder對象的acl並定期將其應用於所有受保護的ad賬戶和組,以防止意外和無意的修改並確保對這些對象的訪問是安全的 如果能夠修改AdminSDHolder對象的acl,那麼修改的權限將自動應用於所有受保護的ad賬戶和組,能夠進一步進行域環境的權限維持 。
我這裡給win7賬戶附加了完全控制權
windows日誌4662和5136記錄了adminSDHolder對象的修改
當域對象的 ACL 被修改時,會創建一個事件 ID 為 5136 的事件,此事件包含安全描述符定義語言 (SDDL) 格式的帳戶名稱和 ACL。由於這對人類來說是不可讀的,因此 Windows 10,ConvertFrom-SDDL4中有一個 PowerShell cmdlet ,可將 SDDL 字符串轉換為更易讀的 ACL 對象。ConvertFrom-SDDLstring “要解析的sddl字符串”
可以使用zbang工具對當前環境檢測是否已被留下AdminSDHolder後門
也可以使用powerview腳本檢測當前環境
Get-DomainObjectAcl adminsdholder | ?{$_.SecurityIdentifier -match “S-1-5-21-4207138187-2036730068-1601168572-3106”} | select objectdn,ActiveDirectoryRights |sort -Unique
清除的話可以使用powerview腳本可以移除acl,
Remove-DomainObjectAcl -TargetSearchBase “LDAP://CN=AdminSDHolder,CN=System,DC=wlaq,DC=com” -PrincipalIdentity win10 -Rights All -Verbose
10.Hook PasswordChangeNotify
Hook PasswordChangeNotify 的作用是當用戶修改密碼後在系統中進行同步。
攻擊者可以利用該功能獲取用戶修改密碼時輸入的密碼明文。在修改密碼時,用戶輸入新密碼後,LSA 會調用 PasswordFileter 來檢查該密碼是否符合複雜性要求,如果密碼符合要求,LSA 會調用 PasswordChangeNotify,在系統中同步密碼。通過powershell來反射注入dll,dll主要是對rassfm.dll中的PasswordChangeNotify進行了hook,修改密碼後會在本地生成文件記錄密碼
通過pchunter可以看到hook詳情
攻擊成功文件生成
代碼詳情
從sysmon日誌來該行為產生了遠程線程注入powershell注入lsass並且注入的的是沒有模塊沒有功能的,並且還有個可疑行為lsass進程創建了可疑的文件
由於使用了Invoke-ReflectivePEInjection.ps1腳本進行dll反射注入該腳本收錄在powersploit中,可以把powersploit,empire等powershell工具裡面的一些敏感的命令功能函數進行統計監控起來,windows 4104事件記錄的powershell日誌可以記錄powershell的腳本內容。
這個也是對lsass加載的dll的導出函數進行了hook同樣取消hook或者重啟機器可以清除,可以用pchunter等ARK工具檢測lsass進程是否被掛鉤
11.DCshadow
DCShadow攻擊在具備域管理員權限條件下,攻擊者可以創建偽造的域控制器,將預先設定的對象或對象屬性複製到正在運行域服務器中,DCSync從域服務器復製出東西,DCShadow是將數據複製至域服務器。偽造的域控要想被域中其他DC認可,能夠參與域複製,需要添加2個SPN:DRS服務(GUID為E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服務,通過RPC接口來完成數據複製,下圖我對chz賬戶的description屬性修改了值為shadowshadow做測試
要想偽造為域中的一台DC服務器,需要通過RPC在域的活動目錄中註冊一個NTDS-DSA(nTDSDSA)類對象。註冊的位置為CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com,windows日誌4662,5137可以看到該對象被創建
windows日誌4742可以看到最主要的兩個SPN DRS服務(GUID為E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服務被添加
攻擊完成後會把偽域控恢復為普通域成員主機,會刪除前面添加的對象,包括nTDSDSA對象、SPN屬性等,一旦發現該攻擊就說明域管權限已經被攻擊者拿到了,這時候就需要按照本文最後總結描述的內容去盡力清除
12.SeEnableDelegationPrivilege
SeEnableDelegationPrivilege權限的作用是配置約束性委派。擁有SeEnableDelegationPrivilege權限的人可以配置任意一台主機的約束性委派,但這個權限一般情況下只有域控才有,有這個權限的用戶,還需要找一個擁有spn的賬戶並且需要對該賬戶具有完全訪問權限(也可以直接設置對整個域有完全訪問權限),也可以是自己本身,相當於擁有這個權限的賬戶並且有spn以及對自己有完全訪問權限,就可以隨時利用該賬戶設置委派。
我這裡通過直接修改gpttmpl.inf文件給終端添加權限。因為SeEnableDelegationPrivilege是在域控制器的本地安全策略中控制的用戶權限,並通過組策略進行管理。該權限配置在本地策略中的用戶權限分配,策略名為:信任計算機和用戶帳戶可以執行委派。域上一般默認有兩個GPO:Default Domain Policy和Default Domain Controllers Policy,這只是他們顯示的名稱,他們實際名稱為它們的GUID,分別為:{31B2F340-016D-11D2-945F-00C04FB984F9}和{6AC1786C-016F-11D2-945F-00C04fB984F9},我們可以通過GPO為Default Domain Controllers Policy的GptTmpl.inf文件來尋找域中哪些用戶(組)分配了SeEnableDelegationPrivilege,GptTmpl.inf文件位於\<domain>\SYSVOL\<domain>\Policies{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
擁有SeEnableDelegationPrivilege權限以及對有spn賬戶有完全訪問權限就可以隨時設置委派了
在修改用戶acl權限的過程可以看到5136日誌對安全描述符的修改,4662日誌WRITE_DAC也代表在對象安全描述符中修改 DACL 中的 (訪問控制) 權限。4672日誌顯示該用戶已有新特權
一旦設置委派通過windows日誌5136,4738可以很明顯的檢測出來
通過powershell查看當前的委派
Get-DomainUser –TrustedToAuth -domain wlaq.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto
也可以使用Invoke-TrimarcADChecks.ps1檢查是否有可疑的委派
通過查看GptTmpl.inf文件查看是否有SeEnableDelegationPrivilege權限的賬戶
\wlaq.com\SYSVOL\wlaq.com\Policies{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
清除GptTmpl.inf文件中的特殊權限,清除所有異常的委派清除委派的方法可以參照前面
13.GPO
GPO全稱Group Policy Objects,用來存儲Active Directory中的策略。
自Windows Server 2008開始,GPO開始支持計畫任務,便於管理域中的計算機和用戶。默認情況下,域用戶的組策略每90分鐘更新,隨機偏移為0-30分鐘,域控制器的組策略每5分鐘更新。可通過命令實現組策略的強制更新gpupdate。默認組策略的保存位置:\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\,所有域內主機都能訪問。
我這裡創建一個全局的GPO,作用於所有域用戶內容設置了一些計畫任務來進行模擬測試。攻擊者也可以利用其功能來推出惡意軟件、創建/修改計畫任務、降級憑據保護、向所有計算機添加新的本地帳戶被添加到本地管理員組。甚至更改現有的安全策略,以啟用明文密碼提取。
2.攻擊檢測
組策略新增的話動靜挺大的很多日誌都有記錄5136記錄很多關於組策略的信息另外5137,4662,5145,4674都可以看到新增組策略的信息
域用戶終端同步組策略後看到windows日誌4698事件 計畫任務名 任務詳情
sysmon日誌事件1可以看到新的gpo鏈接產生
可以通過adrecon腳本查看當前的組策略情況以及誰創建的組策略對可疑的組策略進行排查,對有問題的策略進行刪除,後續可以通過日誌對新增的組策略進行監控審計。
14.組策略權限委派
組策略的權限即組策略的DACL配置,即權限委派。如果組策略對象的修改或完全控制權限被分配給了某個用戶,當該用戶被攻擊者拿下之後,攻擊者利用該用戶權限可以修改並配置特定的組策略來滲透攻擊受該組策略作用的用戶或計算機。
我這裡添加了賬戶對GPO attck2對象的完全控制權限,這時我可以在win10機器上修改GPO attck2策略比如創建計畫任務達到持久化
修改GPO attck2對象的權限後從5136,4662,5145可以看到對對象acl的修改
在win10機器上通過sysmon上可以看到對gpo對象操作的日誌
在域控上的windows日誌5136,5145,4662也可以很明顯的看出win10機器對GPO對象的修改
可以使用adRecon腳本幫我們梳理出當前的組策略委派,以及當前組策略的具體內容
找到對應的策略刪除委派權限即可
15.特殊組成員變更
往安全組添加用戶來維持權限
windows日誌4728,5136記錄了成員的變更信息,事件日誌id為4735/4737/4755,分別用於修改域本地組、全局組和 通用範圍的安全組
3.防禦與清除
ZBANG工具可以幫你梳理出當前特殊組成員
也可以使用Invoke-TrimarcADChecks腳本檢查
找出用戶清除即可
16.ACL攻防
在windows的安全體系中ACL是至關重要的一環,常常用在域滲透的時候尋找攻擊路徑或者用於充當後門。包括前面提到的很多後門都是通過修改acl來充當後門,還有沒提到的exchange,laps等都是acl導致的,所以我們必須要對acl的修改做嚴格監控,windows5136日誌清楚記錄了相關acl修改。
攻擊者常利用的acl:
GenericAll:授予對目標對象的完全控制權,包括WriteDacl 和 WriteOwner 特權
GenericWrite:可以修改所有參數,因此包括對某些屬性的WriteProperty,比如member
WriteOwner:修改所有者
WriteDACL:將新ACE寫入目標對象的DACL的功能。例如,攻擊者可以向目標對象DACL寫入新的ACE,從而使攻擊者可以“完全控制”目標對象。
AllExtendedRights AddMembers:將任意用戶、組或計算機添加到目標組。 ForceChangePassword:強制更改密碼,在不知道當前密碼的情況下更改目標用戶的密碼。
AddMembers:可以將任意用戶,組或計算機添加到目標組。
如果一個用戶對一個組有AddMembers權限,那麼這個用戶可以講任何用戶加入這個組,從而具備這個組的權限。
servicePrincipalName:如果對一個對像有寫入spn的權限,那麼就可以對這個對象進行kerberosting了,如果密碼強度不強的話,有機會獲取到密碼
AllExtendedRights:所有擴展權限。比如,User-Force-Change-Password權限。
Full Control:這個權限就具備以上所有的權限,隨便挑一個特殊權限的攻擊方式進行攻擊就行了。
bloodhound工具可以對當前的攻擊路徑dacl情況顯示出來協助我們分析
ADRecon腳本可以把當前的dacl的全部情況統計出來幫助我們進行分析
對域內的ACL梳理清除刪除沒必要的acl,以及開起日誌監控有新增的acl進行排查
3.總結
真實攻擊場景如果攻擊者拿下域控了那麼會導出所有密碼hash包括krbtgt,機器賬戶hash,那麼他可以選擇利用黃金票據維持權限,利用白銀票據維持權限,包括其他後門維持方法攻擊者都有可能挨著做一遍,所以任何規則異常幫忙我們判斷出域控已經失陷了的話,那麼我們首先就應該先封掉C2,定位失陷原因,刪除載荷,檢查當前機器的所有後門情況並且進行清除然後加固開啟日誌檢測需要
重置所有特權賬戶名以及密碼
重置域控制器的機器帳戶密碼,以防止銀票濫用
重置KRBTGT賬戶,防止黃金票濫用
重置所有機器帳戶密碼 域名防止銀票濫用。域環境相較於普通終端多了很多權限維持的手法,特別是ACL的利用,本文只對域環境權限維持攻擊觸發的告警進行了梳理。AD的加固其實還有很多方面需要審查用戶賬戶,密碼策略,域信任關係,重複的SPN等等。有一些好用的AD檢查工具推薦大家使用。
PINGCASTLE https://www.pingcastle.com/
ADRecon https://github.com/sense-of-security/ADRecon
Invoke-ACLpwn https://github.com/fox-it/Invoke-ACLPwn
Invoke-TrimarcADChecks:https://www.hub.trimarcsecurity.com/post/securing-active-directory-performing-an-active-directory-security-review
zbang:https://github.com/cyberark/zBang
watchad:https://github.com/0Kee-Team/WatchAD
4.Black Hat USA 2021上新的域攻擊手法
濫用 Active Directory 證書服務, AD CS 通過證書竊取和主動惡意註冊以實現用戶和機器持久化的濫用,可能導致域升級的常見證書模板錯誤配置,竊取證書頒發機構的私鑰以偽造新的用戶/機器“黃金”證書。
https://www.exandroid.dev/2021/06/23/ad-cs-relay-attack-practical-guide/
https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
https://posts.specterops.io/certified-pre-owned-d95910965cd2