偽の請求書を開いたら、レトロなXWorm型ワームホールに落ちた

誰かが「請求書」メールを転送してきて、「添付ファイルが怪しいから確認してほしい」と頼まれました。良い直感です——実際に怪しくて、中身には意外にも古い手口で現代的な脅威が隠されていました。

その動作

もし受信者が添付されていたVisual Basic Script(.vbs)ファイルを開いていたら、リモートアクセス型トロイの木馬「Backdoor.XWorm」が静かにインストールされていたでしょう。起動すると、攻撃者は以下のことが可能になります:

  • ファイル、パスワード、その他の個人情報の窃取
  • キーストロークの記録
  • ユーザーの監視
  • 他のマルウェア(ランサムウェアを含む)のインストール

すべては静かに行われ、警告やウィンドウも表示されません。ウイルス対策ツールを回避し、PCの完全な制御を攻撃者に渡すよう設計されています。

Image

「こんにちは、

添付ファイルに、2025年8月1日午前2:45:06時点で処理済み・支払い済みの請求書一覧をお送りします。

ご確認のうえ、受領済みかどうかご連絡ください。

また、未処理または未払いの請求書があれば、最新リストをお送りいただけますと幸いです。

ご返信をお待ちしております。

よろしくお願いいたします。

会計担当者」

ペイロードは当社のリサーチチームによりBackdoor.XWormと特定されました。XWormは、スパイ活動、キーロギング、データ窃取、さらにはランサムウェアのインストールにも使われる既知のリモートアクセス型トロイの木馬(RAT)およびバックドアです。これはマルウェア・アズ・ア・サービス(MaaS)として販売されており、サイバー犯罪者が他の犯罪者に販売(または多くの場合レンタル)し、利用者はMaaSプロバイダーのインフラを使って盗んだデータの受け取りやバックドア経由のアクセス維持が可能です。

このメールが怪しかった理由

メール自体にも明らかな警告サインがありました:名前がなく、一般的な「こんにちは」と曖昧な「会計担当者」という署名だけ。実際の請求書や支払い通知にはほぼ必ず連絡先情報が記載されているため、これだけでも疑うべきです。

添付ファイルもすぐに目立ちました。.vbsファイルは、今やビジネスメールで使われることはほとんどありません。Visual Basic Scriptは1990年代後半から2000年代のWindows自動化ツールで、今ではより多機能なPowerShellなどに置き換えられています。

現在では、ほとんどすべての企業が.vbs添付ファイルを完全にブロックしています。なぜなら、開いた瞬間にコードが実行される可能性があるからです。

それでも届く場合は、セキュリティフィルターが機能しなかったか、攻撃者が意図的に回避を試みたかのどちらかです。2025年に.vbs「請求書」を受け取るのは、郵便受けにフロッピーディスクが入っているのを見つけるようなものです。レトロで怪しく、絶対に使ってはいけません。

安全を守るために

  • 予期しない添付ファイルは必ず再確認:心当たりがなければ、同じメールへの返信ではなく、既知の連絡方法でまず確認しましょう。
  • 実行可能ファイルは開かない.exe.vbs.bat.scrで終わるものはコードを実行します。正規の企業がこれらをメールで送ることはありません。
  • 警告サインに注意:一般的な挨拶、不自然な役職、隠れたファイル形式は要注意です。ファイル拡張子を表示する設定を有効にして、invoice.pdf.vbsのような偽物を見抜きましょう。
  • 保護を常に有効かつ最新に:最新のリアルタイムマルウェア対策ソリューション(できればウェブ保護モジュール付き)を利用しましょう。

技術的分析

その添付ファイルが実際に何をしてどう動作するのか知りたくなりました。技術志向の読者のために、ワームホールの奥まで深掘りします。

メールの内容

メッセージ自体はシンプルで、「請求書」の短い案内と支払い確認の丁寧な依頼、そしてINV-20192,INV-20197.vbsという.vbs添付ファイルがありました。文章自体に露骨な悪意はありませんが、Visual Basic Scriptの添付がすぐに目を引きました。

.vbsファイルは、もはや正規のビジネス文書で使われることはほとんどありません。直接コードを実行できるため、ほとんどのメールゲートウェイが即座にブロックします。今回届いたということは、設定ミスか意図的なフィルタ回避のどちらかでしょう。

それだけでも、このサンプルは詳しく調べる価値がありました。

配信方法

犯罪者の視点から見ると、悪意あるVBAマクロ付きのExcelファイルを使う方が、単純な.vbs添付より理にかなっています。Excelファイルはビジネス現場で一般的で、正規に見えやすく、生のスクリプトより疑われにくいからです。また、マクロ有効のOffice文書は今もよく使われる配信手段です。多くのユーザーや組織がこれらのファイルを扱い、「正当な理由」に見せかけてマクロ有効化を促されてしまいます。

