DCShadow攻擊技術分析
2018年1月24日,Benjamin Delpy(神器Mimikatz的作者)和Vincent Le Toux在BlueHat IL會議期間公布了針對域活動目錄的一種新型攻擊技術「DCShadow」。利用該技術,在具備域管理員許可權條件下,攻擊者可以創建偽造的域控制器,將預先設定的對象或對象屬性複製到正在運行域伺服器中,DCSync從域伺服器複製出東西,DCShadow是將數據複製至域伺服器。Luc Delsalle對這種技術進行了驗證和詳細的描述,並就紅藍對抗中藍隊對抗此種攻擊技術的缺陷和補救方法。
本文首先分析DCShadow的攻擊原理,其次實驗重現攻擊過程和中間非常痛苦的插曲,最後探討了該技術在網路攻擊中的應用場景。
0x01 實驗環境
域伺服器Windows 2016 R2 EN,主機名Win2016-DC01,運行域http://adsec.com;域內主機Windows 7 x86 CN,主機名Win7X86cn04。
0x02 DCShadow攻擊原理
根據Luc Delsalle的描述,DCShadow的攻擊過程包括3主要個步驟:
- 在目標域的AD活動目錄註冊一個偽造的DC中;
- 使偽造的DC被其他的DC認可,能夠參與域複製;
- 強制觸發域複製,將指定的新對象或修改後的對象屬性同步複製到其他DC中;
下面將分3個小節逐個介紹。
0x03 註冊偽造的DC
一台機器要想註冊成為域中的一台DC伺服器,需要在域的活動目錄中註冊一個NTDS-DSA(nTDSDSA)類對象。註冊的位置為CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com,如圖所示。
圖中http://adsec.com域有3台域伺服器,分別是LABDC01、RESDC01及WIN2016-DC01,標紅的正是我們實驗環境的域伺服器。我們測試的機器為Win7X86cn04,測試成功的則會生成一個新的NTDS-DSA(nTDSDSA)類對象,如下圖所示。這裡需要說明的是,工具本身測試成功後,不會留下這些,這裡為了表述更清晰,對工具源碼稍作了改動,將註冊的結果保留了下來,以便大家分析。
需要注意的是,不能通過LDAP協議創建nTDSDSA對象,而是RPC方法。
查看CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=adsec,DC=com的安全描述符,可知必須有域管理員許可權才具備寫許可權,如下圖。所以發動DCShadow攻擊首先必須具備域管理員許可權,但是我們可以通實驗,做點手腳,就會好辦一些,例如將完全許可權賦予普通用戶,則普通用戶也可以修改,如下面的第二張圖。這是後門的另外一種方式,將來會對這類後門進行系統的介紹。
DCShadow工具通過如下方式進行註冊,圖中綠色部分進行了稍微的修改。
0x04 註冊的DC被其他DC認可,能夠參與域複製
一個剛註冊的DC要想被域中其他DC認可,能夠參與域複製,需要滿足3個條件:
- 這台偽造DC具備認證憑證,能認證到域,即有域內賬號,可以使用機器賬號,實驗環境中為WIN7X86CN04$;
- 偽造DC能認證其他DC來訪問的賬號,如果我們給WIN7X86CN04$添加SPN,則可以實現這一點。關鍵是需要添加哪些SPN,DCShadow的一個大貢獻是找到了SPN的最小合集,只需要2個即可:DRS服務(GUID為E3514235–4B06–11D1-AB04–00C04FC2DCD2)和GS(Global Catalog)服務,如下圖。
- 運行DRS服務,最少需要實現IDL_DRSBind、IDL_DRSUnbind、IDL_DRSGetNCChanges、IDL_DRSUpdateRefs這4個RPC介面,以便其他DC能夠通過RPC獲取需要複製的數據。Mimikatz工具的最新版已經集成了這4個介面。
0x05 強制立即發起域複製
通常負責域複製和同步的進程是KCC進程,默認時間是15分鐘校驗一次,如果需要複製則發起;也可以使用Windows域伺服器自帶的系統工具repadmin ,該工具會調用DRSReplicaAdd 函數介面強制立即發起域複製,DCShadow正是通過調用DRSReplicaAdd 函數強制立即發起域複製,如下圖。
0x06 實驗重現
上圖是實驗結果,標紅位置表示一個對象被成功複製。DCShadow攻擊需要2個進程,一個進程必須是系統許可權,用來運行RPC服務,以便其他DC能夠訪問RPC獲取需要複製的數據,所以在本地管理員許可權下,先運行命令「!+」以載入Mimikatz的驅動,接著運行命令「!processtoken」提升至系統許可權,然後運行命令「lsadump::dcshadow /object:dcshadowTestUser /attribute:displayname /value:」Shadow Evil User」」,用來修改域內賬號dcshadowTestUser的顯示名稱。
接著啟動第二個進程,為域管理員許可權,或者第0x03節中提到的具備Servers對象完全控制權(或寫許可權)的用戶許可權,執行命令「sadump::dcshadow /push」,進行真正的註冊和數據複製。
0x07 折磨人的插曲
實驗環境中忘了一個小細節,導致實驗總是不成功,而工具始終沒有報錯,所以不得不分析dcshadow的源碼,花了3個晚上逐行分析,才最終找到原因—–測試所在的Win7x86cn04這台主機的防火牆服務是啟動的,所以域伺服器不能通過RPC訪問獲取需要複製的數據。
經過分析,發現mimikatz工具沒有報錯的原因是代碼里一個宏定義有瑕疵,宏定義如圖所示。
上面的宏定義中NTSTATUS的定義是有符號的LONG類型,所以沒有問題。但是實際上Mimikatz定義和調用的很多函數返回的Status是無符號類型的,成功表示0,失敗返回大於0的值,這時候使用NT_SUCCESS(Status)作為結果判斷時,始終是正確的,這才是導致Mimikatz一直沒有報錯的原因,已經將這個小瑕疵郵件給了Benjamin Delpy本人,暫時未回復。
對工具的源碼進行了稍微的改動,如下圖,在調用IDL_DRSReplicaAdd強制發起複制後的NT_SUCCESS(Status)判斷之後,加了一個輸出,得到了下面第二張圖的輸出結果。
上面這張圖中的0x6ba錯誤為「RPC 伺服器不可用」,0x2104錯誤為「命名上下文要被刪除或沒有從指定的伺服器上複製」,這個報錯立馬聯想到是否開了防火牆,果不其然是開的。關掉後,重新測試,一馬平川,積壓三天的鬱悶之氣一掃而光。
0x08 結果分析
DCSHadow是在微軟BlueHat上發布的,用於紅藍對抗,目的主要在於躲避SIEM的日誌監控分析。在我們的測試環境中域伺服器上產生了大量的日誌,如下面幾張連續的圖。
從上面的日誌截圖可以看出,DCShadow的動作都在監控中,之所以會是這個效果,因為此前做其他的防禦監測實驗時,把日誌策略中的一個開關打開「Local Computer Policy -> Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Account Management -> Audit Security Group Management」,以及對象變更的日誌策略也加入審計範疇。Luc Delsalle的文章中也提到了這一點。默認情況下,這些策略都是不打開的,所以從這個角度來說,DCShadow的紅藍對抗效果還是比較明顯的。
0x09 DCShadow的作用
從DCShadow目前展示的功能來看,主要只能用於紅藍對抗的隱蔽後門。但是DCShadow第一次澄清和實現了偽造一個DC的最小需求合集,這個貢獻非常大。以前很多攻擊方法都卡在不能偽造域伺服器,例如MS15-011和MS15-014等,有了DCShadow的基礎,相信將來會有很多新的攻擊方法。
參考文獻:
[1] https://www.dropbox.com/s/baypdb6glmvp0j9/Buehat%20IL%20v2.3.pdf
[2] https://blog.alsid.eu/dcshadow-explained-4510f52fc19d
譯文鏈接:https://www.anquanke.com/post/id/96704
推薦閱讀:
TAG:網路攻擊 |