☰
VulnHub DC-2靶机实战:从信息收集到提权的完整渗透测试链路
2026/10/3 13:09:37 网站建设 项目流程

说实话,我刚开始学网络安全的时候,最怕的不是不会用工具,而是找不到一个能安心练手的目标。VulnHub这个靶机平台,把一个个故意留了漏洞的虚拟机镜像打包好,我在本地用VMware跑起来,就能体验一遍完整的渗透测试流程。这篇文章拿经典的DC-2靶机当案例,从网络发现到拿到root权限,把每一步背后的分析思路讲清楚。如果你刚接触渗透测试,或者刷了一段时间VulnHub但总是卡在“不知道下一步该做什么”,这篇内容应该能帮你把散落的操作串成一条完整的攻击链。

所有演示都在本地虚拟化的靶机环境中完成,请在合法授权的范围内练习,这条底线怎么强调都不过分。

1. 动手第一步:VulnHub靶场搭建与避坑指南

1.1 为什么选VulnHub和DC-2练手

网络安全是个极度依赖环境感的领域,你看十遍漏洞原理,不如在一台真实系统上实操一次。VulnHub上的靶机不是那种给你一个代码片段让你判断漏洞的测试题,而是一个个完整的操作系统镜像。里面有真实的Web服务、真实的服务配置、真实的日志文件,甚至还有模拟内网环境的网络拓扑。你在里面做的每一个探测动作,得到的回显和真实环境几乎一致,这就是它比纯CTF题更有代入感的原因。

DC系列在VulnHub里知名度很高,DC-2又是其中特别适合入门到进阶过渡的一台。它的难度标注是“medium”,但实际做下来并没有太多骚操作。你不需要逆向二进制,不需要堆利用,主要靠信息收集、弱口令、系统配置缺陷提权。这条链路覆盖了Web渗透和Linux本地提权的关键知识点,而且环境稳定、社区讨论多,哪怕卡住了也比较容易找到提示。

选DC-2的另一个原因是它对新手很友好,前提是你得耐心。整个靶机要你改hosts、爆破口令、绕过受限shell、理解sudo提权,每一步都能单独拆出来当教学点。如果一上来就挑战那种需要0day的靶机,反而容易把信心打没。

1.2 下载镜像、导入虚拟机的细节

VulnHub官网的DC-2页面会提供OVA或ZIP格式的镜像。建议优先下载OVA格式,因为VMware和VirtualBox都能直接导入,省去手动创建虚拟机时配置操作系统的麻烦。

用VMware Workstation导入的步骤很简单:打开软件,选择“打开虚拟机”,找到DC-2.ova文件,然后按照向导确认路径和名称即可。导入之后先别急着开机,去“编辑虚拟机设置”里做两件小事。第一件,把不需要的硬件删掉,比如声卡、USB控制器,这些东西不影响靶机运行,但在某些网络配置下会引起干扰。第二件,检查网络适配器是不是你想要的模式,我习惯把攻击机和靶机都设置为“仅主机模式(Host-Only)”。

为什么要用Host-Only而不是桥接或NAT?这条经验是踩坑换来的。Host-Only模式下,虚拟机和宿主机组成一个封闭的局域网,和外部真实网络隔离开,你不会因为误操作扫到别人家设备。另外,桥接模式下靶机可能从路由器获取和攻击机不同网段的IP,NAT模式下靶机和攻击机的网络层互通方式更容易让人糊涂。Host-Only最干净,靶机启动后基本都会在一个固定网段里老老实实待着。

1.3 网络模式选择与靶机IP发现

打开靶机镜像后,攻击机Kali会处于Host-Only网段。先在自己的终端里执行ip a,看一下攻击机自己的IP,比如192.168.110.128/24这种,这说明当前Host-Only网段是192.168.110.0/24。靶机的IP是自动获取的,不会自动告诉你,所以得主动扫。

我习惯先用netdiscover -r 192.168.110.0/24扫一遍这个网段,或者用arp-scan -l。netdiscover的输出里会列出所有活跃主机,靶机的MAC地址通常是VMware的OUI前缀00:0C:29开头,和Kali自己的MAC地址存在同一网段,一眼就能认出来。

提示:如果扫描结果里没有任何未知设备,先别急着删靶机。检查一下虚拟机是不是还在启动中,很多Linux靶机开机后需要一两分钟初始化网络服务。也可以试试在虚拟机界面登录,输入账号密码后看系统里ip addr命令的结果。DC-2默认开机会自动获取IP,如果还是不到手,最后一个方法就是把靶机关机,把网络适配器从“仅主机模式”切到“NAT模式”再开机,获取IP后再切回来,强制触发DHCP重新请求。

