APT28

virustracker · 2015/12/25 14:53html

download.bitdefender.com/resources/m…web

0x00 前言


最初,“高级持续威胁”指的是那些使用很是规木马,攻击特定目标和网络的攻击活动。这类攻击活动的目的是为了长期或秘密地窃取敏感数据。在近几年,APT开始指代由外国政府发动的长期攻击活动,而安全公司或受害者政府会因为害怕经济制裁或政治压力,不肯意指认这些攻击者。另一点缘由是,因为互联网的开放特性,攻击者能够利用技术把罪名嫁祸给他人,从而也难以肯定他们的真实身份。算法

为了肯定攻击活动与其幕后国家之间的联系,Bitdefender这样的企业但愿能在APT代码或通信基础设施中找到切实的证据。下面的这份报告详细地分析了APT28小组使用的有效载荷技术,经过这些信息咱们发现了他们与幕后主事之间的关联。sql

0x01 目标受害者


近期,咱们在分析了Sofacy行动后发现,这个网络小组至关活跃,而且有明确的地区倾向。APT28的主要目标都分布在这几个国家中,包括,乌克兰,西班牙,俄罗斯,罗马尼亚,美国和加拿大。shell

咱们发现,APT28对乌克兰特别有兴趣。在2015年2月10日到14日,APT28小组扫描了8,536,272个IP来寻找可能的漏洞。数据库

巧合的是,在这期间,白俄罗斯、俄罗斯、德国、法国和乌克兰的政治领导们正好在明斯克参加会议,讨论是否中止在乌克兰东部顿巴斯地区的交火行动。api

2月14日以后,APT28小组把目标转向了西班牙。图1中是标出的就是受到影响的国家。安全

目前,咱们尚不清楚APT28会根据什么标准来选择目标,可是咱们研究发现,他们会从预先准备好的IP地址中挑选出有漏洞的几个来进行攻击。同时,咱们还发现,这些目标涉及到了各个行业:政治类、电子犯罪服务类、电信服务或航空行业。bash

更多受害者信息能够在附录1中找到。服务器

p1 图1

0x02 归属判断


咱们有理由相信,APT28的管理者是俄罗斯人,或者是会讲俄语的邻国公民。在分析中,咱们发现了不少证据都能证实咱们的猜想。

咱们第一次分析相关文件的时候,统计了在各个时区下从周一到周五天天8:00-18:00这段时间中编译的二进制数量,结果最突出的就是UTC+4时区,有88%的文件是在这个时区下的工做时间编译的。在这个时区下的国家中(俄罗斯,格鲁吉亚,阿塞拜疆),只有俄罗斯有能力和资源来执行这种攻击行动。

在下图中(图2),咱们根据编译时间,对样本进行了分组(UTC+4)。从图中能够看到,大部分样本是在8:00-18:00编译的。

p2 图2

另外一条线索是从一个用于获取系统权限的黑客工具中找到的。这条线索也能证实咱们的假设-木马做者来自一个说俄语的国家。咱们在查找相关的APT28文件时,发现了这个工具。文件的标头叫作xp.exe (78450806E56B1F224D00455EFCD04CE3),这个文件很特别的地方是,在调试文件中硬编码了一个路径xp.exe (78450806E56B1F224D00455EFCD04CE3)。字符串Пользователь就是为俄罗斯的用户准备的。

咱们有理由相信,这个文件也是APT28开发的,由于这个文件的修改/建立日期被更改成了14/04/2008, 16:00,与APT28在攻击活动中使用的其余文件相同。全部在攻击中使用的文件都是在2013年后编写的。攻击者修改文件的日期是为了防止受害者在系统上发现新文件,避免引发用户的怀疑。

0x03 搜索新目标


咱们发现,有些服务器的主要目的就是为了自动搜索新的受害者。这是经过大规模的扫描和刺探预先肯定好的IP地址范围实现的。服务端应用包括4个主要组件,以下:

  • 一个Python脚本(gen_ip.py),用于随机生成符合特定类的IP地址
  • 一个数据库(shodb),用于集中全部扫描到的数据并筛选潜在受害者
  • 一个Django(sho)应用,用于管理bot和报告

