
Genera archivos PDF de prueba maliciosos para pruebas de penetración, búsqueda de bug bounties y red teaming. Prueba SSRF, XSS, XXE, robo de credenciales NTLM y exfiltración de datos en visores de PDF, convertidores y aplicaciones web. Se integra con Burp Collaborator e Interact.sh.

Genera 67 archivos PDF maliciosos de prueba para probar devoluciones de llamada phone-home, SSRF, XSS, XXE, robo de credenciales NTLM y exfiltración de datos en visores de PDF, convertidores y aplicaciones web. Se puede usar con Burp Collaborator o Interact.sh
Se utiliza para pruebas de penetración, caza de bug bounty y/o red-teaming, etc. Creé esta herramienta porque necesitaba una herramienta para generar un montón de archivos PDF con varios enlaces. Solo con fines educativos y profesionales.
pip install -r requirements.txt python3 malicious-pdf.py burp-collaborator-url
La salida se escribirá en el directorio `output/` como: test1.pdf, test2.pdf, test3.pdf, etc.
### Opciones```
--output-dir DIR Directory to save generated PDF files (default: output/)
--no-credit Do not embed credit/attribution metadata in generated PDFs
--obfuscate LEVEL Obfuscation level (0-3):
0 = None (default)
1 = PDF name hex encoding + string octal/hex encoding
2 = Level 1 + JS bracket notation + javascript: URI case/whitespace obfuscation
3 = Level 2 + FlateDecode stream compression
Ejemplo con ofuscación:``` python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 2
Ofuscación máxima (el nivel 4 envuelve los payloads JS en un stub de decodificación base64, de modo que las llamadas API originales nunca aparecen como subcadenas literales):```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 4
/V, decodificador base64) burlan a los escáneres ingenuos de regex /JSCollab.isDocReadOnly (sondeo del sistema de archivos), app.plugIns (enumerar plugins instalados), app.viewerVersion (fingerprinting de versión)-O) pierden los objetos por completo. Ref: Especificación PDF ISO 32000 §7.5.7app.doc.getAnnots()[n].subject y eval. Ref: Julia Wolf: ofuscación de PDF mediante getAnnots()/Info (/Title, /Author). Recuperarla en tiempo de ejecución mediante info.Title en JS. Ref: trucos PDF de corkami/V de campos de formulario. Recuperarlos mediante en JS. Ref: | Archivo de prueba | Función | CVE/Referencia | Vector de ataque | Método | Impacto |
|---|
| test1.pdf | create_malpdf() | CVE-2018-4993 | Acceso a archivo externo | Acción /GoToE con ruta UNC | Devolución de llamada de red a través del sistema de archivos |
| test1_1.pdf | create_malpdf() | CVE-2018-4993 | Acceso a archivo externo | Acción /GoToE con URL HTTPS | Devolución de llamada de red a través de HTTPS |
| test2.pdf | create_malpdf2() | Envío de formulario XFA | Exfiltración de datos de formulario | Formulario XDP con evento de envío | Envío automático de formulario |
| test3.pdf | create_malpdf3() | Inyección de JavaScript | Ejecución de código | /OpenAction con app.openDoc() | Carga de documento externo |
| test4.pdf | create_malpdf4() | CVE-2019-7089 | Inyección XSLT | XFA con hoja de estilos XSLT externa | Devolución de llamada de ruta UNC |
| test5.pdf | create_malpdf5() | Investigación PDF101 | Acción URI | Tipo de acción /URI | Prefetch de DNS/solicitud HTTP |
| test6.pdf | create_malpdf6() | Investigación PDF101 | Acción de lanzamiento | /Launch con URL externa | Ejecución de recurso externo |
| test7.pdf | create_malpdf7() | Investigación PDF101 | PDF remoto | Acción /GoToR | Carga de PDF remoto |
| test8.pdf | create_malpdf8() | Investigación PDF101 | Envío de formulario | /SubmitForm con indicadores HTML | Envío de datos de formulario |
| test9.pdf | create_malpdf9() | Investigación PDF101 | Importación de datos | Acción /ImportData | Importación de datos externa |
| test10.pdf | create_malpdf10() | CVE-2017-10951 | Ejecución de JavaScript | Devolución de llamada this.getURL() de Foxit | Devolución de llamada de red mediante Foxit Reader |
| test11.pdf | create_malpdf11() | Prueba EICAR | Detección por antivirus | Cadena EICAR incrustada | Prueba de antivirus |
| test12.pdf | create_malpdf12() | CVE-2014-8453 | Exfiltración de datos FormCalc | Función Post() de XFA FormCalc | Exfiltración de datos de mismo origen con cookies |
| test13.pdf | create_malpdf13() | Inyección de solicitudes | Inyección de cabeceras CRLF | Envío XFA textEncoding CRLF | Manipulación de cabeceras HTTP |
| test14.svg | create_malpdf14() | Inyección de shell en ImageMagick | Inyección de shell mediante SVG/MSL | Atributo authenticate políglota SVG-MSL | Ejecución remota de código mediante ImageMagick |
| test15.pdf | create_malpdf15() | Especificación PDF | Inyección de cabeceras FormCalc | Post() de XFA FormCalc con cabeceras personalizadas | Inyección arbitraria de cabeceras HTTP |
| test16.pdf | create_malpdf16() | Especificación PDF | JavaScript mediante GotoE | /GoToE con URI javascript: | XSS en el navegador cuando el PDF se incrusta mediante <embed>/<object> |
| test17.pdf | create_malpdf17() | CVE-2014-8452 | Inyección XXE | Entidad externa en XMLData.parse() | Resolución de entidades externas XML |
| test18.pdf | create_malpdf18() | Investigación de PortSwigger | Inyección URI en anotaciones | Los paréntesis sin escapar inyectan una acción JS mediante la clave /A duplicada | XSS a través de la salida de PDF-Lib/jsPDF |
| test19.pdf | create_malpdf19() | Investigación de PortSwigger | Auto-ejecución PV | La anotación de pantalla /AA /PV dispara JS al hacerse visible la página | Ejecución automática de código (Acrobat) |
| test20.pdf | create_malpdf20() | Investigación de PortSwigger | Disparador de cierre PC | La anotación /AA /PC dispara JS al cerrar la página | Ejecución de código al cerrar (Acrobat) |
| test21.pdf | create_malpdf21() | Investigación de PortSwigger | Envío SubmitForm SubmitPDF | /SubmitForm con indicadores 256 envía el PDF completo | Exfiltración del contenido completo del PDF |
| test22.pdf | create_malpdf22() | Investigación de PortSwigger | Envío mediante JS submitForm() | this.submitForm() con cSubmitAs: "PDF" | Envío del contenido del PDF (Acrobat) |
| test23.pdf | create_malpdf23() | Investigación de PortSwigger | Inyección de botón de widget | Widget /Btn invisible que cubre la página, JS al hacer clic | Ejecución de código (Chrome/PDFium) |
| test24.pdf | create_malpdf24() | Investigación de PortSwigger | SSRF en campo de texto | Campo de widget /Tx con submitForm() POST | SSRF ciega mediante datos de formulario |
| test25.pdf | create_malpdf25() | Investigación de PortSwigger | Extracción de contenido | getPageNthWord() lee todo el texto y lo exfiltra | Exfiltración de texto renderizado |
| test26.pdf | create_malpdf26() | Investigación de PortSwigger | Disparador al pasar el ratón | La anotación /AA /E dispara JS al entrar el ratón | Ejecución de código al pasar el ratón (PDFium) |
| — | — | Eliminado | Duplicado de test3 (JS de OpenAction en Acrobat) + test23 (Widget Btn en Chrome) | — | |
| test28.pdf | create_malpdf28() | Investigación de PortSwigger | Secuestro de URL | Los paréntesis sin escapar inyectan una nueva acción /URI | Redirección al hacer clic mediante PDF-Lib/jsPDF |
| test29.pdf | create_malpdf29() | CVE-2024-4367 | Inyección de FontMatrix | La cadena FontMatrix de la fuente Type1 escapa de c.transform() | Ejecución arbitraria de JS en PDF.js (Firefox < 126) |
| test30.pdf | create_malpdf30() | Investigación PDF101 | Flujo XObject externo | El XObject de imagen obtiene datos de una URL remota mediante /FS /URL | Devolución de llamada silenciosa mediante el renderizado de página (sin acciones/JS) |
| test31.pdf | create_malpdf31() | Investigación PDF101 | Acción de hilo | /S /Thread con FileSpec remoto | Devolución de llamada de red mediante referencia de hilo |
| test32.pdf | create_malpdf32() | Investigación PDF101 | Lanzamiento con impresión | /Launch con /Win << /O /print >> fuerza la obtención remota | Devolución de llamada de red mediante operación de impresión |
| test33_1.pdf | create_malpdf33_1() | Investigación PDF101 | JS: this.submitForm() | Devolución de llamada de envío de formulario JS de Acrobat | Acrobat Reader |
| test33_2.pdf | create_malpdf33_2() | Investigación PDF101 | JS: this.getURL() | Devolución de llamada de obtención de URL JS de Acrobat | Acrobat Reader |
| test33_3.pdf | create_malpdf33_3() | Investigación PDF101 | JS: app.launchURL() | Devolución de llamada de lanzamiento de URL JS de Acrobat | Acrobat Reader |
| test33_4.pdf | create_malpdf33_4() | Investigación PDF101 | JS: app.media.getURLData() | Devolución de llamada de obtención de datos multimedia JS de Acrobat | Acrobat Reader |
| test33_5.pdf | create_malpdf33_5() | Investigación PDF101 | JS: SOAP.connect() | Conexión SOAP JS de Acrobat | Acrobat Reader |
| test33_6.pdf | create_malpdf33_6() | Investigación PDF101 | JS: SOAP.request() | Solicitud SOAP JS de Acrobat | Acrobat Reader |
| test33_7.pdf | create_malpdf33_7() | Investigación PDF101 | JS: this.importDataObject() | Importación de datos JS de Acrobat | Acrobat Reader |
| test33_8.pdf | create_malpdf33_8() | Investigación PDF101 | JS: app.openDoc() | Apertura de documento JS de Acrobat | Acrobat Reader |
| test33_9.pdf | create_malpdf33_9() | Investigación PDF101 | JS: fetch() | Devolución de llamada de API web (PDF.js/navegador) | Firefox/PDF.js |
| test33_10.pdf | create_malpdf33_10() | Investigación PDF101 | JS: XMLHttpRequest | Devolución de llamada de API web (PDF.js/navegador) | Firefox/PDF.js |
| test33_11.pdf | create_malpdf33_11() | Investigación PDF101 | JS: new Image() | Devolución de llamada de imagen de API web (PDF.js/navegador) | Firefox/PDF.js |
| test33_12.pdf | create_malpdf33_12() | Investigación PDF101 | JS: WebSocket | Devolución de llamada WebSocket de API web (PDF.js/navegador) | Firefox/PDF.js |
| test33_13.pdf | create_malpdf33_13() | Blog del 0-day de Adobe (abril de 2026) | JS: RSS.addFeed() | Devolución de llamada de fuente RSS JS de Acrobat | Acrobat Reader |
| test33_14.pdf | create_malpdf33_14() | Blog del 0-day de Adobe (abril de 2026) | JS: util.readFileIntoStream() + SOAP.request() | Lectura de archivo local + cadena de exfiltración (la ruta de error try/catch también hace devoluciones de llamada) | Acrobat Reader |
| test33_15.pdf | create_malpdf33_15() | Blog del 0-day de Adobe (abril de 2026) | Cargador JS por etapas en campo de formulario | Carga útil Base64 en el widget /Tx /V, decodificada mediante getField() + util.stringFromStream | Acrobat Reader |
| test34_1.pdf | create_malpdf34_1() | Investigación PDF101 | UNC: flujo XObject | XObject de imagen con ruta UNC | Robo NTLM mediante renderizado de página |
| test34_2.pdf | create_malpdf34_2() | Investigación PDF101 | UNC: GoToR | Acción /GoToR con FileSpec UNC | Robo NTLM mediante PDF remoto |
| test34_3.pdf | create_malpdf34_3() | Investigación PDF101 | UNC: Thread | Acción /Thread con FileSpec UNC | Robo NTLM mediante referencia de hilo |
| test34_4.pdf | create_malpdf34_4() | Investigación PDF101 | UNC: URI | Acción /URI con ruta UNC | Robo NTLM mediante acción URI |
| test34_5.pdf | create_malpdf34_5() | Investigación PDF101 | UNC: JS submitForm | this.submitForm() con ruta UNC | Robo NTLM mediante envío de formulario JS |
| test34_6.pdf | create_malpdf34_6() | Investigación PDF101 | UNC: JS getURL | this.getURL() con ruta UNC | Robo NTLM mediante obtención de URL JS |
| test34_7.pdf | create_malpdf34_7() | Investigación PDF101 | UNC: JS launchURL | app.launchURL() con ruta UNC | Robo NTLM mediante lanzamiento JS |
| test34_8.pdf | create_malpdf34_8() | Investigación PDF101 | UNC: JS SOAP | SOAP.connect() con ruta UNC | Robo NTLM mediante SOAP JS |
| test34_9.pdf | create_malpdf34_9() | Investigación PDF101 | UNC: JS openDoc | app.openDoc() con ruta UNC | Robo NTLM mediante apertura de documento JS |
| test35.pdf | create_malpdf35() | Investigación PDF101 | Diccionario de nombres | Disparador de auto-ejecución a nivel de catálogo /Names /JavaScript | Disparador alternativo de ejecución JS |
| test36.pdf | create_malpdf36() | CVE-2016-2175 / CVE-2017-9096 | XXE en metadatos XMP | <!ENTITY> XXE en el flujo XMP /Metadata | Devolución de llamada del lado del servidor (PDFBox, iText) |
| test37.pdf | create_malpdf37() | CVE-2016-2175 / CVE-2017-9096 | XXE en datos de formulario XFA | <!ENTITY> XXE en el flujo /AcroForm /XFA | Devolución de llamada del lado del servidor (PDFBox, iText) |
| test38.pdf | create_malpdf38() | CVE-2020-29075 | Rastreo DNS silencioso | Catálogo /AA con disparadores /WC, /WS, /DS | Devolución de llamada DNS sin aviso (Acrobat) |
| test39.pdf | create_malpdf39() | CVE-2022-28244 | Bypass de CSP | Anotación RichMedia con HTML/JS incrustado | Solicitud entre orígenes (Acrobat) |
| test40.pdf | create_malpdf40() | CVE-2018-5158 | Inyección de calculadora PostScript | Inyección JS /FunctionType 4 en XObject de imagen | Ejecución de JS en el worker de PDF.js (Firefox) |
| test41.pdf | create_malpdf41() | CVE-2018-20065 | URI sin gesto del usuario | /OpenAction con auto-navegación /S /URI | Navegación silenciosa (PDFium/Chrome) |
| test42.pdf | create_malpdf42() | CVE-2025-66516 | Entidad de parámetro XXE OOB en XFA | La entidad de parámetro %xxe; en /AcroForm /XFA fuerza la obtención de DTD | XXE ciega del lado del servidor (Tika, Confluence, Jira) |
| test43.pdf | create_malpdf43() | CVE-2025-70401 | XSS en campo /T de anotación | Etiqueta `` en el campo /T (autor) de anotación de texto | Devolución de llamada XSS (Apryse WebViewer, visores web) |
| test44.pdf | create_malpdf44() | CVE-2024-12426 | Expansión de URL en LibreOffice | /URI con vnd.sun.star.expand: expande ${HOME} | Exfiltración de variables de entorno (LibreOffice < 24.8.4) |
| test45.pdf | create_malpdf45() | CVE-2025-59803 | Disparador JS de OCG al firmar | /AA /WP+/DP dispara JS mediante OCG en el flujo de firma | Devolución de llamada durante la firma (Foxit < 2025.2.1) |
| test46.pdf | create_malpdf46() | CVE-2026-25755 | Inyección de objeto jsPDF | Cadena JS rota + auto-acción /AA /O inyectada | Auto-devolución de llamada en cualquier visor (jsPDF < 4.2.0) |
| test47.pdf | create_malpdf47() | Especificación PDF 2.0 | Incrustación HTML de archivos asociados | HTML mediante catálogo /AF + /EF EmbeddedFile | Devolución de llamada mediante HTML incrustado (visores PDF 2.0) |
| test48.pdf | create_malpdf48() | Especificación XFA | Devolución de llamada SOAP XFA | <submit method="soap"> con evento initialize | Solicitud HTTP SOAP (motor XFA de Acrobat) |
getField("name").value/Names ejecutadas secuencialmente. Ref: trucos PDF de corkami%%EOF original mediante actualización incremental. Ref: enmascaramiento de contenido PDF101, Didier Stevensunescape() de JS — Envolver la carga útil JS en eval(unescape("%61%6C%65%72%74...")). Ref: trucos PDF de corkami%PDF- (la especificación permite el encabezado dentro de los primeros 1024 bytes). Confunde la detección de tipo de archivo. Ref: corkami, Decalageevent.target.zoomType == "FitPage" o comprobaciones de tipo de variables globales antes de ejecutar la carga útil. Ref: trucos PDF de corkami