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 a或ifconfig命令查看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-8917或com_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会执行漏洞利用过程:
- 首先利用SQL注入漏洞,向Joomla的某个可写目录(如
/tmp或Web根目录下的某个文件夹)写入一个恶意的PHP文件(Web Shell)。 - 然后,它会尝试通过访问这个PHP文件来触发命令执行,并回连一个Meterpreter会话到你的Kali机器。
当看到Meterpreter session X opened的提示时,恭喜你,你已经成功突破了Web边界,在目标服务器上获得了一个初始的、低权限的命令执行shell(通常是以www-data用户身份运行的,这是Apache服务的默认用户)。
输入sessions -i 1来交互到这个会话中,试试shell命令,看看能否得到一个更熟悉的bash提示符。执行whoami和pwd来确认当前用户和所在目录。
核心原理剖析:为什么SQL注入能变成命令执行?关键在于“写文件”功能。MySQL数据库有一个特性,
SELECT ... INTO OUTFILE语句可以将查询结果写入服务器文件系统。如果数据库用户有FILE权限,且Web目录有写权限,攻击者就可以通过SQL注入,构造一个查询,将一段PHP代码写入一个.php文件中。当通过浏览器访问这个文件时,服务器就会执行其中的PHP代码,从而实现远程命令执行。Metasploit模块自动化了这个复杂的过程。
4.3 手动利用与理解底层原理
虽然Metasploit一键搞定很爽,但作为学习者,我强烈建议你至少尝试一次手动利用,或者仔细阅读Exploit-DB上的利用脚本(Python)。这能让你深刻理解漏洞的本质。
手动利用大致分为两步:
- 利用SQL注入获取超级管理员密码哈希:通过构造特定的URL参数,注入SQL语句,从Joomla的用户表(
#__users)中提取管理员用户名和密码哈希值。 - 破解或替换哈希以登录后台:Joomla的密码哈希通常为
bcrypt或MD5。你可以尝试用工具(如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-Invoke和APT::Update::Post-Invoke这两个配置项,允许指定在apt-get执行特定操作(如update)前后运行的命令。
提权步骤:
在低权限shell中,尝试以下命令:
sudo apt-get update -o APT::Update::Pre-Invoke::="/bin/sh"或者更稳妥的:
sudo apt-get update -o APT::Update::Pre-Invoke::="/bin/bash"这个命令的意思是:以root权限执行
apt-get update,但在执行update操作之前(Pre-Invoke),先调用/bin/bash。由于整个apt-get命令是以root身份运行的,它调用的bash也会继承root权限!执行上述命令后,如果成功,你的命令行提示符可能会变成
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/null或find / -type f -name *.txt 2>/dev/null | xargs grep -l ‘THM\|DC-3’在全盘搜索包含特定关键词的文件。 - 思路2:检查其他常见位置。如
/home/目录下的用户文件夹、/var/www/网站目录、/tmp目录等。 - 思路3:查看提示。有时靶机会在登录提示符、Web页面源代码或某个文件中给出下一步的提示。
渗透测试是一个不断遇到问题、分析问题、解决问题的过程。每一次错误和排查,都是加深理解的宝贵机会。DC-3靶机就像一位沉默的老师,它的每一道关卡都设计来教你一个知识点。通关不是终点,理解其背后的“为什么”和“怎么办”,并将这套方法论应用到其他场景,才是练习的真正价值所在。