PDF ํŒŒ์ผ ๋ถ„์„

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ™•์ธํ•˜์„ธ์š”: https://trailofbits.github.io/ctf/forensics/

PDF ํ˜•์‹์€ ๋ณต์žก์„ฑ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ž ์žฌ๋ ฅ์œผ๋กœ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์–ด CTF ํฌ๋ Œ์‹ ์ฑŒ๋ฆฐ์ง€์˜ ์ค‘์‹ฌ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์š”์†Œ์™€ ์ด์ง„ ๊ฐ์ฒด๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉฐ, ์ด์ง„ ๊ฐ์ฒด๋Š” ์••์ถ•๋˜๊ฑฐ๋‚˜ ์•”ํ˜ธํ™”๋  ์ˆ˜ ์žˆ๊ณ , JavaScript๋‚˜ Flash์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PDF ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Didier Stevens์˜ ์†Œ๊ฐœ ์ž๋ฃŒ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ ๋˜๋Š” Origami์™€ ๊ฐ™์€ PDF ์ „์šฉ ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PDF๋ฅผ ์‹ฌ์ธต์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด qpdf ๋ฐ Origami์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PDF ๋‚ด ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณณ์— ์ˆจ๊ฒจ์ ธ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ณด์ด์ง€ ์•Š๋Š” ๋ ˆ์ด์–ด
  • Adobe์˜ XMP ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ˜•์‹
  • ์ ์ง„์  ์ƒ์„ฑ
  • ๋ฐฐ๊ฒฝ๊ณผ ๊ฐ™์€ ์ƒ‰์ƒ์˜ ํ…์ŠคํŠธ
  • ์ด๋ฏธ์ง€ ๋’ค์˜ ํ…์ŠคํŠธ ๋˜๋Š” ๊ฒน์น˜๋Š” ์ด๋ฏธ์ง€
  • ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ์ฃผ์„

๋งž์ถคํ˜• PDF ๋ถ„์„์„ ์œ„ํ•ด PeepDF์™€ ๊ฐ™์€ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถคํ˜• ํŒŒ์‹ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ PDF์˜ ์ˆจ๊ฒจ์ง„ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฐ€๋Šฅ์„ฑ์€ ๋งค์šฐ ๋ฐฉ๋Œ€ํ•˜์—ฌ, ์›๋ž˜ ์œ„์น˜์—์„œ ๋” ์ด์ƒ ํ˜ธ์ŠคํŒ…๋˜์ง€ ์•Š์ง€๋งŒ PDF ์œ„ํ—˜ ๋ฐ ๋Œ€์‘ ์กฐ์น˜์— ๋Œ€ํ•œ NSA ๊ฐ€์ด๋“œ์™€ ๊ฐ™์€ ์ž๋ฃŒ๋Š” ์—ฌ์ „ํžˆ ๊ท€์ค‘ํ•œ ํ†ต์ฐฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ด๋“œ์˜ ์‚ฌ๋ณธ๊ณผ Ange Albertini์˜ PDF ํ˜•์‹ ํŠธ๋ฆญ ๋ชจ์Œ์€ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฝ๊ธฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์•…์„ฑ ๊ตฌ์„ฑ ์š”์†Œ

๊ณต๊ฒฉ์ž๋Š” ๋ฌธ์„œ๊ฐ€ ์—ด๋ฆฌ๊ฑฐ๋‚˜ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํŠน์ • PDF ๊ฐ์ฒด์™€ ์ž‘์—…์„ ์ž์ฃผ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • /OpenAction, /AA โ€“ ์—ด๊ฑฐ๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž๋™ ์ž‘์—….
  • /JS, /JavaScript โ€“ ํฌํ•จ๋œ JavaScript(์ข…์ข… ๋‚œ๋…ํ™”๋˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์— ๋ถ„ํ• ๋จ).
  • /Launch, /SubmitForm, /URI, /GoToE โ€“ ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค / URL ์‹คํ–‰๊ธฐ.
  • /RichMedia, /Flash, /3D โ€“ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๊ฐ์ฒด.
  • /EmbeddedFile /Filespec โ€“ ํŒŒ์ผ ์ฒจ๋ถ€(EXE, DLL, OLE ๋“ฑ).
  • /ObjStm, /XFA, /AcroForm โ€“ ์‰˜ ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์•…์šฉ๋˜๋Š” ๊ฐ์ฒด ์ŠคํŠธ๋ฆผ ๋˜๋Š” ์–‘์‹.
  • ์ ์ง„์  ์—…๋ฐ์ดํŠธ โ€“ ์—ฌ๋Ÿฌ %%EOF ๋งˆ์ปค ๋˜๋Š” ๋งค์šฐ ํฐ /Prev ์˜คํ”„์…‹์€ ์„œ๋ช… ํ›„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „์˜ ํ† ํฐ์ด ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋ฌธ์ž์—ด(์˜ˆ: powershell, cmd.exe, calc.exe, base64 ๋“ฑ)๊ณผ ํ•จ๊ป˜ ๋‚˜ํƒ€๋‚˜๋ฉด PDF๋Š” ๋” ๊นŠ์€ ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


