マルウェア解析者向け: 疑わしい PDF を解析する Python ツール
元記事
PDF documents & URLs - SANS Internet Storm Center
PDF documents & URLs: update - SANS Internet Storm Center
ツールの入手元
※ それぞれ最新版を入手するには PDF Tools | Didier Stevens から参照
以下簡易リンク (https)
各ツールの使用方法の説明
pdf-parser 概要
- 特定PDFに含まれている要素を解析
- PDF の内容はレンダリングしない
- Python で書かれたコマンドラインツール
- 使用方法: pdf-parser.py --help で利用できるオプションが表示される
オプションごとの機能
オプション | 機能説明 |
---|---|
--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 として認識する。
対象となる文字列一覧
- obj
- endobj
- stream
- endstream
- xref
- trailer
- startxref
- /Page
- /Encrypt
- /ObjStm
- /JS
- /JavaScript
- /AA
- /OpenAction
- /JBIG2Decode
- /RichMedia
- /Launch
- /XFA
PDFTemplate.bt
PDFTemplate.bt の概要
- PDF ファイルフォーマットの 010 Editor 用テンプレート
- PDF のファイル形式が不正な場合、とくに PDFUnknown 構造がある場合に便利