
Exploit PoC pour Snipe-IT CVE-2025-59712 et CVE-2025-59713
Ce PoC fournit un script automatisé pour exploiter CVE-2025-59712 (XSS dans l'en-tête User-Agent) et CVE-2025-59713 (désérialisation non sécurisée).
Ces deux vulnérabilités ont été découvertes par Synacktiv lors de travaux de recherche en sécurité sur le logiciel Snipe-IT. Snipe-IT est un système open-source de gestion des actifs basé sur Laravel, conçu pour aider les organisations à suivre et gérer leurs actifs physiques et numériques.
Une analyse technique est disponible dans l'avis de sécurité dédié sur le site de Synacktiv.
Ce script fournit trois sous-commandes, correspondant aux modes d'exploitation : xss, rce et fullchain.
Cette sous-commande exploite CVE-2025-59712, qui permet à un utilisateur à faibles privilèges d'injecter du JavaScript arbitraire dans la page HTML rendue lors de l'appel à la route /reports/activity. Cette action ne peut être effectuée que par un administrateur, ou un utilisateur disposant des droits de visualisation explicites pour les rapports. L'injection est possible en raison d'un assainissement incorrect du champ User-Agent lorsqu'un utilisateur met à jour ses informations de profil.
Pour ce faire, il se connecte d'abord en tant qu'utilisateur à faibles privilèges, puis injecte le code JavaScript défini dans le fichier fourni via l'option --javascript.
$ 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]
Au cours de la recherche en sécurité, les tests ont été effectués sur une version de Snipe-IT qui affichait, par défaut, le champUser-Agentdans lequel le JavaScript malveillant est injecté. Depuis le commit 10e5d88, la propriétéUser-Agentn'est plus affichée par défaut lors du rendu de la table des journaux d'actions. L'administrateur qui déclenchera le XSS doit donc avoir coché la caseUser-Agentdans les options d'affichage pour les versions de Snipe-IT postérieures à ce commit.
Cette sous-commande exploite CVE-2025-59713, qui permet une exécution de code à distance lorsque les identifiants d'un administrateur ou super-administrateur sont connus. Pour ce faire, les étapes suivantes sont effectuées :
db-dumps/mysql-snipeit.sql, qui créent un nouveau champ personnalisé et modifient le dernier journal d'action avec un objet JSON contenant la pop chain Laravel lors de la restauration.[!TIP] Par défaut, Snipe-IT inclut le fichier
.envdans la sauvegarde. Si le script le détecte, la valeur deAPP_KEYest affichée et le fichier.envest enregistré dans le répertoire./output(un emplacement personnalisé pour ce fichier peut être spécifié avec--output-dir).
[!CAUTION] Restaurer une sauvegarde déconnecte tous les utilisateurs connectés à l'instance.
/api/v1/reports/activity est appelée, ce qui déclenche la désérialisation et exécute la pop chain Laravel.$ python3 exploit.py rce --help
Usage: exploit.py rce [OPTIONS]
Execute RCE attack only (requires existing admin account)
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --admin-user -au TEXT Admin username [required] │
│ * --admin-pass -ap TEXT Admin password [required] │
│ --output-dir -od PATH Output dir for .env file [default: /home/ninja/Téléchargements/snipe-it-advisory/exploit/output] │
│ --shell-ip -si TEXT Reverse shell IP address │
│ --shell-port -sp INTEGER Reverse shell port │
│ --command -c TEXT Custom command (overrides reverse shell) │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