DC-2靶机实战:从WordPress渗透到Git提权的完整路径
1. 环境准备与靶机初探如果你对渗透测试感兴趣想找一个能串联起Web渗透、横向移动和权限提升的实战环境那DC-2靶机绝对是个绝佳的选择。它不像一些纯Web靶场只让你打一个点也不像某些复杂的内网靶机让人无从下手。DC-2设计得非常巧妙它模拟了一个典型的、存在多处安全配置问题的Linux服务器攻击路径清晰每一步都有迹可循非常适合新手用来建立“从外到内从低到高”的完整攻击思维。我自己在带新人学习时也经常拿DC-2作为第一个综合实战案例因为它几乎涵盖了入门阶段需要掌握的所有核心技能点。简单来说这次实战的目标就是拿到DC-2靶机上的最终Flag。攻击路径大致会是这样从暴露在公网或内网的WordPress网站入手通过信息收集找到突破口利用弱密码或爆破进入后台然后通过开放的非常规SSH端口横向移动到服务器内部最后在受限的Shell环境中找到提权方法拿到最高权限。整个过程就像玩一个解谜游戏每一步的线索都藏在上一关的收获里。你需要准备一台攻击机我习惯用Kali Linux因为它集成了我们需要的所有工具。靶机DC-2可以从Vulnhub等平台下载用VMware或VirtualBox以NAT模式运行确保它和你的Kali在同一个虚拟网络里就行。启动靶机后第一件事不是急着扫描而是确定它的IP地址。很多新手会在这里卡住因为靶机不会把IP写在脸上。在Kali里我常用arp-scan这个轻量又高效的工具来快速发现同一网段内的活跃主机。打开终端输入arp-scan -l屏幕上会刷出一堆MAC地址和IP。你需要从中找出哪个是DC-2。通常VMware虚拟机的MAC地址前三位是00:0C:29VirtualBox则是08:00:27这是一个快速筛选的小技巧。找到疑似靶机的IP后比如我这次找到的是192.168.105.160先别急着确认最好再用ping命令测试一下连通性确保能通。2. 全方位信息收集打开局面的关键信息收集是整个渗透测试的基石做得越细致后面的路就越顺。在DC-2里这一步直接决定了你能否发现那些关键的“入口点”。我的习惯是拿到IP后先用Nmap做一个全面的端口扫描看看靶机到底对外开放了哪些服务。2.1 端口与服务探测我执行了命令nmap -sV -p- 192.168.105.160。这里的-sV参数是进行版本探测-p-表示扫描所有65535个端口。耐心等待扫描完成结果非常有意思只开放了两个端口。80端口运行着Apache httpd 2.4.10这很常见通常就是Web服务。但另一个端口7744运行的是OpenSSH 6.7p1。SSH服务开在7744而不是默认的22端口这本身就是一个值得注意的“非常规配置”很可能管理员想通过改端口来增加一点安全性但这也可能成为我们后续的一个突破口。Nmap还识别出系统是Debian Linux这些信息都要记下来。2.2 Web应用信息挖掘接下来自然是访问80端口的Web服务。在浏览器输入http://192.168.105.160却发现页面自动跳转到了http://dc-2并且因为域名无法解析而打不开。这是一个典型的“虚拟主机”配置网站绑定了域名dc-2而非IP。解决起来很简单我们需要在攻击机的hosts文件里手动添加一条DNS记录把dc-2这个域名指向靶机的IP。在Kali Linux上用root权限编辑/etc/hosts文件加上一行192.168.105.160 dc-2即可。保存后再访问http://dc-2一个WordPress博客站点就呈现在眼前了。到这里真正的信息收集才开始。我首先用浏览器插件Wappalyzer看了一眼确认了这是WordPress 4.7.10数据库是MySQL。WordPress是一个庞大的内容管理系统历史漏洞不少插件和主题更是重灾区。接着我用dirsearch或gobuster这类目录扫描工具对网站进行了一次深度爬取。扫出来的结果里/wp-admin/是后台登录入口/license.txt和/readme.html提供了版本信息这些都是常规内容。但我在浏览网站页面时意外发现了一个名为flag1.txt的文件或者其内容直接显示在了页面上。这个Flag的内容是一段非常重要的提示“你常用的单词列表可能不起作用所以也许你只需要使用Cewl工具。密码越多越好但有时你不可能破解所有密码。以一个身份登录以查看下一个标志线索。如果找不到就换个身份登录。” 这段话几乎是在“手把手”教我们下一步怎么做第一要用Cewl这个工具从网站生成定制化的密码字典第二我们需要登录到网站后台第三可能存在多个用户需要尝试切换。这条线索将我们引向了针对WordPress的专项工具——WPScan。3. 突破边界WordPress的渗透实战有了明确的线索攻击就有了方向。Flag1提到了Cewl这是一个用Ruby写的工具它能爬取指定网站的所有文本内容然后提取出其中所有独特的单词生成一个密码字典。这对于爆破具有站点特色的用户密码非常有效。3.1 利用Cewl生成定制字典在Kali终端里我运行了命令cewl http://dc-2 -w passwd.txt。这个命令会让Cewl去爬取dc-2网站把爬到的所有单词默认长度大于3保存到passwd.txt文件里。稍等片刻打开passwd.txt你会发现里面全是这个网站文章、菜单、页脚里出现的英文单词。这种字典比通用的rockyou.txt更有针对性因为网站用户很可能就用这些与自己相关的词汇当密码。3.2 使用WPScan枚举用户与爆破接下来轮到WPScan登场了。它是WordPress安全审计的瑞士军刀。我们首先需要知道这个网站上有哪些用户。执行命令wpscan --url http://dc-2/ -e u。-e u参数就是枚举用户。WPScan会通过作者存档页等常见漏洞来尝试列出用户名。很快它给出了三个用户名admin,jerry,tom。我把这三个用户名保存到一个文件里比如叫users.txt。现在我们有了用户名单users.txt也有了根据网站内容生成的密码字典passwd.txt。是时候进行密码爆破了。使用命令wpscan --url http://dc-2/ -U users.txt -P passwd.txt。WPScan会尝试用密码字典里的每一个密码去碰撞用户列表里的每一个用户。这个过程可能会花点时间。最终我得到了两个成功的组合jerry / adipiscing和tom / parturient。这两个密码看起来都是普通的英文单词正好验证了Cewl生成字典的有效性。3.3 获取Flag2与思路转换用jerry的账号密码成功登录WordPress后台。在后台里一番寻找通常在文章、页面或者小工具里我找到了flag2.txt。它的内容是“如果你无法利用WordPress的漏洞来走捷径那么还有另一种方法。希望你能找到另一个切入点。”这条信息很关键。它暗示我们在WordPress层面可能没有现成的、能直接获取Shell的漏洞比如远程代码执行RCE可以利用。我们需要寻找“另一个切入点”。这时我立刻回想起信息收集阶段发现的7744端口——那个非标准的SSH服务。既然我们从WordPress这里拿到了两个系统用户的凭据jerry和tom那么很自然就会想到能不能用这些账号通过SSH直接登录到服务器呢攻击路径由此从Web应用转向了系统层面的横向移动。4. 横向移动突破SSH与受限Shell拿到系统账号密码后尝试SSH登录是顺理成章的一步。但这里有个小坑需要你留意。4.1 SSH连接尝试我首先尝试用jerry登录ssh jerry192.168.105.160 -p 7744。系统提示输入密码我输入adipiscing结果返回了“Permission denied”。这说明jerry的密码可能不对或者这个用户根本不允许通过SSH登录。没关系我们还有tom。尝试ssh tom192.168.105.160 -p 7744输入密码parturient。这次成功了我们获得了服务器的一个Shell。4.2 发现受限Shellrbash与Flag3登录后我习惯性地输入ls查看当前目录看到了flag3.txt。但当我试图用cat flag3.txt查看内容时系统却报错-rbash: cat: command not found。再试vim,nano甚至less全都找不到命令。这时我意识到用户tom被限制在了一个**受限的Bash Shellrbash**中。rbash是Bash的一个受限版本它会限制用户的行为比如不能用cd切换目录不能设置或取消环境变量如PATH只能执行PATH变量中指定目录下的少数命令不能使用重定向,,等等。这是一种常见的安全措施用于限制低权限用户的能力。输入echo $PATH查看会发现PATH变量通常只包含/home/tom/bin这样的目录里面只有极少的命令。怎么绕过呢方法有很多。我常用的一种方法是利用Bash自身的特性。在rbash中我们可以定义BASH_CMDS数组并给它赋值一个可用的Shell路径然后通过执行这个数组元素来“逃逸”。具体操作如下tomDC-2:~$ BASH_CMDS[a]/bin/sh tomDC-2:~$ $a # 此时Shell变成了sh但PATH可能还是受限的 # export PATH$PATH:/bin/ # export PATH$PATH:/usr/bin # 现在就可以使用cat, ls等常用命令了执行完这些我们就能正常读取flag3.txt了。里面的内容是“可怜的老Tom总是追着Jerry跑。也许他应该因为自己制造的所有压力而使用su命令。” 这又是一条明确的提示使用su命令。su命令用于切换用户身份。提示暗示tom应该切换到jerry。于是我们执行su jerry输入jerry的密码adipiscing成功切换到了jerry用户。注意这里jerry的Shell可能也是受限的但通过同样的方法可以再次绕过。4.3 寻找Flag4与提权线索切换到jerry后我们权限稍微高了一点。用find / -name flag4* 2/dev/null命令在全盘搜索最终在/home/jerry/目录下找到了flag4.txt。内容如下“很高兴看到你已经走到这一步了——但你还没成功呢。你仍然需要找到最终的标志这才是唯一真正重要的标志。这里不会再给提示了——现在你得靠自己啦。:-) 继续加油吧——git赶紧行动起来”这条信息有两个重点一是目标还没完成需要找到最终的Flag二是它“不小心”提到了一个关键词——git并且用括号括了起来这几乎是明示了。那么下一步的思路就很清晰了检查jerry用户有什么特殊的权限特别是和git相关的。5. 权限提升利用Git的Sudo权限在Linux中检查一个用户能以root身份执行哪些命令最直接的就是sudo -l。在jerry的Shell下执行这个命令jerryDC-2:~$ sudo -l Matching Defaults entries for jerry on DC-2: env_reset, mail_badpass, secure_path/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin User jerry may run the following commands on DC-2: (root) NOPASSWD: /usr/bin/git输出结果令人兴奋它显示用户jerry可以以root身份无需密码地运行/usr/bin/git命令。这就是我们梦寐以求的提权路径。Git本身是一个版本控制工具但它有一个特性可以通过git help command来查看帮助文档而这个帮助文档是通过一个分页器如less或more来显示的。在类Unix系统中很多分页器都允许在界面中执行外部命令。这是一个经典的“sudo git提权”方法。具体操作如下运行sudo git help config。这会打开git config命令的帮助页面实际上是用less分页器打开的。在less的界面中输入一个冒号:进入命令模式。然后输入!/bin/bash或!/bin/sh然后按回车。由于前面的sudo git命令是以root权限启动的那么由它启动的less分页器也拥有root权限而在这个分页器中执行的Shell命令也就继承了root权限执行成功后你会发现自己已经获得了一个root权限的Shell提示符通常从$变成了#。你可以用whoami命令验证一下输出应该是root。6. 最终胜利与总结反思成为root后整个系统对你来说就没有秘密了。最后的Flag通常放在/root目录下。我们切换过去cd /root然后用ls查看果然有一个final-flag.txt文件。用cat命令查看它屏幕上会显示一个由字符组成的祝贺图案和一段感谢语这标志着DC-2靶机的挑战圆满完成。回顾整个DC-2的渗透过程它就像一部精心设计的教学片。从Web信息收集Wappalyzer, dirsearch到针对性密码爆破Cewl, WPScan从非常规端口发现到SSH横向移动再从受限Shellrbash绕转到最后的sudo权限滥用提权git每一步都环环相扣引导你运用不同的工具和技巧。它没有用到特别高深或冷门的漏洞而是聚焦于那些在真实环境中非常常见的安全配置错误使用弱密码、服务开放在非标准端口、用户Shell权限设置不当、以及sudo权限分配过于宽松。对于新手来说攻克DC-2的最大收获不仅仅是学会几个命令更是建立起一种“链式思考”的渗透逻辑。你会明白渗透测试很少是一击必杀的更多是像剥洋葱一样一层一层地突破防御每一步获取的信息都是下一步的钥匙。比如如果你在WordPress爆破时没有拿到所有用户的密码可能在SSH那一步就会卡住如果你忽略了flag里的“su”和“git”提示提权也会变得异常困难。所以在实战中一定要仔细阅读每一个输出思考每一条线索背后的含义养成做笔记、画流程图的习惯这才是从靶机训练中能带走的、最宝贵的经验。