Zscalerのブログ
Zscalerの最新ブログ情報を受信
購読するエンドゲーム作戦:Smokeの一掃
はじめに
Smoke (SmokeLoaderまたはDofoilとも呼ばれる)は、2011年から活動しているマルウェア ローダーです。主に、さまざまなトロイの木馬、ランサムウェア、情報窃取型マルウェアなど、第2段階のマルウェア ペイロードを配信するために使用されます。さらに、独自のカスタム プラグインを展開して機能を拡張することで、暗号通貨のマイニング、資格情報の収集、Webブラウザー データの窃取などにも利用されます。Smokeは、クライムウェア キットとして販売されており、脅威アクターはこれによって簡単に攻撃の手はずを整え、実行できます。キットには多数のバージョンがあり、サーバー側のパネル コードを流出させたものや、ビルダーのクラッキングを行ったものもありました。こうした特性から、マルウェアの配信にSmokeを活用する脅威グループの数は大幅に増加してきました。最近Zscaler ThreatLabzでは、Raspberry Robin、Stealc、Stopランサムウェアなど、Smokeを通じて配信される複数のマルウェア ファミリーを注視しています。
2024年5月、Zscaler ThreatLabzは、Smokeマルウェアの技術分析を通じて国際的な法執行機関の活動を支援しました。この活動は、「エンドゲーム作戦」として知られています。Smokeの出現以来初めて実施された、法執行機関と民間企業による大規模共同作戦です。
このブログでは、Smokeの永続化メカニズムとその通信方法を分析します。また、エンドゲーム作戦におけるSmokeのインフラ解体、リモートでの感染のクリーンアップの方法について見ていきます。
要点
- 2024年5月、Zscaler ThreatLabzはSmokeの技術分析を通じてエンドゲーム作戦と呼ばれる国際的な法執行機関の作戦を支援した。この作戦によって、Smokeのインフラが差し押さえられ、(可能な場合は)マルウェアのリモート アンインストールが行われた。
- Smokeは、2011年に誕生したマルウェア ダウンローダーで、情報窃取型のマルウェアやランサムウェアなど、ペイロードの第2段階としてマルウェアを配信する。
- Smokeは、追加のプラグインを展開することで自身の機能を拡張することもできる。
- Smokeは長年にわたって大きな進化を遂げており、数多くの手法を通じてコードを難読化し、自動分析を妨げている。
- Smokeは、10年以上前から存在するにもかかわらず、通常1〜2年ごとに更新されている。
技術分析
過去10年の間に、Smokeには数多くのバージョンがリリースされています。今回の分析では、直近の5つのバージョン(2017、2018、2019、2020、2022)を取り扱います。バージョン番号は、更新プログラムが最初に確認された年と概ね対応しています。Smokeには複数段階の読み込みプロセスが使用されていますが、今回の技術分析では、悪意のある機能を実行する主要コンポーネントのみに焦点を当てます。具体的には、エンドゲーム作戦に関連する3つの重要な点(インストール、通信、アンインストール コマンド)について分析していきます。
インストール
Smokeのインストール プロセスは、バージョンによって若干異なります。ただし、すべてのバージョンに共通する点がいくつかあります。たとえば、いずれのバージョンでも、同じアルゴリズムを使用する一意のボット識別子が生成されます。ボットID生成アルゴリズムを複製するPythonのコードを以下に示します。
import hashlib
bot_id = hashlib.md5(computername + hardcoded_constant + volume_serial).hexdigest().upper() + volume_serial.decode().upper()
このボットID値は、マルウェアのミューテックス名、実行ファイル名、プラグイン ファイル名、スケジュールされたタスク名など、さまざまな目的で使用されます。たとえば、Smokeのバージョン2020と2022では、Pythonで以下のように再現されるコードを使用し、実行ファイル名を作成します。
offset = 30
filename_len = 7
filename = ""
for i in range(filename_len):
filename += chr(ord(bot_id[i+offset]) - ord('0') + ord('a'))
print("executable filename:", filename)
いずれのバージョンでも、ファイル属性をSYSTEM
とHIDDEN
に設定することで、実行ファイルとプラグインを隠そうとしています。
以下の表1は、Smokeのインストール プロセスの変遷を示しています。
Smoke 2017 | Smoke 2018 | Smoke 2019 | Smoke 2020 | Smoke 2022 | |
---|---|---|---|---|---|
デフォルトのインストール場所 | %APPDATA%\Microsoft\Windows | %APPDATA%\Microsoft\Windows | %APPDATA% | %APPDATA% | %APPDATA% |
インストール ディレクトリーの作成 | する | する | しない | しない | しない |
実行ファイル名の長さ | 8 | 8 | 7 | 7 | 7 |
スケジュールされたタスク名 | N/A | Opera scheduled Autoupdate %u | NvNgxUpdateCheckDaily_{%08X-%04X-%04X-%04X-%08X%04X} | Firefox Default Browser Agent %hs | Firefox Default Browser Agent %hs |
その他の永続化メカニズム | スタートアップ フォルダーのレジストリー値/LNKショートカット | スタートアップ フォルダーのLNKショートカット | N/A | N/A | N/A |
表1: Smokeの各バージョンのインストール手法の比較
バージョン2017と2018では、実行ファイルとプラグインを格納するディレクトリーも作成されます。
ネットワーク通信
2017年以降のSmokeのバージョンは、いずれもよく似たネットワーク通信の仕組みとパケット構造をとっています。ネットワーク通信には、ハードコードされた1つ以上のコマンド&コントロール(C2)サーバーへのHTTP POSTリクエストを利用します。HTTP POST本文には、ハードコードされたRC4キーを使用して暗号化されたパケット構造が含まれています。
図1に示すように、バージョン2020と2022では、チェック インのリクエスト(コマンド10001)に以下の情報が含まれています。
図1: SmokeのC2サーバーへのリクエストのフォーマット(暗号化前)
バージョン2017、2018、2019にも、同様のリクエスト フォーマットが含まれていますが、コンピューター名フィールド(青でハイライトした部分)はありません。
応答の最初の4バイトはパケットのサイズです。残りの応答データは、ハードコードされた別のRC4キーで暗号化されます。最初の2バイトの値(復号時)はSmokeのバージョン番号(リトル エンディアン形式)です。その後、それ以降のバイトを使用し、実行するタスクやコマンドがあるかどうかを判断します。バージョン番号に続くバイトが0x69、0x72、または0x75の場合、Smokeはその値を以下のいずれかのコマンドとして解釈します。
バイト | コマンド | 概要 |
---|---|---|
0x69 | i | 個人のタスク |
0x72 | r | アンインストール |
0x75 | u | 更新 |
表2: Smokeによって実行されるコマンド
上記以外のバイトの場合、値は実行するタスク数として解釈されます。次のセクションでは、アンインストール コマンドの操作について説明します。
リモートでのクリーンアップ
Smokeのアンインストール コマンドでは、以下のアクションが実行されます。
- Smokeの各プラグインのプロセスを終了する
- 開いているSmokeのハンドルを閉じる
- Smokeの実行ファイル、プラグイン ファイル、およびスケジュールされたタスクを削除する
- メモリーを消去、解放する
- Smokeを終了する
2017や2018などの古いバージョンでは、ディスクにアーティファクトが残ります。特に、Smokeによって作成されたインストール ディレクトリーが削除されず、バージョン2017では永続化のために作成されたレジストリー値も削除されません。新しいバージョンでは、AmcacheエントリーなどのWindows固有のフォレンジック アーティファクトを使用することで、システムがSmokeに感染したかどうかを判断できます。さらに、アンインストール コマンドの完了後も、感染してクリーンアップされたシステムを(メモリー フォレンジックを介して)特定することが可能です。なお、アンインストール コマンドでは、Smokeのコードを含むexplorer.exe
に割り当てられたメモリーのセクションの解放やマッピング解除は行われません。
まとめ
エンドゲーム作戦は、Smokeの10年以上にわたる歴史のなかで初めて実施された、国際的な法執行機関による大規模な作戦でした。この作戦は今後、脅威のエコシステム全体に影響を与えると考えられますが、Smokeが完全になくなる可能性は低いでしょう。Zscalerは、業界パートナー、地域のCERT、世界各地の法執行機関と引き続き連携しながら、お客様の保護とより安全なインターネット環境の実現に努めていきます。
Zscalerによる保護
Zscalerの多層クラウド セキュリティ プラットフォームは、以下の脅威名でSmokeに関連するさまざまなレベルの指標を検出しています。
侵害の痕跡(IoC)
IoC | 概要 |
---|---|
akmedia[.]in | SmokeのC2ドメイン |
bethesdaserukam[.]org | SmokeのC2ドメイン |
galandskiyher5[.]com | SmokeのC2ドメイン |
gxutc2c[.]com | SmokeのC2ドメイン |
host-file-host6[.]com | SmokeのC2ドメイン |
host-host-file8[.]com | SmokeのC2ドメイン |
humman[.]art | SmokeのC2ドメイン |
kkudndkwatnfevcaqeefytqnh[.]top | SmokeのC2ドメイン |
nidoe[.]org | SmokeのC2ドメイン |
nuljjjnuli[.]org | SmokeのC2ドメイン |
servermlogs27[.]xyz | SmokeのC2ドメイン |
trad-einmyus[.]com | SmokeのC2ドメイン |
trybobry[.]com[.]ua | SmokeのC2ドメイン |
uohhunkmnfhbimtagizqgwpmv[.]to | SmokeのC2ドメイン |
vacantion18ffeu[.]cc | SmokeのC2ドメイン |
whxzqkbbtzvdyxdeseoiyujzs[.]co | SmokeのC2ドメイン |