FakeNet Genie: FakeNet-NG のチート コードによる動的マルウェア分析の改善

Using FTP to download FakeNet-NG's default executable response news

ネットワーク シミュレーション ツール FakeNet-NG の開発者、FireEye FLARE チームのリバース エンジニア、およびマルウェア分析インストラクターとして、さまざまなアナリストが FakeNet-NG をどのように使用しているか、また彼らが直面している課題を見ることができます。私たちは、FakeNet-NG が多くの便利な機能とソリューションを提供することを学びましたが、ユーザーはそのことに気付いていないことがよくあります。このブログ投稿では、FakeNet-NG でネットワーク分析をレベルアップするチート コードを紹介します。カスタム レスポンスを紹介し、接続イベントでのコマンドの実行や SSL トラフィックの復号化などの強力な機能を紹介します。

2016 年の最初のリリース以来、 Linux サポートコンテンツベースのプロトコル検出などの新機能を追加することで、 FakeNet-NGを改善してきました。最近、FakeNet-NG を更新し、最もリクエストの多かった機能の 1 つである HTTP およびバイナリ プロトコルのカスタム レスポンスを追加しました。

このブログ投稿では、さまざまな FakeNet-NG 戦略を習得するのに役立つ 7 つの「段階」を提供しています。マルウェアを分析する際に遭遇する一般的なシナリオの観点から、それらを提示します。現在の分析に関連するセクションにスキップしたり、個々のニーズに合わせてそれらを調整したりしてください。ステージは次のように提示されます。

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

読み進めてスキル ツリーをアップグレードし、FakeNet-NG のプロになりましょう!

始める前に: FakeNet-NG の設定

FakeNet-NG の構成とログ データの場所のクイック リファレンスを次に示します。

  1. 構成ファイルはfakenetconfigsにあります。 default.iniを変更するか、それを新しいファイルにコピーして、 -cを使用して FakeNet-NG を別の構成にポイントすることができます。例: fakenet.py -c custom.ini。
  2. デフォルトのファイルはfakenetdefaultFilesにあり、リスナーの実装はfakenetlistenersにあります。
  3. fakenetconfigsdefault.iniの既定の構成には、グローバル構成設定と個々のリスナー構成が含まれています。
  4. カスタム応答構成のサンプルは、ディレクトリfakenetconfigsのファイルCustomProviderExample.pysample_custom_response.ini 、およびsample_raw_response.txtに含まれています。
  5. FLARE VM での FakeNet-NG のインストール場所はC:Python27libsite-packagesfakenetです。このディレクトリには、 defaultFilesconfigs 、およびlistenersを含むサブディレクトリがあります。
  6. FLARE VM では、FakeNet-NG パケット キャプチャ ファイルと HTTP リクエストは、デスクトップのfakenet_logsディレクトリにあります。

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

お気づきかもしれませんが、FakeNet-NG は HTML ページの提供に限定されません。要求されたファイル タイプに応じて、FakeNet-NG は PE ファイル、ELF ファイル、JPG、GIF などを提供できます。FakeNet-NG は、一般的なタイプのいくつかのデフォルト ファイルで構成されており、カスタム ファイルを提供するように構成することもできます。 defaultFilesディレクトリには、標準応答用のいくつかのタイプのファイルが含まれています。たとえば、マルウェアがillegal.exeの FTP GET 要求を送信した場合、FakeNet-NG はファイルdefaultFilesFakeNetMini.exe (.exe 要求の既定の応答) で応答します。このファイルは、メッセージ ボックスを表示する有効なポータブル実行可能ファイルです。実際の PE ファイルを提供することで、悪意のあるペイロードをダウンロードして実行しようとするマルウェアを観察できます。 FTP セッションの例と、ダウンロードしたデフォルト ファイルのその後の実行を図 1 に示します。

Using FTP to download FakeNet-NG's default executable response
図 1: FTP を使用して FakeNet-NG のデフォルトの実行可能応答をダウンロードする

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

デフォルトの FakeNet.html ファイルを変更して応答をカスタマイズする
図 2: デフォルトの FakeNet.html ファイルを変更して応答をカスタマイズする

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

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

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

静的カスタム レスポンス

TCP および/または UDP Raw リスナーがトラフィックに応答する方法を構成できます。この例では、FakeNet-NG に TCP raw リクエスト (プロトコルが検出されない) に応答する方法を伝えます。図 3 に示すように、まず、 fakenet/configs/default.iniRawTCPListenerセクションにあるCustom構成オプションのコメントを外します。

[RawTCPListener]
有効: 真
ポート: 1337
プロトコル: TCP
リスナー: RawListener
SSL の使用: いいえ
タイムアウト: 10
非表示: 偽
# レスポンスのカスタマイズについては、docs/CustomResponse.md を参照してください。
カスタム: sample_custom_response.ini

