概要
volatilityの作法、調べてみた。
使い処。
プロセス
プロセスリストを見れば,システム上で何が実行されているのかがわかる。
メモリ解析では,システム上の実行中の各プロセスを構成するExecutiveProcessブロックというカーネルデータの構造体を列挙することによって,プロセスリストを再現できる。
攻撃者がフックやカーネルオブジェクト操作などのルートキットのテクニックを用いて一般的なWindows API関数からプロセスを隠している場合,この手法で実行中のプロセスのリストを再構築し,観測することができる。
Process
volatility -f [image] --profile=[OS Profile] pslist
volatility -f [image] --profile=[OS Profile] psscan
volatility -f [image] --profile=[OS Profile] pstree
volatility -f [image] --profile=[OS Profile] psxview
volatility -f [image] --profile=[OS Profile] psxview --apply-rules
ハンドル
ハンドルはメモリのアドレスを間接的に指すものであり,しばしば「ポインタのポインタ」と表現される。
ハンドルはファイル,レジストリキー,セキュリティトークン,スレッドなどの情報に間接的にアクセス可能である。
ハンドルを見ることで,各ハンドルの対応するオブジェクトを知ることができ,併せて実行中の動作の実態が観測できる。
Registry
volatility -f [image] --profile=[OS Profile] hivelist
volatility -f [image] --profile=[OS Profile] printkey -K "[registry key]"
volatility -f [image] --profile=[OS Profile] userassist
volatility -f [image] --profile=[OS Profile] shellbags
volatility -f [image] --profile=[OS Profile] shellbags --output-file=[shellbags.body] --output=body
volatility -f [image] --profile=[OS Profile] shimcache
volatility -f [image] --profile=[OS Profile] getsids --offset [address]
volatility -f [image] --profile=[OS Profile] privs --offset [address]
volatility -f [image] --profile=[OS Profile] hashdump
volatility -f [image] --profile=[OS Profile] lsadump
セクション
ノイマン型コンピュータでプログラムを実行するためには,プログラムローダと呼ばれるプログラムが必要になる。
プログラムローダは,トランスレータが出力する実行形式ファイルの中にあるプログラムを,正しくメモリに配置しなければならないが,このときに配置の単位となるのがセクションである。
そのため,セクションは,どのような特性を持ったメモリ(セクション属性)に,どんなデータを,どこから置くかといった情報を持っている。
メモリフォレンジックにより,各領域やセクションに何がロードされたかが直接指すのはポインタ確認できる。
セクションは,ファイルやロードされたDLLにマッピングされることもあれば,ヒープ空間やスタック空間などの動的な内容を表すことも可能であり,これを解析することにより,マルウェアが密かにDLLをロードしようとしたり,メモリにしか存在しないコードを実行しようとしたりするプロセス改ざん攻撃の証拠を特定することが可能である。
またメモリマネージャによって確保されている仮想アドレス記述子(VAD)ツリーというカーネルデータ構造体によっても,同様のことが可能である。
Vad
volatility -f [image] --profile=[OS Profile] -p [pid] vadinfo
volatility -f [image] --profile=[OS Profile] -p vaddump -D [Directory]
ネットワーク
接続使用したネットワークを確認することが可能であり,プロセス名,IPおよびポート番号,宛先,接続状態,ソケットの作成時刻などが残されている。
Network
volatility -f [image] --profile=[OS Profile] netscan
volatility -f [image] --profile=[OS Profile] connections
volatility -f [image] --profile=[OS Profile] connscan
volatility -f [image] --profile=[OS Profile] sockscan
ロードされたドライバ
メモリフォレンジックにより,ロードされたドライバを知るためのカーネル構造体を確認できる。
悪意あるドライバは昇格された特権で実行され,OSの低レベルのコンポーネントにアクセスする。
多くの場合,不正なエントリの証拠を探すためには,ロードされたドライバのレビューが重要である。
DLL
volatility -f [image] --profile=[OS Profile] dlllist
volatility -f [image] --profile=[OS Profile] handles -p [pid] -t File
volatility -f [image] --profile=[OS Profile] handles -p [pid] -t Key
volatility -f [image] --profile=[OS Profile] handles -p [pid] -t Directory
volatility -f [image] --profile=[OS Profile] handles -p [pid] -t Port
volatility -f [image] --profile=[OS Profile] handles -p [pid] -t Mutant
volatility -f [image] --profile=[OS Profile] handles --offset [address]
コンソールのコマンド履歴
いくつかのWindowsプロセスは,cmd.exeなどのコンソール経由で実行されたコマンドのヒストリーを持っている。
攻撃者によって,コマンドが実行されていた場合の証拠探しに有用である。
Vistaよりも前のWindowsでは,この種の証拠はクライアントサーバランシステム(csrss.exe)で見ることができた。
Vista以降では,コンソールホストプロセス(conhost.exe)によってその情報が保持されている。
Command history
volatility -f [image] --profile=[OS Profile] cmdscan
volatility -f [image] --profile=[OS Profile] consoles
メモリ内の文字列
stringsを読むことは,単純ながらも初期のトリアージには有用な調査方法である。
特に既知の攻撃である場合,特定の文字列を起点に調査を進展させることができる。
難読化や暗号化をされていると解読できないという欠点があるものの,一度試してみるだけの価値はある。
Strings
volatility -f [image] --profile=[OS Profile] strings -s strings.txt > [out.txt]
Yarascan
volatility -f [image] --profile=[OS Profile] yarascan --yara-rules="[strings]"
volatility -f [image] --profile=[OS Profile] yarascan -p [pid] --yara-rules="[binary code]"
volatility -f [image] --profile=[OS Profile] yarascan -p [pid] --yara-rules="[strings]"
資格情報
解析ツールによっては、windowsアカウントに関する情報が取得可能である。
getsids
volatility -f [image] --profile=[OS Profile] getsids --offset [address]
プロセスインジェクションの解析
プロセスインジェクションは、攻撃者が用意した悪意あるプロセスによって、正規のプロセスに対してインジェクションを行い、実行させる攻撃である。
プロセスインジェクションに成功すると、注入されたプロセスを終了させることも継続して実行させることも可能である。
これは、メモリ上のみの攻撃であり、注入されたプロセスに対応するディスク上の実行ファイルには変化は起こらない。
しかも、注入されたプロセスには、通常、どのプロセスが注入に関与したのかを示す証拠は含まれない。
攻撃者は、必要な特権さえあれば、windowsのさまざまなapiとメカニズムを悪用してインジェクションを行う。
インジェクションには様々な形態が存在し、プロセスのメモリを悪意あるプロセスで上書きする。
これを検出するには、インジェクション技術の多くで残される異常なプロセスメモリ空間などを用いる手法と、注入型のマルウェアを検出しシステム上での実行形態を見つける手法がある。
Timeline
volatility -f [image] --profile=[OS Profile] timeliner --output-file=timeliner.body --output=body
フッキングの解析
フッキングは、アンチウィルスソフトやホストベースの侵入防止システム、資産管理システムなどの正規のapiでも使用される技術である。
攻撃者も同様のメカニズムを用いて攻撃を行い、正規の呼び出しに悪意あるコードを挿入する。
悪意あるフッキングを抽出するためには、Import Addres Table(IAT)やInterrupt Descriptor Table(IDT),System Service Dispatch(SSD)など,フッキングされる特定の対象を重点的に解析を行う。
Volatility Frameworkのapihooksプラグインは,このようなインラインフックやIATなどの特定のフッキングのみを対象とするAPIフックを検出する。
API
volatility -f [image] --profile=[OS Profile] apihooks
以上。