查看原文
其他

利用DNS隧道通信木马

2018-02-02 fyb波 看雪学院

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

 

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



Trojan.Win32.Ismdoor.gen


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

 

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

 

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

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


 

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

 

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

 

 图 短消息交换协议的例子



短消息


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

  • 告诉服务器会话ID

  • 用数据包发送消息

  • 发送已发送数据包的序号

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

  • 接收即将收到的数据包


一个会话例子如下图:

 

 

1. 告诉服务器会话ID

 

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

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>


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

 

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

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


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



长消息


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

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

  • 发送文件;

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

  • 重发丢失的数据包。


1. 发送数据包的数量

 

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

 

响应: A67DDB8A2A17334765443253702AA3

 

2. 发送文件

 

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

 

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

 

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

 

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

 

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编码。

 

 

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

 

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

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

  • 注册连接:这决定了可用的命令,以及受感染计算机和木马的ID(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?)。


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


  • 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地址 - 它使用了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,但正如我们在前面的文章中所解释的那样,木马程序通常使用虚拟桌面来执行此操作。

 

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

 

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

  • 操作系统的版本;

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

  • 木马ID;

  • 经加密的用户IP地址;

  • 反病毒服务代码。


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

 

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


编码
参数
描述

0

文件名

执行下载的文件

1

URL

在IE中打开特定网页

2,3

这些命令必须接收可执行文件的代码作为参数,保存文件并运行它。在第一种情况下,当前版本的木马停止运行。由于某些原因,这些命令被禁用。木马会忽略这个命令列表的其余部分,然后继续请求一个新的命令。

5

服务器查询周期(分钟)

服务器查询周期有两个可能的值:一个用来表示先前的命令列表已经全部执行,否则使用另一个,这个命令还设置了第一个选项的等待时间。

6

停止运行

7

等待周期(分钟)

暂停指定的周期

18

Modifier

如果Modifier >= 0,则执行列表上的下一个命令。否则,终止执行列表上的命令。

19

服务器查询周期(分钟)

在处理列表中断的情况下,设置服务器查询周期。

21

设置提示重新连接的标志位,这使得木马在完成之前的列表之后立即向服务器查询新的命令列表。

22

删除下载的文件

23

文件名

为下载的文件设置一个新名称

 

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


参数名
描述

File_Size

下载的文件的大小

SessionID

会话ID

ServerKey

从服务器接收到的RC4密钥

GetFile_URL

下载文件的URL

DNS_URL

将用于创建DNS隧道的DNS服务器的URL

GetPacketInterval

下一个数据包的服务器查询周期

KeyMod

用于修改密钥的标志

ReportURL

成功下载文件的服务器的URL

ExecMode

文件执行修饰符。如果大于2,则不会保存或执行文件。如果等于2,则文件将被保存并执行。否则,木马会尝试将下载的文件注入IE进程。

Packet_Number

数据包序号

 

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

 

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

 

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




Backdoor.Win32.Denis


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

 

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

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


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


偏移量
描述

0x0 – 0xF

包含用户主机名称

0x10 – 0x14

包含用户IP地址

 

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


偏移量
描述

0x0 – 0x3

以秒为单位创建消息所用的时间

0x4 – 0xB

'IACIMAOQ'签名

0xC – 0x22

消息

 

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


类型
目的
消息
描述

1

发送有关受害者系统的信息

有关用户系统中逻辑驱动器的信息

第一个字节表示发送的数据量;接下来的字节对:逻辑驱动器的字母和它的类型;其余的填充任意字符即可。

2

真实文件大小,当前文件大小,丢失响应的计数器

发送有关文件接收状态的信息

如果传输的文件尚未存在,则创建并将容器类型更改为1;否则,将发送一条消息,其中前4个字节包含编码为0xC0的消息中收到的完整文件大小;接下来的4个字节存储当前的文件大小;之后的4个字节包含来自服务器所丢失消息的计数器;其余填充任意字符即可。

3

发送有关成功接收文件的信息

在每次网络通信之前,将当前文件大小与实际文件大小进行比较。如果它们匹配,则容器类型将更改为4。

4

用代码0xCB发送有关命令执行成功的信息

命令

代码
参数
描述

0x7F

存储在第4个字节中,分钟数

暂停指定的分钟数,发送的容器类型为1。

0xC0

存储在最后三个字节中,传输文件的大小

接收传输文件的大小,发送的容器类型为2。

0xCB

将当前的可执行文件重命名为<APPDATA>\IACIMAOQ,发送的容器类型为4。

0xA

第二个字节存储数据包的编号,第三和第四字节是传输文件的一对字节

接收文件的一部分并写入,发送的容器类型为1。

 

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







本文由看雪翻译小组 fyb波 编译,来源securelist

转载请注明来自看雪社区


热门阅读



点击阅读原文/read,

更多干货等着你~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存