导语:安全公司Redsocks最近发布了一个有趣的报告,解密了如何在几秒钟内破解APT28流量。

u=545197219,3855046374&fm=23&gp=0.jpg

安全公司Redsocks最近发布了一个有趣的报告,解密了如何在几秒钟内破解APT28流量。

在2016年年底,Redsocks就曾对APT28所使用过的过期域( expired domain)的安全性进行过研究,APT28利用这些过期域的攻击受到加密通信通道的阻碍。虽然许多关于APT28的研究组织,如ESET都提到了RC4加密算法,但并没有详细介绍所使用的密钥细节和RC4实现的细节,也没有对其进行静态特征进行分析。在本研究中,Redsocks就旨在为我们揭示x-agent恶意软件的整个运行过程,以解密其怎样干预流量。XAgent具有反调试,键盘记录,下载文件和加密通信等恶意能力,在各种主流操作系统中都有样本出现。

本文首先通过使用APT28 dropper开始进行调查:

1493716328785065.png

由于Redsocks调查的重点是解密APT28的通信流量,因此,本文详细阐述了x-agent的加密功能,并研究了关于开发x-agent通信流量的问题。也就是说,Redsocks不但对x-agent的加密功能进行了破解,还对以下3各方面进行了研究:

1. dropper和x-agent的执行行为
2.x-agent的网络行为
3. 在几秒钟内破解APT28的加密算法

按照Redsocks提出的加密及解密方案,只要大家通过本文所介绍的互联网扫描和URL模式,相信你一定可以找到当前活跃的APT28服务器和有关的受害者,并对这些服务器进行进一步调查。

X-agent dropper

dropper功能的实现要分为两步,在第一步,它只解压缩到Windows文件夹的dll,由于文件的名称是固定的(静态的),所以它不会被多次执行或被不同的工作站所改变。在第二步中,dropper通过调用shell32库的ShellExecuteW函数加载dll。此函数由rundll32.exe和“C: Windows  83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll”,init“作为参数调用。这意味着X-agent的踪迹应该在rundll32执行中查看。 dropper还在Windows文件夹中创建“ose00000.exe”文件,并使用dll和dropper path address的参数调用它。总而言之,dropper会在具有隐藏属性的Windows目录中创建两个文件“83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll”和“ose00000.exe”(请参见表1相应的哈希值),并使用rundll32.exe加载一个文件。 dropper执行的结果是rundll32.exe和ose00000.exe分别作为两个单独的进程,在dropper执行期间是观察不到任何网络活动的。

X-agent删除rootkit

dropper的目标是将控件转移到具有键盘记录和远程执行代码的rootkit的83D2CDE2-8311-40CB-B51D-EBE20FA803D1.dll(参见表1中的SHA256哈希)。

X-agent架构

x-agent具有复杂的架构,它具有功能和通信通道实现的模块化结构。图1给出了我们分析的样本的x-agent架构。

1493716342869892.png

X-agent执行

执行从rundll32加载dll的init函数开始,将控制转移到Init后的第一个有趣的事件是调用KERNEL32.GetVolumeInformationW。在这个调用之后,Init函数就开始初始化全局变量:

1493716354792803.png

接下来,init函数初始化可用的模块,本文列举了X-agent的3个恶意攻击模块:

1.KeyLogging模块,在代码中被称为modKey
2.文件系统模块,在代码中被称为modFS
3.远程Shell模块,在代码中被称为modProcRet

在初始化这些模块的数据结构之后,CHOPSTICK为不同的任务创建不同的线程。模块会基于它们的配置循环创建,并且AgentKernel的创建方式不同:

1493716362526680.png

创建线程后,执行将传输到AgentKernel和Module线程。代理内核模块一开始就为服务器准备一条消息,然后等待服务器使用命令进行响应。该消息是通过代理ID将受害者引入服务器,并报告支持的模块开始执行。此消息将写入临时文件夹中的edg6EF885E2.tmp文件。本文分析的样本是通过HTTP通道进行通信,以实现使用WININET API。

