
Erstellt bösartige PDF-Testdateien für Penetrationstests, Bug-Bounty-Jagd und Red Teaming. Testet SSRF, XSS, XXE, NTLM-Credential-Diebstahl und Datenexfiltration in PDF-Viewern, Konvertern und Webanwendungen. Integriert mit Burp Collaborator und Interact.sh.

Erzeuge 67 bösartige PDF-Testdateien zum Testen von Phone-Home-Callbacks, SSRF, XSS, XXE, NTLM-Credential-Diebstahl und Datenexfiltration in PDF-Viewern, Konvertern und Webanwendungen. Kann mit Burp Collaborator oder Interact.sh verwendet werden.
Wird für Penetrationstests, Bug-Bounty-Jagd und/oder Red-Teaming usw. verwendet. Ich habe dieses Tool erstellt, weil ich ein Tool benötigte, um eine Reihe von PDF-Dateien mit verschiedenen Links zu generieren. Nur für Bildungs- und Berufszwecke.
pip install -r requirements.txt python3 malicious-pdf.py burp-collaborator-url
Die Ausgabe wird in das Verzeichnis `output/` geschrieben als: test1.pdf, test2.pdf, test3.pdf usw.
### Optionen```
--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
Beispiel mit Verschleierung:``` python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 2
Maximale Obfuskation (Level 4 verpackt JS-Payloads in einen Base64-Decoder-Stub, sodass die ursprünglichen API-Aufrufe nie als literale Teilstrings erscheinen):```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 4
/V, Base64-Decoder) schlagen naive /JS-Regex-ScannerCollab.isDocReadOnly (Dateisystem-Sondierung), app.plugIns (installierte Plugins aufzählen), app.viewerVersion (Versions-Fingerprinting)-O-Flag) übersehen Objekte vollständig. Ref: PDF spec ISO 32000 §7.5.7app.doc.getAnnots()[n].subject abrufen und mit eval ausführen. Ref: Julia Wolf - PDF Obfuscation using getAnnots()/Info-Trailerfeldern speichern (/Title, /Author). Zur Laufzeit über info.Title in JS abrufen. Ref: corkami PDF tricks/V-Werten speichern. Über getField("name").value in JS abrufen. Ref: | Testdatei | Funktion | CVE/Referenz | Angriffsvektor | Methode | Auswirkung |
|---|
| test1.pdf | create_malpdf() | CVE-2018-4993 | Externer Dateizugriff | /GoToE-Aktion mit UNC-Pfad | Netzwerk-Callback über Dateisystem |
| test1_1.pdf | create_malpdf() | CVE-2018-4993 | Externer Dateizugriff | /GoToE-Aktion mit HTTPS-URL | Netzwerk-Callback über HTTPS |
| test2.pdf | create_malpdf2() | XFA-Formularübermittlung | Exfiltration von Formulardaten | XDP-Formular mit Submit-Ereignis | Automatische Formularübermittlung |
| test3.pdf | create_malpdf3() | JavaScript-Injection | Codeausführung | /OpenAction mit app.openDoc() | Laden externer Dokumente |
| test4.pdf | create_malpdf4() | CVE-2019-7089 | XSLT-Injection | XFA mit externem XSLT-Stylesheet | UNC-Pfad-Callback |
| test5.pdf | create_malpdf5() | PDF101-Forschung | URI-Aktion | /URI-Aktionstyp | DNS-Prefetching/HTTP-Anfrage |
| test6.pdf | create_malpdf6() | PDF101-Forschung | Launch-Aktion | /Launch mit externer URL | Ausführung externer Ressourcen |
| test7.pdf | create_malpdf7() | PDF101-Forschung | Remote-PDF | /GoToR-Aktion | Laden einer Remote-PDF |
| test8.pdf | create_malpdf8() | PDF101-Forschung | Formularübermittlung | /SubmitForm mit HTML-Flags | Übermittlung von Formulardaten |
| test9.pdf | create_malpdf9() | PDF101-Forschung | Datenimport | /ImportData-Aktion | Externer Datenimport |
| test10.pdf | create_malpdf10() | CVE-2017-10951 | JavaScript-Ausführung | Foxit-this.getURL()-Callback | Netzwerk-Callback über Foxit Reader |
| test11.pdf | create_malpdf11() | EICAR-Test | AV-Erkennung | Eingebetteter EICAR-String | Antivirus-Test |
| test12.pdf | create_malpdf12() | CVE-2014-8453 | FormCalc-Datenexfiltration | XFA-FormCalc-Funktion Post() | Same-Origin-Datenexfiltration mit Cookies |
| test13.pdf | create_malpdf13() | Request-Injection | CRLF-Header-Injection | XFA-Submit-textEncoding-CRLF | Manipulation von HTTP-Headern |
| test14.svg | create_malpdf14() | ImageMagick-Shell-Injection | Shell-Injection über SVG/MSL | SVG-MSL-Polyglott-authenticate-Attribut | Remotecodeausführung über ImageMagick |
| test15.pdf | create_malpdf15() | PDF-Spezifikation | FormCalc-Header-Injection | XFA-FormCalc-Post() mit benutzerdefinierten Headern | Beliebige HTTP-Header-Injection |
| test16.pdf | create_malpdf16() | PDF-Spezifikation | JavaScript über GotoE | /GoToE mit javascript:-URI | Browser-XSS bei per <embed>/<object> eingebetteter PDF |
| test17.pdf | create_malpdf17() | CVE-2014-8452 | XXE-Injection | Externe Entität in XMLData.parse() | Auflösung externer XML-Entitäten |
| test18.pdf | create_malpdf18() | PortSwigger-Forschung | Annotation-URI-Injection | Unescapte Klammern injizieren JS-Aktion über doppelten /A-Schlüssel | XSS über PDF-Lib/jsPDF-Ausgabe |
| test19.pdf | create_malpdf19() | PortSwigger-Forschung | PV-Autoausführung | /AA /PV-Screen-Annotation löst JS bei sichtbarer Seite aus | Automatische Codeausführung (Acrobat) |
| test20.pdf | create_malpdf20() | PortSwigger-Forschung | PC-Schließauslöser | /AA /PC-Annotation löst JS beim Schließen der Seite aus | Codeausführung beim Schließen (Acrobat) |
| test21.pdf | create_malpdf21() | PortSwigger-Forschung | SubmitForm SubmitPDF | /SubmitForm mit Flags 256 sendet die gesamte PDF | Exfiltration des vollständigen PDF-Inhalts |
| test22.pdf | create_malpdf22() | PortSwigger-Forschung | JS-submitForm() | this.submitForm() mit cSubmitAs: "PDF" | Übermittlung des PDF-Inhalts (Acrobat) |
| test23.pdf | create_malpdf23() | PortSwigger-Forschung | Widget-Button-Injection | Unsichtbares /Btn-Widget, das die Seite abdeckt, JS bei Klick | Codeausführung (Chrome/PDFium) |
| test24.pdf | create_malpdf24() | PortSwigger-Forschung | Textfeld-SSRF | Widget-/Tx-Feld mit submitForm()-POST | Blinde SSRF über Formulardaten |
| test25.pdf | create_malpdf25() | PortSwigger-Forschung | Inhaltsextraktion | getPageNthWord() liest den gesamten Text und exfiltriert ihn | Exfiltration gerenderten Texts |
| test26.pdf | create_malpdf26() | PortSwigger-Forschung | Mouseover-Auslöser | /AA /E-Annotation löst JS beim Mauszeiger-Eintritt aus | Codeausführung beim Hover (PDFium) |
| — | — | Entfernt | Duplikat von test3 (Acrobat-OpenAction-JS) + test23 (Chrome-Widget-Btn) | — | |
| test28.pdf | create_malpdf28() | PortSwigger-Forschung | URL-Übernahme | Unescapte Klammern injizieren neue /URI-Aktion | Klick-Umleitung über PDF-Lib/jsPDF |
| test29.pdf | create_malpdf29() | CVE-2024-4367 | FontMatrix-Injection | Type1-Font-FontMatrix-String bricht aus c.transform() aus | Beliebige JS-Ausführung in PDF.js (Firefox < 126) |
| test30.pdf | create_malpdf30() | PDF101-Forschung | Externer XObject-Stream | Bild-XObject ruft Daten von Remote-URL über /FS /URL ab | Stiller Callback durch Seitenrendering (keine Aktionen/JS) |
| test31.pdf | create_malpdf31() | PDF101-Forschung | Thread-Aktion | /S /Thread mit Remote-FileSpec | Netzwerk-Callback über Thread-Referenz |
| test32.pdf | create_malpdf32() | PDF101-Forschung | Launch mit Drucken | /Launch mit /Win << /O /print >> erzwingt Remote-Abruf | Netzwerk-Callback über Druckvorgang |
| test33_1.pdf | create_malpdf33_1() | PDF101-Forschung | JS: this.submitForm() | Acrobat-JS-Callback für Formularübermittlung | Acrobat Reader |
| test33_2.pdf | create_malpdf33_2() | PDF101-Forschung | JS: this.getURL() | Acrobat-JS-URL-Abruf | Acrobat Reader |
| test33_3.pdf | create_malpdf33_3() | PDF101-Forschung | JS: app.launchURL() | Acrobat-JS-URL-Start | Acrobat Reader |
| test33_4.pdf | create_malpdf33_4() | PDF101-Forschung | JS: app.media.getURLData() | Acrobat-JS-Media-Abruf | Acrobat Reader |
| test33_5.pdf | create_malpdf33_5() | PDF101-Forschung | JS: SOAP.connect() | Acrobat-JS-SOAP-Verbindung | Acrobat Reader |
| test33_6.pdf | create_malpdf33_6() | PDF101-Forschung | JS: SOAP.request() | Acrobat-JS-SOAP-Anfrage | Acrobat Reader |
| test33_7.pdf | create_malpdf33_7() | PDF101-Forschung | JS: this.importDataObject() | Acrobat-JS-Datenimport | Acrobat Reader |
| test33_8.pdf | create_malpdf33_8() | PDF101-Forschung | JS: app.openDoc() | Acrobat-JS-Öffnen eines Dokuments | Acrobat Reader |
| test33_9.pdf | create_malpdf33_9() | PDF101-Forschung | JS: fetch() | Web-API-Callback (PDF.js/Browser) | Firefox/PDF.js |
| test33_10.pdf | create_malpdf33_10() | PDF101-Forschung | JS: XMLHttpRequest | Web-API-Callback (PDF.js/Browser) | Firefox/PDF.js |
| test33_11.pdf | create_malpdf33_11() | PDF101-Forschung | JS: new Image() | Web-API-Bild-Callback (PDF.js/Browser) | Firefox/PDF.js |
| test33_12.pdf | create_malpdf33_12() | PDF101-Forschung | JS: WebSocket | Web-API-WebSocket-Callback (PDF.js/Browser) | Firefox/PDF.js |
| test33_13.pdf | create_malpdf33_13() | Adobe-0-Day-Blog (Apr. 2026) | JS: RSS.addFeed() | Acrobat-JS-RSS-Feed-Callback | Acrobat Reader |
| test33_14.pdf | create_malpdf33_14() | Adobe-0-Day-Blog (Apr. 2026) | JS: util.readFileIntoStream() + SOAP.request() | Lokales Dateilesen + Exfiltrationskette (try/catch-Fehlerpfad ruft ebenfalls Callbacks auf) | Acrobat Reader |
| test33_15.pdf | create_malpdf33_15() | Adobe-0-Day-Blog (Apr. 2026) | Über Formularfelder gestaffelter JS-Loader | Base64-Payload im /Tx-Widget-/V, dekodiert über getField() + util.stringFromStream | Acrobat Reader |
| test34_1.pdf | create_malpdf34_1() | PDF101-Forschung | UNC: XObject-Stream | Bild-XObject mit UNC-Pfad | NTLM-Diebstahl über Seitenrendering |
| test34_2.pdf | create_malpdf34_2() | PDF101-Forschung | UNC: GoToR | /GoToR-Aktion mit UNC-FileSpec | NTLM-Diebstahl über Remote-PDF |
| test34_3.pdf | create_malpdf34_3() | PDF101-Forschung | UNC: Thread | /Thread-Aktion mit UNC-FileSpec | NTLM-Diebstahl über Thread-Referenz |
| test34_4.pdf | create_malpdf34_4() | PDF101-Forschung | UNC: URI | /URI-Aktion mit UNC-Pfad | NTLM-Diebstahl über URI-Aktion |
| test34_5.pdf | create_malpdf34_5() | PDF101-Forschung | UNC: JS-submitForm | this.submitForm() mit UNC-Pfad | NTLM-Diebstahl über JS-Formularübermittlung |
| test34_6.pdf | create_malpdf34_6() | PDF101-Forschung | UNC: JS-getURL | this.getURL() mit UNC-Pfad | NTLM-Diebstahl über JS-URL-Abruf |
| test34_7.pdf | create_malpdf34_7() | PDF101-Forschung | UNC: JS-launchURL | app.launchURL() mit UNC-Pfad | NTLM-Diebstahl über JS-Start |
| test34_8.pdf | create_malpdf34_8() | PDF101-Forschung | UNC: JS-SOAP | SOAP.connect() mit UNC-Pfad | NTLM-Diebstahl über JS-SOAP |
| test34_9.pdf | create_malpdf34_9() | PDF101-Forschung | UNC: JS-openDoc | app.openDoc() mit UNC-Pfad | NTLM-Diebstahl über JS-Öffnen eines Dokuments |
| test35.pdf | create_malpdf35() | PDF101-Forschung | Names-Wörterbuch | /Names /JavaScript-Autoausführungstrigger auf Katalogebene | Alternativer JS-Ausführungstrigger |
| test36.pdf | create_malpdf36() | CVE-2016-2175 / CVE-2017-9096 | XXE in XMP-Metadaten | XXE-<!ENTITY> im /Metadata-XMP-Stream | Serverseitiger Callback (PDFBox, iText) |
| test37.pdf | create_malpdf37() | CVE-2016-2175 / CVE-2017-9096 | XXE in XFA-Formulardaten | XXE-<!ENTITY> im /AcroForm /XFA-Stream | Serverseitiger Callback (PDFBox, iText) |
| test38.pdf | create_malpdf38() | CVE-2020-29075 | Stilles DNS-Tracking | Katalog-/AA mit /WC-, /WS-, /DS-Triggern | DNS-Callback ohne Rückfrage (Acrobat) |
| test39.pdf | create_malpdf39() | CVE-2022-28244 | CSP-Bypass | RichMedia-Annotation mit eingebettetem HTML/JS | Cross-Origin-Anfrage (Acrobat) |
| test40.pdf | create_malpdf40() | CVE-2018-5158 | PostScript-Rechner-Injection | /FunctionType 4-JS-Injection in Bild-XObject | JS-Ausführung im PDF.js-Worker (Firefox) |
| test41.pdf | create_malpdf41() | CVE-2018-20065 | URI ohne Benutzergeste | /OpenAction mit /S /URI-Autonavigation | Stille Navigation (PDFium/Chrome) |
| test42.pdf | create_malpdf42() | CVE-2025-66516 | XXE-OOB-Parameterentität in XFA | %xxe;-Parameterentität in /AcroForm /XFA erzwingt DTD-Abruf | Serverseitige blinde XXE (Tika, Confluence, Jira) |
| test43.pdf | create_malpdf43() | CVE-2025-70401 | Annotation-/T-Feld-XSS | ``-Tag im Textannotations-/T-Feld (Autor) | XSS-Callback (Apryse WebViewer, Web-Viewer) |
| test44.pdf | create_malpdf44() | CVE-2024-12426 | LibreOffice-URL-Erweiterung | /URI mit vnd.sun.star.expand: erweitert ${HOME} | Exfiltration von Umgebungsvariablen (LibreOffice < 24.8.4) |
| test45.pdf | create_malpdf45() | CVE-2025-59803 | OCG-JS-Auslöser beim Signieren | /AA /WP+/DP löst JS über OCG im Signierworkflow aus | Callback während des Signierens (Foxit < 2025.2.1) |
| test46.pdf | create_malpdf46() | CVE-2026-25755 | jsPDF-Objektinjection | Defekter JS-String + injizierte /AA /O-Autoaktion | Auto-Callback über jeden Viewer (jsPDF < 4.2.0) |
| test47.pdf | create_malpdf47() | PDF-2.0-Spezifikation | Eingebettetes HTML über Associated Files | HTML über Katalog-/AF + /EF-EmbeddedFile | Callback über eingebettetes HTML (PDF-2.0-Viewer) |
| test48.pdf | create_malpdf48() | XFA-Spezifikation | XFA-SOAP-Callback | <submit method="soap"> mit initialize-Ereignis | SOAP-HTTP-Anfrage (Acrobat-XFA-Engine) |
/Names-Einträge verteilen, die sequenziell ausgeführt werden. Ref: corkami PDF tricks%%EOF-Marker per inkrementellem Update anhängen. Ref: PDF101 content masking, Didier Stevensunescape()-Kodierung — JS-Payload in eval(unescape("%61%6C%65%72%74...")) einwickeln. Ref: corkami PDF tricks%PDF--Header setzen (die Spezifikation erlaubt den Header innerhalb der ersten 1024 Bytes). Verwirrt die Dateityperkennung. Ref: corkami, Decalageevent.target.zoomType == "FitPage" oder Typprüfungen globaler Variablen erkennen, bevor die Payload ausgeführt wird. Ref: corkami PDF tricks