您的位置:beat365亚洲官方网站 > 互联网资讯 > Rietspoofbeat365亚洲官方网站: 恶意软件释放多个恶

Rietspoofbeat365亚洲官方网站: 恶意软件释放多个恶

2019-12-17 01:59

自 2018 年 8 月以来,我们一直在监控名为 Rietspoof 的新恶意软件。Rietspoof 是一种新的多阶段恶意软件,具有一些非常引人注目的特性和功能。当我们刚开始跟踪 Rietspoof 时,它每月更新一次。但是,在 2019 年 1 月,我们注意到其更新节奏更改为了每日。

beat365亚洲官方网站 1

Rietspoof 利用多个阶段,结合各种文件格式,分发更多样化的恶意软件。我们的数据表明,第一阶段是通过即时消息客户端(如 Skype 或 Messenger)分发的。它分发了一个高度混淆的 Visual Basic 脚本,其中包含一个硬编码和加密的第二阶段——一个 CAB 文件。CAB 文件扩展为可执行文件,该文件大多使用 Comodo CA 颁发的有效证书进行数字签名。在第 4 阶段 .exe 安装一个下载程序。

原文首发:看雪论坛 http://bbs.pediy.com/thread-216639.htm 

有趣的是,第三阶段使用简单的 TCP 协议与 C&C 进行通信,其 IP 地址在二进制文件中是硬编码的。该协议使用 AES-CBC 模式加密。在第一版中,我们观察到密钥是从初始握手中获得的,而在第二版中,它是从硬编码的字符串中派生出来的。在第二版中,协议不仅支持自己的 TCP 协议,而且还尝试利用 HTTP/HTTPS 请求。考虑到改变通信协议所需的工作量,很少看到 C&C 通信协议被修改到这种程度。虽然改变混淆方法很常见,但 C&C 通信在大多数恶意软件中通常保持相对稳定。

✿ 用 IDAPython 完全静态去混淆

此下载程序使用本地协议从硬编码地址获取另一个阶段。虽然 Stage 3 协议包括 bot 功能,但 Stage 4 仅作为指定的下载程序。

→ 鉴别函数

此外,C&C 服务器仅与设置为 USA 的 IP 地址通信,这使得我们认为攻击者正在针对特定目标进行攻击,或者攻击者仅出于测试原因使用 USA IP 范围。并且,有可能还有更多阶段尚未公布。以下是我们迄今为止的全面分析结果。

首先,我们注意到 dropper 重用了一些 payload 的重要函数。创造该 dropper 的一个 Rizzo 签名并在 payload 中加载它能够 IDA 让识别并重命名少部分函数。

一、VBS 混淆 & 释放嵌入文件

beat365亚洲官方网站 2

Visual Basic 脚本的第一部分是用于读取和反混淆嵌入式二进制文件的函数。

✿ API 调用和钩子的静态去混淆

beat365亚洲官方网站 3

思路是用

从这个代码片段中可以看出,脚本开始以特定的偏移量读取代码,对 CAB 文件进行反混淆处理并为下一阶段作准备。代码逐字符转换为 ANSI 值并添加到 countervariable。在每一步,计数器与 val_01进行异或,并附加到已解码的字节。有趣的是,在每一步中,字符串 var_str_01 也会附加到 var_str_02。

Python 重新实现哈希过程,哈希所有被 FlokiBot 加载的所有

beat365亚洲官方网站 4

API,然后将他们和我们用代码收集到的哈希值进行比较。如果匹配,我们就用 IDAPython 重命名该函数,使得反汇编更具可读性。因为

在此步骤之后,var_str_02 将用作新函数的参数。第二个参数是 TempPath 加文件名:

payload 用的是同样的 CRC 函数和同样的异或密钥,所以这个脚本对它们都管用。

beat365亚洲官方网站 5

→ 字符串去混淆

在此阶段,CAB 文件将以 "JSWdhndk.sjk" 名称保存到计算机的 Temp 文件夹中。需要从中提取后续阶段,这通过使用 expand.exe 来完成:

