如何使用ADSI介面和反射型DLL枚舉活動目錄

  • 2019 年 12 月 11 日
  • 筆記

寫在前面的話

在這篇文章中,我們將告訴大家如何使用活動目錄服務介面(ADSI)並結合C/C++來實現Cobalt Strike的活動目錄枚舉。現在很多環境下都會對PowerShell和.NET程式進行非常嚴格的監視,而本文所介紹的技術也許可以幫你們躲避這些機制的檢測。

想像一下,你現在正在使用TIBER-EU、CBEST其他紅隊安全評估框架,最終成功滲透進了目標網路,並且使用Payload和C2信道成功繞過了目標網路的安全防護措施,那麼接下來該怎麼辦呢?比如說,怎麼確保我們的活動目錄枚舉工具不觸發安全警報呢?

別著急,我們一起往下看!

C/C++

如果使用傳統的PowerShell/C#的話,就可能需要將寫好的腳本放置到目標設備的磁碟中,而這樣就有可能被安全產品檢測到。這裡,我們可以選擇使用assembly.load等方法直接將工具載入到記憶體中,而C/C++正好可以幫我們實現類似的功能。這裡,我們可以使用反射方法來將已編譯好的C/C++惡意程式注入到目標設備的記憶體之中,下面給出的是目前幾種比較熱門的方法:

1、DonutPE載入器 2、反射型DLL注入 3、Shellcode反射型DLL注入 (點擊底部閱讀原文查看)

活動目錄服務介面(ADSI)

好了,我們回到正題上,也就是如何實現活動目錄的枚舉。我們希望在枚舉AD資訊的時候不會觸發AMSI或者是不留下明顯的事件日誌(可以通過偽造事件日誌的內容來實現),要與活動目錄進行對接並枚舉其對象屬性,我們需要使用到活動目錄服務介面(ADSI)。

活動目錄介面(ADSI)介紹

ADSI,即活動目錄服務介面(ActiveDirectoryServicesInterface),是Microsoft新推出的一項技術,它統一了許多底層服務的編程介面,程式設計師可以使用一致的對象技術來訪問這些底層服務。ADSI把這些服務的公共部分提取出來,同時隔離出相異的部分,程式設計師可以用統一的介面訪問底層服務的公共部分,並延伸到底層服務的專有部分。ADSI提供了一組COM介面,可以用來訪問來自不同網路提供商的目錄服務功能,獨立軟體供應商和開發人員可以使用ADSI對其產品和應用程式進行目錄啟用。

非常好,那麼我們的重點就要放在如何通過C/C++來構建自己的活動目錄枚舉工具了。在這裡,我們其實不需要自己去重複造輪子了,因為微軟的GitHub庫已經給我們提供了一份非常優秀的參考樣例-QueryUsers,我們可以使用這個樣例來開發我們自己的客戶端了。

QueryUsers

QueryUsers:【點擊底部閱讀原文查看】

QueryUsers可以在活動目錄域這個實現分區查詢,並且可以指定過濾器匹配的用戶對象,該工具使用了IDirectorySearch來實現搜索功能的執行。

在QueryUsers的幫助下,我們可以搜索特定用戶或所有用戶,並返回所有標識用戶的所有屬性。QueryUsers的工作機制如下:

1、ADSI是基於COM構建的,因此我們需要使用CoInitialize()函數在程式內初始化COM; 2、我們需要使用ADsOpenObject()對LDAProotDSE進行綁定,因此我們可以收集有關活動目錄的資訊,並使用返回的IADsCOM對象來獲取defaultNamingContext資訊; 3、獲取到defaultNamingContext之後,我們可以再次使用ADsOpenObject()來對Domain容器進行綁定,它將返回IDirectorySearchCOM介面,而該介面可以用來對活動目錄進行查詢和搜索; 4、在調用FindUsers()函數時,它將基於函數參數和以下字元串構造一個LDAP過濾器-「(&(objectClass=user)(objectCategory=person)%s)」。如果我們為改程式提供以下搜索過濾器參數「(sAMAccountName=Administrator)」,那麼我們的LDAP過濾器實則為(&(objectClass=user)(objectCategory=person) (sAMAccountName=Administrator))」; 5、使用ADS_SEARCHPREF_INFO結構體作為搜索參數的首選項; 6、執行IDirectorySearch對象中的ExecuteSearch()方法,該方法將根據我們的 LDAP 過濾器返回所有結果; 7、最後,使用GetFirstRow()、GetNextColumnName()、GetColumn()和 GetNextRow()方法遍歷結果,並輸出特定的用戶屬性;

集成到常用的C2框架&PoC

Cobalt Strike具有用於程式碼/DLL注入的多種功能選項,並且嵌入有功能非常強大的腳本語言支援,因此開發人員可以根據自己的需要來擴展Cobalt Strike的功能。

為了驗證該技術的可行性,我們開發了一種基於ADSI和反射型DLL的活動目錄枚舉工具,該工具可以直接在Cobalt Strike中使用。我們的PoC工具名叫Recon-AD,該工具目前由其中反射型DLL以及對應的AggressorScript腳本構成。

其主要功能如下:

1、Recon-AD-Domain: 查詢域資訊(包括域名、GUID、站點名稱、密碼策略、域控列表等); 2、Recon-AD-Users: 查詢用戶對象和相應的屬性; 3、Recon-AD-Groups: 查詢組對象和相應的屬性; 4、Recon-AD-Computers: 查詢電腦對象和相應的屬性; 5、Recon-AD-SPNs: 查詢配置了服務主體名稱(SPN)的用戶對象並顯示有用的屬性; 6、Recon-AD-AllLocalGroups: 在電腦是上查詢所有本地組和組成員; 7、Recon-AD-LocalGroups: 在電腦上查詢特定的本地組和組成員(默認 Administrators 組);

廣大研究人員可以自行從本項目的GitHub庫中下載Recon-AD,並在Cobalt Strike中載入相應的腳本來完成自己的任務。

工具運行截圖

使用Recon-AD-Domain顯示本地機器的域資訊:

使用Recon-AD-Groups Domain Admins命令枚舉域管理員組的屬性資訊:

使用Recon-AD-User username命令輸出指定用戶的屬性資訊:

總結

在這篇文章中,我們較少了關於活動目錄服務介面(ADSI)的相關內容,並描述了如何將其與C/C++以及Cobalt Strike結合來實現活動目錄的枚舉。

* 參考來源:outflank,FB小編Alpha_h4ck編譯,轉載請註明來自FreeBuf.COM