DotDumperで解析:パブリックアップデートの概要について

2022年8月11日、DotDumperの初期公開版のリリースについてご紹介しました。簡単に説明すると、DotDumperは、DotNet Frameworkのターゲティングファイルのオープンソースの自動解凍ツールです。このブログでは、プロセスインジェクションを正常に記録するためのアンマネージドフック、GUIベースのログビューア、およびコマンドラインインターフェイスの引数処理の改善をサポートするパブリックアップデートについてお伝えします。これらのアップデートにより、DotDumperはより多くのデータ、より多くのコンテキストをフック(記録)することができるようになり、1回の実行で、また、異なるマルウェアサンプルの実行間で、ログエントリーの相関性を高めることができます。また、GUIベースのログビューアにより、DotDumperが作成したログを簡単に読み込んでフィルタリングすることができ、アナリストが消化しやすい塊に分解することで、分析中の貴重な時間を節約できます。

すべてのコードはGitHubで公開されており、コンパイル済みバイナリも公開されています。なお、DotDumperDotDumperNativeDotDumperGUIはそれぞれ別のリポジトリで公開されています。


プロセスインジェクションを記録するためのアンマネージドフックのサポート

DotNetベースのローダーは、DotNetベースではないペイロードを起動するために使用することができます。マルウェアの作成者は、ディスクに書き込まれたばかりのバイナリを実行する際に検出されるのを避けるため、ペイロードを別のプロセスに挿入することがよくあります。このような方法で別のプロセスと対話するために、行為者は、C(++)のような非管理型言語を使用するときのように、Windows API関数を使用することを選択することがよくあります。DotDumperの前バージョンでは、このような関数をフックすることができなかったため、これらのアクションをログに残すことができませんでした。この新しいバージョンは、これらの関数呼び出しをフックし、したがって、ログを記録することができます。これにより、マルウェアの動作をより完全に把握できるようになり、注入されたコードがダンプされる際のコピーも提供されます。

このリリースの主要な部分は、マネージドコンテキストからアンマネージド関数をフックできる機能です。対象となる関数は、マネージド関数でもアンマネージド関数でもかまいません。フックはマネージドまたはアンマネージドのいずれかにすることができ、(n) (アン) マネージド関数にリダイレクトする (n) (アン) マネージドターゲット関数の任意の組み合わせが許可されます。ただし、相互運用レイヤーがアンマネージ関数の呼び出しを処理する方法に起因する制限があります。マネージドフックの使用中にアンマネージ関数をフックすると、スタックの引数が読み取れなくなります。アンマネージドフックの使用中にアンマネージド関数をフックする場合、そのような制限はありません。

つまり、任意の関数をフックして、任意の関数にリダイレクトできるようになりました。ただし、1 つ注意点があります。アンマネージ関数の引数はマネージドコンテキストから適切に読み取ることができません。

この制限を解決するために、DotDumperは名前付きパイプを開き、新しく作成されたアンマネージコンポーネントがそれを介して通信します。これにより、DotDumperはフックされた関数からの引数を使用して内部ログシステムを使用できるようになります。

DotDumperNativeコンポーネントは独立しており、実行時に読み込まれるため、既存のフックを編集して1つのコンポーネントのみを置き換えることができます。たとえば、アンマネージドWriteProcessMemoryフックを変更し、ライブラリを再コンパイルして、それをDotDumperのフォルダーに配置できます。受信したデータ (およびその順序) が変更されない限り、ほとんどの変更について DotDumper自体を変更する必要はありません。アンマネージコンポーネントは、x86とx64の両方のアーキテクチャ用に (再) コンパイルする必要があることに注意してください。ランタイムに基づいて、DotDumperは正しいコンポーネントを読み込みます。


DotDumperGUI

