HackTheBox-Pterodactyl
このまま地平線を
就这样直接
追い越してやるんだ
超越地平线吧
最前線飛ばせ僕たちは
在最前线飞驰的我们
星もない夜
在星光黯淡的夜晚
ただ東を目指して行く
只是一味的奔向东方
靶机ip:10.129.252.208
难度:中等
涉及内容:
- 信息收集 (Reconnaissance):
- 端口扫描与服务枚举 (Nmap)
- Web 子域名爆破 (Gobuster/VHost enumeration)
- Web 目录扫描 (Dirsearch)
- 开源软件版本指纹识别与漏洞检索 (Changelog 分析)
- Web 漏洞利用 (Web Exploitation):
- CVE-2025-49132: Pterodactyl Panel 信息泄露与利用
- PHP-PEAR 利用: 利用
pearcmd配合config-create进行本地文件包含/写入 (LFI to RCE)
- 后渗透与横向移动 (Post-Exploitation & Lateral Movement):
- 数据库枚举 (MySQL/MariaDB)
- 哈希提取与离线破解 (John the Ripper - Bcrypt)
- 凭据复用 (Credential Stuffing via SSH)
- 权限提升 (Privilege Escalation):
- 系统环境枚举 (LinPEAS/OS Release)
- CVE-2025-6018: PAM 环境变量配置错误导致会话伪装
- CVE-2025-6019: libblockdev/udisks 在 XFS Resize 操作中的不安全挂载漏洞
端口扫描
1 | |
访问80端口,提示重定向到pterodactyl.htb。

提示还有一个子域名play.pterodactyl.htb
那就顺便把子域名爆破也做了。
1 | |
1 | |
dirsearch扫一下目录。
1 | |
访问/changelog.txt
1 | |
其中有两个重要线索。
第一个是安装了Pterodactyl Panel v1.11.10,该版本存在CVE-2025-49132
CVE-2025-49132 — Pterodactyl Panel 未授权远程代码执行漏洞深度研究报告 - FreeBuf网络安全行业门户
第二个是php开启了PHP-PEAR,在phpinfo页面中可以更详细的展示到,这也为我们之后的rce埋下了伏笔。
提一下Pterodactyl Panel,这是一个开源的游戏服务器管理面板,可以用在泰拉瑞亚,minecraft等游戏中。
访问panel.pterodactyl.htb,发现是面板的登录界面。