図 3: カスタム TCP 応答を有効にする

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

【TCPの例】
インスタンス名: RawTCPListener
リスナーの種類: TCP
TcpRaw ファイル:flare_command.txt

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

FLARE0という内容のファイルfakenetconfigsflare_command.txtを作成します。 TCP 応答は、ファイルの内容から生成されるようになりました。

ダイナミック カスタム レスポンス

たぶん、 flare_command.txt内の特定のコマンドにコミットするのではなく、コマンドを動的に発行したいでしょう。これは、プログラムで実現できます。図 5 に示すように、 fakenetconfigssample_custom_response.iniTcpDynamicカスタム レスポンスを構成します。既存のRawTCPListenerインスタンスをコメント アウトするか、置き換えてください。

【TCPの例】
インスタンス名: RawTCPListener
TcpDynamic:flare_command.py

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

ファイルfakenetconfigsCustomProviderExample.pyは、動的応答ファイルflame_command.pyのテンプレートとして使用できます。図 6 に示すように、 HandleTcp()関数を変更し、新しいファイルfakenetconfigsflare_command.pyを生成します。これで、マルウェアの実行時に各コマンドを選択できるようになります。図 7 は、この構成を使用して動的にコマンドを発行する方法を示しています。

輸入ソケット

def HandleTcp (靴下):

True の間:
試す:
データ = なし

データ = sock.recv(1024)
socket.timeout を除く:
合格

データでない場合:
壊す

resp = raw_input(‘n数値コマンドを入力してください: ‘)
コマンド = バイト (‘FLARE’ + resp + ‘n’)
sock.sendall(コマンド)

図 6: TCP 動的応答スクリプト

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 に一致する適切な応答を選択することもできます。この機能により、小さな Python スクリプトをすばやく記述して、マルウェア サンプルに基づいて HTTP トラフィックを動的に処理できるようになりました。

図 9 に示すように、 HTTPListener80セクションの Custom 構成オプションのコメントを解除することから始めます。

[HTTPListener80]
有効: 真
ポート: 80
プロトコル: TCP
リスナー: HTTPListener
SSL の使用: いいえ
ウェブルート: defaultFiles/
タイムアウト: 10
#ProcessBlackList: dmclient.exe、OneDrive.exe、svchost.exe、backgroundTaskHost.exe、GoogleUpdate.exe、chrome.exe
DumpHTTPPosts: はい
DumpHTTPPostsFilePrefix: http
非表示: 偽
# レスポンスのカスタマイズについては、docs/CustomResponse.md を参照してください。
カスタム: sample_custom_response.ini

図 9: HTTP リスナーの構成

次に、図 10 に示すように、 fakenetconfigssample_custom_response.iniHttpDynamicカスタム レスポンスを構成します。既定のHttpDynamicインスタンスをコメント アウトするか、置き換えてください。

【例2】
リスナーの種類: HTTP
HttpURI: comm.php
HttpDynamic: http_example.py

図 10: HttpDynamic 構成

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

輸入ソケット
arc4 から ARC4 をインポート

# HTTP レスポンスのカスタマイズについては、docs/CustomResponse.md を参照してください。

def HandleRequest(必須、メソッド、post_data=None):
“””動的 HTTP 応答ハンドラのサンプル。

パラメーター
———-
req : BaseHTTPServer.BaseHTTPRequestHandler
リクエストを受け取った BaseHTTPRequestHandler
メソッド: str
この記事の執筆時点では、「HEAD」、「GET」、「POST」のいずれかの HTTP メソッド
post_data: str
に対して `rfile.read()` を呼び出して受信した HTTP ポスト データは、
リクエストを受信した BaseHTTPRequestHandler。
“””

 

応答 = ‘アホイrn’

nonce = req.path.split(‘=’)[1]
arc4 = ARC4(ナンス)
応答 = arc4.encrypt(応答)

req.send_response(200)
req.send_header(‘Content-Length’, len(応答))
req.end_headers()
req.wfile.write(レスポンス)

図 11: 動的 HTTP 要求ハンドラー

ステージ 4: 手動のカスタム レスポンス

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

ncat.exe を使用して手動でトラフィックを処理する
図 12: ncat.exe を使用して手動でトラフィックを処理する

FakeNet-NG のカスタム応答機能は多様です。カスタム レスポンスのハイ スコアを上げる方法については、 ドキュメントを参照してください。

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

一部のアナリストは、別のシステムからマルウェアをデバッグすることを好みます。これを行う理由はたくさんあります。最も一般的なのは、マルウェアによる環境の破壊が避けられない場合に、IDA データベースやその他の保存データを保持するためです。このプロセスでは、通常、ホストオンリー ネットワーク上に 2 つの仮想マシンを構成する必要があります。このセットアップでは、FakeNet-NG が 2 台のマシン間のネットワーク トラフィックを傍受するため、リモート デバッグが不可能になります。この障害を克服するために、デバッグ サーバー プロセスからのトラフィックを無視するように FakeNet-NG に指示することで、デバッグ サーバーをブラックリストに登録できます。