DotDumperは軽量で自動化が容易なため、GUIはありませんが、JSONベースのログを閲覧するためのコンポーネントとして、DotDumperGUIという名称のGUIを新たに作成しました。Windows Forms ApplicationとしてDotNet Coreを使用したC#で書かれており、継続的に開発されているDotNet Coreフレームワークを活用しながら、Windows上で動作することを想定しています。下図がGUIを示しています。

図 1 - DotDumperGUI のインターフェイス
図1 – DotDumperGUIのインターフェース

DotDumperのログをJSONで読み込んで、簡単に閲覧することができます。上図のように、ログを選択すると、各項目の詳細が表示されます。また、特定のフィールドにキーワードを含むか含まないか、さらに制約を加えてフィルタを適用することができます。これにより、長いログの解析にかかる時間が短縮され、公園を散歩するような感覚で解析できるようになりました。フィルタリングされた結果は、新しいJSONログとして保存することができます。さらに、フィルター自体を保存して、将来再利用することも可能です。下図は、フィルターのインターフェイスです。

図 2 - DotDumperGUI のフィルター インターフェイス
図2 – DotDumperGUIのフィルターインターフェイス

キーワードと2つのチェックボックスを使用して、任意の数のフィルターを作成できます。ただし、ユーザーが矛盾するフィルターを作成することも可能です。つまり、同じフィルター値を含めたり除外したりしても結果は生成されません。必要に応じて、フィルタを削除することも、すべてのフィルタを単にクリアすることもできます。このようにして、ログからノイズを簡単にフィルタリングできるため、アナリストはログを迅速に切り取ることができます。以下に示すように、ドロップダウン ボックスはフィルタリングするフィールドを指定します。

図 3 - DotDumperGUI のフィルター オプション                                                                 
図3 – DotDumperGUIのフィルターオプション

すべてのテキストはリテラルテキストとして解釈されるため、(部分的な) フィルター値は正規表現をサポートしていないことに注意してください。フィルターを作成または削除すると、メインインターフェイスが自動的に更新され、変更が反映されます。メインUIとフィルタ作成UIの両方を開いたままにして、結果をより簡単にフィルタリングできます。

メインUIにはいくつかのコンテキストメニューがあり、そのほとんどは説明不要です。選択したトレースを右クリックしたときのコンテキストメニューは最も包括的で、選択したトレースに基づいて簡単にフィルタリングできます。

図 4 – DotDumperGUI のメイン インターフェイスのトレース コンテキスト メニュー                                                   
図4 – DotDumperGUIのメインインターフェイスのトレースコンテキストメニュー

ここで注目すべきは、「注入された実行可能ファイルをここから再構築する」機能です。この機能は、選択されたトレースから、読み込まれたフィルタリングされていないトレースの終わりまですべてのトレースを取り込み、トレースにリンクされているすべてのファイルを時系列に連結します。この機能を使用するには、関連するトレースのみが表示されるようにフィルターを追加し、呼び出しの間にノイズがないようにする必要があります。DotDumperの実行で読み込まれたJSONログファイルと同じフォルダに、新しいファイルが作成されます。ファイル名はデータのSHA-256ハッシュと同じになります。


サンドボックスのタイムアウトに対応

サンドボックスのタイムアウト対応機能は変更も修正もされていませんが、以前は文書化されていませんでした。DotDumperは指定されたファイルを実行するため、サンプルが終了するまでその実行は継続されます。マルウェアは多くの場合「待機」状態になり、一定の条件を満たさないと再アクティブ化しない、あるいはマルウェアが別のプロセスで(プロセスインジェクションの助けを借りて)実行を継続します。たとえば、ホログラムされたプロセスで新しく作成されたスレッドは、それが終了すると戻るだけです。

停止を回避するために、DotDumperには停滞ハンドラーが用意されています。フックの結果がログに記録されるたびに、カウンターが増分されます。20秒間隔が3回連続してもこのカウンターが変化しない場合、DotDumperは停滞状態が発生したと判断します。この場合、システムの時刻は30-12-2200 12:00に設定され、サンドボックスが強制的にタイムアウトになり、その後、ロガーを介してアナリストに通知され、サンドボックス自体が終了します。サンドボックス タイムアウトは、現在の日付から新しく設定された日付までの経過時間が通常の5分または10分を超えると発生します。サンドボックスのランタイムが時間または日に設定されている場合でも、それを超過します。

