DC-2靶场渗透实战:从信息收集到权限提升的完整攻击链解析
2026/7/30 8:08:51 网站建设 项目流程

1. 项目概述:从靶场到实战的桥梁

DC-2靶场,对于很多刚入门网络安全、想上手渗透测试的朋友来说,是一个绕不开的经典练手环境。它不像一些大型综合靶场那样复杂,也不像DVWA那样功能模块化,DC-2更像是一个精心设计的“密室逃脱”游戏,目标明确:拿到最终的flag。这个过程会逼着你把学到的那些零散知识点——信息收集、漏洞利用、权限提升——像拼图一样串联起来,形成一个完整的攻击链。我当年第一次接触DC-2时,也卡在几个关键步骤上,折腾了好一阵子。今天,我就以一个过来人的身份,把DC-2靶场的渗透实战过程掰开揉碎了讲一遍,不仅告诉你每一步怎么做,更会重点解释“为什么要这么做”,以及我在过程中踩过的坑和总结的技巧。无论你是正在学习渗透测试的新手,还是想巩固一下基础流程的老手,这篇详细的实战记录都能给你提供一个清晰的参考路径。

2. 环境准备与初步信息收集

渗透测试的第一步永远不是直接上工具狂轰滥炸,而是冷静、细致地收集信息。对于DC-2这样的已知靶场,我们甚至可以从环境配置阶段就开始“收集”。

2.1 靶场环境搭建与网络配置

DC-2通常以虚拟机镜像(如OVA格式)的形式提供。下载后,我习惯使用VMware Workstation进行导入。这里有个关键点:网络模式的选择。为了模拟最接近真实内网的环境,我强烈建议将靶机的网络适配器设置为“NAT模式”“仅主机模式”,而不是桥接模式。

注意:在NAT模式下,你的攻击机(比如Kali Linux)和靶机(DC-2)处于同一个虚拟子网内,但对外部网络是隔离的。这能避免你的扫描和测试行为影响到真实的网络环境,也符合安全研究的伦理规范。

启动靶机后,我们首先需要知道它的IP地址。由于靶机通常不会主动告诉我们,我们需要在自己的攻击机上进行探测。最直接的方法是使用netdiscoverarp-scan进行局域网内的主动ARP探测。

# 在Kali Linux攻击机上执行 sudo netdiscover -r 192.168.xxx.0/24

这里的192.168.xxx.0/24需要替换成你虚拟机NAT网络的实际网段。VMware默认的NAT网段通常是192.168.xxx.0,你可以在VMware的“编辑”->“虚拟网络编辑器”中查看NAT模式的子网地址。

执行命令后,你会看到一个列表,其中除了你已知的设备(如你的物理机、路由器),那个陌生的、主机名可能包含“DC-2”或类似字样的IP,就是我们的目标。假设我们找到了靶机IP:192.168.1.105

2.2 系统性信息收集:端口与服务探测

拿到IP后,下一步就是经典的端口扫描。我个人的习惯是分两步走:先用快速扫描确认开放端口,再针对开放端口进行精细化探测。

第一步:快速全端口扫描使用nmap-p-参数进行全端口扫描,但为了速度,可以结合--min-rate

sudo nmap -sS -p- 192.168.1.105 --min-rate 1000

-sS是TCP SYN半开扫描,速度快且相对隐蔽。扫描结果可能会显示开放了80端口(HTTP)和7744端口(SSH?一个非标准端口,这本身就是一个重要信息)。

第二步:服务与版本探测针对发现的开放端口,进行更细致的扫描,获取服务名称和版本号。

sudo nmap -sV -sC -O -p 80,7744 192.168.1.105
  • -sV: 探测服务版本。
  • -sC: 使用默认的Nmap脚本进行更深入的探测。
  • -O: 尝试识别操作系统。

这个命令的返回结果至关重要。对于80端口,我们可能会看到类似Apache httpd 2.4.10 ((Debian))的信息,确认了Web服务器类型和版本。对于7744端口,可能会显示OpenSSH 7.4p1 Debian,确认了SSH服务及其版本。这些版本信息是后续寻找对应漏洞的基础。

第三步:Web路径探测既然有80端口,那么Web应用就是我们的首要入口。使用目录爆破工具可以发现隐藏的路径或文件。

gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt

或者使用dirb

dirb http://192.168.1.105

这个步骤可能会发现一些关键目录,比如/admin//login//wp-admin/(如果是一个WordPress站点)等等。在DC-2中,一个典型的发现就是它是一个WordPress站点。

2.3 关键发现:WordPress站点的确认与枚举

如果目录扫描发现了/wp-admin//wp-content//wp-includes/等路径,或者访问首页在页面源码中看到了wp-content等字样,基本可以确定是WordPress。

对于WordPress,我们有专门的信息收集工具:wpscan。它可以枚举用户名、插件、主题漏洞等。

wpscan --url http://192.168.1.105 --enumerate u

这个--enumerate u参数专门用于枚举用户名。在DC-2中,这个步骤通常会得到几个用户名,例如admin,jerry,tom。这些用户名是后续进行密码爆破的关键字典。

实操心得:信息收集阶段一定要耐心和细致。我见过很多新手同学扫出一个80端口就直接去访问网页,看到登录框就开始猜密码,完全忽略了端口扫描、目录爆破和WPScan用户枚举这些步骤。这些步骤看似基础,但往往能提供突破口的决定性线索,比如那个非标准的SSH端口(7744)和枚举出的用户名列表。

3. 漏洞利用与初始访问突破

信息收集完毕后,我们手头有了:靶机IP、开放端口(80/http, 7744/ssh)、网站技术(WordPress)、潜在用户名(admin, jerry, tom)。现在,我们需要找到进入系统的第一道门。

3.1 Web入口的试探:密码爆破与重定向陷阱

首先访问http://192.168.1.105,你可能会直接看到一个博客页面,或者被重定向到一个类似http://dc-2/的地址,但浏览器显示无法连接。这是一个经典的“虚拟主机”配置问题。

靶机上的Web服务器(如Apache)配置了虚拟主机,要求访问者使用http://dc-2这个域名来访问,而不是直接使用IP地址。我们的攻击机并不知道“dc-2”这个域名指向哪里。解决方法是在攻击机的/etc/hosts文件中添加一条记录,进行本地域名解析。

sudo nano /etc/hosts # 在文件末尾添加 192.168.1.105 dc-2

保存后,再在浏览器访问http://dc-2,这时应该就能正常看到WordPress站点了。

接下来,尝试访问WordPress的登录页面http://dc-2/wp-login.php。使用之前wpscan枚举出的用户名(如 admin, jerry, tom)进行登录尝试。通常,默认密码或弱密码(如 password, 123456)不会成功。这时,我们需要进行密码爆破。

我们可以使用wpscan的密码爆破功能,但这里我演示更通用的工具hydra,针对Web表单进行爆破。

hydra -l jerry -P /usr/share/wordlists/rockyou.txt dc-2 http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=incorrect"
  • -l jerry: 指定单个用户名jerry
  • -P rockyou.txt: 指定密码字典。
  • http-post-form: 指定协议为HTTP POST表单。
  • 引号内的部分是表单参数:log是用户名框,pwd是密码框,wp-submit是提交按钮。F=incorrect表示如果返回页面中包含“incorrect”字样,就认为登录失败。

jerrytom分别进行爆破。在DC-2中,你很可能会成功爆出jerrytom的密码(通常是adipiscing,parturient这类看起来像随机但其实是弱密码的单词)。而admin用户的密码通常无法通过常规字典爆破出来,这提示我们可能需要其他路径。

3.2 SSH非标准端口登录尝试

我们之前发现SSH服务运行在7744端口,而不是默认的22端口。现在我们有了一组可能的用户名和密码(jerry/password1, tom/password2),可以尝试进行SSH登录。

ssh jerry@192.168.1.105 -p 7744

输入对应的密码。在DC-2中,你可能会发现用jerry的密码可以成功登录!这就获得了第一个初始立足点——一个低权限的shell。

注意事项:为什么SSH端口不是22?在真实环境和一些CTF靶场中,管理员经常更改默认服务端口以规避自动化扫描和低水平攻击。因此,全面的端口扫描(-p-)至关重要,不能只扫常见端口。

3.3 受限Shell的识别与逃逸