拿到IP后,第一时间记录到笔记里。后面所有扫描、访问、攻击都会围绕这个IP进行,别到用的时候再翻屏幕。

2. 信息收集:别急着打,先摸清家底

2.1 端口扫描前要做的事

很多新手拿过靶机IP就习惯性敲一句nmap -A 192.168.x.x,然后盯着输出看半天。这没有错,但缺少一个前置动作:确认目标确实在线。哪怕netdiscover已经看到它了,我也习惯先ping -c 4 目标IP,一方面确认网络连通性,另一方面可以从TTL值大致判断操作系统。比如Linux的TTL一般是64,Windows一般是128,虽然DC系列基本都是Linux,但这个习惯放到真实场景里很有用。

ping通之后,接着做端口扫描。端口扫描是整个渗透测试里信息量最大的动作之一,不要只做一次“默认常见端口”扫描就完事。我习惯分两步:先快速扫描所有TCP端口,再对开放的端口做详细的服务识别。第一次扫描用nmap -p- --min-rate 10000 目标IP,把它变成全端口快速扫描,这样可以避免漏掉不常用的端口。全端口扫描大概需要几十秒到几分钟,取决于虚拟机性能和网络情况。

2.2 用nmap识别服务与版本

全端口扫完,DC-2会暴露两个端口,一个是80端口的HTTP服务,另一个是7744端口的SSH服务。很多靶机喜欢用非标准SSH端口来模拟真实环境里的“隐藏入口”,DC-2这里用7744就是在提醒你,扫描时不能只看默认的22。

接下来执行详细服务识别,命令大概是:

nmap -sV -sC -p 80,7744 目标IP

-sV表示进行版本探测,-sC运行默认脚本,用来获取服务指纹。输出里你会看到80端口是nginx,7744端口是OpenSSH。有的版本还会提示HTTP服务的标题、重定向规则等信息。

这里需要停下来想一想:为什么信息收集阶段要认真看版本号?因为版本号可以对应到已知漏洞库。比如一个老的Apache版本可能有路径遍历,一个特定版本的OpenSSH可能有用户名枚举。虽然DC-2的利用点不在版本漏洞上,但“先摸清版本,再搜索已知漏洞”这个思路必须形成肌肉记忆。

2.3 从Web站点搜集有效信息

把http://目标IP放进浏览器,页面会跳转到http://dc-2.local,并提示域名无法解析。这是一个非常典型的Web渗透考点:站点配置了虚拟主机,必须通过域名访问。解决办法是在Kali的/etc/hosts里加一行映射:

目标IP dc-2.local

加完后再访问http://dc-2.local,真实的站点就出来了。这是一个CMS做的站点,页面下方通常能看到“Powered by WordPress”的标识。遇到WordPress站点,第一反应不是去点击所有菜单,而是先确认它的版本、主题、插件以及用户信息。

可以用wpscan做一次初步扫描:

wpscan --url http://dc-2.local --enumerate u,vp

--enumerate u是枚举用户,--enumerate vp是枚举漏洞插件。DC-2上没有太多可利用的漏洞插件,但用户枚举这一步非常关键,后面拿口令全靠它。如果你不想依赖wpscan,也可以手动访问/wp-json/wp/v2/users,有时候接口会直接返回用户名列表;或者通过?author=1、?author=2的跳转来猜用户。DC-2里能扫出两个用户名,记下来,这基本就是以后登录系统的钥匙。

Web信息收集还有一个容易被忽略的点:查看页面源代码、响应头和robots.txt。DC-2的源代码里注释内容不多,但养成习惯很重要。有些靶机把密码明文写在注释里,有些则在/flag.txt路径下藏了提示。信息收集阶段宁可多花十分钟,也不要等到提权阶段才回过神来找线索。

3. 漏洞利用:从Web入口到系统权限

3.1 用户枚举与口令爆破的逻辑

拿到两个用户名后,系统还不会直接让你登录。下一步要猜密码,也就是口令爆破。用工具爆破之前,我们得先想清楚“爆破什么服务”。刚才nmap已经告诉我们SSH在7744端口,但DC-2的SSH本身就是个受限shell,直接爆破SSH既不高效,也没有利用Web端点的信息。

我这里的思路是:既然站点是WordPress,而且已经有用户名枚举的结果,那就先爆破WordPress登录接口。wpscan自带爆破模块,命令可以写成:

wpscan --url http://dc-2.local --usernames jerry,tom --passwords /usr/share/wordlists/rockyou.txt

rockyou.txt比较大,跑全量可能会有点慢,而且成功率不一定高。更好的做法是按照靶机站点的内容生成一份定制字典。比如用cewl工具抓取站点页面里的单词,再配合一些常见数字和符号组合。DC-2的设计思路就是用站点里的单词当字典,这样你会更容易爆破出结果。

