从“方程式”到“方程组”

EQUATION攻击组织高级恶意代码的全平台能力解析

安天安全研究与应急处理中心(Antiy CERT)

报告初稿完成时间:2014年1月15日 16时43分
首次发布时间:2016年11月4日 10时00分
本版本更新时间:2016年11月5日 15时30分

PDF报告下载

1 背景

安天从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 系统。而随着这些信息与安天的捕获分析工作相互印证,一个关于这个超级攻击组织的几乎无死角的、全平台化攻击能力已经日趋清晰。

我们的分析工作不断验证着这些信息,在过去数年,这种分析如此漫长、复杂和艰难,超出了我们之前对“震网”、“火焰”的分析和复现中所面临的挑战。这种高度复杂、隐蔽的全能高级恶意代码,无论是对受害者,还是分析者来说,都是一个巨大的挑战。特别是当其打击范围几乎覆盖所有体系结构与操作系统的时候,相对更擅长Windows、Linux和Android等主流操作系统平台下恶意代码分析的传统安全分析团队感受到了巨大的压力和挑战。如果用这个组织的名称“方程式”做一个关于分析难度的比喻的话,我们需要破解的已经并不只是一个“方程式”,而是更为复杂的多元多次的“方程组”

2 方程式组织的多平台作业能力

方程式组织采用了工业水准的制式化攻击武器库,安天在此前报告中已经对其6件恶意代码组件“装备”进行了分析,他们分别是:EquationLaser、EquationDrug、DoubleFantasy、TripleFantasy、Fanny和GrayFish,其中EquationDrug、DoubleFantasy安天均已发现其他平台的样本。方程式武器库信息见下表:

组件名称

多平台特性

组件说明

使用时间

EquationLaser

尚未发现

方程式组织早期使用的植入程序,大约在20012003年间被使用。兼容Windows 95/98系统。

2001-2003

EquationDrug

部分插件已经证实

该组织使用的一个非常复杂的攻击组件,用于支持能够被攻击者动态上传和卸载的模块插件系统。怀疑是EquationLaser的升级版。

2003-2013

DoubleFantasy

已经发现

一个验证式的木马,旨在确定目标为预期目标。如果目标被确认,那么已植入恶意代码会升级到一个更为复杂的平台,如EquationDrugGrayFish

2004-2012

TripleFantasy

推测存在

全功能的后门程序,有时用于配合GrayFish使用。看起来像是DoubleFantasy的升级版,可能是更新的验证式插件。

2012-至今

Fanny

尚未发现

创建于2008年的利用USB设备进行传播的蠕虫,可攻击物理隔离网络并回传收集到的信息。Fanny被用于收集位于中东和亚洲的目标的信息。一些受害主机似乎已被投放DoubleFantasy,然后又升级为EquationDrugFanny利用了两个后来被应用到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的攻击载荷是真实存在的。

3 X86 Linux部分载荷分析

安天已经捕获分析了Linux下的DoubleFantasy组件。该组件是方程式组织在Linux平台上用于前期侦查、探测预期目标的攻击样本。由于是Linux平台下的样本,在具体功能实现的技术细节上与我们之前的曝光的Windows样本有所区别。

3.1 侦查、探测的前导模块——DoubleFantasy

3.1.1文件标签

病毒名称

Trojan/Linux.DoubleFantasy

原始文件名

████████

MD5

████████████████

处理器架构

X8632位平台)

文件大小

████████

文件格式

BinExecute/ELF

时间戳

N/A

数字签名

加壳类型

编译语言

C语言

3.1.2运行流程

Trojan/Linux.DoubleFantasy 样本执行时分为有参数和无参数两种情况,当有参数‘-c’时候,仅仅是用于获取系统信息,可以视为场景侦查功能,其流程如下:

图 1 Trojan/Linux.DoubleFantasy–c参数流程

如果样本以无参数运行会具有网络通信行为,流程如下:

图 2 Trojan/Linux.DoubleFantasy无参数运行流程

3.1.3 基本功能

  • 遍历系统文件、清除/var/log/lastlog记录、获取系统账户密码信息。
  • 连接Google判断网络连通状态。
  • 连接远程服务器,并根据远程控制指令进行不同的操作。
  • 样本中同样存在多处信息加密算法和网络通讯加密算法。
  • 样本会利用一个链接文件启动自身,proc/%d/exe文件指向样本自身文件。
  • 样本运行后会开启三个连续的PID线程。
  • 随后样本收集被感染机器的信息包括系统目录、文件扩展名等信息。如下图:

    图 3收集常规系统信息

  • 恶意代码开始fork( )进程,并判断fork( )的子进程的PID号,判断是否执行成功,如果执行成功则主进程退出,无法调试,影响调试过程如下图所示:

    图 4 子进程判断

  • 分别解密各种字符串,获取用户信息,包括系统版本等。
  • 获取用户登陆信息 getpwnam。
  • 查看文件 /bin/fast  /sbin/login /usr/sbin/nologin 。
  • 获取用户登陆密码getpwuid。
  • 读取用户日志var/log /lastlog。

3.1.4 函数、数据动态加载

此样本所调用的函数和数据都是动态加载调用,在分析中需要动态调试,经过分析我们把函数调用地址通过动态分析解密出来如下图:

图 5 函数调用地址

3.1.5 字符串解密分析

