拡張頭蓋 | Extended Cranium

もしかすると誰かの役に立つかもしれないことを書き留めておく

マルウェア解析者向け: 疑わしい PDF を解析する Python ツール

元記事

PDF Tools | Didier Stevens

PDF documents & URLs - SANS Internet Storm Center

PDF documents & URLs: update - SANS Internet Storm Center

ツールの入手元

※ それぞれ最新版を入手するには PDF Tools | Didier Stevens から参照

以下簡易リンク (https)

各ツールの使用方法の説明

pdf-parser 概要

オプションごとの機能

オプション 機能説明
--version バージョン情報を表示
-h または --help ヘルプ画面を表示
-s SEARCH または --search=SEARCH 間接オブジェクト内で指定された文字列 SEARCH を検索。間接オブジェクトのストリーム内の文字列は検索対象外。大文字小文字は区別しない。難読化には未対応
-f または --filter 指定したフィルタをした後のストリームオブジェクトを渡す。現時点では FlateDecode のみをサポート (例: zlib 展開)
-o OBJECT または --object=OBJECT 指定された間接オブジェクト ID の内容を表示。ID はバージョンに依存しない。複数のオブジェクトが同一の ID をもつ場合はすべてのオブジェクトが表示される
-w または --raw Ptython の画面表示用に整形されたデータではなく raw データを出力する
-r REFERENCE または --reference=REFERENCE 指定した間接オブジェクト (IDで指定) を参照しているすべてのオブジェクトを表示する。ID はバージョンに依存しない。
-a または --stats 解析した PDF 内で見つかったオブジェクトに関する統計情報を表示する。このオプションを使って、予想しないようなオブジェクトや普通ではないオブジェクトの有無を調べたり、PDF を分類することができる。例えば複数の悪意のある PDF ファイルについて、見た目の内容は異なっていても統計情報が同一であれば、同一の攻撃ベクターを利用していていることや同一の攻撃者が作成したことを予測できる。
-t TYPE または --type=TYPE TYPE に指定したタイプのオブジェクトをすべて表示する。TYPE は文字列で、スラッシュ(/) を先頭に指定する。大文字小文字は区別する

make-pdf 概要

  • テスト用の javascript が埋め込まれた PDF を作成する
  • 指定した javascript ファイルを埋め込んだ PDF を作成する
  • 指定したファイルを埋め込んだ PDF を作成する

オプションごとの機能

make-pdf-javascript.py

オプション 機能説明
--version バージョンを表示
-h または --help ヘルプ画面を表示
-j JAVSCRIPT または --javascript=JAVSCRIPT JAVSCRIPT に直接 javascript を指定して埋め込む(デフォルトで埋め込まれる Javascript は app.alert メッセージボックス)
-f JAVASCRIPTFILE または --javascript=JAVASCRIPTFILE javascript ファイル名を引数として指定し、そのファイルの中身から読み込んだ javasript を埋め込む(デフォルトで埋め込まれる Javascript は app.alert メッセージボックス)

make-pdf-embedded.py

オプション 機能説明
--version バージョンを表示
-h または --help ヘルプ画面を表示
-f FILTERS または --filters=FILTERS 適用するフィルタを指定。「f」で FlateDecode (デフォルト)、「h」で ASCIIHexDecode
-t または --nobinary バイナリフォーマットにコメントを追加しない
-a または --autoopen PDF が開かれたら埋め込まれたファイルを自動的に開く
-b または --button 埋め込んだファイルを実行するためのボタンを追加する
-s または --stego /EmbeddedFiles を /Embeddedfiles に置換して埋め込んだファイルを隠す
-m MESSAGE または --message=MESSAGE PDF ドキュメント内に表示するテキスト

pdfid 概要

  • PDF パーサーとは異なり、PDF 中の特定キーワードをスキャン検索する
    • 例: JavaScript が含まれている PDF の特定、開かれるとなんらかのアクションが実行される PDF の特定
  • 名前の難読化に対応
  • PDF の最初のトリアージに利用することを推奨
    • トリアージしたファイルをさらに PDF-Parser で解析すると良い
    • PDF 文書を完全に解析すると非常に複雑なプログラムが必要になりバグが紛れ込みやすいので極力シンプルな解析ツールにしてあることに注意
  • pdfid は PDF 文書をスキャンし、リスト形式で与えられた文字列の出現頻度を数える (「対象となる文字列一覧」を参照)
    • ほとんどの PDF には最初の 7 つ (obj から startxref まで) が出現する
    • stream から endstream は頻度少なめ
    • xref と trailer が含まれない PDF はまれだが、なくても悪意があるファイルとは限らない
    • /Page は PDF のページ数を示す。悪意のある PDF はほとんど 1 ページしかない
    • /Encrypt は PDF に DRM が含まれるか、パスワードがないと読めないことを示す
    • /ObjStm はオブジェクトストリームの数を数える。オブジェクトストリームは、別のオブジェクトを内包できるストリームオブジェクトを指す。したがってオブジェクトの難読化に使われることがある (別のフィルタを使う方法などで)
    • /JS および /JavaScript は PDF に JavaScript が含まれていることを示す。ネット上にあるほとんどすべての悪意のある PDF には JavaScript が含まれている (JavaScript脆弱性を悪用するため、またはヒープスプレイ攻撃をしかけるため)。ただし、JavaScript が含まれているからといって悪意のあるファイルであるとは限らない。
    • /AA および /OpenAction は、ページやドキュメントが閲覧された際、自動的に実行されるアクションがあることを示す。これまで見てきた悪意のある PDF で JavaScript が含まれるものはすべて、ユーザーによる操作なしで JavaScript が自動実行されるアクションが設定されていた。したがって、自動実行が設定されていてかつ JavaScript が含まれている場合は非常に怪しいといえる。
    • /JBIG2Decode は PDF で JBIG2 圧縮が使用されていることを示す。これが含まれていること自体は悪意があることを示すものではないが、さらに調査が必要であることを示す。
    • /RichMedia は Flash が埋め込まれていることを示す
    • /Launch は実行されるアクションの数を示す。
    • /XFA は XML フォーム アーキテクチャを指す。
  • カウンターの後ろに () で示す数は難読化されている数を示す。例えば「/JBIG2Decode 1(1)」と表示されているのであれば、PDF には /JBIG2Decode の名前が含まれ、難読化されていることを示す (例えば /JBIG#32Decode などの 16進コードを使っている)。
  • 差分更新で保存された PDF についてはカウンタ数が正しくなくなるので注意すること。
  • pdfid は文字列をスキャンしているだけなので、FP も発生しうることにも注意。たとえば、ただのテキストファイルであっても先頭に「%PDF-1.1 という文字列があり、かつ「対象となる文字列一覧」にあげた文字列が含まれれば PDF として認識する。

対象となる文字列一覧

  1. obj
  2. endobj
  3. stream
  4. endstream
  5. xref
  6. trailer
  7. startxref
  8. /Page
  9. /Encrypt
  10. /ObjStm
  11. /JS
  12. /JavaScript
  13. /AA
  14. /OpenAction
  15. /JBIG2Decode
  16. /RichMedia
  17. /Launch
  18. /XFA

PDFTemplate.bt

PDFTemplate.bt の概要

  • PDF ファイルフォーマットの 010 Editor 用テンプレート
  • PDF のファイル形式が不正な場合、とくに PDFUnknown 構造がある場合に便利