IDA Pro を使用してリモートでデバッグする場合、32 ビットのポータブル実行可能ファイルの標準デバッグ サーバー プロセスはwin32_remote.exe (または WinDbg の場合はdbgsrv.exe ) です。必要なのは、プロセス名をProcessBlackList構成に追加することだけです (図 13 を参照)。その後、デバッグ サーバーは引き続き IDA Pro と自由に通信できますが、他のすべてのネットワーク トラフィックは FakeNet-NG によってキャプチャおよびリダイレクトされます。

#トラフィックを迂回するときに無視するプロセスを指定します。ここで使用される Windows の例。
ProcessBlackList: win32_remote.exe、dbgsrv.exe

図 13: configs/default.ini を変更して IDA Pro でのリモート デバッグを許可する

ブラックリストは、ノイズの多いプロセスが Fakenet-NG でキャプチャされたネットワーク トラフィックを汚染するのを防ぐのにも役立ちます。例としては、Windows システムまたはその他のマルウェア分析ツールを更新しようとするプロセスが含まれます。

ポートとホストをブラックリストに登録するための追加設定を利用できます。ブラックリストとホワイトリストの詳細については、 READMEを参照してください。

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

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

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

接続が確立されたときにLab18-01.exeにデバッガーを魔法のようにアタッチできたらいいと思いませんか?サンプルを高速実行し、アンパック スタブ全体と、サンプルが採用している可能性のあるアンチデバッグ トリックをバイパスすることができます。

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

[HTTPListener80]
有効: 真
ポート: 80
プロトコル: TCP
リスナー: HTTPListener
SSL の使用: いいえ
ウェブルート: defaultFiles/
タイムアウト: 10
DumpHTTPPosts: はい
DumpHTTPPostsFilePrefix: http
非表示: 偽
# x32dbg –p を実行してデバッガーにアタッチします。 {pid} は Fakenet-NG によって自動的に入力されます
ExecuteCmd: x32dbg.exe -p {pid}

図 15: x32dbg を実行してアタッチする Execute コマンド オプション

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

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

FakeNet-NG を使用して x32dbg をサンプルにアタッチする (アニメーション)
図 16: FakeNet-NG を使用して x32dbg をサンプルにアタッチする (アニメーション)
Fakenet-NG は、practicalmalwareanalysis.com への接続時に 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 トラフィックのストリームが存在します。

Fakenet-NG コンポーネント間のクリアテキスト ストリーム
図 18: FakeNet-NG コンポーネント間の平文ストリーム

FakeNet-NG を可能な限りシンプルに保つために、FakeNet-NG の現在のデフォルト設定では、プロキシがポート 443 で HTTPS トラフィックを傍受し、復号化されたストリームを作成することはありません。データをプロキシするには、図 19 に示すように、 HTTPListener443 Hidden属性をTrueに設定する必要があります。これにより、プロキシはパケットをインターセプトし、パケットの内容に基づいてプロトコルを検出するようになります。この高度な機能の詳細については、プロキシとプロトコルの検出に関するブログ投稿をお読みください。

[HTTPListener443]
有効: 真
ポート: 443
プロトコル: TCP
リスナー: HTTPListener
SSL の使用: はい
ウェブルート: defaultFiles/
DumpHTTPPosts: はい
DumpHTTPPostsFilePrefix: http
非表示: 真

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

これで、Fakenet-NG によって生成されたパケット キャプチャを調べることができます。クリアテキストは、localhost の一時ポート ( ProxyListener ) と localhost のポート 80 ( HTTPListener ) の間の TCP ストリームで見つけることができます。これを図 20 に示します。

HTTPListener と Proxy Listener 間のクリアテキスト トラフィック
図 20: HTTPListener と Proxy Listener の間のクリアテキスト トラフィック

まとめ(ニューゲーム+)

Fakenet-NG は、マルウェア解析用の事実上の標準ネットワーク シミュレーション ツールです。インストールなしで実行され、FLARE VM に含まれています。実証済みでテスト済みのデフォルト設定に加えて、Fakenet は無数の機能と構成オプションを提供します。このブログ投稿では、一般的な分析シナリオを処理するためのいくつかのトリックを紹介しました。最新バージョンをダウンロードしたり、すべての構成オプションの完全なリストを表示したり、Fakenet-NG に貢献したりするには、 Github リポジトリを参照してください。

参照: https://www.mandiant.com/resources/blog/improving-dynamic-malware-analysis-with-cheat-codes-for-fakenet-ng

Comments

Copied title and URL