APT没有采起“乱枪打鸟”的方法,而是挑选受害者。这个Python脚本中硬编码了一些IP类;脚本会遍历全部的子网,并随机生成符合范围的IP地址。若是攻击者扫描范围内的全部IP,这样会增长引发用户注意的概率。在随机生成了IP后,这些IP就会被添加到数据库。而后每一个IP地址会给定一个优先级等级。

截止咱们撰写报告时,数据库中总共包含了58,624个相关的IP,具体参考附录1。全部这些IP的优先级都设置为了1。

扫描bot都是相互独立的系统,分布在不一样的网络中。咱们猜想,这种方法能让扫描过程看起来不是那么可疑。若是是来自同一个网络的一个或多个IP来扫描整个子网,可能会引发用户的怀疑,或触发入侵检测系统。

为了完成扫描任务,每一个bot会经过cookie来认证服务器。认证成功后,扫描bot每次请求最多能够接收到16个IP。而后,bot会使用nmap工具(附录1)扫描每一个IP的特定端口。若是找到了开放的端口,bot就会联系服务器,并把nmap获取到的信息保存到数据库中。接着,相应的IP地址就会被标注上“有漏洞”。图3中描述的就是这一过程:

p3 图3

p4

扫描bot的位置分布以下:美国3个,英国3个,保加利亚3个(图5):

p5 图5

0x04 攻击流程


APT28主要依赖3种不一样的攻击途径来感染他们的目标:用恶意Word和Excel文档做为附件的钓鱼邮件,钓鱼网站,会致使Java和Flash 0-day漏洞的恶意iFrame。

客户端一般是由于访问了挂载着漏洞工具的URL,才被感染 。在成功感染后,第一阶段的dropper(在咱们这里是runrun.exe)会写到磁盘上。这个dropper的主要目的是为了投放一个文件(api-ms-win-downlevel-profile-l1-1-0.dll),并使用rundll32.exe执行这个文件。这样作是为了联系CC服务器,并下载第二阶段的木马。

第二阶段的组件会使用和上面相同的方法来安装到客户端上。首先,执行一个dropper(winloat.exe),dropper会把一个关键组件(advstoreshell.dll)和一个配置文件(msd)写到磁盘上。这个配置文件中包含有一些关键信息,好比后门会尝试联系的三个服务器(win*********ore.net ,micro********er.com和1***.net),请求间隔,以及是否启动键盘记录功能的旗帜。

此时,攻击者就已经控制了受害者的机器,而且部署了不一样的工具和组件。在咱们分析的例子中,攻击者下载了3个攻击工具:

  1. 一个用于转储登陆用户密码的工具(run.exe)
  2. 一个利用权限提高漏洞(CVE-2014-4076)获取系统权限的工具(xp.exe)
  3. 一个用做代理,即便路由器系统,也能容许攻击者与系统取得联系的工具(svehost.exe)

另外还有一个组件也是经过下载获取的(pr.dll),这是一个模块化组件,用于把窃取到的数据上传到CC服务器。

p6 图6

攻击流程如图6:

在部署了有效载荷后,攻击者会把第二阶段dropper下载的文件都修改为在14/04/2008, 16:00编写的。经过这种技术,攻击者能够隐藏恶意文件,避免受害者发现磁盘上写入了新文件从而起疑。

下表中列出了各个文件的编译日期和建立日期。

p7 表1

最近的建立日期是13/05/2015,多是攻击活动开始的日期。鉴于从第一阶段downloader到第二阶段downloader写入到磁盘上大约有1小时的间隔,咱们怀疑这个过程是人工操做的。在全部的文件中,只有一个不是在攻击以前编译完成的。“%allusersappdata%\ Pr.dll”是惟一一个在攻击活动开始了5小时后才编写的。由此来看,这个文件是针对目标特地制做的。

0x05 遭到攻击的受害者


咱们发现,遭到攻击的受害者属于不一样的行业和部门。研究代表,受害者主要是政治人物、政府机构、电信和电子犯罪服务,以及德国、乌克兰、俄罗斯和罗马尼亚的航空航天公司。

有些受害者是咱们经过分析中心服务器上的信息肯定的。在这些信息中,包括失窃邮件的踪影。有一部分是咱们的内部系统上报的。

