淺談Metasploit框架中的Payload
對於一個威脅情報分析師來說什麼是最煩人的呢?是你有一個只能暫時工作的惡意軟體嗎?其實無論C&C伺服器是否啟動,大多數惡意軟體都是可以直接使用的。那麼就讓我們來試著做出一些改變吧,比如使我們的payloads失效!
需要我們怎麼做呢?其實只是需要一些簡單的API調用,一些程序集,一些ruby,一些時間。
首先我們使用C進行如下的操作:
#include
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 0
Call 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 PIC
push ebp
mov ebp, esp
;sub esp, 10h
push 40h ; PAGE_EXECUTE_READWRITE
push 1000h ; MEM_COMMIT
push 10h ; 16 bytes needed
push 0h ; NULL as we dont care where the allocation is.
call VirtualAlloc
mov ebx, eax ; Store allocated address in ebx
lea eax, [ebx]
push eax
call GetLocalTime
mov ax, 0Ch ; MONTH
cmp ax, [ebx+2]
jnz short exitpart
mov ax, 7E1h ; YEAR
cmp ax, [ebx]
jz short continue
exitpart:
push 0
call ExitProcess
continue:
push 0
push 65706f6eh
call FatalAppExitA
; shellcode start
end 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 struct
push 40h ; PAGE_EXECUTE_READWRITE
push 1000h ; MEM_COMMIT
push 10h ; 16 bytes needed
push 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 ebx
lea eax, [ebx]
push eax
push 0xD92CE33e ; GetLocalTime with chunk from VirtualAlloc
call ebp
mov ax,cx
; curtime = Time.new
mov cx, 0x# ; MONTH converted to hex
cmp cx, [ebx+2]
jnz short exitpart
mov cx, 0x# ; YEAR converted to hex
cmp cx, [ebx]
jz short wegood
exitpart:
push 0
push 0x56A2B5F0
call ebp; ExitProcess
wegood:
; passed checks, can start shellcode now
;=====================================
這樣看起來還不錯,我們現在通過ruby代碼獲取當前的月份和年份,並將其格式化為十六進位。
我已經通過在exe.rb中創建「win32_rwx_exec」的重複函數來完成這項工作。 我的想法是否會被初始化主要依賴於一個選項。 這意味著需要將選項添加到lib msf core exploit exe.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上。


TAG:嘶吼RoarTalk |