DC-3靶机渗透实战:从Joomla SQL注入到APT-GET提权
2026/9/7 14:18:36 网站建设 项目流程

1. 项目概述:从“黑盒子”到“透明沙盒”的实战演练

如果你对网络安全感兴趣,或者正在学习渗透测试,那么“靶机”这个词对你来说一定不陌生。它就像一个专门为安全爱好者、学习者搭建的“虚拟沙盒”,里面预设了各种已知或未知的安全漏洞,供我们进行合法的攻击与防御演练。今天要聊的DC-3靶机,就是VulnHub平台上非常经典的一个系列。它基于一个老旧的Joomla! CMS系统构建,模拟了一个真实但脆弱的Web应用环境。说“复现”,其实就是指我们按照一套标准的渗透测试流程,从信息收集开始,一步步发现漏洞、利用漏洞,最终拿到系统的最高权限(root shell),并读取那个标志性的“flag”文件。

这个过程远不止是照着攻略敲命令。它真正的价值在于,你能亲手触摸到那些在教科书里冷冰冰的概念——比如SQL注入、文件上传、权限提升——感受它们在实际系统中是如何被触发、如何被利用的。DC-3的难度适中,路径清晰,非常适合用来巩固Web渗透的基础,理解攻击链的完整闭环。无论你是刚入门的菜鸟,还是想重温基础的老手,跟着这篇详细的复盘走一遍,你收获的将不仅仅是一个“通关”的结果,更是一套可迁移的实战思维和方法。

2. 环境搭建与靶机配置:打造专属的攻防实验室

在开始任何渗透测试之前,一个稳定、隔离的测试环境是首要前提。我们绝不能在真实的互联网或未经授权的系统上进行测试。因此,搭建一个本地的虚拟化环境是标准做法。

2.1 虚拟化平台选择与网络模式解析

我选择的是VMware Workstation Pro,当然 VirtualBox 也是完全可行的。关键在于网络模式的设置,这直接决定了你的攻击机(Kali Linux)能否“看见”并访问靶机。

网络模式选择:NAT 模式 vs. 仅主机模式

  • NAT模式:靶机和你的物理主机共享同一个IP地址(由你的路由器分配)上网,但靶机会获得一个虚拟网络内的私有IP(如 192.168.xxx.xxx)。Kali攻击机如果也设在同一个虚拟网络的NAT模式下,两者可以互通。这种方式方便靶机访问外网(如下载更新),但IP段可能受物理网络环境影响。
  • 仅主机模式:创建一个完全独立于物理网络的封闭虚拟网络,只有虚拟机能互相通信。这是最安全、最干净的测试环境,IP地址固定(通常是 192.168.56.xxx),不会干扰到你的真实网络。

我的选择与理由:为了绝对的纯净和避免任何潜在的网络冲突,我强烈推荐使用仅主机模式。在VMware中,你需要为Kali和DC-3靶机都创建或指定同一个“仅主机模式”的虚拟网络适配器(例如 VMnet1)。这样,它们就处于一个与世隔绝的沙盒里了。

2.2 靶机导入与攻击机准备

从VulnHub官网下载DC-3的OVA文件后,直接使用VMware的“打开”功能导入即可。导入后,切记将网络适配器改为“仅主机模式”。启动靶机,你会看到一个简单的命令行登录界面,这说明系统正在运行。

攻击机我使用的是最新的Kali Linux虚拟机。同样,将其网络适配器设置为与DC-3相同的“仅主机模式”。启动Kali,我们首先要确认网络连通性。

打开终端,使用ip aifconfig命令查看Kali在仅主机网络中的IP地址,假设是192.168.56.101。接下来,我们需要找到DC-3靶机的IP。

2.3 目标发现:ARP扫描与主机探测

在封闭的仅主机网络中,最有效的主机发现手段是ARP扫描。因为ARP协议工作在链路层,不依赖IP地址,能直接发现同一网段内所有活跃的主机。

# 使用 netdiscover 进行主动ARP扫描,指定我们所在的网段 sudo netdiscover -r 192.168.56.0/24

执行后,你应该能看到除了自己的Kali(192.168.56.101)之外,还有一个新的IP地址出现,例如192.168.56.102,这就是我们的DC-3靶机。记下这个IP。

为了进一步确认,可以使用ping命令测试连通性:

ping -c 4 192.168.56.102

收到回复,说明网络层通信正常。

实操心得:有时靶机启动较慢,或者网络服务需要时间初始化,如果一开始扫描不到,可以等待一两分钟再试。也可以使用更全面的扫描工具nmap进行ping扫描 (nmap -sn 192.168.56.0/24),但在这个简单环境中,netdiscover通常更快更直接。