既然之前已经发现了版本为 v1.11.10,那么可以利用网上现成的poc获取凭据。
63square/CVE-2025-49132: PoCs for CVE-2025-49132
1 | |
我们获取到了一组mysql的登录凭据
1 | |
另外,我们可以利用pearcmd配合config-create写webshell进去。
在利用 dump-creds.py 获取数据库凭据的同时,通过 PHPINFO 页面确认其开启了 register_argc_argv 选项。这为利用 PHP 的 PEAR 命令行工具 (pearcmd.php) 进行远程代码执行提供了条件。
此攻击利用了 PHP 在特定配置下处理 URL 查询字符串 (Query String) 的机制,结合本地文件包含 (LFI) 漏洞实现。
- RFC 3875 (CGI 规范) 与参数注入: 根据 RFC 3875 Section 4.4,当 HTTP 请求的查询字符串(Query String)中不包含未编码的等号(
=)时,CGI 接口会将查询字符串视作命令行参数传递给后端解释器。 在 URL 中,+号被解码为空格。因此,请求?+config-create+...会被 PHP 解释器解析为命令行参数:config-create ...。- 关键配置
register_argc_argv: PHP 配置文件 (php.ini) 中的register_argc_argv = On是此漏洞的先决条件。当开启时,PHP 会将接收到的查询字符串参数填充到全局变量$argc(参数数量) 和$argv(参数数组) 中。- 利用
pearcmd.php写入文件:pearcmd.php是 PEAR 包管理器的命令行入口。它默认存在于 Docker 容器的/usr/local/lib/php/目录下。该脚本会读取$argv中的参数并执行相应操作。 我们利用 PEAR 的config-create指令,该指令原本用于创建配置文件,语法为:config-create <root_path> <filename>通过构造恶意的<root_path>参数(包含 PHP 代码),我们可以强制 PEAR 将恶意代码写入到 Web 目录下的文件中。
这里需要注意,写马的路径为/var/www/pterodactyl/public,方便我们直接访问。
1 | |
1 | |
那么现在可以反弹shell了。
1 | |
1 | |
拿到shell后用我们刚刚获得的数据库凭据探测有效信息
1 | |
1 | |
1 | |
拿到了两个用户名以及对应的哈希,准备破解。
1 | |
其中用户phileasfogg3的哈希被成功破解
1 | |
使用ssh尝试登录,成功登录到用户phileasfogg3
1 | |
上传linpeas准备枚举可用提权文件。
经过分析,该系统为
1 | |
可用CVE-2025-6018 & CVE-2025-6019组合提权
Linux本地提权漏洞利用链 (CVE-2025-6018、CVE-2025-6019) 安全风险通告 - 安全内参 | 决策者的网络安全知识库
双漏洞链一击拿下Root:CVE-2025-6018/CVE-2025-6019 横扫主流Linux - FreeBuf网络安全行业门户
漏洞链概览 (Privilege Escalation Chain)
攻击者利用 openSUSE 特有的两个漏洞组合,从普通 SSH 用户权限提升至 Root 权限。
1. CVE-2025-6018:PAM 配置错误 (权限伪装)
- 原理: openSUSE 的 PAM(可插拔认证模块)配置存在缺陷,允许通过 SSH 登录的用户利用
~/.pam_environment文件设置特定的环境变量。- 利用方式: 攻击者通过注入环境变量,欺骗 PolicyKit(polkit)权限管理系统,使其通过
allow_active策略检查。- 核心影响: 将远程会话伪装成本地会话。通常
allow_active权限仅保留给物理登录(坐在显示器前)的用户。一旦绕过此限制,SSH 用户就能执行通常被禁止的高权限 D-Bus 操作(例如挂载磁盘或管理系统服务)。2. CVE-2025-6019:libblockdev/udisks 不安全挂载 (执行提权)
- 原理:
udisks服务在处理 XFS 文件系统的大小调整(resize) 操作时存在逻辑漏洞。当系统为了调整大小而临时挂载文件系统时,未强制添加nosuid挂载选项。- 利用方式:
- 攻击者创建一个包含 SUID Root Shell(如设置了 SUID 位的
/bin/bash副本)的恶意 XFS 文件系统镜像。- 利用 CVE-2025-6018 获取的 PolicyKit 权限,触发 udisks 对该镜像进行 “Resize” 操作。
- 系统将该镜像挂载(且未禁用 SUID)。
- 核心影响: 允许 SUID 提权。攻击者可以直接运行镜像中预埋的 SUID 二进制文件,从而获得 Root Shell。
攻击链逻辑总结
- 突破访问控制 (CVE-2025-6018):通过 PAM 漏洞,让 SSH 远程用户获得类似“本地物理用户”的 PolicyKit 权限,从而有权调用 udisks 服务。
- 执行提权负载 (CVE-2025-6019):利用 udisks 在处理 XFS Resize 时未禁用 SUID 的漏洞,挂载恶意磁盘并运行其中的 SUID 程序,最终拿到 Root 权限。
首先进行提权前的准备。创建pam环境文件并将allow_active设置为yes
1 | |
退出ssh重进以启动设置
1 | |
第一步:身份伪装 (CVE-2025-6018)
核心问题:PAM 配置允许不可信的环境变量注入。
背景: 在 Linux 中,
polkit(PolicyKit) 用于细粒度的权限控制。许多高权限操作(如挂载磁盘)默认只允许 Active(活跃) 且 Local(本地) 的会话执行。SSH 远程登录通常被视为 “Inactive” 或 “Remote”,因此无权调用udisks的某些 D-Bus 接口。漏洞原理: openSUSE 的 PAM 配置错误地允许用户通过
~/.pam_environment文件设置关键的环境变量 。攻击实施:
攻击者在
phileasfogg3的家目录写入配置 :Bash
1
2XDG_SEAT=seat0 # 伪装成物理终端座位
XDG_VTNR=1 # 伪装虚拟终端号效果: 重新登录 SSH 后,
systemd-logind读取这些变量,错误地将当前的远程 SSH 会话判定为 “Seat=seat0” 和 “Active=yes” 。结果: 攻击者绕过了
polkit的限制,现在有权限调用系统级的 D-Bus 消息,包括udisks2。
下载网上的公开poc
guinea-offensive-security/CVE-2025-6019
选择本地模式编译恶意镜像
记得要先下载缺失的包
1 | |
1 | |
将镜像上传到受害机。
如果嫌上传速度太慢可以先打包成zip再上传。
1 | |
上传花了有快一个小时,还好是复盘性质的wp。实战要是边打边写那真抓瞎了。
第二步:执行提权 (CVE-2025-6019)
核心问题:UDisks 在 XFS Resize 操作中未禁用 SUID。
- 背景:
nosuid挂载选项用于防止挂载的文件系统中的 setuid 二进制文件以其所有者权限执行。通常,非特权用户挂载磁盘时,系统会强制加上nosuid。- 漏洞原理:
libblockdev或udisks在处理 XFS 文件系统扩容 (Resize) 请求时存在逻辑漏洞。为了调整文件系统大小,服务需要临时挂载该设备。但在执行此挂载时,未强制添加nosuid参数 。- 攻击实施:
- 准备: 攻击者在本地制作了一个恶意的 XFS 镜像文件 (
xfs.image) ,并在其中放置了恶意的 SUID 程序(或者如 WP 脚本所示,准备好环境等待挂载)。- 触发: 攻击者通过 D-Bus 向
UDisks2发送Filesystem.Resize指令 。由于 CVE-2025-6018 已通过,此请求被许可。- 竞态条件 (Race Condition): 系统会临时挂载该镜像(带 SUID 权限)。WP 中的脚本利用这个短暂的窗口,运行镜像内的恶意程序或利用挂载点,执行
chmod u+s /bin/bash。
上传完使用脚本提权
1 | |
1 | |
注:脚本逻辑是利用
/tmp/blockdev*/bash(挂载点内的 bash) 来执行命令。因为挂载没开 nosuid,这个 bash 如果预先被设为 suid root,它执行的 chmod 命令就会以 root 权限运行。
攻击流程:Internet -> HTTP (80) -> Info Leak (Laravel) -> MySQL Creds -> LFI (PEAR) -> RCE (wwwrun) -> DB Dump -> SSH (phileasfogg3) -> PAM/UDisks Exploit -> ROOT.