當前位置:
首頁 > 新聞 > 淺談Metasploit框架中的Payload

淺談Metasploit框架中的Payload

對於一個威脅情報分析師來說什麼是最煩人的呢?是你有一個只能暫時工作的惡意軟體嗎?其實無論C&C伺服器是否啟動,大多數惡意軟體都是可以直接使用的。那麼就讓我們來試著做出一些改變吧,比如使我們的payloads失效!

需要我們怎麼做呢?其實只是需要一些簡單的API調用,一些程序集,一些ruby,一些時間。

首先我們使用C進行如下的操作:

#include

WORD month = 12;

WORD year = 2017;

int main(void)

{

SYSTEMTIME lt;

GetLocalTime(&lt);

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上。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

繞過安卓SSL驗證證書的四種方式

TAG:嘶吼RoarTalk |