3. 信息收集与漏洞初探:勾勒攻击面轮廓

找到目标IP后,我们不能像无头苍蝇一样乱撞。专业的渗透测试始于全面的信息收集。这一步的目标是尽可能多地了解目标系统:它开放了哪些端口?运行着什么服务?这些服务的具体版本是什么?有没有已知的漏洞?

3.1 端口与服务扫描:Nmap的深度运用

我们将使用渗透测试的“瑞士军刀”——Nmap,进行全端口扫描和服务识别。

# 对目标IP进行TCP全端口扫描(-p-),启用服务版本探测(-sV),使用默认脚本扫描(-sC),并输出详细结果到文件 nmap -sC -sV -p- -oA dc3_scan 192.168.56.102

参数解读

  • -sC: 使用默认的Nmap脚本引擎进行扫描,可以检测一些常见漏洞或获取更多信息(如HTTP标题)。
  • -sV: 探测服务版本,这是关键,很多漏洞都针对特定版本。
  • -p-: 扫描所有65535个TCP端口。
  • -oA dc3_scan: 将扫描结果以所有格式(普通、XML、可读)输出,文件名前缀为dc3_scan

扫描完成后,查看结果文件dc3_scan.nmap。对于DC-3,典型的扫描结果会显示:

PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-title: Home |_http-server-header: Apache/2.4.18 (Ubuntu)

结果分析: 目标只开放了80端口,运行着Apache 2.4.18和某个Web应用(标题是“Home”)。这是一个非常明确的信号:所有攻击入口都将集中在Web层面。没有SSH,没有FTP,没有其他复杂的服务,这简化了我们的攻击面,让我们可以聚焦于Web漏洞。

3.2 Web应用指纹识别:锁定CMS与框架

既然只有Web,下一步就是弄清楚这个网站是什么做的。使用浏览器访问http://192.168.56.102

一眼看去,这是一个博客或内容网站。查看网页源代码,在HTML头部或底部,经常能找到CMS的痕迹。更专业的方法是使用工具进行指纹识别。

在Kali终端中,我们可以使用whatweb工具:

whatweb http://192.168.56.102

对于DC-3,输出会明确显示这是Joomla!搭建的网站,并且会显示其版本号(例如 Joomla! 3.7.0)。Joomla是一个广泛使用的开源CMS,历史版本中存在不少公开漏洞。

手动确认:访问http://192.168.56.102/administrator/,如果出现Joomla后台登录界面,那就确凿无疑了。也可以尝试访问一些Joomla特有的路径,如/administrator/manifests/files/joomla.xml,里面通常包含版本信息。

注意事项:信息收集要细致。除了CMS类型,还应留意是否有特殊的目录或文件(如/robots.txt,/backup/,/phpinfo.php),使用的编程语言(PHP),以及是否有WAF(Web应用防火墙)的迹象。这些信息都可能成为后续攻击的突破口。

4. 漏洞利用与突破边界:从Web到Shell

确认了Joomla版本后,我们的攻击路径就清晰了。下一步是寻找该版本Joomla的已知漏洞。

4.1 漏洞研究与工具选择

通过搜索引擎或漏洞库(如Exploit-DB, NVD)查询“Joomla 3.7.0 vulnerability”。很快你会发现,Joomla 3.7.0 版本存在一个严重的SQL注入漏洞(CVE-2017-8917)。这个漏洞存在于com_fields组件中,允许攻击者通过特制的HTTP请求,无需登录即可执行SQL注入。

对于这种有公开利用代码(Exploit)的漏洞,我们可以使用 Metasploit Framework,这是Kali内置的强大渗透测试平台。

启动Metasploit:

msfconsole

在msf6提示符下,搜索与Joomla相关的漏洞利用模块:

search joomla

在结果列表中,寻找与CVE-2017-8917com_fieldsSQL注入相关的模块。通常会有一个名为exploit/unix/webapp/joomla_comfields_sqli_rce的模块。这个模块的精妙之处在于,它不仅能进行SQL注入,还能通过注入点进一步实现SQL注入写文件,从而获得一个Web Shell。

4.2 利用Metasploit获取初始立足点

使用该模块并配置必要参数:

use exploit/unix/webapp/joomla_comfields_sqli_rce set RHOSTS 192.168.56.102 # 设置目标主机 set TARGETURI / # 设置Joomla的根路径,如果安装在子目录则需修改 show options # 再次确认参数 exploit # 或 run 开始攻击

如果一切顺利,Metasploit会执行漏洞利用过程:

  1. 首先利用SQL注入漏洞,向Joomla的某个可写目录(如/tmp或Web根目录下的某个文件夹)写入一个恶意的PHP文件(Web Shell)。
  2. 然后,它会尝试通过访问这个PHP文件来触发命令执行,并回连一个Meterpreter会话到你的Kali机器。

