ブログ(脅威調査)

あなたもFakeNetの達人:FakeNet‐NGの裏技をマスターして動的マルウェア解析を改善しませんか?

私たちは、ネットワーク・シミュレーション・ツールFakeNet-NGの開発者であり、FireEye FLAREチームのリバースエンジニア、およびマルウェア解析インストラクターという立場で、さまざまなアナリストがFakeNet-NGをどのように使用し、どのような課題に直面しているかを目の当たりにしました。FakeNet-NGには、多くの便利な機能とユーザーにあまり知られていないソリューションがあることがわかりました。このブログの記事では、FakeNet-NGを使用してネットワーク分析を向上するためのチートコードをいくつか紹介します。カスタム・レスポンスを紹介し、接続イベントでのコマンドの実行やSSLトラフィックの復号などの強力な機能を説明します。

FakeNet-NGはマルウェア解析やペネトレーション・テストを行う方のための動的ネットワーク分析ツールで、2016年に初めてリリースして以降、FakeNet-NGLinuxサポートコンテンツベースのプロトコル検知などの新しい機能を追加し、改善してきました。最近のFakeNet-NGの更新(1.4.11)では、HTTPおよびバイナリ・プロトコルのためのカスタム・レスポンスという、最も要求の多かった機能の1つを更新しました。

このブログ記事では、さまざまなFakeNet-NG戦略をマスターするのに役立つ7つの「ステージ」を提供し、マルウェアの解析時に見られる一般的なシナリオという観点からそれらを解説します。現在の解析に関連するセクションを選んだり、個々のニーズに合わせて調整したり、ご自由にご覧ください。各ステージは次のとおりです。

  1. カスタム・ファイル・レスポンス
  2. カスタム・バイナリ・プロトコル
  3. カスタムHTTPレスポンス
  4. マニュアル・カスタム・レスポンス
  5. プロセスのブラックリスト化
  6. 接続イベントでのコマンドの実行
  7. SSLトラフィックの復号

以下をお読みになることで、皆さんのスキルの向上に役立ちFakeNet-NGのエキスパートになることを期待します。

始める前に:FakeNet-NGを設定する

以下に、FakeNet-NGの設定のクイック・リファレンスとログ・データの場所を示します。

  1. 設定ファイルはfakenet\configsにあります。default.iniを変更するか、新しいファイルにコピーし、FakeNet-NGを-cオプションにより任意の設定ファイルを指定します。例:fakenet.py -c custom.ini
  2. デフォルトのファイルはfakenet\defaultFilesにあり、Listenerの実装先はfakenet\listenersです。
  3. fakenet\configs\default.iniのデフォルト設定には、グローバル設定と個々のリスナーの設定が含まれます。
  4. カスタム対応の設定サンプルはfakenet\configsディレクトリにあり、CustomProviderExample.pysample_custom_response.ini、およびsample_raw_response.txtファイルです。
  5. FLARE VMのFakeNet-NGのインストール場所はC:\Python27\lib\site-packages\fakenetです。このディレクトリには、defaultFilesconfigslistenersを含むサブディレクトリがあります。
  6. FLARE VMでは、FakeNet-NGパケット・キャプチャ・ファイルおよびHTTPリクエストは、fakenet_logsディレクトリのDesktopで確認できます

ステージ1:カスタム・ファイル・レスポンス

お気づきのように、FakeNet-NGはHTMLページの提供だけではありません。FakeNet-NGは要求されたファイル・タイプに応じて、PEファイル、ELFファイル、JPG、GIFなどを処理できます。FakeNet-NGには、共通タイプのデフォルト・ファイルで設定され、カスタム・ファイルを提供するように設定することもできます。defaultFilesディレクトリには、標準の対応用にさまざまなタイプのファイルがあります。たとえば、マルウェアがevil.exeに対してFTP GETリクエストを送信する場合、FakeNet-NGはdefaultFiles\FakeNetMini.exe(.exeリクエストのデフォルトのレスポンス)で応答します。このファイルは、メッセージ・ボックスを表示するだけの悪意のないPortable Executable(PE)ファイルです。実際のPEファイルを提供することで、不正なペイロードをダウンロードして実行しようとするマルウェアを監視することができます。FTPセッションとそれに続くダウンロードされたデフォルト・ファイルの実行の例を図1に示します。


