オフラインでVolatility 3を実行する方法

長らくベータ版として提供されていたVolatility 3ですが、2021年2月に正式バージョン(v.1.0.0)がリリースされました。Volatility 2のサポートは2021年8月に終了することがアナウンス[1]されており、メモリイメージのフォレンジック調査にVolatilityを使用している方々は、すでにVolatility 3を使用されていることと思います。今回は、そのVolatility 3を使用する際のTipsとして「オフラインでVolatility 3を実行する方法」を紹介します。 なお、今回紹介するのはWindows OSのメモリイメージを分析する方法にフォーカスしています。

オフラインでVolatility 3を使用する際の問題点

マルウェア分析やフォレンジック分析の際に、マルウェア感染や情報漏えいのリスク低減のために、オフライン環境で分析することがあります。しかし、Volatility 3をデフォルトのままオフラインで使用すると、以下のようなエラーが表示され、使用することができません。

Volatility 3 Framework 1.2.0
WARNING  volatility3.framework.symbols.windows.pdbutil: Symbol file could not be downloaded from remote server
Progress:  100.00       PDB scanning finished
Unsatisfied requirement plugins.Info.nt_symbols: Windows kernel symbols

A symbol table requirement was not fulfilled.  Please verify that:
    You have the correct symbol file for the requirement
    The symbol file is under the correct directory or zip file
    The symbol file is named appropriately or contains the correct banner

Unable to validate the plugin requirements: ['plugins.Info.nt_symbols']

Volatility 2では、各OSのメモリイメージを分析するためのProfileがパッケージ内にあらかじめ含まれていました。Volatility 3では、これまでの仕組み(Profile)を廃止し、Symbol Tableをもとに、分析を行うように変更されました[2]。このSymbol Tableは、パッケージ内には含まれておらず、メモリ分析ごとに自動で作成されます。Symbol Tableの作成には、NTカーネルのSymbolファイルが必要であり、Volatility 3はSymbolファイルの取得をマイクロソフトのWebサイトから行います。そのため、オフライン環境では上記のようにエラーとなってしまうのです。

この問題を解決するためには、手動でSymbol Tableを作成する必要があります。以降では、Symbol Tableを手動で作成する方法を説明します。

Symbol Table作成方法(Windows OS)

Symbol Tableの作成および使用は、以下の手順で行います。

  1. ダウンロード対象のSymbolファイルを確認
  2. SymbolのダウンロードおよびSymbol Table作成
  3. Volatility 3への適用

1. ダウンロード対象のSymbolファイルを確認

まずは、Symbol Table 作成に使用するNTカーネルのSymbolファイルを入手するために、ダウンロード対象ファイルを調べます。以下のように -v オプションを指定して調査対象のメモリイメージをスキャンします。

$ python3 vol.py -v -f test.mem windows.info
Volatility 3 Framework 1.2.0
INFO     volatility3.cli: Volatility plugins path: ['/volatility3/volatility3/plugins', '/volatility3/volatility3/framework/plugins']
INFO     volatility3.cli: Volatility symbols path: ['/volatility3/volatility3/symbols', '/volatility3/volatility3/framework/symbols']
INFO     volatility3.framework.automagic: Detected a windows category plugin
INFO     volatility3.framework.automagic: Running automagic: ConstructionMagic
INFO     volatility3.framework.automagic: Running automagic: LayerStacker
INFO     volatility3.framework.automagic: Running automagic: WinSwapLayers
INFO     volatility3.framework.automagic: Running automagic: WintelHelper
INFO     volatility3.framework.automagic: Running automagic: KernelPDBScanner
INFO     volatility3.framework.symbols.windows.pdbconv: Download PDB file...
WARNING  volatility3.framework.symbols.windows.pdbutil: Symbol file could not be downloaded from remote server
INFO     volatility3.framework.symbols.windows.pdbutil: The symbols can be downloaded later using pdbconv.py -p ntkrnlmp.pdb -g 15B12C74F0E177581B6B27DD4C5022C21
INFO     volatility3.framework.automagic: Running automagic: KernelModule