跟 ZeuS 和 Fobber(Tinaba 的进化版)一样,很多字符串都用它们自己的一字节的密钥异或加密了。恶意软件将所有的 ENCRYPTED_STRING 存储在一个数组中,并将在传输过程中通过下标去混淆。加密过的字符串将以下面的数据结构展现:

二、执行 PE 和掩盖痕迹

typedef struct {

该脚本首先通过简单地读取注册表项 "HKEY_USERSS-1-5-19EnvironmentTEMP" 来检查登录的用户是否为 Admin。如果成功,则将 func_read_Registry 设置为 True。

char xor_key;

当此标志设置为 True 时,VBS 将日期更改为 01-01-2109,从%TEMP%删除 CAB 文件,运行扩展的可执行文件,并删除原始脚本以掩盖其痕迹。然后,它将日期更改回实际日期。在未释放文件的脚本中不使用具有 2109 年的日期。一开始,我们认为这只是一个错字,预计的临时日期是 01-01-2019,但该假设没有得到证实。

WORD size;

beat365亚洲官方网站 6

void* strEncrypted;

恶意软件作者的一个有趣举措是使用 cmd / c 从命令行运行命令。看一下这个命令的描述:

} ENCRYPTED_STRING;

这很可能是想通过使用执行的命令生成更多命令来破坏行为检测。

首先,为弄明白如何没有错误的检索出它们,我会运行一段代码罗列 decrypt_string  的参数是如何入栈的。

即使跳过上一步,如果当前用户不是 admin,则接下来运行扩展的 PE 文件。首先,该脚本删除计划任务 Microsoft Windows DOM 对象帮助程序。这是由恶意软件作者完成的,以确保他们可以在计划任务中创建一个新值,该任务指向前一阶段扩展的扩展 PE 文件 ; 它被设置为在一分钟后执行。然后从%TEMP%目录中删除 CAB 文件。

运行完我们的脚本后,这里有一个在 IDA 中反汇编后的样本:

三、增加持久性

beat365亚洲官方网站 7

在新版本的 VBS 中,恶意软件作者从 2019 年 1 月 22 日开始添加了一个新的持久性功能。该脚本在启动时创建一个名为 WindowsUpdate.lnk 的新 LNK 文件。此 lnk 文件在启动后运行扩展的 PE 文件,以确保在重新启动计算机时可执行文件。

→ 完整的 IDAPython 脚本

beat365亚洲官方网站 8

这是我用来去混淆该 payload 的完整的 Python 脚本:https://gist.github.com/adelmas/8c864315648a21ddabbd6bc7e0b64119.

四、签名

它基于 IDAPython 和 PeFile。它专为静态分析设计,你不用开启任何 debugger 来让这段程序工作。它将完成以下的工作:

几乎每个版本的 VBS 文件都包含一个新证书,例如:

明确bot引入的所有函数并以[API name]_wrap 的格式重命名它们。

beat365亚洲官方网站 9

解析WINAPIHOOK 结构并以hook_[API name] 的格式重命名钩子函数。

简单的将这个代码块从 base64 转换为十六进制,然后解析这个 ASN.1 十六进制字符串时,我们获取到该证书的序列号:

解密字符串并将解密后的值放在解密字符串函数调用处的注释中。

beat365亚洲官方网站 10

# coding: utf-8

beat365亚洲官方网站 11

# ====================================================== #

大多数证书由 COMODO 或 Sectigo 颁发

#                                                        #

五、第 3 阶段 – 释放 bot

#      FLOKIBOT BOT32 DEOBFUSCATION IDA SCRIPT           #

到目前为止,我们已看到了 Rietspoof 第三阶段的两个版本,观察发现它们在通信协议方面大不相同。此阶段具有简单 bot 的功能:它可以下载 / 上传文件,启动进程或启动自毁功能 C&C 服务器也已经实现了基于 IP 地址的基本地理限制。当我们尝试从实验室网络与它进行通信时,我们没有收到任何 " 有趣 " 命令 ; 然而,当我们将假客户端移到美国时,我们收到了包含下一阶段的命令。

#                                                        #