図1:FTPを使用してFakeNet-NGのデフォルトの実行ファイルをダウンロード

ほとんどのリクエストは、このシステムで適切に処理されます。ただし、マルウェアは、PowerShellスクリプトが埋め込まれたイメージや、整合性チェックのためにファイルにハッシュが付加された実行ファイルなど、特定の形式のファイルが必要な場合があります。このような場合は、デフォルト・ファイルの1つを、マルウェアの期待を満たすファイルに置き換えることができます。また、関連する各リスナー(ネットワーク・プロトコルを実施するモジュール)構成にも、defaultFilesパスを変更するオプションがあります。これにより、FakeNet-NGはデフォルト・データを上書きまたは変更せずに、異なるファイルを処理できます。カスタマイズしたFakeNet.htmlファイルを図2に示します。


図2:デフォルトのFakeNet.htmlファイルを変更して、レスポンスをカスタマイズ

ステージ2:カスタム・バイナリ・プロトコル

多くのマルウェア・サンプルは、特定のバイト・シーケンスを必要とするカスタム・バイナリ・プロトコルを実装しています。たとえば、GH0STファミリーのマルウェアでは、各メッセージが「GH0ST」などのシグネチャーで始まる必要がある場合があります。デフォルトのFakeNet-NG RawListenerは、エコーを使用して不明なリクエストに応答します。つまり、受信したデータと同じデータを送信します。通常、この振る舞いで十分ですが、カスタム・レスポンスが必要な場合では、マルウェアが期待するデータを送信できます。

FakeNet-NGでカスタムのTCPとUDPレスポンスができるようになりました。コマンドアンドコントロール(C2)サーバーに文字列「Hello」を送信し、「FLARE」で開始して数値コマンド(0~9)が続くレスポンス・パケットを待機する、仮のマルウェアの例を考えてみましょう。ここでは、FakeNet-NGがこのシナリオを処理する興味深い方法をいくつか示します。

静的カスタム・レスポンス

TCP/UDP Rawリスナーがトラフィックに応答する方法を設定できます。この例では、FakeNet-NGに、TCP RAWリクエスト(プロトコル検出なし)に応答する方法を指示します。まず、図3に示すように、fakenet/configs/default.iniのRawTCPListenerセクションにあるCustom設定オプションをコメント解除します。

[RawTCPListener]
Enabled:     True
Port:        1337
Protocol:    TCP
Listener:    RawListener
UseSSL:      No
Timeout:     10
Hidden:      False
# To read about customizing responses, see docs/CustomResponse.md
Custom:    sample_custom_response.ini

図3:カスタムTCPレスポンスの有効化

次に、図4に示すように、fakenet\configs\sample_custom_response.iniTcpRawFileカスタム・レスポンスを設定します。デフォルトのRawTCPListenerインスタンスをコメントアウトするか、置き換えてください。

[ExampleTCP]
InstanceName:     RawTCPListener
ListenerType:     TCP
TcpRawFile:       flare_command.txt

図4:TCP静的カスタム・レスポンスの仕様

FLARE0というコンテンツのfakenet\configs\flare_command.txtファイルを作成します。これで、TCPレスポンスがファイルのコンテンツから生成されます。

動的カスタム・レスポンス

flare_command.txt内の特定のコマンドにコミットするのではなく、動的にコマンドを発行したいと考えていると思いますが、これは、プログラムで行うことができます。図5に示すように、fakenet\configs\sample_custom_response.iniTcpDynamicカスタム・レスポンスを設定します。既存のRawTCPListenerインスタンスをコメントアウトするか、置き換えてください。

[ExampleTCP]
InstanceName:     RawTCPListener
TcpDynamic:       flare_command.py

