Elastic Security Labs 发现了一个新的巴西银行木马,我们正在跟踪该木马,并将其命名为 TCLBANKER,我们评估该恶意软件系列是 MAVERICK/SORVEPOTEL 系列的重大更新。该活动被追踪为 REF3076,其特点是加载器具有强大的反分析能力,部署了两个受 .NET Reactor 保护的嵌入式模块:一个全功能银行木马和一个用于自我传播的蠕虫模块。
该银行木马通过 UI Automation 监控受害者的浏览器地址栏,目标是 59 巴西银行、金融科技和加密货币域。除了常用的远程访问命令外,它最引人注目的功能是一个基于 WPF 的全屏覆盖框架,设计用于操作员驱动的社交工程。
第二个模块负责通过垃圾邮件代理进行传播,我们发现了其中的两个变种:一个是 WhatsApp 蠕虫,它劫持经过验证的浏览器会话,向受害者的联系人发送信息;另一个是 Outlook 电子邮件机器人,它通过 COM 自动化,通过受害者自己的账户发送钓鱼邮件。
通过本报告,我们提供了每个阶段的详细技术细节。
关键要点
- TCLBANKER 使用环境导向有效载荷解密;不正确的环境(如沙箱)会导致有效载荷解密失败。
- 综合看门狗子系统在整个执行过程中持续监控分析工具、调试器、仪器框架和完整性违规行为
- 该银行木马以 59 巴西银行、金融科技和加密货币域为目标,当受害者导航到受监控的网站时会激活 WebSocket C2 会话
- 基于 WPF 的全屏幕叠加框架可实现操作员驱动的社交工程,包括凭据收集、网络钓鱼等待屏幕和伪造的 Windows 更新停滞,同时隐藏屏幕捕获工具无法捕获的叠加内容。
- 传播恶意软件的蠕虫模块:WhatsApp 机器人和 Outlook 电子邮件机器人
- 所有 C2 和分发基础架构都托管在 Cloudflare Workers 上的一个账户下,并带有开发人员人工制品(调试日志路径、测试进程名称)和一个不完整的网络钓鱼页面,表明该活动在早期运行阶段就已被发现
送货
TCLBANKER 是一种巴西银行木马,它包含一个动态感染链,带有一个重型反分析加载组件,可部署两个嵌入式有效载荷(蠕虫、银行程序)。观察到的感染链在 ZIP 文件中捆绑了一个恶意 MSI 安装程序。这些 MSI 安装程序包滥用了名为Logi AI Prompt Builder 的罗技签名程序。
TCLBANKER 针对LogiAiPromptBuilder.exe 滥用 DLL 侧载,这是一款基于Flutter框架构建的合法罗技应用程序。恶意 DLLscreen_retriever_plugin.dll 会伪装成同名的合法 Flutter 插件,并在主机应用程序启动时自动加载。
MSI 安装完成后,恶意 DLL 会立即加载并从 DllMain 入口点启动。
装载机
TCLBANKER 的加载器组件功能丰富,包括反调试功能、反分析检查、字符串加密、系统语言检查、ETW 补丁和看门狗功能。虽然它有很多功能,但缺乏深度,而且参考了较早的恶意软件分析工具。目前还不完全清楚开发人员是否使用了 LLM 辅助工作流,但如果是这样的话,我们的团队也不会感到惊讶。
在开始执行时,TCLBANKER 会根据命令行中是否使用字符串 (--renderer=sw) 对齐相应的 .NET 程序集有效载荷。在主加载器函数中,它首先根据 DLL 的加载方式执行允许列表/阻止列表操作。只有当主机进程来自以下两个进程时,恶意 DLL 才会执行:
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 毫秒,恶意软件就会跳出--这会检测到沙箱或仿真框架,这些沙箱或仿真框架会挂钩 "睡眠 "以立即返回。
TCLBANKER 比较有趣的功能之一是一个枚举功能,它可以根据以下标准生成三个指纹:
- 防调试检查
- 系统磁盘信息和内存检查
- 语言检查
开发人员使用魔法常数为每个类别指定 "干净 "路径,然后对每个路径执行 XOR 来生成环境哈希值。这个环境哈希值非常重要,因为它会影响嵌入式有效载荷的下游解密。
例如,如果存在调试器,它就会产生不正确的哈希值,因此当恶意软件试图从哈希值推导出解密密钥时,有效载荷将无法正确解密,TCLBANKER 将停止执行。
防调试检查
TCLBANKER 实现了六种不同的反调试检查:
- 通过
Peb->BeingDebugged标志识别调试器 - 检查进程在调试器下启动时设置的 heap-tail/heap-free/check-heap 标志
- 利用
NtQueryInformationProcess()ProcessDebugPort - 使用
NtQueryInformationProcess()ProcessDebugObjectHandle - 通过调试寄存器检测硬件断点 (
DR0-DR3) - 使用
QueryPerformanceCounter()deltas 和RDTSC周期计数测量经过时间
系统信息检查
TCLBANKER 根据虚拟化、系统和用户信息进行以下五种不同的检查:
- 使用供应商签名检查虚拟化软件
| 管理程序 | 供应商签名 |
|---|---|
| VMware | VMwareVMware |
| VirtualBox | VBoxVBoxVBox |
| KVM | KVMKVMKVM |
| Xen | XenVMMXenVMM |
| Parallels | prl hyperv |
| QEMU/TCG | TCGTCGTCGTCG |
- 通过
GetDiskFreeSpaceExW()验证根系统驱动器 (C:\\) 至少有 64 GB - 调用
GlobalMemoryStatusEx()验证系统内存是否超过 2 GB - 通过 2 或 CPU 处理器检查
GetSystemInfo() - 检查通用沙盒/恶意软件用户名
sandbox,malware,virus,sample,john doe,currentuser
语言检查
在最后的环境指纹检查中,TCLBANKER 使用GetUserGeoID() 检索受感染机器的地理信息,根据地理 ID (0x20) 锁定巴西用户。通过GetUserDefaultLCID() 进行的第二次本地检查还可确保用户的默认语言为巴西葡萄牙语(pt-BR,LANGID 0x0416)。
经过这几组检查后,TCLBANKER 会在检测到任何情况时退出执行,或者在检测不到任何情况时,通过修补DbgUiRemoteBreakin() 生成另一个反调试检查。恶意软件将其第一个字节修补为a ret 指令,这样,任何远程侵入进程的尝试都不会起任何作用--注入的线程立即返回,目标继续运行,没有中止。
之后,恶意软件利用.rdata 部分的硬编码常量和之前计算的环境哈希值,生成 AES-256 CBC 密钥和 IV。TCLBanker 使用BCryptDecrypt() 解密嵌入的有效载荷,然后使用 LZNT1 压缩算法通过RtlDecompressBuffer 解压缩。
一旦各自的有效载荷被解密,TCLBANKER 就会通过CoInitializeEx() 初始化 COM,并使用 CLR 托管 API 在进程中加载 .NET 运行时。在启动有效载荷入口点之前,TCLBanker 会创建两个新线程:一个作为看门狗,另一个作为心跳检查监控看门狗线程。
看门狗
TCLBANKER 具有全面的看门狗功能,可针对各种分析工具,包括反汇编器、调试器、仪器产品、反病毒产品和沙盒产品。本节将概述该功能使用的各种技术:
- 调试器检查通过
PEB→BeingDebugged - 监视硬件断点
DR0/DR1/DR2/DR3 - 通过扫描每个函数的第一个 12 字节,检查 Windows 函数 (
BCryptDecrypt(),BCryptOpenAlgorithmProvider()) 是否有内联钩子 - 监测仪器工具和相关字符串 (
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 是一个银行木马病毒,是该病毒链的主要组成部分。虽然我们使用 de4dot 和 NETReactorSlayer 等开源工具无法对其进行解混淆处理,但我们使用自定义的解混淆流水线处理了 .NET Reactor 的字符串加密、控制流扁平化、IL 突变、委托代理和加密方法体 (Necrobit),成功地将这一阶段静态解混淆到了令人满意的状态。虽然这是一个新的恶意软件,但大部分代码结构仍遵循 ESET 于 2020 年发布的拉美银行木马实施蓝图。
启动时,恶意软件会执行地理围栏,要求>= 2 下列指标与巴西匹配;否则,如果不在巴西机器上,它会立即退出:
| 检查 | 实施 |
|---|---|
| 地区代码 | new 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 标记文件。在随后的运行中,它会对哈希值进行比较,以跳过多余的副本。复制完成后,它会从安装路径启动新实例并退出。
它利用 COM 与任务调度程序的互操作创建了一个名为RuntimeOptimizeService 的计划任务 (CLSID 0F87369F-A4E5-4CFC-BD3E-73E6154572DD)。该任务被配置为隐藏、已启用、无执行时间限制、允许使用电池、可用时启动,并在登录触发器 (type 9) 触发,其作用域为当前用户。它可登录TASK_CREATE_OR_UPDATE 和TASK_LOGON_SERVICE_ACCOUNT 。
建立持久性后,代理会向https://campanha1-api.ef971a42.workers[.]dev/api/installs 发送第一次运行的 POST 信标,其中包括 agentId (MachineName-UserName)、MachineName、UserName(冗余)和操作系统版本。请求使用硬编码的活动验证令牌0d21613a-2609-45fc-83ff-d0feaa0c891f 进行验证。较新的变体增加了围绕该调用的调试日志 (C:\temp\tcl-debug.txt),这是一个开发人员的人工制品,无意中暴露了磁盘上代理的存在。
自我更新
该代理实现了一个基于哈希值的自更新门,在启动管道的早期运行。它从安装目录flutter_engine.cfg 中读取本地版本哈希值(如果存在,则从传统的version.hash 文件名迁移),然后使用截断的用户代理字符串(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 从文件服务器端点documents.ef971a42.workers[.]dev/api/version 获取当前哈希值。
对响应进行解析,以获取"hash" key。如果远程哈希值与本地哈希值匹配,则继续正常执行。首次安装时,远程哈希值会写入磁盘,执行时不会更新。
当检测到哈希值不匹配时,代理会将更新有效载荷作为 MSI 从documents.ef971a42.workers[.]dev/api/update 下载到%TEMP%\update_{8hexchars}.msi ,并使用承载器令牌b7ba9e80-0d04-4d9e-b217-c8b3cce335a2 进行验证。
下载将根据 100KB 的最小大小进行验证,以确保正确性。然后,该代理会在%TEMP% 中编写一个自动删除批脚本,该脚本会轮询任务列表,直到当前进程退出,执行msiexec /i /qn REINSTALLMODE=amus 进行静默安装,然后自动删除。在代理终止之前,批处理文件会通过一个隐藏的cmd.exe 进程启动,将执行工作移交给更新后的有效载荷。
浏览器 URL 监控和 C2 会话初始化
恶意软件代理每秒都会调用浏览器 URL 监控函数,通过用户界面自动化读取前台浏览器的地址栏。它调用GetForegroundWindow ,解析所属进程,根据 Chrome、Firefox、Microsoft Edge、Brave、Opera 和 Vivaldi 检查进程名称,然后使用AutomationElement.FromHandle -> FindFirst(Descendants, ControlType.Edit) -> ValuePattern.Current.Value 提取 URL,与 Stack Overflow 的实现类似。
提取的 URL 会与二进制文件中嵌入的目标银行固定列表进行匹配,通过 XOR 与 16 字节密钥和 base64 编码进行编码。
此GitHub Gist包含 59 目标域列表,其中包括巴西银行、金融技术平台和加密货币交易所,并按每个解密域附加的目标 ID 进行了分组。
匹配成功后,域目标 ID 将被传递给下一个状态,该状态通过建立与wss://mxtestacionamentos[.]com/ws 的 WebSocket 连接来初始化正式的 C2 通信。OnConnect 处理程序启动,发送包含代理 ID(运行时的随机 GUID)、MachineName、UserName、机器信息、时间戳、域目标 ID(以便 C2 知道受害者打开了哪个网站)和签名的注册数据包。
为了生成握手签名,使用 HMAC-SHA256 对受害者标识符(代理 ID、MachineName、UserName、OSVersion、时间戳)进行签名,使用活动 GUID70e4f943-e323-4484-97d7-35401bf6812c 作为密钥。
然后,服务器响应注册确认,正式开始会话,并进入命令调度循环。在会话启动时,任务管理器杀手每 500 毫秒触发一次,以防止受害者检查或终止代理进程。
C2 命令表
下面的操作码表对功能进行了概述:
| 操作码 | 用途 |
|---|---|
| 2 | 注册 ACK,启动任务管理器杀手 |
| 4 | 优雅地断开 WebSocket 连接 |
| 5 | 自杀:杀死所有兄弟进程并退出 |
| 6 | 强制重启 (shutdown.exe /r /t 0 /f) |
| 7 | 自杀-卸载:杀死除自身(兄弟姐妹)外所有具有相同主机二进制名称的进程→卸载→退出 |
| 16 | 屏幕截图 |
| 17 | 开始串流屏幕 |
| 18 | 停止串流屏幕 |
| 19 | 设置屏幕截图质量(1-100) |
| 20 | 列举监视器 |
| 32 | 鼠标移动(X、Y、MonitorIndex) |
| 33 | 鼠标点击覆盖层:解析{X,Y,Button,MonitorIndex} → 转换为绝对桌面坐标 → 查找覆盖该点的植入式自身覆盖窗口 → 在该像素点的覆盖层上打一个 2x2 区域孔 →SetCursorPos +SendInput 鼠标下移/上移(落在覆盖层下方的任何真实桌面内容上)。 |
| 34 | 鼠标滚动 (Delta,SendInput) |
| 35 | 按键轻触 (KeyCode,SendInput) |
| 37 | 向下按键 (KeyCode,SendInput) |
| 38 | 键入 (KeyCode,SendInput) |
| 39 | 启动键盘记录程序(WH_KEYBOARD_LL 钩子) |
| 40 | 刷新键盘记录程序,将信息外泄至 C2 |
| 41 | 剪贴板劫持 (Clipboard.SetText) |
| 48 | 文件系统目录列表 |
| 65 | 获取运行进程信息 |
| 67 | 执行 Shell 命令 (cmd.exe /c) |
| 80 | 枚举所有可见窗口 |
| 81 | 窗口管理器杀死窗口进程/最小化窗口/还原窗口/将窗口移至前台/关闭窗口/将窗口移至其他显示器 |
| 83 | 显示停滞叠加:进度步骤或伪造的 Windows 更新屏幕 |
| 84 | 拆卸叠加 |
| 85 | 切换屏幕捕捉免疫。启用/禁用所有叠加窗口上的WDA_EXCLUDEFROMCAPTURE ,以防止屏幕共享/截图。 |
| 86 | 刷新叠加内容 |
| 87 | 显示剪切叠加:在可见区域剪切的叠加内插入外部窗口 |
| 96 | 显示证书提示叠加 |
社会工程用户界面框架
银行木马更有趣的功能是一个基于 WPF的全屏叠加子系统,它能在活动的 C2 会话期间协调以银行为主题的欺诈流。
叠加生命周期
覆盖管理器会在每个显示器上生成一个全屏 WPF 窗口。窗口被配置为无边框、置顶、从任务栏隐藏 (WindowStyle.None,Topmost = true,ShowInTaskbar = false),并带有自定义的Closing 句柄,在操作员通过覆盖拆卸命令翻转内部标志之前,该句柄拒绝被解除,从而防止窗口被关闭。
启动时,管理器会通过CopyFromScreen 捕获每个显示器的 PNG 屏幕截图,作为覆盖背景,创建 "冻结桌面 "外观。根据当前激活的覆盖层,受害者会看到覆盖层后面的真实桌面环境。
500ms 定时器会通过SetWindowPos 不断重复应用HWND_TOPMOST ,以阻止任何试图浮出覆盖层的窗口。
此外,通过WDA_EXCLUDEFROMCAPTURE 调用SetWindowDisplayAffinity 的防抓取功能,可使任何屏幕抓取工具都无法看到覆盖层,从而使操作员能够通过屏幕截图和屏幕流命令看到自己的覆盖层。
输入阻断器
主监视器上安装了两个挂钩:WH_KEYBOARD_LL 和WH_MOUSE_LL 。这两个钩子都会检查各自的注入标志(键盘为LLKHF_INJECTED ,鼠标为LLMHF_INJECTED ),允许操作员远程命令通过SendInput 注入的输入不受影响地通过。键盘钩子会吞掉 Tab、Escape、Alt+F4、Win 键、PrintScreen、Ctrl、Alt 和所有导航键;鼠标钩子会阻止右键单击、中键单击和滚动,但允许左键单击和移动,因此受害者仍可与覆盖提示进行交互。
社交工程用户界面构建器
五个可互换的内容渲染器可插入叠加框架:
凭证提示:支持三种输入模式,根据操作员的请求参数进行选择。
- 电话模式应用实时巴西格式屏蔽((##) ####-#### 用于 10 位数固定电话,(##) #####-#### 用于 11 位数移动电话),最多 11 位数。
- 虚拟键盘模式显示屏幕上的数字键盘(0-9 按钮加上"limpar"/清除),以子弹字符显示输入内容,模拟 PIN 输入。
- 默认模式接受纯文本,最大长度可配置。
所有模式的输入都要通过质量验证器,该验证器通过算法拒绝相同数字序列 (000000) 和升序/降序运行 (123456,654321) ,以防止受害者输入乱码。
提交操作会将捕获的值发送到 C2。
网络钓鱼等待屏幕:受害者在凭证提示中提交电话号码后触发。显示"Estamos entrando em contato" ("We are getting in touch"),中央图像有 "呼吸 "动画,三个点有交错的不透明度动画(300ms offset per dot),产生"connecting" 的视觉效果。然后,接线员或同伙就可以冒充银行保安人员拨打受害者的真实电话。
进度步骤:完全由操作员模板化的滞留屏幕,显示带有随机动画的假处理步骤列表。步骤持续时间随机确定,总计约为 15 分钟。定时器按顺序推进每个步骤,直观地标记已完成的步骤,突出显示当前步骤,并调暗其余步骤。当所有步骤完成后,序列会以新的随机时间重置到较早的位置并继续。
伪造 Windows 更新:模仿 Windows 10/11 更新-重启屏幕的另一种停滞屏幕。渲染#0078D7 (Windows 重音蓝)纯色背景,背景上有一个环形排列的五椭圆旋转指示器。在随机选择的 50-81 秒时间间隔内,百分比读数会随机跳动 25-35% ,以模拟真实 Windows 更新的不规则进度行为。默认字幕:"Trabalhando em atualizacoes" ("Working on updates").
剪切叠加:在全屏覆盖上切一个矩形孔,露出底层应用程序窗口。操作员通过操作码 87 指定孔的尺寸,叠加管理器在其中用透明边框占位符构建主题卡,计算其布局后的屏幕坐标,并使用CreateRectRgn + CombineRgn(RGN_DIFF) + SetWindowRgn 切割匹配的区域孔。目标窗口重新定位到孔洞下方。其结果是在覆盖层中设置了一个真实的应用程序窗口,受害者在与实际应用程序交互时,周围的覆盖层会提供欺骗性的上下文。
蠕虫模块
加载器调用的第二个模块是Tcl.WppBot ,该模块旨在大规模传播垃圾邮件和网络钓鱼信息,以分发 TCLBANKER。从两台不同的装载机上回收并分析了两种不同类型的制剂:
- 可劫持浏览器会话的 WhatsApp 蠕虫病毒
- 通过 COM 互操作滥用 Microsoft Outlook 的 Outlook 电子邮件机器人
Tcl.WppBot 也受 .NET Reactor 保护,其版本与用于保护Tcl.Agent 的版本相同,因此我们也设法在此阶段对有效载荷进行静态解混淆。
两个代理共享相同的 C2 后端、身份验证凭证和运行基础设施。C2 URL 和 API 密钥在启动时使用硬编码密钥进行 XOR 解密。
- C2 URL:
campanha1-api.ef971a42.workers[.]dev(Cloudflare 工作者应用程序) - 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 还托管了有效载荷分发 CDN(配置对象中fileUrl 的域)documents.ef971a42.workers[.]dev 。它可通过/file 端点访问,目前提供的压缩文件包含被 TCLBANKER 木马化的 LogiAI Prompt Builder MSI。这种基础设施决策使运营商能够快速重新部署基础设施,而无需维护专用服务器。
截至本文撰写之时,上述配置中标识的钓鱼域名arquivos-omie[.]com (创建于 2026-04-15)尚未处于可运行状态(欢迎使用)!该门户网站目前正在进行定期维护。请稍后再试)。战役可能处于早期作战阶段,也可能处于执行任务的阶段。该域还被命名为冒充巴西一个流行的企业资源规划(ERP)套件。
代理 1: WhatsApp 机器人
WhatsApp 代理会悄无声息地接管受害者已验证的 WhatsApp Web 会话,向巴西联系人发送垃圾邮件并分发 TCLBANKER。
会话劫持
恶意软件首先会发现目标系统中基于 Chromium 的浏览器,然后扫描App Paths 注册表项和 Chrome、Edge、Brave、Opera 和 Vivaldi 的常用安装目录。然后,它会浏览每个浏览器的用户配置文件(如"Default、" " Profile 1、" 等),寻找 WhatsApp Web 会话活动的证据。如果配置文件的 IndexedDB 存储包含 WhatsApp Web LevelDB 目录(<profile_dir>/IndexedDB/https_web.whatsapp[.]com_0.indexeddb.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_code" 而不尝试注入,然后尝试下一个候选配置文件。
垃圾邮件功能
一旦注入成功,恶意软件就会从 C2 端点https://campanha1-api.ef971a42.workers[.]dev/api/campaign 获取活动活动,并提供信息正文、可选附件 URL、标题和定时参数。然后,TCLBANKER 将从文件服务器下载(https://documents.ef971a42.workers[.]dev/file ),并在浏览器上下文中作为文件对象重建,而不会丢弃到磁盘中。
然后,恶意软件会调用WPP.contact.list 来获取受害者的地址簿,过滤掉群组、广播和非巴西号码,并开始通过WPP.chat.sendTextMessage 和sendFileMessage 发送信息。恶意软件在每次批处理后都会向 C2 端点/api/progress 报告进展情况,并轮询/api/control 以获取操作员的远程暂停或重新发送命令。
代理 2:Outlook 电子邮件机器人
Outlook 代理是一种电子邮件垃圾邮件机器人,它滥用受害者安装的 Microsoft Outlook 应用程序,从受害者的电子邮件地址发送网络钓鱼电子邮件,使其比从攻击者控制的基础设施发送的电子邮件更难被检测为垃圾邮件。
Outlook Discovery& COM 附件
如果OUTLOOK.EXE 尚未运行,它会尝试在App Paths 注册表项和已知安装目录中查找安装位置,并在一个新进程中启动它。然后,恶意软件通过 COM interop: Marshal.GetActiveObject("Outlook.Application"),并验证它是否至少配置了一个电子邮件账户。
联系收获
然后,恶意软件会投放一个 PowerShell 脚本%TEMP%\oc<guid>.ps1, ,通过 Outlook COM 从一个单独的进程中获取联系人。它从两个来源获取联系人信息:首先,它会读取默认联系人文件夹中的所有联系人条目,从每个联系人条目中提取电子邮件地址和全名。其次,它会遍历每个商店的根文件夹,找到类似收件箱的文件夹,按最新时间对收件箱邮件进行排序,并提取发件人电子邮件地址和姓名,然后以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 行为者利用worker[.]dev Cloudflare Serverless 基础设施进行 C2 和文件托管。这一决定使他们能够继承受害者可能已经对 Cloudflare 产生的信任,并根据需要快速轮换基础设施。
通过上述网络钓鱼网站(arquivos-omie[.]com )的正文哈希值(91fafaa1240676afe5c55d931261e3798797c408 ),我们能够识别出更多可能准备用于武器化的域:
| 域 | First Seen | 信息 | ASN (Providor) |
|---|---|---|---|
| arquivos-omie[.]com | 2026-04-17 | Squatting - 面向中小企业的巴西 SaaS | AS 13335 (Cloudflare) |
| documentos-online[.]com | 2026-04-11 | Generic | AS 13335 (Cloudflare) |
| afonsoferragista[.]com | 2026-04-22 | 五金店 - 可能用于 B2B 诱饵 | AS 13335 (Cloudflare) |
| doccompartilhe[.]com | 2026-04-15 | 通用 - "共享文件 | AS 13335 (Cloudflare) |
| recebamais[.]com | 2026-04-20 | 蹲点 - 巴西信贷/贷款经纪公司 | AS 13335 (Cloudflare) |
在横幅标题(Portal Corporativo )中的一个更广泛的支点之后,发现了更多的巴西网络钓鱼基础设施,但目前还不清楚它是与 REF3076 直接相关,还是与拉丁美洲银行木马生态系统中的其他参与者直接相关。值得注意的是,一个集群利用 Cloudflarepages[.]dev 免费静态网站托管产品。
C2 域名mxtestacionamentos[.]com 以前指向巴西托管的 IP191.96.224[.]96 。
去年,该 IP 同时托管了一个 REF3076 C2 域、一个 REF3076 网络钓鱼域,以及 TrendMicro () 以前 与 Water Saci 活动 和 SORVEPOTEL/MAVERICK 恶意软件 相关的saogeraldoshiping[.]com 域。
结论
TCLBANKER 反映了巴西银行木马生态系统正在走向更广泛的成熟。曾经是更复杂的威胁行为者标志的技术:环境门控有效载荷解密、直接生成系统调用、通过 WebSocket 进行实时社会工程协调,现在都被打包到了商品犯罪软件中。入门门槛不断降低,尤其是当强大的 LLM 可随时用于代码生成时。
自传播蠕虫模块的加入标志着这一领域发生了显著变化。该活动通过劫持受害者的 WhatsApp 会话和 Outlook 账户,继承合法通信的信任和可送达性。传统的电子邮件网关和基于信誉的防御系统无法捕捉到这种分发模式。随着拉美银行木马继续采用这些自我传播机制,各组织应预期这些活动的数量和范围会相应扩大。
整个链条中的开发人员工具,包括调试日志路径、测试进程名称和一个仍在构建中的网络钓鱼网站,都表明 REF3076 处于早期运行阶段。这是一场仍在进行中的运动,而不是结束。
REF3076 通过 MITRE ATT&CK
Elastic 使用MITRE ATT&CK框架来记录威胁针对企业网络使用的常见策略、技术和程序。
战术
策略代表了技术或子技术的原因。 这是对手的战术目标:采取行动的原因。
技术
技术代表对手如何通过采取行动来实现战术目标。
- Phishing: Spearphishing Attachment
- 系统二进制代理执行:Msiexec
- 劫持执行流程:DLL 侧加载
- 命令和脚本解释器:PowerShell
- 命令和脚本解释器:Windows 命令 Shell
- 计划任务/作业:计划任务
- Deobfuscate/Decode Files or Information
- 混淆文件或信息
- 调试器规避
- 虚拟化/沙盒规避:系统检查
- 虚拟化/沙盒逃避:基于时间的逃避
- 削弱防御能力:禁用或修改工具
- Native API
- 进程注入
- 流程发现
- 应用程序窗口发现
- 系统信息发现
- System Location Discovery: System Language Discovery
- 屏幕截图
- 输入捕获:键盘记录
- 剪贴板数据
- 输入捕捉:网络门户采集
- 浏览器会话劫持
- 应用层协议:网络协议
- 网络服务
- Ingress 工具转移
- 电子邮件收集:本地电子邮件收集
- 系统关闭/重启
补救 REF3076
预防
- 通过无符号 DLL 更改 NTDLL 内存保护
- 第二次加载 NTDLL 库
- 潜在的 NTDLL 内存脱钩问题
- Parallel NTDLL Loaded from Unbacked Memory
- 可疑的 Windows 核心模块更改
- 通过无备份内存绕过 AMSI
- 通过 SetThreadContext 绕过 AMSI 的可能性
雅拉
Elastic Security 已创建 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 网络钓鱼页面(开发中) |