首页 > Win安全, 恶意软件 > 瞅一瞅Andromeda僵尸网络

瞅一瞅Andromeda僵尸网络

2014年9月1日 发表评论 阅读评论 3,196次浏览    

原文:http://blog.fortinet.com/post/A-Good-Look-at-the-Andromeda-Botnet

翻译:徐文博

Andromeda是一个模块化的bot。最原始的bot仅包含一个加载器,在其运行期间会从C&C服务器上下载相关模块和更新,它同时也拥有反虚拟机和反调试的功能。它会注入到可信进程中来隐藏自己,然后删除原始的bots。该bot会潜伏很长时间(从几天到几个月不等)才与C&C服务器进行通信。所以,很难获取到感染主机和C&C服务器间的网络流量信息。

最新的官方编译版本是2.06,该版本的bot所发的包中有新增的内容。此外,它也能够分发其他多样的僵尸变种,下载相关模块和更新。

Hex1

图1:GeoIP地图显示的Andromeda的分布

一、打包器

打包器中有大量的冗余代码,所以可以很好的隐藏真实代码。它会调用GetModuleHandlerA API去获取bot的基址,检查MZ标记和PE特征码,然后确认是否有6个段。如果是,则会从第4个段中加载数据,进行解密,然后会校验解密的MZ标记、PE特征码,调用CreateProcessW API来重新加载执行原始的bot,但会把dwCreationFlags值设为CREATE_SUSPENDED。打包器会用解密的第4个段中的代码,来注入到这第二个进程中。稍后,打包器会采用同样的方法,从第5个段中加载另一个PE。

这个强大的打包器能够同时嵌入、执行两个不同的恶意代码。然而,第4个段中的数据解密后并不是PE格式,所以,该打包器仅能携带而不能执行Andromeda bot。

二、加载器

该加载器首先从TEB结构中获取到ntdll.dll的基址,将其作为参数,来获取ntdll导出的API,提升了分析的复杂度。对API的处理不是通过函数名称,而是使用校验和。下面是一些API的校验和以及它们对应的名称:

5584B067h OpenMutexA

5F467D75h SetErrorMode

5E639D43h VirtualFree

0AAEB7C1Eh VirtualAlloc

9ED23A16h LoadLibraryA

94D07C92h CloseHandle

8C552DB6h Process32Next

0B4D1BAFAh Process32First

99D6DD7Ah CreateToolhelp32Snapshot

41D27AF6h GetModuleHandleA

接着,加载器会调用OpenMutexA API来检查“lol”互斥量,以决定是否需要跳过反虚拟机和反调试的相关处理。

如果没找到这个互斥量,bot就会确认是否在虚拟机或者调试环境下执行:

1) 遍历当前进程列表,将每个进程名称转换为小写,然后计算其校验和,与嵌入的校验和做比较,它代表着虚拟机环境。(如图2)

Hex2图2:反虚拟机

2) 然后试着调用GetModuleHandleA API加载sbiedll.dll来检查是否为Sandboxie虚拟机。

3) 查询下面的注册表项,获取磁盘名称(见图3):

key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk\Enum

跳过最开始的8个字节,然后检查接下来的4个字节(图4)

目前,加载器检测3款虚拟机,如图4所示。

Hex3

图3:查询注册表,获取磁盘名称

Hex4

图4:跳过8字节,然后检查接下来的4个字节

4)两次调用rdtsc指令,来计算返回值的不同。大于200h的返回值表示在调试环境中。

如果bot加载器检测到任何的异常情况,它不会像其他僵尸那样直接退出,而是继续运行一小段我称之为“passive code”(被动模式代码)的代码。

被动模式的代码

这一小段代码将其自身拷贝到%ALLUSERSPROFILE%文件夹中,变成svchost.exe,然后在如下的注册表项中添加自身:

Key:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

ValueName:SunJavaUpdateSched

Data:%ALLUSERSPROFILE%\\svchost.exe

这段代码会打开本地的8000端口进行监听。一旦接收到远程命令,就会执行cmd.exe进行接收、执行。

三、主要代码的注入

