ブログ(脅威調査)

難読化されたラテラル・ムーブメント・ツールを動的解析するためのWindowsドメイン環境の構築

最近、難読化された大規模なマルウェアのサンプルに遭遇し、いくつかの興味深い分析課題を提供しました。仮想化を使用していたため、静的解析のために完全に難解化解除されたメモリダンプを作成することができませんでした。大規模な仮想化サンプルを静的に分析するには、数日から数週間かかる場合があります。この時間のかかるステップを回避することで、FLAREリバースエンジニアリングチームとMandiantコンサルティングチームは共同作業を実施して、最終的には、困難なリバースエンジニアリングにかかる時間を大幅に削減することができました。

私達は、分析するサンプルがラテラル・ムーブメント・ツールであることを疑っていたので、動的解析に適した環境が必要でした。テスト環境を設定することが不可欠であることが判明し、ドメインを活用したサンプルに遭遇した他のアナリストを支援したいと考えています。本ブログでは、マルウェアを実行するために仮想化されたWindowsドメインを設定するプロセスと、マルウェアの機能の一部を確認するために使用した解析手法について説明します。

予備分析

新しいマルウェアのサンプルを分析する際には、基本的な静的分析から始めます。そこでは、どのようなタイプのサンプルか、また、どのような能力かを知ることができます。これを使用して、解析プロセスの後続の段階に情報を通知し、関連するデータに焦点を当てることができます。まず、CFF ExplorerなどのPortable Executable分析ツールから始めます。この場合、サンプルが6.64MBと非常に大きいことが分かりました。これは通常、サンプルにはBoostやOpenSSLなどの静的にリンクされたライブラリが含まれていることを示しており、解析が困難になる可能性があります。

さらに、図1に示すように、インポートテーブルには8つの動的にリンクされたDLLが含まれており、インポートされた関数はそれぞれ1つだけであることに気付きました。これは、パッカーや難読化をすることによって、マルウェアが使用する実際のAPIを公開せずに、後でランタイムリンクするためにDLLをインポートする目的で一般的に利用されるテクニックです。


図1:疑わしいインポート

文字列を解析した結果、このマルウェアは静的に解析するのが難しいのではないかという疑念が浮上しました。ファイルが非常に大きいので、考慮すべき文字列は75,000以上ありました。StringSifterを使用して、マルウェア解析との関連性に応じて文字列をランク付けしましたが、有用なものは見つかりませんでした。図2は、StringSifterによると、最も関連性の高い文字列を示しています。


図2:StringSifterの出力

このような障害に遭遇した場合、マルウェアの挙動を明らかにするために動的分析に頼ることがよくあります。この場合、私たちの基本的な動的分析は希望を与えてくれました。サンプルを実行すると、Usage文字列が出力されます:

Usage: evil.exe [/P:str] [/S[:str]] [/B:str] [/F:str] [/C] [/L:str] [/H:str] [/T:int] [/E:int] [/R]
   /P:str -- path to payload file.
   /S[:str] -- share for reverse copy.
   /B:str -- path to file to load settings from.
   /F:str -- write log to specified file.
   /C -- write log to console.
   /L:str -- path to file with host list.
   /H:str -- host name to process.
   /T:int -- maximum number of concurrent threads.
   /E:int -- number of seconds to delay before payload deletion (set to 0 to avoid remove).
   /R -- remove payload from hosts (/P and /S will be ignored).
If /S specifed without value, random name will be used.
/L and /H can be combined and specified more than once. At least one must present.
/B will be processed after all other flags and will override any specified values (if any).
All parameters are case sensetive.

図3:Usageの出力

処理を中断してメモリをダンプすることで、サンプルの解凍を試みました。しかしながら、マルウェアがほぼ瞬時に終了し、それ自体を削除することが困難であることが判明しました。最終的には、図4のコマンドを使用して、部分的に解凍されたメモリダンプを生成することができました。

sleep 2 && evil.exe /P:"C:\Windows\System32\calc.exe" /E:1000 /F:log.txt /H:some_host

図4:バイナリを実行するための実行コマンド