์ •์  ๋ถ„์„ ์š”์•ฝํ‘œ

# Fast triage โ€“ keyword statistics
pdfid.py suspicious.pdf

# Deep dive โ€“ decompress/inspect the object tree
pdf-parser.py -f suspicious.pdf                # interactive
pdf-parser.py -a suspicious.pdf                # automatic report

# Search for JavaScript and pretty-print it
pdf-parser.py -search "/JS" -raw suspicious.pdf | js-beautify -

# Dump embedded files
peepdf "open suspicious.pdf" "objects embeddedfile" "extract 15 16 17" -o dumps/

# Remove passwords / encryptions before processing with other tools
qpdf --password='secret' --decrypt suspicious.pdf clean.pdf

# Lint the file with a Go verifier (checks structure violations)
pdfcpu validate -mode strict clean.pdf

์ถ”๊ฐ€๋กœ ์œ ์šฉํ•œ ํ”„๋กœ์ ํŠธ (2023-2025๋…„ ๋™์•ˆ ํ™œ๋ฐœํžˆ ์œ ์ง€๋จ):

  • pdfcpu โ€“ PDF๋ฅผ lint, decrypt, extract, compress ๋ฐ sanitizeํ•  ์ˆ˜ ์žˆ๋Š” Go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/CLI.
  • pdf-inspector โ€“ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„์™€ ์ŠคํŠธ๋ฆผ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ์‹œ๊ฐํ™” ๋„๊ตฌ.
  • PyMuPDF (fitz) โ€“ ์•ˆ์ „ํ•˜๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ๊ฐ•ํ™”๋œ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ๋‚ด์žฅ๋œ JS๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ ๊ฐ€๋Šฅํ•œ Python ์—”์ง„.

์ตœ๊ทผ ๊ณต๊ฒฉ ๊ธฐ์ˆ  (2023-2025)

  • PDF ํด๋ฆฌ๊ธ€๋กฏ์˜ MalDoc (2023) โ€“ JPCERT/CC๋Š” ์œ„ํ˜‘ ํ–‰์œ„์ž๊ฐ€ ์ตœ์ข… %%EOF ์ดํ›„์— VBA ๋งคํฌ๋กœ๊ฐ€ ํฌํ•จ๋œ MHT ๊ธฐ๋ฐ˜ Word ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ•˜์˜€์œผ๋ฉฐ, ์ด๋Š” ์œ ํšจํ•œ PDF์ด์ž ์œ ํšจํ•œ DOC์ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. PDF ๋ ˆ์ด์–ด๋งŒ ํŒŒ์‹ฑํ•˜๋Š” AV ์—”์ง„์€ ๋งคํฌ๋กœ๋ฅผ ๋†“์นฉ๋‹ˆ๋‹ค. ์ •์  PDF ํ‚ค์›Œ๋“œ๋Š” ๊นจ๋—ํ•˜์ง€๋งŒ file์€ ์—ฌ์ „ํžˆ %PDF๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. <w:WordDocument> ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ PDF๋Š” ๋งค์šฐ ์˜์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ทจ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Shadow-incremental ์—…๋ฐ์ดํŠธ (2024) โ€“ ์ ๋“ค์€ ์•…์„ฑ /OpenAction์ด ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ /Catalog๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์•…์šฉํ•˜๋ฉฐ, ๋ฌดํ•ดํ•œ ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ •๋ณธ์€ ์„œ๋ช…๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ xref ํ…Œ์ด๋ธ”๋งŒ ๊ฒ€์‚ฌํ•˜๋Š” ๋„๊ตฌ๋Š” ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค.
  • ํฐํŠธ ํŒŒ์‹ฑ UAF ์ฒด์ธ โ€“ CVE-2024-30284 (Acrobat/Reader) โ€“ ์ทจ์•ฝํ•œ CoolType.dll ํ•จ์ˆ˜๋Š” ๋‚ด์žฅ๋œ CIDType2 ํฐํŠธ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์กฐ์ž‘๋œ ๋ฌธ์„œ๊ฐ€ ์—ด๋ฆฌ๋ฉด ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 2024๋…„ 5์›” APSB24-29์—์„œ ํŒจ์น˜๋จ.

