文章总结: 该文档披露了朝鲜APT组织针对韩国汽车与媒体行业的攻击活动,其核心手法是将恶意代码直接编译进HAProxy负载均衡软件源码,利用其原生API与内存池实现深度集成后门,同时保持正常功能运转。工具包包含Tedbackdoor、curlrat远控木马、SSH键盘记录器及stager投放器,通过篡改crond等系统二进制实现持久化,并具备日志擦除与反虚拟化检测能力。攻击链涉及边缘服务器入侵、内网横向移动及水坑攻击,最终归因于APT37。 综合评分: 88 文章分类: 恶意软件,威胁情报,漏洞分析,红队,安全运营
服务器正常运转,后门却已经编译进了负载均衡软件源码里
原创
黑鸟 黑鸟
黑鸟
2026年9月5日 23:35 广东
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
2026年9月,网络安全公司Rapid7的威胁研究团队发布了一份深度报告,揭开了一套此前从未被公开记录的Linux攻击工具包。这套工具包被用于针对韩国汽车行业和媒体行业的组织,而且在很长一段时间里几乎没有被检测到。
为什么值得关注?因为这套工具的设计思路非常特别。它不是简单地往服务器上丢一个木马程序就完事,而是把恶意代码直接编译进了目标环境里最核心的负载均衡软件HAProxy当中,利用HAProxy原生的过滤器API、内部内存池、事件调度器和进程管理基础设施来拦截流量、隐藏自身,同时正常的负载均衡功能还在照常运转。换句话说,攻击者把后门做成了目标系统的一个“原生组件”,这种深度集成的程度在以往的攻击案例中并不多见。
这套工具包包含几个核心模块:一个被命名为“ted backdoor”的HAProxy后门实例,一个基于curl的远程访问木马(Remote Access Trojan,简称RAT)被称为CurlRAT,一个SSH键盘记录器,以及一个负责投放恶意程序的stager(投放器)。其中CurlRAT还专门维护了一个看门狗线程,用来监控HAProxy的健康状态并把信息回传给攻击者。
从时间线上看,VirusTotal上最早的样本上传可以追溯到2025年年中,而被篡改的HAProxy 2.8.12版本发布于2024年11月22日,这意味着这套工具的编译时间最早不会早于这个日期。Rapid7团队以中等置信度将此次活动归因于朝鲜APT(Advanced Persistent Threat,高级持续性威胁)组织,主要依据包括攻击目标集中在韩国媒体和汽车行业、使用简单的XOR加密和自定义替换密码、以及硬编码的C2(Command and Control,命令与控制)服务器列表被威胁情报平台ThreatFox和maltrail关联到了APT37。
攻击链全景:攻击者是如何一步步渗透的
在深入技术细节之前,我们先通过一张图来理解整个攻击流程。Rapid7的研究人员根据已有的证据部分重建了攻击链,虽然初始入侵的具体入口还没有完全确认,但整体路径已经比较清晰。
图1:部分重建的攻击链示意图
分析时发现,两家受害组织都运行着边缘Web服务器,对外开放了80、443和25端口。443端口上运行着Groupware(群件系统,企业常用的协同办公平台)登录门户,25端口则暴露了邮件服务器。这两个面都有可能成为初始入侵的入口,而且这种手法与已知的Kimsuky(金秀姬,朝鲜知名APT组织)的战术非常吻合。
值得注意的是,2026年初以来,安全界已经观察到Kimsuky组织利用对外可访问的邮件服务器中的RCE(Remote%20Code%20Execution,远程代码执行)漏洞来入侵韩国群件系统供应商。而Groupware%20Web门户本身就是朝鲜相关威胁行为者反复针对的目标类型,他们通常通过这种暴露在外的需要认证的应用来窃取凭据和实施漏洞利用。不过具体的入侵入口和相关CVE编号还需要更多取证证据来确认。
攻击的四个关键阶段
第一阶段,攻击者利用边缘Web服务器上Groupware登录门户的漏洞获取初始访问权限,在DMZ(隔离区)中建立第一个立足点。
第二阶段,攻击者在这台被攻陷的边缘主机上建立持久化并窃取凭据,比如通过SSH键盘记录器捕获管理员密码。这台边缘主机同时还充当staging%20server(中转服务器),存放被篡改的系统ELF(Executable%20and%20Linkable%20Format,Linux可执行文件格式)二进制文件。
第三阶段,攻击者从边缘位置向内网横向移动,把stager投放到内部服务器上。stager会先检查系统上是否运行着crond(Linux定时任务守护进程)或HAProxy,只有检测到其中之一才会继续部署CurlRAT,CurlRAT可以从stager自身的数据段中提取,也可以从边缘Web服务器上下载。
第四阶段,与此同时,ted%20backdoor被投放到HAProxy负载均衡器上。一旦激活,它会建立自己的C2通道连接到外部攻击者基础设施,实现数据窃取、命令执行和脚本注入。在受害者一侧,被攻陷的负载均衡器会静默地把恶意内容重定向或投递给经过它访问的特定客户端,完成一个watering%20hole(水坑攻击)的闭环。
SSH键盘记录器:连密码都被明文偷走
我们先来看这套工具包里相对独立但非常关键的一个模块:SSH键盘记录器。
它的样本哈希值为
4bb923eb040aa13ca8fd409c31ee4729c60ddff32e350efe1c5a4a9168a065f5,功能是拦截合法用户输入的明文密码,并把它们保存到一个加密的日志文件中
,路径是/var/lib/sshd/c8c68e629bba773a10ac80012d10bf19。
图2:userauth_passwd()函数中硬编码的主密码
从反编译代码中可以看到,这个键盘记录器在userauth_passwd()函数里硬编码了两组主密码(master%20password)。当用户输入的凭据不等于这两组主密码时,程序才会继续执行记录逻辑。这种设计说明攻击者给自己留了“后门中的后门”,用特定密码登录时不会被记录,也可能用于区分攻击者自己的登录行为和真实用户的登录行为。
确认需要记录后,程序会使用一套自定义的替换密码(substitution%20cipher)对密码进行加密,然后再做Base64编码。这套替换密码在整个工具包中反复出现,是识别不同模块之间关联的重要线索。
图3:用于加密凭据的替换密码表
顺着这套加密算法往下查,研究人员还发现了polkitd(Linux权限管理守护进程)、crond、agetty(终端登录管理器)和atd(一次性定时任务守护进程)等多个系统二进制文件的被篡改版本,它们都使用了类似的加密算法。其中crond的被篡改版本是由stager来投放的。
Stager在攻击链中扮演的角色是“投放器”,它本身不包含完整的恶意功能,而是负责在目标系统上环境侦察、解密配置、然后把真正的后门程序放上去。
启动流程:先侦察,再动手
样本哈希为
5db1b6d52faf60b4f32d6fd0c7c938e4d05d29a14c32ded4a9668357c08b6a91的stager启动后,首先用1字节XOR解密其配置字符串,然后验证是否拥有root(管理员)权限。接着它会对操作系统进行全面画像,包括系统主机名、OS发行版和版本ID、内核发布版本和版本号、以及CPU架构,目的是选择正确的payload(有效载荷)来投放。
解密完成后,它会在内存中解密被篡改的crond二进制文件,直接覆盖系统上合法的crond守护进程,然后重启服务。但有一个关键的前提条件:只有当系统上正在运行HAProxy或cron时,它才会继续投放带后门的crond。
图4:Stager配置解密结果,可见对HAProxy和cron的检测逻辑
为什么要检测HAProxy?因为被攻击者命名为ted%20backdoor的那个二进制文件本身也具备RAT功能,在整个攻击活动中扮演着核心角色。stager支持的被篡改crond版本涵盖了CentOS%207.7、7.8、7.9和Ubuntu%2022.04,覆盖面相当广。
痕迹清理:连日志都被选择性擦除
安装后门之后,stager会进行timestomping(时间戳篡改),让被篡改的crond二进制文件获得与/usr/bin/ssh相同的创建时间戳,这样从文件时间上很难看出异常。
更隐蔽的是,stager最后会通过一个名为/tmp/jasper-log的临时文件,从Linux系统日志中选择性地擦除包含tmp、wget、cron、crond等关键词的记录。这个文件名jasper很可能是为了伪装成旧版Apache%20Tomcat中的JSP(JavaServer%20Pages)引擎,从而混淆视听。被擦除的日志包括/root/.bash_history以及/var/log目录下的messages、audit/audit.log、cmd.log、secure、syslog、auth.log。
此外还有两个不同变种的stager(哈希分别为09739441ed4599bac2f8159028f772f71e4b25c8badfff95574e56d7384f3dbe和fea1bc36632c71e5a839803469ef60ac47595d36b2c50934ac109ade6df06e61),它们自身不嵌入任何payload,而是从已被攻陷的受害者服务器上获取带后门的二进制文件。
CurlRAT:藏在定时任务里的远控木马
CurlRAT是这套工具包的核心远控模块,它被植入到crond(以及其他系统守护进程)当中,表面上看是正常的系统服务,实际上却在后台与攻击者的C2服务器保持通信。下面以Ubuntu版本为例进行分析,CentOS样本的逻辑基本相同,只是用于隐藏配置和临时文件的路径有所区别。
配置解密与受害者标识
样本哈希为
feeea9d0bf6ae7396d28271baa51ae50df5169ce5d32a516865856f91abc50b3的CurlRAT启动后,同样先用1字节XOR密钥(0x58)解密配置字符串。解密后的配置包含了大量关键信息,比如C2服务器域名img.monderhouse.space和备用域名img.darklights.store、API令牌、各种系统路径等。
图5:CurlRAT配置解密结果,红框标注了C2域名
受害者ID(victim%20ID)的生成方式也很有特点:它把“cron_3.0pl1-137ubuntu3”这个字符串、系统主机名、IPv4地址、以及从/sys/class/dmi/id/product_uuid读取的硬件/操作系统UUID拼接在一起,然后做MD5哈希并转成大写。这个ID会作为User-token请求头发送到所有C2请求中,用来标识和区分不同的受害机器。
双线程架构:一个干活,一个看门
被添加到crond中的主要逻辑通过两个线程来执行。第一个线程运行start_routine函数,负责创建/var/lib下的snapd暂存目录,尝试从/var/lib/snapd/g580加载受害者ID。如果之前记录过网络故障,它会连接到备用域名img.darklights.store,使用api_token/ecd427ea8330a4ff73618483e00b9b41进行认证,并把受害者ID设置到User-token头中,来获取更新后的配置文件,存放到/tmp/nimon.unix-docbase.8564479396043450766-db6fb4443bc,然后复制到/var/lib/snapd/g105。
图7:运行CurlRAT逻辑的两个线程
配置解密采用了一种feedback%20XOR(反馈式异或)密码,文件的第一个字节用来初始化种子。每个轮询周期,CurlRAT通过libcurl库用HTTPS协议从C2服务器获取配置文件(失败时回退到HTTP),受害者令牌嵌入在User-token头中。获取到的配置用三个单字符分隔符来解析:感叹号“!”终止凭据字段,井号“#”标记payload区段,星号“*”分隔参数。解析后凭据字段会与本地受害者令牌进行比对。
六种C2命令模式
认证成功后,分隔符“#”之前的一个单字符模式字节(ASCII%20‘0’到’5’)会通过跳转表选择六个处理例程之一。配置中嵌入的payload经过两阶段解码:先做标准Base64解码,然后用从解码头部派生的密钥做滚动累积XOR解密。
C2任务处理程序默认每43200秒(12小时)轮询一次,但攻击者可以通过设置一个标志来激活快速轮询模式,把间隔缩短到30秒。每个周期内有一个重试循环,最多调用处理程序六次,每次间隔5秒,如果第一次尝试就失败则快速退出。
|%20%20|%20%20|%20%20| |%20—%20|%20—%20|%20—%20| |%20模式%20|%20功能%20|%20详细描述%20| |%200%20|%20命令执行%20|%20从配置中Base64+XOR解码命令列表,通过popen执行每一行,stderr重定向到stdout,输出保存到1MB缓冲区后回传%20| |%201%20|%20配置写入%20|%20解码并写入新配置payload到磁盘,验证后设置轮询间隔和快速轮询标志。验证失败则C2重置为img.monderhouse.space%20| |%202%20|%20分阶段payload投放%20|%20向C2主机发起带认证的HTTP%20POST,以任务路径为请求体,把响应流式写入临时文件,解压后移动到最终投放路径,删除临时文件%20| |%203%20|%20反向Shell%20|%20关闭2以上的所有文件描述符,调用setuid(0)和setreuid(0,0)把真实和有效用户ID都强制为root,然后外连并交给shell调度器%20| |%204%20|%20信标%20|%20填充一个10KB的系统信息结构体,作为签到信标发送出去%20| |%205%20|%20PTY%20Shell%20|%20完整的交互式PTY(伪终端)shell,payload由ip:port组成%20|
模式0到2和4使用基于libcurl的HTTP/HTTPS通信,这也是CurlRAT这个名字的由来。所有模式都对payload应用Base64+XOR编解码。
C2通信加密层
所有C2交互使用的加密层由feedback%20XOR密码组成,初始随机种子的计算方式是对240取模后加10(种子范围0到249),然后再做Base64编码。恶意软件把加密编码后的payload、服务名和遥测类型封装成一个格式化的application/x-www-form-urlencoded%20HTTP%20POST请求体(格式为name=%s&value=%s&type=%d),发送到C2服务器,使用硬编码的API令牌进行认证,并在User-token头中包含受害者ID。
HAProxy看门狗:专门盯着负载均衡器
第二个线程充当HAProxy看门狗。进入监控循环之前,它先检查/usr/lib/libvirtlog.so.0文件是否存在,以确认目标运行在虚拟化环境中,如果不在则休眠6分钟后中止。这是一种反沙箱/反虚拟化检测手段。
然后它读取/var/lib/snapd/g580中的MD5受害者ID,检查该节点是否处于活跃且已被攻陷的状态。之后每小时读取/var/run/haproxy.pid中的进程ID,通过轮询/proc/pid来监控HAProxy的状态。状态码有四种:
0(已启动):进程从停止转为运行
1(已停止):进程在内核进程表中不再活跃
2(已重启):PID文件时间戳被修改,且检测到新的PID
3(已重载):PID文件时间戳被修改,但PID保持不变
图6:writeinfo_service监控HAProxy状态并上报
状态信息随后通过自定义加密层发送到C2端点“writeservice_info”,遥测类型设置为0。
侦察模块与其他被篡改的守护进程
atd_get_info()是一个侦察例程,可能用于决定接下来要篡改哪个二进制文件以确保持久化。它收集被攻陷机器的服务名,连同IPv4地址、OS版本、以及服务列表和监听端口一起通过atd_response例程发送到C2。
图9:发送到C2的侦察模块输出
MODE、DELAY和SERVER_URL都是从之前讨论的配置文件中解析出来的。在Rapid7观察到的攻击活动中,CurlRAT充当了一个框架,构成了篡改合法系统守护进程的代码基础。除了crond之外,还发现了agetty和polkitd的被篡改版本,它们有类似的模式但缺少HAProxy监控功能:创建一个线程运行CurlRAT逻辑,分别连接到img.worksongo.store和img.socialteams.store。
CentOS版本的CurlRAT包含相同的功能,只是函数被伪装成atd_开头的例程,以便在静态分析时混入正常代码。早期版本的CurlRAT甚至直接硬编码C2地址而不使用XOR加密。
图8:早期版本CurlRAT的默认配置,C2地址明文硬编码
atd_encrypt_url和atd_decrypt_url使用的替换密码表与SSH键盘记录器共享,进一步证明了这些模块出自同一套工具框架。
CurlRAT函数清单
下面的表格汇总了CurlRAT中识别出的主要函数及其功能分组,可以看到这套远控木马的功能覆盖相当全面,从反向Shell到C2通信、从主机侦察到命令执行和加密,每个模块都有对应的函数实现。
|%20%20|%20%20| |%20—%20|%20—%20| |%20功能分组%20|%20识别出的函数%20| |%20反向Shell%20/%20PTY%20|%20atd_reverse_try_root,%20atd_reverse_create_conn,%20atd_reverse_is_alive,%20atd_reverse_open_pty,%20atd_reverse_cleanup_tty,%20atd_reverse_open_term,%20atd_reverse_handle_sigs,%20atd_reverse_close_inherited_sockets%20| |%20C2与网络通信%20|%20atd_http_request,%20atd_response,%20atd_request,%20atd_download_to_file,%20atd_download_config,%20atd_encrypt_url,%20atd_decrypt_url,%20atd_check_haproxy,%20atd_write_callback%20| |%20主机画像与侦察%20|%20atd_get_hostname_info,%20atd_check_info,%20atd_get_ip_info,%20atd_get_system_info,%20atd_get_version_info,%20atd_get_machine_info,%20atd_get_service_info,%20atd_create_id,%20atd_get_id%20| |%20命令执行与加密%20|%20atd_run_shell,%20atd_run_cmd,%20atd_run_module,%20atd_base64_encode,%20atd_base64_decode,%20atd_md5%20|
如果说CurlRAT是藏在系统服务里的卧底,那ted%20backdoor就是直接穿了HAProxy的“工作服”。攻击者重新编译了HAProxy%202.8.12版本(构建哈希72e70936f0dbe459142a1d867617c35f8d0cce5d18c6a49e1090a2a5adc8e558,文件大小约18MB),把一个名为ted_plugin的自定义插件直接编译进了源代码中,甚至还留下了命名这个后门的调试字符串。
图10:ted_plugin作为源代码的一部分被编译进去
这意味着这个插件不是运行时动态加载的外部模块,而是HAProxy二进制文件本身的一部分。它直接挂钩了内置的HTTP解析器,依赖HAProxy内部数据结构来搜索HTTP请求头。用于捕获流量的自定义过滤器通过ted_load_filter_config例程加载。
配置结构与双层解密
插件的运行配置从~/cache/haproxy-1000.cache读取。每个字段经过两层解密:第一层ngx_decode应用以文件第一个字节为种子的链式XOR;第二层ngx_decrypt_script应用单字母替换密码,其67条映射表在启动时由ted_init_util从一个固定字符串构建,存储在ted_dec_dict%20uthash表中,以Jenkins哈希为键实现O(1)查找。
图11:my_filter_config结构体,定义了过滤器的全部配置项
配置中包含运行模式、所有目标正则表达式、每条脚本规则及其payload路径和文件名、以及允许的操作者密钥。基于IP的访问控制列表从haproxy-1001.cache和haproxy-1002.cache加载,使用相同的解密方案。在其他ted%20backdoor样本中,my_filter_config结构体还包含用于捕获cookie的正则表达式。
加载配置后,插件通过ted_register_reload_signal_handler()设置信号处理,并把C2管道保存在HAPROXY_MWORKER_PP_READ和HAPROXY_MWORKER_PP_WRITE环境变量中,以便在HAProxy重载和重启后仍然存活,同时通过ted_extra_log()保存子进程活动记录。
ted_plugin函数清单
ted_plugin定义了大量函数,覆盖了HTTP拦截、C2任务执行、进程间通信、配置管理、内存数据结构、日志文件IO以及初始化持久化等各个方面,下面是完整的函数分类列表。
|%20%20|%20%20| |%20—%20|%20—%20| |%20功能分类%20|%20ted_*系列函数%20| |%20HTTP拦截与流量挂钩%20|%20ted_flt_register_ops2,%20ted_http_headers_for_htx,%20ted_chn_analyze_for_htx_constprop_0,%20ted_chn_analyze_for_htx_constprop_0_cold,%20ted_http_payload,%20ted_find_value_from_header_ist%20| |%20C2与任务执行%20|%20ted_pipe_master_thread,%20ted_pipe_worker_thread,%20ted_task_for_response,%20ted_alloc_task_context%20| |%20IPC与管道%20|%20ted_init_main_pipe,%20ted_create_pipe_file,%20ted_create_multi_pipe_file,%20ted_make_pipe_name%20| |%20配置与规则引擎%20|%20ted_load_filter_config,%20ted_reload_filter_config,%20ted_free_filter_config,%20ted_load_ip_set%20| |%20内存数据结构%20|%20ted_set_add,%20ted_set_contains,%20ted_set_clean,%20ted_set_add_string,%20ted_set_contains_string,%20ted_set_clean_string%20| |%20日志与文件IO%20|%20ted_extra_log,%20ted_save_capture_log2,%20ted_write_fd,%20ted_build_correct_path%20| |%20初始化与持久化%20|%20ted_init_util,%20ted_register_reload_signal_handler,%20ted_regex_free%20|
挂钩HTTP解析:C2通信伪装成正常请求
HAProxy的trace_ops结构体被复制到my_filter_ops中,其中包含了被挂钩的追踪方法。
图12:my_filter_ops包含被挂钩的方法
trace_chn_start_analyze()被ted_chn_analyze_for_htx_constprop_0()挂钩,这个函数解析HTX缓冲区,也就是HAProxy存储已解析的、SSL解密后的HTTP请求的内存区域。如果传入请求匹配端点“/favorite_list_2x_m500_ico.jpg”,恶意软件就进入C2模式,在追踪响应状态的ted_rep_state结构体中把flag字段设为1。
。</p>
<p><img decoding=)
图14:实时捕获匹配特定正则表达式的HTTP头
当受害者请求匹配攻击者的过滤器时,后门开始工作。它提取受害者的源IP、请求的Host、Referer和User-Agent,用感叹号作为分隔符把数据格式化成单行记录。
接下来根据conf->action继续执行:0表示仅被动记录,非0则启动注入路径。一个请求需要通过四个条件才能被注入:
第一,请求必须带有User-Agent,如果配置了agent_pattern则该正则必须匹配。
第二,代码在User-Agent中扫描字节x,6,4,根据匹配的规则在两个payload路径之间选择,从ted_script_config结构体中获取(path_32在偏移0x18,path_64在偏移0x20)。
第三,遍历脚本规则列表,直到找到一个ted_script_config条目的URL和referer正则都匹配,referer为空则自动通过。这样操作者可以捕获从特定来源到达特定页面的受害者,而不是对访问某个URL的所有人无差别投放。
第四,植入程序解析Accept-Language头,按分号和等号分割,提取四个操作者控制的字段:mrt对应64字节uid凭据,msc对应8字节状态,mst对应8字节分数,第四个关键词从off_355407读取对应1024字节信息块。解析与顺序无关,可以出现任意子集。如果mrt产生一个密钥,它必须存在于allow_id_set中,这个凭据会完全覆盖IP过滤,让操作者可以从任何地方访问目标页面。它还会把日志记录升级为带*前缀的格式,携带uid、状态、分数和信息。没有密钥时则回退到基于IP的判断:action==1要求白名单成员资格,action==2要求不在黑名单中,两者都检查两次,一次把最后一个字节清零用于/24子网匹配,一次用于精确主机匹配。
图15(上):ted_task_context和ted_script_config结构体
图15(下):ted_rep_state结构体,用于追踪注入状态
所有检查通过后,选定的文件被打开,存储在每个连接的ted_rep_state中作为fpAppend和nTotal,同时带有一个指向匹配规则的script_conf反向引用。该规则偏移0x00处的replace字节在为0时把flag设为4,非0时设为2,区分是追加内容还是替换内容。最后代码设置其过滤器标志,并在流上递增nb_rsp_data_filters或nb_req_data_filters,这是HAProxy文档化的用于访问响应体的选项,这一次被重新利用来在交付时向页面注入代码。
响应篡改:神不知鬼不觉的页面投毒
一旦受害者被标记为注入目标,两个回调在响应返回时完成最后的工作。ted_http_headers_for_htx首先运行,只有当数据在响应侧、请求期间初始化了状态块、且设置了事务标志时才执行。它根据之前匹配的规则重新检查响应,测试Content-Type和状态行,确保只有在回复是值得修改的文档时才投递payload。然后它重塑响应以适配传入的文件:设置Content-Type,如果规则中有文件名则添加Content-Disposition,把新的体长度写入自定义长度头部,删除Accept-Ranges让客户端无法请求字节范围来发现大小不匹配,如果状态不是200 OK则强制改为200 OK。
图16:挂钩HTTP响应,在返回给客户端前篡改内容
ted_http_payload执行实际的替换。对于每个响应体块,它只取payload文件剩余的对应大小,从磁盘读取那一片,用ngx_decrypt_script解密,然后通过HAProxy自己的体编辑调用来替换。当替换改变了体长度时,代码把每个剩余过滤器的偏移量移动相应的差值,这样下游不会看到不一致。配合重写后的长度头部和被剥离的范围支持,大小变化不留痕迹。
trace_http_end处理剩余字节。前面的回调只能覆盖响应中已经存在的字节,所以当payload比原体大时会有一部分无处可去。这个函数在响应末尾运行,把剩余部分追加进去。它检查状态块是否处于注入模式、头部是否已经重写、已投递字节是否少于payload大小。如果满足,它测量响应缓冲区中的剩余空间,从payload文件读取恰好那么多,用ngx_decrypt_script解密,作为新数据块追加,并递增通道的输出计数来匹配。
最终结果是,任意大小的payload都可以通过任意多次传递来投递,整个过程由HAProxy自己的调度器来驱动。为了确保持久化,CurlRAT还被集成并隐藏为libc例程。
图17:ted backdoor中包含的CurlRAT配置
攻击者基础设施:伪装成CDN的C2网络
观察到的基础设施遵循一致的模式:域名注册在低成本的通用顶级域(TLD)下,比如.store、.space、.site、.autos,并且使用模仿图片服务CDN端点的子域名方案(img.)。这样一来,payload投递流量就可以混入正常的Web浏览流量中。
跨样本的命名约定表明这是一个共享的注册工作流,而不是临时搭建的基础设施。其中img.responsive.pstatic.autos模仿了韩国Web平台Naver的pstatic.net静态内容域名,结合ted backdoor采用的水坑投递模式,进一步印证了针对韩语用户的攻击意图。
已知的C2域名包括:img.monderhouse.space、img.smartnords.site、img.darklights.store、img.responsive.pstatic.autos、img.socialteams.store、img.worksongo.store。
Rapid7团队以中等置信度将此次活动归因于朝鲜APT组织。主要依据包括以下几个方面:
第一,目标选择。被攻陷的服务器在443端口暴露了Groupware登录门户,这种系统在韩国企业环境中非常普遍。针对区域性软件(Groupware)、模仿Naver静态内容域名、以及水坑攻击模式,都与已知的朝鲜APT活动高度吻合。
第二,技术手法。使用简单的XOR和替换密码、以及水坑攻击模型,这些在APT37的“Operation Code on Toast”行动和Lazarus的“Operation Synchole”行动中都有记录。硬编码的C2列表被ThreatFox和maltrail关联到了APT37。
第三,时间线重叠。此次活动的时间线和投递机制与Kaspersky记录的Lazarus组织“Operation SyncHole”行动存在重叠,该行动从2024年11月持续到2025年2月,Lazarus攻陷韩国媒体网站,把访客重定向到提供恶意JavaScript payload的页面。
需要说明的是,APT37和Lazarus Group是两个不同的朝鲜国家支持威胁集群,据Mandiant评估它们隶属于朝鲜不同的机构:APT37隶属于国家安全保卫部(Ministry of State Security),Lazarus隶属于侦察总局(Reconnaissance General Bureau),但两者都开展针对韩国实体的网络间谍活动。Lazarus被观察到部署带后门的开源程序来投递恶意软件,并使用feedback XOR加Base64与C2通信。
截至2026年7月,ENKI WhiteHat报告了类似的疑似初始访问,这意味着如果韩国邮件设备中存在漏洞,利用可能仍在持续并被朝鲜APT组织所利用。
此外,ted backdoor中存在ngx_前缀的例程,暗示代码可能复用自一个nginx后门。ngx_前缀的例程在最近的Funnull行动中也被观察到,当时(与本案类似)注册了一个自定义nginx过滤器来挂钩HTTP流量,并对配置文件应用简单XOR加密。不过除了类似的命名约定之外,没有显著的代码级别重叠来支持更强的关联。
ted backdoor和CurlRAT的设计目标非常明确:在长期间谍行动中保持持久化,能够窃取cookie会话、凭据、重定向特定用户、实施drive-by download(路过式下载)攻击,并且对特定IP范围隐藏页面被篡改的证据以规避检测。
参考:
https://www.rapid7.com/blog/post/tr-dprk-apts-ted-backdoor-curlrat-target-south-korean-media-automotive-sectors/
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:黑鸟 黑鸟 黑鸟《服务器正常运转,后门却已经编译进了负载均衡软件源码里》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论