导语:2017年4月,我们发布了一份详细的关于一款恶意程序的报告,该恶意程序使用DNS隧道与它的C&C通信。这项研究促使我们开发了一种技术来检测类似的威胁,该技术使得我们能够通过DNS隧道收集大量的恶意软件样本。在本文中,我们将检查一些

2017年4月,我们发布了一份详细的关于一款恶意程序的报告,该恶意程序使用DNS隧道与它的C&C通信。这项研究促使我们开发了一种技术来检测类似的威胁,该技术使得我们能够通过DNS隧道收集大量的恶意软件样本。在本文中,我们将检查一些使用DNS隧道最著名的恶意程序。Kaspersky实验室的安全产品用一般的(“Trojan.Denes.UDP.C&C”或 “Backdoor.Win32.Denis.*”)或单独的判决来检测这些恶意程序。

Trojan.Win32.Ismdoor.gen

我们将检查的第一个恶意软件有一个多层的C&C通信协议结构,该结构与OSI模型相似,并将此恶意程序与所有其他的木马程序区分开来。Trojan.Win32.Ismdoor的创造者,在设计和开发方面显然付出了很大的努力。

当然,对于其传输层该木马使用DNS隧道。传出“datagrams”(数据报)的长度被限制在60字符,尽管DNS服务器配置和实际协议允许这个值更大。C&C服务器的命令解析到IPv6地址。

一个典型的查询发送到C&C服务器是这样的:

n.n.c.<Session ID >.<Server domain>.com

图片1.png

 

图片2.png

传输层请求和响应的结构

在DNS隧道传输层上面适当的位置有一个会话层协议,这意味着交换“短”和“长”数据包的能力。会话层与传输层的不同之处在于,它有一种机制来检查丢失的消息。当传输层通过一种数据交换关闭会话时(该数据交换是关于发送和接收数据包的数量),会话层便检查确保每一个发送的数据包已经被正确接收进而关闭。由服务器决定使用哪个选项;例如,“长”数据包协议是用来从受感染的电脑上传文件。

图片3.png

短消息交换协议的例子

短消息

在这个层次上,聊天机器人(bot)的操作可分为五个步骤:

· 向服务器声明会话ID;

· 在数据包中发送消息;

· 发送已发送数据包数量;

· 接收传入数据包的数量;

· 接收传入的数据包。

一个会话的例子:

图片4.png

1. 向服务器声明会话ID

每次打开通信会话,bot都会生成一个GUID,并将其发送到服务器。然后使用该GUID识别会话中的所有通信,并且总是将该GUID写在第三级域位置。在本例中,URL具有以下结构:

n.n.c.<Session ID>.<Server domain>.com
The message A67DDB8A2A17334765443253702AA3 is a positive response. Otherwise, the GUID is sent to the server again.
n.n.c.<Session ID>.<Server domain>.com 

消息A67DDB8A2A17334765443253702AA3是积极响应的。否则,将再次发送GUID到服务器。

2. 以数据包的形式发送一条消息

正如我们前面说的,选择的通信机制将某些限制条件强加到数据包的大小上。将一条即将输出的消息分为60个字节长的数据包,并且以URL的形式发送:

<Outgoing packet>.<Packet number>.dr.<Session ID >. <Server domain>.com 

响应一定是A67DDB885A3432576548A2A3707334。

3. 发送已发送数据包的数量

当所有数据包发送成功,便发送已经发送的数据包数量,其数量作为一个查询以下面格式发送:

n.<Number of packets>.f.<Session ID >.<Server domain>.com

应该注意的是,数据包编号从0开始。响应是20202020202020202020202020202020。

4. 接收传入数据包的数量

这一步是通过以下URL格式的类型实现:

n.n.fc.<Sessions ID >.<Server domain>.com

 

响应一定是以下格式:

A67D: DB8: 85A3: 4325: 7654: 8A2A :: <Number of incoming packets>
Receive incoming packets

5. 接收传入的数据包

请求接收下一个数据包是这样的:

www. <Packet number>.s. <Session ID > .<Server domain>.com

以16字节IPv6数据包的形式传入消息。

长消息

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

· 发送文件分成的数据包的数量;

· 发送文件;

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

· 重新发送丢失的数据包。

来自查询的会话ID,在该查询中文件被要求。

1. 发送的数据包数量

查询: n.<Number of packets>.<Session ID >.<Server domain >.com  

回应:A67DDB8A2A17334765443253702AA3。 

2. 以数据包的形式发送文件

查询:<Outgoing packet>.<Packet number >.d.<Session ID >.<Server domain >.com

回应:服务器不回复这条信息,或者发送一个响应服务器故障。

3. 向服务器发送周期查询来检查数据包丢失

超过一般时间间隔,bot向服务器发送以下查询:

uff<Number of packets>.< Number of packets >.<Server domain >.com

  

回复:20202020202020202020202020202020

一系列操作之后,上一部分“接收传入数据包的数量”以及“接收传入数据包”的步骤已经实现。

作为响应,服务器所遗漏的数据包的数量(用逗号分隔开)被发送了。

4. 重新发送丢失的数据包

查询: <Outgoing packet>.<Packet number>.dl.<Session ID>.<Server domain>.com

OSI的表示层负责编码和解码消息。IPv4地址字段中包含的服务器响应是一个可被16整除的常规ASCII字符串。对包含在DNS查询中的服务器查询在Base64中使用重新定义的索引表进行编码。

