作者:WBG
原文鏈接:https://mp.weixin.qq.com/s/7onBlm6F674y2RWYdAp_aw

關于 Core impact (就是收購 CS 的那家公司的產品)稍微介紹一下吧,Core impact 簡單來說就是一款商業滲透測試工具,它不同于普通的RAT,它更像 MSF,自身帶有很多 exp 模塊,又和 ExploitPack 有些相似,不過 ExploitPack 自身 RAT 屬性不強可以說是單純的 EXP 集成平臺包括漏洞利用,漏洞開發,調試一體

使用

安裝就不說了

打開 Core impact 界面如下

你要先創建一個工作空間(一個滲透項目一個工作空間),需要輸入項目名稱和設置密碼

創建完成后會自動打開工作空間界面如下

可以雙擊展開 Agents 目錄在其中找到 "Package and Register Agent" 模塊雙擊執行設置如下,生成一個 x86 http 分階段 exe payload

隨后在目標機上執行,成功上線

右鍵目標可以執行各種操作

如果需要執行左邊的模塊可以直接拖到目標上

凡是執行過的模塊都會按照時間順序排列在右上方,而右下方則是記錄相應模塊的執行日志,比如我這里選擇啟動 shell 然后執行 whoami /all 所有輸出都將被記錄在模塊日志中,可以隨時可以查看

RPT 這里則是各種向導,輔助你進行信息收集和滲透

比如我們選擇 Information Gathering Wizard 然后拖到到目標上執行會讓你填寫或選擇一些參數然后自動開始信息探測

執行完成后可以在右邊查看到各種結果

使用介紹這方面就先介紹這么多吧

Payload 分析

我們分析的 payload 以 x86 http 為例,使用的工具 C32ASM,Cuttter,unicorn,wget,PyCharm

選擇 Package and Register Agent 模塊生成 payload 具體設置如圖

點擊 ok 后會啟動監聽并生成 payload 這里我們選擇生成的是一個 x86 http 分階段 payload

很明顯可以看出來 Core impact 生成的 payload 是經過編碼器加密過的通過自解密執行,這里為了方便我用 unicorn 寫了一個腳本來模擬執行前面的解碼器最后把解密后的 shellcode dump 下來

from hexdump import hexdump
from unicorn import *
from unicorn.x86_const import *
X86_CODE32 = bytes.fromhex("E9 62 00 00 00 5B B9 5C 06 00 00 B8 26 BE A5 0E 8B 13 4C 4C 4C 4C 89 0C 24 4C 4C 4C 4C 89 3C 24 4C 4C 4C 4C 89 1C 24 89 D1 89 C7 89 CB 21 F9 F7 D1 09 FB 21 D9 89 CA 8B 1C 24 44 44 44 44 8B 3C 24 44 44 44 44 8B 0C 24 44 44 44 44 89 13 43 43 43 43 49 49 49 49 81 F9 00 00 00 00 0F 85 AE FF FF FF E9 05 00 00 00 E8 99 FF FF FF CE 8C A5 0E 26 D5 C0 7C 48 DB C9 3D 14 90 C1 62 4A 9E E2 6B 52 EE D7 61 45 FF C1 6A 54 DB D6 7D 6A D1 C4 6A 6A D7 C7 7C 47 CC DC 4F 51 CD 97 51 15 8C 8B 6A 4A D2 A5 53 42 35 B8 3E 26 BE A5 85 7D B2 26 CD 2A 37 7F 85 7D BA 9C DD 53 BF 69 85 55 8E 2C E1 4C B3 FC 68 8B B2 85 A0 53 57 47 F9 AD CD BD 83 63 B3 F5 64 28 56 BD 0E 26 BE F5 83 63 A5 F5 64 2A 56 A9 0E 26 BE F5 83 7B 99 F6 F1 F6 2F FF 51 CD .. .. .. ..")
ADDRESS = 0x1000000
STACK_ADDR = 0x0
STACK_SIZE = 1024*1024
print("Emulate i386 code")
try:
    # 初始化模擬器
    mu = Uc(UC_ARCH_X86, UC_MODE_32)
    # 映射內存
    mu.mem_map(ADDRESS, 2 * 1024 * 1024)
    mu.mem_map(STACK_ADDR, STACK_SIZE)
    # 寫入shellcode
    mu.mem_write(ADDRESS, X86_CODE32)
    mu.reg_write(UC_X86_REG_ESP, STACK_ADDR + STACK_SIZE - 1)
    mu.emu_start(ADDRESS, ADDRESS + (X86_CODE32[1]+0xA))
    print("End of execution")
    print(hexdump(mu.mem_read(ADDRESS,len(X86_CODE32))))
    f = open('ASM_test_x86.bin', 'ba')
    f.write(mu.mem_read(ADDRESS,len(X86_CODE32)))
    f.close()