经过在中心服务器上发现的邮件,咱们肯定了前两类受害者。

政治人物

在2015年5月13日,两个.pst文件‘C:\ProgramData\backup.pst’‘C:\ProgramData\backup2.pst’复制到了服务器上。

航空航天业

在2015年7月9日,14个文档复制到了服务器上。在这之中,有两个.dbx (Outlook Express数据库)文件。

在7月18日,“F:\Outlook Express\AC_VTS_ÐÊÒ.dbx”传输到了中心服务器。

一样是在7月18日,“F:\Outlook Express\Kydla.dbx”也传输到了中心服务器。

全部这些受害者彷佛都与航天业或飞行器研究项目有关联。经过上下文,也能看出攻击者可能来自俄罗斯,考虑到媒体也在大量报道俄罗斯的PAK FA T-50战斗机和美国的F-35战斗机。

咱们的内部系统也标记了大量遭到攻击的计算机。在罗马尼亚,这些标记出来的计算机有一部分属于政府基础设施或与罗马尼亚政府有密切关联。

0x06 附录1(目标活动)


经过分析APT28的CC服务器,咱们发现了两起寻找新目标的活动。

在这个过程当中,攻击者根据从数据库中获取的IP地址,扫描了大量IP的端口。端口扫描过程是经过一个免费工具“nmap”实现的。若是找到了开放的端口,这个IP就会被标记为“有漏洞的”,而且会保存相应的信息。探测命令都包括在下图中:

p8 图7

其中:

  • T5:在很短的时间内映射一个主机,前提是你的网络要够快,或者是不介意丢失部分信息。
  • p:扫描特定的端口
  • sV:检测远程服务(服务器/守护进程)的版本号
  • O:识别一个远程主机apps和
  • version-light:启动精简模式,加速扫描过程,可是识别服务的能力会稍微下降
  • script=banner: 显示ftp banner 响应
  • script=http-headers:经过一条HEAD请求web服务器的根文件夹(“/”),并显示返回的HTTP标头
  • oX:把扫描结果记录成XML形式,保存到参数指定的文件
  • iL:根据配置文件而不是命令行来读取目标规范;在配置文件中会包含有主机列表和网络表达

在2015年2月10日,咱们发现了攻击者的首次尝试,扫描了8.762.102的一些IP。在这之中,1.712.363 IP被标记为了“有漏洞”。此次探测活动一直持续到了2月14日。大多数IP都是来自乌克兰(扫描了8.536.272,1.704.837是有漏洞的)。

被扫描的IP数量很庞大,几乎至关于乌克兰的总IP数量。经过搜索在这段时间内发生的与乌克兰相关的重大事件,咱们意识到,此次探测过程是在明斯克峰会期间进行的,在此次峰会上主要讨论了乌克兰欧诺个不顿巴斯地区的冲突问题。在2月11日,白俄罗斯,俄罗斯,德国,法国和乌克兰的领导人在一块儿协商新一轮的和平协议,这一协议于2月12日发布,在2月15日签署。

在下表中(表2),列出了这些活动的目标国家:

p9 表2

在2月14日,一个数据库备份保存到了一个文件(file.csv)中,而且攻击者的关注焦点从乌克兰转向了西班牙。

在2月16日,攻击者又开始尝试寻找新的受害者。新的数据库加载了58,624个新的IP地址,在这之中,有6,146个是有漏洞的。表3中列出了此次活动的目标国家:

p10 表3

在第二次尝试中,扫描的IP范围很小,咱们猜想此次攻击活动多是有具体的目标机构。经过分析目标IP范围,咱们肯定了一些受害者。

咱们尚不清楚,攻击者是根据什么标准来肯定目标,可是咱们猜想攻击目标是人工肯定对的,而不是经过自动方式完成。

0x07 附录2-探测过程


