
打靶这事我一直觉得比单纯看漏洞文档有意思得多。DC-2这套靶机在VulnHub上属于入门进阶那一档跟DC-1比起来它更考验你对信息收集的耐心以及对密码策略的敏感性。整个流程走下来你会用到nmap、cewl、wpscan、终端反弹Shell、Linux基础提权这些经典手法而且每一步都有前后照应不是那种拿到一个漏洞直接梭哈的靶场。这篇攻略我按实际踩坑过程来写包括我怎么想的、为什么这么做、中途在哪卡住了、最后怎么绕过去的都一并交代清楚你照着操作也能复现。1. 环境准备与信息收集1.1 靶机下载与网络配置先解决环境问题。DC-2靶机从VulnHub下载OVA文件用VMware或VirtualBox导入都行我习惯用VirtualBox。网络模式建议选NAT这样靶机和攻击机在同一个网段下省去桥接模式IP变化的麻烦。默认登录信息是DC-2的README里给的账号密码都是dc2或者直接不需要登录开机后它能正常拿到IP就行如果拿不到IP检查一下网卡是不是没匹配上VirtualBox换一下网卡类型通常能解决。攻击机我用Kali保持在同一NAT网段里互通性最好。这一步本质上是给自己搭一个干净的演练环境后面的所有操作都基于这个前提。如果你在云服务器上做网络逻辑会变不建议因为靶机的生命周期管理不方便。1.2 主机发现与端口枚举开机之后第一步不是急着扫服务而是先确定靶机IP。用nmap -sn 192.168.56.0/24扫一遍存活主机或者直接查Kali的ARP缓存表。我这一步用的是nmap -sP 192.168.56.0/24Kali本机IP是192.168.56.101的话那靶机大概率是192.168.56.102但最好用nmap确认一下。确认存活之后全端口服务枚举nmap -sS -sV -p- -T4 192.168.56.102-sS是SYN半开扫描速度快-sV探测服务版本后面选exp的时候要依赖版本信息-p-扫全部65535个端口。实测结果一般是80和7744端口开着7744很明显是SSH的改端口版本80是HTTP服务。看到这个结果基本就能判断这是一台典型的Web入口靶机思路直接锁定Web漏洞利用和后续内网横向。细心的兄弟可能会想为什么扫出来是7744而不是22这里就是DC-2故意设置的干扰项SSH换端口算是常规安全操作但靶场里纯粹是为了让你多一层思考入口点不一定是常规端口。2. Web渗透与CMS漏洞利用2.1 站点指纹识别与目录探测打开浏览器访问http://192.168.56.102页面是一个常规的WordPress站点。标题和站点描述直接写着“DC-2”连隐藏都懒得隐藏。这时候别急着上漏洞库先用工具确认一下CMS的具体版本、插件、主题以及有没有用户枚举的可能。常规操作是whatweb http://192.168.56.102 wpscan --url http://192.168.56.102 --enumerate uwhatweb看一眼响应头和服务指纹wpscan那边直接枚举用户。实测枚举出来的用户名有admin、jerry、tom三个这一步非常关键因为WordPress的XML-RPC接口和登录接口都可以用这种枚举到的用户名进行下一步暴力破解尝试。目录扫描这一步也不能省gobuster dir -u http://192.168.56.102 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt会看到/wp-admin、/wp-login.php、/wp-content等标准路径没有明显异常路径。所以这台的入口非常标准就是WordPress后台登录。2.2 cewl字典定制与原理解析接下来是DC-2的精髓也是和DC-1最大的区别用cewl根据站点内容生成自定义密码字典。为什么要这么做因为靶机作者故意在站点里放了一些提示站点里有文章页面内容看起来像随笔、日常记录但实际上藏了密码线索。cewl的原理就是爬取指定URL的页面内容提取所有单词按出现频率排序后生成词典。这类词典在针对内容相关性强的密码时效果非常好因为很多人喜欢用自己网站上出现的单词做密码或者在站点的某句话里嵌自己的密码习惯。我用的命令cewl http://192.168.56.102 -w dc2-wordlist.txt -m 3-m 3表示单词最少三个字符太短的干扰词不要。生成完之后可以看一眼词典内容会看到一些很常规的单词比如password、login、admin、tire、tom、jerry这些。你可能会想tom和jerry本来就是用户名出现在站里也正常但后面你会发现这两个名字对应了某个“经典猫和老鼠”的关系密码里可能也有这种隐含逻辑。这一步的重点是思路盲目用rockyou.txt去硬怼WordPress登录成功率低还容易触发锁定但根据业务内容生成的自定义词典却往往能精准命中。2.3 wpscan漏洞与弱口令排查拿到词典之后直接上wpscan爆破wpscan --url http://192.168.56.102 --passwords dc2-wordlist.txt --usernames tom,admin,jerry这里说明一下wpscan的爆破速度不快因为它要模拟真实登录请求而且WordPress本身有登录次数限制虽然靶机不一定开了插件限制所以你要有点耐心。实测结果tom的密码在字典里admin没试出来jerry也没试出来。这一步卡住很多人的点就在这里你会发现tom能登录后台但是后台里什么都没配置页面也基本都是默认的。那tom这个用户有什么价值呢关键点在于WordPress的用户名和系统用户名是否一致——很多时候WordPress账号和Linux系统用户是同一个人的名字这会给后面的SSH登录留下伏笔。这个阶段我一般会记录所有探测到的用户名、密码、服务版本、开放端口方便下一步联动。3. 敏感文件分析与SSH横向移动3.1 Flag获取与路径提示登录WordPress后台之后常规操作是看/wp-admin下有没有可编辑的主题文件、插件漏洞等但DC-2这里比较本分后台里没什么可利用的显著漏洞。真正有信息量的是http://192.168.56.102/?p...下的页面也就是站点首页那些文章页面。比如/index.php/2018/05/07/hello-world-2/之类的文章里面会提到一个flag文件所在路径或者某个用户的登录说明。我实际遇到的情况是文章里写着“flag在哪里呢也许你需要去找找其他服务”暗示你去看SSH服务。所以现在把注意力转到7744端口。先尝试直接SSH连接ssh tom192.168.56.102 -p 7744用wpscan爆破出来的密码试一下成功登录。登录后会看到tom用户的家目录下有一个flag文件cat flag3.txt内容一般是一个提示说类似“你需要切换到另一个用户jerry”这样的话。这时候你就要想办法拿到jerry的权限。3.2 用户切换与sudo权限分析现在我们是tom用户目标是在Linux系统层面切换到jerry然后继续提权到root。常规操作是sudo -l看tom有什么sudo权限。如果sudo配置里允许tom以任意用户执行某个命令那就有戏。但在DC-2里tom的sudo权限一般是没有的或者说非常受限。实测执行sudo -l会提示tom没有sudo权限或需要密码这里不纠结先看有没有SUID文件find / -perm -4000 -type f 2/dev/null不过DC-2的SUID提权是比较传统的路子很多教程会让你找/usr/bin/passwd、/usr/bin/su这种实际上没啥用还是回到密码复用这个逻辑上来。再次借助cewl生成的那份字典用su jerry尝试切换你会发现密码竟然能直接对上。原因是作者把jerry的SSH密码设置为和WordPress后台密码一样而且这个词就在cewl生成的词典里。这一步给我们的启示是在多用户环境中密码复用是常见的人性弱点横向移动攻击的破局点往往不是高深的0day而是弱密码和密码复用。3.3 利用SSH端口绑定的另类思路还有一种做法是在SSH服务上做文章。如果你对tom的密码已经掌握可以尝试用ssh-keygen生成密钥把公钥写入tom的authorized_keys实现免密登录方便后续操作。不过这只是便利性上的改进对提权本身没有帮助反而可能占用你太多时间。真正重要的还是用tom的密码去撞其他服务比如su jerry。在我实际操作中这一步一次性通过的概率很高因为WordPress后台密码和系统用户密码几乎是一一对应的这是DC-2设计的核心逻辑不会故意卡你。4. 提权到rootgit命令的妙用4.1 权限审计与可用命令排查一旦切到jerry用户第一件事还是查sudosudo -l这个时候好消息来了jerry可以用root权限执行/usr/bin/git命令而且不需要密码。看到这个结果基本就稳了。git命令能够以root权限运行意味着你可以利用git的某个机制来“借尸还魂”执行任意命令。很多人不了解git命令为什么可以被提权利用这里简单解释一下git有一个-p参数用于分页显示输出而分页器是可以通过环境变量GIT_PAGER或PAGER指定的。当你把这个环境变量设置为一个shell脚本或命令时git在调用分页器的过程中就会以当前权限替你执行这个命令。4.2 利用git的pager机制执行命令直接上操作sudo /usr/bin/git -p help -a但这一步之前先把环境变量设置好export PAGER/bin/sh sudo /usr/bin/git -p help -a这样当你执行git help并触发分页器的时候实际上会以root身份弹出一个shell而这个shell就是root权限。原理不复杂就是利用了git调用外部分页器时继承环境变量的设计加上sudo配置允许就形成了一条提权链。弹出来的root shell里直接id cd /root ls -la cat final-flag.txt拿到最终flag。整个提权链条到这里就完整了。4.3 为什么选择git而不是其他命令有人可能会问既然sudo -l里显示了git为什么不直接用sudo git执行命令其实sudo git本身是不能直接执行系统命令的git的官方参数里没有--exec这一类选项所以要用分页器机制来“曲线救国”。另一个思路是利用git子命令git commit时指定--cleanup或--editor的编辑器参数来弹shell但实测在DC-2环境里分页器方式更稳定、操作更少。这里如果你对分页器机制不熟建议本地搭个测试环境多试几种姿势熟能生巧。5. 常见问题与排查技巧实录5.1 字典生成不符合预期很多第一次打DC-2的兄弟在用cewl生成字典后发现里面出现了大量无意义英文单词却没有想要的那些明显“密码词”。这种情况一般是因为目标URL里的正文内容太少cewl爬到的基本都是导航栏和页脚信息。解决办法是先用浏览器把站点的文章页、分类页、标签页都过一遍然后用cewl指定多个URL爬取或者用--depth参数增加爬取深度。实测cewl http://192.168.56.102 -m 3 --depth 2 -w dc2-wordlist.txt爬取深度加深之后字典质量明显提升。如果你发现站点里的词汇本身就少可以在cewl生成的字典基础上手动追加一些观察到的业务词比如tomjerry、dc2、password这些再去做爆破。5.2 wpscan爆破速度慢或超时wpscan的爆破走的是HTTP请求WordPress本身的登录接口响应速度慢加上如果开启了“登录失败限制”插件很容易中途断掉。碰到这种情况可以设置--request-timeout和--connect-timeout参数比如wpscan --url http://192.168.56.102 --passwords dc2-wordlist.txt --usernames tom --request-timeout 10 --connect-timeout 10另外建议用小线程工具做二次验证比如用Burp Suite抓包后写个Python脚本直接POST到/wp-login.php。不过靶机一般没有防爆破机制wpscan默认配置其实够用只是耐心等就行。5.3 su切用户被拒绝或密码被锁定有一种情况是su jerry的时候提示su: Authentication failure但其实你的密码是对的。这时候看看是不是在SSH会话里输入了隐藏字符或者密码里有空格没有复制完整。推荐的做法是把密码先写入shell变量read -s PW su jerry $PW但注意su命令从stdin读密码的方式不一定兼容所有shell建议直接用su - jerry交互式输入最稳妥。如果碰到account is locked类似提示可能是靶机初始化时用户的密码策略问题重新恢复虚拟机快照再打一遍就好。5.4 网络不通或IP拿不到VulnHub的OVA导入VirtualBox后经常出现IP获取不到的情况。常见原因有三个网卡类型不匹配、网络模式没选好、系统初始化服务被安全软件拦截。对策是把网卡模式从NAT改为主机网络Host-Only或者在VirtualBox的设置里把“启用网络”勾上然后重新启动虚拟机。再不济直接在靶机控制台跑ip addr看它自己获取的IP是多少如果连控制台都进不去就把OVA重新导入一次。网络通了后面一切才好办。6. 复盘与技能沉淀DC-2打完一遍之后值得复盘的东西其实不少。首先是信息收集的完整性很多人在nmap扫出80端口后就急着上扫描器结果漏掉了7744端口的SSH服务后面横向移动就只能靠猜。其次是密码字典的定制化思维直接拿rockyou这种百万词典去撞靶机效率低且没有针对站点内容的“命中率”cewl这种基于目标内容的词典生成思路在很多真实渗透场景里同样适用。再一个是提权思路的多样性。很多人一谈到Linux提权就想到SUID、内核漏洞但sudo -l列出的可用命令才是最直接的攻击面。只要sudo配置允许某个命令无密码执行就有机会借助该命令的插件机制、环境变量注入等方式拿到root shellgit的PAGER只是其中一种类似利用方式还有vim的!/bin/sh、find的-exec等。能把这套思路串起来你的思路就不再是“背exp”而是真正理解提权原理。DC-2算是一个比较有代表性的WordPress建站打点案例从Web应用层渗透到Linux系统层提权整条链路清晰适合用来练手和讲清楚思路。我记得当时在这台上最卡壳的一次是cewl生成的字典里去撞wpscan跑了两遍都只出一个tom后来才发现自己忘了用--usernames指定完整用户列表导致admin和jerry没被尝试。这种小细节恰恰是实战里最让人头大的。如果你打算把这套过程整理成笔记或复现文档建议把每个阶段的命令、输出结果、踩坑点都记下来尤其是wpscan和SUID排查这部分将来回头翻笔记时会感慨当初记录得真值。