Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-34234-Lab | Kitploit
工具/GitHubGitHub/rootdirective-sec/cve-2026-34234-lab
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试学习与教育实验室与实践
GitHubrootdirective-sec/cve-2026-34234-lab

CVE-2026-34234-Lab

查看仓库
2个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-34234 - CtrlPanel 安装程序 RCE 实验环境

用于演示 CtrlPanel 中 CVE-2026-34234 的本地 Docker 实验环境。

本仓库对比:

  • vuln:按摘要固定的 CtrlPanel 1.1.1
  • patched:按摘要固定的 CtrlPanel 1.2.0

该实验环境仅限本地使用,服务绑定到 127.0.0.1。


概述

CVE-2026-34234 是 CtrlPanel Web 安装程序中的一个未认证 RCE 漏洞。

该问题由两个串联利用的缺陷引起:

  1. 安装程序表单处理器在 install.lock 检查之前即可访问。
  2. 安装程序输入被拼接进 shell 命令字符串中。

在本实验环境中,存在漏洞的容器会执行一条无害的验证命令并将其输出写入容器内部。已修复的容器收到相同的请求,但不会创建验证文件。

预期结果:

root@kitploit:~
vulnerable => proof file created
patched    => no proof file

根因

1. 1.1.1 中存在漏洞的 shell 执行

原始存在漏洞的文件:

root@kitploit:~
public/installer/src/functions/shell.php

1.1.1 中相关的上游代码:

root@kitploit:~
function run_console(string $command, ...) {
    $path = dirname(__DIR__, 4);
    $handle = proc_open("cd '$path' && bash -c 'exec -a ServerCPP $command'", ...);
}

问题:

  • run_console() 接受单个 shell 命令字符串。
  • 该字符串会被传入 bash -c。
  • 用户可控的安装程序值可能成为该命令字符串的一部分。
  • shell 元字符可以改变命令结构。

2. 存在漏洞的安装程序表单路径

原始存在漏洞的文件:

root@kitploit:~
public/installer/src/forms/pterodactyl.php

1.1.1 中相关的上游行为:

root@kitploit:~
run_console("php artisan settings:set 'PterodactylSettings' 'panel_url' '$url'", ...);
run_console("php artisan settings:set 'PterodactylSettings' 'admin_token' '$key'", ...);
run_console("php artisan settings:set 'PterodactylSettings' 'user_token' '$clientkey'", ...);

问题:

  • url、key 和 clientkey 来源于安装程序的 POST 数据。
  • 这些值被嵌入到 shell 命令字符串中。
  • 安装程序端点无需认证即可访问。

3. 安装程序门控顺序

安全公告指出,public/installer/index.php 仅在加载/执行安装程序表单逻辑之后才检查 install.lock。这导致即使在已安装的实例上,安装程序处理器也可访问。


补丁 / 修复

1. 提前进行安装程序锁检查

修复将 install.lock 检查移到表单处理器加载之前。

修复后的行为:

root@kitploit:~
if (file_exists('../../install.lock')) {
    exit("The installation has been completed already. Please delete the File 'install.lock' to re-run");
}

2. 避免执行 shell 字符串

原始修复文件:

root@kitploit:~
public/installer/src/functions/shell.php

1.2.0 中相关的上游代码:

root@kitploit:~
function run_console(array $command, ...): string {
    $cwd = $cwd ?? $path;
    $handle = proc_open($command, $descriptors, $pipes, $cwd, null, $options);
}

为什么这能修复该问题:

  • run_console() 现在接受 argv 风格的数组。
  • 命令不再以单个 shell 字符串形式拼接。
  • 诸如 $() 之类的载荷语法会作为字面输入,而不是 shell 语法。

1.2.0 中的修复表单行为使用数组风格的命令执行:

root@kitploit:~
run_console(['php', 'artisan', 'settings:set', 'PterodactylSettings', 'panel_url', $url], ...);
run_console(['php', 'artisan', 'settings:set', 'PterodactylSettings', 'admin_token', $key], ...);
run_console(['php', 'artisan', 'settings:set', 'PterodactylSettings', 'user_token', $clientkey], ...);

实验环境设计

