Bootstrap

使用动态种子的DGA:DNS流量中的意外行为

Akamai研究人员最近在域名系统(DNS)流量数据中观察到:使用动态种子的域名生成算法(Domain Generation Algorithm,DGA)的实际行为,与对算法进行逆向工程推测的预期行为之间存在一些差异。也就是说,通过逆向工程得到的数据进行推断,认为某个算法应该产生行为A;但在现实环境中,该算法产生了行为B。

这种行为的变化表明恶意人员正试图进一步提升DGA的能力,以延长其C2通信通道的寿命,从而保护自己的爬虫网络。安全研究人员还发现,相较于使用静态种子的DGA,使用动态种子的DGA更难以预测未来生成的域名。对Pushdo和Necurs等DGA的深入研究还发现,它们在预期生成日期之前和之后都会输出恶意域名。

本文我们就一起来看看这些DGA到底要做什么,会对我们产生哪些影响。

背景

Akamai安全情报团队分析了来自CacheServe DNS服务器的匿名化DNS查询日志。作为我们对爬虫网络检测工作的一个环节,我们观察并监控了100多个已知DGA家族的实际行为。

观察发现,使用动态种子的DGA(DGA的一个子集),其行为往往与逆向工程DGA算法所推测的行为有较大差异。更具体来说,我们发现DGA域名在其预期生成日期之前就被激活了。

域名生成算法(DGA)是什么?

诸如爬虫等恶意软件通常需要与一个集中式服务器通信,以接收命令或更新。而DGA就是用于在恶意软件中生成大量半随机域名的算法。

被感染的设备将定期尝试连接由DGA所含算法生成的完整域名集。只需成功连接一个域名,就能与C2服务器建立连接。这使得网络安全研究人员更难以关闭C2通信。

DGA的工作原理

假设有一个使用虚构的DGA算法每天生成500个恶意域名的爬虫网络。

使用这个DGA的被感染设备将每天查询这500个域名。爬虫网络的C2服务器将在每天生成相同的500个域名(前提是使用了相同的种子,详见下文)。然而,恶意人员只需要控制这500个域名中的任何一个,就能与被感染的机器(爬虫程序)通信。

有时算法使用的种子会改变,从而生成一个新的域名集,然后重新开始上述过程。这使得安全研究人员难以阻止恶意流量,因为域名经常变化,往往看起来像是随机的域名,比如“ghlidae[.]com”。顶级域(TLD)通常是写死的,并且一般会使用那些售价较为低廉的TLD。

目前现实环境中有很多DGA。一旦安全社区发现了一个新算法(有时成功进行了逆向工程),通常会给它取一个“家族名称”。一些最著名的DGA家族包括Conficker、Mirai和CryptoLocker等。

DGA的历史

类似爬虫网络、犯罪软件和勒索软件这样的恶意软件需要与被自己感染的设备通信。在DGA出现前,恶意软件作者只是将域名或一组域名写死到恶意软件代码中。被感染的设备随后将定期尝试连接这些写死的域名,从而与C2服务器通信。

一旦安全团队获取了恶意软件的源代码,将这些写死的域名放到封锁列表中就成为一种非常容易的工作。

研究人员:1分;坏人:0分

第一个实施DGA的恶意软件是2008年初的Kraken。然而同年晚些时候,Conficker就让DGA变得流行起来。

Conficker.A每天生成250个域名。随后Conficker.C更胜一筹,每天生成大约50000个域名。这导致安全团队不得不每天检测和封锁大量新域名。然而,恶意人员仍然只需要每天控制其中任何一个域名。

研究人员:1分;坏人:1分

提高C2通信的健壮性

DGA使得多人员可以增强C2通信的健壮性,进而推动:

  • 分布式拒绝服务(DDoS)攻击
  • 加密货币挖矿
  • 出售受感染设备中的敏感信息
  • 间谍软件
  • 广告和电子邮件欺诈
  • 恶意软件的自我传播

这些情况持续困扰着网络安全社区,而这恰恰证明了DGA非常有效。

动态种子和静态种子是什么?

DGA分为两个主要类别:动态种子和静态种子。要了解其中的区别,首先必须先理解“种子(Seed)”的概念。

种子本质上是伪随机数生成器(PRNG)的起始输入。种子对于使用PRNG的任何算法的输出结果都会产生直接影响。例如,一个使用“42”作为种子的特定DGA家族算法将始终生成完全相同的域名列表。将种子更改为其他值,例如50,将导致完全不同的输出内容。

可想而知,种子对于DGA起着至关重要的作用。感染爬虫的设备和所联系的C2服务器不仅要使用相同的DGA算法,还要使用相同的种子。

DGA种子能以各种方式生成,并可基于各种来源。当DGA种子不随时间流逝而变(通常是写死的)时,即可将其称之为静态种子的DGA;一些DGA使用随时间流逝而变化的种子,即可将其称之为动态种子的DGA。

