Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
malicious-pdf — 악성 PDF 테스트 파일을 생성하여 침투 테스트, 버그 바운티 헌팅, 레드 팀 활동에 사용합니다. PDF 뷰어, 변환기, 웹 애플리케이션에서 SSRF, XSS, XXE, NTLM 자격 증명 탈취, 데이터 유출을 테스트합니다. Burp Collaborator 및 Interact.sh와 통합됩니다. | Kitploit
도구/GitHubGitHub/jonaslejon/malicious-pdf
Phishing ToolsVulnerability ScannersPayload GenerationExploitationWeb Application ExploitationData ExfiltrationPenetration TestingLearning & EducationRed Teaming
GitHubjonaslejon/malicious-pdf

malicious-pdf

악성 PDF 테스트 파일을 생성하여 침투 테스트, 버그 바운티 헌팅, 레드 팀 활동에 사용합니다. PDF 뷰어, 변환기, 웹 애플리케이션에서 SSRF, XSS, XXE, NTLM 자격 증명 탈취, 데이터 유출을 테스트합니다. Burp Collaborator 및 Interact.sh와 통합됩니다.

4.1k5461111개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기
![malicious-pdf.png](https://triop.se/wp-content/uploads/2021/08/malicious-pdf-e1629197726260.png)

[![Python으로 제작](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](https://www.python.org/) [![OpenSSF 모범 사례](https://www.bestpractices.dev/projects/9599/badge)](https://www.bestpractices.dev/projects/9599)

# 악성 PDF 생성기 ☠️

PDF 뷰어, 변환기, 웹 애플리케이션에서 폰-홈 콜백, SSRF, XSS, XXE, NTLM 자격 증명 도용 및 데이터 유출을 테스트하기 위한 67개의 악성 PDF 테스트 파일을 생성합니다. [Burp Collaborator](https://portswigger.net/burp/documentation/collaborator) 또는 [Interact.sh](https://github.com/projectdiscovery/interactsh)와 함께 사용할 수 있습니다.

침투 테스트, 버그 바운티 헌팅, 레드-팀 작업 등에 사용됩니다. 다양한 링크가 포함된 여러 PDF 파일을 생성할 도구가 필요하여 이 도구를 만들었습니다. 교육 및 전문 목적으로만 사용하세요.

## 사용법```
pip install -r requirements.txt
python3 malicious-pdf.py burp-collaborator-url
```
출력은 `output/` 디렉토리에 test1.pdf, test2.pdf, test3.pdf 등으로 저장됩니다.

### 옵션```
--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
```
난독화 예시:```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 2
```
최대 난독화 (레벨 4는 JS 페이로드를 base64 디코더 스텁으로 감싸서 원래 API 호출이 리터럴 하위 문자열로 나타나지 않도록 합니다):```
python3 malicious-pdf.py https://your-interact-sh-url --obfuscate 4
```
## 목적
- PDF 파일을 수용하는 웹 페이지/서비스 테스트
- 보안 제품 테스트
- PDF 리더 테스트
- PDF 변환기 테스트
- 서버 측 PDF 처리 라이브러리(PDFBox, iText 등) 테스트
- PDF 정적 분석 도구 테스트 — 단계별 JS 페이로드(양식 필드 `/V`, base64 디코더)는 순수 `/JS` 정규식 스캐너를 우회합니다.
- 버그 바운티 사냥 — 파일 업로드 엔드포인트, PDF-이미지 변환기, PDF 입력을 받는 프로그램의 문서 처리 파이프라인에서 SSRF, XXE, 블라인드 콜백, NTLM 유출을 찾는 데 유용합니다.

## 크레딧
- [Insecure features in PDFs](https://web-in-security.blogspot.com/2021/01/insecure-features-in-pdfs.html)
- [Burp Suite UploadScanner](https://github.com/modzero/mod0BurpUploadScanner/)
- [Bad-Pdf](https://github.com/deepzec/Bad-Pdf)
- [A Curious Exploration of Malicious PDF Documents](https://www.scitepress.org/Papers/2020/89923/89923.pdf)
- ["Portable Document Flaws 101" talk at Black Hat USA 2020](https://github.com/RUB-NDS/PDF101)
- [Adobe Reader - PDF callback via XSLT stylesheet in XFA](https://insert-script.blogspot.com/2019/01/adobe-reader-pdf-callback-via-xslt.html)
- [Foxit PDF Reader PoC, DoHyun Lee](https://twitter.com/l33d0hyun/status/1448342241647366152)
- [Eicar test file by Stas Yakobov](https://github.com/fire1ce/eicar-standard-antivirus-test-files)
- [Multiple PDF Vulnerabilities - FormCalc & XXE](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
- [PDF - Mess with the web - FormCalc header injection](https://insert-script.blogspot.com/2015/05/pdf-mess-with-web.html)
- [Adobe Reader PDF - Client Side Request Injection](https://insert-script.blogspot.com/2018/05/adobe-reader-pdf-client-side-request.html)
- [ImageMagick - Shell injection via PDF password](https://insert-script.blogspot.com/2020/11/imagemagick-shell-injection-via-pdf.html)
- [Portable Data Exfiltration - PortSwigger Research](https://portswigger.net/research/portable-data-exfiltration)
- [CVE-2024-4367 - Arbitrary JS execution in PDF.js](https://codeanlabs.com/2024/05/cve-2024-4367-arbitrary-js-execution-in-pdf-js/)
- [PDF File Formats Security - Philippe Lagadec](https://www.decalage.info/hugo/file_formats_security/pdf/)
- [CVE-2016-2175 - Apache PDFBox XXE](https://nvd.nist.gov/vuln/detail/CVE-2016-2175)
- [CVE-2017-9096 - iText XXE](https://nvd.nist.gov/vuln/detail/CVE-2017-9096)
- [CVE-2020-29075 - Acrobat Reader silent DNS tracking](https://nvd.nist.gov/vuln/detail/CVE-2020-29075)
- [CVE-2022-28244 - Acrobat Reader CSP bypass](https://nvd.nist.gov/vuln/detail/CVE-2022-28244)
- [CVE-2018-5158 - Firefox PDF.js PostScript calculator injection](https://nvd.nist.gov/vuln/detail/CVE-2018-5158)
- [CVE-2018-20065 - PDFium URI action without user gesture](https://nvd.nist.gov/vuln/detail/CVE-2018-20065)
- [ExpMon - Sophisticated Adobe Reader 0-day analysis (April 2026)](https://justhaifei1.blogspot.com/2026/04/expmon-detected-sophisticated-zero-day-adobe-reader.html) — test33_13/14/15 및 난독화 레벨 4 영감

## 미디어에서
- [Brisk Infosec](https://www.briskinfosec.com/tooloftheday/toolofthedaydetail/Malicious-PDF)
- [Daily REDTeam](https://www.linkedin.com/posts/daily-red-team_github-jonaslejonmalicious-pdf-generate-activity-7096476604016582656-d9xM/)
- [Malicious PDF File | Red Team | Penetration Testing](https://www.youtube.com/watch?v=hf3p_t8CPWs)
- [John Hammond - Can a PDF File be Malware?](https://www.youtube.com/watch?v=TP4n8fBl6DA)
- [Black Hat Ethical Hacking](https://www.blackhatethicalhacking.com/tools/malicious-pdf/)
- [0x1 Pentesting Collection](https://0x1.gitlab.io/pentesting/malicious-pdf/)
- [Security Toolkit / WADComs](https://securitytoolkit.github.io/wadcoms/malicious-pdf/)
- [unsafe.sh](https://unsafe.sh/go-111577.html)
- [Cristi Zot on LinkedIn](https://www.linkedin.com/posts/cristivlad_github-jonaslejonmalicious-pdf-generate-activity-7026575045871239169-RKFK)
- [Siva R. on LinkedIn](https://al.linkedin.com/posts/siva-rajendran_github-jonaslejonmalicious-pdf-generate-activity-7026634093891059712-PDcl)

## 전체 테스트 매트릭스

<details>
<summary>70개 모든 테스트 케이스 펼치기</summary>

| 테스트 파일 | 함수 | CVE/참고 | 공격 벡터 | 방법 | 영향 |
|-----------|----------|---------------|---------------|---------|---------|
| test1.pdf | `create_malpdf()` | CVE-2018-4993 | 외부 파일 접근 | `/GoToE` 액션 + UNC 경로 | 파일 시스템을 통한 네트워크 콜백 |
| test1_1.pdf | `create_malpdf()` | CVE-2018-4993 | 외부 파일 접근 | `/GoToE` 액션 + HTTPS URL | HTTPS를 통한 네트워크 콜백 |
| test2.pdf | `create_malpdf2()` | XFA 양식 제출 | 양식 데이터 유출 | XDP 양식 + 제출 이벤트 | 자동 양식 제출 |
| test3.pdf | `create_malpdf3()` | JavaScript 주입 | 코드 실행 | `/OpenAction` + `app.openDoc()` | 외부 문서 로딩 |
| test4.pdf | `create_malpdf4()` | CVE-2019-7089 | XSLT 주입 | XFA + 외부 XSLT 스타일시트 | UNC 경로 콜백 |
| test5.pdf | `create_malpdf5()` | PDF101 연구 | URI 액션 | `/URI` 액션 타입 | DNS 프리페치/HTTP 요청 |
| test6.pdf | `create_malpdf6()` | PDF101 연구 | 실행 액션 | `/Launch` + 외부 URL | 외부 리소스 실행 |
| test7.pdf | `create_malpdf7()` | PDF101 연구 | 원격 PDF | `/GoToR` 액션 | 원격 PDF 로딩 |
| test8.pdf | `create_malpdf8()` | PDF101 연구 | 양식 제출 | `/SubmitForm` + HTML 플래그 | 양식 데이터 제출 |
| test9.pdf | `create_malpdf9()` | PDF101 연구 | 데이터 가져오기 | `/ImportData` 액션 | 외부 데이터 가져오기 |
| test10.pdf | `create_malpdf10()` | CVE-2017-10951 | JavaScript 실행 | Foxit `this.getURL()` 콜백 | Foxit Reader를 통한 네트워크 콜백 |
| test11.pdf | `create_malpdf11()` | EICAR 테스트 | AV 탐지 | 내장 EICAR 문자열 | 안티바이러스 테스트 |
| test12.pdf | `create_malpdf12()` | CVE-2014-8453 | FormCalc 데이터 유출 | XFA FormCalc `Post()` 함수 | 쿠키와 함께 동일 출처 데이터 유출 |
| test13.pdf | `create_malpdf13()` | 요청 주입 | CRLF 헤더 주입 | XFA 제출 `textEncoding` CRLF | HTTP 헤더 조작 |
| test14.svg | `create_malpdf14()` | ImageMagick 쉘 주입 | SVG/MSL을 통한 쉘 주입 | SVG-MSL 폴리글롯 `authenticate` 속성 | ImageMagick을 통한 원격 코드 실행 |
| test15.pdf | `create_malpdf15()` | PDF 명세 | FormCalc 헤더 주입 | XFA FormCalc `Post()` + 사용자 정의 헤더 | 임의 HTTP 헤더 주입 |
| test16.pdf | `create_malpdf16()` | PDF 명세 | GotoE를 통한 JavaScript | `/GoToE` + `javascript:` URI | PDF가 `<embed>`/`<object>`로 임베드될 때 브라우저 XSS |
| test17.pdf | `create_malpdf17()` | CVE-2014-8452 | XXE 주입 | `XMLData.parse()` 외부 개체 | XML 외부 개체 해석 |
| test18.pdf | `create_malpdf18()` | PortSwigger 연구 | 주석 URI 주입 | 이스케이프되지 않은 괄호로 중복 `/A` 키를 통해 JS 액션 주입 | PDF-Lib/jsPDF 출력을 통한 XSS |
| test19.pdf | `create_malpdf19()` | PortSwigger 연구 | PV 자동 실행 | `/AA /PV` 화면 주석이 페이지 표시 시 JS 실행 | 자동 코드 실행(Acrobat) |
| test20.pdf | `create_malpdf20()` | PortSwigger 연구 | PC 닫기 트리거 | `/AA /PC` 주석이 페이지 닫힘 시 JS 실행 | 닫힘 시 코드 실행(Acrobat) |
| test21.pdf | `create_malpdf21()` | PortSwigger 연구 | SubmitForm SubmitPDF | `/SubmitForm` + Flags 256으로 전체 PDF 전송 | 전체 PDF 콘텐츠 유출 |
| test22.pdf | `create_malpdf22()` | PortSwigger 연구 | JS submitForm() | `this.submitForm()` + `cSubmitAs: "PDF"` | PDF 콘텐츠 제출(Acrobat) |
| test23.pdf | `create_malpdf23()` | PortSwigger 연구 | 위젯 버튼 주입 | 페이지를 덮는 보이지 않는 `/Btn` 위젯, 클릭 시 JS 실행 | 코드 실행(Chrome/PDFium) |
| test24.pdf | `create_malpdf24()` | PortSwigger 연구 | 텍스트 필드 SSRF | 위젯 `/Tx` 필드 + `submitForm()` POST | 양식 데이터를 통한 블라인드 SSRF |
| test25.pdf | `create_malpdf25()` | PortSwigger 연구 | 콘텐츠 추출 | `getPageNthWord()`가 모든 텍스트를 읽고 유출 | 렌더링된 텍스트 유출 |
| test26.pdf | `create_malpdf26()` | PortSwigger 연구 | 마우스오버 트리거 | `/AA /E` 주석이 마우스 진입 시 JS 실행 | 호버 시 코드 실행(PDFium) |
| ~~test27~~ | — | — | 제거됨 | test3(Acrobat OpenAction JS) + test23(Chrome Widget Btn) 중복 | — |
| test28.pdf | `create_malpdf28()` | PortSwigger 연구 | URL 하이재킹 | 이스케이프되지 않은 괄호로 새 `/URI` 액션 주입 | PDF-Lib/jsPDF를 통한 클릭 리디렉션 |
| test29.pdf | `create_malpdf29()` | CVE-2024-4367 | FontMatrix 주입 | Type1 글꼴 `FontMatrix` 문자열이 `c.transform()`을 탈출 | PDF.js에서 임의 JS 실행(Firefox < 126) |
| test30.pdf | `create_malpdf30()` | PDF101 연구 | 외부 XObject 스트림 | 이미지 XObject가 `/FS /URL`을 통해 원격 URL에서 데이터 가져오기 | 페이지 렌더링을 통한 무음 콜백(액션/JS 없음) |
| test31.pdf | `create_malpdf31()` | PDF101 연구 | 스레드 액션 | `/S /Thread` + 원격 FileSpec | 스레드 참조를 통한 네트워크 콜백 |
| test32.pdf | `create_malpdf32()` | PDF101 연구 | 인쇄와 함께 실행 | `/Launch` + `/Win << /O /print >>`로 원격 가져오기 강제 | 인쇄 작업을 통한 네트워크 콜백 |
| test33_1.pdf | `create_malpdf33_1()` | PDF101 연구 | JS: `this.submitForm()` | Acrobat JS 양식 제출 콜백 | Acrobat Reader |
| test33_2.pdf | `create_malpdf33_2()` | PDF101 연구 | JS: `this.getURL()` | Acrobat JS URL 가져오기 | Acrobat Reader |
| test33_3.pdf | `create_malpdf33_3()` | PDF101 연구 | JS: `app.launchURL()` | Acrobat JS URL 실행 | Acrobat Reader |
| test33_4.pdf | `create_malpdf33_4()` | PDF101 연구 | JS: `app.media.getURLData()` | Acrobat JS 미디어 가져오기 | Acrobat Reader |
| test33_5.pdf | `create_malpdf33_5()` | PDF101 연구 | JS: `SOAP.connect()` | Acrobat JS SOAP 연결 | Acrobat Reader |
| test33_6.pdf | `create_malpdf33_6()` | PDF101 연구 | JS: `SOAP.request()` | Acrobat JS SOAP 요청 | Acrobat Reader |
| test33_7.pdf | `create_malpdf33_7()` | PDF101 연구 | JS: `this.importDataObject()` | Acrobat JS 데이터 가져오기 | Acrobat Reader |
| test33_8.pdf | `create_malpdf33_8()` | PDF101 연구 | JS: `app.openDoc()` | Acrobat JS 문서 열기 | Acrobat Reader |
| test33_9.pdf | `create_malpdf33_9()` | PDF101 연구 | JS: `fetch()` | Web API 콜백(PDF.js/브라우저) | Firefox/PDF.js |
| test33_10.pdf | `create_malpdf33_10()` | PDF101 연구 | JS: `XMLHttpRequest` | Web API 콜백(PDF.js/브라우저) | Firefox/PDF.js |
| test33_11.pdf | `create_malpdf33_11()` | PDF101 연구 | JS: `new Image()` | Web API 이미지 콜백(PDF.js/브라우저) | Firefox/PDF.js |
| test33_12.pdf | `create_malpdf33_12()` | PDF101 연구 | JS: `WebSocket` | Web API WebSocket 콜백(PDF.js/브라우저) | Firefox/PDF.js |
| test33_13.pdf | `create_malpdf33_13()` | Adobe 0-day 블로그(2026년 4월) | JS: `RSS.addFeed()` | Acrobat JS RSS 피드 콜백 | Acrobat Reader |
| test33_14.pdf | `create_malpdf33_14()` | Adobe 0-day 블로그(2026년 4월) | JS: `util.readFileIntoStream()` + `SOAP.request()` | 로컬 파일 읽기 + 유출 체인(try/catch 오류 경로도 콜백) | Acrobat Reader |
| test33_15.pdf | `create_malpdf33_15()` | Adobe 0-day 블로그(2026년 4월) | 양식 필드 단계별 JS 로더 | `/Tx` 위젯 `/V`의 Base64 페이로드, `getField()` + `util.stringFromStream`으로 디코딩 | Acrobat Reader |
| test34_1.pdf | `create_malpdf34_1()` | PDF101 연구 | UNC: XObject 스트림 | UNC 경로가 있는 이미지 XObject | 페이지 렌더링을 통한 NTLM 도난 |
| test34_2.pdf | `create_malpdf34_2()` | PDF101 연구 | UNC: GoToR | `/GoToR` 액션 + UNC FileSpec | 원격 PDF를 통한 NTLM 도난 |
| test34_3.pdf | `create_malpdf34_3()` | PDF101 연구 | UNC: Thread | `/Thread` 액션 + UNC FileSpec | 스레드 참조를 통한 NTLM 도난 |
| test34_4.pdf | `create_malpdf34_4()` | PDF101 연구 | UNC: URI | `/URI` 액션 + UNC 경로 | URI 액션을 통한 NTLM 도난 |
| test34_5.pdf | `create_malpdf34_5()` | PDF101 연구 | UNC: JS submitForm | `this.submitForm()` + UNC 경로 | JS 양식 제출을 통한 NTLM 도난 |
| test34_6.pdf | `create_malpdf34_6()` | PDF101 연구 | UNC: JS getURL | `this.getURL()` + UNC 경로 | JS URL 가져오기를 통한 NTLM 도난 |
| test34_7.pdf | `create_malpdf34_7()` | PDF101 연구 | UNC: JS launchURL | `app.launchURL()` + UNC 경로 | JS 실행을 통한 NTLM 도난 |
| test34_8.pdf | `create_malpdf34_8()` | PDF101 연구 | UNC: JS SOAP | `SOAP.connect()` + UNC 경로 | JS SOAP을 통한 NTLM 도난 |
| test34_9.pdf | `create_malpdf34_9()` | PDF101 연구 | UNC: JS openDoc | `app.openDoc()` + UNC 경로 | JS 문서 열기를 통한 NTLM 도난 |
| test35.pdf | `create_malpdf35()` | PDF101 연구 | 이름 사전 | `/Names /JavaScript` 카탈로그 수준 자동 실행 트리거 | 대체 JS 실행 트리거 |
| test36.pdf | `create_malpdf36()` | CVE-2016-2175 / CVE-2017-9096 | XMP 메타데이터의 XXE | `/Metadata` XMP 스트림의 XXE `<!ENTITY>` | 서버 측 콜백(PDFBox, iText) |
| test37.pdf | `create_malpdf37()` | CVE-2016-2175 / CVE-2017-9096 | XFA 양식 데이터의 XXE | `/AcroForm /XFA` 스트림의 XXE `<!ENTITY>` | 서버 측 콜백(PDFBox, iText) |
| test38.pdf | `create_malpdf38()` | CVE-2020-29075 | 무음 DNS 추적 | 카탈로그 `/AA` + `/WC`, `/WS`, `/DS` 트리거 | 프롬프트 없이 DNS 콜백(Acrobat) |
| test39.pdf | `create_malpdf39()` | CVE-2022-28244 | CSP 우회 | RichMedia 주석 + 내장 HTML/JS | 교차 출처 요청(Acrobat) |
| test40.pdf | `create_malpdf40()` | CVE-2018-5158 | PostScript 계산기 주입 | 이미지 XObject의 `/FunctionType 4` JS 주입 | PDF.js 워커에서 JS 실행(Firefox) |
| test41.pdf | `create_malpdf41()` | CVE-2018-20065 | 사용자 제스처 없는 URI | `/OpenAction` + `/S /URI` 자동 탐색 | 무음 탐색(PDFium/Chrome) |
| test42.pdf | `create_malpdf42()` | CVE-2025-66516 | XFA의 XXE OOB 매개변수 개체 | `/AcroForm /XFA`의 `%xxe;` param 개체가 DTD 가져오기 강제 | 서버 측 블라인드 XXE(Tika, Confluence, Jira) |
| test43.pdf | `create_malpdf43()` | CVE-2025-70401 | 주석 /T 필드 XSS | 텍스트 주석 `/T`(작성자) 필드의 `` 태그 | XSS 콜백(Apryse WebViewer, 웹 뷰어) |
| test44.pdf | `create_malpdf44()` | CVE-2024-12426 | LibreOffice URL 확장 | `/URI` + `vnd.sun.star.expand:`가 `${HOME}` 확장 | 환경 변수 유출(LibreOffice < 24.8.4) |
| test45.pdf | `create_malpdf45()` | CVE-2025-59803 | 서명 시 OCG JS 트리거 | `/AA /WP`+`/DP`가 서명 워크플로에서 OCG를 통해 JS 트리거 | 서명 중 콜백(Foxit < 2025.2.1) |
| test46.pdf | `create_malpdf46()` | CVE-2026-25755 | jsPDF 개체 주입 | 손상된 JS 문자열 + 주입된 `/AA /O` 자동 액션 | 모든 뷰어를 통한 자동 콜백(jsPDF < 4.2.0) |
| test47.pdf | `create_malpdf47()` | PDF 2.0 명세 | 연결 파일 HTML 임베드 | 카탈로그 `/AF` + `/EF` EmbeddedFile을 통한 HTML | 내장 HTML을 통한 콜백(PDF 2.0 뷰어) |
| test48.pdf | `create_malpdf48()` | XFA 명세 | XFA SOAP 콜백 | `<submit method="soap">` + `initialize` 이벤트 | SOAP HTTP 요청(Acrobat XFA 엔진) |

</details>

## 할 일: 새로운 테스트 케이스
- **Acrobat JS 핑거프린팅 API** — 2026년 4월 Adobe 0-day 익스플로잇 체인([참고](https://x.com/Gi7w0rm/status/2042370775546482815))에서 사용된 정찰/핑거프린팅 API에 대한 테스트 케이스 추가: `Collab.isDocReadOnly`(파일시스템 탐색), `app.plugIns`(설치된 플러그인 열거), `app.viewerVersion`(버전 핑거프린팅)

## 할 일: 아직 구현되지 않은 난독화 방법
- **빈 암호 PDF 암호화** — 모든 문자열/스트림을 빈 사용자 암호로 암호화합니다. 문서는 묻지 않고 열리지만 정적 분석 도구는 콘텐츠를 읽을 수 없습니다. 현재 난독화의 가장 큰 격차. 참고: [Didier Stevens](https://blog.didierstevens.com/category/pdf/), [PDF 암호화는 얼마나 안전한가?](https://www.decalage.info/hugo/file_formats_security/pdf/)
- **개체 스트림(ObjStm)** — PDF 개체를 압축된 스트림 컨테이너 내부에 숨깁니다. 단순 파서(PDFiD `-O` 플래그 없음)는 개체를 완전히 놓칩니다. 참고: [PDF 사양 ISO 32000 §7.5.7](https://www.iso.org/standard/63534.html)
- **getAnnots() 코드 저장** — JavaScript 페이로드를 주석 메타데이터 필드(제목, 작성자)에 분할합니다. 런타임에 `app.doc.getAnnots()[n].subject`를 통해 검색하고 eval합니다. 참고: [Julia Wolf - getAnnots()를 사용한 PDF 난독화](https://blog.didierstevens.com/2010/01/14/)
- **Info 사전 데이터 추출** — 인코딩된 페이로드를 `/Info` 트레일러 필드(`/Title`, `/Author`)에 저장합니다. 런타임에 JS에서 `info.Title`을 통해 검색합니다. 참고: [corkami PDF 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **AcroForm 필드 값 추출** — 페이로드 조각을 양식 필드 `/V` 값에 저장합니다. JS에서 `getField("name").value`를 통해 검색합니다. 참고: [corkami PDF 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **이름 트리 분할 실행** — JavaScript를 순차적으로 실행되는 여러 `/Names` 항목에 분할합니다. 참고: [corkami PDF 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **%%EOF 이후 증분 업데이트** — 증분 업데이트를 통해 원래 `%%EOF` 마커 뒤에 새 개체/액션을 추가합니다. 참고: [PDF101 콘텐츠 마스킹](https://github.com/RUB-NDS/PDF101), [Didier Stevens](https://blog.didierstevens.com/2010/05/18/more-malformed-pdfs/)
- **JS `unescape()` 인코딩** — JS 페이로드를 `eval(unescape("%61%6C%65%72%74..."))`로 감쌉니다. 참고: [corkami PDF 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md)
- **가짜 파일 헤더** — `%PDF-` 헤더 앞에 JPEG/HTML/기타 매직 바이트를 추가합니다(사양은 처음 1024바이트 내에서 헤더를 허용). 파일 유형 탐지를 혼란스럽게 합니다. 참고: [corkami](https://github.com/corkami/docs/blob/master/PDF/PDF.md), [Decalage](https://www.decalage.info/hugo/file_formats_security/pdf/)
- **안티 에뮬레이션 검사** — `event.target.zoomType == "FitPage"` 또는 전역 변수 유형 검사를 통해 실제 Adobe Reader를 감지한 후 페이로드를 실행합니다. 참고: [corkami PDF 트릭](https://github.com/corkami/docs/blob/master/PDF/PDF.md)

## 구현하지 않음
- ~~CVE-2023-26369 - Adobe Acrobat TTF 글꼴 힙 OOB 쓰기~~ — 바이너리 익스플로잇(힙 스프레이, ROP 체인, 셸코드)이 필요합니다. 공개 PoC 없음. 간단한 콜백을 생성할 수 없습니다.
- ~~CVE-2021-28550 - Adobe Acrobat Use-After-Free~~ — 바이너리 익스플로잇 체인 + 샌드박스 이스케이프(CVE-2021-31199/31201)가 필요합니다. 공개 PoC 없음. 간단한 콜백을 생성할 수 없습니다.

## 스타 기록

[![Star History Chart](https://api.star-history.com/svg?repos=jonaslejon/malicious-pdf&type=Date)](https://www.star-history.com/#jonaslejon/malicious-pdf&Date)
도구 다운로드