root@kitploit:~
127.0.0.1:8081 -> vulnerable CtrlPanel 1.1.1
127.0.0.1:8082 -> patched CtrlPanel 1.2.0
127.0.0.1:9100 -> fake Pterodactyl API

服务:

  • vuln:真实的 CtrlPanel 1.1.1
  • patched:真实的 CtrlPanel 1.2.0
  • fake-api:本地伪造的 Pterodactyl API,仅用于满足安装程序的检查
  • mysql_vuln / mysql_patched:独立的 MariaDB 实例
  • redis_vuln / redis_patched:独立的 Redis 实例

本实验环境不会修改 CtrlPanel 应用程序源代码。

Dockerfile 仅包装原始容器入口点,以规范化以下目录的 Docker Desktop 运行时权限:

root@kitploit:~
/var/www/html/storage
/var/www/html/bootstrap/cache

修复权限后,包装器会执行原始产品入口点。


PoC 设计

主要 PoC:

root@kitploit:~
poc/poc_http_only.py

特性:

  • 仅发送 HTTP POST 请求
  • 不使用 docker exec
  • 不检查容器内部
  • 不启动反向 shell
  • 仅使用无害命令:id、whoami、hostname

辅助脚本:

root@kitploit:~
poc/poc_lab.py

用途:

  • 发送相同的 HTTP 请求
  • 使用 docker compose exec 验证容器内的证明文件
  • 仅用于演示和回归测试

应用容器内的证明文件:

root@kitploit:~
/var/www/html/storage/logs/cve_2026_34234_proof.txt

运行

从干净的实验环境状态开始:

root@kitploit:~
docker compose down -v --remove-orphans
docker compose up -d --build

等待应用容器启动完成后,运行:

root@kitploit:~
python3 poc/poc_lab.py

预期输出:

root@kitploit:~
== Testing vulnerable ==
proof_exists: True
result: PASS expected_proof=True

== Testing patched ==
proof_exists: False
result: PASS expected_proof=False

[+] Expected result reached:
    vulnerable => proof file created
    patched    => no proof file

手动 HTTP-only 测试

向存在漏洞的目标发送 HTTP-only PoC:

root@kitploit:~
python3 poc/poc_http_only.py --target http://127.0.0.1:8081

手动验证证明文件:

root@kitploit:~
docker compose exec vuln sh -lc 'cat /var/www/html/storage/logs/cve_2026_34234_proof.txt'

预期证明:

root@kitploit:~
uid=1000(laravel) gid=1000(laravel) groups=1000(laravel)
laravel
<container-hostname>

对已修复版本运行相同的请求:

root@kitploit:~
python3 poc/poc_http_only.py --target http://127.0.0.1:8082

验证已修复版本的行为:

root@kitploit:~
docker compose exec patched sh -lc 'test -f /var/www/html/storage/logs/cve_2026_34234_proof.txt && cat /var/www/html/storage/logs/cve_2026_34234_proof.txt || echo "no proof file"'

预期:

root@kitploit:~
no proof file

清理

删除容器、网络和实验卷:

root@kitploit:~
docker compose down -v

备注

  • 本实验环境仅供本地安全研究使用。
  • 请勿对您不拥有或未经授权测试的系统运行 PoC。
  • 证明文件有意仅限为容器内的本地命令输出。
  • 存在漏洞和已修复的服务使用独立的数据库和 Redis 实例。
  • 伪造 API 仅用于模拟安装程序流程所需的最低限度 Pterodactyl API 响应。

免责声明

本仓库仅用于教育性安全研究和防御性验证。

所有演示均旨在提供的本地 Docker 实验环境中运行。该概念验证避免破坏性操作、持久化、凭据窃取、数据外泄和针对现实系统的攻击。

未经明确授权,请勿对本项目用于任何系统。作者不对因使用本材料造成的误用或损害负责。


参考资料

  • GitHub 安全公告: https://github.com/Ctrlpanel-gg/panel/security/advisories/GHSA-jmhr-q9q5-fqwh
  • CVE 记录 / NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-34234
  • 已修复版本: https://github.com/Ctrlpanel-gg/panel/releases/tag/1.2.0
  • 上游仓库: https://github.com/Ctrlpanel-gg/panel
下载工具