调用SetEnvironmentVariableW API将最初bot的全路径保存到环境变量src中,然后调用ZwQueryInformationProcess API来检查系统版本是32位的还是64位的。如果是运行在32位系统上,bot就会注入wuauclt.exe,否则,会注入svchost.exe。(我们的示例是运行在32位系统下。

Bot会创建一个新的进程wuauclt.exe,其dwCreationFlags被设置为CREATE_SUSPENDED。然后调用多个MAP API注入wuauclt.exe。将wuauclt.exe的入口点代码改成如下的代码:

push <address of injected code>

retn

最后,bot会调用ZwResumeThread API来激活注入的进程wuauclt.exe, 然后直接退出。

四、主要代码的本地环境初始化

所注入的代码,所有的信息都是显而易见的。没有什么加密的字符串、代码段等。Bot调用SetErrorMode API来禁用大多数的错误告警窗口。其参数是0x8007, 代表如下的含义:

  • SEM_FAILCRITICALERRORS

  • SEM_NOALIGNMENTFAULTEXCEPT

  • SEM_NOGPFAULTERRORBOX

  • SEM_NOOPENFILEERRORBOX

Bot调用GetEnvironmentVariableW API,结合环境变量src来获得最初bot的全路径,然后调用SetEnvironmentVariableW API将这个变量设为空串。它会检查当前进程(wuauclt.exe)的安全标识,看它是否属于管理员,然后设置复制的目的地和注册表键值。之后,使用当前的时钟滴答值来确定文件名的后缀。

Bot可能将其自身拷贝到两个目的地其中的一个:

如果当前用户是管理员,“ar”标志被设为1。Bot会设置如下的注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

<%lu>

%allusersprofile%\Local Settings\Temp\ms<%s>.<%s>

否则,“ar”标志会被设为0,如下设置注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

Load

%allusersprofile%\Local Settings\Temp\ms<%s>.<%s>

根据当前时钟滴答值,文件名的后缀可能是它们中的一个:exe、com、scr、pif、cmd或者bat。

Bot会利用系统卷信息产生的字符串再新建一个互斥量。如果该互斥量已经存在,就会删除原来的bot样本,然后直接退出。否则,bot将其自身拷贝到目的地,再添加到注册表中,以便下次系统启动时,会自动的运行。

最终,bot会创建两个新线程来,结合注册表来执行之前保存的模块和注册表中的DLL(图6)。当然了,它们使用了RC4加密算法,有一个假的ZIP头部(图7)。

Hex6

图6:新建两个线程来执行之前保存的模块

Hex7

图7:这些线程使用了RC4加密,有个假的ZIP头部

至此,完成了本地的初始化操作,接下来将会准备与C&C服务器的网络操作。

五、网络操作的初始化

Bot 会循环地每隔23C34600h毫秒新建一个线程,也就是6天一次。因此,对网络流量的短期监控并不足以检测到Andromeda的存在。

第一次发送的包的格式如下:

id:%lu|bid:%lu|bv:%lu|sv:%lu|pa:%lu|la:%lu|ar:%lu

  • id 值根据本地系统卷信息产生

  • bid 值是硬编码的,可能指编译id.

  • bv值也是硬编码的,可能指编译版本(目前是206h(518))

  • sv值代表受害机器的系统版本

  • pa值是调用ZwQueryInformationProcess API的返回值,用以确定OS是32位还是64位。

  • la值是根据www.update.microsoft.com的IP地址而生成的

  • ar值是调用CheckTokenMembership API的返回值,确认bot是否运行在管理员权限下。

其中,pa和ar值是该版本的Andromeda新增的数据。

示例如图8所示。 图9展示了同样的内容进行RC4加密后的情况,图10展示了进行base64编码后的数据。最后,图11展示了真实的网络流量,图12展示了接收的数据包的二进制表示。

Hex8

图8:网络包举例

Hex9

图9:RC4加密后

Hex10

图10:base64编码后的字符串

Hex11

图11:真实的网络流量

Hex13

图12:接收到的数据包的二进制视图

对内容的简单结构化表示如下:

Struct RecvPack
{
    INT CRC32;
    Char(*) Body;
}*RecvPack;

C&C服务器没有采用同一个RC4 key来加密应答包,而是使用了id值,其长度只有4字节。所以,不发送数据包,我们是没办法对应答数据包进行解密的。

接收到的数据包,解密后如图13所示

Hex13 (1)

图13:接收到的数据包解密后的情况

其结构如下:

Hex12

首先来根据Andromeda C&C服务器的网页控制面板的快照看看命令类型(“Task type”)的含义(图14)。

Hex15

图14:Andromeda C&C服务器的网页控制面板快照,显示了多样的命令类型(“Task type”)

所接收到的数据包中有多块内容(在图13中有两块)。图13中,第一块的Cmd type是2,表示“安装插件”。Bot会试图下载相关模块,如图15所示。

Hex16

图15:Bot试图下载模块

该模块有大小为0x10的假Zip头部。前面我们已经看到过这样的例子,只不过是保存在注册表中(图7),它们是一样的。

Bot在模块执行后,会将其保存到注册表中。然后Bot会反馈如下格式的信息给C&C服务器:

id:%lu|tid:%lu|result:%lu

一个真实的例子如下所示:

id:150233784|tid:106|result:1 

这里的id和所发送的数据包中的是一样的。Tid在块的04偏移处,106就是16进制的6A。如果模块执行成功,result值就是1,否则为0。图16展示了网络流量。

Hex17

图16:网络流量

其他块的Cmd type是1,表示“下载exe”, 传播其他的恶意软件。Bot会试图下载exe,将其作为临时文件来运行。Exe文件并没有像模块那样进行了加密(图17):

Hex18

图17:exe没有加密

执行之后,Bot会与C&C服务器进行通信。

Hex19

图18:Bot与C&C服务器的通信

我们见过一个名为“r.pack”的模块。它在执行期间做了啥?是否还安装了其他类型的模块呢?

六、模块

在另外一个变种的网络流量中,至少见过另外两个模块(图19)。共有3个模块,如下:

Module file name

Underground module name

Underground description

Price

f.pack

Formgrabber

Without the injector, http/https, all browsers including Chrome

$500

r.pack

Ring3 RootKit

$300

s.pack

Socks4

NA

Complete

NA

Hex20

图19:观察到两个模块

1、r.pack

这个r.pack是ring3级rootkit,它会注入所有运行中的进程,然后hook住如下的API来隐藏自身:

  • ZwResumeThread

  • ZwQueryDirectoryFile

  • ZwEnumerateValueKey

2、f.pack

该模块用于信息收集。它会新建一个线程,初始化、监控一个命名的管道。一旦有数据进入该管道,线程就会对其进行解析,通过一个不同的URL链接与C&C服务器通信。(图20)

Hex21

图20

线程会将默认的C&C服务器的入口image.php替换为fg.php,然后添加一个参数id,与第一次发包的id一样。

所发包的内容是base64加密的(与前面发包的一样)。解密后,数据如下:-config C&C服务器会用格式化的数据进行应答,算法与之前的应答数据包相同,只是这里的RC4 key不是取自id, 而是发包用的的RC4 key.

解密后的格式如下:

  • facebook.com.+pass=

接下来,和r.pack一样,它会注入所有运行的进程,hook住ZwResumeThread API。然后检查进程名称。一旦找到如下的4种网页浏览器,就会hook住相应的API来收取信息:

iexplore.exe

WINNET.dll HttpSendRequestW

HttpSendRequestA

opera.exe

RtlFreeHeap

firefox.exe

nspr4.dll

PR_Write

chrome.exe

ZwReadFile

POST字段后的所有数据都会被检查,如果符合所有的条件,则会被发送到命名管道中。之前提到对该命名管道进行监控的线程会继续根据相关格式验证所抓取到的数据,然后发送到C&C服务器上。

3、S.pack

该模块充当一个本地代理,有个导出函数Report,用于显示自己的信息(图21)

Hex22

图21

该模块会打开本地的0438h(1080)端口,等待远程连接。如果受害机器是在防火墙后面,这就不起作用了。目的IP和端口在应答包中。

七、另外一个特殊的变种

Andromeda的另外一个变种的应答包如图22所示。

Hex23

图22

我们可以看到,它没有Cmd type 2, 只有“安装exe”的Cmd type 1和“更新bot”的Cmd 3,此时,该bot只是用于分发其他的恶意软件(如,ZeroAccess, Kelihos, FakeAV,等)

八、结论

我们已经目睹了Andromeda bot所做的变化。它非常的灵活,极具动态性。通过安装不同的模块,可以增强其自身在不同领域的功能。也可以很高效的分发其他恶意软件。它使用多个RC4 key用于加密同C&C服务器间的通信,这使得很难对其跟踪。

此外,不同的僵尸网络联合起来进行传播,所以受感染的机器暴露于更大的风险之下。这给有效的检测、清除感染机器带来了严重的问题。

猫和老鼠的故事还是继续着。老鼠变得越来越聪明,灵活多变,那么猫呢?

(全文完)

版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
  1. 老鹰
    2014年9月4日02:00 | #1

    好文章不点赞 太太。。。