· 静态种子的DGA

静态种子可以是随机数、名人姓名、独立宣言、词典中的单词,或者恶意人员可以轻松替换的其他任何东西。这些种子通常在很长一段时间内保持不变,因而可以生成一致的域名序列。

只要算法没有被逆向工程,种子没有被网络安全研究人员发现,这些DGA和种子的组合就会始终有效。当这种组合失效后,所有生成的域名将被迅速放入封锁列表,恶意人员随后将不得不更改种子以生成一个新的域名列表。

在内部,我们将静态种子的DGA简称为“静态DGA”,下文将使用这个术语来称呼这一概念。

· 动态种子的DGA

动态种子的DGA(或简称“动态DGA”)会进一步让安全研究人员的工作变得更复杂。

动态DGA使用与时间相关的种子,最常用的是当前日期。此外还有一些DGA会使用外汇汇率、温度,甚至谷歌趋势或Twitter热门话题等。

如果种子是可预测的,网络安全研究人员就可以预测DGA在将来某个时候能生成哪些域名。当然,前提是成功地对DGA家族进行了逆向工程。

如果种子是基于日期的,我们通常会在24小时的窗口期内得到相同的一组域名(即每天午夜后刚过,会生成一组新域名)。

知道明天哪些DGA域名将被激活,让我们能主动将这些域名放入封锁列表,以保护最终用户免受爬虫网络的影响。然而,对于不可预测的种子(如谷歌趋势、温度或外汇汇率等),就无法提前进行封锁了。即便我们拥有DGA家族的源代码,也无法正确预测未来会生成哪些域名。

动态DGA:期望与现实

Akamai的研究团队观察并调查了十多个DGA的意外行为。下文会简单介绍其中两个特别有趣的。

这两个例子都是使用日期作为种子的动态DGA。这意味着通过将种子(日期)与逆向工程后的DGA相结合,我们应该能够预测自己将在DNS查询日志中看到哪些域名,以及这些域名何时会出现。

那就将我们的预测与我们在DNS流量数据中实际看到的情况对比一下吧。简洁起见,在下文中我们将简单地使用“DGA”或“DGA家族”来代表“使用日期作为种子的动态DGA”。

图1:流量中DGA的概览

流量数据中的DGA视图

图1是流量数据中DGA的概览。为了更方便大家了解其含义,我们需要先分享一些背景知识。

首先,让我们定义一下坐标轴:

  • x轴代表在DNS流量数据中看到的DGA域名的预期日期(种子日期)与实际日期之间的时间差(以天为单位)。
  • y轴是在流量数据中看到的唯一域名的数量。

我们预期种子每24小时更换一次。也就是说,每天午夜过后,DGA将激活一个由种子生成的新域名集,这种情况在图中用红色来代表。红条显示了我们在理想(即没有延迟)的情况下从这些DGA家族中所期望看到的情况。

右侧的紫色条形代表考虑到DNS数据到达我们系统前的各个阶段所经历的延迟后,应当期望看到的情况。大多数延迟只会导致略微向右移动,通常以分钟或小时为单位,而不是以天为单位,除非这是出于设计目的。

然而,左侧的绿色条代表一些意外情况。这代表什么?我们在理论生成日期之前就观察到了DGA生成的域名!这种奇怪的行为表明,恶意人员已经修改了这些DGA,以进一步使检测变得困难,并保护其恶意活动。

Pushdo家族的流量

图2:Pushdo恶意软件家族

对于Pushdo家族,我们预期在24小时窗口内可以从x轴上的0到1天之间看到所有查询的域名(图2),即图中的红色阴影区域。

然而实际上我们观察到的是从预期日期的前50天到后50天内,唯一域名呈分布态势,峰值恰巧位于“0”点之前,数值为10000。看起来种子(日期)经过了一个类似于正态分布的移位,最多可达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家族流量

图3:Necurs恶意软件家族

对于Necurs家族,我们看到唯一域名分布在前后7天的范围内(图3),在后12天标记周围也有一个较小(其实已经足够大了)的峰值,这也可以看作是特意设计的产物。

这表明一些恶意人员会等待足够长的时间来使用相同的一组域名,但会在预期日期过后7天才开始使用,这也让域名经历了7天的延迟。

结论

在通过DNS请求日志分析动态种子DGA家族的活动时,我们观察到一些意外行为。Akamai认为,这些异常行为可以归因于恶意人员以各种方式修改DGA种子。我们所研究的两个DGA家族(Pushdo和Necurs),在其预期生成日期之前和之后都会输出恶意域名,范围可达预期生成日期的前后50天。

分析表明,这是恶意人员为避免DGA检测系统,并使安全研究团队的工作变得更加复杂所采取的措施。虽然恶意人员会继续设法保护其爬虫网络并延长C2通信通道的寿命,但安全研究人员的工作是对这些措施最好的反击。

;