図5:TCP動的カスタム・レスポンスの仕様

fakenet\configs\CustomProviderExample.pyファイルは、動的レスポンス・ファイルflare_command.pyのテンプレートとして使用できます。HandleTcp()関数を変更し、図6に示すように新しいファイルfakenet\configs\flare_command.pyを作成します。これで、マルウェアの実行時に各コマンドを選択できます。図7に、この設定を使用して動的にコマンドを発行する方法を示します。

import socket

def HandleTcp(sock):

    while True:
        try:
            data = None

            data = sock.recv(1024)
        except socket.timeout:
            pass

        if not data:
            break

        resp = raw_input('\nEnter a numeric command: ')
        command = bytes('FLARE' + resp + '\n')
        sock.sendall(command)

図6:TCP動的レスポンスのスクリプト


図7:TCP動的コマンドの発行

ステージ3:カスタムHTTPレスポンス

マルウェアは、一般的なHTTPプロトコルに加えて独自の暗号化スキームを実装することがよくあります。たとえば、HTTP GETリクエストを/comm.php?nonce=<random>に送信し、C2サーバーのレスポンスがNonceで暗号化されたRC4ストリームであるサンプルがあるとします。このプロセスを図8に示します。マルウェアのクリティカル・コード・パスを強制的に実行して、マルウェアの振る舞いを監視またはデバッグする方法を検討します。

図8:ビーコン・データに基づいて特定のキーを期待するマルウェアの例

このようなケースのために、HTTPカスタム・レスポンスのサポートを採用しました。TCPカスタム・レスポンスと同様に、HTTPListenerにも動的HTTPレスポンスを有効にする、Customという名前の新しい設定があります。この設定により、FakeNet-NGが特定のホストまたはURIに一致する適切なレスポンスも選択できるようになります。この機能を使用することにより、マルウェア・サンプルに基づいてHTTPトラフィックを動的に処理するちょっとしたPythonスクリプトをすばやく記述できるようになりました。

図9に示すように、HTTPListener80セクションのCustom設定オプションをコメント解除して開始します。

[HTTPListener80]
Enabled:     True
Port:        80
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      No
Webroot:     defaultFiles/
Timeout:     10
#ProcessBlackList: dmclient.exe, OneDrive.exe, svchost.exe, backgroundTaskHost.exe, GoogleUpdate.exe, chrome.exe
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      False
# To read about customizing responses, see docs/CustomResponse.md
Custom:    sample_custom_response.ini

図9:HTTPリスナーの設定

次に、図10に示すように、fakenet\configs\sample_custom_response.iniHttpDynamicカスタム・レスポンスを設定します。デフォルトのHttpDynamicインスタンスをコメントアウトするか、置き換えてください。

[Example2]
ListenerType:     HTTP
HttpURIs:         comm.php
HttpDynamic:      http_example.py

図10:HttpDynamic設定

fakenet\configs\CustomProviderExample.pyファイルは、動的レスポンス・ファイルhttp_example.pyのテンプレートとして使用できます。図11に示すように、HandleRequest()関数を変更します。FakeNet-NGは、レスポンスをNonceで動的に暗号化します。

import socket
from arc4 import ARC4

# To read about customizing HTTP responses, see docs/CustomResponse.md

def HandleRequest(req, method, post_data=None):
    """Sample dynamic HTTP response handler.

    Parameters
    ----------
    req : BaseHTTPServer.BaseHTTPRequestHandler
        The BaseHTTPRequestHandler that recevied the request
    method: str
        The HTTP method, either 'HEAD', 'GET', 'POST' as of this writing
    post_data: str
        The HTTP post data received by calling `rfile.read()` against the
        BaseHTTPRequestHandler that received the request.
    """

 

    response = 'Ahoy\r\n'

    nonce = req.path.split('=')[1]
    arc4 = ARC4(nonce)
    response = arc4.encrypt(response)

    req.send_response(200)
    req.send_header('Content-Length', len(response))
    req.end_headers()
    req.wfile.write(response)

図11:動的HTTPリクエスト・ハンドラ