登录成功后,你可能会遇到一个“惊喜”:命令行看起来非常简陋,提示符可能是$,但当你尝试执行一些基本命令如ls,cd,whoami时,系统可能会返回“rbash”的错误信息,或者直接说命令找不到。

这说明你进入了一个受限的Bash Shell(Restricted Bash, rbash)。rbash会限制用户的行为,例如:

  • 不能使用cd切换目录。
  • 不能设置或取消环境变量(如PATH)。
  • 不能执行包含/的命令(这意味着你不能指定绝对或相对路径来运行程序)。
  • 不能使用重定向(>,>>,<,|)。

我们的首要任务就是逃逸这个“牢笼”。有几种经典方法:

方法一:利用编辑器逃逸在rbash中,有时仍然可以调用一些编辑器,如vi,vim,ed,nano。我们可以在编辑器中执行shell命令。

# 进入vim vim # 在vim命令行模式下输入 :set shell=/bin/bash :shell

如果成功,你将获得一个普通的bash shell。

方法二:利用环境变量和已有命令即使PATH被重置,一些内建命令或全路径命令可能仍可用。尝试:

echo $SHELL # 或者尝试调用其他已知的shell /bin/sh /bin/dash

如果ssh命令本身可用(因为它可能是用绝对路径调用的),甚至可以尝试通过ssh连接到本地来获得一个新会话:

ssh jerry@localhost -p 7744 # 输入密码,有时新会话可能不是rbash。

方法三:利用脚本执行如果允许执行某些语言解释器,如python,perl,php,可以直接生成一个shell。

python -c 'import pty; pty.spawn("/bin/bash")' perl -e 'exec "/bin/bash";'

在DC-2中,通常使用vi逃逸是有效的。成功逃逸后,使用whoamiid命令确认当前用户身份和权限。你会发现jerry是一个普通用户,权限很低。

4. 权限提升与横向移动

拿到一个低权限shell后,我们的目标很明确:获取更高权限(通常是root),或者寻找其他用户的敏感信息(横向移动)。

4.1 系统内部信息收集

在低权限shell下,我们需要再次进行信息收集,但这次是针对系统内部。

# 查看当前用户可执行的sudo命令(非常重要!) sudo -l # 查看系统版本、内核信息 uname -a cat /etc/os-release # 查看运行的服务和进程 ps aux # 查看计划任务 crontab -l ls -la /etc/cron* # 查看具有SUID/SGID权限的特殊文件(提权重点) find / -type f -perm -4000 -o -perm -2000 2>/dev/null # 查看当前用户的家目录下是否有敏感文件 ls -la ~/ cat ~/.bash_history cat ~/.ssh/id_rsa # 查看是否有私钥 # 查看其他用户的家目录(如果可读) ls -la /home/

执行sudo -l是重中之重。在DC-2中,你可能会发现用户jerry被允许以tom用户的身份,无需密码运行某个特定的命令,比如/usr/bin/git。这为我们提供了横向移动到tom用户的跳板。

4.2 利用Git进行横向移动

如果sudo -l显示如下:

User jerry may run the following commands on dc-2: (tom) NOPASSWD: /usr/bin/git

这意味着jerry可以以tom的身份执行git命令,且不需要输入tom的密码。

Git本身是一个版本控制工具,但它可以在执行时调用其他命令。我们可以利用githelp--exec-path参数来逃逸,并启动一个shell。

sudo -u tom git -p help

git调用分页器(如less)显示帮助信息时,在less界面中,我们可以输入!后跟一个命令来执行。输入:

!/bin/bash

或者,更直接地利用git执行命令:

sudo -u tom git help config # 在帮助页面,同样输入 !/bin/bash

如果成功,你将获得一个以tom用户身份运行的bash shell。使用whoami确认,现在你应该是tom了。

4.3 进一步的信息收集与最终提权

切换到tom用户后,重复内部信息收集步骤。