そうすると、上記のように pdbconv.py を使ってSymbolをダウンロードするようにというメッセージが表示されます。-p オプションで指定されているのが、対象のPDBファイルで、-g オプションで指定されている値がダウンロードするファイルの識別子を表す”[GUID][AGE]”で構成されたものです(PDBファイル名は、ntkrnlmp.pdb以外にも、ntkrnlpa.pdb、ntkrpamp.pdb、ntoskrnl.pdbなどになる可能性があります)。
マイクロソフトでは、これらの値をもとにSymbolファイルを管理しており、以下のようにURL内にPDB、GUIDおよびAGEを指定することでSymbolファイルをダウンロードすることができます。

http://msdl.microsoft.com/download/symbols/ntkrnlmp.pdb/15B12C74F0E177581B6B27DD4C5022C21/ntkrnlmp.pdb

なお、GUIDおよびAGEはNTカーネル内の値から構成されており、以下のようなスクリプトからも取得することが可能です。

import binascii
from pefile import PE

pe = PE("C:\\Windows\\System32\\ntoskrnl.exe")
debug = pe.DIRECTORY_ENTRY_DEBUG[0].entry        
guid = "{0:08x}{1:04x}{2:04x}{3}_{4}".format(debug.Signature_Data1,
                                             debug.Signature_Data2,
                                             debug.Signature_Data3,
                                             binascii.hexlify(debug.Signature_Data4).decode("utf-8"),
                                             debug.Age)
print(guid)

2. SymbolファイルのダウンロードおよびSymbol Table作成

SymbolファイルのダウンロードおよびSymbol Tableの作成は、先ほどのメッセージで表示されたように、Volatility 3内に含まれるスクリプトをマイクロソフトのWebサイトと接続可能な環境で、実行することにより、自動的にダウンロードおよび作成できます。

$ python3 volatility3/framework/symbols/windows/pdbconv.py -p ntkrnlmp.pdb -g 15B12C74F0E177581B6B27DD4C5022C21

作成が完了すると、15B12C74F0E177581B6B27DD4C5022C2-1.json.xz のようなファイル名でSymbol Tableが保存されます。作成されたファイルは、JSON形式のファイルをXZ圧縮したものになっています。Volatility 3では、デフォルトでは”[GUID]-[AGE].json.xz”というファイル名を、Symbol Tableとして読み込む仕様になっています。

なお、すでにマイクロソフトのWebサイトでSymbolファイルの入手ができている場合は、以下のように、ダウンロードしたファイルを指定することで、Symbol Tableを作成することも可能です。

$ pdbconv.py -f BC8878BDD1A2849E42F82393A5053B88A42197AE4EC5F058F95C2208903785A100.blob -o 15B12C74F0E177581B6B27DD4C5022C2-1.json.xz

※ 出力するファイル名の拡張子を”.xz”にすることでXZ圧縮されます。

3. Volatility 3への適用

作成したSymbol Tableは、以下のディレクトリに保存することで、使用できます。

volatility3/volatility3/symbols/windows/ntkrnlmp.pdb/

上記ディレクトリ以外にも、-s オプションを指定して実行することで、Symbol Tableの保存先を指定することも可能です。

$ ls symbol-dir/windows/ntkrnlmp.pdb/
15B12C74F0E177581B6B27DD4C5022C2-1.json.xz
$ python3 vol.py -f test.mem -s symbols-dir windows.info

おわりに

今回は、Windows OSのメモリイメージを分析するためにSymbol Tableを作成する方法について紹介しましたが、macOSやLinuxについては、自動でSymbol Tableを作成する仕組みはないため、手動で作成する必要があります[3]。macOSおよびLinuxの、Symbol Tableを作成するにはdwarf2jsonというツールを使用します。dwarf2jsonの使用方法については、また別の機会に紹介したいと思います。
なお、Widnows OS用のSymbol TableをGithubに公開していますので、もしVolatility 3をオフラインで使用する場合はご活用ください。

GitHub: JPCERTCC/Windows-Symbol-Tables
https://github.com/JPCERTCC/Windows-Symbol-Tables

インシデントレスポンスグループ 朝長 秀誠

参考情報

[1] Volatility Labs: Announcing the Volatility 3 Public Beta!
https://volatility-labs.blogspot.com/2019/10/announcing-volatility-3-public-beta.html

[2] Volatility Docs: Changes between Volatility 2 and Volatility 3
https://volatility3.readthedocs.io/en/latest/vol2to3.html

[3] Volatility Docs: Creating New Symbol Tables
https://volatility3.readthedocs.io/en/latest/symbol-tables.html

≪ 前へ
トップに戻る
次へ ≫