目标筛选过程是经过中心CC服务器管理的多个bot完成的。行动流程能够分为下面的几个过程:

  1. 生成新受害者

    潜在受害者是经过扫描不一样子网的IP端口来肯定的。这些IP列表是经过脚本gen_ip.py生成的,这个脚本会经过IP类别或随机选择IP来探测其端口。在写报告时,这个脚本硬编码了11个IP类,因此,咱们认为受害者组织是人工选择的。

    这个脚本会随机生成整数数字,这些数字表明了属于不一样类的IP。事实上,这个脚本不会遍历全部的IP,这就代表,攻击者采起了预防措施,避免触发受害者的入侵检测系统-由于扫描一个子网的全部IP可能会引发受害者的怀疑。

    全部生成的IP都会添加到中心服务器上的一个数据库中。大多数IP是属于西班牙和一些政治机构,电信公司和公共事务机构。

  2. 集中全部信息

    这个CC服务器最重要的资产是shodb数据库。在恢复了数据库中,咱们发现了下面的关系(图9):

    p11 图9

    sho_bot表中包含有与活动bot相关的信息(表5)

    p12

    p13 表4

    这里有9个bot,每一个bot都是经过一个cookie(uid)识别的。bot会使用这个cookie来注册到主要服务器上。若是服务器有这个cookie的引用,过程就会继续。全部bot的优先级(code_id)都设置为了1。全部项目的info一栏都是空白的。

    sho_cookie表中包含有与bot活动相关的信息(表6)

    p14

    p15

    cookie栏表示的是认证代码,last_activity栏表明是bot联系服务器的最后时间,ip_addr一栏表明的是bot的IP地址,get_num栏表示的是bot与中心服务器之间的链接数量。

    此次研究代表,有些bot是重复的,而cookie有两类:一种使用了字母和数字,一种只是使用了数字。第一种cookie的活动很是少(每一个cookie有3个链接),由此咱们认为有两个版本的bot和插件在并行。另外,根据第一类cookie不在sho_bot表中出现,也能证实这一点。

    • sho_ip表中包含有gen_ip.py脚本生成的IP列表
    • sho_plugin表中包含的是代码而不是数据。这里储存了脚本plugin-nmap-0.43.py。这个脚本的主要做用是获取目标IP(每次请求最多16个IP)并执行扫描命令(图10)。

    p16 图10

    在解析了nmap结果后,数据会发送回服务器并保存到sho_ip表中的数据库。

    • sho_code表中包含的是代码,而不是数据。这里储存着scan-bot-03.py脚本。这个脚本负责描述系统的行为。Bot会链接到服务器并使用一个cookie来注册本身。一旦经过认证,bot就会从sho_code表(更新机制)中请求最新的代码和插件(sho_plugin)版本。在更新后,bot就会启动一系列的线程,使用最新的插件扫描目标IP。
    • sho_log表是空的
    • sho_setting表是空的

    服务器上还运行着一个Django应用。这个应用是一个管理和报告界面,用于管理bot和目标。下图中就是(图11)admin面板。这个界面容许攻击者查看统计数据,添加和删除用户、目标和bot。

    p17 图11

    这个界面很简单,只是对数据库简单的包装了一下(图12:添加用户【上】,添加目标【下】):

    p18 图12

    1.bot

    用于扫描潜在受害者的机器也是不一样的。这样便于攻击者隐藏这些IP的扫描活动是否是属于同一次行动的。下表中是咱们在数据库中发现的IP(表7):

    p19 表7

0x08 附录3-与APT28相关的工具


代理工具(svehost.exe)

这个可执行文件要么使用了经过命令行传递的参数,要么就没有使用参数。当没有参数执行时,文件会尝试联系IP地址:端口443上的176.**.***.10

也能够启动下面的命令行:

#!bash
svehost.exe start <ipaddress> <port>
复制代码

这个文件使用了一个旧版的OpenSSL库(OpenSSL 1.0.1e)。实际上,这个文件之因此有1038kb,就是由于包含了这个OpenSSL库。

这个工具的主要目的是容许攻击者联系路由器后的系统,若是没有这个工具,系统就没法从网络外访问。

权限提高工具(xp.exe)

这个工具是围绕一个在2014年发现的漏洞(CVE-2014-4076)建立的,经过使用函数DeviceIoControl向\\.\\ TCP设备发送一个特殊的数据包来运行。在2014年底,这个漏洞就被修复了。

这个工具会接收一个可执行文件做为参数。而后,使用系统权限运行这个可执行文件。