ステージ4:マニュアル・カスタム・レスポンス

さらに柔軟性を高めるために、FakeNet-NGリスナーの代わりに、強力なネットワーク・ユーティリティnetcatを使用できます。たとえば、netcatを使用してC2サーバーとして機能させ、ポート80での実行中に動的にコマンドを発行することができます。netcatリスナーを起動してからFakeNet-NGを起動すると、対応するポート宛てのトラフィックはnetcatリスナーに転送されます。次に、図12に示すように、netcatインターフェイスを使用して動的にコマンドを発行できます。


図12:ncat.exeを使用したトラフィックの手動処理

FakeNet-NGのカスタム・レスポンス能力は多様です。カスタム・レスポンスを高度にする方法については、ドキュメントを参照してください。

ステージ5:プロセスのブラックリスト化

アナリストによっては、別のシステムからマルウェアをデバッグしたい人もいます。これには多くの理由があるのですが、最も一般的には、マルウェアが予期せず環境を破損してしまう場合に、IDAデータベースやその他の保存データを保持するためです。プロセスは通常、ホストのみのネットワークで2台の仮想マシンを構成しますが、この設定では、FakeNet-NGが2台のマシン間のネットワーク・トラフィックをインターセプトするため、リモート・デバッグができません。この問題を解決するため、FakeNet-NGに指示することによってデバッグ・サーバーをブラックリスト化し、デバッグ・サーバー・プロセスからのトラフィックを無視することができます。

IDA Proを使用してリモートでデバッグする場合、32ビットPE(32-bit Portable Executable)用の標準デバッグ・サーバー・プロセスはwin32_remote.exe(WinDbgの場合はdbgsrv.exe)です。必要なことは、図13に示すように、プロセス名をProcessBlackList設定に追加することだけです。その後、デバッグ・サーバーはIDA Proと自由に通信できますが、他のすべてのネットワーク・トラフィックはFakeNet-NGによってキャプチャされて、リダイレクトされます。

# Specify processes to ignore when diverting traffic. Windows example used here.
ProcessBlackList: win32_remote.exe, dbgsrv.exe

図13:IDA Proを使用したリモート・デバッグを可能にするよう変更されたconfigs/default.ini

ブラックリスト化は、感染された環境でFakenet-NGキャプチャ済みネットワーク・トラフィックからノイズの多いプロセスを除外するのにも役立ちます。例には、Windowsシステムや他のマルウェア解析をアップデートしようとするプロセスが含まれます。

ポートおよびホストのブラックリスト化には、他の設定もあります。ブラックリスト化とホワイトリスト化の詳細については、READMEを参照してください。

ステージ6:接続イベントでのコマンドの実行

Fakenet-NGは、リスナーへの接続時にコマンドを実行するように設定できます。たとえば、このオプションを使用して、接続の試行時に実行中のサンプルにデバッガーをアタッチできます。Practical Malware AnalysisラボからLab18-01.exeという名前のパック済みサンプルを解析するシナリオを考えてみましょう。動的解析を使用すると、図14に見られるように、マルウェア・ビーコンが、HTTPプロトコルを使用してTCPポート80経由でそのC2サーバーに送信されることがわかります。


図14:TCPポート80を経由したC2サーバーへのマルウェア・ビーコン

接続時にLab18-01.exeにデバッガーをアタッチできれば良いと思いませんか? サンプルを高速実行し、アンパックされたスタブ全体と、サンプルが使用する可能性のあるデバッガー回避の潜在的なトリックをバイパスすることができます。

Fakenet-NGを設定してデバッガーを起動し、任意のプロセスにアタッチするには、fakenet\configs\default.iniの[HTTPListener80]セクションを変更してExecuteCmdオプションを含めます。図15に、完全な[HTTPListener80]セクションの例を示します。

[HTTPListener80]
Enabled:     True
Port:        80
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      No
Webroot:     defaultFiles/
Timeout:     10
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      False
# Execute x32dbg –p to attach to a debugger. {pid} is filled in automatically by Fakenet-NG
ExecuteCmd: x32dbg.exe -p {pid}

