- 文档
- 教程
- 网络安全
【免费下载链接】Viper
Adversary simulation and Red teaming platform with AI
Meterpreter 与 Cobalt Strike Beacon 是红队模拟中最常用的两种后渗透工具,实战中不少团队认为 Beacon 更稳定、权限更不易丢失。本文以 Viper 平台(基于 Metasploit-Framework 与定制分支 vipermsf 构建)为背景,系统对比windows/meterpreter/reverse_https与windows/beacon_http/reverse_https在核心库加载、C2 实现、通讯协议、心跳机制四个维度的差异,并给出从配置层面到源码层面改造 Meterpreter 的具体方案:关闭自动加载 stdapi、修复 Handler 的 HTTP 服务缺陷、按心跳间隔切换 keep-alive、为心跳加入抖动,最终让 Meterpreter 获得接近 Beacon 的稳定与隐蔽特性。
Meterpreter 与 Beacon 的差异在哪里
这里选取实战中最常用的windows/beacon_http/reverse_https(Cobalt Strike)和windows/meterpreter/reverse_https(Metasploit-Framework)进行比较。两者表面都通过 HTTPS 与 C2 通信,但底层实现路径截然不同,这直接决定了它们在长周期对抗中的稳定性表现。
核心库加载
两者都支持 stager 与 stagerless 两种方式加载 payload,实现方式基本一致,但加载链条长度不同:
- Meterpreter 的加载顺序:
stager --> metsrv.dll --> stdapi.dll - Beacon 的加载顺序:
stager --> beacon.dll
metsrv.dll 是 Meterpreter 的服务器核心,stdapi.dll 则承载文件系统、进程、网络等标准 API 功能。执行同等的基础命令时,Meterpreter 需要额外加载一个 stdapi.dll,这一多出的动态库加载步骤意味着更大的内存特征与更长的加载时间窗口。
C2 实现方式
这里的 C2 指 Meterpreter 的 Handler 与 Beacon 的 Listener:
- Meterpreter 的 handler 实现:基于
Rex::Socket的 TCPServer 结合 resources 实现的简易 HTTP 服务 - Beacon 的 Listener 实现:基于成熟的NanoHTTPD实现
相较于 NanoHTTPD 这类久经考验的 HTTP 服务器实现,自行实现的 HTTP 服务在边界情况处理上可能存在稳定性劣势,这也是 Meterpreter Handler 在公网扫描器冲击下容易出问题的原因之一。
通讯协议
两者都使用 HTTPS 进行数据通讯,但在具体传输方式上存在差异:
- Meterpreter 使用 HTTP/1.1,默认启用 keep-alive 且不能关闭
- Beacon 使用 HTTP/1.1,默认不开启 keep-alive
具体表现为:实际使用过程中,Meterpreter 与 C2 服务器之间始终保持一条 TCP 连接,且对 TCP 连接的状态没有监控;而 Beacon 在请求任务/返回结果时才与 C2 建立连接,在 sleep 阶段与 C2 没有任何网络连接。网络抖动、链路切换时,Meterpreter 那条被长期占用的 TCP 连接一旦中断且无人感知,就表现为"权限丢失";Beacon 的短连接则天然具备断线自动重连恢复能力。
如何改造 Meterpreter
在明确差异后,可以从四个方向对 Meterpreter 进行改造,使其行为特性向 Beacon 靠拢。其中核心库加载属于纯配置层面优化,其余三项属于源码层面定制,相关改动最终以补丁形式合入 Viper 维护的 vipermsf 定制分支。
核心库加载优化:关闭 AutoLoadStdapi 并手动加载
核心库加载的改造最简单,甚至可以说不算改造——Metasploit-Framework 本身支持不自动加载 stdapi.dll,只需在生成 Handler 时将AutoLoadStdapi参数设置为False即可:
此时如果有 payload 连接该监听,Session 会表现为一个"假 session":基础命令不可用。需要进入 Meterpreter 控制台,手动执行load stdapi加载核心库,随后该 Session 即可正常使用。
在此基础上,Viper 平台进一步放大了这一优化思路的价值。从 3.1.9 版本开始,Viper 引入了手动加载 stdapi 插件的功能:整体 stdapi 插件被拆分为多个子插件,用户可以根据需求选择性加载所需功能模块,从而减小内存特征(详见 手动加载 stdapi 插件)。操作路径与上述思路一致:
- 创建监听时取消自动加载 stdapi 插件
- 使用该监听创建载荷并上线,上线的 Meterpreter 会显示不完整
- 进入 Meterpreter 控制台,使用
load命令手动加载所需子插件,例如load stdapi_sys、load stdapi_ls、load stdapi_net - 加载
stdapi_sys后执行sysinfo,Meterpreter 信息即可正确显示
在实战中,这种"按需加载"既能减少加载阶段的特征暴露,也避免了自动加载失败导致整条 Session 不可用的连锁问题。该功能已内置于 Viper 的 监听与载荷管理 流程中。
C2 实现方式优化:修复 HTTP 服务的缺陷
Meterpreter 自行实现简易 HTTP 服务,笔者(原作者)认为主要有以下几点考虑:
- 实现 reverse 类型 handler 在代码上的统一
- 更灵活地进行服务启动/关闭
- 更好地与
Rex::Socket库结合(Rex::Socket实现了内网路由这一核心功能)
既然自研 HTTP 服务是架构选择的结果,那么可行的优化方向就是修复该服务在各种场景下暴露的问题(Bug)。
典型问题:如果在 VPS 上建立 reverse_https handler 且使用 443 这类常用端口,会发现大量扫描器扫描 handler,产生很多无效网络连接;如果恰好没有设置LURI,还会产生大量假 Session。
根因位于 Metasploit-Framework 的lib/rex/proto/http/server.rb(约 372 行)的非法请求处理逻辑:对于非法请求,虽然 MSF 会返回 404 页面,但如果对方设置了 keep-alive header,MSF 不会主动关闭该 TCP 连接,导致端口上堆积大量无效连接,进而影响真正 payload 的连接质量。修复思路是让非法请求默认关闭连接:
即对非法请求直接以关闭连接收尾,避免无效连接长期占用端口资源。这一改动是"治本"式的:它消除了扫描流量与真实回连竞争连接资源的可能性。
通讯协议改造:按心跳切换 keep-alive
通讯协议是两者最大的差异,也是 Meterpreter 看起来不稳定的直接原因。改造目标是把 Meterpreter 的逻辑调整为:
- 数据加载阶段:使用 keep-alive 长连接,保持传输速度
- 休眠阶段:使用短连接,保持隐蔽,且在网络连接闪断时可以自动恢复(HTTP 短连接特性)
具体修改点在 Meterpreter 载荷源码的c/meterpreter/source/metsrv/server_transport_winhttp.c(约 157 行的 HTTP 请求函数)。改造方式是在代码中增加额外判断:如果心跳间隔(delay)大于 3 秒,则关闭 keep-alive 功能:
这样,Meterpreter 在快速交互阶段(如大文件传输、模块执行)享受长连接的低开销高吞吐,在休眠阶段则退化为短连接——每次心跳独立建连、独立断开,网络一旦闪断,下一次心跳自动重新建立连接,行为特性与 Beacon 的默认模式对齐。
心跳抖动特性
Cobalt Strike 的心跳支持抖动(jitter)功能:sleep 时间不是一个固定值,而是在一个范围内浮动,结果是 Beacon 请求 C2 的时间点是随机的,可以在一定程度上规避基于固定周期的检测。
Meterpreter 也可以通过修改源码实现这一特性。核心做法是利用server_transport_winhttp.c中的两个关键变量:ecount(心跳增长因子)与max_delay(最大心跳间隔)。在这两个值上叠加随机数,即可实现心跳抖动——每次休眠时长在基础值与上限值之间随机浮动,从而打散回连节奏、降低时间特征的可预测性。
工程化实现
以上所有代码定制化更改已作为一个整体合入 Viper 配套的定制分支 vipermsf(Viper 基于 Metasploit-Framework 深度定制、用于构建平台后端能力的版本)。使用 Viper 平台进行红队评估时,无需自行手工打补丁即可获得这些稳定性优化:平台的监听创建界面直接开放了AutoLoadStdapi开关与 stdapi 子插件的手动加载能力,而 Handler 的 HTTP 服务缺陷修复与 keep-alive 心跳策略、心跳抖动等底层改动,则由 vipermsf 分支在构建阶段统一承载。
需要说明的是,上述源码级改动(C2 缺陷修复、通讯协议切换、心跳抖动)属于对 Metasploit 与载荷源码的定制化修改,普通使用者无需也无法在运行时通过配置开关启用,它们以代码补丁形式存在于 vipermsf 定制分支中,随 Viper 平台镜像一起交付。
总结
Meterpreter 与 Beacon 的稳定性差异并非玄学,而是可以拆解为三个可量化、可改造的技术点:多加载一个 stdapi.dll 的加载链条、自研 HTTP 服务对非法连接的容忍、以及默认常驻的 keep-alive 长连接。对应的改造方案也清晰明确——关闭AutoLoadStdapi按需加载核心库、修复非法请求不关连接的缺陷、按心跳间隔在长/短连接之间切换、为心跳加入随机抖动。在 Viper 平台中,前两项已转化为开箱即用的界面能力(手动加载 stdapi 插件、监听与载荷配置),后两项则由 vipermsf 定制分支在源码层面承载,让 Meterpreter 在保持原有功能生态的同时,获得接近 Beacon 的稳定性与隐蔽性。
- 文档
- 教程
- 网络安全
【免费下载链接】Viper
Adversary simulation and Red teaming platform with AI
相关推荐
把 MSF Meterpreter 改造得像 CS Beacon 一样稳定:Viper 的完整实操与源码级改造指南
把 MSF Meterpreter 改造得像 CS Beacon 一样稳定:Viper 的完整实操与源码级改造指南 导读 在红队模拟与攻防对抗中,Metaspl
文档教程网络安全Viper 3.1.4 版本全解析:渗透测试智能体接入 MSF、MCP 扩展与稳定性修复实战
Viper 3.1.4 版本全解析:渗透测试智能体接入 MSF、MCP 扩展与稳定性修复实战 Viper 3.1.4(劳动节快乐版)是一次聚焦 AI 能力的里程
文档教程网络安全Behinder 与 Viper 联动实战:不出网主机上线 Meterpreter 的两种方案
Behinder 与 Viper 联动实战:不出网主机上线 Meterpreter 的两种方案 本文基于 Viper 官方训练文档整理,测试环境为 Behind
文档教程网络安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考