分析を短くする理由は、タイムアウトが10分の送信の実行には2分しかかからない可能性があるため、時間とリソースを節約するためです。そのため、停滞ハンドラーを使用して、同じ時間範囲で複数のサンプルを実行できます。停滞ハンドラーのロジックの概要を以下に示します。

図 5 - フローチャート内の停滞ハンドラーのロジック      

図 5 – フローチャート内の停滞ハンドラーのロジック


コマンドラインインターフェース

以前は、コマンドライン インターフェイス (CLI) には少なくとも2つの引数「-file C:\file.exe」が必要でした。新しいバージョンでは、単純に最初の引数としてファイルパスを使用できます。これにより、ツールがさらに直感的になり、一部の新規ユーザーが混乱するのを防ぐことができます。新しいヘルプ メニューは、以下のスクリーンショットに示されています。

図 6 - DotDumper の更新されたコマンドライン インターフェイスのヘルプ メニュー
図 6 – DotDumperの更新されたコマンドラインインターフェイスのヘルプメニュー


依存関係

最初のバージョンでは依存関係を使用していませんでしたが、新しいバージョンではPeNetを使用します。DotDumper の依存関係の要件は、ツールのカスタムバージョンをコンパイルするための複雑なビルドチェーンを回避することです。PeNetはNuGetで提供されているため、通常のビルドプロセスの中でPeNetを利用することができます。このライブラリを利用すると、可能な限り、インポートハッシュ、TypeRefHashと、検出されたデータの認証コードハッシュ (SHA-256 ベース) が計算されます。

さらに、DotNet Frameworkの内部で使用可能なクラスを使用して、検出されたデータのSHA-384およびSHA-512ハッシュが計算されます。


可読性の向上

最後に、人間が判読できるログ (実行時にlog.txtファイルに出力され、コンソールの標準出力に出力される) がさらに読みやすくなりました。空の値を出力しなくなることで、乱雑さが回避されるようになりました。たとえば、TypeRefHashは、DotNetをターゲットとするバイナリに対してのみ計算できます。さらに、データのブロブ (つまり、フックを介して取得された、base64コードされているが暗号化されたバイト配列) が正しいファイル形式でない場合、ハッシュは以前は空の文字列として表示されていましたが、現在は省略されています。無関係なデータを省略するとログが見やすくなり、アナリストは重要でない詳細に迷うことなくログ内を簡単にナビゲートできるようになります。

このようなデータの省略は、人間が判読できる出力にのみ適用されることに注意してください。JSONとXMLの両方のフォーマットで利用可能な機械可読出力にはこれらのフィールドが含まれていますが、フィールドを計算できなかった場合は、元の空の文字列が存在します。


バグの修正

このアップデートにはいくつかのバグ修正が含まれており、そのほとんどは使用時に明らかになったマイナーなエッジケースに関係していました。それらのほとんどは単にnullチェックの欠落について言及しているだけであるため、このブログで具体的に説明するほどのものではありません。GitHubリポジトリにある1つの問題は、バグレポートではなく、前述の停滞ハンドラーに関する質問でした。


開発者向けガイドライン

ソースからプロジェクトを再構築したくない人のために、必要なすべてのコンポーネントを含む事前コンパイルおよび事前構成されたアーカイブが、DotDumperリリースセクションで入手可能です。特定のニーズに合わせてプロジェクトを変更したり、プロジェクト全体を強化したりすることに興味がある人のために、詳細を以下に示します。