図15:x32dbgを実行およびアタッチするコマンド・オプションの実行

この例では、デバッガーx32dbg.exeを実行するようにポート80でHTTPListenerを設定します。この設定により、実行時にプロセスIDが決定される実行中のプロセスにアタッチされます。HTTPListenerへの接続が確立されると、FakeNet-NGは自動的に、文字列{pid}を、接続を行うプロセスのプロセスIDに置き換えます。サポートされる変数の完全なリストについては、ドキュメントを参照してください。

Fakenet-NGを再起動し、サンプルを再度実行すると、x32dbgが起動し、Lab18-01.exeに自動的にアタッチします。これで、ScyllaOllyDumpExプラグインなどのメモリダンプ・ツールを使用して実行ファイルをダンプし、静的解析に進むことができるようになりました。図16と図17にこれを示します。


図16:FakeNet-NGを使用してx32dbgをサンプルにアタッチ(アニメーション)


図17:Fakenet-NGがpracticalmalwareanalysis.comへの接続時にx32dbgを実行

ステージ7:SSLトラフィックの復号

マルウェアはネットワーク通信にSSLを多用します。パケット・データが暗号化され、トラフィック解析を大幅に妨害するからです。Fakenet-NGのProxyListenerを使用して、復号されたトラフィックを含むパケット・キャプチャを作成できます。これは、プロトコル検知機能を使用して行うことができます。

プロキシはSSLを検知し、PythonのOpenSSLライブラリを使用してSSLのソケットを「man-in-the-middle」攻撃することができます。次に、マルウェアおよびHTTPリスナーとの全二重接続を維持し、両側で他の接続を認識しません。したがって、図18に示すように、プロキシとHTTPリスナーとの間には平文HTTPトラフィックのストリームが存在します。


図18:Fakenet-NG構成要素間の平文のストリーム

FakeNet-NGをできるだけシンプルに保つために、FakeNet-NGの現在のデフォルト設定では、ポート443に対してプロキシがHTTPSトラフィックをインターセプトせず、復号されたストリームを作成しません。データをプロキシするには、図19に示すように、HTTPListener443 Hidden属性をTrueに設定する必要があります。これにより、パケットをインターセプトし、パケットのコンテンツに基づいてプロトコルを検知するようにプロキシに指示します。この高度な機能について詳しくは、プロキシおよびプロトコル検知について記述したブログ記事をご覧ください。

[HTTPListener443]
Enabled:     True
Port:        443
Protocol:    TCP
Listener:    HTTPListener
UseSSL:      Yes
Webroot:     defaultFiles/
DumpHTTPPosts: Yes
DumpHTTPPostsFilePrefix: http
Hidden:      True

図19:リスナーを非表示にし、トラフィックがプロキシされる

これで、Fakenet-NGが作成したパケット・キャプチャを調べることができるようになりました。平文は、ローカルホストの動的ポート(ProxyListener)とローカルホストのポート80(HTTPListener)の間のTCPストリームで見つけることができます。これを図20に示します。


図20:HTTPListenerとプロキシリスナー間の平文トラフィック

結論(New Game+)

Fakenet-NGは、マルウェア解析のデファクトスタンダードであるネットワーク・シミュレーション・ツールで、インストールせずに実行でき、FLARE VMに含まれています。実証済みかつテスト済みのデフォルト設定に加えて、Fakenetには、非常に多くのの機能および設定オプションがあります。このブログの記事では、一般的な解析シナリオを処理するためのさまざまなトリックを紹介しました。最新バージョンのダウンロード、すべての設定オプションの完全なリストの参照、Fakenet-NGへの寄与には、Githubのリポジトリを参照してください。

 

本ブログは、米FireEyeが公開した April 02, 2020「FakeNet Genie: Improving Dynamic Malware Analysis with Cheat Codes for FakeNet-NG」(英語)の日本語抄訳版です。

日本語版:Reviewed by Toru Tanimura