Weird Wired World

Programming, Security

VolatilityでStuxnetのメモリダンプ解析 #2

前回に引き続きStuxnetに感染したPCのメモリダンプの解析を行う。

前回はpstreeによりプロセス一覧を表示しpid1928, 868が不審なプロセスであると特定した。この結果を踏まえつつ,他のアプローチで不審なプロセスを挙げていく。

3. ネットワークの調査

ネットワーク調査にはconnectionsコマンド, socketsコマンドやsockscanコマンドを用いる。今回はsockscanの実行結果を下図に示す。

f:id:enufranz:20171028142303p:plain

特に不審な通信は見つからなかった。なお,pid680(lsass)がポート500, 4500で通信を行うのは正常な動作である。

4. DLLの調査

4.1 前提知識

DLLの調査にはDLLについての知識が不可欠である。本項では以降の項を読み進めるのに必要なDLLの知識を掻い摘んで説明する。

まず,プロセスとDLLの紐づけ(管理方法)について述べる。これはPEB(Process Environment Block)と呼ばれるプロセスごとの管理情報のメンバとして,プロセスメモリ内で管理される。もう少し言うと,3通りの方法,読み込んだ順,メモリ番地順,初期化順それぞれの方法で,リスト(双方向リスト)として管理されている。

次に,プロセスのDLL情報の隠蔽方法について述べる。DLLのリンク情報を隠蔽する方法は幾つかあり,その1つがPEB内の上述の3つのリストを,「ポインタ」の付け替えによって改竄することである。PEBはプロセスメモリ内にあるから,プロセス自身が改竄できる。具体的には,3つのリストは双方向リストだから,1つ前のノードのFLINK(Foward Link),1つ後のノードのBLINK(Backward Link)の値を書き換えれば良い。これでPEBから当該DLLの情報が見えなくなる。

一方で,プロセスが実際に割り当てた仮想メモリの管理情報から,読み込んだDLLの情報を知ることもできる。この管理情報はVAD(Virtual Address Descriptor, 仮想アドレス記述子)と呼ばれるもので,カーネルメモリ内でプロセスごとの木構造(平衡二分探索木)*1として管理される。VADは仮想アドレスの範囲をキーに,値としてMapped Allocation(読み込んだDLL等)またはPrivate Allocation(ヒープ,スタック等)を管理する*2。従ってVADを辿りMapped Allocationのノードを見れば,読み込んだDLL等の情報を知ることができる。

最後に,PEBとVADの整合性の検証について述べる。先述した方法でPEBの情報を改竄したとして,攻撃者次第であるが,VADに実際に読み込まれている情報(Mapped Allocation)と不整合が生じる。VADはカーネルメモリ内にあるため,アクセスにはリング0権限が必要であり,手が出しにくいのである。後に紹介するldrmodulesはこの整合性を確認するコマンドである。

4.2 VolatilityにおけるDLLの調査

DLLの調査にはdlllistコマンド, ldrmodulesコマンド, malfindコマンドやhollowfindコマンドを用いる。

4.3 dlllistによる調査

dlllistはOS全体,もしくは特定のプロセスが読み込んでいるDLLの一覧を表示するコマンドである。これはPEBの「読み込んだ順のモジュールリスト」を探索することにより行う。従って4.1に述べた方法で改竄されている可能性がある点に留意する。

確認する主なポイントは,不審なパスのDLLの読み込みの有無読み込んでいるDLLの数と後述のVAD情報との整合性である。2点目に挙げたポイントはマルウェアの読み込むDLLの数が少ない傾向があることを利用したものである。3点目に挙げたポイントはldrmodulesの項で取り上げる。

不審なパスのDLLの読み込みの有無

dlllistを実行すると「KERNEL32.DLL.ASLR.*」を含む不審なDLLが目につく。

このDLLを読み込むプロセス一覧を取得する。具体的にはdlllistの実行結果をファイルに書き出し,先述の不審なDLL名で検索をかける*3。するとpid668(service.exe), 940(svchost.exe), 1928(lsass.exe)がこれを読み込んでいることが分かる。

ついでに,実行結果の「Command Line」(起動時のコマンドライン)でも, pid868と1928に不審な点が見つかる。パスの区切りが\\となっている点が他と比べて不審である。これがどの程度他のマルウェアに見られる特徴かは私には分からない。

lsass.exe pid:    868
Command line : "C:\WINDOWS\\system32\\lsass.exe"
(中略)
lsass.exe pid:   1928
Command line : "C:\WINDOWS\\system32\\lsass.exe"
(以下略)

読み込んでいるDLLの数

root@kali:~/volatility/stuxnet# volatility -f stuxnet.vmem dlllist -p 680 | wc -l
Volatility Foundation Volatility Framework 2.6
64
root@kali:~/volatility/stuxnet# volatility -f stuxnet.vmem dlllist -p 1928 | wc -l
Volatility Foundation Volatility Framework 2.6
35
root@kali:~/volatility/stuxnet# volatility -f stuxnet.vmem dlllist -p 868 | wc -l
Volatility Foundation Volatility Framework 2.6
15

4.4 ldrmodulesによる調査

ldrmodulesは隠蔽されたDLLのリンク情報を検出するためのコマンドである。PEBとVADの情報が一致するかの表示を行う。

実行結果

pid868に対する実行結果を,dlllistと対比して次の図に示す:

f:id:enufranz:20171028140922p:plain

ldrmodulesの結果について,B, C共にMapped Pathの値が空欄であり,攻撃者によって隠蔽されていると考えられる。 また,dlllistと対比すると次の2点が不審である:

  • dlllistに,ldrmodulesのBに該当する項目(0x00080000)が存在しない点が不審である。4.1に述べた方法で改竄された可能性がある。
  • ldrmodulesのCに該当する項目は,dlllistではAであるが,MappedPathの値が空欄にっており不審である。期待する値はAと同様lsass.exeのパスである。

最後に

本日はここまでにします。

#3はmalfind, holloowfind, #4でdumpdllを書く...はずです。年内目標です(^^;)

*1:キーが仮想アドレスの範囲。親ノードより開始アドレスが小さければ左に,大きければ右に,子ノードとして追加される。

*2:Reversing: Secrets of Reverse Engineering, Eldad Eilam, 2005

*3:ださいようですが他に良い方法を知りません...