导语:近日,NetSarang旗下的Xmanager、Xshell、Xftp和Xlpd等在全球流行使用的服务器远程管理软件曝出被多家杀毒软件报毒查杀的情况,经过调查分析确认,这是一起入侵感染供应链软件的大规模攻击事件,我们将其命名为“XshellGhost”(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 |
根据数据头转换数据的编码格式,并返回转换后的数据的相关信息 |
24 |
TransData |
根据数据头转换数据的编码格式 |
25 |
Free |
释放空间 |
26 |
GetTimeSum |
获取时间的总和 |
27 |
TransChr |
对字符取模0x3E。余数在区间[0x1a,0x34)中时,+0x47;余数在区间左边时,+0x41;否则-0x04 |
Root模块的初始化逻辑如下图所示:
图3
插件功能模块分析
Plugins模块为其他插件提供接口,包括读写注册表指定字段的加密数据,加载DLL等,以及监控注册表指定字段变化并将其数据解密作为插件加载:
ID |
名称 |
作用 |
1 |
OpByCmd |
根据命令提供向注册表指定key写入加密Value和删除Value,加载DLL等功能 |
2 |
MonitorRegLoadShellocde |
监控注册表指定key更改并加载插件。若参数为0,则不会创建注册表键,否则会创建注册表键 |
3 |
RegOpenKeyAndQueryValue |
打开并查询注册表的键值 |
4 |
RegCreateKeyAndSetValue |
创建并设置对应注册表路径的键值 |
5 |
RegOpenKeyAndDeleteValue |
打开并删除注册表相应的键值 |
在调用Install模块的InstallByCfg函数时,会调用Plugins模块的MonitorRegLoadShellCode函数。该函数负责监控注册表指定key,如果key值被改变,该函数将会读取注册表中的数据并调用Root模块的LoadAndInsertShellcodeEx函数将其加载。
如果网络控制端下发调用Plugins模块的OpByCmd函数的指令,将会设置其注册表指定key的数据,过后MonitorRegLoadShellCode函数将会监控到key值发生改变,读取注册表数据动态加载下发的Shellcode代码。
C&C配置模块分析
配置模块Config主要负责管理当前机器当中的配置文件以及对应机器的ID:
ID |
名称 |
作用 |
1 |
OpByCmd |
根据Command执行对应的config操作,调用Online模块的SendTans进行反馈 |
2 |
GetCfgCon |
读取文件中的Config参数 |
3 |
RandomStr |
根据VolumeSerialNumber生成随机字符串,在同一个机器中固定 |
该模块包含了一个大小最大为0x858的配置数据块,其中配置数据块是从文件中读取的,文件位置是由该模块的第三个函数RandomStr提供
图4
随机串生成的过程跟系统的卷序列号相关,所以在不同的机器上其位置并不相同。但是其有固定的格式,RandomStr均为大写字母:
%ALLUSERSPROFILE%RandomStr RandomStr RandomStr RandomStr
配置信息是加密存储在配置文件中的,通过调用该模块的接口函数,可以获取解密后的配置文件,配置数据块的结构如下:
图5
配置块的头部是一个OffsetTable,其中记录了各项配置串相对于EncryptStringStub的偏移,
目前已知的配置位置:
OffsetTable[8] 配置块0x10 要注入的进程路径
OffsetTable[0xC] 配置块0x18 CC URL地址和CC类型
原始串的前2个字节为本串加密的Key,之后通过解密函数解密获取解密后的串,所以解密后的串长度要比原始串的长度少2。经分析还原的解密函数如下:
图6
通过对程序自身的配置文件进行分析:
图7
注入程序路径,加密前的字符:
x1FxE5x3Ax86xF4x31xFFxB8x9Fx64x81x96xAAxC4xB1xF0x02x5ExC5xB1x3ExAFx98x19xF6x00x21x39x20xC5xC4x39
解密后:%windir%system32svchost.exe
CC远程命令控制服务器的 URL,加密前的串:
x7Bx3Cx1Fx9Fx7Ex01xA0x08xF0xF6x1Cx7Fx71x60xBDx63x66x95x7BxE6x62x4CxB3
解密后:dns://www.notped.com
DNS查询地址:
8.8.8.8
8.8.4.4
4.2.2.1
4.2.2.2
代码注入模块分析
主体代码注入模块Install,负责将Root模块代码注入到指定的进程当中,以及调用Online模块的相关初始化工作:
ID |
名称 |
作用 |
1 |
OpByCmd |
如果数值为0x00006700,根据参数和shellcode信息调用Shellcode Online的SendTrans
如果数值为0x01006700,根据参数和shellcode信息调用Shellcode Online的SendTrans,如果返回结果为0,则休眠3秒。 如果全局ShellcodeInfo信息结构体(Shellcode Root)中的Op选项不为4,则退出进程。 |
2 |
InstallByCfg |
函数InstallByCfg的逻辑如下所示:
图7(1)
功能A:
1、 调用Plugins的MonitorRegLoadShellCode函数,创建并监控指定注册表键,读取注册表数据加载shellcode执行;
2、 调用Config的RandomStr函数获取字符串,用来创建全局互斥体
a) 如果全局互斥体已存且Root的Op数值为3,结束自身进程。
b) 调用 Online的 InitNet,初始化网络模块
功能B:
1、 调用Plugins的MonitorRegLoadShellCode函数,打开并监控指定注册表键, 读取注册表数据加载shellcode执行;
2、 查询Shellcode 106,如果不存在,则休眠1秒继续查询
3、 调用Shellcode 106的第2个接口函数
功能C:
1、 调用Config的函数GetCfgCon获取配置文件中保存的Pe路径
2、 启动Pe,修改Oep处的代码,注入Shellcode Root
a) 如果失败,则创建线程调用功能A
b) 如果成功,则结束自身
网络通信模块分析
Online模块是本次攻击的网络通信管理模块,在本次攻击事件当中我们已经发现了DNS模块,其它几个网络模块(TCP、HTTP、UDP、HTTPS、SSL)虽然在代码当中有所体现,但是在shellcode当中尚未主动运行,各个网络模块的函数接口及其作用如下表所示:
ID |
名称 |
作用 |
1 |
空指针 |
|
2 |
GetConObj |
返回该种网络通信时所使用到的对象 |
3 |
Start |
发送初始化数据包 |
4 |
Recv |
接受消息 |
5 |
Send |
发送消息 |
6 |
Shutdown |
发送shutdown数据包 |
7 |
Close |
关闭连接 |
各个网络模块的功能的展开和运行依赖于Online模块提供的函数接口列表:
ID |
名称 |
作用 |
1 |
OpByCmd |
根据命令实现收集机器的硬件信息等功能 |
2 |
InitNet |
根据配置文件初始化网络模块 |
3 |
GetConPluginObj |
根据传入的Shellcode的ID获取对应的通信Shellcode对象,调用通信对象的第2个接口函数GetConObj获取该Shellcode通信定义的对象 |
4 |
Start |
调用传入的Shellcode指针所对应的第3个函数(传入的shellcode为通信模块,第3个函数统一为发送初始化数据包); |
5 |
Recv |
调用传入的Shellcode指针所对应的第4个函数(传入的shellcode为通信模块,第4个函数统一为接收消息) |
6 |
RecvLoop |
根据传入的大小,多次调用Recv,获取要接受的数据 |
7 |
RecvTrans |
调用RecvLoop转换后获取到要接受的数据大小,循环调用RecvLoop获取所有数据,最终调用Root的TransDataEx |
8 |
Send |
调用传入的Shellcode指针所对应的第5个函数(传入的shellcode为通信模块,第5个函数统一为发送消息) |
9 |
SendLoop |
根据传入的大小,多次调用Send,发送完所有数据 |
10 |
SendTrans |
根据时间转换数据格式,SendLoop |
11 |
RecvSend |
创建线程进行对应Shellcode的(Recv和Send)操作 |
12 |
Shutdown |
调用传入的Shellcode指针所对应的第6个函数(传入的shellcode为通信模块,第6个函数统一为发送shutdown数据包) |
13 |
Close |
调用传入的Shellcode指针所对应的第7个函数(传入的shellcode为通信模块,第7个函数统一为关闭连接);减少对应Shellcode的引用计数 |
14 |
GetId |
获取传入的Shellcode所对应的ID |
InitNet在读取网络代理配置以后每隔1秒调用功能A,如果功能A返回20000,则函数彻底结束,功能A逻辑:
图8
功能B逻辑,用于等待云端下发代码执行:
图9
此次攻击已知使用的通信模块是DNS模块,该后门基于DNS隧道技术进行通信:
ID |
名称 |
作用 |
1 |
空指针 |
|
2 |
GetConObj |
返回自定义对象,DNS通信时使用 |
3 |
Start |
发送初始化数据包,开启线程等待数据结束 |
4 |
Recv |
接受消息,有客户端连接时设置Event1 |
5 |
Send |
发送消息,有客户端连接时设置Event2 |
6 |
SendShutdown |
发送shutdown数据包 |
7 |
CloseConnect |
关闭连接 |
该模块发送的数据包有3种类型:
1.初始化数据包,大小为0x18
图10
2.Data数据包,大小0x8+
图11
3.关闭数据包, 大小0x8
图12
其发送函数如下:
图13
图14
图15
在调用DNS模块2号函数返回自定义对象时,其调用了GetAdaptersAddresses获取适配器的DNS
图16
最多收集0x10个DNS,随后在调用该模块第3号函数时,其使用收集到的DNS,合并Config文件中的4个DNS地址,循环往每一个DNS发送查询,等到到任何一个返回数据,或者超时,并记录下第一个返回应答的DNS数据包,以后再次发送的时候,只会给第一个返回应答的DNS发送数据。
图17
图18
在发送数据包时,会将数据嵌套到DNS协议中发送,其中数据会编码成特定的字符串,添加在要配置文件中的CC DNS URL前,实现DNS隧道通讯。
图19
图20
总结
通过技术分析,我们发现“XshellGhost”(xshell幽灵)是一整套复杂的模块化的精密木马病毒,这是一起黑客入侵供应链软件商后进行的有组织有预谋的大规模定向攻击,我们仍将会持续关注此次攻击的进一步发展,建议广大用户使用360安全卫士查杀“XshellGhost”(xshell幽灵)木马病毒和防御供应链软件攻击。
360追日团队(Helios Team)
360 追日团队(Helios Team)是360科技集团下属的高级威胁研究团队,从事APT攻击发现与追踪、互联网安全事件应急响应、黑客产业链挖掘和研究等工作。团队成立于2014年12月,通过整合360公司海量安全大数据,实现了威胁情报快速关联溯源,独家首次发现并追踪了三十余个APT组织及黑客团伙,大大拓宽了国内关于黑客产业的研究视野,填补了国内APT研究的空白,并为大量企业和政府机构提供安全威胁评估及解决方案输出。