except UcError as e:
    print("ERROR: %s" % e)

解密后

到這里 C32ASM 就沒辦法在處理了因為后面會有很多利用 call pop 這種形式來獲取字符串地址所以該換上 Cuttter 了

解密后的 shellcode 開頭無非就是找 kernel32.dll 基址然后在找 GetProcAddress 和 LoadLibraryA 這兩個函數,都是 shellcode 的經典操作

GetProcAddress 和 LoadLibraryA 獲取完成后 jmp 過去開始加載 dll 和獲取一些函數地址如 VirtualAlloc , InternetOpenA,InternetOpenUrlA 等等。

CS 和 msf 都是通過 api hash 來獲取函數地址,Core impact 則是采用在棧中構建字符串然后調用 GetProcAddress 函數獲取

函數地址都獲取完畢后開始通過 http 請求核心 payload

這里的 http://192.168.1.97:8888/index.php?page=base64 就是請求 payload 的鏈接,page 后面跟的是 base64 編碼后的參數,不太清楚 Core impact 為什么要這樣設計,這樣搞特征太明顯了,這就必須說兩句題外話就是 payload 托管問題其實不管是 CS 還是 Core impact 又或者是 msf 我個人都是不建議使用它們自身的 payload 托管,應該根據實際情況自行導出核心 payload 然后進行單獨托管放在一個地方不要直接和 C2 服務器放在一起

下載下來的核心 payload

Core impact 返回的核心 payload 是 url 編碼的所以在讀取完成后還需要對核心 payload 進行解碼操作

基本上和 msf 或 cs 的分階段 payload 沒有太大區別都是使用一小段 shellcode 來下載執行核心 payload,不太相同的是 msf 和 cs 的核心 payload 都是由反射 dll 開發而來在進行修補頭來實現轉成 shellcode,對這個過程有興趣可以去看看這個項目:

https://github.com/WBGlIl/ReflectiveDLL_Patch

之前開源過一個修補反射 dll 頭的工具,Core impact 這東西的核心 payload 我看了一下是純 shellcode 開發的大小差不多在 152kb 左右

Payload 生成過程

payload 我們分析完了現在我們來分析一下 payload 的生成過程

Core impact 界面部分是由 MFC 開發的,它的功能實現全是通過 python,利用 boost.python 來實現運行 python 腳本,我這里會簡單寫一下生成的關鍵部分

基本上我把分階段 payload 生成分成 3 個部分

第一部分

modules\classic\site-packages\impact\LibEgg\Win32.py

這部分硬編碼就是分階段 payload 最開始的部分用來查找 kernel32.dll 獲得 GetProcAddress 和 LoadLibraryA

第二部分

modules\classic\site-packages\impact\LibEgg\HttpTunnelEgg.py

生成分階段 shellcode 主體部分,查找函數,調用函數通過 http 接收 payload 然后對 payload 進行 url 解碼然后執行,這里主要利用 InlineEgg 庫實現

https://www.coresecurity.com/core-labs/open-source-tools/inlineegg-cs

它的核心 payload 解碼器

第三部分

前兩個部分加起來生成完整的 shellcode 然后交由第三部分編碼器處理進行加密

modules\exploits\site-packages\impact\exploitlib\egg_obfuscator.py

它這個 shellcode 編碼器實現在 modules\classic\site-packages\impact\LibEgg\PolymorphicEgg.py基本上就是一些簡單的運算,算法不是很難比較簡單就是代碼比較多所以就不展開寫了

其他

在分析的過程中還有一個有趣的事情 Core impact 生成的 exe 竟然還帶著 pdb 路徑根據公開搜索找到了兩個相關的 exe 的信息,這點對于反溯源也挺重要的也是提醒各位自己編譯東西的時候不必要的信息應該一律不留

結尾

Core impact payload 從上面的分析可以看出來和 msf 或 cs 的差別還是挺多的,不過 Core impact 自身 payload 支持的平臺倒是挺多的包括 Linux,Mac OS X,OpenBSD,FreeBSD,Windows,等日后有時間再去繼續深入分析一下里面部分功能的實現。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1589/