使用动态种子的 DGA 家族:DNS 流量中的意外行为
编辑和评论补充:Tricia Howard 和 Lance Rhodes
执行摘要
Akamai 研究人员在域名系统 (DNS)流量数据中观察到动态种子 DGA(域生成算法)家族的意外行为,这种行为与其逆向工程算法所暗示的不同。本文对此进行了披露和解释。
这种行为改变表明恶意攻击者试图进一步增强 DGA 家族的能力,以延长其命令和控制 (C2) 通信通道的使用寿命,从而保护其僵尸网络。
安全研究人员发现,相比静态种子 DGA 而言,使用动态种子的 DGA 未来生成的域名更难以预测。
我们对 Pushdo 和 Necurs DGA 家族进行仔细研究后发现,两个家族在预计生成日期前后都会输出恶意域。
简介
在这篇博文中,我们将简单介绍 DGA,然后分享一些耐人寻味的发现。
Akamai 安全情报组能够分析源自 CacheServe DNS 服务器的 DNS 查询的匿名日志。在僵尸网络检测工作中,我们对 100 多个已知 DGA 家族的实际行为进行了观察和监控。
我们发现动态种子 DGA(DGA 的子集)经常出现与逆向工程 DGA 算法本身所暗示的截然不同的行为。更确切地说,我们看到 DGA 域名在预计生成日期之前被激活。
什么是域生成算法?
恶意软件(例如僵尸网络)通常需要与集中式服务器通信,以接收命令或更新。
DGA 是恶意软件中用来生成大量半随机域名的算法。
受感染的设备会定期尝试连接到 DGA 算法生成的所有域。只需成功连接到一个域即可与 C2 服务器建立连接。这使得网络安全研究人员更难中断其 C2 通信。
工作原理
例如,假设某僵尸网络使用某个虚构的 DGA 家族或其变体,而且该家族或变体每天生成 500 个恶意域名。
使用此 DGA 家族的受感染设备每天将查询所有这 500 个域名。该僵尸网络的 C2 服务器会在每天生成相同的 500 个域名(假设其使用相同的种子,后文会详细解释)。然而,恶意攻击者只需控制这 500 个域中的 1 个域,便可与受感染的设备(僵尸网络)建立通信。
有时种子会发生变化,生成一组新的域,然后重新开始建立通信。由于这些域频繁变化,而且通常是看似随机的域(例如“ghlidae[.]com”),这让安全研究人员难以阻止恶意流量。
DGA 家族的顶级域 (TLD) 为硬编码形式,并且大多仅限于那些获取成本低的 TLD。
目前有许多不同的 DGA。网络安全界发现一种新算法(有时是在设法进行逆向工程)后,通常会给它一个“家族名称”。知名的 DGA 家族包括 Conficker、 Mirai和 CryptoLocker 等。
DGA 的历史
恶意软件(包括 僵尸网络、犯罪软件以及 勒索软件 等)需要与受感染的设备进行通信。在 DGA 出现之前,恶意软件制作者只是将单个域或一系列域硬编码到恶意软件代码中。然后,受感染的设备会定期尝试连接到这些硬编码的域,以便建立与 C2 服务器的通信。
安全团队一旦掌握了恶意软件的源代码,就可以轻松将所有这些硬编码的域纳入阻止列表。
研究人员对阵攻击者:研究人员占据优势。
第一个实施 DGA 的恶意软件家族是 2008 年初发现的 Kraken 家族。但让 DGA 广为人知的是 2008 年下半年出现的 Conficker 家族。
Conficker.A 每天生成 250 个域名。Conficker.C 的影响力远超前者,每天生成的域达到 50,000 个。这导致安全团队每天必须检测和阻止的新域数量骤然猛增。而另一方面,恶意攻击者每天仍然只需要控制其中一个域名。
研究人员对阵攻击者:研究人员扳回一城。
提高 C2 通信的稳健性
DGA 让攻击者可以提高 C2 通信的稳健性,从而促进以下几种攻击的进一步发展:
分布式拒绝服务 (DDoS) 攻击
加密挖矿
贩卖受感染设备上的敏感信息
间谍软件
广告和电子邮件欺诈
恶意软件的自我传播
以上是目前为止持续侵扰网络安全领域的一些活动。事实证明 DGA 非常有效。
动态种子和静态种子分别是什么?
DGA 有两个主要类别:动态种子和静态种子。要了解其中的区别,我们首先要理解“种子”的概念。
种子本质上是伪随机数生成器 (PRNG) 的初始输入。种子对任何使用 PRNG 的算法的输出都有直接影响。
例如,使用 42 作为种子的特定 DGA 家族将始终输出完全相同的一系列域名。将种子更改为其他数字(例如 50)会得到截然不同的输出。
可想而知,种子对于 DGA 有着至关重要的作用。受感染的僵尸网络设备不仅要和它需要联系的 C2 服务器使用相同的 DGA 算法,还要使用相同的种子。
DGA 种子可以通过多种方式生成,并且可以有多种来源
DGA 种子不随时间变化时(通常为硬编码形式),我们称其为静态种子 DGA。
有些 DGA 使用的种子会随时间变化,我们将这些 DGA 称为动态种子 DGA。
静态种子 DGA
静态种子可以是随机数、名人姓名、独立宣言、词典或其他信息,恶意攻击者可以轻松将这些信息替换成其他内容。
这些种子通常会长期保持不变,并生成一致的域名序列。
只要算法不被破解,而且种子未被网络安全研究人员发现,这些 DGA 和种子组合就始终有效。反之,所有生成的域名都将被迅速纳入阻止列表。这时候恶意攻击者就会更改种子,以生成一系列新的域名。
在内部,我们将静态种子 DGA 简称为“静态 DGA”,本文接下来的部分将使用该术语。
动态种子 DGA
动态种子 DGA(或简称“动态 DGA”)企图进一步增加安全研究人员的工作难度。
动态 DGA 使用随时间变化的种子。最常使用的是当前日期。还有一些 DGA 使用外汇汇率、温度,甚至 Google 趋势或 Twitter 趋势主题。
在种子可预测的情况下,安全研究人员能够预测 DGA 在未来某个时间会生成哪些域名。当然,前提是安全研究人员已成功对 DGA 家族进行逆向工程。
如果种子基于日期,我们在 24 小时的时段内通常会看到同一组域名(也就是说,每天午夜过后会生成一组新的域)。
知道明天会有哪些 DGA 域被激活,我们就能够提前将这些域名纳入阻止列表,从而保护最终用户免受僵尸网络的侵害。
遗憾的是,对于 Google 趋势、温度或外汇汇率等不可预测的种子,我们无法做到这一点。即使我们掌握了这类 DGA 家族的源代码,也无法准确预测未来会生成的域名。
动态 DGA:期望与现实
我们的研究团队观察和分析了十几个 DGA 的意外行为。其中有两个特别值得关注,下面我们来看看它们的行为。
这两个例子都是使用日期作为种子的动态 DGA 家族。这意味着,通过将种子(日期)与逆向工程 DGA 相结合,我们应该能预测哪些域名会出现在 DNS 查询日志中,以及 何时会出现。
我们会将预测的情况与 DNS 流量数据中实际观察到的结果进行比较。
为了简短起见,在本节的其余部分,我们会将“使用日期作为种子的动态 DGA 家族”简称为“DGA”或“DGA 家族”。
流量数据中的 DGA 一览
图 1 可让我们对流量数据中的 DGA 有一个总体的认识。为了正确传达其背后的直观意义,我们需要了解一些背景信息。
首先,我们来定义两个轴。
x 轴代表预计日期(种子日期)与我们在 DNS 流量数据中看到 DGA 家族域名的实际日期之间的时间差(以天数衡量)。
y 轴是在流量数据中看到的不重复域的数量。
我们预期种子每 24 小时变化一次;也就是说,每天午夜过后,DGA 都会通过新的种子激活一组新域名。这代表我们在 24 小时的时段内会看到同一组域名,之后域名就会发生变化。这个部分由红色图表示。 红色条形 显示在没有延迟的理想情况下,我们预期会看到的这些 DGA 家族的数据。
右侧的 紫色条形代表在考虑 DNS 数据到达我们系统之前各个阶段的延迟时,我们预期会看到的情况。大多数延迟只会导致轻微右移,通常以分钟或小时而不是以天为单位进行衡量,除非是有意设计。
而左侧则是意外的情况,以 绿色条形表示。这是怎么回事?我们在 DGA 域名理论上的生成日期之前观察到了它们的存在!
这种异常的行为表明恶意攻击者已经修改了这些 DGA,意图进一步加大检测工作的难度,以保护他们的恶意活动。
Pushdo 家族流量
对于 Pushdo 家族,我们预期会在 x 轴上 0 至 1 天之间的 24 小时窗口期内看到所查询的全部域(图 2),由红色区域表示。
而在实际观察中,我们发现在预计日期前后 50 天的流量中都有不重复域名出现。域的数量峰值是 10,000,就出现在表示第 0 天的标记之前。
种子(日期)似乎通过一个类似正态分布的过程推移了 50 天。
其 Python 代码可能类似于下面这样:
import numpy as np
import pandas as pd
from datetime import datetime
seed = datetime.now().date()
shift = np.random.normal(loc=0, scale=15, size=1).astype(int)[0]
modified_seed = seed + pd.to_timedelta(f'{shift} days')
对于这种情况,我们的解释是恶意攻击者试图挫败或迷惑安全研究人员。
幸运的是,我们并没有被这种手法迷惑!我们的 DGA 检测系统覆盖了图 2 中可见的整个范围。
Necurs 家族流量
对于 Necurs 家族,我们看到不重复域名分布在预计日期前后 7 天的流量中(图 3)。在 +12 天标记附近还有一个小得多的峰,但这个峰的幅度足以被视为有意设计的结果。
这表明一部分恶意攻击者等待了足够长的时间才使用同一组域,他们将使用日期移到了预计日期的 7 天后,从而使域名的出现滞后了 7 天。
结论
在分析 DNS 请求中动态种子 DGA 的活动时,我们观察到一些意外行为。对此,我们的结论是,这些异常现象可以归因为恶意攻击者在用各种方式修改 DGA 种子。我们研究过的两个 DGA 家族(Pushdo 和 Necurs)在预计生成日期前后都会输出恶意域,范围最远可达预计生成日期前后 50 天。
分析表明,攻击者采取这种做法的目的是避开 DGA 检测系统,并且加大安全研究团队的工作难度。恶意攻击者一直在想方设法保护其僵尸网络并延长其 C2 通信通道的使用寿命,而安全研究人员的工作就是针对这些手段进行反制,更好地认识现实情况与预期情况的差别。
关注最新动态
敬请关注我们的 Twitter,实时查看我们的最新安全研究。