探索Cobalt Strike shellcode是由編譯後的可執行.exe文件加載情況,這將需要使用調試器(x64dbg)和靜態分析(Ghidra)來執行完整的分析。
可執行文件是編譯後的exe,包含隱藏和混淆的Shellcode,使用一個簡單的異或例程和一個4字節的項對shellcode進行解碼,然後將其寫入一個用VirtualAlloc創建的簡單緩衝區。
本文將探索使用調試器獲得解碼的shellcode的方法,然後尋找使用Ghidra手動定位shellcode和相關解密密鑰的方法,還將研究在X64dbg和Ghidra之間切換的方法,以及使用ChatGPT識別和分析Ghidra輸出的方法。
獲取樣本點此下載樣本(pw:infected)。
SHA256:99986d438ec146bbb8b5faa63ce47264750a8fdf508a4d4250a8e1e3d58377fd
分析我們可以先把文件保存到一台分析機上然後用感染的密碼解壓縮。從這裡我們還可以創建一個文件名較短的副本。
由於該文件是已編譯的可執行文件,我們可以嘗試使用調試器對其進行分析。在本文中為x64dbg。
我們可以繼續使用x64dbg打開文件,一直點擊直到到達入口點。
現在,我們可以繼續在API上創建一些斷點,這些斷點通常(但並不總是)在惡意軟件解包時使用。
我們可以通過運行bp VirtualAlloc和bp VirtualProtect來創建2個斷點。
創建斷點後,我們可以繼續並允許惡意軟件繼續(F9)。惡意軟件將繼續運行並觸發VirtualAlloc上的斷點。
我們的主要目的是獲取由VirtualAlloc創建的緩衝區,我們可以通過使用Execute Until Return來實現這一點。 “Execute Until Return”將允許VirtualAlloc函數完成,但不允許發生任何進一步的操作。這意味著我們可以很容易地獲得創建的緩衝區的地址。
查看VirtualAlloc創建的內存
在點擊execute之後,返回。我們可以在RAX內部觀察到新創建的緩衝區地址。
我們想繼續監控這個緩衝區的可疑內容和解壓縮的惡意軟件時,可以通過右鍵點擊RAX中包含的地址來開始監控過程。
現在我們可以選擇Follow in Dump,這將打開左下角窗口中緩衝區的內容。
通過點擊“Follow In Dump”,我們可以在左下角的窗口中觀察到轉儲的內容。
我們可以在這裡註意到緩衝區是空的,只包含00。
用硬件斷點監控內存VirtualAlloc已經創建了一個空緩衝區,現在,我們可以通過創建一個硬件斷點來監控這個緩衝區的變化。
硬件斷點可以通過選擇內存轉儲中的第一個字節以及Right Click - Breakpoint - Hardware, Access - Byte來創建。
這樣我們可以允許惡意軟件繼續執行。可以看到硬件斷點被觸發,在緩衝區的第一部分中包含一個FC字節。前兩篇文章中已經講過FC是shellcode中非常常見的第一個字節。
此時,我們希望惡意軟件繼續填充緩衝區。
我們可以繼續使用另一個Execute Until Return。這樣緩衝區就會被填滿,我們就可以監控裡面的內容了。
下面我們可以看到填充後的緩衝區。可以看到第一個字節是0xFC,並且在初始字節中有一個wininet字符串,這可能表示shellcode。
使用反彙編器驗證Shellcode現在我們有了一個合理的假設,即緩衝區包含shellcode,我們可以繼續嘗試使用X64dbg對其進行反彙編。如果我們反彙編代碼並且沒有明顯的錯誤,那麼很有可能正在查看shellcode。
我們可以通過在反彙編器中選擇第一個FC字節和Follow in Disassembler來實現這一點。
X64dbg現在將嘗試從緩衝區中反彙編字節。
下面,我們可以在頂部的反彙編窗口中觀察到被反彙編的緩衝區。可以發現,似乎沒有明顯的錯誤,並且有有效的函數調用,循環和總體“正常”的指令。
使用SpeakEasy仿真器進行最終驗證
由於非常懷疑緩衝區包含shellcode,所以我們可以繼續使用Speakeasy來模擬它。
我們也可以用X64dbg實現同樣的事情,但是對於shellcode來說,這是一個更複雜的過程。也可以用X64dbg實現同樣的事情,但是對於shellcode,這也是一個複雜的過程。
要使用speakeasy模擬shellcode,我們首先需要保存它。
我們可以選擇我們的第一個FC字節,右鍵單擊然後Follow in Memory Map。
現在我們可以將內存緩衝區保存到一個文件中,將文件保存為memdump.bin。
用Speakeasy模擬未打包的Shellcode
現在將shellcode緩衝區保存到文件memdump.bin中。我們可以繼續使用Speakeasy來模擬shellcode。
我們可以使用speakeasy -t memdump.bin -r -a x64命令來做到這一點:
speakeasy -運行speakeasy工具;
-t -我們要使用哪個文件;
-r - (Raw) -表示我們正在使用shellcode;
-a x64 -表示我們的文件包含64位指令。我們知道這是因為我們使用的是x64dbg而不是x32dbg。
運行此命令後,將成功地模擬shellcode,並向我們提供有關其功能的大量信息。
Speakeasy輸出顯示了一個C2地址
可以看到對User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2;NET CLR 2.0.50727)\r\n的用戶代理的引用。
如果有可用的代理日誌,這個用戶代理將是查找代理日誌的好地方。
在Ghidra中查找Shellcode解密函數
在第一次觸發硬件斷點時,主要可執行文件可能位於解密函數的中間。我們可以使用這些信息在Ghidra中查找相同的解密函數。
在Ghidra中查找Shellcode解密函數;
用ChatGPT識別解密例程邏輯;
使用Ghidra識別解密密鑰;
利用熵定位加密shell;
使用Cyberchef執行手動解碼;
使用解密字節查找其他樣本;
使用解密代碼創建Yara Rule 。
Recommended Comments