在发送数据之前,通道线程要检查与服务器的连接。首先,会尝试连接“adobeincorp.com”域名,如果连接失败,它会尝试连接到两个硬编码的IP地址。成功连接到服务器后,会根据其他模块准备的数据创建URL请求并发布数据。X-agent首先要发送获取请求,然后发送发送请求。在此过程中,通信会始终加密。

总而言之,下面这8个操作过程会发生在x-agent的每次执行中:

1.调用KERNEL32.GetVolumeInformationW
2.创建至少5个不同的线程
3.在temp目录下读写edg6EF885E2.tmp
4.通过调用socket.connect检查连接
5.加密URL查询字符串和POST数据
6.发送获取请求
7.发送发送请求
8.使用WININET Http API将支持的命令和代理号码发送到服务器。

X-agent流量通信

为了解密APT28流量,我们首先需要了解X-agent的流量模式。本文所分析的x-agent版本就是通过发送HTTP发送请求之后的初始GET请求进行通信。除请求的一个查询字符串外,HTTP请求头值被硬编码,x-agent流量的URL如下所示:

/ webhp?rel = psy&hl = 7&ai = L2Bd93t_o-jl022K1Og4Bm9mSk8QO88K_3ZQZuKcoPwur-5Q7Y =

“/ webhp?rel = psy&hl = 7&ai =”作为URL的一部分,最后的“=”符号可以连接到不同的进程中。事实上,代码中的“/ webhp?rel = psy&hl = 7&ai =”是硬编码的。接下来的51个字节都不是明文形式的,简要地说,它包含请求的时间戳和代理的ID。 x-agent的初始POST数据为71字节,并以a =结尾。数据被加密,解密时等于:

56 34 4D 47 | 4E 78 5A 57 | 6C 76 63 6D | 68 6A 4F 47 | 39 79 5A 51 | 6B 30 84 F2 | 01 00 00 01 | 00 23 01 10 |23 01 11 23 | 01 13 23

这段解密的代码是由四部分组成,分别是代理人(受害人)的身份号,发送数据的模块的ID以及由#字符(0x23)分隔成的两部分模块,如下图所示:

1493716487519945.png

以下是x-agent通道的Http实现:

1493716515337291.png

X-agent流量加密

加密模块

加密模块是使用两个参数调用加密过程的,指针包含两个数据结构,这些数据结构提供了加密类的两个参数:

1.种子加密

2.要加密的数据

种子是经过硬编码的,除此以外,init函数使用即时常量将其复制到数据段:

1493716524681133.png

接下来,在代码中,4个随机字节被附加到种子上,与这些字母一起形成加密的核心。种子为50字节,密钥长度为54字节。数据的大小可变,例如,来自AgentKernel的默认初始请求总共为39个字节(见图4),包括:代理ID,模块ID(消息的发送方)和支持的模块。这些数据总是附加到20字节的数据令牌,代理ID和发件人模块ID。该数据令牌用于服务器的解密结果验证。使用RC4创建密码后,加密过程将向消息添加8个随机值,然后将整个二进制字符串转换为兼容URL的BASE64。 接下来,加密过程会向消息中添加一个7字节的时间戳。总而言之,加密的过程包含以下5个操作:

1. 随机生成4字节
2.使用RC4加密消息
3.向消息中添加8个随机字节
4.将二进制字符串转换为BASE64
5.向消息添加时间戳(BASE64中为7个字节)

RC4的功能

RC4是流密码算法,基于字节置换。以下代码是由x-agent实现的RC4算法。函数的参数是附加到种子和明文数据的4字节随机值:

1493716534944063.png

1493716544997653.png

如何解密x-agent数据

如上所述,x-agent加密中唯一的随机性是附加到上一节中给出的50字节种子的4个随机字节。由于RC4是同步流密码,所以只能使用与加密相同的密钥来解密流量。在x-agent的解密算法中必须使用相同的RC4函数进行解密。密码输入必须是来自http请求的相同的数据字节流,即时间戳和随机字节必须被删除。必须以强制方式调用RC4函数,其中所有可能的值都是从0到-1。由于这是一个已知的纯文本攻击,所以解密结果必须包含“V4MGNXZWlvcmhjOG9yZQ”。

源链接

Hacking more

...