我在实验中先用了cewl:

cewl http://dc-2.local -w dc2_words.txt

然后手动把某些单词改一下大小写、在后面加年份和特殊符号,最后用这个精简字典去跑wpscan,很快就拿到了其中一个用户的弱口令。别笑,真实场景里很多管理员密码就是从站点品牌、日期和个人信息组合出来的,靶机只是把这个现象放大了。

3.2 拿到SSH凭据后,突破rbash受限shell

爆破得到的口令可以用来登录WordPress后台,但DC-2的最终目标是拿到系统权限,不是当一个管理员博客账号。所以要把账号口令搬到SSH登录上去试,你会看到两个用户中至少有一个的密码在SSH上也能复用。

这里出现一个非常经典的Linux环境限制:登录成功后发现shell很怪,提示符是-rbash$,说明当前用户被设置成了restricted bash(受限shell)。rbash会限制cd、export等命令,还会限制通过绝对路径执行程序,看起来把人锁死在了当前目录。

但rbash本质上只是bash启动时带有-r参数,它限制的是模式,不是系统的安全边界。只要还有能执行命令的程序,就有机会逃逸。比较常见的手法有几种:

  • 用vi打开文件,然后在vim的命令模式执行:!/bin/bash,会弹出一个新的bash进程,由于这个bash不是rbash启动,所以限制消失。
  • 用find命令配合-exec执行shell。
  • 用python -c "import pty; pty.spawn('/bin/bash')"创建新的shell。

DC-2这个环境里,用vi或者直接修改当前用户的shell配置都能绕过。我习惯先用echo $SHELL看看,再用which看看有哪些命令可用。绕过rbash后,第一件事是修正环境变量,比如export PATH=/usr/bin:/bin:/usr/local/bin,不然有些命令还是找不到。

注意:从rbash逃逸到普通bash,只是环境层面的突破,还不是提权。你要把当前用户身份、sudo权限、系统计划任务等因素全部检查一遍,才能找到下一步。

3.3 sudo git提权的原理与利用

提升到普通的bash后,执行sudo -l查看当前用户可以以root身份运行哪些命令。DC-2的输出会显示tom用户可以在目标机上以root权限运行/usr/bin/git,并且不需要密码。

看到这个结果就该兴奋起来了,因为git本身是一个功能丰富的程序,它带有分页器、配置编辑器等交互式功能。很多程序在交互模式里可以执行外部shell命令,git就是典型的例子。

常规利用方式是在git的help或config场景下调用分页器:

sudo git -p help config

输入这个命令后,git会进入帮助页面,这个页面由less分页器呈现。在less界面里输入!/bin/bash,就能以root身份执行shell。如果这个姿势在你当前版本上无效,还可以试sudo git help status然后同样进入分页器,或者用sudo git -p status触发分页器。核心原理是:当程序以高权限调用外部分页器时,分页器内部执行命令的权限也跟着提升了。

拿到root shell之后,就可以去读最终的flag。走到这一步,整条攻击链才算闭环。

3.4 梳理完整的攻击链

打完DC-2之后别光顾着截图,把整条链路在脑子里再过一遍,你会看到一个清晰递进的关系:网络扫描发现服务 → HTTP服务暴露CMS → CMS用户枚举获得账号 → 口令爆破获得密码 → SSH登录触发受限shell → 绕过rbash变成普通bash → sudo -l 发现git权限 → git分页器逃逸拿到root。

这每一步看似独立,实际环环相扣。如果没有前面的信息收集,你根本不知道有dc-2.local这个域名;如果没有用户枚举,你爆破时都不知道该用哪个用户名;如果没有绕过rbash,你连sudo命令都用不了。这条链就是一次完整的渗透测试思路训练,你抄得了命令,但抄不了这个思考过程,这也是写这篇文章最想让你体会的地方。

4. 实战高频问题与排查总结

4.1 靶机IP获取不到怎么办

这是VulnHub玩家问得最多的问题。靶机开机后,Kali里netdiscover扫不到,浏览不了页面,非常崩溃。

第一反应是确认网络模式。检查攻击机和靶机是不是同一个网卡模式,如果一个是Host-Only一个是NAT,它们很难互通。改成相同模式后,点击虚机工具栏里的“重新初始化网络适配器”图标,或者在虚拟机的设置里关闭再开启网卡。

第二件事是等待。有些靶机的网络服务脚本会延迟启动,如果你在开机10秒内就开始扫,很可能什么都扫不到。我习惯等一分钟左右再做一次arp-scan,如果还是不行,直接到靶机控制台登录,使用ip addr看它自己有没有拿到IP。如果没有IP,多半是DHCP服务问题,可以手动指定一个和Kali同网段的IP,至少在本次实验中可以让它们互通。

