Daxin:专为隐蔽通信而设计的驱动级后门
· 4 分钟阅读 · @admin

Daxin 是一个高度复杂的 Rootkit 后门,具有精巧、隐蔽的命令与控制(C&C)功能。它使远程攻击者能够与未直接连接到互联网的安全设备进行通信,允许攻击者深入渗透目标网络并窃取数据而不会引起怀疑。
与普通 Rootkit 恶意程序利用合法操作系统进程的方式不同,Daxin 利用服务器之间合法的安全网络流量来感染计算机并规避检测。通过劫持 TCP 通信,它可以将恶意通信隐藏在被视为合法的流量中而不被发现。被劫持的流量本质上可以被视为加密的 TCP 隧道,还能够通过受攻击组织内受感染计算机网络中继其通信。攻击者可以选择跨受感染计算机的任意路径并发送命令,指示这些计算机建立所请求的连接。
从其复杂的通信机制来看,Daxin 开发者投入了大量精力开发通信技术,这些技术可以让恶意流量与目标网络的正常网络流量完美融合。
2. 样本详情
| 文件名 | MD5 哈希值 |
|---|---|
| Wantd.sys | b0770094c3c64250167b55e4db850c04 |
3. 执行流程图

4. 详细技术分析
驱动文件通过搜索某些关键结构来实现 Hook,将系统的收发包函数替换为自定义的函数,以此达到隐蔽通信的效果。由于拦截的是位于 OSI 七层模型最底层的数据链路层,而一般防火墙位于网络层或传输层,因此可以绕过大部分防火墙的流量监控。它可以自定义协议或者伪装成 DNS、TCP/IP 和 ICMP 等协议数据而不被发现。当收到具有特定格式的数据包时才拦截并解析命令,执行相应的操作,而对于其他流量数据则选择放行。
4.1 Wantd.sys 驱动分析
4.1.1 文件信息
驱动文件名为 “wantd.sys”,文件描述被伪装成 Windows 系统文件。产品版本为 6.1.7600,可以得知编译器生成驱动时指定的目标操作系统为 Windows 7,如果用于 Windows 10 或 Windows 11 可能会导致蓝屏问题。

然而,查看数字签名可以发现并不是微软的数字签名,而是使用某公司泄露的数字签名。安全意识较高的用户很容易怀疑该文件为可疑文件。

4.1.2 HOOK NDIS 中间层驱动
驱动枚举与函数定位
遍历所有已经加载的驱动,通过比较模块名来查找驱动并返回对应的模块信息。

遍历驱动模块的导出表获取 API 函数的地址。

TCPIP 驱动 Hook
由于协议驱动需要与网络适配器进行绑定,而每个网络适配器都会与 TCPIP 进行绑定,因此对 TCPIP 进行 Hook 是比较省力且方便的方式,这样可以拦截所有网卡的 TCPIP 流量通信。
ndisMiniDriverList 是内核网络编程中比较重要的全局变量,在注册和枚举微端口驱动时都会用到。ndisFindMiniportOnGlobalList 函数给定一个对象名,遍历 ndisMiniportList 的 NextGlobalMiniport 字段找到指定对象名的 _NDIS_MINIPORT_BLOCK 结构。这个结构用于表示微端口信息,物理网卡和虚拟网卡等都存在这个结构。
变量 ndisMiniDriverList 和函数 ndisFindMiniportOnGlobalList 在内核中是未公开和导出的,因此无法通过正常方式来获取。
关键结构定位
恶意驱动通过在特定函数中查找特征码的方式定位到关键结构,然后获取其地址。
1. 全局变量 ndisMiniDriverList
在函数 NdisMRegisterMiniportDriver 中搜索特征码。

搜索到的汇编代码如下:
![]()
2. 函数 ndisFindMiniportOnGlobalList
在函数 NdisIMInitializeDeviceInstanceEx 中搜索特征码。

在 ndis.sys 中对应的汇编代码如下。获取到的数据为偏移量,还需要计算转换成函数地址。

通过微端口驱动的链表查找上一层网络(NDIS 协议驱动)中名为 “TCPIP” 的协议驱动。

NDIS_OPEN_BLOCK 结构搜索
暴力搜索 tcpOpenBlock 的字段 Openqueue 的内存数据,判断是否是有效指针。如果是,则检查指向的内存是否包含特征 \x5c\x00\x5e\x00\x5c\x00\x5c\x00,如果是则计算偏移。

要搜索的特征其实为设备名的长度。

继续暴力搜索字段 Openqueue 的字段 ProtSendNetBufferListsComplete 和 ReceiveNetBufferLists。这两个字段为函数指针,主要用于接收和发送相关协议的数据包。

Hook 函数替换
备份所有协议驱动对应的结构 NDIS_OPEN_BLOCK 中的收包和发包函数地址,用于在被 Hook 的函数中调用原函数或者驱动卸载时恢复。

对所有已注册的协议驱动用于收发数据包的函数 ReceiveNetBufferLists 和 SendCompleteNdisPacketContext,恶意驱动都将其替换成自己的处理函数。

数据包拦截处理
在被 Hook 的函数中,第二个参数为 NET_BUFFER_LIST 结构,待接收的数据包存放在其字段 MDL 描述里。

判断收到的数据包是否是 LOOPBACK 类型,如果是则调用原函数,不进行任何拦截操作;否则拦截和修改数据包。

隐藏恶意流量
在函数 hook_SendCompleteNdisPacket 中,将由恶意驱动发送的数据包从链表中移除,从而隐藏其通信数据,使 Wireshark、Tcpdump 等抓包工具无法捕捉到其通信流量。
数据包 NBL 的 flags 被设置为 0x99100000,查找官方文档该值为无效值,应该是用来识别是否是由恶意驱动修改过的数据包。由于数据包被拦截不会到达系统的 Windows TCP/IP 堆栈,因此设置成任意值都不会对网络通信造成影响。

在 hook_NextSendBufferListsHandler 函数中,比较数据包的 NdisPoolHandle 是否是 ndis_hook_pool。ndis_hook_pool 是由恶意驱动创建的用于存放数据包的 buffer,如果两者相等则调用原函数,如果不相等则需要拦截或修改数据包。

4.1.3 拦截和修改数据包
数据包提取与解析
将保存在 NBL 的数据包提取出来保存到 dst 中,方便对其中部分报文进行修改或者重组。

解析数据包的格式,用于在重组数据包时使用。

校验和重新计算
在网络数据包被篡改后需要重新计算数据包的校验和。该恶意驱动只拦截 ICMP (1)、TCP (6) 和 UDP (11) 三种协议的数据包,因此只需要计算这三种协议的校验和。

网络数据包的校验和计算方式如下:

路由选择
遍历所有网络接口的 IP 和子网掩码,找到和 ip_addr 处于同一内网的 IP 地址。如果没有找到则返回最后一个网络接口的默认网关。

TCP 连接劫持
当发送包含 \x90\x10\x11 的数据到被感染的机器时,恶意驱动会断开用户连接并抢占连接。它与对等方进行自定义密钥交换,打开用于发送和接收数据和命令的加密通信通道。使用这种隐蔽的通信方法,威胁行为者可以绕过防火墙并逃避 SOC 分析师的检测。
从下图可以看出,恶意驱动发送了两个包:
- 第一个包:发送到原始目的地的欺骗性 RST TCP 数据包,因此其接收者将 TCP 连接标记为关闭。
- 第二个包:发送到原始源的 ACK TCP 数据包。
从这时开始,恶意驱动会保持与原始源 IP 的 TCP 连接,依靠 ReceiveNetBufferList Hook 劫持任何相关的网络数据包。

数据包伪造
在生成网络数据包时,Daxin 使用自己的代码伪造网络数据包,绕过合法的 Windows TCP/IP 堆栈。根据原始 TCP 协议报文重新组装报文,修改原始报文中涉及到的 MAC 地址。

遍历所有网卡对应的 IP 地址,获取 IP 地址对应的 MAC 地址,将其保存到全局变量 g_packets。后续在伪造数据包时通过从 g_packets 获取最佳路由。

初始化过程如下:

4.1.4 通信隧道
加密通道建立
每当 Daxin 劫持 TCP 连接时,它都会检查接收到的数据中是否有特定消息。如果有则启动自定义密钥交换。密钥交换成功后会打开一个加密的通信隧道。Daxin 使用这个通信隧道来交换各种信息,比如在被感染机器上启动任意进程、读写任意文件等。
在受感染的机器上,任何恶意网络连接都会绕过 Windows TCP/IP 堆栈,这可以提供一定程度的隐蔽性。从密钥交换开始,所有后门通信都采用恶意驱动开发者自定义的协议格式。
协议格式定义
struct protocol_head {
uint16_t magic;
uint8_t kind;
uint8_t unknown;
uint32_t total_length;
};
对于字段 magic 来说,其值总是 0x9910 或者 0x9911。kind 用于指定密钥交换时处于何种状态。一旦建立了加密通信通道,它就会对每条消息的用途进行编码并确定固定报文大小之后的数据格式。
4.1.4.1 密钥交换
初始握手
密钥交换开始时,初始消息处于未加密状态,字段 magic 和字段 kind 为 TCP 数据包前三个字节 0x10 0x99 0x11。如果已经感染了恶意驱动的计算机接收到该数据包会导致 TCP 连接被劫持。
根据会话状态检查接收到的消息是否有效,确保 magic 值为 0x9910,并且 kind 为 0x10 或者 0x11。接下来会生成一个随机数(nonce),用于加密任何之后传入的消息。最后它发送一条响应消息,其中包含随机数、自身详细信息以及有关被感染机器的信息。从该数据包开始,后续所有的数据包无论是发送还是接收都处于加密状态。

响应包格式
发送的响应包格式如下,用于识别是否处于登录状态:
struct format {
uint16_t magic; // 0x9910
uint8_t kind; // 0x12
uint8_t pad;
uint32_t totalLength;
uint8_t unknown[0x10];
uint32_t target_build : 3;
uint32_t target_version : 3;
char target_nonce[0x80];
char recognised_login[0x10]; // 识别登录
uint32_t initiator_ip_addr;
uint32_t netmask;
};
登录验证
发起者收到识别登录的数据包后,发送使用哈希密码登录后门的响应包。

响应的数据包数据格式为:
struct format {
uint16_t magic;
uint8_t kind; // 0x15
uint8_t pad;
uint32_t totalLength;
char login[0x10];
char password_hash[0x4];
char initiator_nonce[0x80];
};
如果登录成功则发送 kind 为 0x16 的成功登录消息包给发起登录方。假设请求建立隧道端为 A,隧道另一端为 B。
密钥交换状态表
| Kind | 描述 |
|---|---|
| 0x10 | A 向 B 请求建立通信隧道 |
| 0x11 | (备用请求类型) |
| 0x12 | B 接收到 A 请求登录的消息时,B 生成随机数以及将随机数和自身信息作为响应消息发给 A |
| 0x15 | A 发送登录信息到 B,包括登录名和哈希密码 |
| 0x17 | B 接收到 A 的登录信息,但是 A 在 B 机器上处于已登录状态 |
| 0x16 | B 接收到 A 的登录信息,A 在 B 机器上处于未登录状态。生成共享密钥,用于加密消息正文 |
4.1.5 APC 注入
进程注入机制
从所有运行的进程中找到进程 svchost,通过 APC(异步过程调用)的方式将 DLL 或者 EXE 注入到该进程。

使用函数 KeAttachProcess 附加到 svchost 的进程空间,并获取一些 API 的地址保存到 APC 参数上下文中。

附加到目标进程然后利用 APC 机制将 Shellcode 注入到 svchost 进程中。

Shellcode 功能
Shellcode 的主要功能为执行可执行文件。当文件为 DLL 时通过 LoadLibrary 加载,为 EXE 时用 CreateProcess 创建进程。

5. 威胁指标 (IOC)
文件哈希:
b0770094c3c64250167b55e4db850c04
设备名称:
\Device\Tcp4
6. ATT&CK 框架映射
| 战术 (Tactic) | 技术 ID | 技术名称 (Name) | 描述 |
|---|---|---|---|
| Command and Control | T1572 | Protocol Tunneling | 劫持 TCP 创建加密通信隧道 |
| T1573 | Encrypted Channel | 通信流量被加密 | |
| Discovery | T1012 | Query Registry | 查询注册表获取网络接口信息 |
| T1057 | Process Discovery | 查找进程 svchost | |
| Privilege Escalation | T1055 | Process Injection | 注入 Shellcode 到进程 svchost |
| Command and Control | T1105 | Ingress Tool Transfer | 下载程序并执行 |
| T1001 | Data Obfuscation | 伪装网络流量为合法协议 | |
| Defense Evasion | T1014 | Rootkit | 内核级 Rootkit 隐藏恶意活动 |
| T1036 | Masquerading | 伪装成 Windows 系统文件 |
7. 总结
Daxin 是一个技术极为复杂的驱动级后门,其设计目标是实现隐蔽的长期持久化访问。该恶意软件展现了以下几个突出特点:
-
底层网络拦截:通过 Hook NDIS 驱动层,实现对所有网络流量的完全控制,绕过应用层和传输层的安全监控。
-
流量伪装技术:能够将恶意通信隐藏在正常的网络流量中,使用自定义加密协议,规避传统网络安全设备的检测。
-
TCP 连接劫持:通过精心设计的握手机制,能够劫持合法的 TCP 连接,建立加密的命令与控制通道。
-
隐蔽的进程注入:利用 APC 机制向系统进程注入恶意代码,进一步增强隐蔽性。
-
中继通信能力:能够通过多台受感染主机中继通信,使攻击者能够访问内网深处未直接连接互联网的系统。
这种级别的技术复杂性表明 Daxin 很可能是国家级 APT 组织开发的高级工具,用于针对高价值目标的长期情报收集活动。防御此类威胁需要采用多层次的安全策略,包括内核完整性监控、异常网络流量分析和端点行为检测等手段。

