NjRAT 样本分析
1. 概述
NjRAT(又称为 Bladabindi)是一款带有图形用户界面(GUI)的远程访问工具(RAT),允许攻击者远程控制和监视受害者计算机,进行键盘记录、截图捕获、文件操作和数据窃取。该恶意软件以其广泛的功能而闻名,被用于各种网络犯罪活动。
最早的 NjRAT 由一个名为 M38dHhM 的组织创建,该组织据信位于阿拉伯语国家,主要针对中东地区。自 2013 年其源代码泄露后,出现了多个修改版本,包括但不限于:
NjRAT 0.7d Danger Edition
NjRAT 0.7d Golden Edition
NjRAT 0.7d Green Edition
NjRAT Lime Edition
2. 环境配置
在此次分析中,我们采用的 NjRAT 变种为 NjRAT 0.7d Green Edition。
Github 仓库链接:https://github.com/XAKEP-1lly/NjRat-0.7D-Green-Edition-by-im523
2.1 环境搭建
本实验共使用三台虚拟机:其中两台运行于 Hyper-V 的 Windows 10 Pro x64 虚拟机分别承担攻击端和受害端的角色;另一台运行于 VMware 的 Windows XP SP3 虚拟机,作为兼容性测试环境,用于对比分析样本在旧版系统中的行为。
攻击端与受害端的 IP 地址:

兼容性测试环境 IP 地址:

拓扑架构如下:

2.2 NjRAT 创建
运行 NjRAT 控制端后,会弹出一个窗口,以设置C2服务器的监听端口。

通过左下角的 Builder 选项,可以生成 NjRAT 客户端可执行文件。

2.3 NjRAT 利用
受害者运行 NjRAT Builder 生成的 exe 文件之后,NjRAT 控制端即可在面板中看到主机上线。

攻击者可以利用 NjRAT C2 控制端下发指令。

3. 静态分析
我们先对生成的 NjRAT 客户端程序进行静态分析。
3.1 基本信息
通过 DIE 对其进行扫描,可知其为 Win32 PE 格式,采用 VB.NET 编译,基于 .NET Framework 2.0。
DIE 内置的特征库将其识别为 NjRAT 0.7D Green Edition Malware,与样本来源一致。

程序香农熵低于 5,说明其未经过额外的压缩壳或加密壳处理。

在 pestudio 中打开该程序,可以看到其导入函数与字符串信息。

根据 pestudio 列出的字符串,可知程序具备:修改注册表、关闭计算机、禁用任务管理器以及修改防火墙策略等功能。

3.2 代码分析
由于 njRAT 基于 Microsoft .NET Framework 开发,客户端程序被编译为 MSIL(Microsoft Intermediate Language),而非直接生成原生机器码,程序内保留了较为完整的元数据信息,其类名、方法名以及部分变量信息在反编译后仍然可读。基于这一特性,我们采用 dnSpy 对其程序集进行反编译与代码分析。
njRAT 的入口点在 main() 函数,调用了 OK.ko() 函数。

检测程序是否带参数启动,如果存在参数,就会在注册表 HKEY_CURRENT_USER 中写入 di 值,延迟5s再往下执行。

这里创建了一个互斥体,以确保只有一个实例在运行。若创建互斥体失败,即另一个实例正在运行,则会终止当前实例。

调用 INS() 函数执行程序的安装逻辑,以进行持久化、传播。

跟进 INS() 函数,这里一系列操作大致逻辑为:自复制安装到指定目录、添加防火墙例外、Run 项自启动、启动文件夹自启动、杀掉指定进程(可设置为杀毒软件)、隐藏自身文件、USB 传播。
自复制安装到指定目录

修改防火墙规则,添加自身为例外

Run 项自启动、启动文件夹自启动

杀掉指定进程

隐藏自身文件

USB 传播

这里程序比较细节的一点是不仅写了 INS() 函数,还额外写了 UNS() 函数,方便在需要时清理自身。

回到 OK.ko() 函数继续往下看,这里启动了三个后台线程,其中 RC() 负责接收 C2 数据包,kq.WRK() 记录击键数据,mgr.protect() 进行进程自保。

数据通过 Base64 进行编码传输。


判断用户是否进行关机注销操作,若正常关机就会正常结束进程,若走非关机流程去强行终止进程,就会触发蓝屏。

接下来就是程序的主循环框架,进入每秒一次的无限循环,降低内存占用、发送心跳包以及检查自启动功能。

每 5 秒降低一次自身内存占用,加强隐蔽性。

每约 8 秒获取一次当前活动窗口信息,若与上次不同则更新缓存并发送“act”命令到 C2 上报。

检查注册表中自启动项,确保程序始终随系统开机启动。

4. 动态分析
4.1 基于 Process Monitor 的行为分析
我们采用 Process Monitor 来监控 NjRAT 客户端程序的具体行为。

程序运行后,首先在注册表中写入 di = "!" 作为启动标记。

调用 netsh ,添加防火墙例外。

