文章总结: 俄罗斯黑客组织开发的未公开远程控制工具包CTRL整合了凭证钓鱼、键盘记录、RDP劫持和FRP反向隧道技术,通过恶意LNK文件传播。该工具包采用多层加密加载机制,利用注册表存储payload并实现无文件攻击,其C2基础设施位于德国法兰克福且未修复已知SSH漏洞。分析显示该工具专用于定向攻击,尚未出现在公开威胁情报平台。 综合评分: 87 文章分类: 恶意软件,渗透测试,漏洞分析,威胁情报,红队
俄罗斯“CTRL”远控工具包分析
原创
censys censys
暗镜
2026年4月2日 06:00 北京
一个名为“CTRL”的、此前未被记录的、源自俄罗斯的远程访问工具包已被监测到,该工具包将凭证钓鱼、键盘记录、RDP 劫持和基于 FRP 的反向隧道技术整合到一个统一的后渗透攻击包中,并通过一个恶意 LNK 文件进行分发。该工具包位于 hui228[.]ru 的 C2 中继基础设施仍在运行,该基础设施位于一个最近注册的 ASN(2025 年 2 月)上,并且被发现未针对已知的 SSH 漏洞进行修补。
截至撰写本报告时,VirusTotal、Hybrid Analysis 和公共威胁情报中仍未发现任何相关痕迹,这表明该工具包是私人开发的,尚未广泛传播。
介绍
“CTRL”是一款由一名俄语攻击者开发的定制版.NET远程访问工具包,并通过伪装成私钥文件夹的恶意LNK文件进行传播。该工具包是通过Censys开放目录扫描发现的,扫描结果显示hui228.ru:82/hosted/目录下存在一个暴露的有效载荷托管目录,其中包含三个.NET可执行文件。这些可执行文件共同实现了加密有效载荷加载、通过精心设计的Windows Hello钓鱼界面窃取凭据、键盘记录、RDP会话劫持以及通过FRP进行反向代理隧道传输等功能。该工具包的FRP中继基础设施已在两个IP地址上被发现:(活跃于2026年1月至2月)和(DNS于2026年2月27日切换至该地址),这两个IP地址均位于Partner Hosting LTD位于法兰克福的基础设施内。这些二进制文件或基础设施均未出现在任何公开的威胁情报源中,这使得该工具包成为一个此前未记录的工具包,专门用于对单个目标进行持久远程访问、凭证窃取和键盘操作。
背景
CTRL 工具包于 2026 年 2 月从 146.19.213[.]155 的一个开放目录中恢复。此次调查源于 Censys 对 LNK 文件的开放目录扫描,扫描结果显示,一个托管在独立服务器上的 LNK 文件指向 hui228[.]ru 以下载有效载荷。该域名使用 FreeDNS (afraid.org) 进行域名解析——FreeDNS 是一种免费的动态 DNS 服务,深受希望避免留下注册商痕迹的运营商欢迎——其服务器托管于 Partner Hosting LTD (AS215826),该公司于 2025 年 2 月在英国注册,服务器位于德国法兰克福。
托管 LNK 加载器的目录
该工具包包含三个 .NET 可执行文件,它们共享同一个开发环境(C:\Users\Admin\repos\repos\),目标框架为 .NET Framework 4.7.2,并使用 AES-256-CBC 加密进行嵌入式有效载荷保护。PDB 路径、FRP 包装器中的俄语错误字符串(“Не найдена функция GoMain”)以及 .ru 域名共同指向一位讲俄语的开发者。这些二进制文件的版权日期为 2025 年,并支持 Windows 24H2 版本,表明其开发仍在进行中。所有 PE 时间戳均被故意篡改(设置为 2044 年至 2103 年之间的日期),以阻碍时间线分析。
该恶意软件利用名为“私钥#kfxm7p9q_yek.lnk”的LNK文件进行传播,该文件伪装成Windows文件夹图标,诱骗受害者双击打开。LNK文件的元数据时间戳被清零,并包含描述信息“Polycue”,这可能是一个项目代号。创建者的Windows SID(S-1-5-21-445479930-4070444189-1846254649-1001)嵌入在LNK文件的元数据中。
LNK 属性显示“Polycue”
攻击能力
凭证窃取
一个完整的 WPF 应用程序,模拟 Windows Hello PIN 码提示,包含受害者的真实显示名称、帐户头像、主题检测以及从正版 Windows 资源中提取的 Lottie 动画。底层键盘钩子会阻止 Alt+Tab、Alt+F4 和 Win 键,以防止用户退出。捕获的 PIN 码会通过 UI 自动化流程与真实的 Windows 凭证提示进行验证,验证通过后才会被接受。
键盘记录:持续后台按键捕获并写入 C:\Temp\keylog.txt。
远程桌面访问:自动修补 termsrv.dll 并安装 RDP Wrapper,以启用无限并发 RDP 会话,并自动应用 Defender 排除项。
反向代理隧道:FRP v0.65.0(编译为 Go DLL,通过手动 PE 映射加载到内存中)通过运营商的 FRP 服务器为 RDP 和原始 TCP shell 建立反向隧道。
持久性和防溯源
有效载荷以二进制注册表值的形式存储,伪装成资源管理器设置,并通过运行编码 PowerShell 的计划任务在启动时加载。通过 fodhelper.exe 注册表劫持绕过 UAC。隐藏的后门用户帐户被添加到管理员和远程桌面用户组。
浏览器通知欺骗:模仿 Edge、Chrome、Opera、Brave、Vivaldi、Yandex 和其他基于 Chromium 的浏览器的 Toast 通知,以进行社会工程攻击,获取更多凭据。
技术特性
攻击链分析
攻击链分为六个阶段。该设计采用分层结构:每个阶段都会对下一个阶段进行解码、解密或解压缩,关键基础设施地址 (hui228[.]ru) 只有在阶段执行程序在内存中运行时才会出现。为了方便起见,下文提供了包含各个阶段的解包、反混淆、解密和分析过程的概要信息。
第一阶段:LNK Dropper
入口点是一个名为 Private Key#kfxm7p9q_yek.lnk 的 60 KB Windows 快捷方式文件。它使用 SHELL32.dll 的图标索引 3(文件夹图标),因此在资源管理器中显示为目录,而不是可执行文件。该 LNK 文件指向 C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe,并以 SW_SHOWMINNOACTIVE 窗口样式(最小化,无焦点)运行,因此受害者看不到任何控制台窗口。所有内部时间戳(创建、访问、修改)均被清零以防止取证日期推断,并且描述字段包含字符串“Polycue”。
LNK 文件中嵌入的命令行参数如下:
powershell.exe -NoProfile -WindowStyle Hidden -Command “$b=’<~30,000 char base64 blob>‘; iex([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($b)))”
整个有效载荷链都编码在 LNK 的命令行参数字段中,使得快捷方式文件是自包含的;初始代码执行无需外部下载。
第二阶段:PowerShell 加载器(3层)
base64 编码的数据块在执行 .NET 阶段程序之前,需要经过三层解码:
第 1 层(base64 解码后的明文 PowerShell):擦除受害者的启动文件夹(%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\*)以消除竞争持久性,然后将第二个 base64 blob 传递给带有 -nop -Sta 的新 PowerShell 进程。
第2层(第二次 base64 解码):包含压缩后的暂存器二进制文件和基于注册表的加载逻辑。变量名已随机化(例如,$4pX9Fl2uqGjR、$J16wnFD5Q33hjl、$ov31va9OSp8tj),以避免静态模式匹配。注册表路径中使用的字符串字面量使用字符算术混淆进行拆分和重组:
“o” is computed as: (297 – 93) – (127 – 34) = 111 = ‘o’
‘SOFTWARE\Microsoft\Wind’ + Char)) + ‘ws\CurrentVersion\Explorer’
该层按顺序执行三个操作:
- ## 解压缩:解码第三个 base64 blob(原始 stager 字节),通过 System.IO.Compression.DeflateStream 将其解压缩 28 KB 的 .NET 程序集。
- ## 写入注册表:将解压缩后的二进制文件作为 REG_BINARY 值存储在 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellStateVersion1 — 选择此路径和值名称是为了与合法的 Explorer shell 设置融合。
- ## 从注册表执行:通过注册表值上的 [System.Reflection.Assembly]::Load() 在内存中加载并运行暂存器,并通过 Invoke($null, $null) 传递入口点。
- 暂存器不会以独立文件的形式写入磁盘。它仅以压缩 blob 的形式存在于 LNK 的命令行参数中,然后作为二进制注册表值存在,最后作为内存中的 .NET 程序集存在。
第三阶段:Stager(“独立程序”,28 KB .NET)
暂存器(命名空间 StandaloneProgram)是协调器。它使用 WindowsIdentity 检查当前完整性级别,通过 OpenProcessToken/GetTokenInformation 检查令牌提升,并检查完整性级别 SID RID(SYSTEM = 0x4000,High = 0x3000):
完整性:触发 UAC 绕过,然后退出。绕过程序会将一个 VBS 启动器写入 C:\Temp\win_update.vbs,并将 HKCU\Software\Classes\ms-settings\Shell\Open\command 设置为调用 wlrmdr.exe 并指向该 VBS 脚本,然后通过 explorer.exe 启动 fodhelper.exe。wlrmdr.exe 是一个已签名的 Microsoft 二进制文件(Windows 启动器资源管理器诊断程序),此处用作 LOLBin。通过它路由执行而不是直接启动 VBS 脚本,可以避免 EDR 检测,从而防止未签名进程生成脚本解释器而被标记。由于 fodhelper.exe 会自动提升权限并检查 ms-settings 中是否存在其处理程序,因此该程序会在高完整性下重新执行自身。绕过程序执行后会清理所有注册表项和 VBS 文件。
系统完整性:使用互斥锁(Global\SystemStagerMutex 或 Global\AdminStagerMutex)防止重复实例,然后执行完整安装:
第四阶段:ctrl.exe(AES 加载器 + 双模式 C2 代理)
外部二进制文件是一个最小化的 .NET 加载器(PDB:C:\Users\Admin\repos\repos\ControlCenter\Loader\obj\Debug\net472\LoaderV2.pdb),以调试配置编译,包含完整的符号信息。它读取嵌入资源 Loader.payload.exe.encrypted,使用 AES-256-CBC 加密(硬编码密钥 RGH2uoFyojSArtXQLh3tObdGA9nfv41i6+XUn0MJgyc=,IV 8pgYdEWqV41Pg/qBM73piA==,PKCS7 填充)对其进行解密,并通过 Assembly.Load() 调用解密后的程序集入口点。解密后的有效载荷是“ctrl Management Platform v2.0.0”(21 MB,包含 SkiaSharp、LottieSharp 和 Costura.Fody 5.7.0 依赖项)。“CTRL”的名称由此而来。
硬编码密钥和 IV
解密后的 C2 代理程序根据命令行参数既可以作为服务器也可以作为客户端,并通过 Windows 命名管道 (ctrlPipe) 进行通信:
服务器模式
(默认,或使用 -debug/–debug 参数):在 ctrlPipe 上启动一个 NamedPipeServerStream,注册所有命令处理程序,并启动后台键盘记录器。在调试模式下,它会分配一个可见的控制台窗口并输出诊断消息([Program] 调试模式已启用。控制台已分配。,[PipeServer] 正在等待客户端连接…,[CommandProcessor] 正在执行自定义命令:…)。在生产环境中,它以无头模式运行。
客户端模式
(ctrl.exe 客户端):分配一个控制台,显示 ASCII 横幅(“ctrl 管理平台 / 版本 2.0.0 (管道)”),连接到 ctrlPipe 命名管道,并显示交互式 > 提示符。某些服务器响应会触发客户端的本地操作:SHADOW_REQUEST:: 在本地启动 mstsc /shadow: /noconsentprompt [/control],COPY_REQUEST:: 通过 Win32_ShadowCopy WMI 启动卷影复制,然后从 VSS 快照执行 robocopy /E /COPYALL。
直接命令模式
(ctrl.exe <命令>):连接到管道,将参数字符串作为单个命令发送,打印响应,然后退出。此模式支持脚本编写和一次性操作。
任何与已注册命令(info、help、echo、toast、logs、shadow、stealuser、copy)不匹配的输入都会直接传递给 powershell.exe -NoProfile -Command 作为兜底命令。帮助输出甚至记录了这一点:[PowerShell] 任何其他命令都将以 PS 身份执行。
双模设计意味着操作员只需在目标主机上部署一次 ctrl.exe(通过预置服务器),然后通过 FRP 隧道 RDP 会话运行 ctrl.exe 客户端与之交互。命名管道架构将所有 C2 命令流量限制在目标主机本地——除了 RDP 会话本身之外,没有任何流量会经过网络。
CommandProcessor 中注册的完整命令集:
| | | |
| — | — | — |
| 命令 | 句法 | 执行 |
| 信息 | 信息 | 返回平台版本字符串、当前用户名(Environment.UserName)和机器名称(Environment.MachineName)。 |
| 帮助 | 帮助 | 以 ASCII 格式打印命令参考列表,列出所有命令和用法示例。 |
| 回声 | echo <文本> | 原样返回参数字符串;可能用于连接性测试。 |
| 日志 | 日志 | 读取并返回 C:\Temp\keylog.txt 的全部内容;如果文件不存在,则返回“未找到日志”。 |
| 窃取者 | 窃取者 | 在新的 STA 线程上启动 WPF 凭据收集器;从 ctrl.StealUser 命名空间启动 App 和 MainWindow;立即返回“StealUser 窗口已在服务器上启动”。 |
| 阴影 | 阴影 [控制] | 调用 WTSGetActiveConsoleSessionId() 获取活动会话 ID,并向客户端返回 SHADOW_REQUEST:
该键盘记录器作为后台服务运行,独立于命令行界面。它会安装一个底层键盘钩子(通过 SetWindowsHookEx 函数获取 WH_KEYBOARD_LL),跟踪当前活动窗口的标题(使用 GetForegroundWindow 和 GetWindowText 函数),并将按键记录到 C:\Temp\keylog.txt 文件中,记录中包含时间戳和窗口上下文信息(例如,[2026-02-25 14:30:15] Session in ‘Google Chrome’)。它能够处理 Shift 键、Caps Lock 键,并映射所有标准的美国键盘符号。按下退格键时,它会从缓冲区中删除最后一个字符,而不是记录 [BACKSPACE],从而使输出能够被读取为受害者想要输入的文本。
第五阶段:FRPWrapper.exe(带内存 PE 映射的加密 FRP)
FRP 封装器(PDB:C:\Users\Admin\repos\repos\FRPWrapper\obj\Release\FRPWrapper.pdb)使用单独的 AES-256-CBC 密钥(LNKjRZf7e4SXrtUFImcfl25Hdo6jrw4GlIyiKM2Pj0k=,IV c9LmVM+bs4q5KfuH2sLuZA==)解密其嵌入的资源 FRPWrapper.myapp.dll.encrypted。解密后的有效载荷是一个原生 Go DLL(FRP v0.65.0,由 fatedier/frp 编译)。
由于 .NET 的 Assembly.Load() 无法加载本机 DLL,因此该包装器包含一个完整的手动 PE 映射器(DLLFromMemory 类),该映射器完全在用户模式内存中运行:
- 解析 PE 头部(DOS、NT、可选、节头部)
- 通过 VirtualAlloc 在首选映像基址分配内存
- 复制部分内容并正确对齐
- 如果首选基地不可用,则执行基地搬迁。
- 解析并构建导入表(加载依赖的 DLL,解析函数地址)
- 设置段内存保护(读/写/执行)
- 执行 TLS 回调
- 调用 DllMain 并附加 DLL_PROCESS_ATTACH 参数
- 通过遍历 PE 导出表来解析导出的 GoMain 函数
- 调用 GoMain 函数,参数为 -c C:\ProgramData\frp\frpc.toml
这是恶意软件开发者经常利用的一种已知技术。(例如:://github.com/schellingb/DLLFromMemory-net )
俄语错误字符串贯穿始终:“Не найдена функция GoMain”(未找到 GoMain 函数)、“Ошибка:”(错误:)。
第六阶段:RDPWrapper.exe(自动启用远程桌面协议)
将嵌入的 DLL 和工具提取到 C:\Program Files\RDP Wrapper\ 目录,为该目录添加 Defender 排除项,通过 takeown /f 和 icacls /grant 获取 termsrv.dll 的所有权,对其进行修补以移除会话限制(针对 Windows 24H2 使用特定模式),并配置注册表以实现无限制的并发 RDP:fDenyTSConnections = 0,fSingleSessionPerUser = 0,MaxInstanceCount = 99999,UserAuthentication = 1,Shadow = 2。尽管包含 PBKDF2 密钥派生代码(密码 = “RdpWrapper”,100,000 次迭代,SHA256),但加密是无效的——嵌入的资源无需解密即可提取。
CTRL 客户端
info 命令的结果
Windows Toast 通知选项
Chrome 弹出式通知
边缘弹出通知
hui228[.]ru 上的控制台疑似受密码保护
IOC
网络指标:
hui228[.]ru / 194.33.61[.]36 — 有效载荷托管(端口 82)和 FRP 中继(端口 7000)
FRP 身份验证令牌:ADAD
FRP代理名称包含受害者用户名(例如,rdp、ps)
在受害者端口 5267 上监听 TCP shell
没有直接的C2协议——所有操作员交互都通过FRP反向隧道传输到RDP会话。
主机指标:
有效载荷存储在注册表 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ 下的 ShellStateVersion1、IconSizeVersion1 和 IconUnderlineVersion1 值中。
计划任务:DriverSvcTask、NetTcpSvc、TermSvcHost、WindowsHealthMonitor
隐藏用户帐户(Administrator、Admin 或 Windows),密码为 ADAD
命名管道:ctrlPipe
文件:C:\ProgramData\SystemTools\ctrl.exe、C:\ProgramData\frp\frpc.toml、C:\Temp\keylog.txt
TLS指示器:
端口 908 上的自签名证书,CN=DESKTOP-GI428R8 (SHA256: 5d009f6f46979fbc170ede90fca15f945d6dae5286221cca77fa26223a5fe931)
行动设计
该工具包展现了精心设计的运行安全性。三个托管二进制文件均不包含硬编码的 C2 地址。FRP 服务器地址和身份验证令牌仅存在于 C:\ProgramData\frp\frpc.toml 文件中,该文件由嵌入在 LNK 投放器中的暂存器在运行时写入。如果没有 LNK 文件或受害者机器的取证镜像,就无法将托管的可执行文件与操作者的基础设施关联起来。所有数据外泄均通过 RDP 经由 FRP 隧道进行——操作者连接到受害者的桌面,并通过 ctrl 命名管道读取键盘记录数据。与传统的 C2 信标模式相比,这种架构留下的网络取证痕迹极少。
Censys ARC 透视图
主查询:host.ip: 194.33.61[.]36
Censys 检测到 194.33.61[.]36 运行三项服务:SSH(OpenSSH 9.6p1,端口 22)、HTTP(端口 82,根目录返回 404)以及 FRP 服务器(端口 7000),Censys 将其识别为 FRPS 协议。在端口 908 上间歇性地观察到 CN=DESKTOP-GI428R8 的自签名 TLS 证书。该主机位于 Partner Hosting LTD(AS215826)上,该公司于 2025 年 2 月在英国注册,服务器位于德国法兰克福。SSH 服务器存在 CVE-2024-6387 (RegreSSHion)、CVE-2025-26465 和 CVE-2025-26466 漏洞,表明运营商自初始配置以来未对服务器进行任何修补。
Censys 时间线数据显示,194.33.61[.]36 最早出现在 2026 年 2 月 12 日左右的扫描中,而端口 7000 上的 FRP 服务器最早于 2 月 13 日被发现。因此,截至发现时,该基础设施的启用时间不到两周,这表明要么是新近部署的活动,要么是基础设施的轮换。
194.33.61[.]36 的服务历史
SSH 主机密钥指纹 (6106ea733ed6263f18d8bb63c5696f2ae6c1383cab887a02f18f1af38107f9d4) 在 Censys 数据集中是该主机独有的,如果运营商迁移到新的 IP 地址但重用相同的服务器镜像,则该密钥指纹可以高保真地跟踪基础设施轮换。
经确认,FRP 服务器的 Web 控制面板位于 7500 端口,并受 HTTP 基本身份验证保护(Www-Authenticate: Basic realm=”Restricted”)。服务器在提供任何内容之前会返回一个 401 原始响应,内容类型为 text/plain——没有 HTML 登录表单。如果可以访问,该控制面板(一个嵌入在 FRP 服务器二进制文件中的 Vue.js 应用程序)可能会暴露所有已连接的受害者、他们的代理名称(其中包含根据 frpc.toml 配置设置的受害者用户名)、动态分配的端口、流量统计信息以及完整的连接历史记录。
案例研究:通过已验证的 Windows Hello 欺骗进行凭据网络钓鱼
CTRL 工具包的 StealUser 模块代表了一种针对受感染主机进行凭据网络钓鱼的异常复杂的方法。该模块并非显示通用的登录对话框,而是启动一个使用 SkiaSharp(GPU 加速渲染)和 LottieSharp(从真正的 Windows Hello 资源中提取的动画)构建的完整 WPF 应用程序,该应用程序能够高度模拟真实的 Windows PIN 码验证提示。
钓鱼窗口会加载受害者的真实显示名称和账户头像,检测 Windows 系统是处于深色模式还是浅色模式,并显示相应的主题。一个底层键盘钩子 (WH_KEYBOARD_LL) 会阻止 Alt+Tab、Alt+F4、Windows 键和 F4 键,以防止受害者切换窗口。窗口的 OnClosing 处理程序会取消所有关闭尝试;只有操作员的 Esc 组合键 (Ctrl+Shift+Q) 才能将其关闭。
最关键的是,StealUser 并非简单地收集受害者输入的任何内容。在捕获到输入的 PIN 码后,它会打开 Windows 设置并进入“你的信息”页面,利用 Windows UI 自动化功能找到并点击“验证”超链接,然后通过 SendKeys 将捕获到的 PIN 码发送到真正的 Windows 凭据提示符。如果 PIN 码被拒绝,受害者将被重定向回错误页面。即使 PIN 码通过了 Windows 身份验证系统的验证,该窗口仍会保持打开状态。捕获到的 PIN 码会以 [STEALUSER PIN CAPTURED] 为前缀记录到后台键盘记录器使用的同一个键盘日志文件中。
这种验证方法使操作员能够验证有效的凭据,而受害者除了看到例行的 Windows Hello 提示之外,不会有任何视觉迹象表明发生了任何异常情况。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:暗镜 censys censys《俄罗斯“CTRL”远控工具包分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论