ペイロードファイルは任意のものを選び、ペイロード削除の間隔を大きくしました。また、ペイロードを実行するためのログファイル名とホスト名も提供しました。これらのパラメータは、強制的に実行時間を遅くするように意図しているので、プロセスが終了する前にプロセスを中断することができます。

Process Dumpツールを使用して、2秒遅れでメモリスナップショットを作成しました。残念ながら、仮想化は静的解析の妨げになっており、サンプルはほとんど難読化されたままでしたが、必要な突破口となる文字列を抽出することができました。

図5は、元のバイナリには存在しない興味深い文字列をいくつか示しています。

dumpedswaqp.exe
psxexesvc
schtasks.exe /create /tn "%s" /tr "%s" /s "%s" /sc onstart /ru system /f
schtasks.exe /run /tn "%s" /s "%s"
schtasks.exe /delete /tn "%s" /s "%s" /f
ServicesActive
Payload direct-copied
Payload reverse-copied
Payload removed
Task created
Task executed
Task deleted
SM opened
Service created
Service started
Service stopped
Service removed
Total hosts: %d, Threads: %d
SHARE_%c%c%c%c
Share "%s" created, path "%s"
Share "%s" removed
Error at hooking API "%S"
Dumping first %d bytes:
DllRegisterServer
DllInstall
register
install

図5:メモリダンプから出力される文字列

これまでの分析から、リモートシステムへのアクセスが疑われます。しかし、水平展開の環境を整えることができず、疑惑を確認することができませんでした。分析を迅速化するために、仮想化されたWindowsドメインを作成しました。

これにはいくつかの設定が必要なので、この解析手法を使用する際の参考となるように、このプロセスをここに文書化しました。

テスト環境の構築

テスト環境では、クリーンなWindows 10とWindows Server 2016(Desktop Experience)の仮想マシンがインストールされていることを確認します。Windows Server 2016のマシンを2台作成して、ドメインコントローラーと他のテストシステムを分離できるようにすることをお勧めします。

ホストシステム上のVMware Virtual Network Editorで、以下の設定でカスタムネットワークを作成します。

  • 「VMNet Information」で、「Host-only」ラジオボタンを選択します。
  • 「ホスト仮想アダプタを接続する」が無効になっていることを確認して、外部との接続ができないようにします。
  • 静的IPアドレスを使用する場合は、「ローカルDHCPサービスを使用する」オプションが無効になっていることを確認してください。

VMNet Informationの設定例は、図6を参考にしてください。


図6:仮想ネットワークアダプタの構成

次に、ゲストのネットワークアダプタを設定して、このネットワークに接続します。

  • 仮想マシンのホスト名と静的 IP アドレスを設定します。
  • すべてのゲストのデフォルトゲートウェイおよびDNSサーバーとしてドメインコントローラーのIPを選択します。

システム設定の例は、図7に示すとおりです。


図7:システム構成例

すべての設定が完了したら、指定されたドメインコントローラーサーバーにActive DirectoryドメインサービスとDNSサーバーのロールをインストールして開始します。これは、Windows Server Manager アプリケーションを介して図 8 に示すオプションを選択することで行うことができます。デフォルトの設定は、ロールが追加されたときにダイアログ全体で使用することができます。


図8:ドメインコントローラで必要なロール

ロールがインストールされたら、図9に示すように、プロモーション操作を実行します。Active Directoryドメインサービスのロールがサーバーに追加されると、通知メニュー(フラグアイコン)からプロモーションオプションにアクセスできます。testdomain.localなどの完全修飾されたルートドメイン名で新しいフォレストを追加します。その他のオプションはデフォルトのままでもかまいません。プロモーションプロセスが完了したら、システムを再起動します。


図9:Server Managerでのドメインコントローラへの役割プロモーション

ドメインコントローラにプロモーションしたら、ドメインコントローラ上のActive Directory Users and Computers(Active Directoryユーザとコンピュータ)経由でテストユーザーアカウントを作成します。一例を図10に示します。


図10:テストユーザーアカウント