DotDumper、DotDumperNative、およびDotDumperGUIは連携して動作しますが、3つのコンポーネントすべてが、実行時に相互に通信するわけではありません。GUIは、ディスク上のJSONベースのログファイルと対話します。このログファイルは、DotDumperの実行が完了した後にのみ使用する必要がありますが、各増分ログは実行時に完全なJSONログを上書きします。DotDumperNativeのネイティブライブラリは、Visual Studio 2019 (またはそれ以降) を使用して、x86およびx64アーキテクチャの両方にそれぞれコンパイルする必要があります。以下のスクリーンショットはプロファイルを示しています。ライブラリを構築するときに、両方のアーキテクチャのデバッグプロファイルを使用できます。

図 7 - DotDumperNative のターゲット アーキテクチャ。プロジェクトのライブラリを構築する前に設定する必要があります。
図 7 – DotDumperNativeのターゲットアーキテクチャ(プロジェクトのライブラリを構築する前に設定する必要がある)

選択したアーキテクチャに応じて、結果として得られるライブラリは特定のフォルダーに存在します。x86の場合、これはプロジェクトのルートの「Debug」フォルダー内にありますが、x64ライブラリは同じくプロジェクトのルート内にある「x64\Debug」フォルダーにあります。どちらの場合も、必要なのは「DotDumperNative.dll」だけであり、それらのファイルを DotDumperの「DotDumper.exe」と同じフォルダ内に配置するだけです。ライブラリの名前は、それぞれのアーキテクチャごとに「DotDumperNative_x86.dll」および「DotDumperNative_x64.dll」に変更する必要があります。これを行わないと、DotDumperの起動時にエラーメッセージが表示されます。

ライブラリは DotDumperの実行時に動的にロードされ、DotDumperが実行されていないときに置き換えることができます。ネイティブライブラリとDotDumper自体の間の通信は、名前付きパイプを介して行われます。つまり、DotDumperは、名前付きパイプの通信スキームを妨げる変更、またはフックの追加または削除の場合にのみ更新される必要があります。フックを追加または削除するには、DotDumperのメインコンポーネントも変更する必要がありますが、これにより各コンポーネントを更新できる相対的な自由度がDotDumperの設計原則に含まれています。


プロセスインジェクションに対するTrellix製品の適用範囲

DotDumperはDotNetマルウェアを分析するための一般的なツールであり、DotNetマルウェアはあらゆる攻撃を実行できますが、このブログではプロセスホローイングを利用するDotNetマルウェアについて特に言及しています。Trellix EDRDetection as a Serviceは、どちらもプロセスホローイング検出機能を備えていることをお伝えしないわけにはいきません。

プロダクト ルール
Network Security (NX)
Detection as a Service
Email Security
Malware Analysis
File Protect
Codeinjection Process Hollowing
Endpoint Detection and Response _api_process_hollowed
_api_process_hollowing
_api_process_hollow
_api_process_hollowed_msbuild
_api_process_hollowed_installutil
_api_process_hollowed_regasm
_api_process_PE_into_regasm
_process_chain_svchost_powershell2
_hunting_beacon_cs
_hunting_process_inj2
_hunting_process_inj_epp
_hunting_explorer_injection
_hunting_susp_proc_exec
_hunting_sliver_getsystem
_hunting_sliver_getsystem2
_Api_thread_hijack_injecti

終わりに

今回のアップデートでは、特にDotDumperGUIがリリースされたことにより、アナリスト向けのDotDumperがさらに成熟したものとなりました。今後もさらに多くの機能が追加される可能性がありますので、実現したいアイデアがある場合は、お気軽にプルリクエストを作成してください。他の人がそのアイデアに取り組むことができるため、そのアイデア自体でも十分です。プロジェクトやDotNetの知識がないからといって、躊躇することはありません。また、修正方法がわからないバグを見つけた場合は、DotDumperDotDumperNative、またはDotDumperGUIの関連するGitHubのリポジトリでissueを発行してください。


※本ページの内容は2023年5月11日(US時間)更新の以下のTrellix Storiesの内容です。
原文:Trucking on with DotDumper

著者:Max Kersten