我们注意到第三阶段正在迅速发展,有时会同时运行两个不同的分支。在我们的分析过程中,通信协议被多次修改并添加了新功能。例如,早期版本支持字符串混淆,几天后实施,然后在 1 月 23 日,我们看到回滚了其中的一些更改。较新的版本还支持命令行开关 "/ s",用于将自己安装成名为 "windmhlp" 的服务。

#       http://adelmas.com/blog/flokibot.php             #

时间表

#                                                        #

· 15.1 混淆占位符,通信协议 v1

# ====================================================== #

· 18.1 实现了混淆,服务安装,通信协议 v2

# IDAPython script to deobfuscate statically the bot32 payload of the banking malware FlokiBot.

· 22.1 混淆报废,通信协议 v1

# Imports are fully resolved, hooks are identified and named and strings are decrypted and added in comments, without using any debugger.

· 23.1 混淆报废,通信协议 v1,服务安装

# May take a few minutes to resolve imports.

Bot 要么被地理围栏阻挡,要么没有进行分发。通信具有简单的结构:

# Works with FlokiBot dropper with some small changes.

· Req:client_hello(在版本 2 中已弃用)

import sys

· Res:client_hello(在版本 2 中已弃用)

# sys.path.append("/usr/local/lib/python2.7/dist-packages")

· Req:ID

# idaapi.enable_extlang_python(True)

· Res:OK 或 HARDWARE

import pefile

· Req:HW(如果之前的回复是 HARDWARE)

# RunPlugin("python", 3)

· Res:OK

CRC_POLY   = 0xEDB88320   # Depending on sample

只有在第一次看到发送的客户端 ID 时才会发送命令 "HARDWARE"。命令 "OK" 总是导致通信终止。这个简单的协议每隔几分钟定期执行一次。

XOR_beat365亚洲官方网站,KEY    = 0x34ED  # Depending on sample

通信协议 v1

ARRAY_ADDR  = 0x41B350    # Depending on sample

第三阶段通信的第一版使用一个相当简单的协议。首先,通过由消息和响应组成的握手生成密钥和初始化向量,包括 32 个随机字节和 4 个字节的 CRC32 校验和。然后,将随机字节一起进行 xor-ed,并在结果上使用 SHA256 得到密钥。类似地,在 SHA256 摘要上使用 MD5 会生成初始化向量。从现在开始,这些参数用于 AES-CBC 加密消息。请注意,填充函数设计奇怪:如果需要,最后一个块填充为 16 个字节,并且在最后一个块之后总是追加另外 16 个零字节。

ARRAY_ITER     = 12      # Size of a triplet (3*sizeof(DWORD))

beat365亚洲官方网站 12

i = 0

beat365亚洲官方网站 13

# ----------------------------------------------------

初始握手和随后的密钥生成

......(代码省略)

beat365亚洲官方网站 14

→持久性

字符串 "HELLOn" 被混淆并随后被去混淆

bot 用一个伪随机名字把自己复制到 C:Documents and Settings[username]Application Data 并通过在 Windows 的启动文件夹创建一个 .lnk 来获得持久性。

通信以 client_hello 开始,这条消息只包含 "HELLOn",希望 "HELLO n" 作为响应(实际上响应始终是 "HELLOnnnnnn … ")。然后,客户端发送命令 "ID: 2.10 n"。收到响应 "OK","HARDWARE" 或更强大的命令。在前者中,通信结束并且循环休眠两到五分钟。响应 "HARDWARE" 引发请求 "HW: CPU RAM: USER:",进程权限为 "admin"(进程具有管理员权限)或 "user"。同样,在该消息之后,接收到响应 "OK",相应地结束通信。

