淺談Metasploit框架中的Payload
對於一個威脅情報分析師來說什麼是最煩人的呢?是你有一個只能暫時工作的惡意軟體嗎?其實無論C&C伺服器是否啟動,大多數惡意軟體都是可以直接使用的。那麼就讓我們來試著做出一些改變吧,比如使我們的payloads失效!
需要我們怎麼做呢?其實只是需要一些簡單的API調用,一些程序集,一些ruby,一些時間。
首先我們使用C進行如下的操作:
#include <windows.h>WORD month = 12;WORD year = 2017; int main(void){ SYSTEMTIME lt; GetLocalTime(<);if(month == lt.wMonth && year == lt.wYear){FatalAppExit(0,"cock!");}else{__asm{push 0Call ExitProcess}}}
然後我們用IDA把這個組件拉出來:
很好也很容易對吧,除了放在AX寄存器中的2個WORD值。這些來自數據部分,我們需要把它放到一個組裝項目中,並使其獨立。為什麼呢?因為screw只讀內存。這意味著會動態分配一塊內存,並將其分配給我們的SYSTIME結構,該結構的大小為16位元組。
.486 .model flat, stdcall option casemap :none include c:masm32includewindows.inc include c:masm32includekernel32.inc include c:masm32includeuser32.inc includelib c:masm32libkernel32.lib includelib c:masm32libuser32.lib;SYSTEMTIME STRUCT; wYear WORD ?; wMonth WORD ?; wDayOfWeek WORD ?; wDay WORD ?; wHour WORD ?; wMinute WORD ?; wSecond WORD ?; wMilliseconds WORD ?;SYSTEMTIME ENDS ; 16 bytes; first 2 words are checked; we dont need a data section; .data; DAY = 0Eh; MONTH = 0Ch; YEAR = 7E1h .code;sysTime SYSTEMTIME <>start:; lets figure out how to do this with PIC; is now PICpush ebpmov ebp, esp;sub esp, 10hpush 40h ; PAGE_EXECUTE_READWRITEpush 1000h ; MEM_COMMITpush 10h ; 16 bytes neededpush 0h ; NULL as we dont care where the allocation is.call VirtualAllocmov ebx, eax ; Store allocated address in ebxlea eax, [ebx]push eax call GetLocalTimemov ax, 0Ch ; MONTHcmp ax, [ebx+2]jnz short exitpartmov ax, 7E1h ; YEARcmp ax, [ebx]jz short continueexitpart:push 0call ExitProcesscontinue:push 0push 65706f6ehcall FatalAppExitA; shellcode startend start
現在我們來使用彙編代碼,使用masm來編譯它,可能都不到一個KB。 那麼現在,我們如何把它實現到metasploit中呢? 所有的payloads都通過這個類/lib/msf/util/exe.rb進行處理和封裝。
在1632行,我們有主代碼位負責分配一個讀/寫/可執行的內存塊並複製內部的shellcode。
為了確保我們的過期代碼在shellcode運行之前被命中,我們應該在我們的代碼為shellcode分配內存之前,即在1767行完成。
為了做出改變,我們需要利用metasploit的瘋狂彙編程序metasm。謝天謝地,它的語法像intel一樣。 對源代碼的分析表明,你不能像通常那樣「調用」API。相反,你必須把一個特殊的hash加到堆棧上,然後調用ebp寄存器。在/external/source/shellcode/windows/x86/src/hash.py中有一個特殊的python腳本來獲取這些散列。我們需要1個散列,特別是GetLocalTRime。
輸出是0xD92CE33e。這裡是我們對exe.rb文件的補充:
;======================================== ; need chunk of memory for SYSTIME structpush 40h ; PAGE_EXECUTE_READWRITEpush 1000h ; MEM_COMMITpush 10h ; 16 bytes neededpush 0h ; NULL as we dont care where the allocation is.push 0xE553A458 ; hash( "kernel32.dll", "VirtualAlloc" )call ebp ; VirtualAlloc( NULL, dwLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE );mov ebx, eax ; Store allocated address in ebxlea eax, [ebx]push eax push 0xD92CE33e ; GetLocalTime with chunk from VirtualAlloccall ebp mov ax,cx; curtime = Time.newmov cx, 0x#{curtime.month.to_s(16)} ; MONTH converted to hexcmp cx, [ebx+2]jnz short exitpartmov cx, 0x#{curtime.year.to_s(16)} ; YEAR converted to hexcmp cx, [ebx]jz short wegoodexitpart: push 0 push 0x56A2B5F0 call ebp ; ExitProcess wegood:; passed checks, can start shellcode now;=====================================
這樣看起來還不錯,我們現在通過ruby代碼獲取當前的月份和年份,並將其格式化為十六進位。
我已經通過在exe.rb中創建「win32_rwx_exec」的重複函數來完成這項工作。 我的想法是否會被初始化主要依賴於一個選項。 這意味著需要將選項添加到libmsfcoreexploitexe.rb的第19行。
if opts[:expire]payload = win32_rwx_exec_expire(code)end
現在剩下的事情就是提交給MSF,看看他們是否把它收回或者進口。 如果你想使用它,請在這裡下載exe.rb文件並將它放在你的[INSTALL_DIR] / lib / msf / util /文件夾中。 在這裡可以下載http://www.gironsec.com/blog/wp-content/uploads/2018/01/exe.zip。
我知道這可能會使你們中的一些人感到不安,不過這只是在Windows上的,但是我已經完成了第二部分。請繼續關注第二部分,看我如何將Linux附加到我的metasploit上。
本文翻譯自:https://www.gironsec.com/blog/2018/01/expiring-payloads-in-the-metasploit-framework/,如若轉載,請註明原文地址: http://www.4hou.com/technology/10063.html 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※黑客辭典:什麼是「網路殺傷鏈」?為什麼並非適用於所有的網路攻擊?
※互聯網甲方公司和乙方公司安全工程師的薪資範圍大概是什麼樣的?
※Google 基礎設施安全實踐:如何構建一個可信賴的雲平台(硬體篇)
※從明年開始 FBI可任意控制你的電腦
※你家的錢是存銀行,還是自己保管?
TAG:信息安全 |