图片5.png

 

图片7.png

第一个消息的例子及其在datagram主体里的代表

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

· 检查连接。这个查询字符串是“M:CC?”;

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

· 注册确认命令;

· “通用”回应 (M:ME?appId=<…>&message=<…>);

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

· 确认命令 (M:CR?cd=<Command GUID>);

· 发送文件 (M:SF?commandId=CmdResult=<Command GUID>|||<Result of command execution >);

· 接收文件 (M:GF?);

如上所述,这个木马的设计和编写都很好,拥有经过深思熟虑的通信系统,以及有多种功能的payload。下面是它的主要命令列表:

· SI——发送关于受感染系统的信息;

· RunNewVersion——更新;

· Restart ——重启;

· Remove——删除本身;

· CreateMimi1Bat——Mimikatz执行;

· ExecuteKL——激活键盘记录器;

· RemoveKL——删除由ExecuteKL创建的文件;

· GetVersion——木马版本报告;

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

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

· PauseDownload——暂停从服务器下载文件;

· ResumeDownload——恢复从服务器下载文件;

· PWS——截图;

· DownloadFile——从服务器下载一个文件;

· UploadFile ———上传文件到服务器。

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

Backdoor.Win32.ClIEcker

下一个示例使用基于ANY DNS 数据包的不同工作流。这种机制允许恶意程序从服务器接收随机结构的DNS数据包。有了该木马程序,就没有逻辑分解成子协议了——只有传出和传入的请求。我们能够检测到该木马的几个修改。下面,我们将描述所有列出的这些功能和特点。

Backdoor.Win32.ClIEcker其中一个有趣的特点是发现受害者计算机IP地址的方式——为了发现受害者计算机IP地址,它使用Internet Explorer的COM接口。该木马包含网站地址的列表,在该列表上游客可以看到自己的IP地址(例如http://www.ip-adress.com)。木马程序随机选择其中一个,访问地址,发现IP地址所遵循的页面主体的字符串,并提取它。为了尽可能地掩盖该查询,木马程序也会选择一个随机的推荐地址并且在对Internet Explorer适当的请求中使用该地址。

唯一仍不清楚的事情是,为什么会使用这样一个复杂的方法;通常,木马程序通过从一个网站请求数据找到计算机IP地址,以一个HTML页面的形式返回一个包含IP地址的字符串。这么操作做也许是为了避免解析到一个IP地址,对该木马程序来说可能在IoC列表中,或者它可能只是一个欠缺考虑的从代码库或论坛复制粘贴的工作。

为了使事情进一步复杂化,在来自服务器的请求上,该木马程序支持打开Internet Explorer上

一个网站的命令——为此,以 “IEXPLORE.EXE google.com”的形式使用了一个小调用,而不是复杂的COM交互。因此,木马可以作为一个Trojan-Clicker被检测到,不过,正如我们在之前的文章中解释过的,Trojan Clicker通常使用虚拟桌面来实现上述操作。

图片6.png

用于解析IP/推荐地址的URL地址的例子以及通过COM 接收页面内容

在最初的请求中,几个描述受害者系统的参数与惟一的RC4键一起被发送,该RC4键使用以下受害者电脑信息创建的:

· 操作系统的主要版本;

· 逻辑标志指示是否使用调制解调器连接;

· 木马ID;

· 用户的加密IP地址;

· 杀毒服务代码。

最后一点应该给一些解释。木马包含安全软件的列表;每个安全产品都在发送到服务器的这段代码中被编码。例如,所有与McAfee产品有关的进程都将用杀毒服务代码中的标志0 ×400表示。  

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

99.png

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

0.png

该文件以TXT DNS数据包的形式传输。

所有与服务器通信,在默认情况下,使用一个基于受害者计算机信息生成的RC4密钥加密。然而,服务器可能要求密钥是被改变的,并在文件下载请求中发送一个新的密钥。在任何情况下,生成S-box所需的密钥是用其本身加密的,并随后使用产生的字符串。根据数据包数量修改 S-box,因此对于每一个新的数据包都是唯一的。 

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

Backdoor.Win32.Denis

Backdoor.Win32.Denis拥有最简单的结构和最简单的DNS服务器通信功能。恶意软件的这段代码与本文描述的木马有相同的名字,但是也仅有此相似之处。

这个恶意程序使用 A DNS-格式数据包来与DNS服务器通信;在这种格式中,响应大小限制为4个字节。所有的指标都表明这是一个常规的木马下载程序(Trojan Downloader),下载文件的速度非常慢。发送给服务器的消息的典型格式如下:

IC<Container type>.<UID>.<Container>.<Server address>

通过“容器”,Trojan运算结果是打包的。命令和响应不同,容器的结构可能有很大的差异。是用户的ID UID字节长度为0x20 。是一个Base32字符串,编码之后有以下结构:

00.png

容器也是一个Base32字符串:

000.png

总共有四种类型的容器存在。根据接收到的命令,以及执行的结果,Trojan决定哪一个是必需的。

999.png

命令

0000.png

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

MD5

15b36b1e3a41ad80bbd363aea8f2d704 — Trojan.Win32.Ismdoor.gen
1FD599FB9FA62EB91511002771D78104 — Backdoor.Win32.ClIEcker
1f3a2c48a7f5c2c31e71f552d74c3543 — Backdoor.Win32.Denis

源链接

Hacking more

...