Elastic Security Labsは、ブラジル発の新たなバンキング型トロイの木馬を特定し、TCLBANKERとして追跡しています。このマルウェアファミリーは、 MAVERICK / SORVEPOTELファミリーのメジャーアップデートであると評価しています。REF3076として追跡されているこのキャンペーンは、強力な解析対策機能を備えたローダーを特徴としており、.NET Reactorで保護された2つの組み込みモジュール(フル機能のバンキング型トロイの木馬と自己増殖用のワームモジュール)を展開します。
このバンキング型トロイの木馬は、UIオートメーションを介して被害者のブラウザのアドレスバーを監視し、 59 ブラジルの銀行、フィンテック、および暗号通貨ドメインを標的にします。通常の遠隔アクセスコマンドに加え、最も注目すべき機能は、オペレーター主導のソーシャルエンジニアリング向けに設計されたWPFベースのフルスクリーンオーバーレイフレームワークである。
2つ目のモジュールはスパムエージェントによる配信を処理し、我々は2つの亜種を検出した。1つは認証済みのブラウザセッションを乗っ取って被害者の連絡先にメッセージを送信するWhatsAppワーム、もう1つはCOM自動化を介して被害者自身のアカウントからフィッシングメールを送信するOutlookメールボットである。
本レポートでは、各段階の詳細な技術的分析を提供します。
重要なポイント
- TCLBANKERは環境制御型のペイロード復号化を使用するため、サンドボックスなどの不適切な環境ではペイロードの復号化がサイレントに失敗します。
- 包括的なウォッチドッグサブシステムは、実行全体を通して分析ツール、デバッガ、計測フレームワーク、および整合性違反を継続的に監視します。
- このバンキング型トロイの木馬は 59 ブラジルの銀行、フィンテック、暗号通貨関連のドメインを標的とし、被害者が監視対象サイトにアクセスした際にWebSocket C2セッションをアクティブ化します。
- WPFベースのフルスクリーンオーバーレイフレームワークは、認証情報の収集、フィッシング待ち画面、偽のWindows Update停止など、オペレーター主導のソーシャルエンジニアリングを可能にする一方で、オーバーレイを画面キャプチャツールから隠蔽します。
- ワームモジュールがマルウェアを拡散させる:WhatsAppボットとOutlookメールボット
- C2および配信インフラストラクチャはすべて単一のアカウントでCloudflare Workers上にホストされており、開発者アーティファクト(デバッグログパス、テストプロセス名)と不完全なフィッシングページが存在することから、このキャンペーンは運用初期段階で特定されたことが示唆される。
配達
TCLBANKERはブラジル発のバンキング型トロイの木馬で、強力な解析対策ロードコンポーネントを備えた動的な感染チェーンを持ち、2つの埋め込みペイロード(ワーム、バンカー)を展開することができます。確認された感染経路では、悪意のあるMSIインストーラーがZIPファイル内にバンドルされている。これらのMSIインストーラーパッケージは、 Logi AI Prompt Builderと呼ばれる署名付きLogitechプログラムを悪用しています。
TCLBANKERは、 Flutterフレームワーク上に構築された正規のLogitechアプリケーションであるLogiAiPromptBuilder.exeに対して、DLLサイドローディングを悪用します。悪意のある DLL screen_retriever_plugin.dll 、同名の正規の Flutter プラグインを装い、ホスト アプリケーションの起動時に自動的にロードされます。
MSIのインストール後、悪意のあるDLLが直ちにロードされ、DllMainエントリポイントから起動します。
ローダ
TCLBANKERのローダーコンポーネントには、デバッグ対策機能、解析対策チェック、文字列暗号化、システム言語チェック、ETWパッチ適用、ウォッチドッグ機能など、豊富な機能が搭載されています。多くの機能を備えているものの、深みに欠け、古いマルウェア解析ツールへの言及が見られる。開発者がLLM支援ワークフローを使用したかどうかは完全には明らかではありませんが、もしそうだったとしても、私たちのチームは驚きません。
実行の開始時に、TCLBANKER は、コマンドラインで文字列 ( --renderer=sw ) が使用されているかどうかに基づいて、対応する .NET アセンブリ ペイロードを整列します。メインのローダー機能内で、まずDLLのロード方法に基づいて許可リスト/ブロックリスト操作を実行します。悪意のあるDLLは、ホストプロセスが以下の2つのプロセスから来た場合にのみ実行されます。
logiaipromptbuilder.exetclloader.exe(テスト中に開発者文字列を参照する可能性あり)
以下のプロセスによってDLLがロードされた場合、実行が拒否されます。これらのプロセスは、従来、アナリストがDLLをロードおよびデバッグするために使用されてきました。
rundll32.exeregsvr32.exedllhost.exesvchost.exe
次に、TCLBBANKER はディスクからntdll.dll置き換えることで、ユーザーモードのフックをすべて削除します。さらなる回避策として、マルウェアは後で使用する以下のシステムコールトランポリンを生成します。
NtQueryInformationProcessNtSetInformationThreadNtSetInformationProcessNtTerminateProcessNtAllocateVirtualMemoryNtProtectVirtualMemory
システムコールスタブをインストールした後、マルウェアはntdll.dllのEtwEventWriteを古典的なxor eax, eax; retでパッチして、ユーザーモードETWテレメトリを無効にします。
TCLBANKER は、 GetTickCount64()を使用して開始ティックをキャプチャし、 500 ミリ秒間スリープし、経過時間を計測することによって、初期サンドボックスチェックを実行します。実際に 450 ミリ秒未満しか経過していない場合、マルウェアは処理を中止します。これは、Sleep関数をフックして即座に復帰するサンドボックスやエミュレーションフレームワークを検出します。
TCLBANKERの興味深い機能の1つは、以下の基準に基づいて3つのフィンガープリントを生成する列挙関数です。
- デバッグ対策チェック
- システムディスク情報とメモリチェック
- 言語チェック
開発者は、各カテゴリの「クリーン」パスに割り当てられたマジック定数を使用し、それぞれに対してXOR演算を実行して環境ハッシュを生成します。この環境ハッシュ値は、埋め込まれたペイロードの下流での復号化に影響を与えるため、重要です。
例えば、デバッガーが存在する場合、誤ったハッシュが生成されるため、マルウェアがそのハッシュから復号鍵を導出しようとしても、ペイロードは正しく復号されず、TCLBANKERは実行を停止します。
デバッグ対策チェック
TCLBANKERは、6種類の異なるデバッグ対策チェックを実装しています。
Peb->BeingDebuggedフラグを使用してデバッガーを識別します。- デバッガでプロセスが起動されたときに設定されているヒープテール/ヒープフリー/チェックヒープフラグをチェックします
ProcessDebugPortを使用してNtQueryInformationProcess()レバレッジをかけますProcessDebugObjectHandleを使用してNtQueryInformationProcess()を使用します- デバッグレジスタ(
DR0-DR3)によるハードウェアブレークポイント検出 QueryPerformanceCounter()個のデルタとRDTSCのサイクルカウントを使用して経過時間を計測します。
システム情報チェック
TCLBANKERは、仮想化、システム、およびユーザー情報に基づいて、以下の5つの異なるチェックを行います。
- ベンダー署名を使用して仮想化ソフトウェアをチェックします
| ハイパーバイザー | ベンダー署名 |
|---|---|
| VMware | VMwareVMware |
| VirtualBox | VBoxVBoxVBox |
| KVM | KVMKVMKVM |
| Xen | XenVMMXenVMM |
| Parallels | prlハイパーV |
| QEMU/TCG | TCGTCGTCGTCG |
GetDiskFreeSpaceExW()を介してルートシステムドライブ (C:\\) に少なくとも 64 GB の空き容量があることを確認します。- システムに 2 GB以上のRAMが搭載されていることを確認するために
GlobalMemoryStatusEx()を呼び出します。 - 2 または CPU プロセッサをチェックします
GetSystemInfo() - 一般的なサンドボックス/マルウェアのユーザー名をチェックします
sandbox,malware,virus,sample,john doe,currentuser
言語チェック
最後の環境フィンガープリントチェックでは、TCLBANKER はGetUserGeoID()を使用して感染したマシンの地理情報を取得し、地理 ID ( 0x20 ) に基づいてブラジルのユーザーをターゲットにします。GetUserDefaultLCID()による 2 番目のロケール チェックにより、ユーザーのデフォルト言語がブラジル ポルトガル語 (pt-BR、LANGID 0x0416) であることも確認されます。
これらのチェックセットの後、TCLBANKER は何かが検出された場合は実行を中止するか、検出されなかった場合はDbgUiRemoteBreakin()パッチすることで別のデバッグ対策チェックを生成します。このマルウェアは、最初のバイトをa ret命令にパッチすることで、リモートからプロセスに侵入しようとする試みが何も起こらないようにします。注入されたスレッドはすぐに戻り、ターゲットは中断されることなく実行を継続します。
その後、マルウェアは.rdataセクションのハードコードされた定数と、先に計算された環境ハッシュを使用して、AES-256 CBCキーとIVを導出します。TCLBankerはBCryptDecrypt()を使用して埋め込まれたペイロードを復号し、次にLZNT1圧縮アルゴリズムを使用してRtlDecompressBufferを介して解凍します。
それぞれのペイロードが復号されると、TCLBANKER はCoInitializeEx()を介して COM を初期化し、CLR ホスティング API を使用して .NET ランタイムをプロセス内にロードします。ペイロードのエントリポイントを起動する前に、TCLBankerは2つの新しいスレッドを作成します。1つはウォッチドッグとして機能し、もう1つはハートビートチェックとしてウォッチドッグスレッドを監視します。
監視犬
TCLBANKERには、逆アセンブラ、デバッガ、計測製品、ウイルス対策製品、サンドボックス製品など、さまざまな分析ツールを対象とした包括的な監視機能が備わっています。このセクションでは、この機能で使用されているさまざまな技術について概説します。
- デバッガーチェック
PEB→BeingDebugged - ハードウェアブレークポイント
DR0/DR1/DR2/DR3を監視します - Windows関数(
BCryptDecrypt()、BCryptOpenAlgorithmProvider())の最初の 12 バイトをスキャンして、インラインフックがないかチェックします。 - 計測ツールおよび関連文字列のモニター(
frida、cydia、user-path injection、hook framework) - すべてのカーネル名付きパイプをレビューし、
fridaまたはlinjectorを検索します。 CreateToolhelp32Snapshot()を介して、以下のプロセス名を対象にプロセス列挙を実行します。frida、de4dot、dnspy、megadumper、extremedumper、processhacker、x64dbg、x32dbg、pe-sieve、scylla、Ilspy、dotpeek、netreactorslayer、cheatengine
- これらのタイトルに対して、
GetWindowTextW()を介して Windows タイトル検出を使用します。x64dbg、x32dbg、ida -、ida pro、ghidra、dnspy、megadumper、extremedumper、processhacker、ollydbg、windbg)_、pe_sieve、scylla
FindWindowW()を介して、以下のウィンドウクラス名に基づいてアナリストツールを識別します。IDATopLevelWindow,idaabortwndclass,TIdaWindow,x64dbg,x32dbg,OLLYDBG,WinDbgFrameClass,ProcessHacker,SystemInformer,CheatEngine,HxdClass
- 以下のロード済みモジュールをチェックします
dbeng.dll,dbgcore.dll,SbieDll.dll,snxhk.dll,cmdvrt32.dll,cmdvrt64.dll,cuckoomon.dll,pstorec.dll,vmcheck.dll,wpespy.dll
- 以下のミューテックスとイベントを対象とします。
Ida_trusted_idbs,IDA_COMM_PIPE_,Local\\x64dbg,Local\\x32dbg,Frida,YOURAPPNAMEHERE
- 改ざんを防止するため、
.textセクションに対してCRC32整合性チェックを実行します。
バンキング型トロイの木馬モジュール
Tcl.Agent これはバンキング型トロイの木馬であり、チェーンの主要コンポーネントです。これは .NET Reactor で保護されており、de4dot や NETReactorSlayer などの利用可能なオープンソースツールを使用して難読化を解除することはできませんでしたが、.NET Reactor の文字列暗号化、制御フローのフラット化、IL の変更、デリゲートプロキシ、暗号化されたメソッド本体 (Necrobit) に対処するカスタム難読化解除パイプラインを使用して、このステージを満足できる状態まで静的に難読化解除することに成功しました。これは新しいマルウェアではあるものの、コード構造の多くは、2020年に公開されたESETのLATAMバンキング型トロイの木馬の実装設計図に準拠している。
起動時に、マルウェアはジオフェンシングを実行し、以下の指標のうち 2 がブラジルと一致することを要求します。そうでない場合、ブラジルのマシンでなければすぐに終了します。
| 確認 | 実装 |
|---|---|
| 地域コード | 新しい RegionInfo(CultureInfo.CurrentCulture.LCID).TwoLetterISORegionName == "BR" |
| タイムゾーン | TimeZoneInfo.Local.BaseUtcOffset.TotalHours: >= -5.0 の場合、== -2.0 かどうかを確認します。 |
| LCID | CultureInfo.CurrentCulture.LCID == 1046 (ポルトガル語-ブラジル) |
| キーボード | GetKeyboardLayoutList() - 各レイアウトをチェック: (ToInt32() & 0xFFFF) == 1046 |
インストールと永続性
初回実行時に、マルウェアはアプリケーションディレクトリ全体を%LocalAppData%\LogiAIにコピーします。ソースディレクトリ内のすべての.dllおよび.exeファイルに対してSHA-256ハッシュを計算し、 .versionマーカーファイルに書き込みます。以降の実行では、ハッシュ値を比較して重複したコピーをスキップします。コピー後、インストールパスから新しいインスタンスを起動して終了します。
これは、タスクスケジューラ( CLSID 0F87369F-A4E5-4CFC-BD3E-73E6154572DD )とのCOM相互運用を使用して、 RuntimeOptimizeServiceという名前のスケジュール済みタスクを作成します。このタスクは、非表示、有効、実行時間制限なし、バッテリー駆動時も許可、利用可能になったら開始、現在のユーザーにスコープされたログオントリガー( type 9 )で起動するように構成されています。TASK_CREATE_OR_UPDATEとTASK_LOGON_SERVICE_ACCOUNTに登録されます。
永続性が確立されると、エージェントはエージェントID( MachineName-UserName )、マシン名、ユーザー名(冗長)、およびOSバージョンを含む初回実行POSTビーコンをhttps://campanha1-api.ef971a42.workers[.]dev/api/installsに送信します。リクエストはハードコードされたキャンペーン認証トークン0d21613a-2609-45fc-83ff-d0feaa0c891fで認証されます。新しいバージョンでは、この呼び出し ( C:\temp\tcl-debug.txt ) に関するデバッグログが追加されますが、これは意図せずディスク上のエージェントの存在を露呈する開発者のアーティファクトです。
自己更新
エージェントは、起動パイプラインの早い段階で実行されるハッシュベースの自己更新ゲートを実装しています。インストールディレクトリ内のflutter_engine.cfgからローカルバージョンのハッシュを読み取り(レガシーversion.hashファイル名が存在する場合はそこから移行)、切り詰められた User-Agent 文字列(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36を使用してファイルサーバーエンドポイントdocuments.ef971a42.workers[.]dev/api/versionから現在のハッシュを取得します。
レスポンスは「ハッシュ」キーに基づいて解析されます。リモートハッシュがローカルハッシュと一致する場合、実行は通常どおり続行されます。初回インストール時には、リモートハッシュがディスクに書き込まれ、更新せずに実行が続行されます。
ハッシュの不一致が検出されると、エージェントはdocuments.ef971a42.workers[.]dev/api/updateからMSIとして%TEMP%\update_{8hexchars}.msiに更新ペイロードをダウンロードし、ベアラートークンb7ba9e80-0d04-4d9e-b217-c8b3cce335a2で認証します。
ダウンロードは、健全性チェックとして、最低サイズが100KBであることを検証します。エージェントは、現在のプロセスが終了するまでタスクリストをポーリングし、サイレントインストールのためにmsiexec /i /qn REINSTALLMODE=amusを実行し、自身を削除する自己削除バッチスクリプトを%TEMP%に書き込みます。バッチファイルは、エージェントが終了する前に、非表示のcmd.exeプロセスを介して起動され、更新されたペイロードに実行が引き継がれます。
ブラウザURLモニターとC2セッションの初期化
マルウェアエージェントは毎秒、 UIオートメーションを介してフォアグラウンドブラウザのアドレスバーを読み取るブラウザURLモニター関数を呼び出します。これはGetForegroundWindowを呼び出し、所有プロセスを解決し、プロセス名を Chrome、Firefox、Microsoft Edge、Brave、Opera、および Vivaldi に対してチェックし、次にAutomationElement.FromHandle -> FindFirst(Descendants, ControlType.Edit) -> ValuePattern.Current.Valueを使用して URL を抽出します。これは、この Stack Overflow の実装と同様です。
抽出されたURLは、バイナリに埋め込まれた対象銀行の固定リストと照合され、16バイトのキーとBase64エンコードを使用してXOR演算されます。
このGitHub Gist には、ブラジルの銀行、フィンテック プラットフォーム、暗号通貨取引所など、 59 ターゲット ドメインのリストが含まれており、復号化された各ドメインに付加されたターゲット ID ごとにグループ化されています。
一致するものが見つかると、ドメインターゲットIDが次の状態に渡され、 wss://mxtestacionamentos[.]com/wsへのWebSocket接続を確立することで公式のC2通信が初期化されます。OnConnectハンドラが起動し、エージェント ID (実行時にランダムな GUID)、マシン名、ユーザー名、マシン情報、タイムスタンプ、ドメインターゲット ID (C2 が被害者が開いた Web サイトを知るため)、および署名を含む登録パケットを送信します。
ハンドシェイク署名を生成するために、キャンペーン GUID 70e4f943-e323-4484-97d7-35401bf6812cをキーとして使用して、被害者識別子 (エージェント ID、マシン名、ユーザー名、OS バージョン、タイムスタンプ) に HMAC-SHA256 で署名します。
サーバーは登録確認応答を返し、正式にセッションを開始し、コマンドディスパッチループに入ります。セッション開始時に、タスクマネージャキラーが500ミリ秒ごとに起動され、被害者がエージェントのプロセスを検査したり終了したりするのを防ぎます。
C2コマンドテーブル
機能の概要は、以下のオペコード表で説明されています。
| オペコード | 目的 |
|---|---|
| 2 | 登録確認、タスクマネージャーキラーを起動します |
| 4 | グレースフルなWebSocket切断 |
| 5 | 自殺:兄弟プロセスをすべて強制終了して終了する |
| 6 | 強制再起動( shutdown.exe /r /t 0 /f ) |
| 7 | 自殺してからアンインストール:自身を除く、同じホストバイナリ名を持つすべてのプロセス(兄弟プロセス)を強制終了 → アンインストール → 終了 |
| 16 | スクリーンショット |
| 17 | 画面のストリーミングを開始します |
| 18 | 画面のストリーミングを停止します |
| 19 | 画面キャプチャの品質を設定します(1~100)。 |
| 20 | モニターを列挙する |
| 32 | マウス移動(X、Y、モニターインデックス) |
| 33 | オーバーレイを通してマウスをクリック: {X,Y,Button,MonitorIndex}解析 → 絶対デスクトップ座標に変換 → その点を覆うインプラント自身のオーバーレイウィンドウを見つける → そのピクセルでオーバーレイに 2x2 の領域の穴を開ける → SetCursorPos + SendInputマウスダウン/アップ (オーバーレイの下にある実際のデスクトップコンテンツに到達)。 |
| 34 | マウススクロール(デルタ、 SendInput ) |
| 35 | キータップ(キーコード、 SendInput ) |
| 37 | キーが押された(キーコード、 SendInput ) |
| 38 | キーアップ(キーコード、 SendInput ) |
| 39 | キーロガーを開始します( WH_KEYBOARD_LLフック) |
| 40 | キーロガーを消去し、C2へデータを転送する。 |
| 41 | クリップボードハイジャック( Clipboard.SetText ) |
| 48 | ファイルシステムのディレクトリ一覧 |
| 65 | 実行中のプロセス情報を取得する |
| 67 | シェルコマンド実行( cmd.exe /c ) |
| 80 | 表示されているすべてのウィンドウを列挙します |
| 81 | ウィンドウマネージャー:ウィンドウのプロセスを強制終了する / ウィンドウを最小化する / ウィンドウを復元する / ウィンドウを前面に表示する / ウィンドウを閉じる / ウィンドウを別のモニターに移動する |
| 83 | 進行状況オーバーレイを表示する:進行状況ステップまたは偽のWindows Update画面 |
| 84 | 分解オーバーレイ |
| 85 | 画面キャプチャの無効化を切り替えます。すべてのオーバーレイウィンドウでWDA_EXCLUDEFROMCAPTUREを有効/無効にして、画面共有/スクリーンショットから非表示にします。 |
| 86 | オーバーレイコンテンツを更新 |
| 87 | 切り抜きオーバーレイを表示: 可視領域の切り抜きがあるオーバーレイ内に外部ウィンドウを固定します |
| 96 | 認証情報プロンプトオーバーレイを表示する |
ソーシャルエンジニアリングUIフレームワーク
このバンキング型トロイの木馬のより興味深い機能は、アクティブなC2セッション中に銀行をテーマにした不正行為の流れをオーケストレーションする、 WPFベースのフルスクリーンオーバーレイサブシステムである。
オーバーレイのライフサイクル
オーバーレイマネージャは、モニターごとに1つのフルスクリーンWPFウィンドウを生成します。ウィンドウは、枠なし、最前面、タスクバーから非表示( WindowStyle.None 、 Topmost = true 、 ShowInTaskbar = false )に設定され、オペレーターがオーバーレイのティアダウンコマンドで内部フラグを切り替えるまで閉じることを拒否するカスタムハンドルClosing )が付いており、ウィンドウが閉じられないようになっています。
起動時に、マネージャーはCopyFromScreenを介してすべてのディスプレイのPNGスクリーンショットをオーバーレイの背景としてキャプチャし、「フリーズしたデスクトップ」のような外観を作成します。現在アクティブなオーバーレイに応じて、被害者は背後にある実際のデスクトップ環境を認識する。
500msタイマーはSetWindowPosを介してHWND_TOPMOST継続的に再適用し、オーバーレイの上に表示しようとするウィンドウをすべて無効化します。
さらに、アンチキャプチャ機能はSetWindowDisplayAffinity WDA_EXCLUDEFROMCAPTUREで呼び出し、オーバーレイをあらゆるスクリーンキャプチャツールから見えなくすることで、オペレーターがスクリーンショットやスクリーンストリーミングコマンドを通じて自身のオーバーレイを通して画面を見ることができるようにします。
入力ブロッカー
メインモニターには、2 つのフックが取り付けられています: WH_KEYBOARD_LLとWH_MOUSE_LL 。両方のフックは、それぞれの注入フラグ(キーボードの場合はLLKHF_INJECTED 、マウスの場合はLLMHF_INJECTED )をチェックし、オペレーターのリモートコマンドによってSendInputを介して注入された入力がそのまま通過できるようにします。キーボードフックは、Tab、Escape、Alt+F4、Windowsキー、PrintScreen、Ctrl、Alt、およびすべてのナビゲーションキーを無効化します。マウスフックは、右クリック、中央クリック、スクロールをブロックしますが、左クリックとマウスの移動は許可するため、被害者はオーバーレイプロンプトを操作できます。
ソーシャルエンジニアリングUIビルダー
オーバーレイフレームワークには、5種類の交換可能なコンテンツレンダラーが組み込まれています。
認証情報プロンプト:オペレーターの要求パラメータに基づいて選択される3つの入力モードをサポートします。
- 電話モードでは、リアルタイムのブラジル形式マスキング(10桁の固定電話の場合は(##)####-####、11桁の携帯電話の場合は(##)#####-####)が適用され、最大桁数は 11 です。
- 仮想キーパッドモードでは、画面上に数字キーパッド(0~9のボタンと「limpar」/クリアボタン)が表示され、入力内容はPIN入力を模倣した箇条書き文字で表示されます。
- デフォルトモードでは、最大長を設定可能なプレーンテキストを受け入れます。
すべてのモードでは、入力された値を品質検証器に通し、アルゴリズムによって同じ数字のシーケンス( 000000 )と昇順/降順の連続( 123456 、 654321 )を拒否して、被害者が無効な値を入力するのを防ぎます。
送信アクションは、取得した値をC2に送信します。
フィッシング待ち画面:被害者が認証情報入力欄に電話番号を入力した後に起動します。「Estamos entrando em contato」(「連絡を取っています」)というメッセージと、中央の画像が「呼吸」アニメーションで動き、3つのドットが不透明度のアニメーション(ドットごとに300msオフセット)で段階的に変化し、「つながっている」ようなビジュアルを作り出します。その後、犯人または共犯者が被害者の実際の電話番号に電話をかけ、銀行の警備員になりすますことができる。
進行状況ステップ:オペレーターがテンプレート化した、ランダムなアニメーション付きのダミー処理ステップ一覧を表示する停止画面。ステップの所要時間はランダム化され、合計は約 15 分になります。タイマーは各ステップを順番に進め、完了したステップを視覚的に表示し、現在のステップを強調表示し、残りのステップを暗く表示します。すべてのステップが完了すると、シーケンスは新しいランダム化されたタイミングとともに以前の位置にリセットされ、続行されます。
偽のWindowsアップデート:Windows 10/11のアップデート再起動画面を模倣した、代替のフリーズ画面。単色の#0078D7 (Windowsのアクセントブルー)の背景に、円形に配置された5つの楕円形の回転インジケーターを表示します。実際のWindowsアップデートの不規則な進行状況を再現するため、パーセンテージ表示がランダムに選択された50~81秒間隔で25~35%ずつ急上昇します。デフォルトのサブタイトル:「Trabalhando em atualizacoes」(「更新作業中」)。
切り抜きオーバーレイ:フルスクリーンオーバーレイに長方形の穴を開け、下にあるアプリケーションウィンドウを表示します。オペレーターはオペコード 87 を介して穴の寸法を指定します。このオペコードでは、オーバーレイマネージャが透明な境界線のプレースホルダーを持つテーマ付きカードを作成し、レイアウト後にその画面座標を計算し、 CreateRectRgn + CombineRgn(RGN_DIFF) + SetWindowRgnを使用して一致する領域の穴を切り抜きます。ターゲットウィンドウは穴の下に再配置される。その結果、オーバーレイの中に実際のアプリケーションウィンドウが表示され、被害者は実際のアプリケーションを操作しているように見える一方で、周囲のオーバーレイは偽のコンテキストを提供している。
ワームモジュール
ローダーによって呼び出される 2 番目のモジュールはTcl.WppBotであり、スパムやフィッシング メッセージを大規模に拡散し、TCLBANKER を配布するように設計されています。2種類の異なる薬剤が2台の異なるローダーから回収され、分析された。
- ブラウザセッションを乗っ取るWhatsAppワーム
- COM相互運用機能を利用してMicrosoft Outlookを悪用するOutlookメールボット
Tcl.WppBot また、 Tcl.Agent保護するために使用されたのと同じバージョンの .NET Reactor で保護されているため、この段階でペイロードを静的に難読化解除することにも成功しました。
両エージェントは同じC2バックエンド、認証情報、および運用インフラストラクチャを共有します。C2 URLとAPIキーは、起動時にハードコードされたキーを用いたXOR復号によって復号されます。
- C2 URL:
campanha1-api.ef971a42.workers[.]dev(Cloudflare Workersアプリ) - APIキー/ベアラートークン:
0d21613a-2609-45fc-83ff-d0feaa0c891f
C2はhttps://campanha1-api.ef971a42.workers[.]dev/api/campaignエンドポイントを介して単一のスーパーセットキャンペーン構成オブジェクトを提供します。各エージェントバリアントはオブジェクト全体を逆シリアル化しますが、自身のチャネルに関連するフィールドのみを読み取ります。
キャプチャされた構成:
message : Ola tudo bem?
Preciso de um orçamento, estarei encaminhado caso tenha os produtos por favor me retorne para
darmos continuidade no atendimento.
https://arquivos-omie[.]com ð
âï¸*IMPORTANTE*: Este orçamento foi otimizado para visualização em Computadores Desktop,
pois o mesmo necessita de visualizador de excel, word ou pdf.
fileUrl : https://documents.ef971a42.workers[.]dev/file
delayMin : 1
delayMax : 3
maxPerSession : 3000
updatedAt : 2026-04-17T15:54:07.003Z
type : gmail
subject : Prezado(a), NFe disponÃvel para impressão
emailMessage : <!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Nota Fiscal DisponÃvel</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
padding: 0;
text-align: center;
background-color: #f4f4f4; /* Cor de fundo mais clara */
color: #333; /* Cor do texto ajustada para ser visÃvel */
}
h1 {
font-size: 24px;
margin-bottom: 20px;
font-weight: normal; /* TÃtulo sem negrito */
}
p {
font-size: 16px;
margin-bottom: 20px;
line-height: 1.6;
color: #333; /* Garantir que o texto esteja visÃvel */
}
.btn {
background-color: #007BFF;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
}
.btn:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<h1>Prezado(a)</h1>
<p>
Sua Nota Fiscal Eletrônica (NFe) está disponÃvel e pronta para ser acessada.
Para facilitar, basta clicar no botão abaixo para abrir o documento.
</p>
<p>
Caso tenha alguma dúvida sobre os detalhes da nota ou precise de alguma alteração, por
favor, entre em contato conosco.
</p>
<a href="https://arquivos-omie[.]com" target="_blank">
<button class="btn">Abrir Nota Fiscal</button>
</a>
<p>
Agradecemos pela confiança e ficamos à disposição para qualquer outra necessidade.
</p>
</body>
</html>
emailDelayMin : 30
emailDelayMax : 90
emailMaxPerSession : 100
同じ Cloudflare アカウントef971a42は、 documents.ef971a42.workers[.]devでペイロード配信 CDN (設定オブジェクトのfileUrlのドメイン) もホストしています。/fileエンドポイントからアクセス可能で、現在はTCLBANKERトロイの木馬が仕込まれたLogiAI Prompt Builder MSIを含むzipファイルを提供しています。このインフラストラクチャに関する決定により、オペレーターは専用サーバーを維持することなく、インフラストラクチャを迅速に再展開することが可能になります。
執筆時点では、上記の構成で識別されたフィッシング ドメインarquivos-omie[.]com 2026-04-15 に作成されましたが、動作可能な状態ではありません (ようこそ!このポータルサイトは現在、定期メンテナンス中です。後ほどもう一度お試しください。この作戦は、初期の運用段階にあるか、任務遂行のために準備されている可能性がある。このドメイン名は、ブラジルで人気の高い企業資源計画(ERP)ソフトウェアを模倣して付けられています。
エージェント1:WhatsAppボット
WhatsAppエージェントは、被害者の認証済みWhatsAppウェブセッションを密かに乗っ取り、スパムメッセージを送信したり、ブラジルの連絡先にTCLBANKERを配布したりします。
セッションハイジャック
このマルウェアは、まずターゲットシステム上のChromiumベースのブラウザを検出し、次にApp PathsレジストリエントリとChrome、Edge、Brave、Opera、Vivaldiの一般的なインストールディレクトリの両方をスキャンします。次に、各ブラウザのユーザープロファイル(例:「デフォルト」、「プロファイル1」など)を順に調べ、アクティブなWhatsApp Webセッションの痕跡を探します。プロファイルの IndexedDB ストレージに<profile_dir>/IndexedDB/https_web.whatsapp[.]com_0.indexeddb.leveldb/の WhatsApp Web LevelDB ディレクトリが含まれている場合、そのプロファイルは認証済みセッションを持っているとフラグ付けされます。
その後、各プロファイルはプロファイルクローン作成およびセッションハイジャック機能に送信されます。
マルウェアは、対象となるプロファイルごとに、それを一時ディレクトリ%TEMP%\<GUID>\にクローンし、WhatsApp Web セッションを再開するために必要なファイルのみをコピーします: IndexedDB 、 Local Storage 、 Session Storage 、 databases 、 Web Data 、 Login Data 、およびCookies 。次に、Selenium WebDriver を介してヘッドレス Chromium インスタンスを起動し、 --user-data-dirはクローンされたプロファイルを指します。
一致するchromedriver.exeは、 %TEMP%\msvc-rt14\bin\hostfxr.exeに配置された偽装された Selenium Manager バイナリによって実行時に解決され、 --browser chrome --output jsonで呼び出され、被害者のインストールされている Chrome バージョンと互換性のある chromedriver のパスを返します。
起動直後、マルウェアはJavaScriptを挿入してnavigator.webdriver隠蔽し、 chrome.runtimeにデータを入力し、 Notification.permission / permissions.query状態の不一致を解消し、空でないnavigator.plugins配列を偽装し、 navigator.languagesを['pt-BR', 'pt', 'en-US', 'en']に設定してターゲット層に合わせます。
Object.defineProperty(navigator, 'webdriver', {
get: () = > undefined
}
);
delete navigator.__proto__.webdriver;
if (window.chrome) {
window.chrome.runtime = window.chrome.runtime || {};
}
const origQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (p) = > (
p.name == = 'notifications' ?
Promise.resolve( {
state: Notification.permission
}
) :
origQuery(p)
);
Object.defineProperty(navigator, 'plugins', {
get: () = > [1, 2, 3, 4, 5], }
);
Object.defineProperty(navigator, 'languages', {
get: () = > ['pt-BR', 'pt', 'en-US', 'en'], }
);
window.navigator.chrome = {
runtime: {}
};
クローンされたプロファイルが読み込まれると、ブラウザはweb.whatsapp[.]comに移動し、マルウェアは結果として得られるページの状態を観察するために最大 45 秒間待機します。チャットインターフェースが表示された場合(クローンされた IndexedDB が有効で、QR スキャンなしでセッションが再開された場合)、埋め込み WA-JS ( WPPConnect ) ライブラリを挿入し、 WPP.contact.listとWPP.chat.sendTextMessage呼び出し可能になるまで待機してから、キャンペーンディスパッチ ループを開始します。代わりにQRコードのプロンプトが表示された場合、エンジンはインジェクションを試みずに"qr_code"を返し、次の候補プロファイルを試みます。
スパム対策機能
インジェクションが成功すると、マルウェアはC2エンドポイントhttps://campanha1-api.ef971a42.workers[.]dev/api/campaignからアクティブなキャンペーンを取得し、メッセージ本文、オプションの添付ファイルURL、キャプション、およびタイミングパラメータを取得します。TCLBANKERはhttps://documents.ef971a42.workers[.]dev/fileのファイルサーバーからダウンロードされ、ディスクにドロップされることなく、ブラウザのコンテキストでFileオブジェクトとして再構築されます。
マルウェアはその後、 WPP.contact.listに電話をかけて被害者のアドレス帳を収集し、グループ、ブロードキャスト、ブラジル以外の番号をフィルタリングし、 WPP.chat.sendTextMessageとsendFileMessageを通じてメッセージの送信を開始します。マルウェアは、各バッチ処理後にC2エンドポイント/api/progressに進行状況を報告し、 /api/controlをポーリングして、オペレーターからのリモート一時停止または再送信コマンドを待機します。
エージェント2:Outlookメールボット
Outlookエージェントは、被害者がインストールしたMicrosoft Outlookアプリケーションを悪用して、被害者のメールアドレスからフィッシングメールを送信するメールスパムボットです。そのため、攻撃者が制御するインフラストラクチャから送信されるメールよりもスパムとして検出されにくくなっています。
Outlookの検出機能とCOM添付ファイル
OUTLOOK.EXEがまだ実行されていない場合、 App Pathsレジストリエントリと既知のインストールディレクトリでインストールを探し、新しいプロセスで起動します。マルウェアはその後、COM相互運用を介してプロセスにアタッチし、少なくとも1つのメールアカウントMarshal.GetActiveObject("Outlook.Application")設定されていることを確認します。
コンタクトハーベスティング
その後、マルウェアはPowerShellスクリプト%TEMP%\oc<guid>.ps1,をドロップし、別のプロセスからOutlook COM経由で連絡先を収集します。このソフトウェアは2つのソースから連絡先を収集します。まず、デフォルトの連絡先フォルダを読み込み、すべての連絡先エントリからメールアドレスと氏名を抽出します。次に、各ストアのルートフォルダを反復処理して受信トレイのようなフォルダを見つけ、受信トレイのメッセージを最新順に並べ替え、送信者のメールアドレスと名前を抽出してから、 email|name形式の.txtファイルに書き込みます。
各候補者のメールアドレスに対して、配信率を最大化するために追加のフィルタリング処理が行われます。
スパム対策機能
WhatsAppボットと同様に、このマルウェアはhttps://campanha1-api.ef971a42.workers[.]dev/api/campaignからアクティブなキャンペーンを取得し、COMオートメーションを介して被害者自身のOutlookアカウントからメールを送信します。各メールは、 outlookApp.CreateItem(0) ( MailItem ) を介して作成され、 Toの受信者、キャンペーンの件名、およびキャンペーンの内容emailMessage 、 SendUsingAccountを介して被害者の実際のアカウントを使用して送信されます。
送信の間には、エージェントはランダムな遅延を適用し、定期的にC2制御エンドポイント/api/controlをチェックして一時停止または再送信コマンドを確認し、 /api/progressに進行状況を報告します。
インフラストラクチャー
REF3076の関係者は、C2およびファイルホスティングのためにworker[.]dev Cloudflare Serverlessインフラストラクチャを活用しました。この決定により、被害者が既にCloudflareに対して抱いている信頼を引き継ぎ、必要に応じてインフラストラクチャを迅速に切り替えることが可能になります。
上記のフィッシングサイト( arquivos-omie[.]com )のボディハッシュ( 91fafaa1240676afe5c55d931261e3798797c408 )を手がかりに、武器化のために準備されている可能性のある追加のドメインを特定することができました。
| ドメイン | First Seen | 情報 | ASN(プロバイダー) |
|---|---|---|---|
| arquivos-omie[.]com | 2026年4月17日 | Squatting - ブラジル発の中小企業向けSaaS | AS 13335 (Cloudflare) |
| documentos-online[.]com | 2026年4月11日 | Generic | AS 13335 (Cloudflare) |
| afonsoferragista[.]com | 2026年4月22日 | 金物店 - B2Bの誘い文句として使われる可能性が高い | AS 13335 (Cloudflare) |
| doccompartilhe[.]com | 2026年4月15日 | 一般的な表現 - 「ドキュメントを共有しました」 | AS 13335 (Cloudflare) |
| recebamais[.]com | 2026年4月20日 | 不法占拠 - ブラジルの信用/融資仲介業 | AS 13335 (Cloudflare) |
バナータイトルの広範な変更( Portal Corporativo )の後、ブラジルのフィッシングインフラストラクチャがさらに発見されましたが、それがREF3076に直接関連しているのか、ラテンアメリカのバンキングトロイの木馬エコシステムの他のアクターに関連しているのかは不明です。特筆すべきは、あるクラスターがCloudflare pages[.]dev無料静的サイトホスティング製品を活用したことである。
C2ドメインmxtestacionamentos[.]comは以前はブラジルのホストIP 191.96.224[.]96を指していました。
昨年、このIPアドレスはREF3076 C2ドメイン、REF3076フィッシングドメイン、および以前トレンドマイクロのWater SaciキャンペーンとSORVEPOTEL/MAVERICKマルウェアに関連付けられていたドメインを同時にホストしていました( saogeraldoshiping[.]com )。
まとめ
TCLBANKERは、ブラジルの銀行トロイの木馬エコシステム全体で起こっている、より広範な成熟を反映している。かつてはより高度な脅威アクターの特徴であった技術、すなわち環境制御型ペイロード復号、直接的なシステムコール生成、WebSocketを介したリアルタイムのソーシャルエンジニアリングオーケストレーションなどが、今や汎用的な犯罪ソフトウェアに組み込まれている。参入障壁は低下し続けており、特に強力なLLMがコード生成に容易に利用できるようになったことで、その傾向は顕著になっている。
自己増殖型ワームモジュールの導入は、この分野における注目すべき変化を示すものである。このキャンペーンは、被害者のWhatsAppセッションやOutlookアカウントを乗っ取ることで、正規の通信が持つ信頼性と配信性を悪用する。これは、従来のメールゲートウェイや評判に基づく防御策では対応しきれない配信モデルである。ラテンアメリカの銀行型トロイの木馬がこうした自己拡散メカニズムを採用し続けるにつれ、組織はこれらの攻撃の規模と範囲がそれに応じて拡大することを想定しておくべきである。
デバッグログのパス、テストプロセス名、まだ構築中のフィッシングサイトなど、開発チェーン全体にわたる開発者の成果物から、REF3076は運用開始の初期段階にあることが示唆される。これはまだ構築中のキャンペーンであり、終結に向かっているわけではない。
MITRE ATT&CKによるREF3076
Elasticは、 MITRE ATT&CK フレームワークを使用して、脅威がエンタープライズネットワークに対して使用する一般的な戦術、手法、手順を文書化します。
戦術(Tactics)
戦術は、テクニックまたはサブテクニックの理由を表します。 それは敵の戦術的な目標であり、行動を実行する理由です。
手法
手法は、敵対者がアクションを実行することによって戦術的な目標を達成する方法を表します。
- Phishing: Spearphishing Attachment
- システムバイナリプロキシ実行: Msiexec
- ハイジャック実行フロー:DLLサイドローディング
- コマンドとスクリプト インタープリター: PowerShell
- コマンドおよびスクリプト インタープリター: Windows コマンド シェル
- スケジュールされたタスク/ジョブ: スケジュールされたタスク
- Deobfuscate/Decode Files or Information
- ファイルまたは情報の難読化
- デバッガー回避
- 仮想化/サンドボックス回避:システムチェック
- 仮想化/サンドボックス回避:時間ベースの回避
- 防御の障害:ツールの無効化または変更
- Native API
- プロセスインジェクション
- プロセスディスカバリー
- アプリケーションウィンドウ検出
- システム情報の検出
- System Location Discovery: System Language Discovery
- スクリーンキャプチャ
- 入力キャプチャ: キーロギング
- クリップボードデータ
- 入力キャプチャ: Webポータルキャプチャ
- ブラウザセッションハイジャック
- アプリケーション層プロトコル:Webプロトコル
- ウェブサービス
- イングレスツール転送
- メール収集: ローカルメール収集
- システムのシャットダウン/再起動
REF3076の修復
予防
- 署名なしDLLによるNTDLLメモリ保護の変更
- NTDLLライブラリが2回目にロードされました
- NTDLLメモリのアンフックの可能性
- Parallel NTDLL Loaded from Unbacked Memory
- 不審なWindowsコアモジュールの変更
- アンバッキング メモリ経由の AMSI バイパス
- SetThreadContext による AMSI バイパスの可能性
ヤラ
Elasticセキュリティは、このアクティビティを識別するためのYARAルールを作成しました。
観測
この研究では、次の観測量について議論しました。
| すぐれた監視性 | タイプ | 名前 | 参考 |
|---|---|---|---|
| 701d51b7be8b034c860bf97847bd59a87dca8481c4625328813746964995b626 | SHA-256の | screen_retriever_plugin.dll | TCLBankerローダーコンポーネント |
| 8a174aa70a4396547045aef6c69eb0259bae1706880f4375af71085eeb537059 | SHA-256の | screen_retriever_plugin.dll | TCLBankerローダーコンポーネント |
| 668f932433a24bbae89d60b24eee4a24808fc741f62c5a3043bb7c9152342f40 | SHA-256の | screen_retriever_plugin.dll | TCLBankerローダーコンポーネント |
| 63beb7372098c03baab77e0dfc8e5dca5e0a7420f382708a4df79bed2d900394 | SHA-256の | XXL_21042026-181516.zip | TCLBankerの初期ZIPファイル |
| campanha1-api.ef971a42[.]workers.dev | ドメイン名 | TCLBanker C2 | |
| mxtestacionamentos[.]com | ドメイン名 | TCLBanker C2 | |
| documents.ef971a42.workers[.]dev | ドメイン名 | TCLBankerファイルサーバー | |
| arquivos-omie[.]com | ドメイン名 | TCLBankerのフィッシングページ(開発中) | |
| documentos-online[.]com | ドメイン名 | TCLBankerのフィッシングページ(開発中) | |
| afonsoferragista[.]com | ドメイン名 | TCLBankerのフィッシングページ(開発中) | |
| doccompartilhe[.]com | ドメイン名 | TCLBankerのフィッシングページ(開発中) | |
| recebamais[.]com | ドメイン名 | TCLBankerのフィッシングページ(開発中) |