[ English ]
[ English ]
安天安全研究与应急处理中心(Antiy CERT)
报告初稿完成时间:2014年1月15日 16时43分
首次发布时间:2016年11月4日 10时00分
本版本更新时间:2016年11月5日 15时30分
安天从2015年2月起,陆续公布了两篇针对方程式攻击组织的分析报告[1][2],分析了其针对Windows平台的恶意代码组件构成、对硬盘的持久化能力和对加密算法的使用。本报告则将首次公布安天对方程式攻击组织针对Solaris平台和Linux平台的部分样本分析,我们也可以自豪地说,这是业内首次正式证实这些“恶灵”真实存在的公开分析。事实上,安天的相关工作完成于数年前。安天的分析工程师们从2012年起,已经关注到超级攻击组织力图将其载荷能力覆盖一切可以达成入侵和持久化的场景。在这些场景中,各种服务器操作系统,如Linux、Solaris、FreeBSD等更是其高度关心的目标。这些载荷不是寻常的脚本木马,而是组件化、具备Rootkit能力、具有超强加密抗分析能力、严格进行加密通讯的二进制组件。在安天工程师一直将类似超级攻击组织发起的攻击称为A2PT,并把恶意代码载荷的全平台覆盖能力作为A2PT组织的重要标志。安天在2016年5月的中国网络安全年会[3]和7月的阿里安全峰会[4]上所做的同名报告《熊猫的伤痕-中国遭遇的APT攻击》[5]中,对方程式组织的多平台载荷能力进行了初步披露。
安天将长期跟踪分析高级威胁和高级恶意代码的经验转化为产品能力,通过探海威胁检测系统协助用户在网络中捕获载荷投放与横向移动,利用智甲终端防御系统为传统Windows主机和国产操作系统提供全面保护,使用追影安全分析平台协助用户进行多种平台的恶意代码分析。通过这些产品的部署也使安天能够在用户支持下获取更多的威胁线索。同时安天也积极关注开源情报和公开信息,关注涉及相关组织的信息与动向。
在去年年初卡巴斯基和安天先后对方程式组织使用的恶意代码进行分析曝光后,方程式组织又在一系列“爆料”事件中浮出水面。在2016年8月所外泄的方程式组织针对多种防火墙和网络设备的攻击代码中[6],公众第一次把方程式组织和名为“ANT”的攻击装备体系联系起来,并以此看到其针对Cisco、Juniper、Fortinet等防火墙产品达成注入和持久化的能力。而在2016 年 10 月 31 日,发布文章“Shadow Brokers reveals list of Servers Hacked by the NSA” [7],文章披露了“影子经纪人”公开的更多文件,其中包括部分方程式组织入侵的外国服务器列表。相关文件声称,大部分被感染的服务器运行的是 Solaris,Oracle-owned Unix等版本的操作系统,有些运行的是 FreeBSD 或 Linux 系统。而随着这些信息与安天的捕获分析工作相互印证,一个关于这个超级攻击组织的几乎无死角的、全平台化攻击能力已经日趋清晰。
方程式组织采用了工业水准的制式化攻击武器库,安天在此前报告中已经对其6件恶意代码组件“装备”进行了分析,他们分别是:EquationLaser、EquationDrug、DoubleFantasy、TripleFantasy、Fanny和GrayFish,其中EquationDrug、DoubleFantasy安天均已发现其他平台的样本。方程式武器库信息见下表:
组件名称
|
多平台特性
|
组件说明
|
使用时间
|
EquationLaser
|
尚未发现
|
方程式组织早期使用的植入程序,大约在2001至2003年间被使用。兼容Windows 95/98系统。
|
2001-2003
|
EquationDrug
|
部分插件已经证实 |
该组织使用的一个非常复杂的攻击组件,用于支持能够被攻击者动态上传和卸载的模块插件系统。怀疑是EquationLaser的升级版。
|
2003-2013
|
DoubleFantasy
|
已经发现
|
一个验证式的木马,旨在确定目标为预期目标。如果目标被确认,那么已植入恶意代码会升级到一个更为复杂的平台,如EquationDrug或GrayFish。
|
2004-2012
|
TripleFantasy
|
推测存在
|
全功能的后门程序,有时用于配合GrayFish使用。看起来像是DoubleFantasy的升级版,可能是更新的验证式插件。
|
2012-至今
|
Fanny
|
尚未发现
|
创建于2008年的利用USB设备进行传播的蠕虫,可攻击物理隔离网络并回传收集到的信息。Fanny被用于收集位于中东和亚洲的目标的信息。一些受害主机似乎已被投放DoubleFantasy,然后又升级为EquationDrug。Fanny利用了两个后来被应用到Stuxnet中的0day漏洞。
|
2008-2011
|
GrayFish
|
尚未发现
|
方程式组织中最复杂的攻击组件,完全驻留在注册表中,依靠bootkit在操作系统启动时执行。
|
2008-至今
|
读者可以通过阅读下列报告,自己完成方程式攻击组织针对多平台操作系统的拼图:
信息
|
Windows
|
Linux
|
Solaris
|
Oracle-owned
Unix
|
FreeBSD
|
Mac
OS
|
安天:修改硬盘固件的木马 探索方程式(EQUATION)组织的攻击组件 |
分析样本载荷和硬盘持久化能力
|
|
|
|
|
|
安天:方程式(EQUATION)部分组件中的加密技巧分析 |
分析加密算法
|
|
|
|
|
|
安天:EQUATION攻击组织的全平台载荷能力解析(本报告) |
|
曝光存在,分析相关载荷
|
分析相
关载荷
|
|
|
|
The Hacker News:《Shadow Brokers reveals list of Servers Hacked by the NSA》 |
|
|
曝光存在
|
曝光存在
|
曝光存在
|
|
卡巴斯基:Equation:The Death Star of Malware Galaxy[8] |
揭秘方程式攻击组织
|
|
|
|
|
|
卡巴斯基:A Fanny Equation: "I am your father, Stuxnet"[9] |
Fanny组件分析
|
|
|
|
|
|
卡巴斯基:Equation Group: from Houston with love[[10] |
Doublefantasy分析
|
|
|
|
|
|
卡巴斯基:《EQUATION GROUP: QUESTIONS AND ANSWERS》[11] |
方程式组织问与答
|
|
|
|
|
根据网络特征提出猜测
|
注:安天在Solaris样本中分析出的User Agent具有Solaris标识,而卡巴斯基在“EQUATION GROUP: QUESTIONS AND ANSWERS” [11]中披露出曾捕获到Mac OS X的User Agent的信息,由此来看,尽管安天和卡巴斯基等厂商目前都尚未捕获Mac OS X的样本,但方程式组织针对MAC OS X的攻击载荷是真实存在的。
安天已经捕获分析了Linux下的DoubleFantasy组件。该组件是方程式组织在Linux平台上用于前期侦查、探测预期目标的攻击样本。由于是Linux平台下的样本,在具体功能实现的技术细节上与我们之前的曝光的Windows样本有所区别。
病毒名称
|
Trojan/Linux.DoubleFantasy
|
原始文件名
|
████████
|
MD5
|
████████████████
|
处理器架构
|
X86(32位平台)
|
文件大小
|
████████
|
文件格式
|
BinExecute/ELF
|
时间戳
|
N/A
|
数字签名
|
无
|
加壳类型
|
无
|
编译语言
|
C语言
|
Trojan/Linux.DoubleFantasy 样本执行时分为有参数和无参数两种情况,当有参数‘-c’时候,仅仅是用于获取系统信息,可以视为场景侦查功能,其流程如下:
图 1 Trojan/Linux.DoubleFantasy–c参数流程
如果样本以无参数运行会具有网络通信行为,流程如下:
图 2 Trojan/Linux.DoubleFantasy无参数运行流程
图 3收集常规系统信息
图 4 子进程判断
此样本所调用的函数和数据都是动态加载调用,在分析中需要动态调试,经过分析我们把函数调用地址通过动态分析解密出来如下图:
图 5 函数调用地址
样本内部采用了一种自定义的加密算法,用于加密内部要用到的字符串信息,该算法共被调用了115次,加密算法如下:
图 6 Linux样本字符串加密算法
DoubleFantasy的Linux样本在网络通信时,硬编码在样本中的16位密钥与DoubleFantasy在Windows平台样本中加密注册表相关数据的16位密钥相同:
66 39 71 3c 0f 85 99 81 20 19 35 43 fe 9a 84 11
经计算后生成的子密钥为:
E9 BE CD E0 A8 9F 4D DB C3 42 AC 2B 24 77 AB CB 5A C1 52 F8 5B 3E F0 78 CB 01 0A 69 29 8F 85 8C 03 9C 7C EF 5E 36 0E 8B C0 40 76 28 9C 9C F2 24 81 9D 02 72 4F 6A BB B5 5B 42 73 14 88 F2 73 75 8B F9 37 98 3B 9F 64 2B A3 C4 FF C7 8A 40 67 C1 25 9F 65 54 45 36 48 FF E2 86 05 1A F4 94 AC 2B 08 D5 E5 83 BE 2C AD EE D0 A6 98 CB 8D 35 ED EE C4 F0 8C F2 CD BA 87 03 54 27 3D 13 A7 9B 6A 05 C7 02 30 21 05 67 58 3B E6 A1 44 0A 37 16 3C 86 E9 BC 8B 20 1A 98 7E 28 E6 7F F7 CA F7 9E 38 31 7F F0 2F 93 11 2B 28 F0 FF 11 B7 FC 1C 63 86 CB
Linux样本的自定义算法与Windows下的样本相同,而使用的加密密钥只有一个(因为Linux系统没有注册表,所以就没有注册表加密这功能),该密钥与Windows平台下注册表加密数据的Key相同(Windows平台有两组key,一组注册表key一组网络通讯key),从下图中可以看出两个平台的二级密钥变化算法是相同的(具体算法可以参照Windows加密算法分析部分)。
图 7 二级密钥变化算法
Linux样本的指令分支部分与安天此前所发布的报告中分析的Windows部分基本相同,Linux样本共有9个分支指令,功能也大致相同,指令代码分别为:0x4A、0x4B、0x60、0x70、0x75、0x76、0x78、0x79、0x80。
图 8 Linux样本的指令分支代码
Linux系统下的样本在指令上与Windows样本功能一致,仅在获取系统信息上有细微差别,Linux样本获取信息格式如图:
图 9 Linux样本获取信息格式
获取信息格式说明:
标号
|
说明
|
标号
|
说明
|
标号
|
说明
|
000
|
MAC地址
|
033
|
平台类型如(i386\i686)
|
042
|
操作系统(Ubuntu)
|
001
|
IP地址
|
034
|
系统内核版本
|
043
|
区域语言(zh_cn.utf8)
|
002
|
样本版本号
|
035
|
操作系统类型时间
|
044
|
未知
|
003
|
样本clsid
|
036
|
未知
|
045
|
系统运行时间
|
004
|
代理设置信息
|
037
|
未知
|
046
|
未知
|
005
|
未知
|
038
|
PST
|
047
|
未知
|
030
|
用户名
|
039
|
未知
|
048
|
样本名称
|
031
|
密码
|
040
|
时间
|
|
|
032
|
操作系统类型如(Linux)
|
041
|
时间
|
|
|
方程式组织可能制造了第一个SPARC架构[9]下的具有Rootkit属性的恶意代码,并为DoubleFantasy的Solaris[10]版本来提供掩护。
Solaris是Sun Microsystems研发的计算机操作系统,采用SPARC架构或X86架构,主要用于工作站、服务器上的操作系统。Solaris平台下的恶意代码比较罕见,从安天统计来看,即使加上之前的SUN OS时期,二进制编译形态的恶意代码变种数也不超过60种,而且几乎都是基于X86平台的。
SPARC全称为“可扩充处理器架构”(Scalable Processor ARChitecture),是RISC微处理器架构之一,其指令集和X86有显著区别,并且有自己独有的窗口、延迟槽、过程调用特点。
SPARC架构的计算机一般用于工业、航天、科研等相关领域,其在类似IDC和一般IT场景的使用较为罕见。
该模块是SPACR架构的Solaris平台下的一个Rootkit程序,同其他Rootkit程序一样,它主要负责隐藏主功能样本文件、以及相关衍生的文件和其自身,包括进程、文件、和服务信息。它首先在目标机器上运行,侦查目标机器的系统环境、配置信息、网络状态,并隐藏指定的文件和进程。
病毒名称
|
Trojan[Rootkit]/Solaris. Equation
|
原始文件名
|
████████
|
MD5
|
████████████████
|
处理器架构
|
SPARC(32位平台)
|
文件大小
|
████████
|
文件格式
|
BinExecute/ELF
|
时间戳
|
N/A
|
数字签名
|
无
|
加壳类型
|
无
|
编译语言
|
C语言
|
样本共有249个函数,如图所示为样本主函数流程,部分函数也相对复杂,且样本内部同样存在多种加密数据。
图 10 样本主函数
样本运行后根据内部配置的两组字符串组合生成文件名,作为自身的新文件名,并将自身复制到/sbin/目录下。
字符串1
|
字符串2
|
audit
|
admr
|
boot
|
agent
|
cache
|
conf
|
core
|
client
|
cron
|
info
|
init
|
mgr
|
inet
|
statd
|
filesys
|
serv
|
通过上表可以发现,这些单词都是系统文件、系统命令中使用的高频单词或前后缀。因此样本的文件名称是经过精心构造的,文件名极具迷惑性,换在系统文件中,一般的管理员也难以察觉异样。
样本使用服务的方式实现开机启动,在etc/rc.d/目录下创建脚本(S85s%),此脚本会作为开机要执行的服务以start参数运行。
图 11 服务脚本
S85s%文件的内容是加密的,样本运行时调用自身函数解密,并修改其中文件名的变量,再将其写入到/etc/rc.d/目录(下图%E处会修改为样本自身路径)。
图 12 解密后脚本内容
样本会根据目标机器的HOSTID生成MD5,然后再将MD5进行一个类base64的算法计算,最后取前6位,将.tmp与这6位字符拼接成文件夹名称,然后创建该文件夹。
图 13 样本创建的文件夹名
样本还会根据运行参数,将其他文件复制到此文件夹下执行,并负责隐藏此文件夹下的所有文件。
样本通过uname函数确定系统不是sun4m、sun4d版本,通过读取/dev/ksyms文件判断系统架构:i386、ia64、sparc、sparcv9,确定是SPARC架构,确定release版本必须是5.1。
图 14 版本判定
样本内部存在多处加密算法,其中一个调用多次,我们分析并解密出其数据。
图 15 加密算法
解密的加密数据:
偏移
|
明文
|
偏移
|
明文
|
0x10cd0
|
/platform/%s/kernel/sparcv9/unix
|
0x11830
|
mgr
|
0x10cf8
|
/var/sadm/i
|
0x11838
|
statd
|
0x10d28
|
SUNW
|
0x11840
|
serv
|
0x10d30
|
/var/sadm/patch/%s/README.%s
|
0x11848
|
svcd
|
0x10d50
|
var/sadm/pkg/%s/pkginfo
|
0x11851
|
\
|
0x10d70
|
PATCHLIST
|
0x11855
|
\W
|
0x10d80
|
/var/sadm/pkg/%s/pkginfo
|
0x11859
|
\O
|
0x10da0
|
PATCH_INFO
|
0x1185d
|
\G
|
0x10db8
|
Requires:
|
0x11861
|
\w
|
0x10dc8
|
Ob
|
0x11865
|
\o
|
0x10dcc
|
!8I 秨;
|
0x11869
|
\g
|
0x10dd8
|
Incompatibles:
|
0x1186d
|
\
|
0x10df0
|
module_main
|
0x11871
|
\
|
0x10e10
|
%s/%s
|
0x11878
|
audit
|
0x10e18
|
date
|
0x11880
|
boot
|
0x10e20
|
/etc/mnttab
|
0x11888
|
cache
|
0x10e38
|
swap
|
0x11890
|
core
|
0x10e40
|
tmpfs
|
0x11898
|
cron
|
0x10e48
|
ro
|
0x118a0
|
init
|
0x10e50
|
noexec
|
0x118a8
|
inet
|
0x10e60
|
D
|
0x118b0
|
filesys
|
0x10e68
|
sun4m
|
0x118c0
|
key
|
0x10e70
|
sun4d
|
0x118c8
|
ntp
|
0x10e78
|
sparc
|
0x118d0
|
root
|
0x10e80
|
/dev/ksyms
|
0x118d8
|
sys
|
0x10e98
|
sparc
|
0x118e0
|
rpcd
|
0x10ea0
|
i386
|
0x118e8
|
vol
|
0x10ea8
|
sparcv
|
0x11940
|
/
|
0x10eb8
|
ia64
|
0x11948
|
/usr/bin/
|
0x10ec0
|
sparc
|
0x11958
|
/bin/
|
0x10ec8
|
SunOS
|
0x11960
|
/sbin/
|
0x10ed0
|
Generic
|
0x11970
|
var/tmp/faipprep001
|
0x10ee0
|
boothowto
|
0x11990
|
init
|
0x10ef8
|
/dev/ksyms
|
0x11998
|
fini
|
0x10f08
|
/dev/kmem
|
0x119a0
|
minit
|
0x116d0
|
/var/tmp/
|
0x119a8
|
fini
|
0x116e0
|
/lib/
|
0x119b0
|
mdata
|
0x116e8
|
/dev/
|
0x119b8
|
priocntlsys
|
0x116f0
|
/etc/
|
0x119c8
|
/dev/ksyms
|
0x116f8
|
/
|
0x119d8
|
init
|
0x11700
|
%s.tmp%6s
|
0x119e0
|
/dev/kmem
|
0x11710
|
#!/sbin/sh
|
0x119f0
|
/dev/mem
|
0x11800
|
admr
|
0x11a00
|
/proc/self
|
0x1180a
|
NCk
|
0x11a10
|
.got
|
0x11810
|
conf
|
0x11a18
|
.got
|
0x11818
|
client
|
0x11a28
|
.got
|
0x11828
|
info
|
0x11a30
|
GLOBAL_OFFSET_TABLE_
|
样本在文件尾部添加加密数据,执行后通过末尾数据确定加密数据大小,通过定义的格式进行解析和读取,解密数据后猜测会加载执行。
该样本与Windows、Linux平台样本的功能基本相同,主要区别在于CPU架构、汇编指令、配置信息存储位置、获取系统信息等。
病毒名称
|
Trojan/Solaris.DoubleFantasy
|
原始文件名
|
████████
|
MD5
|
████████████████
|
处理器架构
|
SPARC(32位平台)
|
文件大小
|
████████
|
文件格式
|
BinExecute/ELF
|
时间戳
|
N/A
|
数字签名
|
无
|
加壳类型
|
无
|
编译语言
|
C语言
|
由于Solaris系统没有Windows的注册表,因此该样本的配置数据会直接解密后使用,其中一个解密算法如下,该解密函数共调用63次。
图 16 字符串解密
解密出字符串信息见下表:
偏移
|
明文
|
偏移
|
明文
|
0x1346c
|
' 200 Connection established'
|
0x13560
|
'Content-Length:'
|
0x13470
|
' 200 OK'
|
0x13458
|
'Content-Length: %d'
|
0x133fc
|
' days '
|
0x13460
|
'Content-length: %d'
|
0x13400
|
' hrs '
|
0x13488
|
'Cookie: %s'
|
0x13540
|
' HTTP/1.1\r\n'
|
0x13554
|
'GET '
|
0x1340c
|
' logged in'
|
0x13544
|
'Host: '
|
0x13404
|
' mins '
|
0x13474
|
'HTTP/'
|
0x13408
|
' total'
|
0x13478
|
'HTTP/1.0 200 OK'
|
0x133f4
|
' yrs '
|
0x13534
|
'http://'
|
0x133d8
|
'"'
|
0x13384
|
'I_MASK'
|
0x13584
|
'%02x-%02x-%02x-%02x-%02x-%02x'
|
0x133ec
|
'LANG'
|
0x13594
|
'%u.%u.%u.%u'
|
0x133f0
|
'LANGUAGE'
|
0x134dc
|
'/.mozilla/'
|
0x133c0
|
'LD_PRELOAD='
|
0x134e0
|
'/.mozilla/firefox/'
|
0x13418
|
'M_MASK'
|
0x134c4
|
'/.netscape'
|
0x133e4
|
'MACHTYPE'
|
0x13438
|
'/bin/false'
|
0x134b4
|
'network.proxy.http'
|
0x13520
|
'/bin/false'
|
0x134b8
|
'network.proxy.http_port'
|
0x1338c
|
'/dev/null'
|
0x134bc
|
'network.proxy.ssl'
|
0x133b0
|
'/dev/null'
|
0x134c0
|
'network.proxy.ssl_port'
|
0x134c8
|
'/preferences.js'
|
0x1348c
|
'p'
|
0x134cc
|
'/prefs.js'
|
0x133b8
|
'PATH'
|
0x13428
|
'/proc'
|
0x133bc
|
'PATH='
|
0x1343c
|
'/sbin/nologin'
|
0x1355c
|
'POST '
|
0x13524
|
'/sbin/nologin'
|
0x13410
|
'process info: '
|
0x13390
|
'/tmp/'
|
0x1354c
|
'Proxy-Connection:
close\r\n'
|
0x133b4
|
'/tmp/'
|
0x134d8
|
'S'
|
0x135a0
|
'@C\xe3\xc0'
|
0x1353c
|
'S'
|
0x13558
|
'\r\n'
|
0x133c4
|
'sendmail'
|
0x13464
|
'\r\n\r\n'
|
0x13484
|
'SESSID="0%x%s%x:eac:%lu:%lu"\r\n'
|
0x13588
|
'0x%02x%02x%02x%02x%02x%02x'
|
0x1349c
|
'user_pref("'
|
0x1341c
|
'0xA857'
|
0x134a0
|
'user_pref("%s"
|
0x13388
|
'0xAA%llu'
|
0x134a8
|
'user_pref("%s%s'
|
0x13568
|
'CONNECT '
|
0x134f8
|
'v'
|
0x13550
|
'Connection: close\r\n'
|
0x13548
|
'y"'
|
0x13454
|
'Content-Length:'
|
0x1347c
|
'y"y"'
|
0x1345c
|
'Content-length:'
|
|
|
样本使用的另一个加密字符串的算法,用于加密样本运行时需要使用的配置信息,解密算法如下:
图 17 另一解密算法
解密内容见下表:
偏移
|
明文
|
偏移
|
明文
|
0x13c12
|
'www.google.com'
|
0x1439b
|
'ntp'
|
0x13d11
|
'www.yahoo.com'
|
0x143ac
|