这个文件是根据调试配置编译的。所以,文件中还硬编码了一个pdb文件的路径。这个路径引用了C:\Users\Пользователь\Desktop\cve-2014-4076\cve-19abdba\Debug\CVE-2014-4076.pdb

字符串Пользователь在俄语中的意思是“用户”。这也是咱们怀疑木马做者是俄语用户的缘由。

木马转储工具(run.exe)

这个木马转储工具彷佛是根据mimikatz来建立的,这个公共工具会经过LSASS转储WDigest中的密码。更多关于这个工具的信息能够访问blog.gentilkiwi.com/mimikatz

这个文件是在05/05/2013编译的,而且不包含任何版本信息。也就是说,这个文件是做者本身编译的。这个工具会接收一个文件做为参数,而后,获取到的密码会转储到文件中,做为参数传递。

0x09 附录4(第一阶段组件)


在感染后,这是第一个安装到受害者计算机上的组件。这个组件的目的是联系CC服务器并要求接下来的指令。

第一阶段的有效载荷包含两个部分:一个dopper和第一阶段的后门。咱们遇到的dropper-runrun.exe,在数据节内嵌了文件api-ms-win-downlevel-profile-l1-1-0.dll。dopper使用了大量的自定义加密算法来避免逆向。

下面的算法(算法1)是用于解密其API:

算法1:

p20

有效载荷(api-ms-win-downlevel-profile-l1-1-0.dll) 使用了RTL和自定义加密算法进行了加密,使用了一个10字节秘钥。

算法2:

p21

投放的文件是一个downloader,这个文件会联系CC服务器获取第二阶段的组件。Downloader联系的域名是:_www.msc****vw.com_,IP地址是:91.***.**.249

使用的请求是经过GET over HTTP。每一个请求1-5组随机的1到6的数字。经过斜线来分组,下面就是一个请求:

#!bash
/ue/VHghm/ihXAIK/qpi/1c9.xml/?XK1=VrLYQndXGXwzURh9RBE=
复制代码

上面的xml扩展实际是从4个可用的扩展的选择的(xml, **pdf,html, zip**)。最后的参数是一个加密秘钥,downloader可能会利用这个秘钥来经过服务器认证。

这个文件是一个基础的后门,具备下面可用的命令:

  • 下载
  • 执行
  • 删除文件

由于须要1个多小时第二阶段的组件才能下载到受感染的系统上,因此咱们猜想是手动下载的。

0x0A 附录5-(第二阶段组件)


第二阶段组件的目的是打开后门,容许攻击者访问目标设备,并下载另外的组件。

a. Dropper:

做为的第一阶段组件,重要文件都是使用dropper安装的。(winloat.exe)

