360深度揭秘Xshell后门事件:入侵感染供应链软件的大规模定向攻击
概述
近日,NetSarang旗下的Xmanager、Xshell、Xftp和Xlpd等在全球流行使用的服务器远程管理软件曝出被多家杀毒软件报毒查杀的情况,经过360科技集团追日团队调查分析确认,NetSarang旗下多款软件的关键模块被植入了高级后门,这是一起入侵感染供应链软件的大规模攻击事件,我们将其命名为“XshellGhost”(xshell幽灵)。
事件时间轴
2017年7月17日,NetSarang公司发布旗下多款产品的新版软件,更新修复多处bug和增强了会话加密能力,用于对抗CIA木马“BothanSpy”的密码劫持功能。
2017年8月7日,NetSarang与卡巴斯基发布联合声明,声称7月18日发现软件存在安全漏洞被攻击。
2017年8月15日,NetSarang与卡巴斯基更新联合声明,发现在香港利用该软件漏洞的案例。
图1
攻击形式
NetSarang系列软件的关键网络通信组件nssock2.dll被植入了恶意代码,厂商在发布软件时并未发现恶意代码,并给感染组件打上了合法的数字签名随新版软件包一起发布,用户机器一旦启动软件,将会加载组件中的恶意代码,将主机的用户信息通过特定DGA(域名生成算法)产生的DNS域名传送至黑客的远程命令控制服务器,同时黑客的服务器会动态下发任意的恶意代码至用户机器执行。
攻击影响面
使用被感染的软件的用户,将会被黑客窃取用户信息,并在云端下发任意的恶意代码进行远程控制,由于该系列软件在国内的程序员和运维开发人员中被广泛使用,多用于管理企事业单位的重要服务器资产,所以黑客极有可能进一步窃取用户所管理的服务器身份验证信息,秘密入侵用户相关的服务器,请相关软件用户和企事业单位提高警惕。
XshellGhost技术分析
“XshellGhost”(xshell幽灵)是一个精密的定向攻击平台,所有的功能模块实现均为shellcode形式,客户端攻击通过感染供应链软件和各个shellcode模块,实现了无自启动项、无落地文件和多种通信协议的远程控制,后门潜伏于受害者电脑等待黑客在云控制平台下发shellcode数据执行,黑客在云端甚至可能通过上传的用户信息进行选择性的定向攻击。
远程控制逻辑分析
XshellGhost的远程控制主要分为5个步骤:
1. 软件启动加载被感染组件nssock2.dll,解密shellcode1执行。
2. Shellcode1解密Shellcode2执行如下功能:
a) 创建注册表项,上报数据到每月对应的DGA域名当中;
b) 通过发往知名的域名解析器当中上传用户信息给攻击者;
c) 将接收的数据写入到创建的注册表项当中;
d) 通过获取的key1和key2解密Shellcode 3并执行;
3. Shellcode3会创建日志文件并写入信息,启动系统进程Svchost.exe,修改其oep处的代码,并注入shellcode形式的Root模块执行。
4. Root模块的初始化过程中,会加载并初始化Plugins、Config、Install、Online和DNS等功能模块,然后调用函数Install->InstallByCfg以获取配置信息,监控注册表并创建全局互斥体,调用Online-> InitNet;
5. 函数Online-> InitNet会根据其配置初始化网络相关资源,向指定服务地址发送信息,并等待云端动态下发代码进行下一步攻击。
图2
初始加载模块分析
此次攻击的所有模块调度加载实现方式都是通过shellcode形式,采用了模块化的方法进行统一管理。每个Shellcode的入口函数都会根据传入的第2个参数的数值决定将其具体要执行的功能,参数数值和对应的功能列表如下所示:
编号 |
作用 |
1 |
初始化shellcode自身的相关信息 |
100 |
相关初始化,获取shellcode Root的功能列表 |
101 |
释放shellcode申请的资源 |
102 |
获取shellcode的ID |
103 |
获取shellcode的名称 |
104 |
获取shellcode的函数列表接口 |
根据Shellcode编号102、103和104所对应的功能,可以获取每个Shellcode的信息列表:
ID |
名称 |
状态 |
100 |
Root |
已知 |
101 |
Plugins |
已知 |
102 |
Config |
已知 |
103 |
Install |
已知 |
104 |
Online |
已知 |
关键的网络通信模块,除DNS协议通信,此后门还会利用其他5种网络协议进行远程控制。
ID |
名称 |
状态 |
200 |
TCP |
未知 |
201 |
HTTP |
未知 |
202 |
UDP |
未知 |
203 |
DNS |
已知 |
204 |
HTTPS |
未知 |
205 |
SSL |
未知 |
基础管理模块分析
Root模块是该次攻击的基础管理模块,其它各个模块的功能的展开和运行都依赖于Root模块提供的函数接口列表:
ID |
名称 |
作用 |
1 |
空指针 |
|
2 |
InsertShellcodeInfo |
获取shellcode的信息,保存在全局shellcode信息链表当中 |
3 |
ShellCodeQueryIncRef |
通过shellcode的地址在全局信息链表中查询对应的信息指针,并增加引用 |
4 |
ShellCodeQueryIncRef |
通过shellcode的ID在全局信息链表中查询对应的信息指针,并增加引用 |
5 |
ShellCodeQueryDecRef |
减少shellcode信息指针的引用计数。 |
6 |
ShellCodeQueryDecRef |
先判断shellcode的结构成员(0x18 0x1c)。如果都为0,则减少引用计数 |
7 |
ShellCodeGetName |
获取该shellcode的名称 |
8 |
EnterCriSec |
进入全局信息链表的临界区 |
9 |
LeaveCriSec |
离开全局信息链表的临界区 |
10 |
GetLastShellcodeInfo |
获取最后一个被插入到全局链表的shellcode的信息 |
11 |
GetNextShellcodeInfo |
获取当前shellcode所指向的下一个shellcode指针 |
12 |
LoadDll |
调用LoadDllEx |
13 |
LoadDllEx |
Shellcode以dll文件的形式存在,加载对应的dll文件,并将Shellcode对应的信息保存到全局shellcode信息链表中 |
14 |
LoadAndInsertShellcode |
调用LoadAndInsertShellcodeEx |
15 |
LoadAndInsertShellcodeEx |
加载转换后的shellcode,依次调用其功能号1、100、102、104,然后将信息添加到全局shellcode信息链表中 |
16 |
LoadShellcode |
加载shellcode,并调用其功能号1 |
17 |
InjectShellcode |
调用InjectShellcodeEx,第3个参数为0 |
18 |
InjectShellcodeEx |
注入到指定的进程句柄当中,根据第3个参数决定启动该shellcode的方式: 0:更改进程oep处的代码跳转到加载处 1:直接远程线程启动shellcode的加载代码 |
19 |
TransDataInternal |
根据传入的键值转换数据的编码格式 |
20 |
TransDataInternal |
根据传入的键值转换数据的编码格式 |
21 |
Malloc |
申请空间 |
22 |
TransDataByTime |
根据当前时间转换数据的编码格式 |
23 |
TransDataEx |
根据数据头转换数据的编码格式,并返回转换后的数据的相关信息 |
暂无讨论,说说你的看法吧 |