アメリカの実践的なセキュリティの教育をしているSANSが、フォレンジックに使うツールをまとめたLinuxイメージを公開しています。
SANS DFIR SIFT Workstation
https://digital-forensics.sans.org/community/downloads
実際に使いこなすには、FOR500、FOR508あたりを受講しないと難しいですが。
https://digital-forensics.sans.org/training
Volatility Frameworkはオープンソースのメモリフォレンジックツールで、公式が以下で公開してます。
https://www.volatilityfoundation.org
今回は、SIFTにインストールされているのVolatility Frameworkを使ってメモリイメージを解析しようとしたところ、問題が起きたのでその解決方法をメモしておきます。
メモリの解析でエラー
メモリイメージはダンプツールで取得しています。
今回は、Magnet社が無償で配布しているMagnetRAMCapture.exeを使わせていただきました。
(ただし、ダウンロードは無償ですが、ユーザ登録が必要です。)
早速、メモリイメージの概要を分析します。
vol.py -f (イメージファイル名) imageinfo
ここで、ツールで解析を進めるにあたって最も欲しいのはProfile情報です。
メモリイメージは、OSの種類やバージョンによってレイアウトが変わるため、正しいプロファイルを指定しないと正しく解析できません。
Suggested Profile(s)に出ているのが推測されたプロファイルとなります。
実際には、OSからメモリダンプをする際にバージョンを控えておいたほうがいいでしょう。
問題はここから。
今回用いた、マルウェア解析用のWindowsのバージョン(バージョン1709、ビルド16299.492)と合わないのです。
試しに、一番近そうなプロファイルでpslistを実行してプロセスリストを表示してみます。
vol.py -f (イメージファイル名) --profile=Win10x64_10586 pslist
うーん、なんかそれっぽいリストはでたものの、ところどころ「?」や関係ない文字が混じっています。
少し上手く解析できておらず、関係ないデータを読んでしまっている模様。
さらに、hashdumpを実行するとエラー。レジストリは上手く読めないようです。
vol.py -f (イメージファイル名) --profile=Win10x64_10586 hashdump
やはり、バージョンの違いでパーサーが推測するメモリのレイアウトが合わない模様。
特にWindows10になってからは、大きなバージョンアップの度にメモリのレイアウトが変わっているようです。
--infoで対応しているプロファイルリストを表示させてみると、やはりダンプしたメモリイメージに対応したプロファイルがない模様。
Pluginの更新で解決
そこで、Volatilityに新たなソースがないか調べてみました。
ソースはGithubで公開されています。
https://github.com/volatilityfoundation/volatility
「Clone or download」でzipファイルを任意のディレクトリにダウンロードし、解凍します。
unzip volatility-master.zip
このファイルの中のうち、「plugins」を更新してやれば上手くいくはず。
SANS SIFTには既にvolatilityがインストールされています。
pluginsへのパスは以下のとおり。
/usr/lib/python2.7/dist-packages/volatility/plugins
(2020年6月21日追記)
2020年6月時点でダウンロードしたSANS SIFTでは、以下のディレクトリに変更になっていました。
/usr/local/lib/python2.7/dist-packages/volatility/plugins
dist-packageの下に、volatility/pluginsがあるかどうかで判断してください。
(2020年6月21追記 その2)
以下の方法の場合、plugin/communityの下にある機能(autorunsなど)が使えなくなります。
必要に応じて、plugin_oldのcommunityディレクトリのデータをコピーしてください。
ただし、この手順でpluginを変えるほどの変更がある場合、communityの古いコードでは上手く動かないことがあります。その場合は、作成者のコードをgithub等で入手して適用してください。
このプラグインを更新してみます。
一応、古いプラグインはリネームして残しておきます。
(※注意:例は volatility-master.zip を /home/sansforensics/vol で解凍していた場合)
cd /usr/lib/python2.7/dist-packages/volatility/plugins
sudo mv plugins plugins_old
sudo cp -rp /home/sansforensics/vol/volatility-master/volatility/plugins .
--infoでプロファイルを確認したところ、Windows10のプロファイルが増えています。
今度は上手くバージョンが合うかもしれない、ということで、新しいプラグインでもう一度imageinfoしてみます。
vol.py -f (イメージファイル名) imageinfo
Win10x64_15063でインスタンス化されている、というようなメッセージがでているので、これをプロファイルに使用してみます。
(一応、バージョンは調べてなかった想定)
プロファイルに Win10x64_15063 を指定して、再度pslistを実行します。
vol.py -f (イメージファイル名) --profile=Win10x64_15063 pslist
今度は pslist も結果が正しく表示されました。
さらに、hashdumpを実行してレジストリが読めるかを確認します。
vol.py -f (イメージファイル名) --profile=Win10x64_10586 hashdump
ハッシュ値がちゃんと表示されました。
メモリダンプしたのはマルウェア検証用のVMですが、一応ハッシュ値は隠しておきます。
今回のハッシュ値の検証用に作ったユーザは、VMを戻すと消えるので例として残しておきます。
今回は、Windowsのパスワードハッシュに関してちょっと確認・検証してみたくて、その準備中に躓いてしまい、その解決法が分かったのでメモしておきました。
Volatilityはマメに更新されているので、手動でのアップデートもちょくちょくやることになるかなと思います。
割と、pluginの更新でいけちゃうことや、pluginのパスを忘れてしまうので。
このメモの元になったNTLMハッシュ関連については、検証が終わってネタになりそうならまたメモしておきます。