YARA ๋น ๋ฅธ ๊ทœ์น™ ํ…œํ”Œ๋ฆฟ

rule Suspicious_PDF_AutoExec {
meta:
description = "Generic detection of PDFs with auto-exec actions and JS"
author      = "HackTricks"
last_update = "2025-07-20"
strings:
$pdf_magic = { 25 50 44 46 }          // %PDF
$aa        = "/AA" ascii nocase
$openact   = "/OpenAction" ascii nocase
$js        = "/JS" ascii nocase
condition:
$pdf_magic at 0 and ( all of ($aa, $openact) or ($openact and $js) )
}

๋ฐฉ์–ด ํŒ

  1. ๋น ๋ฅธ ํŒจ์น˜ โ€“ Acrobat/Reader๋ฅผ ์ตœ์‹  Continuous ํŠธ๋ž™์œผ๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค; ์‹ค์ œ์—์„œ ๊ด€์ฐฐ๋œ ๋Œ€๋ถ€๋ถ„์˜ RCE ์ฒด์ธ์€ ๋ช‡ ๋‹ฌ ์ „์— ์ˆ˜์ •๋œ n-day ์ทจ์•ฝ์ ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ํ™œ์„ฑ ์ฝ˜ํ…์ธ  ์ œ๊ฑฐ โ€“ pdfcpu sanitize ๋˜๋Š” qpdf --qdf --remove-unreferenced๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์‹  PDF์—์„œ JavaScript, ํฌํ•จ๋œ ํŒŒ์ผ ๋ฐ ์‹คํ–‰ ์ž‘์—…์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.
  3. ์ฝ˜ํ…์ธ  ๋ฌด์žฅ ํ•ด์ œ ๋ฐ ์žฌ๊ตฌ์„ฑ (CDR) โ€“ ์ƒŒ๋“œ๋ฐ•์Šค ํ˜ธ์ŠคํŠธ์—์„œ PDF๋ฅผ ์ด๋ฏธ์ง€(๋˜๋Š” PDF/A)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ™œ์„ฑ ๊ฐ์ฒด๋ฅผ ๋ฒ„๋ฆฌ๋ฉด์„œ ์‹œ๊ฐ์  ์ถฉ์‹ค๋„๋ฅผ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.
  4. ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ฐจ๋‹จ โ€“ Reader์˜ ๊ธฐ์—… โ€œํ–ฅ์ƒ๋œ ๋ณด์•ˆโ€ ์„ค์ •์„ ํ†ตํ•ด JavaScript, ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ฐ 3D ๋ Œ๋”๋ง์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์‚ฌ์šฉ์ž ๊ต์œก โ€“ ์‚ฌํšŒ ๊ณตํ•™(์ฒญ๊ตฌ์„œ ๋ฐ ์ด๋ ฅ์„œ ์œ ์ธ๋ฌผ)์€ ์ดˆ๊ธฐ ๋ฒกํ„ฐ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค; ์ง์›๋“ค์—๊ฒŒ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์ฒจ๋ถ€ ํŒŒ์ผ์„ IR์— ์ „๋‹ฌํ•˜๋„๋ก ๊ต์œกํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ  ๋ฌธํ—Œ

  • JPCERT/CC โ€“ โ€œPDF์˜ MalDoc โ€“ ์•…์„ฑ Word ํŒŒ์ผ์„ PDF ํŒŒ์ผ์— ํฌํ•จ์‹œ์ผœ ํƒ์ง€ ์šฐํšŒโ€ (2023๋…„ 8์›”)
  • Adobe โ€“ Acrobat ๋ฐ Reader์— ๋Œ€ํ•œ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ (APSB24-29, 2024๋…„ 5์›”)

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