样本内部采用了一种自定义的加密算法,用于加密内部要用到的字符串信息,该算法共被调用了115次,加密算法如下:

图 6  Linux样本字符串加密算法

3.1.6 网络通信加密

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 二级密钥变化算法

3.1.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

时间

 

 

4 SPARC架构Solaris场景能力

方程式组织可能制造了第一个SPARC架构[9]下的具有Rootkit属性的恶意代码,并为DoubleFantasy的Solaris[10]版本来提供掩护。

4.1 Solaris系统及SPARC架构

Solaris是Sun Microsystems研发的计算机操作系统,采用SPARC架构或X86架构,主要用于工作站、服务器上的操作系统。Solaris平台下的恶意代码比较罕见,从安天统计来看,即使加上之前的SUN OS时期,二进制编译形态的恶意代码变种数也不超过60种,而且几乎都是基于X86平台的。
SPARC全称为“可扩充处理器架构”(Scalable Processor ARChitecture),是RISC微处理器架构之一,其指令集和X86有显著区别,并且有自己独有的窗口、延迟槽、过程调用特点。
SPARC架构的计算机一般用于工业、航天、科研等相关领域,其在类似IDC和一般IT场景的使用较为罕见。

4.2 Rootkit隐藏模块

该模块是SPACR架构的Solaris平台下的一个Rootkit程序,同其他Rootkit程序一样,它主要负责隐藏主功能样本文件、以及相关衍生的文件和其自身,包括进程、文件、和服务信息。它首先在目标机器上运行,侦查目标机器的系统环境、配置信息、网络状态,并隐藏指定的文件和进程。

4.2.1文件标签

病毒名称

Trojan[Rootkit]/Solaris. Equation

原始文件名

████████

MD5

████████████████

处理器架构

SPARC32位平台)

文件大小

████████

文件格式

BinExecute/ELF

时间戳

N/A

数字签名

加壳类型

编译语言

C语言

4.2.2 样本主函数

样本共有249个函数,如图所示为样本主函数流程,部分函数也相对复杂,且样本内部同样存在多种加密数据。

图 10 样本主函数

4.2.3衍生文件名及路径

样本运行后根据内部配置的两组字符串组合生成文件名,作为自身的新文件名,并将自身复制到/sbin/目录下。

字符串1

字符串2

audit           

admr

boot

agent

cache

conf

core

client

cron

info

init

mgr

inet

statd

filesys

serv

通过上表可以发现,这些单词都是系统文件、系统命令中使用的高频单词或前后缀。因此样本的文件名称是经过精心构造的,文件名极具迷惑性,换在系统文件中,一般的管理员也难以察觉异样。

4.2.4 启动脚本

样本使用服务的方式实现开机启动,在etc/rc.d/目录下创建脚本(S85s%),此脚本会作为开机要执行的服务以start参数运行。

图 11 服务脚本

S85s%文件的内容是加密的,样本运行时调用自身函数解密,并修改其中文件名的变量,再将其写入到/etc/rc.d/目录(下图%E处会修改为样本自身路径)。

图 12 解密后脚本内容

4.2.5 隐藏目录、文件

样本会根据目标机器的HOSTID生成MD5,然后再将MD5进行一个类base64的算法计算,最后取前6位,将.tmp与这6位字符拼接成文件夹名称,然后创建该文件夹。

图 13 样本创建的文件夹名
样本还会根据运行参数,将其他文件复制到此文件夹下执行,并负责隐藏此文件夹下的所有文件。

4.2.6 版本判断

样本通过uname函数确定系统不是sun4m、sun4d版本,通过读取/dev/ksyms文件判断系统架构:i386、ia64、sparc、sparcv9,确定是SPARC架构,确定release版本必须是5.1。

图 14 版本判定

4.2.7 加密配置数据

样本内部存在多处加密算法,其中一个调用多次,我们分析并解密出其数据。

图 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_

4.2.8 解密执行其他代码/样本

样本在文件尾部添加加密数据,执行后通过末尾数据确定加密数据大小,通过定义的格式进行解析和读取,解密数据后猜测会加载执行。

4.3 DoubleFantasy的Sparc架构模块

该样本与Windows、Linux平台样本的功能基本相同,主要区别在于CPU架构、汇编指令、配置信息存储位置、获取系统信息等。

4.3.1 文件标签

病毒名称

Trojan/Solaris.DoubleFantasy

原始文件名

████████

MD5

████████████████

处理器架构

SPARC32位平台)

文件大小

████████

文件格式

BinExecute/ELF

时间戳

N/A

数字签名

加壳类型

编译语言

C语言

4.3.2 基本功能

  • 初始化字符串、动态数组,解密内部配置信息。
  • 连接Google或Yahoo网址判断网络连通状态。
  • 连接远程URL地址。样本会收集主机的信息回传至远程地址,并等待远程主机发送指令。
  • 具有读取系统账户密码文件的功能,可以窃取用户及密码信息。
  • 样本内部实现了以守护进程模式运行,可以达到自我保护防止被结束的功能。
  • 该样本采用多种加密算法加密字符串信息。
  • 获取系统大量信息并回传到服务器(如计算机名称、IP地址、进程信息、账户信息等,详细内容可见本章节后面详细分析)。
  • 网络指令部分,具有7条网络指令,功能上与Windows版本相同,可对计算机进行相对应的指令操作,对应指令详细功能见本章后面详细分析。

4.3.3 配置信息加密

由于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