int startup_lnk() {

beat365亚洲官方网站 15

int v0; // edi@1

以下六个命令可以取代 OK:

_WORD *v1; // ecx@1

beat365亚洲官方网站 16

int v2; // eax@2

通信协议 v2

_WORD *v3; // ecx@2

Rietspoof 第三阶段的第二版也使用了一个类似的协议,增加了一些新的内容。第二版尝试通过 HTTP / HTTPS 进行通信,除非设置了代理,在代理情况下,它会转向原始 TCP。此新版本也避开了初始握手,因为它使用硬编码字符串 "M9h5an8f8zTjnyTwQVh6hYBdYsMqHiAz" 而不是对两个随机字符串进行异或。同样,这个字符串通过 SHA256,产生一个密钥,SHA256 经 MD5 生成一个初始化向量。这些参数用于 AES-CBC 加密消息。

const void *v4; // eax@2

beat365亚洲官方网站 17

const void *v5; // esi@3

混淆 "HELLO n" 字符串

int strStartupFolder; // [sp+8h] [bp-20Ch]@1

由恶意软件生成的 HTTP GET 请求是普通的,除了可能三个标头之外。下面是 HTTP 请求的示例。请注意,Content-MD5 标头不是必需的 ; 此外,Content-MD5 标头以自定义和标准的不合规方式使用。此外,User-agent 字符串在二进制文件中是硬编码的。

int v8; // [sp+210h] [bp-4h]@6

GET /? HTTP/1.1 Host: Connection:close Content-MD5: User-agent:Mozilla/5.0 ( Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1 ) Gecko/20061204 Firefox/2.0.0.1

v0 = 0;

幸运的是,对于我们来说,旧协议仍然适用于使用 HTTP 代理的情况。我们相信这在分析恶意软件期间可以起到防止中间人攻击的保护作用。但是,在我们的例子中,它允许我们部署一个只作很少修改的新跟踪脚本,因为只更改了密钥协商协议。

SHGetFolderPathW_wrap(0, 7, 0, 0, &strStartupFolder); // 7 = CSIDL_STARTUP

六、第 4 阶段 – 下载程序

v1 = (_WORD *)PathFindFileNameW_wrap(&pFilename);

此阶段尝试通过 TCP 上的 NTLM 协议建立身份验证的通道,其 C&C 的 IP 地址是硬编码的。

if ( v1 && (v2 = cstm_strlen(v1), sub_40FECB(v2 - 4, v3), v4) )

beat365亚洲官方网站 18

v5 = v4;

启动 NTLM 身份验证

else

beat365亚洲官方网站 19

v5 = 0;

认证和从 C&C 服务器接收数据的主循环

if ( v5 ) {

之后,它开始通过上述通道与 C&C 通信,目的是进行下一个阶段或可能的最终有效载荷。

v8 = 0;

七、总结

if ( build_lnk((int)&v8, (const char *)L"%s\%s.lnk", &strStartupFolder, v5) > 0 )

如上所述,这个新的恶意软件 Rietspoof 在 2019 年 1 月的活动大幅增加。在此期间,开发人员使用了几个有效的证书来为相关文件签名。此外,有效载荷也经历了开发,即多次改变 Stage 3 通信协议的实现。虽然 Rietspoof 的数据很广泛,但动机和运作方式仍然未知,目标也未知。而且,迄今为止,大多数防病毒软件很少检测到此恶意软件。

v0 = v8;

我们的研究仍无法证实我们是否已发现整个感染链。虽然恶意软件具有 bot 功能,但它主要设计为 dropper。此外,低流行率和地理限制意味着其他可能的未知因素。例如,我们可能错过了仅分发到特定 IP 地址范围的其他样本。

cstm_FreeHeap(v5);

}

return v0;

}

✿ 挂钩API

→ 概述

基于ZeuS,FlokiBot 用了同一种但又有些许不同的结构数组来存储它的钩子:

typedef struct

{

void *functionForHook;

void *hookerFunction;

void *originalFunction;

DWORD originalFunctionSize;

DWORD dllHash;

DWORD apiHash;

} HOOKWINAPI;

在我们运行完前面用来去混淆 API 调用的脚本,以及定位好钩子结构数组之后,我们就可以很轻易的用其他的 IDA 脚本来解析它,以确定和命名钩子函数(hook_* )。我们最后得到下面的表格:

Parsing hook table @ 0x41B000...

Original Function Hooked          Hooker Function                         DLL Hash              API Hash


