Sleepwalker: 带有自定义命令语言的被动后门
摘要
SLEEPWALKER 是一种被动后门恶意软件,在触发前保持休眠状态,直到接收到包含自定义命令语言程序的特定网络数据包。文章详细介绍了其设计、操作和逆向工程分析。
暂无内容
查看缓存全文
缓存时间: 2026/08/29 18:37
# SLEEPWALKER:具有自主命令语言的被动后门
来源:https://r136a1.dev/2026/08/24/sleepwalker-a-passive-backdoor-with-its-own-command-language/
年初失去对VirusTotal Intelligence的访问权限意外地带来了高效产出。无法追踪有趣的新恶意软件后,我停止向“待办事项”列表添加条目,最终处理了去年积压的工作。这导致了对BeheMOF(https://x.com/TheEnergyStory/status/2074095308129137118)的详细检查,并发现了这款恶意软件。仔细检查后,一个最初看似不起眼的样本,在深入分析后展现出独特设计:它是一个被动后门,不开放任何明显的监听端口,自身也不携带载荷。它静静地在内存中等待,直到一个经过特殊构造的数据包到达机器——这就是我将其命名为SLEEPWALKER的原因。
值得撰文分析的是该数据包所携带的内容:它不是可读的命令,而是一段用该后门自创命令语言编写的小程序。其23条指令涵盖了调度、多种数据传输方式、分阶段文件投递以及直接在内存中运行代码。仅恢复加密密钥不足以理解这些程序。必须同时逆向工程其内部命令语言。从逆向工程角度看,SLEEPWALKER设计很酷。不过,其实现存在若干弱点,并非顶级恶意软件工程。但这可能是早期版本。可能存在更新改进的构建版本。
本文将介绍文件本身揭示的信息、SLEEPWALKER的加载方式、启动机制、网络隐藏原理、命令保护机制及其内部命令语言的工作原理。最后一部分详细解释了后门的实际能力。文末包含IOC部分,附录中包含YARA规则和只读扫描脚本。
## 执行摘要
SLEEPWALKER是一款具有自主命令语言的被动后门。它从不主动连接固定C2地址,而是嗅探网络中的隐蔽触发数据包。仅在收到特定数据包时,它才会被唤醒,解密并运行攻击者提供的任务程序。该程序以仅该文件能解释的字节码形式到达,而非可读命令。携带该程序的文件是一个64位Windows DLL,冒充微软的`dpapi.dll`,并伪造了ESET Management Agent的版本资源。它被设计为通过侧加载进入`ERAAgent.exe`——即ESET Management Agent的Windows可执行文件(https://support.eset.com/en/kb6866-eset-management-agent-faq)。ESET将该代理描述为ESET PROTECT和ESET PROTECT On-Prem的核心组件,用于连接受管端点和服务器至管理平台,并在本地存储和执行策略。SLEEPWALKER仅检查宿主进程名称,不验证其签名或路径,且仅在名称为`ERAAgent.exe`时保持活跃。
后门的整个生命周期:
从加载到ERAAgent.exe到执行解密命令的SLEEPWALKER生命周期。(https://r136a1.dev/assets/images/posts/sleepwalker-a-passive-backdoor-with-its-own-command-language/sleepwalker_lifecycle.png)
图1:从侧加载到执行的路径:在匹配数据包到达前,无任何代码运行。
内建配置使用AES-256-CCM解密(附带验证认证标签)后,得到单条引导指令:无限期监控所有网络接口以等待触发。文件自身除了等待不执行任何操作。后门携带紧凑的字节码解释器,包含23条指令,涵盖调度、带SHA-256验证的分阶段载荷投递以及内存中shellcode执行。其网络功能包括TCP、UDP、ICMP、SMB命名管道(使用提供的凭据进行横向移动)、VMware内部VMCI通道(https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/tools/13-1-0/vmware-tools-administration/introduction-to-vmware-tools/vmware-tools-device-drivers.html,用于虚拟机与宿主机通信)以及原始套接字混杂嗅探。第二个触发通道还可通过DNS查询携带命令。
为便于未认证的命名管道访问,SLEEPWALKER主动弱化宿主环境:它启用匿名SMB访问,并创建权限授予所有人和匿名登录的命名管道。所有加密由静态链接的mbedTLS(https://github.com/Mbed-TLS)开源加密库提供,而非运行时加载的任何模块。
这种组合使得SLEEPWALKER难以从网络侧检测:在操作员发送那个特定构造的数据包前,无任何可阻止的内容,且该数据包可能隐藏在完全正常的流量中,包括构造的DNS查询。如此触发的被动植入程序,使用包括VMCI在内的多种隐蔽传输方式,通过侧加载部署到受信任的ESET管理组件中,极可能是目标攻击的一部分,且包含其他未识别组件。由于该代码与我以往所见的任何东西都不同,我无法将其归因于任何特定攻击者。
> **要点**
> - 文件未签名,复制ESET的文件信息,并通过DLL侧加载加载。
> - 仅检查宿主进程名称,当名称为`ERAAgent.exe`(ESET Management Agent的Windows可执行文件)时激活。
> - 从不主动连接任何服务器。在执行任何操作前,等待一个特定的加密网络数据包。
> - 触发后,运行用小型自定义命令语言编写的程序,支持调度、多种网络方法、分阶段文件投递以及直接在内存中运行代码。
> - 文件本身不含预制恶意载荷。除单条启动指令外的所有内容均需后续通过网络传递。
> - 修改本地Windows设置,使未认证的网络连接能够到达它。
## 文件特征
该样本是一个未签名的64位DLL,适用于Windows GUI子系统。文件大小为59,904字节,编译时间戳为2024-06-10 09:18:27 UTC:
``
SHA-256: d347170752a28e2b8c4b8b9f3cab2e3a6541ba11682c94498d26eb9002779d60
SHA-1: 2ec8aa9661a33bccc002150ce1ed02d90c3986ff
MD5: 2318327b29bb1c0e2d2b5f0211fc7fac
Imphash: 4e2dbfa7e3efd4cca2f3662797df9735
``
为伪装,文件携带了从ESET真实Management Agent复制的版本资源:
字段值
CompanyName ESET
ProductName ESET Management Agent
FileDescription ESET Management Agent Module
InternalName `ERAAgent`
OriginalFilename `dpapi.dll`
File / Product version 11.2.2076.0
LegalCopyright Copyright (c) ESET, spol. s r.o. 1992-2024.
文件导出与真实`dpapi.dll`相同的名称和七个函数:`CryptProtectDataNoUI`、`CryptProtectMemory`、`CryptResetMachineCredentials`、`CryptUnprotectDataNoUI`、`CryptUnprotectMemory`、`CryptUpdateProtectedState`和`iCryptIdentifyProtection`。每个函数都是通过指针表跳转的小型存根,该表初始为空。首次调用这七个函数中的任何一个时,共享解析器尝试使用`LoadLibraryW`加载名为`dpapisvc.dll`的文件,以在其中查找真实函数并将其地址写入指针表,从而转发调用。
该名称不属于任何真实的Windows组件。没有名为`dpapisvc.dll`的文件随Windows发布。最接近的真实名称是`dpapisrv.dll`,这是一个无关文件,仅导出两个LSA扩展函数,与该代码寻找的七个函数截然不同。直接引用`dpapi.dll`本身也不可行,因为恶意文件已占用宿主进程中的该名称,直接`LoadLibraryW`调用只会返回自身句柄而非真实文件。需要其他名称或路径,但实际使用的名称在真实系统中不存在。加载失败时,解析器会退出整个宿主进程,而非仅使该调用失败。这在实践中是否发生取决于是否有程序实际调用这七个特定函数,仅凭此文件无法确定。可能该攻击的完整版本会将真实`dpapi.dll`的重命名副本放置在同一目录下,因为应用程序自有文件夹中的文件会被优先于System32查找(该后门已利用此搜索顺序实现加载)。但此文件未携带此类副本,且本文无法确认其存在。
首次调用同时静默重新运行后门自身的启动检查,给予其第二次唤醒机会(若首次启动受干扰)。下文初始化部分将完整介绍启动过程。
## 初始化和启动序列
在执行任何操作前,DLL检查加载它的进程名称。若进程不叫`ERAAgent.exe`,DLL保持非活跃状态,因此不会在调试器、沙箱或任何其他程序中运行(除非该程序恰好具有此名称)。通过检查后,一系列简短步骤激活后门:
1. 启动独立于ESET自身代码的新后台线程,避免阻塞代理进程运行。
2. 保留128KB内存块,用于后续组装分片到达的程序。
3. 解密存储在文件内的单条指令。
4. 准备Windows网络环境,并将解密的指令交给下文详述的内部解释器。
该解释器不仅使用一次。当后续触发通过任何下述传输方式传递后续程序时,完全相同的解释器函数将运行它。因此,完整的命令语言(涵盖调度、分阶段文件投递和内存代码执行)自首次触发起即可用,无需构建到单独的第二阶段组件中。
作为备选,首次调用七个导出数据保护函数中的任何一个时(在该调用被转发前),相同的检查和序列将再次运行。这为后门提供了两次独立的启动机会。
两条独立路径通向相同的启动代码:
- **路径1:**DLL加载到ERAAgent.exe中(DllMain)
- **路径2:**首次调用7个转发DPAPI导出函数中的任何一个
两条路径独立执行:
- 检查宿主进程名称
- 运行相同的启动序列:启动后台线程、保留128KB缓冲区、解密引导指令、启动解释器
*没有任何机制检查另一路径是否已运行,这是本文稍后所述重复工作问题的根源。*
用于检查的`ERAAgent.exe`字符串未存储为可读文本。运行时从少量数字重建,与文件从未在正常导入表中列出的三个函数名使用的技巧相同:用于运行shellcode的`VirtualProtect`、用于后文所述宽松管道权限的`SetSecurityDescriptorDacl`以及用于随机暂停的`CryptGenRandom`。
在`DLL_PROCESS_DETACH`时,DLL设置一个被其解释器、休眠、调度和监听循环轮询的进程级停止标志。这请求它们退出,但不保证干净的动态卸载。线程辅助函数在`CreateThread`后立即关闭每个工作线程句柄,分离路径不等待工作线程完成。因此,DLL被取消映射时工作线程可能仍在执行。进程终止时,Windows已终止其他线程,因此此风险主要适用于动态卸载DLL的情况。
## 无自主信标或固定服务器
大多数后门启动后很快连接互联网上的服务器以接收命令。SLEEPWALKER不主动执行此操作。确认宿主进程名为`ERAAgent.exe`后,内建引导程序不发起任何出站连接。文件中未包含域名、IP地址或URL。
这描述的是SLEEPWALKER自身的启动行为,并非宿主进程的所有网络活动。合法的ESET Management Agent通常按其配置的连接间隔向ESET PROTECT报告状态。因此,在后门休眠期间,`ERAAgent.exe`可能继续产生合法的ESET流量。
相反,它将网卡置于可查看所有经过数据包的模式(不仅是发往自身的数据包)。这通常称为混杂模式。后门随后检查每个数据包是否匹配特定模式:计算校验和、编码长度值和加密数据块。仅当数据包完全匹配此模式时,后门才解密内部数据并将其视为命令。此类触发通常称为魔法数据包。以下是逐步检查过程:
步骤检查若失败
1 数据包长度至少48字节忽略
2 将数据包最后两个16位值异或,结果再与`0xAAAA`异或,得到候选长度不适用
3 候选长度在有效范围内忽略
4 (数据包长度-候选长度)位置的字节对等于最后两个值的和(而非异或)忽略
5 候选长度指向的块通过自身的CRC-32校验忽略
6 使用AES-256-CCM解密,将结果视为命令不适用
*任何步骤失败均丢弃数据包且无响应。仅完全按顺序通过所有步骤的数据包被视为命令。*
所有操作在数据包原始内容上执行,此时Windows尚未判定其为TCP、UDP或其他类型数据包。由于检查在此层进行,触发可隐藏在几乎任何类型的IP流量中,而非特定协议。
后门最多同时监控八个网络接口,跳过回环接口和计算机无法访问网络时自动分配的地址。成功触发后,它至少等待三秒才接受下一次触发,主要为避免重复处理同一数据包,而非彻底阻止重复尝试。
由于后门从不主动发送任何内容且默认不开放任何明显监听端口,监控已知恶意域名或异常出站流量的工具不会看到异常。唯一在网络上可见的时刻是操作员发送触发数据包时。缺乏指向已知恶意基础设施的出站连接也不能排除感染。机器可能被此后门完全控制,同时不对网络监控器产生任何可标记内容。
文件内建配置仅包含一条指令:监控所有网络接口,无限期等待匹配数据包。后门可执行的其他所有操作均后续通过网络接收且已加密。
## 命令认证与加密
在逐部分分析前,以下是命令从接收到执行的完整管道流程:
``
触发数据包或DNS查询
-> 帧与校验和检查
-> AES-256-CCM解密
-> 字节码解释器
-> 命令处理器
```
发送到后门的每个命令均使用AES-256-CCM加密。这是一种标准加密方法,同时实现两件事:隐藏消息内容并证明消息创建后未被修改。通过后门大多数通道发送的命令使用相同布局:12字节的每次变化值(称为nonce),后跟16字节检查值,再后跟...
相似文章
@jsrailton: 新发现:恶意软件开发者在其间谍软件中添加了核武器与生物武器相关文本,目的是触发LLM安全拒绝,防止AI安全扫描器分析该恶意软件。
恶意软件开发者正在其间谍软件中添加关于核武器与生物武器的文本,以触发LLM安全拒绝机制,从而防止AI安全扫描器分析恶意软件。这展示了对激进安全对齐的一种实际利用,突显了攻击者可以利用的二级盲点。
是否可能存在带有后门的恶意LLM
讨论了包含由秘密句子或条件触发的后门的LLM的可能性,以及闭源与开源模型的相对风险。
Deadbugz:当前活跃的MCP供应链攻击活动
Pillar Security研究人员详细描述了Deadbugz,这是一个活跃的供应链攻击活动,通过GitHub拉取请求分发恶意MCP服务器,将窃取凭据的指令隐藏在三项良性工具调用之后。
自适应代理蠕虫 (8分钟阅读)
研究人员展示了由开放权重LLMs驱动的自适应计算机蠕虫,这些蠕虫能够生成针对性攻击并自我复制,利用窃取的计算资源来规避传统的AI安全措施。
一个针对AI基础设施的隐蔽黑客工具潜伏在受害者盲区中
CrowdStrike发现了一种蠕虫病毒,它针对AI软件供应链,窃取凭证并执行破坏性操作,同时通过模仿合法AI编码活动来逃避检测。