当前位置: 首页 > news >正文

从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)

这个结果信息量很大:

  1. 22端口,SSH服务:运行的是OpenSSH 6.0p1。这是一个比较老的版本,可能存在已知漏洞(比如CVE-2016-0777, CVE-2016-0778),我们可以记下来,作为后续可能的突破口。
  2. 80端口,HTTP服务:Apache 2.2.22,同样是较旧的版本。更重要的是,它告诉我们这是一个Web服务器,主攻方向应该在这里。
  3. 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.105
    输出会显示类似Drupal[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进行利用:

  1. 启动Metasploit控制台:
    msfconsole
  2. 搜索Drupal相关漏洞模块:
    search drupal
    在结果中,我们会找到一个名为exploit/unix/webapp/drupal_drupalgeddon2的模块,这正是对应CVE-2014-3704的利用模块。
  3. 使用该模块并设置参数:
    use exploit/unix/webapp/drupal_drupalgeddon2 set RHOSTS 192.168.1.105 set TARGETURI / # 如果Drupal安装在网站根目录,这里就是/ exploit
    如果一切顺利,Metasploit会尝试利用漏洞,并在成功后在目标服务器上上传并执行一个Payload(通常是Meterpreter的PHP后门),从而给我们返回一个Meterpreter会话。这时,你就已经成功突破了Web应用的边界,在Web服务器(www-data用户权限)的上下文里获得了代码执行能力。

实操心得:在实际利用时,可能会因为网络环境或靶机状态导致一次不成功。可以多尝试几次,或者检查RHOSTSTARGETURI设置是否正确。如果Metasploit模块失效,也可以在网上找到公开的Python利用脚本(如drupalgeddon2.py),手动执行攻击并上传一个简单的PHP Webshell。

3.2 建立稳定连接与初步探索

通过Metasploit拿到Meterpreter会话后,第一件事是把它升级成一个更稳定的Shell,并开始探索系统。

  1. 获取标准Shell:在Meterpreter会话中,输入shell命令,即可得到一个标准的Linux bash shell(权限是www-data)。
  2. 探索当前环境
    whoami # 查看当前用户,应该是www-data pwd # 查看当前目录,通常在/var/www目录下 ls -la # 查看当前文件
  3. 寻找敏感文件: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的用户密码是经过哈希处理的,但如果我们能进入数据库,或许能找到其他有用的信息,或者直接修改管理员哈希来登录后台。

  1. 连接MySQL数据库
    mysql -u drupaluser -p
    提示输入密码时,填入我们找到的R0ck3t。连接成功后,就进入了MySQL命令行。
  2. 查看数据库和表
    show databases; use drupaldb; -- 使用Drupal数据库,名字可能在settings.php里 show tables;
    关键的表是users,里面存储了用户信息。
    select name, pass from users;
    你会看到管理员用户(通常是admin)的密码哈希值(以$S$开头的一长串字符)。
  3. 破解密码哈希:Drupal 7使用的哈希($S$)是基于SHA-512的,强度很高,直接破解可能很慢。但在CTF或老旧靶机中,密码可能很简单。我们可以使用johnhashcat来破解。先把哈希值保存到本地文件hash.txt,然后在Kali上运行:
    john --format=drupal hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
    或者使用hashcat
    hashcat -m 7900 hash.txt /usr/share/wordlists/rockyou.txt
    运气好的话,可能会破解出密码。但DC-1的设计中,这一步可能不是必须的,因为我们已经有了一个更直接的提权方法。

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/findfind命令本身是系统管理工具,通常不需要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的渗透过程,我们可以梳理出一个清晰的攻击链:

  1. 信息收集:使用nmap扫描发现开放端口(22, 80, 111),通过访问Web页面和工具识别出Drupal 7应用。
  2. 漏洞利用:利用Drupal 7已知的高危漏洞(CVE-2014-3704),通过Metasploit或独立脚本获取一个低权限的Web Shell(www-data用户)。
  3. 横向移动:在Web Shell中查找Drupal配置文件,获取数据库密码。连接数据库,尝试获取或破解用户凭证(此步骤在DC-1中可能非关键路径,但展示了标准流程)。
  4. 权限提升:在目标系统上查找配置错误,发现具有SUID特权的find命令。利用find命令的-exec参数执行/bin/sh,从而将权限从www-data提升至root。
  5. 后渗透:以root身份寻找并读取最终的flag文件,完成目标。

从这次实战中,我们可以总结出几点对防御方至关重要的教训:

  • 及时更新:Drupalgeddon漏洞在2014年披露,影响巨大。运行任何服务,尤其是Web应用框架和CMS,必须及时关注安全更新并打上补丁。老旧、不受支持的版本是最大的安全隐患。
  • 最小权限原则:Web服务(如Apache)应该以专用的低权限用户(如www-data)运行,绝不能以root身份运行。数据库账户也应仅授予应用所需的最小权限。
  • 定期审计配置:SUID/SGID位是强大的功能,但也是危险的特权放大镜。系统管理员应定期审计系统中有SUID/SGID位的文件,确保每一个都是必要的。像findvimnanobash等命令绝不应该被设置SUID位。
  • 强化数据库安全:使用强密码,避免在配置文件中使用默认或弱密码。定期更换密码,并限制数据库的远程访问。
  • 纵深防御:不要只依赖一层防护。除了修补漏洞,还可以考虑使用Web应用防火墙(WAF)、入侵检测系统(IDS)以及严格的网络访问控制策略,增加攻击者的成本和难度。

DC-1靶机虽然简单,但它完美地诠释了一次成功的网络攻击是如何由多个环节的“小失误”串联而成的。对于学习者而言,它是一份极佳的蓝图,让你理解攻击者的思维和基本流程;对于防御者而言,它是一记响亮的警钟,提醒你安全无小事,任何一个环节的疏忽都可能成为整个防线崩溃的起点。

http://www.jsqmd.com/news/1073952/

相关文章:

  • Jenkins构建矩阵实战:打造高效CI/CD自动化实验室
  • MPC8306 FlexCAN Rx FIFO硬件原理与ID过滤表配置实战
  • CentOS 7部署国密HTTPS:GmSSL编译与Nginx双证书配置实战
  • PowerPC e300核心深度解析:从指令集到缓存与中断的嵌入式实战
  • macOS本地部署Hermes Agent+Gemma 4全链路指南
  • 协作系统权限漏洞深度剖析:从RBAC模型到10个真实案例的防护实战
  • CUPS零日漏洞深度剖析:从原理到实战的供应链安全防御指南
  • TypeScript构建LLM CLI工具的逆向分析与工程实践
  • OpenClaw本地化部署指南:AI工作流引擎安装与避坑实战
  • Kimi K2.5工程语境理解:从代码助手到项目级AI协作者
  • 基于Scapy的SYN洪水攻击原理与Python实现详解
  • AIGC实战指南:多模态模型、AI绘画与文档分析核心工具与应用
  • 协作机器人软件开发实战:攻克安全、交互、感知与部署四大挑战
  • Moltbot开源Telegram Bot框架:Node.js高并发状态管理方案
  • 渗透测试实战:AES_CBC加密与签名校验的自动化破解方案
  • LangChain生产级AI员工:RAG+Agent+Tool Calling实战架构
  • Vibe Coding 真实瓶颈:文档语义结构化与 MCP 上下文编织
  • 道格拉斯-普克算法实战:多边形简化的核心原理与GIS/三维建模应用
  • 月球洞穴基地:利用天然熔岩管构建人类月球前哨站的技术路线
  • AI开发环境搭建:构建可验证、可迁移、可回滚的基座
  • 从Holiday Cheer到多维氛围营造:打造沉浸式节日体验的实践指南
  • 架构师视角下的网络分层与安全实践
  • 实战搭建WireMock UI图形界面:可视化API Mock管理与调试指南
  • 坐标与表面关联:从离散点到连续曲面的核心技术与实战
  • STM32G431RBT6 CubeMX全流程实战:从芯片架构到可烧录工程
  • 基于MATLAB构建交互式数字天象馆:从坐标转换到3D可视化
  • 无穷级数:从收敛判别到幂级数应用,掌握无限求和的数学工具
  • MathWorks工具链在赛车工程中的应用:从建模到数据驱动的性能优化
  • 推荐系统中的滑动窗口与k-Shift嵌入技术解析
  • Simulink模型复杂度可视化:基于桑基图的模块数量统计与分析