导语: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
传输层请求和响应的结构
在DNS隧道传输层上面适当的位置有一个会话层协议,这意味着交换“短”和“长”数据包的能力。会话层与传输层的不同之处在于,它有一种机制来检查丢失的消息。当传输层通过一种数据交换关闭会话时(该数据交换是关于发送和接收数据包的数量),会话层便检查确保每一个发送的数据包已经被正确接收进而关闭。由服务器决定使用哪个选项;例如,“长”数据包协议是用来从受感染的电脑上传文件。
短消息交换协议的例子
短消息
在这个层次上,聊天机器人(bot)的操作可分为五个步骤:
· 向服务器声明会话ID;
· 在数据包中发送消息;
· 发送已发送数据包数量;
· 接收传入数据包的数量;
· 接收传入的数据包。
一个会话的例子:
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中使用重新定义的索引表进行编码。
第一个消息的例子及其在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通常使用虚拟桌面来实现上述操作。
用于解析IP/推荐地址的URL地址的例子以及通过COM 接收页面内容
在最初的请求中,几个描述受害者系统的参数与惟一的RC4键一起被发送,该RC4键使用以下受害者电脑信息创建的:
· 操作系统的主要版本;
· 逻辑标志指示是否使用调制解调器连接;
· 木马ID;
· 用户的加密IP地址;
· 杀毒服务代码。
最后一点应该给一些解释。木马包含安全软件的列表;每个安全产品都在发送到服务器的这段代码中被编码。例如,所有与McAfee产品有关的进程都将用杀毒服务代码中的标志0 ×400表示。
接下来,我们将对一些命令给出相应描述:
带有代码8的命令值得特别关注,因为它包含了木马的主要功能。它的工作就是下载和启动负载。这个命令有以下参数:
该文件以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字符串,编码之后有以下结构:
容器也是一个Base32字符串:
总共有四种类型的容器存在。根据接收到的命令,以及执行的结果,Trojan决定哪一个是必需的。
命令
从命令的描述可以看出,该木马程序的目的是下载和启动文件。
MD5
15b36b1e3a41ad80bbd363aea8f2d704 — Trojan.Win32.Ismdoor.gen
1FD599FB9FA62EB91511002771D78104 — Backdoor.Win32.ClIEcker
1f3a2c48a7f5c2c31e71f552d74c3543 — Backdoor.Win32.Denis