往注册表中写入启动项,指向 Server.exe 所在的路径。

在后面日志中,可以看到,程序重复对该键进行 RegQueryValue / RegSetValue 操作,实现注册表持久化。

随后将 Server.exe 拷贝到启动文件夹 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup,命名为 5efb366650164bc7ebaf4ef0b452f861.exe,并设置文件属性为隐藏。

taskkill 杀掉指定进程。

往每个磁盘的根目录写入 svchost.exe 与 autorun.inf 文件,以实现通过 U 盘传播的功能。但由于如今 Win10 安全策略的收紧,该写入操作失败,返回 ACCESS DENIED。

早期 Win7 在插入 U 盘 / 双击盘符时,系统会读取 autorun.inf,自动执行 open= 或 shellexecute= 后的命令,但在 Win7 打了 KB967715 等补丁之后,策略就变成:只对 CD/DVD 光驱的 autorun 保留自动执行,对 U 盘、移动硬盘等可移动磁盘,一律忽略 autorun 的执行项。
但现今绝大多数用户所使用的环境已经是 Windows 7 及以上版本,基于 autorun.inf 的 U 盘自动传播机制在现代系统中的实际效果已非常有限。
所以我们转到 Windows XP 系统进行测试,程序如期往各个盘下写入了 svchost.exe 和 autorun.inf 文件。

之后程序创建了自己的注册表配置根键,用来保存受害者 ID 等信息。

之前进行代码分析的时候,我们知道程序存在 Protect Process [BSOD] 的操作。在创建 NjRAT 的时候若选择了该选项,运行时会执行 OK.pr() 函数,该函数会将程序自身的 ProcessInformationClass 设置为 29。

从而该进程将被归类为关键进程,任何试图中断其运行的操作都会导致蓝屏死机(BSOD)。

在任务管理器中 End Process 被置灰。

强行终止会导致蓝屏。

我们可以通过内核工具 PCHunter 去终止进程,通过抹除其 critical 标志位,再杀掉该进程,这样就不会直接蓝屏。

4.2 基于 Wireshark 的网络通信分析
受害机器与攻击者主机初始化 TCP 三次握手。

随后受害机器会向攻击者机器发送第一条信息,除 NjRAT 设置的机器 ID 为 Base64 编码,其他信息均为明文。消息包含:机器 ID、主机名、用户名、文件最后写入日期、操作系统名、系统架构、是否有摄像头、版本号、当前活动窗口标题。

再发送第二条消息,此信息经 Base64 编码,包含:受害者姓名、受害者IP和端口号、可执行文件位置、可执行文件名称、以及与 NjRAT 创建期间选择的选项相对应的 True 和 False 值列表。

解码可得到明文数据。

当攻击者使用 Keylogger 功能时,攻击端会向被控计算机发送 kl 命令,受害者计算机随后将发送 Base64 编码的击键日志。

使用 Remote Desktop 功能时,被控方桌面的实时画面以 TCP 数据包流通过一帧一帧的 JPEG 图片数据发送。
包头为:CAP|'|'|
包体为:JPEG 图片数据,例如这里传输内容就是当前桌面的 35x23 缩略图

使用 Get Passwords 功能时,攻击机下达 pas 命令,被控端访问 Dropbox 下载 Pass.exe,扫描系统中的密码,并写入到 temp.txt,再通过 pas|'|'|<Base64(temp.txt)> 回传到攻击端。

4.3 基于在线沙箱的行为分析
除本地虚拟机环境外,为了从另一个角度验证 NjRAT 样本的行为特征,我们将生成的样本上传至在线动态分析沙箱(Virustotal 与 ANY.RUN)中进行自动化行为分析。
由于实验环境中 NjRAT 客户端配置的 C2 地址位于内网,仅在局域网内可达,将该样本直接上传至公网在线沙箱时无法建立完整的 C2 会话,行为特征不够完整。因此,这里我们选取 ANY.RUN 平台上公开的一个 NjRAT 样本(文件名 Documentos.ppam,MD5:1a5ab39ecf526a79b4cd098a1d16de82)作为参考,对其自动化行为分析结果进行简要整理,从真实投递场景的角度补充验证前文的分析结论。
下图是 NjRAT 在此次真实投递场景下的生命周期:

ANY.RUN将该样本识别为 njRAT / Bladabindi 远程访问木马,文件类型为 PowerPoint 插件(application/vnd.openxmlformats-officedocument.presentationml.presentation),并标注了 macros、macros-on-open、rat、njrat 等标签,说明该恶意代码是通过启用 Office 宏在打开文档时自动执行的。
在进程树中可以看到,受害者在打开 Documentos.ppam 后,由 POWERPNT.EXE 进程加载并执行宏代码,随后由该进程释放并启动后续的恶意可执行文件(NjRAT 客户端),其投递链为:钓鱼文档 → Office 进程 → 木马载荷。
和本地我们生成的 NjRAT EXE 相比,该样本多了一层 Office 文档包装和宏执行阶段。