サイト内の現在位置

メモリフォレンジックCTF「MemLabs」Lab1のWriteUp

NECセキュリティブログ

2020年1月31日

NEC サイバーセキュリティ戦略本部セキュリティ技術センターの山﨑です。今回のブログでは、これからメモリフォレンジックの勉強を始めようと考えている方向けに、P.Abhiram Kumar氏が1月上旬に公開した、MemLabs(new windowhttps://github.com/stuxnet999/MemLabs)Lab1(レベル:Easy、フラグ:3つ)のWriteUpを書いてみようと思います。スキル習得の近道は実際に手を動かすことだと思うので、フラグを獲得するまでの全ての手順は書きません。フラグ獲得の直前までになります。

  • 解き方はあくまで一例として捉えて下さい。

MemLabsに取り組もうと考えた背景

私が所属しているセキュリティ技術センターはNECがお客様へ納品するシステムや製品のセキュリティ検査を攻撃者視点で行っています。検査案件の中では、メモリやシステムのバイナリデータを取り扱うことがよくあります。
MemLabsはメモリフォレンジックに特化したCTFで、6つのLab(演習問題)が用意されています。Lab毎にEasyやHardなどの難易度が設定されており、メモリフォレンジックの経験・能力に応じて問題が選択しやすく、効果的な学習ツールだと考え、取り組むことにしました。

初動調査

今回は、メモリフォレンジックツール「Volatility」を使ってみます。Volatility(*1)では、解析をする際にOSのプロファイルを指定する必要があります(*2)。Imageinfoプラグインでメモリダンプを取得したOSプロファイルを確認します。

  • (*1)
    Pythonで書かれたオープンソースのメモリフォレンジックツール。本ツールのプラグインを使用することで、インシデント対応やマルウェア解析に役立つ様々な情報収集が可能。詳しい使用方法は参考資料[1]を参照。
  • (*2)
    メモリレイアウトはプロファイル(OSの種類、bit、バージョンなど)によって異なるため、正しい解析をするためには正しいプロファイルを指定する必要がある。

# volatility.exe -f MemoryDump_Lab1.raw imageinfo

WriteUp画面1

いくつか候補がでてきますが、一番左に表示されているWin7SP1x64をOSのプロファイルとして進めます。

続いて、メモリダンプ取得時に動いていたプロセスを確認します。これを調べるためのプラグインはいくつかありますが、ここではプロセスの親子関係が明示的で把握しやすいpstreeを使いました。

# volatility.exe -f MemoryDump_Lab1.raw --profile=Win7SP1x64 pstree

WriteUp画面2

近年のマルウェアには、解析を困難にさせるためにWindowsの正規プロセスに偽装して動作するものがあります。この時、プロセスの状態(親子関係や起動しているプロセス数など)が、正常とは異なる状態で痕跡が残っている可能性があるため、「正常な状態」を理解しておくことで不審なプロセスを特定することができます(「正常な状態」に関しては、参考資料[2]がよくまとめられています)。
今回のLabでは上記観点で不審なプロセスは見当たらなかったため、ユーザが起動したプロセス(explorer.exeの子プロセス)に着目し、以下3つを詳細に調査していくことにしました。

  • WinRAR.exe(PID:1512)
  • cmd.exe(PID:1984)
  • mspaint.exe(PID:2424)
  • DumpIt.exeはメモリダンプをするためのツール

Flag1発見までの流れ

cmd.exe(PID:1984)について詳しく見ていきます。volatilityにはcmd.exeで実行したコマンド履歴やその実行結果を取得できるプラグインがあります。実行コマンド履歴のみを取得するのであればcmdscanを、実行結果まで含めて取得するのであればconsolesを使います。

# volatility.exe -f MemoryDump_Lab1.raw --profile=Win7SP1x64 consoles

WriteUp画面3

マスクした部分にフラグ獲得につながる重要な文字列が記載されています。

Flag2発見までの流れ

私はこのフラグの発見に苦労しました。結局見つけられたのは3このうち一番最後でした。ここでは、mspaint.exe(PID:2424)について詳しく見ていきます。
mspaint.exeはwindowsのペイントツールです。mspaint上でフラグ文字列などが書いてあるのかな?と予想し、memdumpプラグインを使用してこのプロセスのメモリダンプを取得します。

# volatility.exe -f MemoryDump_Lab1.raw --profile=Win7SP1x64 memdump -D . -p 2424

WriteUp画面4

検索サイトを使って、ダンプしたデータ(2424.dmp)を読み込む方法を調査します。「memdump mspaint」で調べると、画像加工ソフトGIMPならmspaint.exeをmemdumpでダンプしたデータを読み取れるという情報を得ました(参考資料[3])。2424.dmpを2424.dataにリネームし、GIMPで該当データを読み込みます。ウィンドウを画面いっぱいに広げ、それに合わせて幅、高さ調整しました。

WriteUp画面5

ここにフラグがあるのかも分からない中、無心でオフセットを上げ続けること15分。今まで真っ黒だったGIMPのウィンドウに、突然白色が見えてきました。

WriteUp画面6

後は幅と高さを調節すると、マスクした部分に文字列らしき物が見えてきます(上下反転された状態)。

WriteUp画面7

データを保存後、GIMPの機能を使って画像を上下反転させればフラグ獲得です。

Flag3発見までの流れ

WinRAR.exe(PID:1512)について詳しく見ていきます。WinRAR.exeがどのようなコマンドラインで起動したかを確認するためにcmdlineプラグインを使います。

# volatility.exe -f .\MemoryDump_Lab1.raw --profile=Win7SP1x64 cmdline | grep WinRAR.exe

WriteUp画面8

Important.rarという名前のファイルを解凍していることが確認できます。怪しい名前なのでここにフラグのヒントが潜んでいると推測し、このファイルの抽出を目指します。抽出にはメモリアドレスが必要になるのでfilescanプラグインでImportant.rarのメモリアドレスを取得します。

# volatility.exe –f MemoryDump_Lab1.raw --profile=Win7SP1x64 filescan | grep Important.rar

WriteUp画面9

一番左の列がメモリアドレスを表しています。dumpfilesプラグインでこのアドレスを指定するとRARファイルが抽出できます(今回は3つのアドレスが表示されましたが、どのアドレスでもImportant.rarを抽出できました)。

# volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 dumpfiles -D . -Q 0x000000003fa3ebc0 --name

WriteUp画面10

このRARファイルを解凍しようと試みると、パスワード入力が求められます。現時点ではパスワードが分からないのでWinRAR.exe(PID:1512)をmemdumpし、stringsコマンドでヒントとなるような可読可能文字列を探しました。

  • ”pass”でgrep

# volatility -f MemoryDump_Lab1.raw --profile=Win7SP1x64 memdump -D . -p 1512

WriteUp画面11

# strings 1512.dmp | grep pass

WriteUp画面12

“password is NTLM hash(in uppercase) of Alissa's account passwd.”
という文字列が見つかります。volatilityにはユーザアカウントのパスワードハッシュを取得するhashdumpプラグインがあるので、これを使います。

# volatility.exe -f MemoryDump_Lab1.raw --profile=Win7SP1x64 hashdump

WriteUp画面13

ヒントの内容から、パスワードはAlissaのNTLMハッシュを大文字にしたものであると分かります。RARファイルの解凍パスワードに、取得したパスワードを使用するとフラグが獲得できます。

おわりに

メモリフォレンジックCTF「MemLabs」のWriteUpを書いてみました。セキュリティ技術センターのメンバーもスキルアップのツールとしてCTFを活用しています。マスクした部分、みなさん気になるかと思いますのでぜひチャレンジしてみてください!

補足

Python2系が2020年1月1日でサポートを終了しました。Python3系で書かれたvolatility3も公開されていますが、プラグインの豊富さや、使い勝手から今回のMemLabsではPython2系で書かれたvolatility2.6を使用しています。

参考資料

執筆者プロフィール

山﨑 泉樹(やまざき せんじゅ)
セキュリティ技術センター リスクハンティングチーム

NECがお客様へ納品するシステム・製品への脆弱性検査を通じたセキュア開発支援、NECの社内CTF運営に従事。業後はフィジカルセキュリティの強化に励む。RISS、GPENを保持。