テストアカウントを作成したら、仮想ネットワーク上の他のシステムをドメインに結合するために進みます。これは、図 11 に示すように、「Advanced System Settings(システムの詳細設定)」から行うことができます。テストアカウントの資格情報を使用して、システムをドメインに参加させます。


図11:各ゲストのドメイン名の構成

すべてのシステムがドメインに参加したら、各システムが他のシステムにpingできることを確認します。テスト環境では、各システムがテスト環境で他のシステムの利用可能なサービスにすべてアクセスできるように、Windowsファイアウォールを無効にすることをお勧めします。

すべてのテストシステム上のテスト アカウントの管理者権限を与えます。これは、図 12 に示すコマンドを使用して各システムのローカル管理者グループを手動で変更するか、または Group Policy Object (GPO) を使用して自動化することで行うことができます。

net localgroup administrators sa_jdoe /ADD

図12:ローカル管理者グループにユーザーを追加するコマンド

ドメインの動的解析

この時点で、動的分析を開始する準備が整いました。WiresharkとProcess Monitorをインストールして起動し、テスト環境を整えました。3人のゲストすべてのスナップショットを取得し、図13に示すように、クライアント上のテストドメインアカウントのコンテキストでマルウェアを実行しました。

evil.exe /P:"C:\Windows\System32\calc.exe" /L:hostnames.txt /F:log.txt /S /C

図13:マルウェアの実行に使用されるコマンド

hostnames.txtファイルには、図14に示すように、以下の行で区切られたホスト名を入力しました。

DBPROD.testdomain.local
client.testdomain.local
DC.testdomain.local

図14:hostnames.txtのファイル内容

パケットキャプチャ解析

パケットキャプチャのトラフィックを分析した結果、ホストリストの各システムへのSMB接続を確認しました。SMBハンドシェイクが完了する前に、Kerberosチケットが要求されました。図 15 に示すように、Ticket Granting Ticket (TGT)がユーザに要求され、サービスチケットが各サーバに要求されました。Kerberos 認証プロトコルの詳細については、新しい Mandiant Red Team ツールとともにプロトコルを紹介した最近のブログ記事をご覧ください。


図15:Kerberos認証プロセス

マルウェアはSMB経由でC$共有にアクセスし、ファイルC:\Windows\swaqp.exeを書き込みました。そして、RPCを使ってSVCCTLを起動し、サービスの登録や起動に利用していました。SVCCTLはswaqpdサービスを作成しました。このサービスはペイロードの実行に使用され、その後削除されました。最後にファイルを削除したところ、追加の活動は見られませんでした。トラフィックを図16に示します。


図16:パケットキャプチャで観測されたマルウェアの振る舞い

プロセスモニタを用いたマルウェアの挙動の分析では、この観察を確認しました。その後、コマンドラインのオプションや環境を変えてマルウェアを実行するように進めました。静的分析を組み合わせることで、ペイロードをリモートホストにコピーし、サービスをインストールして実行し、その後証拠を削除するというマルウェアの能力に関して、確信をもった判断をすることができました。

結論

難読化された大きなサンプルの静的解析には、数十時間を要することがあります。動的分析は代替ソリューションを提供することができますが、適切な実行環境を予測してシミュレーションする必要があります。このケースでは、基本的な分析の基礎と仮想化されたWindowsドメインを組み合わせることで、目的を達成することができました。FLAREのリバースエンジニアリングの専門知識とMandiantのコンサルティングおよびRed Teamの経験を組み合わせることで、FireEyeが持つ多様なスキルを活用しました。この組み合わせは、分析時間を数時間に短縮しました。我々は、侵害されたホストから必要な指標を速やかに抽出することにより、迅速なインシデントレスポンス調査を提供してきています。この経験を共有することで、多くの方が水平展開の動きを分析するための環境を構築する際の一助になれば幸いです。

 

本ブログは、米FireEyeが公開した July 07, 2020「Configuring a Windows Domain to Dynamically Analyze an Obfuscated Lateral Movement Tool」(英語)の日本語抄訳版です。

日本語版:Reviewed by Toru Tanimura