Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-34234-Lab — Laboratorio Docker local que demuestra la CVE-2026-34234 RCE no autenticada en el instalador web de CtrlPanel. Incluye contenedores vulnerables y parcheados, scripts PoC y análisis de causa raíz para investigación de seguridad y validación defensiva. | Kitploit
Herramientas/GitHubGitHub/rootdirective-sec/cve-2026-34234-lab
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubrootdirective-sec/cve-2026-34234-lab

CVE-2026-34234-Lab

Laboratorio Docker local que demuestra la CVE-2026-34234 RCE no autenticada en el instalador web de CtrlPanel. Incluye contenedores vulnerables y parcheados, scripts PoC y análisis de causa raíz para investigación de seguridad y validación defensiva.

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio
hace 2 mesesAún no revisado

CVE-2026-34234 - Laboratorio RCE del Instalador de CtrlPanel

Laboratorio Docker local para demostrar CVE-2026-34234 en CtrlPanel.

Este repositorio compara:

  • vuln: CtrlPanel 1.1.1 fijado por digest
  • patched: CtrlPanel 1.2.0 fijado por digest

El laboratorio es solo local y vincula servicios a 127.0.0.1.


Resumen

CVE-2026-34234 es un RCE no autenticado en el instalador web de CtrlPanel.

El problema es causado por dos errores encadenados:

  1. Los manejadores de formularios del instalador eran accesibles antes de la compuerta install.lock.
  2. La entrada del instalador se interpolaba en cadenas de comandos de shell.

En este laboratorio, el contenedor vulnerable ejecuta un comando de prueba inofensivo y escribe su salida dentro del contenedor. El contenedor parcheado recibe la misma solicitud pero no crea el archivo de prueba.

Resultado esperado:

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

Causa Raíz

1. Ejecución vulnerable de shell en 1.1.1

Archivo original vulnerable:

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

Código upstream relevante en 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'", ...);
}

Problema:

  • run_console() acepta una cadena de comando de shell.
  • Esa cadena se pasa a bash -c.
  • Los valores del instalador controlados por el usuario pueden formar parte de esa cadena de comando.
  • Los metacaracteres de shell pueden cambiar la estructura del comando.

2. Ruta de formulario del instalador vulnerable

Archivo original vulnerable:

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

Comportamiento upstream relevante en 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'", ...);

Problema:

  • url, key y clientkey se originan en los datos POST del instalador.
  • Los valores se incrustan en cadenas de comandos de shell.
  • El endpoint del instalador es accesible sin autenticación.

3. Orden de la compuerta del instalador

El aviso indica que public/installer/index.php verificaba install.lock solo después de cargar/ejecutar la lógica del formulario del instalador. Eso hacía que los manejadores del instalador fueran accesibles incluso en instancias ya instaladas.


Parche / Corrección

1. Verificación temprana del bloqueo del instalador

La corrección mueve la verificación de install.lock antes de que se carguen los manejadores de formularios.

Comportamiento parcheado:

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

2. Evitar la ejecución de cadenas de shell

Archivo parcheado original:

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

Código upstream relevante en 1.2.0:

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

Por qué esto soluciona el problema:

  • run_console() ahora acepta un array estilo argv.
  • El comando ya no se compone como una sola cadena de shell.
  • La sintaxis de payload como $() permanece como entrada literal en lugar de sintaxis de shell.

El comportamiento del formulario parcheado en 1.2.0 usa ejecución de comandos estilo array:

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], ...);

Diseño del Laboratorio

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

Servicios:

  • vuln: CtrlPanel real 1.1.1
  • patched: CtrlPanel real 1.2.0
  • fake-api: API falsa local de Pterodactyl usada solo para satisfacer las comprobaciones del instalador
  • mysql_vuln / mysql_patched: instancias separadas de MariaDB
  • redis_vuln / redis_patched: instancias separadas de Redis

El laboratorio no modifica el código fuente de la aplicación CtrlPanel.

Los Dockerfiles solo envuelven el entrypoint original del contenedor para normalizar los permisos de ejecución de Docker Desktop para:

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

Después de corregir los permisos, el wrapper ejecuta el entrypoint original del producto.


Diseño del PoC

PoC principal:

root@kitploit:~
poc/poc_http_only.py

Propiedades:

  • Envía solo HTTP POST
  • No usa docker exec
  • No inspecciona contenedores
  • No inicia reverse shells
  • Usa solo comandos inofensivos: id, whoami, hostname

Script auxiliar:

root@kitploit:~
poc/poc_lab.py

Propósito:

  • Envía la misma solicitud HTTP
  • Verifica la prueba dentro de los contenedores usando docker compose exec
  • Diseñado solo para demostración y pruebas de regresión

Archivo de prueba dentro del contenedor de la aplicación:

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

Ejecutar

Iniciar desde un estado limpio del laboratorio:

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

Esperar hasta que los contenedores de la aplicación estén activos, luego ejecutar:

root@kitploit:~
python3 poc/poc_lab.py

Salida esperada:

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

Prueba Manual Solo HTTP

Enviar el PoC solo HTTP al objetivo vulnerable:

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

Verificar la prueba manualmente:

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

Prueba esperada:

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

Ejecutar la misma solicitud contra el parcheado:

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

Verificar el comportamiento parcheado:

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"'

Esperado:

root@kitploit:~
no proof file

Limpieza

Eliminar contenedores, redes y volúmenes del laboratorio:

root@kitploit:~
docker compose down -v

Notas

  • Este laboratorio es solo para investigación de seguridad local.
  • No ejecute el PoC contra sistemas que no posea o para los que no tenga permiso de prueba.
  • La prueba está intencionalmente limitada a la salida de comandos locales dentro del contenedor.
  • Los servicios vulnerable y parcheado usan bases de datos e instancias de Redis separadas.
  • La API falsa existe solo para emular las respuestas mínimas de la API de Pterodactyl requeridas por el flujo del instalador.

Aviso Legal

Este repositorio se proporciona únicamente para investigación educativa en seguridad y validación defensiva.

Todas las demostraciones están diseñadas para ejecutarse dentro del entorno de laboratorio Docker local proporcionado. La prueba de concepto evita acciones destructivas, persistencia, robo de credenciales, exfiltración de datos y orientación al mundo real.

No use este proyecto contra ningún sistema sin autorización explícita. El autor no es responsable por el mal uso o daños derivados de este material.


Referencias

  • GitHub Security Advisory: https://github.com/Ctrlpanel-gg/panel/security/advisories/GHSA-jmhr-q9q5-fqwh
  • CVE Record / NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-34234
  • Patched release: https://github.com/Ctrlpanel-gg/panel/releases/tag/1.2.0
  • Upstream repository: https://github.com/Ctrlpanel-gg/panel
Descargar herramienta