当看到Meterpreter session X opened的提示时,恭喜你,你已经成功突破了Web边界,在目标服务器上获得了一个初始的、低权限的命令执行shell(通常是以www-data用户身份运行的,这是Apache服务的默认用户)。

输入sessions -i 1来交互到这个会话中,试试shell命令,看看能否得到一个更熟悉的bash提示符。执行whoamipwd来确认当前用户和所在目录。

核心原理剖析:为什么SQL注入能变成命令执行?关键在于“写文件”功能。MySQL数据库有一个特性,SELECT ... INTO OUTFILE语句可以将查询结果写入服务器文件系统。如果数据库用户有FILE权限,且Web目录有写权限,攻击者就可以通过SQL注入,构造一个查询,将一段PHP代码写入一个.php文件中。当通过浏览器访问这个文件时,服务器就会执行其中的PHP代码,从而实现远程命令执行。Metasploit模块自动化了这个复杂的过程。

4.3 手动利用与理解底层原理

虽然Metasploit一键搞定很爽,但作为学习者,我强烈建议你至少尝试一次手动利用,或者仔细阅读Exploit-DB上的利用脚本(Python)。这能让你深刻理解漏洞的本质。

手动利用大致分为两步:

  1. 利用SQL注入获取超级管理员密码哈希:通过构造特定的URL参数,注入SQL语句,从Joomla的用户表(#__users)中提取管理员用户名和密码哈希值。
  2. 破解或替换哈希以登录后台:Joomla的密码哈希通常为bcryptMD5。你可以尝试用工具(如John the Ripper, hashcat)破解,但更简单的方法是,利用另一个SQL注入点,将已知密码的哈希值(比如你自己设定的一个密码)更新到管理员账户中,然后直接用这个密码登录后台。

登录Joomla后台(/administrator)后,攻击面就大大拓宽了。你可以上传恶意的插件、模板,或者直接编辑模板文件插入PHP代码,从而获得Web Shell。这条路径虽然比Metasploit直接,但能让你更熟悉Joomla的结构和Web攻击的多种方式。

5. 权限提升:从www-data到root

拿到www-data的shell只是万里长征第一步。这个用户权限很低,无法读取系统关键文件(如/root/flag.txt)。我们需要进行权限提升(Privilege Escalation),目标是成为root用户。

5.1 内部信息收集:为提权做准备

在低权限shell下,我们需要收集大量关于系统的信息,寻找可能的提权路径。以下是一些关键命令:

# 查看当前用户和组 id # 查看系统内核版本和发行版信息 uname -a cat /etc/os-release # 查看安装了哪些软件包及其版本(Ubuntu/Debian) dpkg -l # 查看以root权限运行的定时任务(crontab) cat /etc/crontab ls -la /etc/cron.*/ # 查看具有SUID或SGID特殊权限的可执行文件 find / -type f -perm -u=s -o -perm -g=s 2>/dev/null # 查看当前用户能以sudo方式执行哪些命令 sudo -l # 查看网络连接和监听端口 netstat -tulnp # 查看进程列表 ps aux

将上述命令的输出仔细保存和分析。对于DC-3,一个经典的提权路径与sudo权限有关。

5.2 利用sudo配置不当进行提权

执行sudo -l命令,查看www-data用户被允许以root身份运行哪些命令。在DC-3中,你可能会看到如下输出:

Matching Defaults entries for www-data on dc-3: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User www-data may run the following commands on dc-3: (root) NOPASSWD: /usr/sbin/apt-get

这是一个非常关键的发现!它意味着www-data用户可以无需密码root权限运行apt-get命令。

apt-get是Debian/Ubuntu系统的包管理器。如果它能以root身份运行,我们能否利用它来执行任意命令呢?查阅apt-get的手册(man apt-get),会发现一个有趣的参数:-o--option,它可以用来设置任意的配置选项。其中,APT::Update::Pre-InvokeAPT::Update::Post-Invoke这两个配置项,允许指定在apt-get执行特定操作(如update)前后运行的命令。

提权步骤

  1. 在低权限shell中,尝试以下命令:

    sudo apt-get update -o APT::Update::Pre-Invoke::="/bin/sh"

    或者更稳妥的:

    sudo apt-get update -o APT::Update::Pre-Invoke::="/bin/bash"
  2. 这个命令的意思是:以root权限执行apt-get update,但在执行update操作之前(Pre-Invoke),先调用/bin/bash。由于整个apt-get命令是以root身份运行的,它调用的bash也会继承root权限!

  3. 执行上述命令后,如果成功,你的命令行提示符可能会变成root@dc-3,或者执行whoami会返回root。恭喜,你已经成功提权!

深度解析与备选方案:为什么这样能成功?因为系统管理员错误地配置了sudo规则,允许Web服务用户无密码运行高权限的包管理命令,而没有限制具体的参数。这违背了最小权限原则。除了Pre-Invoke,还可以尝试Post-Invoke,或者利用apt-get安装一个包含恶意脚本的deb包等更复杂的方法。

如果此路不通:DC-3靶机可能有其他提权方式。例如,检查内核版本是否较老,是否存在公开的本地提权漏洞(如Dirty Cow)。或者,检查是否有其他具有SUID权限的可疑二进制文件(如find, vim, less等),并利用其特性进行提权(GTFOBins是一个很好的资源库)。系统性地枚举和尝试是提权的关键。

6. 获取Flag与痕迹清理

成为root后,最后一步就是寻找flag。通常flag会放在root用户的家目录下。

cd /root ls -la cat flag.txt

你会看到最终的flag内容,例如THM{...}DC-3{...}格式的字符串。至此,整个渗透测试流程圆满完成。

关于痕迹清理:在真实的渗透测试(获得授权的前提下)中,结束后需要清理痕迹,避免留下后门或干扰系统正常运行。这包括:

  • 删除上传的Web Shell文件。
  • 清除或恢复被修改的数据库内容(如管理员密码)。
  • 删除系统日志中相关的访问记录(如/var/log/apache2/access.log,/var/log/auth.log)。
  • 清除当前用户的命令历史(history -c或清空~/.bash_history)。

但在靶机练习中,这一步通常可以省略,或者直接恢复快照到初始状态。

7. 常见问题与排查技巧实录

在实际操作中,你可能会遇到各种各样的问题。这里记录了几个我踩过的坑和解决方法。

7.1 网络连通性问题

问题:Kali能ping通网关,但ping不通靶机IP,或者nmap扫描不到任何端口。

  • 检查1:虚拟网络设置。确保Kali和DC-3的虚拟机网络适配器都连接到同一个“仅主机模式”网络(如VMnet1),并且都处于启动状态。
  • 检查2:靶机防火墙。虽然靶机通常不会开启防火墙,但可以检查一下。在获得shell后,可以用iptables -L查看规则。
  • 检查3:IP地址冲突。重启虚拟网络或为靶机指定一个静态IP(如果靶机支持DHCP,可能每次启动IP会变)。

7.2 Metasploit模块执行失败

问题:运行exploit后,模块报错,例如Exploit aborted due to failure: unknown: Failed to access the target

  • 检查1:RHOSTS和TARGETURI。确认目标IP设置正确,且TARGETURI设置正确(如果Joomla装在根目录就是/,如果装在/joomla子目录,则需要设置为/joomla)。
  • 检查2:靶机服务状态。访问一下http://靶机IP,确认Apache和Joomla服务正常运行。
  • 检查3:模块兼容性。极少数情况下,Metasploit模块可能对特定环境不兼容。可以尝试搜索该模块的替代方案,或者转向手动利用。

7.3 提权命令不生效

问题:执行sudo apt-get update -o ...后,没有获得root shell,或者提示命令错误。

  • 检查1:sudo -l 输出。再次确认输出中确实有(root) NOPASSWD: /usr/sbin/apt-get。注意路径,有时可能是/usr/bin/apt-get
  • 检查2:命令语法。确保命令中的引号和路径正确。可以尝试将/bin/sh替换为/bin/bash的完整路径(which bash查看)。
  • 检查3:靶机环境。某些apt-get版本或配置可能对-o参数的处理方式不同。可以尝试查阅当前系统apt-get的手册,或者寻找其他利用apt-get的方式(如通过apt-get changelog调用分页器less/vim进行提权)。

7.4 找不到Flag文件

问题:提权到root后,在/root目录下没有找到flag.txt

  • 思路1:全盘搜索。使用find / -name *flag* 2>/dev/nullfind / -type f -name *.txt 2>/dev/null | xargs grep -l ‘THM\|DC-3’在全盘搜索包含特定关键词的文件。
  • 思路2:检查其他常见位置。如/home/目录下的用户文件夹、/var/www/网站目录、/tmp目录等。
  • 思路3:查看提示。有时靶机会在登录提示符、Web页面源代码或某个文件中给出下一步的提示。

渗透测试是一个不断遇到问题、分析问题、解决问题的过程。每一次错误和排查,都是加深理解的宝贵机会。DC-3靶机就像一位沉默的老师,它的每一道关卡都设计来教你一个知识点。通关不是终点,理解其背后的“为什么”和“怎么办”,并将这套方法论应用到其他场景,才是练习的真正价值所在。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询