Dropper的主要操做包括:

  • 解密(包括后门:advstoreshell.dll和配置文件:msd
  • 将有效载荷写入磁盘上
  • 调用advstoreshell.dll的InitW方法

b. 配置文件:

为了加密/解密配置文件和advstoreshell.dll使用的API,攻击者使用了一个6字节长度的自定义流密码。下面的函数是为了获取相应的字节,用于异或缓冲区中的一个索引。

算法3:

p22

配置文件(msd)就是使用了上面介绍的算法,使用了122字节的秘钥。配置文件中包含有下列信息:

p23

其中:

  • Timeout1 = 60000 ; 表明在联系CC时,直到超时的毫秒数
  • Timeout2 = 60000 ; 表明在使用加密联系CC时,直到超时的毫秒数
  • Computer name = DAE13WS01204030501 ; 受感染计算机的名称
  • DomainName1= micro**********ter.info
  • DomainName2=dri********te.info
  • Campaign id = rhbp ; 咱们还在调查这个字段的含义,可是,这多是一个活动标识符
  • ? = 1000 ; 咱们仍然在调查这个字段的角色,可是一些信息让咱们认为这是一个计数器
  • ? = 600000; 咱们仍然在调查这个字段的含义,可是极可能是另外一个超时值
  • Keylogging flag = 1; 这个字段指示着后门是否应该拦截键盘输入,并将输入发送到CC服务器
  • Main domain name = 1***.net ; 这是木马尝试联系的第一个域名

c. 后门组件:

APT28最重要的组件是后门,在咱们的例子中,这个文件叫作advstoreshell.dll。这个文件会读取配置文件(msd),并联系配置文件中的CC服务器。而且配置文件也能够储存到注册表中。在注册表中储存的配置文件多是从某个CC服务器上的更新获取的。

在咱们分析过的系统上,有2个配置文件:

  1. 第一个是msd文件,与advstoreshell.dll在相同的路径下
  2. 第二个在注册表中(HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Path)。这个文件中的数据与msd文件基本相同,除了前两个域名更改成了…ore.net和micr…er.com。

只有这个组件会在启动时运行。这是经过在HKCU\ Software\Microsoft\Windows\CurrentVersion\Run中建立AdvancedStorageShell实现的,写入的内容是:

#!bash
"RUNDLL32.EXE "C:\Documents and Settings\<user-name>\Local Settings\Application Data\Microsoft Help\advstorshell.dll", InitW"
复制代码

这个后门很先进,支持26种命令。咱们分析了一些命令,其余的一些命令仍在分析过程当中。

p24

在使用cmd/c选项运行命令时,输出会保存到一个叫作tmp.dat的文件中。

这个组件与CC服务器之间的通信是经过HTTP端口443实现的。若是可行,这个组件会尝试链接端口80。在有些状况下,通信会使用3DES和RSA加密。

这个后门的一个重要功能就是能加载外部组件。这是经过调用dllinit函数实现的。s插件也是这样加载的。

0x0B 附录6-额外模块


APT28最后安装的组件是一个叫作pr.dll的模块。这个文件是在系统遭到入侵的5小时后编译的。这种时间上的误差让咱们怀疑这个文件是根据每一个目标系统单独制做的。

这个文件彷佛是一个模块化框架,能兼容不一样的模块。这个文件的配置储存在一个加密格式中,并保存在注册表键值中“HKU\S-1-5-19_Classes\Software\Microsoft\MediaPlayer\{some_clsid}\chnnl”

一旦执行,木马会检查一个互斥量(XSQWERSystemCriticalSection_for_1232321)是否是存在,从而确保只有一个实例在运行。而后,木马会联系服务器(IP: 198.[redacted].74,或域名sec[…]win. com)。在初始通信阶段,后门会向CC服务器发送一个加密的buffer,包含有一个RC4秘钥和插件的ID。下面就是一个buffer:

03 33 02 03 33 23 03 21 23 06 21 23 3A 66 95 64 4B 56 FF 22 4D 81 4F

咱们使用下列在buffer中的ID识别出插件:0x3302, 0x3303, 0x2103, 0x2106\

颇有趣的是,pr.dll会建立两个管道,多是用于收集其余进程发送的数据。

pr.dll彷佛是在服务器上发现的一个Windows版Linux文件。在服务器上有4个elf文件,有两个是x86架构(075b6695ab63f36af65f7ffd45cccd39, f3bf929a35c3f198226b88537d9ccb1a),两个是x64架构(2683624eacc490238e98c449bddbb573, 5bf524a4860f3c33e3ad77b6b625db37)。这个elf文件使用了SQLite3来储存其配置,而不是注册表。My_BD数据库包含有两个变量chnnl和prms。

这些文件会经过构建随机请求,尝试联系服务器。每一个请求都有一个动做watch/,search/,results/,search/,close) 和2-9个变量(选择:text=,from=,itwm=,ags=,oe=,aq=,btnG=,oprnd=,utm=,channel=)。参数值是随机生成的。

下面是一个请求:

h[tt]p://198.***.***.74/watch/?aq=JTfJRp-s&oprnd=Dwtee&itwm=niKMuGE9Mp9Md9vHdggZMS16YlSTx&btnG=t&oprnd=FbLtw&AVVAT=m 8I2tN

elf文件中包含有下列模块:

  1. AgentModule
  2. KernelProvider
  3. AgentKernel
  4. ChannelController
  5. Cryptor
  6. LocalStorage (sqlite3) 7. ReserverApi
  7. AgentChannel
  8. HttpChannel
  9. FSModule
  10. RemoteShell
  11. RemoteKeylogger

如上所述,每一个架构都有两个版本。惟一区别就是有一个版本中不会包含最后的两个模块。

相关文章
相关标签/搜索