Microsoftはデフォルトでマクロの実行を難しくしたため、一部の攻撃者は戦術を変えています。ソーシャルエンジニアリングが成功する場面ではマクロもまだ有効ですが、マクロに頼れない場合は他の手法を試すケースが増えています。

Excel文書と比べ、.vbs添付は現代のビジネスメールでは非常に珍しく、ゲートウェイルールでしばしばブロックされます。今回、送信者は隠しファイル拡張子(invoice.pdf.vbs)で無害な請求書に見せかけ、忙しいユーザーを騙そうとした可能性もあります。

.vbsはほぼ時代遅れですが、無害ではありません。Visual Basic ScriptはWindows上で任意のコマンドを実行でき、追加の悪意あるファイルをダウンロード・生成することも可能です。手法は古いですが、フィルターをすり抜けたり、無警戒なユーザーの元に届けば今も有効です。

コードは大したことないだろうと思っていましたが、最初のレベルだけがそうでした。

.vbsIrisBud.bat%TEMP%C:\Windows\Temp\IrisBud.bat)にドロップし、WMI経由で実行します。.batは自身を再起動し、不可視で動作するようになっています。バッチは自分自身をユーザープロファイルにaoc.batとしてコピーし、強力な難読化が施されています。最終的な目的は、aoc.batからエンコードされた文字列を読み取り、本物のペイロードに変換するPowerShellローダーを実行することです。

我々のチームはそのペイロードをBackdoor.XWormと特定しました。これはマルウェア・アズ・ア・サービスとして販売されるリモートアクセス型トロイの木馬です。実行されると、攻撃者にマシンへのステルスアクセスを許し、ファイルや認証情報の窃取、キーログ、さらなるマルウェアやランサムウェアの展開が可能となります。

この一連の流れは静かに進行し、検知を回避するよう設計されています。添付ファイルを開くだけで、ユーザーのデータは重大なリスクにさらされます。もしBackdoor.XWormが自分のマシンで見つかった場合は、この検出プロファイルの「対応とその後」のセクションに従うことをお勧めします。

VBS

最初に見た.vbsファイルは、まるでアルファベットスープのようでしたが、429行目(最終行)に計画が書かれていました。その最終行をコメントアウトすることで、INV-20192,INV-20197.vbsIrisBud.batを作成するものの、実行はしません

Image
vbsファイル内のコードの一部(最終行をコメントアウト)

BAT

しかし、バッチファイルがもっと読みやすいだろうという期待はすぐに打ち砕かれました。バッチファイルの大部分は、ほぼすべてをWriteLineコマンドでIrisBud.batにそのまま書き込むだけのものでした。

しかし、よく見ると1行目の%gkgqglgzhphupcp%や30行目の%viqfvdhc%など、繰り返し使われる変数が多数あります。これらの変数には値が代入されておらず、「パディング」として使われていることが分かりました。パディングとは、マルウェア作者が悪意あるプログラムを検知・解析しにくくするための手法です。

たとえば、秘密の中身を簡単に見つからないようにするため、箱の中に大量の不要な詰め物(発泡スチロール、シュレッダーくず、空間など)を入れて、何が重要なのか分かりにくくするようなものです。

そこで、まずはすべてのパディングを取り除きました。完璧ではありませんが、だいぶ見やすくなりました。

Image
一部復号化されたbatファイル

この行
if not DEFINED Abc1 (set Abc1=1 & cmd /c start "" /min "%~dpnx0" %* & exit)
は、マルウェアがユーザーから実行を隠しつつ、バックグラウンドでスクリプトを動かし続けるための古典的な手法です。順を追って見てみましょう:

  1. if not DEFINED Abc1 — 変数Abc1が未定義か確認します。
  2. set Abc1=1 — 変数に1をセット(このチェックが済んだ印)
  3. cmd /c start "" /min "%~dpnx0" %* — バッチファイルを再起動します:
    • cmd /cは新しいコマンドプロンプトを実行
    • start "" /minはプログラムを最小化(ユーザーに見えない状態)で起動
    • "%~dpnx0"は現在のバッチファイル自身のフルパス
    • %*はコマンドライン引数をそのまま渡す
  4. exit — 現在(可視)のインスタンスを終了

つまり、最初の実行時:

  • 最小化・非表示ウィンドウで自分自身を再起動
  • 元の可視インスタンスは即座に終了
  • 新しい非表示インスタンスはAbc1=1がセットされているので、再起動ループは発生しません。

そしてこの行:
copy "%sourceFile%" "%userprofile%\aoc.bat" >nul
は、batファイルが自分自身をユーザープロファイルディレクトリにコピーする部分です。

分解すると:

  • %sourceFile% — ソース(先に現在のバッチファイルのフルパスがセットされている)
  • %userprofile%\aoc.bat — 宛先:ユーザープロファイルディレクトリ(通常C:\Users\[ユーザー名]\)に新しい名前aoc.batでコピー
  • >nul — 出力抑制(「1個のファイルをコピーしました」などのメッセージを非表示)

