安全路透社
当前位置:安全路透社 > 网络转载 > 正文

Xshellghost技术分析 – 入侵感染供应链软件的大规模定向攻击

近日,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与卡巴斯基更新联合声明,发现在香港利用该软件漏洞的案例。

攻击形式

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会根据其配置初始化网络相关资源,向指定服务地址发送信息,并等待云端动态下发代码进行下一步攻击。

Xshellghost技术分析 - 入侵感染供应链软件的大规模定向攻击 FreeBuf.COM

 初始加载模块分析

此次攻击的所有模块调度加载实现方式都是通过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信息指针的引用计数。
如果引用计数为0 ,则创建线程,调用该shellcode的101功能,释放资源。然后释放shellcode
6 ShellCodeQueryDecRef 先判断shellcode的结构成员(0×18 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模块的初始化逻辑如下图所示:

Xshellghost技术分析 - 入侵感染供应链软件的大规模定向攻击e FreeBuf.COM

插件功能模块分析

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提供

israbye FreeBuf.COM

随机串生成的过程跟系统的卷序列号相关,所以在不同的机器上其位置并不相同。但是其有固定的格式,RandomStr均为大写字母:

%ALLUSERSPROFILE%\RandomStr\ RandomStr\ RandomStr\ RandomStr

配置信息是加密存储在配置文件中的,通过调用该模块的接口函数,可以获取解密后的配置文件,配置数据块的结构如下:

 israbye FreeBuf.COM

配置块的头部是一个OffsetTable,其中记录了各项配置串相对于EncryptStringStub的偏移,

目前已知的配置位置:

OffsetTable[8]             配置块0×10                 要注入的进程路径

OffsetTable[0xC]         配置块0×18                 CC URL地址和CC类型

原始串的前2个字节为本串加密的Key,之后通过解密函数解密获取解密后的串,所以解密后的串长度要比原始串的长度少2。经分析还原的解密函数如下:

israbye FreeBuf.COM

通过对程序自身的配置文件进行分析:

israbye FreeBuf.COM 

注入程序路径,加密前的字符:

\x1F\xE5\x3A\x86\xF4\x31\xFF\xB8\x9F\x64\x81\x96\xAA\xC4\xB1\xF0\x02\x5E\xC5\xB1\x3E\xAF\x98\x19\xF6\x00\x21\x39\x20\xC5\xC4\x39

解密后:

%windir%\system32\svchost.exe

CC远程命令控制服务器的 URL,加密前的串:

\x7B\x3C\x1F\x9F\x7E\x01\xA0\x08\xF0\xF6\x1C\x7F\x71\x60\xBD\x63\x66\x95\x7B\xE6\x62\x4C\xB3

解密后: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的逻辑如下所示:

israbye FreeBuf.COM

功能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逻辑:

israbye FreeBuf.COM

功能B逻辑,用于等待云端下发代码执行: 

israbye FreeBuf.COM

此次攻击已知使用的通信模块是DNS模块,该后门基于DNS隧道技术进行通信:

ID 名称 作用
1   空指针
2 GetConObj 返回自定义对象,DNS通信时使用
3 Start 发送初始化数据包,开启线程等待数据结束
4 Recv 接受消息,有客户端连接时设置Event1
5 Send 发送消息,有客户端连接时设置Event2
6 SendShutdown 发送shutdown数据包
7 CloseConnect 关闭连接

该模块发送的数据包有3种类型:

1.初始化数据包,大小为0x18

israbye FreeBuf.COM

2.Data数据包,大小0x8+

israbye FreeBuf.COM

3.关闭数据包, 大小0x8

israbye FreeBuf.COM    

其发送函数如下:

 israbye FreeBuf.COM

israbye FreeBuf.COM

israbye FreeBuf.COM

在调用DNS模块2号函数返回自定义对象时,其调用了GetAdaptersAddresses获取适配器的DNS

 israbye FreeBuf.COM

 总结 总结最多收集0x10个DNS,随后在调用该模块第3号函数时,其使用收集到的DNS,合并Config文件中的4个DNS地址,循环往每一个DNS发送查询,等到到任何一个返回数据,或者超时,并记录下第一个返回应答的DNS数据包,以后再次发送的时候,只会给第一个返回应答的DNS发送数据。

 israbye FreeBuf.COM

israbye FreeBuf.COM

在发送数据包时,会将数据嵌套到DNS协议中发送,其中数据会编码成特定的字符串,添加在要配置文件中的CC DNS URL前,实现DNS隧道通讯。

israbye FreeBuf.COM

总结

通过技术分析,我们发现“XshellGhost”(xshell幽灵)是一整套复杂的模块化的精密木马病毒,这是一起黑客入侵供应链软件商后进行的有组织有预谋的大规模定向攻击,我们仍将会持续关注此次攻击的进一步发展,建议广大用户使用360安全卫士查杀“XshellGhost”(xshell幽灵)木马病毒和防御供应链软件攻击。

360追日团队(Helios Team)

360 追日团队(HeliosTeam)是360科技集团下属的高级威胁研究团队,从事APT攻击发现与追踪、互联网安全事件应急响应、黑客产业链挖掘和研究等工作。团队成立于2014年12月,通过整合360公司海量安全大数据,实现了威胁情报快速关联溯源,独家首次发现并追踪了三十余个APT组织及黑客团伙,大大拓宽了国内关于黑客产业的研究视野,填补了国内APT研究的空白,并为大量企业和政府机构提供安全威胁评估及解决方案输出。

已公开APT相关研究成果

发布时间 报告名称 组织编号 报告链接
2015.05.29 海莲花:数字海洋的游猎者 持续3年的网络空间威胁 APT-C-00 http://zhuiri.360.cn/report/index.php/2015/05/29/apt-c-00/
2015.12.10 007黑客组织及地下黑产活动分析报告   https://ti.360.com/upload/report/file/Hook007.pdf
2016.01.18 2015年中国高级持续性威胁APT研究报告 http://zhuiri.360.cn/report/index.php/2016/01/18/apt2015/
2016.05.10 洋葱狗:交通能源的觊觎者 潜伏3年的定向攻击威胁 APT-C-03 http://zhuiri.360.cn/report/index.php/2016/05/10/apt-c-03/
2016.05.13 DarkHotel定向攻击样本分析 APT-C-06 http://bobao.360.cn/learning/detail/2869.html
2016.05.30 美人鱼行动:长达6年的境外定向攻击活动揭露 APT-C-07 http://zhuiri.360.cn/report/index.php/2016/05/30/apt-c-07/
2016.06.03 SWIFT之殇:针对越南先锋银行的黑客攻击技术初探   http://bobao.360.cn/learning/detail/2890.html
2016.07.01 人面狮行动 中东地区的定向攻击活动 APT-C-15 http://zhuiri.360.cn/report/index.php/2016/07/01/apt-c-15/
2016.07.21 台湾第一银行ATM机“自动吐钱” 事件分析   http://bobao.360.cn/news/detail/3374.html
2016.08.04 摩诃草组织 来自南亚的定向攻击威胁 APT-C-09 http://zhuiri.360.cn/report/index.php/2016/08/04/apt-c-09/
2016.08.09 关于近期曝光的针对银行SWIFT系统攻击事件综合分析   http://zhuiri.360.cn/report/index.php/2016/08/25/swift/
2016.11.15 蔓灵花攻击行动(简报)   http://zhuiri.360.cn/report/index.php/2016/11/04/bitter/

*本文作者:360追日团队(邮箱:360zhuiri@360.cn),转载请注明FreeBuf.COM

未经允许不得转载:安全路透社 » Xshellghost技术分析 – 入侵感染供应链软件的大规模定向攻击

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册