4.2 工具爆不了、字典不给力怎么办

跑wpscan或者hydra的时候经常遇到“扫了半天一个口令也没出来”的情况,这时候不用急着怀疑靶机有问题,而是先怀疑字典。

rockyou.txt这种通用字典覆盖的是真实世界的常见弱口令,但靶机作者设计口令时往往是从站内文本里提取的,通用字典当然覆盖不到。解决办法就是cewl抓取站点词汇,自己做组合变换。把单词首字母大写、末尾加数字、替换相似字符,这些规则可以直接用crunch生成,也可以在cewl生成的字典上再做一遍sed变换。

工具本身报错也要留意。wpscan依赖Ruby环境,如果你用的是Kali滚动版,偶尔会因为依赖版本冲突导致模块加载失败。我试过执行gem update wpscan能解决一部分问题。如果实在不想折腾,也可以直接用Burp Suite配合抓包去做登录接口的爆破,把POST请求发送到Intruder,字典导入后手动观察响应长度差异,这比命令行工具更直观,也更方便理解爆破原理。

4.3 提权不成功时的排查思路

DC-2的提权点很明确,但很多其他靶机不会给你一个明显的sudo -l提示。如果提权阶段卡住,我一般按这个顺序排查:

  • sudo -l:看当前用户有哪些不需要密码的sudo权限。
  • crontab -l或者查看/etc/crontab:看有没有以root身份定期执行的计划任务,有时候可以利用任务里调用的脚本或命令。
  • find / -perm -4000 2>/dev/null:查找所有SUID文件,重点关注那些不在标准位置的程序,或者有已知利用的特殊程序。
  • 检查/etc/passwd里可写的文件,或者用户主目录下的.bashrc、.profile等启动文件。
  • 内核版本:如果其他路子都堵死了,查uname -a,去漏洞库搜索对应内核的提权EXP。

在DC-2里其实只要sudo -l就能发现git提权。但你要注意,当git没有配置好PAGER环境变量时,默认分页器可能是less,你输入!/bin/bash才能生效。如果进入不了分页器模式,尝试在help页面切换输入。这些都是实操中很容易翻车的细节。

5. 从DC-2走出去:练习记录与个人心得

5.1 一份合格的渗透测试笔记怎么记

打完靶机,很多人会在博客上贴出命令记录,这是好的开始,但还不够。我个人的习惯是给每台靶机建一个笔记,记录三块内容:

  • 目标信息:IP、开放端口、服务版本、操作系统、找到的域名和用户名。
  • 攻击过程:从探测到拿权限的每一步命令,不只是贴最终结果,还要记录我当时为什么执行这条命令。
  • 失败尝试:哪些方法没成功,为什么没成功。比如爆破字典太大超时、rbash绕过姿势不对导致卡住,这些都是宝贵经验。下次遇到类似环境,你会第一时间想到避开这些坑。

用表格整理关键服务也很有用,比如DC-2可以整理成下面这种形式:

项目内容
目标IP192.168.x.x
Web服务80端口 nginx + WordPress
SSH服务7744端口 OpenSSH
发现的域名dc-2.local
用户jerry, tom
初始突破口WordPress弱口令 + SSH复用
提权方式sudo git 分页器逃逸

下次翻笔记的时候,你不需要重新跑一遍扫描就能回忆起这台靶机的核心特征。对面试和写报告来说,这种结构化的记录方式也比零散的命令粘贴有价值得多。

5.2 持续练习的路线与几点提醒

DC-2只是VulnHub上的其中一个节点,刷完它之后可以试试DC-1、DC-3到DC-9,这些靶机难度递增,覆盖的利用方式也越来越丰富。DC-1偏向CMS漏洞利用,DC-3可能是利用Web服务漏洞打进去,越到后面越考验你对Linux系统的理解。

等VulnHub的入门系列刷得比较顺手,可以尝试Hack The Box的退役机器或者TryHackMe的路径,这两个平台都提供了系统性的难度分级和官方writeup。我当时从VulnHub转到这些平台后,最大的感触是思路开阔了很多,因为它们不只是让你拿到root,还会考核内网横向移动、隧道搭建、日志分析等更深层的内容。这些内容都需要一个稳定的练习环境,但不管在哪个平台练习,都要记住一条:不要在未经授权的真实系统上试用你的新技能。

最后分享一个小习惯:每打完一台靶机,我会在笔记末尾写一句“如果下次遇到类似架构,我会先做什么”。这句话看起来简单,但它会强迫你从“跟着教程一步一步走”变成“自己规划下一步”。我从这个习惯里受益很多,希望这篇文章也能让你从现在开始,像一名真正的渗透测试工程师那样去思考问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询