从Drupalgeddon到SUID提权:DC-1靶机渗透测试实战全解析
1. 项目概述与靶机环境搭建
DC-1是VulnHub上一个非常经典的入门级渗透测试靶机,它模拟了一个基于Drupal内容管理系统的老旧服务器环境。对于很多刚接触渗透测试的朋友来说,这个靶机就像一道精心设计的“开胃菜”,它串联了从信息收集、Web漏洞利用、权限提升到最终获取Root权限的完整攻击链。我最近重新打了一遍,一方面是温故知新,另一方面也是想记录下一些实战中容易被忽略的细节和思考过程,希望能给正在入门的朋友提供一个清晰的、可复现的参考路径。
这个靶机的核心价值在于,它没有设置过于刁钻的障碍,而是将几个常见的、具有代表性的漏洞点串联起来。你不需要掌握什么“0day”或者高深的绕过技巧,只需要扎实地运用信息收集、漏洞搜索与利用、基本的Linux提权手法,就能一步步走到最后。整个过程就像解一个逻辑严密的谜题,每一步的发现都为下一步提供了线索。下面,我就以第一人称的视角,带你完整地走一遍我从外部探测到最终拿到Root Shell的全过程。
首先,你得有一个攻击环境和一个靶机环境。我是在VMware Workstation Pro里操作的。攻击机我用的Kali Linux 2024.1,这是渗透测试的标准装备,里面集成了我们需要的所有工具。靶机DC-1的OVA文件直接从VulnHub官网下载,导入虚拟机后,网络模式我选择了“桥接模式”。这里有个关键点:确保你的攻击机和靶机在同一个网段。桥接模式会让靶机像一台真实的物理机一样获取你局域网内的IP地址,这样Kali才能直接扫描和访问它。如果你用了NAT模式,可能需要额外配置端口转发,对新手来说容易出问题,所以桥接是最简单直接的选择。
启动两台虚拟机后,第一件事不是急着扫描,而是先确定靶机的IP地址。因为DC-1默认不会显示IP,我们需要在攻击机上把它找出来。最常用的命令就是netdiscover或者nmap扫描整个网段。
sudo netdiscover -r 192.168.1.0/24或者,如果你知道自己的网关,可以更精确地扫描:
nmap -sn 192.168.1.0/24执行后,在一堆熟悉的设备(比如你的路由器、手机、电脑)中,寻找一个陌生的、主机名可能包含“DC-1”或者系统信息显示为Linux的IP地址。假设我们找到了靶机IP是192.168.1.105。记住这个IP,它就是我们接下来所有攻击的目标。
注意:在实际的渗透测试授权项目中,第一步永远是明确授权范围和目标。像这样对未知网络进行主动扫描,仅限于你自己的实验环境。未经授权的扫描是违法的。
2. 信息收集与漏洞初探
拿到IP地址,渗透测试的正式流程才算开始。信息收集是整个过程的基石,目的是尽可能多地描绘出目标的“画像”:它开放了哪些门(端口)、门上挂着什么牌子(服务及版本)、门后大概是什么房间(应用类型)。对于DC-1,我们预期它是一个Web服务器,所以Web端口(80,443)是重点,但也不能忽略其他可能的管理端口。
2.1 端口与服务探测
我习惯先用一个快速的全端口扫描来摸个底,使用nmap的-p-参数扫描所有65535个端口,并用-sV尝试识别服务版本。
nmap -sV -p- 192.168.1.105 -oN nmap_fullscan.txt为了节省时间,也可以先扫描最常见的1000个端口:
nmap -sV -sC 192.168.1.105 -oN nmap_initial.txt参数解释:
-sV: 版本探测,告诉我们运行的是什么软件以及具体版本号,这对后续查找漏洞至关重要。-sC: 使用默认的Nmap脚本进行更深入的探测,可能会发现一些默认配置问题。-oN: 将扫描结果输出到一个文本文件中,方便后续查阅。
扫描结果很快就出来了,通常会是类似下面这样:
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7 (protocol 2.0) 80/tcp open http Apache httpd 2.2.22 ((Debian)) 111/tcp open rpcbind 2-4 (RPC #100000) MAC Address: 00:0C:29:XX:XX:XX (VMware)这个结果信息量很大:
- 22端口,SSH服务:运行的是OpenSSH 6.0p1。这是一个比较老的版本,可能存在已知漏洞(比如CVE-2016-0777, CVE-2016-0778),我们可以记下来,作为后续可能的突破口。
- 80端口,HTTP服务:Apache 2.2.22,同样是较旧的版本。更重要的是,它告诉我们这是一个Web服务器,主攻方向应该在这里。
- 111端口,rpcbind:这是一个RPC端口映射服务,有时能泄露系统信息或用于攻击,但在DC-1中通常不是主要入口。
2.2 Web应用指纹识别
既然80端口开放,下一步自然是用浏览器访问http://192.168.1.105。页面加载出来,一眼就能看到是Drupal的站点。Drupal是一个强大的开源CMS,但历史版本漏洞也不少。为了确认版本,我们可以用一些方法:
- 查看页面源码:在首页的HTML源代码里,经常在
<meta>标签或注释中找到生成器信息,比如<meta name="Generator" content="Drupal 7 (http://drupal.org)" />。 - 使用工具扫描:在Kali里,
whatweb是一个快速识别Web技术的利器。
输出会显示类似whatweb http://192.168.1.105Drupal[7.x]的信息,并可能列出一些插件和主题。 - 访问特定路径:Drupal有一些默认路径,比如
/CHANGELOG.txt或/README.txt,直接访问它们往往能直接看到版本号。访问http://192.168.1.105/CHANGELOG.txt,你很可能看到“Drupal 7.x”之类的标题,这就坐实了我们的判断。
为什么确定版本如此重要?因为所有的漏洞利用都是有针对性的。知道是Drupal 7.x后,我们就可以去搜索这个系列版本存在的公开漏洞。Drupal 7在2015年曾爆出一个非常严重的漏洞——Drupalgeddon(CVE-2014-3704),它允许攻击者通过SQL注入远程执行代码。DC-1靶机正是为了复现这个漏洞链而设计的。
3. 漏洞利用:攻破Web防线
信息收集阶段我们锁定了目标:一个运行着老旧Drupal 7版本的网站。接下来就是寻找并利用它的脆弱点。对于Drupal 7.x,首当其冲的怀疑对象就是Drupalgeddon漏洞。
3.1 利用Drupalgeddon (CVE-2014-3704) 获取Shell
Drupalgeddon漏洞的成因在于Drupal 7.x系列中,数据库抽象层对数组的处理存在缺陷,导致在expandedArguments函数中可触发SQL注入。这个漏洞影响范围极广,且利用方式已经公开,在Metasploit框架中就有现成的模块。
使用Metasploit进行利用:
- 启动Metasploit控制台:
msfconsole - 搜索Drupal相关漏洞模块:
在结果中,我们会找到一个名为search drupalexploit/unix/webapp/drupal_drupalgeddon2的模块,这正是对应CVE-2014-3704的利用模块。 - 使用该模块并设置参数:
如果一切顺利,Metasploit会尝试利用漏洞,并在成功后在目标服务器上上传并执行一个Payload(通常是Meterpreter的PHP后门),从而给我们返回一个Meterpreter会话。这时,你就已经成功突破了Web应用的边界,在Web服务器(www-data用户权限)的上下文里获得了代码执行能力。use exploit/unix/webapp/drupal_drupalgeddon2 set RHOSTS 192.168.1.105 set TARGETURI / # 如果Drupal安装在网站根目录,这里就是/ exploit
实操心得:在实际利用时,可能会因为网络环境或靶机状态导致一次不成功。可以多尝试几次,或者检查
RHOSTS和TARGETURI设置是否正确。如果Metasploit模块失效,也可以在网上找到公开的Python利用脚本(如drupalgeddon2.py),手动执行攻击并上传一个简单的PHP Webshell。
3.2 建立稳定连接与初步探索
通过Metasploit拿到Meterpreter会话后,第一件事是把它升级成一个更稳定的Shell,并开始探索系统。
- 获取标准Shell:在Meterpreter会话中,输入
shell命令,即可得到一个标准的Linux bash shell(权限是www-data)。 - 探索当前环境:
whoami # 查看当前用户,应该是www-data pwd # 查看当前目录,通常在/var/www目录下 ls -la # 查看当前文件 - 寻找敏感文件:Drupal的配置文件
settings.php是首要目标,它里面通常包含数据库连接密码。这个文件一般位于/var/www/[site-name]/sites/default/settings.php。用cat命令查看它:
在文件中寻找cat /var/www/[site-name]/sites/default/settings.php$databases数组,你会找到类似这样的行:
太好了!我们拿到了数据库密码:'password' => 'R0ck3t',R0ck3t。数据库凭证是横向移动和深度渗透的宝贵资产。
4. 权限提升:从www-data到Root
现在我们是一个低权限的www-data用户,目标是拿到最高的root权限。在Linux系统中,提权方法五花八门,核心思路是:寻找配置错误、利用有漏洞的服务、滥用高权限程序或利用内核漏洞。对于DC-1,有一条非常清晰的路径。
4.1 数据库渗透与用户密码破解
我们手上有Drupal的数据库密码。Drupal的用户密码是经过哈希处理的,但如果我们能进入数据库,或许能找到其他有用的信息,或者直接修改管理员哈希来登录后台。
- 连接MySQL数据库:
提示输入密码时,填入我们找到的mysql -u drupaluser -pR0ck3t。连接成功后,就进入了MySQL命令行。 - 查看数据库和表:
关键的表是show databases; use drupaldb; -- 使用Drupal数据库,名字可能在settings.php里 show tables;users,里面存储了用户信息。
你会看到管理员用户(通常是admin)的密码哈希值(以select name, pass from users;$S$开头的一长串字符)。 - 破解密码哈希:Drupal 7使用的哈希(
$S$)是基于SHA-512的,强度很高,直接破解可能很慢。但在CTF或老旧靶机中,密码可能很简单。我们可以使用john或hashcat来破解。先把哈希值保存到本地文件hash.txt,然后在Kali上运行:
或者使用john --format=drupal hash.txt --wordlist=/usr/share/wordlists/rockyou.txthashcat:
运气好的话,可能会破解出密码。但DC-1的设计中,这一步可能不是必须的,因为我们已经有了一个更直接的提权方法。hashcat -m 7900 hash.txt /usr/share/wordlists/rockyou.txt
4.2 利用SUID特权程序提权
在Linux中,有一种特殊的文件权限叫SUID(Set User ID)。当具有SUID位的可执行文件被运行时,它会以文件所有者的权限执行,而不是执行者的权限。如果我们能找到属于root且设置了SUID位的程序,并且这个程序能让我们以某种方式执行命令,我们就能直接获得root shell。
查找SUID文件:在获取的shell中,运行:
find / -perm -u=s -type f 2>/dev/null这个命令会在整个文件系统(/)中查找所有设置了SUID位(-perm -u=s)的普通文件(-type f),并将错误信息(2>/dev/null)丢弃,使输出更清晰。
在返回的列表中,一个非常可疑的程序出现了:/usr/bin/find。find命令本身是系统管理工具,通常不需要SUID位。给它设置SUID,并且所有者是root,这显然是一个错误配置,也是我们提权的绝佳机会。
利用find命令的-exec参数提权:find命令有一个-exec参数,可以用来执行任意命令。因为当前find程序是以root权限运行的,所以通过-exec执行的命令也将拥有root权限。
/usr/bin/find . -exec /bin/sh -p \; -quit命令分解:
/usr/bin/find .: 从当前目录开始执行find命令。-exec /bin/sh -p \;: 对找到的每个文件(在这里是.当前目录本身),执行/bin/sh -p。-p参数在有些系统上用于保留特权模式。-quit: 找到第一个结果后就退出,这样我们只得到一个shell。
执行上述命令后,再输入whoami查看,你会发现用户已经变成了root!恭喜,你已经成功夺取了系统的最高控制权。
注意事项:SUID提权是Linux系统配置不当的典型后果。在真实的安全评估中,发现此类配置错误需要立即报告。系统管理员应定期使用类似
find / -perm -u=s -type f 2>/dev/null的命令进行自查,移除非必要的SUID位。
5. 最终收割与总结反思
拿到root权限后,最后一步就是寻找最终的flag(在CTF中代表胜利的标志)。在DC-1靶机中,flag通常放在root用户的家目录(/root)或者一个显眼的位置。
cd /root ls -la cat flag.txt 或者 find / -name *flag* 2>/dev/null find / -name *.txt 2>/dev/null | xargs grep -l "flag"你可能会找到最终的flag文件,里面写着祝贺语,标志着整个渗透测试的完成。
回顾整个DC-1的渗透过程,我们可以梳理出一个清晰的攻击链:
- 信息收集:使用
nmap扫描发现开放端口(22, 80, 111),通过访问Web页面和工具识别出Drupal 7应用。 - 漏洞利用:利用Drupal 7已知的高危漏洞(CVE-2014-3704),通过Metasploit或独立脚本获取一个低权限的Web Shell(www-data用户)。
- 横向移动:在Web Shell中查找Drupal配置文件,获取数据库密码。连接数据库,尝试获取或破解用户凭证(此步骤在DC-1中可能非关键路径,但展示了标准流程)。
- 权限提升:在目标系统上查找配置错误,发现具有SUID特权的
find命令。利用find命令的-exec参数执行/bin/sh,从而将权限从www-data提升至root。 - 后渗透:以root身份寻找并读取最终的flag文件,完成目标。
从这次实战中,我们可以总结出几点对防御方至关重要的教训:
- 及时更新:Drupalgeddon漏洞在2014年披露,影响巨大。运行任何服务,尤其是Web应用框架和CMS,必须及时关注安全更新并打上补丁。老旧、不受支持的版本是最大的安全隐患。
- 最小权限原则:Web服务(如Apache)应该以专用的低权限用户(如www-data)运行,绝不能以root身份运行。数据库账户也应仅授予应用所需的最小权限。
- 定期审计配置:SUID/SGID位是强大的功能,但也是危险的特权放大镜。系统管理员应定期审计系统中有SUID/SGID位的文件,确保每一个都是必要的。像
find、vim、nano、bash等命令绝不应该被设置SUID位。 - 强化数据库安全:使用强密码,避免在配置文件中使用默认或弱密码。定期更换密码,并限制数据库的远程访问。
- 纵深防御:不要只依赖一层防护。除了修补漏洞,还可以考虑使用Web应用防火墙(WAF)、入侵检测系统(IDS)以及严格的网络访问控制策略,增加攻击者的成本和难度。
DC-1靶机虽然简单,但它完美地诠释了一次成功的网络攻击是如何由多个环节的“小失误”串联而成的。对于学习者而言,它是一份极佳的蓝图,让你理解攻击者的思维和基本流程;对于防御者而言,它是一记响亮的警钟,提醒你安全无小事,任何一个环节的疏忽都可能成为整个防线崩溃的起点。
