
Snipe-IT PoC-Exploit für CVE-2025-59712 und CVE-2025-59713
Dieses PoC stellt ein automatisiertes Skript zur Verfügung, um CVE-2025-59712 (XSS im User-Agent-Header) und CVE-2025-59713 (unsichere Deserialisierung) auszunutzen.
Diese beiden Sicherheitslücken wurden von Synacktiv im Rahmen einer Sicherheitsforschung an der Snipe-IT-Software entdeckt. Snipe-IT ist ein Open-Source-Asset-Management-System, das auf Laravel basiert und Organisationen dabei helfen soll, ihre physischen und digitalen Assets zu verfolgen und zu verwalten.
Eine technische Beschreibung findet sich im entsprechenden Security Advisory auf der Synacktiv-Website.
Dieses Skript bietet drei Unterbefehle, die den Ausnutzungsmodi entsprechen: xss, rce und fullchain.
Dieser Unterbefehl nutzt CVE-2025-59712 aus, der es einem Benutzer mit niedrigen Berechtigungen erlaubt, beliebiges JavaScript in die HTML-Seite einzuschleusen, die beim Aufruf der Route /reports/activity gerendert wird. Dies kann nur von einem Administrator oder einem Benutzer mit expliziten Ansichtsberechtigungen für Berichte durchgeführt werden. Die Injektion ist aufgrund einer unzureichenden Bereinigung des User-Agent-Feldes möglich, wenn ein Benutzer seine Profilinformationen aktualisiert.
Dazu wird es sich zunächst als Benutzer mit niedrigen Berechtigungen anmelden und dann den JavaScript-Code injizieren, der in der über das --javascript-Flag angegebenen Datei definiert ist.
$ python3 exploit.py xss --help
Usage: exploit.py xss [OPTIONS]
Execute XSS attack only with custom JavaScript payload
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --login -l TEXT Low-privileged username [required] │
│ * --password -p TEXT Low-privileged password [required] │
│ * --new-name -n TEXT New name for low-privileged user [required] │
│ * --javascript -js TEXT Path to custom JavaScript file [required] │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[!IMPORTANT]
Während der Sicherheitsforschung wurden Tests mit einer Version von Snipe-IT durchgeführt, die standardmäßig dasUser-Agent-Feld anzeigte, in das das schädliche JavaScript injiziert wird. Seit dem Commit 10e5d88 wird dieUser-Agent-Eigenschaft standardmäßig nicht mehr angezeigt, wenn die Aktionsprotokolltabelle gerendert wird. Der Administrator, der die XSS auslöst, muss daher in den Ansichtsoptionen für Snipe-IT-Versionen nach diesem Commit das KontrollkästchenUser-Agentaktiviert haben.
Dieser Unterbefehl nutzt CVE-2025-59713 aus, der eine Remote-Code-Ausführung ermöglicht, wenn die Anmeldedaten eines Administrators oder Superadministrators bekannt sind. Dazu werden die folgenden Schritte ausgeführt:
db-dumps/mysql-snipeit.sql, die ein neues benutzerdefiniertes Feld erstellen und das letzte Aktionsprotokoll mit einem JSON-Objekt bearbeiten, das bei der Wiederherstellung die Laravel-Pop-Kette enthält.[!TIP] Standardmäßig enthält Snipe-IT die
.env-Datei im Backup. Wenn das Skript sie erkennt, wird derAPP_KEY-Wert angezeigt und die.env-Datei im Verzeichnis./outputgespeichert (ein benutzerdefinierter Speicherort für diese Datei kann mit--output-dirangegeben werden).
[!CAUTION] Das Wiederherstellen eines Backups trennt alle mit der Instanz verbundenen Benutzer.
/api/v1/reports/activity aufgerufen, was die Deserialisierung auslöst und die Laravel-Pop-Kette ausführt.$ python3 exploit.py rce --help
Usage: exploit.py rce [OPTIONS]
Execute RCE attack only (requires existing admin account)