NtProtectVirtualMemory_wrap       hook_NtProtectVirtualMemory_wrap        84C06AAD (ntdll)                    5C2D2E7A

NtResumeThread_wrap               hook_NtResumeThread_wrap                84C06AAD (ntdll)            6273819F

LdrLoadDll_wrap                   hook_LdrLoadDll_wrap                    84C06AAD (ntdll)        18364D1F

NtQueryVirtualMemory_wrap         hook_NtQueryVirtualMemory_wrap          84C06AAD (ntdll)                  03F6C761

NtFreeVirtualMemory_wrap          hook_NtFreeVirtualMemory_wrap           84C06AAD (ntdll)                 E9D6FAB3

NtAllocateVirtualMemory_wrap      hook_NtAllocateVirtualMemory_wrap       84C06AAD

......代码省略

它们中的大多数都有安装在 ZeuS 和其他银行恶意软件中。尽管如此,我们还是能够注意到 NtFreeVirtualMemory 和 NtProtectVirtualMemory 的一些有趣的、新的钩子。我们将在下一部分看到它们的用途。

→ 浏览器中间人(Man-in-the-Browser)

Floki

通过把自己注入到 Firefox 和 Chrome 进程中并拦截 LdrLoadDll 来实现浏览器中间人攻击。如果浏览器加载的 DLL

的哈希值和 nss3.dll, nspr4.dll 或 chrome.dll 任一个的哈希值匹配,API

钩子就会自动安装,让恶意软件可以实现表单抓取和网站注入。

int __stdcall hook_LdrLoadDll_wrap(int PathToFile, int Flags, int ModuleFileName, int *ModuleHandle)

{

int result; // eax@2

int filename_len; // eax@8

int dll_hash; // eax@8

[...]

if ( cstm_WaitForSingleObject() ) {

v5 = LdrGetDllHandle_wrap(PathToFile, 0, ModuleFileName, ModuleHandle);

v6 = LdrLoadDll_wrap(PathToFile, Flags, ModuleFileName, ModuleHandle);

v12 = v6;

if ( v5 < 0 && v6 >= 0 && ModuleHandle && *ModuleHandle && ModuleFileName )

{

RtlEnterCriticalSection_wrap(&unk_41D9F4);

filename_len = cstm_strlen(*(_WORD **)(ModuleFileName + 4));

dll_hash = hash_filename(filename_len, v8);

if ( !(dword_41DA0C & 1) ) {

if ( dll_hash == 0x2C2B3C88 || dll_hash == 0x948B9CAB ) { // hash nss3.dll & nspr4.dll

sub_416DBD(*ModuleHandle, dll_hash);

if ( dword_41DC2C )

v11 = setNspr4Hooks(v10, dword_41DC2C);

}

else if ( dll_hash == 0xCAAD3C25 ) {     // hash chrome.dll

if ( byte_41B2CC ) {

if ( setChromeHooks() )

dword_41DA0C |= 2u;

}

[...]

}

else

{

result = LdrLoadDll_wrap(PathToFile, Flags, ModuleFileName, ModuleHandle);

}

return result;

}

→ 证书窃取

通过挂钩 PFXImportCertStore ,FlokiBot 可以窃取数字证书。此法 Zeus 和 Carberp 也有用到。

→ 保护钩子

FlokiBot

通过放置一个钩子和过滤 NtProtectVirtualMemory

调用来保护它的钩子,以防止它们被累死杀毒软件复位到原函数中。无论何时,当一个程序想要改变Floki已经注入的进程的内存保护机制的时候,Floki会阻断该调用并返回STATUS_ACCESS_DENIED.

unsigned int __stdcall hook_NtProtectVirtualMemory_wrap(void *ProcessHandle, int *BaseAddress, int NumberOfBytesToProtect, int NewAccessProtection, int OldAccessProtection)

{

int retBaseAddress; // [sp+18h] [bp+Ch]@7

[...]

v11 = 0;

v5 = BaseAddress;

本文由beat365亚洲官方网站发布于互联网资讯,转载请注明出处:Rietspoofbeat365亚洲官方网站: 恶意软件释放多个恶

关键词: