Cyril François

ICEDIDの開梱

Elastic Security Labsのオープンソースツールによる包括的なチュートリアル

14分で読めますツール
ICEDIDの解凍

前文

ICEDIDは、 2017 年にIBM X-forceの研究者によって発見されたマルウェアファミリーであり、ログイン資格情報、銀行情報、およびその他の個人情報の盗難に関連しています。ICEDIDは常に一般的なファミリーでしたが、2021年初頭のEMOTETの一時的な 混乱 以来、さらに成長を遂げました。 ICEDIDは、 DarkVNCCOBALT STRIKEなど、いくつかの異なるマルウェアファミリーの配布に関連しています。 このような研究出版物を含む定期的な業界レポートが、この脅威を軽減するのに役立ちます。

ICEDID は、カスタムファイル形式とカスタム暗号化スキームを使用してペイロードをパックすることが知られています。 GZipバリアントの実行チェーンをカバーする最新の ICEDID調査 に続いています。

このチュートリアルでは、偽のGZipバイナリのコピーのダウンロードから始めて、最近のICDIDサンプルを解凍して、これらのツールを紹介します。

マルウェアの分析はシステムにとって危険な場合があるため、分離された仮想マシンや分析サンドボックスなど、制御された環境で経験豊富な専門家のみが試みる必要があります。 マルウェアは検出を回避して他のシステムに感染するように設計されている可能性があるため、必要なすべての予防措置を講じ、専用のツールを使用して自分自身とシステムを保護することが重要です。

54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f

環境設定

このチュートリアルでは、Windows 10 と Python 3.10 を使用します。

Elastic Security Labsは、アンパックプロセスを自動化し、アナリストやコミュニティがICEDIDに対応できるよう支援する一連のツールをリリースします。

スクリプト説明互換性
decrypt_file.pyICEDID暗号化ファイルの復号化Windows とその他 (テストされていません)
gzip_variant/extract_gzip.pyICEDIDの偽のGZipファイルからペイロードを抽出しますWindows とその他 (テストされていません)
gzip_variant/extract_payload_from_core.pyリビルドされたICEDIDコアバイナリからペイロードを抽出して復号化しますWindows とその他 (テストされていません)
gzip_variant/load_core.pyコアカスタムPEバイナリの読み込みと実行Windows のみ
gzip_variant/read_configuration.py偽のGZipに含まれるICEDID設定ファイルを読み取りますWindows とその他 (テストされていません)
rebuild_pe.pyICEDID カスタム PE ファイルからの PE の再構築Windows とその他 (テストされていません)

ツールを使用するには、 Elastic Security Labリリースリポジトリ をクローンし、nightMAREモジュールをインストールします。

git clone https://github.com/elastic/labs-releases
cd labs-release
pip install .\nightMARE\

このチュートリアルのすべてのツールは nightMARE モジュールを使用しており、このライブラリは、ICEDIDに埋め込まれたさまざまなペイロードを解凍するために必要なさまざまなアルゴリズムを実装しています。 このICEDID分析に必要であるため、nightMAREをリリースしていますが、このフレームワークの開発と成熟を続けるにつれて、さらに多くのことが発表されるので、ご期待ください。

偽のGZipを開梱する

ICEDIDの偽のGZipは、実際のデータを GZipヘッダーとフッター でカプセル化してフォーマットされた有効なGZipファイルになり す ましたファイルです。

GZipのマジックバイトは赤で表示されます。
GZip ヘッダーは緑色でレンダリングされます。
ダミーのファイル名の値は青です。

GZipヘッダーの後には、以下で説明する真のデータ構造があります。

labs-releases\tools\icedid\gzip-variant\extract_gzip.py スクリプトを使用して、この不正な GZip を解凍します。

usage: extract_gzip.py [--help] input output

positional arguments:
  input       Input file
  output      Output directory

options:
  -h, --help  show this help message and exit

上記のリンク先の ICEDID サンプルで extract_gzip.py を使用し、作成した " extract " というフォルダーに内容を格納します (既存の出力フォルダーを使用できます)。

python extract_gzip.py 54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f extract

============================================================
Fake Gzip
============================================================
is_dll: True
core: UponBetter/license.dat (354282 bytes)
stage_2: lake_x32.tmp (292352 bytes)

extract\configuration.bin
extract\license.dat
extract\lake_x32.tmp

このスクリプトは、次のもので構成される 3 つの個別のファイルを返します。

  • 暗号化された設定ファイル: configuration.bin
  • 暗号化されたコアバイナリ: license.dat
  • 永続化ローダー: lake_x32.tmp

コアバイナリファイルと設定ファイルの復号化

抽出した構成とコアバイナリは、ICEDID のカスタム暗号化スキームを使用して暗号化されます。 labs-releases\tools\icedid\decrypt_file.py スクリプトを使用して復号化できます。

usage: decompress_file.py [--help] input output

positional arguments:
  input       Input file
  output      Output file

options:
  -h, --help  show this help message and exit

ここに示すように(復号化されたファイルは任意の有効な宛先に書き込むことができることに注意してください)。

python .\decrypt_file.py .\extract\license.dat .\extract\license.dat.decrypted

python .\decrypt_file.py .\extract\configuration.bin .\extract\configuration.bin.decrypted

これで、コア バイナリと構成を追加のツールで処理する準備が整いました。 次のスクリーンショットに示されている復号化された構成のデータを参照してください。

設定の読み取り

設定ファイルの形式を以下に示します。

設定は、 labs-releases\tools\icedid\gzip-variant\read_configuration.py スクリプトを使用して読み取ることができます。

usage: read_configuration.py [--help] input

positional arguments:
  input       Input file

options:
  -h, --help  show this help message and exit

read_configuration.py スクリプトを使用して、前の手順で収集した configuration.bin.decrypted ファイルを読み取ります。

python .\gzip-variant\read_configuration.py .\extract\configuration.bin.decrypted

============================================================
Configuration
============================================================
botnet_id: 0x3B7D6BA4
auth_var: 0x00000038
uri: /news/
domains:
        alishaskainz.com
        villageskaier.com

この設定には、次の 2 つの C2 ドメインが含まれています。

  • alishaskainz[.]com
  • villageskaier[.]com

このサンプルでは、ICEDID が使用するビーコン URI は " /news/ " です。

静的解析のためのコアバイナリの再構築

ICEDIDは、カスタムPE形式を使用してペイロードを難読化するため、通常のWindows実行可能ファイルを処理することを期待する静的または動的分析ツールを無効化します。 カスタム PE ファイル形式については、以下で説明します。

たとえば、IDA Proを使用してコアバイナリを分析する場合は、有効なPEに再構築する必要があります。labs-releases\tools\icedid\rebuild_pe.py スクリプトを使用します。

usage: rebuild_pe.py [--help] [-o OFFSET] input output

positional arguments:
  input                 Input file
  output                Output reconstructed PE

options:
  -h, --help            show this help message and exit
  -o OFFSET, --offset OFFSET
                        Offset to real data, skip possible garbage

ただし、復号化されたコアバイナリで rebuild_pe.py を使用しようとすると、 license.dat.decrypted 、次のエラーメッセージが表示されます。

python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin
Traceback (most recent call last):
  File "rebuild_pe.py", line 32, in <module>
    main()
  File "rebuild_pe.py", line 28, in main
    custom_pe.CustomPE(data).to_pe().write(args.output)
  File "nightmare\malware\icedid\custom_pe.py", line 86, in __init__
    raise RuntimeError("Failed to parse custom pe")
RuntimeError: Failed to parse custom pe

ここで微妙な点は、カスタム PE データが必ずしもファイルの先頭から始まるとは限らないことです。 この場合、たとえば、 HxD のような16進数エディターでファイルを開くと、実際のデータの前に一定量のガベージバイトを観察できます。

私たちの調査から、ゴミのサイズは 129 バイトであることがわかっています。

それを念頭に置いて、ガベージバイトをスキップし、 rebuild_pe.py スクリプトの 「-o 129」 パラメータを使用してコアバイナリを再構築できます。 幸いなことに、今回はエラーメッセージは届きません。 core.bin 出力ディレクトリに保存されます(この例では extract )。

python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin -o 129

リビルドされた PE オブジェクトは直接実行 可能ではありませんが 、任意の逆アセンブラーを使用して静的に分析できます。

再構築されたバイナリセクション ( .mare{0,1,2,...} ) にカスタム名を割り当てました。

私たちは、このツールを構築するためのインスピレーションを得た Hasherezadeの作品 を称え、感謝したいと思います。

コアバイナリの実行 (Windows のみ)

コアバイナリは、ICEDID のカスタム PE 形式とエントリポイント関数プロトタイプを理解するカスタムローダーなしでは実行できません。

私たちの調査から、エントリポイントは、ICEDIDコアと永続化ローダーのパスとその暗号化された構成を含む、コンテキスト構造と呼ばれる構造を期待していることがわかっています。 コンテキスト構造については、以下で説明します。

コアバイナリをネイティブに実行するには、 labs-releases\tools\icedid\gzip-variant\load_core.py スクリプトを使用しますが、それを使用する前に、このスクリプトがこの構造を構築するために必要なすべての情報を含む context.json ファイルを作成する必要があります。

このサンプルでは、偽のgzipに含まれる情報をコピーし、暗号化された構成ファイルへのパスを使用します。 gzip_variant/context.json.exampleに例を含めました。

「field_0」「stage_2_export」の値は、サンプルを反転する際に見つける必要があることに注意してください。

ここでは、以前の研究の値をプレースホルダーとして使用していますが、サンプルが100%機能する保証はありません。 たとえば、このサンプルでは、 #1 序数エクスポートが永続化ローダーの実際のエントリ ポイントであるかどうかはわかりません。

また、 UponBetter ディレクトリを作成し、 license.dat ファイルをそのディレクトリに移動することで、第 1 段階の動作を再現します。

labs-releases\tools\icedid\gzip_variant\load_core.py スクリプトは、復号化されたコアバイナリ license.dat.decryptedcontext.json ファイルを使用して実行します。

警告:バイナリはこのスクリプトによってネイティブにロード/実行されますが、Elastic Security Labsはシステムへの損害について責任を負いません。 安全な環境内でのみ実行してください。

usage: load_core.py [--help] [-o OFFSET] core_path ctx_path

positional arguments:
  core_path             Core custom PE
  ctx_path              Path to json file defining core's context

options:
  -h, --help            show this help message and exit
  -o OFFSET, --offset OFFSET
                        Offset to real data, skip possible garbage

前のセクションで述べたのと同じガベージバイトの問題が発生しているため、 "-o 129" パラメータを使用してガベージバイトをスキップします。

python .\gzip-variant\load_core.py .\extract\license.dat.decrypted .\gzip-variant\context.example.json -o 129

============================================================
Core Loader
============================================================
Base address: 0x180000000
Entrypoint: 0x180001390

Press a key to call entrypoint...

起動すると、スクリプトはユーザー入力を待ってからエントリポイントを呼び出します。 Python プロセスにデバッガーを簡単にアタッチし、ICEDID コア エントリ ポイント (この例では 0x180001390 ) にブレークポイントを設定できます。

キーが押されると、エントリーポイントに到達します。

バイナリを実行させると、ICEDID スレッドが作成されていることがわかります (次のスクリーンショットを参照)。

リビルドされたコアバイナリからのペイロードのアンパックとリビルド

コアバイナリ内に埋め込まれているペイロードを抽出するには、 labs-releases\tools\icedid\gzip-variant\extract_payloads_from_core.py スクリプトを使用します

usage: extract_payloads_from_core.py [--help] input output

positional arguments:
  input       Input file
  output      Output directory

options:
  -h, --help  show this help message and exit

このスクリプトは、リビルドされたコアバイナリで使用します。

python .\gzip-variant\extract_payloads_from_core.py .\extract\core.bin core_extract

core_extract\browser_hook_payload_0.cpe
core_extract\browser_hook_payload_1.cpe

ここから、Webブラウザーのフック機能用のICEDIDのペイロードに対応する2つのバイナリを出力しますが、それらはまだカスタムPE形式です。

私たちの調査によると、 browser_hook_payload_0.cpe はブラウザ フック ペイロードの x64 バージョンであり、 browser_hook_payload_1.cpe は x86 バージョンであることがわかりました。

それらを再構築するために、 rebuild_pe.py スクリプトを再度使用しますが、今回はスキップするガベージバイトはありません。

python .\rebuild_pe.py .\core_extract\browser_hook_payload_0.cpe .\core_extract\browser_hook_payload_0.bin

python .\rebuild_pe.py .\core_extract\browser_hook_payload_1.cpe .\core_extract\browser_hook_payload_1.bin

これで、さらに分析できる 2 つの PE バイナリ ( browser_hook_payload_0.binbrowser_hook_payload_1.bin ) ができました。

注意深い読者は、 VNCサーバ をコアバイナリからアンパックするのをスキップしたことに気づくかもしれません。これは、意図的に決定したものです。 今後の研究で他のツールと一緒にリリースしていきますので、ご期待ください!

まとめ

このチュートリアルでは、偽のGZipバイナリの抽出から始まり、コアバイナリの再構築とそのペイロードのアンパックまで、ICEDID GZipバリアントのアンパックについて説明しました。

ICEDIDは常に進化しており、今後も大きな変化を監視し、研究とともにツールを更新していきます。 問題を開くか、何かが壊れているか、期待どおりに機能しない場合はメッセージを送信してください。

Elastic Security Labsは、詳細な検知ロジック、保護、応用脅威研究の公開を通じて、敵対者を混乱させることに焦点を当てた専任の研究者とセキュリティエンジニアのチームです。

@elasticseclabsでフォローし、研究ポータルにアクセスして、より多くのリソースと研究をご覧ください。

参照資料

上記の研究を通じて、以下のことが参照されました。

この記事を共有する