Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-34234-Lab | Kitploit
Tools/GitHubGitHub/rootdirective-sec/cve-2026-34234-lab
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungLabs & Praxis
GitHubrootdirective-sec/cve-2026-34234-lab

CVE-2026-34234-Lab

Repository anzeigen
vor 2 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-34234 - CtrlPanel-Installer-RCE-Lab

Lokales Docker-Lab zur Demonstration von CVE-2026-34234 in CtrlPanel.

Dieses Repository vergleicht:

  • vuln: CtrlPanel 1.1.1, per Digest festgepinnt
  • patched: CtrlPanel 1.2.0, per Digest festgepinnt

Das Lab ist rein lokal und bindet Dienste an 127.0.0.1.


Zusammenfassung

CVE-2026-34234 ist eine nicht authentifizierte RCE im Web-Installer von CtrlPanel.

Das Problem wird durch zwei miteinander verkettete Fehler verursacht:

  1. Installer-Formularhandler waren vor der install.lock-Sperre erreichbar.
  2. Installereingaben wurden in Shell-Befehlsstrings interpoliert.

In diesem Lab führt der verwundbare Container einen harmlosen Proof-Befehl aus und schreibt dessen Ausgabe innerhalb des Containers. Der gepatchte Container empfängt dieselbe Anfrage, erstellt jedoch keine Proof-Datei.

Erwartetes Ergebnis:

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

Grundursache

1. Verwundbare Shell-Ausführung in 1.1.1

Verwundbare Originaldatei:

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

Relevanter Upstream-Code in 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'", ...);
}

Problem:

  • run_console() akzeptiert einen einzelnen Shell-Befehlsstring.
  • Dieser String wird an bash -c übergeben.
  • Vom Benutzer kontrollierte Installerwerte können Teil dieses Befehlsstrings werden.
  • Shell-Metazeichen können die Befehlsstruktur verändern.

2. Verwundbarer Installer-Formularpfad

Verwundbare Originaldatei:

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

Relevantes Upstream-Verhalten in 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'", ...);

Problem:

  • url, key und clientkey stammen aus den POST-Daten des Installers.
  • Die Werte werden in Shell-Befehlsstrings eingebettet.
  • Der Installer-Endpunkt ist ohne Authentifizierung erreichbar.

3. Reihenfolge der Installer-Sperre

Das Advisory besagt, dass public/installer/index.php install.lock erst nach dem Laden/Ausführen der Installer-Formularlogik prüfte. Dadurch waren Installer-Handler selbst auf bereits installierten Instanzen erreichbar.


Patch / Fix

1. Frühzeitige Installer-Sperrprüfung

Der Fix führt die install.lock-Prüfung aus, bevor die Formularhandler geladen werden.

Gepatchtes Verhalten:

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-String-Ausführung vermeiden

Gepatchte Originaldatei:

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

Relevanter Upstream-Code in 1.2.0:

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

Warum dies das Problem behebt:

  • run_console() akzeptiert nun ein Array im argv-Stil.
  • Der Befehl wird nicht mehr als einzelner Shell-String zusammengesetzt.
  • Payload-Syntax wie $() bleibt wörtliche Eingabe und wird nicht als Shell-Syntax interpretiert.

Das gepatchte Formularverhalten in 1.2.0 verwendet die Befehlsausführung im Array-Stil:

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

Aufbau des Labs

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

Dienste:

  • vuln: echtes CtrlPanel 1.1.1
  • patched: echtes CtrlPanel 1.2.0
  • fake-api: lokale Fake-Pterodactyl-API, die nur zur Erfüllung der Installer-Prüfungen dient
  • mysql_vuln / mysql_patched: separate MariaDB-Instanzen
  • redis_vuln / redis_patched: separate Redis-Instanzen

Das Lab verändert den Quellcode der CtrlPanel-Anwendung nicht.

Die Dockerfiles kapseln lediglich den ursprünglichen Container-Entrypoint, um die Laufzeitberechtigungen von Docker Desktop zu normalisieren:

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

Nach der Korrektur der Berechtigungen führt der Wrapper den ursprünglichen Produkt-Entrypoint aus.


PoC-Design

Primärer PoC:

root@kitploit:~
poc/poc_http_only.py

Eigenschaften:

  • Sendet ausschließlich HTTP-POST
  • Verwendet kein docker exec
  • Untersucht keine Container
  • Startet keine Reverse Shells
  • Verwendet nur harmlose Befehle: id, whoami, hostname

Hilfsskript:

root@kitploit:~
poc/poc_lab.py

Zweck:

  • Sendet dieselbe HTTP-Anfrage
  • Verifiziert den Proof in Containern mithilfe von docker compose exec
  • Nur für Demo- und Regressionstests vorgesehen

Proof-Datei im App-Container:

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

Ausführen

Starte mit einem sauberen Lab-Zustand:

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

Warte, bis die App-Container gestartet sind, und führe dann Folgendes aus:

root@kitploit:~
python3 poc/poc_lab.py

Erwartete Ausgabe:

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

Manueller HTTP-Only-Test

Sende den HTTP-Only-PoC an das verwundbare Ziel:

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

Verifiziere den Proof manuell:

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

Erwarteter Inhalt der Proof-Datei:

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

Sende dieselbe Anfrage an die gepatchte Instanz:

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

Verifiziere das gepatchte Verhalten:

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

Erwartet:

root@kitploit:~
no proof file

Bereinigung

Entferne Container, Netzwerke und Lab-Volumes:

root@kitploit:~
docker compose down -v

Hinweise

  • Dieses Lab ist ausschließlich für lokale Sicherheitsforschung gedacht.
  • Führe den PoC nicht gegen Systeme aus, die du nicht besitzt oder für die du keine Testberechtigung hast.
  • Der Proof ist bewusst auf die lokale Befehlsausgabe innerhalb des Containers beschränkt.
  • Die verwundbaren und gepatchten Dienste verwenden getrennte Datenbanken und Redis-Instanzen.
  • Die Fake-API dient ausschließlich dazu, die minimalen Pterodactyl-API-Antworten zu emulieren, die der Installer-Ablauf erfordert.

Haftungsausschluss

Dieses Repository wird ausschließlich zu Ausbildungszwecken, für Sicherheitsforschung und defensive Validierung bereitgestellt.

Alle Demonstrationen sind für die Ausführung in der bereitgestellten lokalen Docker-Lab-Umgebung vorgesehen. Der Proof-of-Concept vermeidet destruktive Aktionen, Persistenz, Diebstahl von Zugangsdaten, Datenexfiltration und Angriffe auf reale Systeme.

Verwende dieses Projekt nicht gegen ein System ohne ausdrückliche Genehmigung. Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die aus diesem Material entstehen.


Referenzen

  • GitHub Security Advisory: https://github.com/Ctrlpanel-gg/panel/security/advisories/GHSA-jmhr-q9q5-fqwh
  • CVE-Eintrag / NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-34234
  • Gepatchtes Release: https://github.com/Ctrlpanel-gg/panel/releases/tag/1.2.0
  • Upstream-Repository: https://github.com/Ctrlpanel-gg/panel
Tool herunterladen