whoami id sudo -l ls -la /home/tom cat /home/tom/*.txt # 寻找flag或提示

检查tom的家目录,你可能会发现第一个flag文件(flag1.txt),以及一些提示。同时,再次运行sudo -l,你可能会发现tom用户被允许以root身份运行某些命令。

在DC-2的经典设置中,tom可能被允许以root身份无密码运行/usr/bin/vi/usr/bin/vim。这是Linux系统上一个非常经典的提权方法。

利用Vi/Vim提权到Root如果sudo -l显示:

User tom may run the following commands on dc-2: (root) NOPASSWD: /usr/bin/vi

那么,我们可以通过vi编辑器来启动一个具有root权限的shell。

sudo vi /tmp/test # 进入vi编辑器后,在命令行模式输入 :!bash # 或者 :shell

按下回车,你就获得了一个root权限的shell!输入whoami,现在应该是root

另一种方法:利用Vi写入文件如果上述方法不行,还可以利用vi写入一个具有SUID权限的bash副本。

sudo vi /tmp/rootbash # 在vi中,输入以下内容(这是/bin/bash的二进制代码,可以通过`which bash`找到路径,这里假设是/bin/bash) :r! which bash # 或者直接输入 :!cp /bin/bash /tmp/rootbash # 退出vi后,给文件添加SUID权限 sudo chmod +s /tmp/rootbash # 然后执行 /tmp/rootbash -p # `-p` 参数是为了保留特权模式

4.4 获取最终Flag与清理痕迹

成为root后,你就可以畅游整个系统了。最终的flag(比如flag3.txt或final.txt)通常放在/root目录下。

cd /root ls -la cat flag*.txt cat final*.txt

恭喜你,此时你应该看到了最终的胜利信息。

重要心得:在实战渗透测试或CTF比赛中,拿到flag不是终点。作为一个负责任的测试者,清理痕迹是职业素养的体现。你需要删除或还原你修改过的文件(如/tmp/rootbash),清除命令历史(history -c并清空~/.bash_history文件),并退出所有打开的会话。但在DC-2这样的练习靶场中,为了下次练习,通常我们不做清理,直接关闭虚拟机即可。

5. 技术要点复盘与深度解析

走完整个流程,我们来回溯一下其中涉及的关键技术点和可以深挖的原理。

5.1 信息收集的层次与工具链

信息收集不是一次性动作,而是分层、迭代的过程:

  1. 网络层:使用netdiscover,arp-scan,nmap发现主机和开放端口。nmap的脚本引擎(-sC)能提供许多有价值的信息,如HTTP标题、robots.txt等。
  2. 应用层:针对Web服务,使用gobuster,dirb进行目录爆破;针对特定CMS(如WordPress),使用wpscan进行专项扫描。工具的选择取决于服务类型。
  3. 系统层:在获得shell后,使用sudo -l,find,uname,ps等命令收集系统配置、用户权限、运行进程等信息。

这些工具的输出需要交叉验证。例如,nmap扫出的服务版本,需要与漏洞数据库(如Exploit-DB)中的记录进行比对,寻找已知漏洞。

5.2 漏洞利用的逻辑:从可能性到可行性

DC-2的渗透路径清晰地展示了一种逻辑链条:

  1. 弱密码爆破:利用枚举到的用户名和弱密码字典,成功爆破出Web或SSH的凭据。这在现实中对应着员工使用简单密码、默认密码或常见密码组合的安全隐患。
  2. 配置不当提权sudo -l显示的权限配置是安全的关键。允许低权限用户以高权限身份运行特定命令(如git,vi),且无需密码,是典型的配置错误(Misconfiguration)。攻击者寻找的就是这类“合法”的路径进行权限提升。
  3. 受限环境逃逸:rbash是一种安全机制,但实现不严或配置不当就会存在逃逸方法。这要求测试者不仅知道工具的使用,还要理解Shell和环境的基本原理。

这个链条中,任何一个环节断掉(例如,密码足够强,sudo配置正确),攻击就会受阻。因此,防御也需要层层设防。

5.3 常见问题与排查技巧实录

在实际操作DC-2或类似环境时,你可能会遇到以下问题及解决方案:

问题1:扫描不到靶机IP。

  • 排查:确认攻击机和靶机在同一网络模式(NAT/仅主机)下。检查虚拟机网络设置,确保网卡已连接。在靶机内使用ip addrifconfig命令查看其IP,并与攻击机网段对比。
  • 技巧:在VMware中,可以尝试将靶机网络模式先改为“桥接”,获取IP后再改回“NAT”,有时能解决网络初始化问题。

问题2:能ping通靶机,但无法访问Web页面(80端口)。

  • 排查:首先用nmap -p 80 靶机IP确认端口是否真的开放。如果开放,极有可能是虚拟主机问题,需要修改攻击机的hosts文件。
  • 技巧:使用curl -v http://靶机IP查看详细的HTTP请求和响应头,响应头里的Location字段可能会直接告诉你重定向到了哪个域名。

问题3:WPScan枚举用户失败或速度慢。

  • 排查:检查网络连接。WPScan默认会使用API请求WordPress漏洞数据库,国内网络可能不稳定。
  • 技巧:使用--disable-tls-checks跳过TLS检查,或使用--enumerate u --force强制枚举。也可以使用--wp-content-dir参数指定自定义的wp-content目录路径。

问题4:SSH登录被拒绝(Permission denied)。

  • 排查:确认端口号是否正确(-p 7744)。确认用户名和密码是否正确(注意大小写)。查看靶机SSH服务日志(/var/log/auth.log),但需要已有权限)。
  • 技巧:使用hydra对SSH进行爆破时,命令格式为:hydra -l 用户名 -P 字典文件 ssh://靶机IP:端口。注意协议指定为ssh://

问题5:rbash逃逸方法都失败了。

  • 排查:当前的rbash可能被配置得非常严格,连vipython都不可用。
  • 技巧:尝试更冷门的方法。比如,如果ssh命令可用,可以尝试ssh jerry@localhost -t /bin/bash。或者,检查是否有scpftp等命令可用,尝试将外部工具上传到可写目录(如/tmp)再执行。也可以检查环境变量,看看是否有通过LD_PRELOAD等机制注入的可能。

问题6:sudo -l 需要输入当前用户密码,而你不知道。

  • 排查:这说明jerrytomsudo权限配置是需要密码的。这不是一条可行的提权路径。
  • 技巧:回归到其他提权方法,如仔细分析具有SUID权限的文件(find / -perm -4000 2>/dev/null),检查内核版本是否存在本地提权漏洞(使用uname -a然后搜索Exploit-DB),或者查看计划任务、系统服务等。

6. 防御视角下的安全加固建议

通过攻击过程,我们可以从防御者角度总结出加固系统的方法:

  1. 强化身份认证

    • 禁用或重命名默认账户:如WordPress的admin
    • 实施强密码策略:强制使用长密码、混合字符,并定期更换。禁用常见弱密码。
    • 启用多因素认证(MFA):对于SSH和关键Web应用后台,尽可能启用MFA。
    • 更改默认端口:如将SSH的22端口改为其他端口,能减少大量自动化扫描和攻击。
  2. 最小权限原则

    • 精细化配置sudo:严格审查sudoers文件。避免使用NOPASSWD标签,除非绝对必要。允许用户运行的命令应尽可能具体,避免使用通配符或允许运行shell(如/bin/bash)、编辑器(如vi)。
    • 使用rbash需谨慎:如果使用rbash限制用户,必须确保配置完整,禁用所有可能的逃逸途径(如编辑器、特定解释器)。
  3. 系统与服务加固

    • 及时更新:保持操作系统、Web服务器(Apache/Nginx)、CMS(WordPress)及其插件/主题的及时更新,修补已知漏洞。
    • 删除不必要服务:关闭非必需的网络服务。
    • 文件权限检查:定期审计具有SUID/SGID权限的文件,移除不必要的特权设置。
  4. 网络与监控

    • 网络隔离:将重要服务器置于内部网络,通过跳板机访问。
    • 部署入侵检测系统(IDS):如Snort,监控异常网络流量和攻击行为。
    • 集中日志审计:收集并分析系统日志(如/var/log/auth.log,/var/log/apache2/access.log),及时发现暴力破解、异常登录等行为。

DC-2靶场就像一本生动的教科书,它把多个中低危的安全问题串联起来,形成了一个足以导致系统沦陷的高危攻击链。完成一次渗透不是终点,理解每一步背后的原理,并由此推及防御策略,才是学习和练习的真正价值所在。在实战中,情况会更复杂,没有按部就班的剧本,但扎实的基础、清晰的思路和耐心的信息收集,永远是渗透测试员最可靠的武器。

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

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

立即咨询