setlocal enabledelayedexpansionは、変数の値をループやコードブロック内で動的に更新・利用するために、変数の前後に!を使う遅延展開を有効にするものです。これはsetlocal enabledelayedexpansionコマンドで有効化されます。

次の行から、!xmgotoyfycqitjc!setコマンドに置き換えられることが分かります。

なぜなら、

set "xmgotoyfycqitjc=!ejlhixzkmttzgho!e!ugcqubmykdxgowp!"
と定義されており、先に
set "ejlhixzkmttzgho=s"
set "ugcqubmykdxgowp=t"

とあるので、xmgotoyfycqitjc = s + e + tとなります。これらをすべて置換することで、パディングでない変数のマッピングが進みました。

特に注目すべきは、すべてのマッピング済み変数が集まる414行目です。

Image
一部復号化されたbatファイルの最後の部分

他に目立ったのは、::で始まり非常に長い文字列を含む2行です。一見普通のバッチコメントですが、実は暗号化されたペイロードデータが隠されています(41行目と69行目が隠しペイロード)。

Image

これについては後ほど説明します。

まずは414行目を可読化する必要があります。

定義済み変数をすべて置換すると、414行目は次のようになりました:

Windows\System32\WindowsPowerShell\v1.0\powershell.exe-nop -c coding]::Unicode.GetString([Convert]::FromBase64String(('CgAkA…..{very_long_base64_encoded_string}…..AoA'.Replace('hkfdo','')))))

replaceコマンドを見ると、エンコードされたPowerShellスクリプトにもhkfdoというパディングが入っているので、これも取り除く必要があると分かります。

PowerShell

それを取り除き、base64デコードした結果がこのPowerShellスクリプトです:

Image
生成されたPowerShellスクリプト

このPowerShellスクリプトが何をしているかは、先ほど触れた2つの長い行がなぜ必要なのかを説明しています:

前半:スクリプトはaoc.bat(自分で作成したコピー)内の隠しペイロードを探します。バッチファイルを1行ずつ読み、:::(コロン3つ)で始まる行を探します。見つけると、コロン以降をBase64データとしてデコードし、PowerShellコードとして実行します。これはバッチファイルのコメントに見せかけて悪意あるコマンドを隠す手法です。

後半:メインの悪意あるペイロードを生成します。大きなブロック($weiamnightfoで始まる)は以下を行います:

  1. aoc.batから暗号化データを読み取る:バッチファイル内の::(コロン2つ)で始まる行を探し、そこに暗号化・圧縮されたマルウェアが含まれています。
  2. データを復号:AES暗号(ハードコードされた鍵と初期化ベクトル)でペイロードを復号します。特定の組み合わせで金庫を開けるようなものです。
  3. 解凍:復号後、GZip圧縮を解凍します。マルウェアは小さく、検知されにくく圧縮されています。
  4. マルウェアをメモリ上で実行:復号・解凍されたデータは2つの実行ファイルで、これらをディスクに保存せず直接メモリにロードして実行します。これを「ファイルレス攻撃」と呼び、マルウェア対策の検知を回避します。

このように、悪意あるプログラムを直接メモリ上で実行することで、ディスク上に目立つファイルを残さず、マルウェア対策ソリューションによる検知や捕捉を困難にしています。

ペイロード

ペイロードを安全に抽出するため、私はPythonスクリプトを書き、手順1~3をメモリ上で実行せずに再現しました。これにより2つの実行ファイルサンプルが得られ、隔離されたサンドボックスで実行しました。

サンドボックスは5wyy00gGpG6LF3m6というミューテックスを検出し、XWormファミリーであることが判明しました。「ミューテックス」とは、Windows上で同時に1つのプロセスだけが動作するようにするための特別なマーカーです。マルウェア作者はこれをコードに埋め込み、セキュリティアナリストは指紋のようにカタログ化します。研究者が既知のミューテックス名を見つけると、マルウェアの分類が容易になり、次のサンプルへと進めます。

侵害の痕跡(IOC)

INV- 20192,INV-20197.vbs(メール添付)
IrisBud.bat%temp%フォルダ内)
aoc.bat(%user%フォルダ内)
SHA256: 0861f20e889f36eb529068179908c26879225bf9e3068189389b76c76820e74e(Backdoor.XWorm用)


私たちは脅威を報告するだけでなく、駆除もします

サイバーセキュリティリスクは見出しだけで終わらせましょう。今すぐMalwarebytesをダウンロードして、脅威からデバイスを守りましょう。

翻訳元: https://www.malwarebytes.com/blog/threats/2025/11/we-opened-a-fake-invoice-and-fell-down-a-retro-xworm-shaped-wormhole

ソース: malwarebytes.com