域名生成算法的生死对决
- Published on
域名生成算法(DGA)的字典定义是“在各种恶意软件家族中看到的算法,用于定期生成大量域名,这些域名可以用作与其命令和控制服务器的集合点”。在我们在Nominum(现为Akamai的一部分)监控的真实递归DNS流量中,我们观察到许多“奇怪”的DNS查询,其中许多是由恶意软件DGA生成的;以下是由Dyre银行木马(又名Dyreza)生成的域名示例:
t3622c4773260c097e2e9b26705212ab85.ws.
u83ccf36d9f02e9ea79a9d16c0336677e4.to.
v02bec0c090508bc76b3ea81dfc2198a71.in.
wa9e4628c334324e181e40f33f878c153f.hk.
xdcc5481252db5f38d5fc18c9ad3b2f7fd.cn.
yf32d9ac7f0a9f463e8da4736b12d7044a.tk.
恶意软件创建者使用算法生成的域名作为一种分散机制:他们用数千个基于DGA的域名请求淹没DNS流,但只选择少数域名提供真正的C&C服务,恶意软件可以在此找到其母舰并进行通信以获取指令。同时,可怜的安全研究人员被迫超负荷工作,试图发现并阻止这些选定的少 数。
除了制造分散,恶意软件创建者使用DGA是因为它们比硬编码的IP或域名更难检测;通过不在恶意软件二进制文件中硬编码C&C的位置,攻击者可以更好地隐藏和保护母舰;攻击者不断创建新的DGA,再次为安全研究人员创造工作过载,他们需要逆向工程二进制文件,或使用不同的机器智能驱动方法,以发现DGA。
在本文中,我们将讨论攻击者和安全研究人员在DGA战场上的这场生死对决。
DGA战场
任何DGA的一般方法是使用确定性伪随机生成器(PRNG)生成候选域名列表。PRNG的种子可以是当前日期,一些魔术数字,汇率等。这个随机生成器可以是单一的均匀分布生成器,例如使用位移、异或、除法、乘法和模运算的组合来生成字符串序列作为域名(如在Conficker、Ramnit等中);它也可以是一个规则生成器,从某个知识库中选择(如在Suppobox中)。例如,以下DGA算法使用当前日期作为种子,并使用PRNG生成DGA域的字符序列:
def generate_domain(year, month, day):
"""生成给定日期的域名。"""
domain = ""
for i in range(16):
year = ((year ^ 8 * year) >> 11) ^ ((year & 0xFFFFFFF0) << 17)
month = ((month ^ 4 * month) >> 25) ^ 16 * (month & 0xFFFFFFF8)
day = ((day ^ (day << 13)) >> 19) ^ ((day & 0xFFFFFFFE) << 12)
domain += chr(((year ^ month ^ day) % 25) + 97)
return domain

PRNG基础的DGA方法的关键是确定性随机生成器,其中DGA序列对于恶意软件和攻击者都是可预测的,因此攻击者可以生成并选择其中一些域名用于C&C服务,而恶意软件只需循环并到达选定的C&C。
这部分需要一些协议:DGA和种子必须在生成DGA域之前由双方知道。然而,这种协议交换不仅限于恶意软件和攻击者;任何人,比如我们安全研究人员,即使在感染后也可以复制它。这种非排他性特性为安全研究提供了突破点:通过拦截DGA和种子,可以预测恶意软件DGA域并阻止它们。
要获取DGA算法本身,安全研究人员可能需要在捕获恶意二进制代码后逆向工程恶意软件二进制文件。许多DGA算法已被多个项目和安全博客逆向工程并报告,例如:
拥有DGA算法并知道DGA种子是预测DGA域的充分条件,但不是获得DGA域列表的必要条件:我们可以将问题简化为将DGA流量与合法流量分开,并从流量中获取DGA域列表。在DNS流量中,我们可以建模一个特征相空间,其中DGA域查询和其他合法查询是可分离的,其中DGA(算法和种子)的真实情况不是必需的,任务可以抽象为找到这个“黄金相”空间。
有几种先进的机器学习方法可以找到这个相空间并将恶意DGA与合法分开,而无需逆向工程二进制文件。大多数这些方法使用客户端IP与域访问图特征;例如:
Domain2vec相关引擎使用表示学习在实时DNS流量中发现DGA集群。这种方法构建了一个序列模型来学习域相关性并捕捉恶意软件活动,因为恶意软件需要循环DGA名称。(另见——增强智能以扩展人类对抗僵尸网络):


这些方法将强条件减少到一个松散但更一般的条件,并解决了获得DGA和种子的困难。在本文的后半部分,我们将讨论一些只有这些松散条件方法才能检测到的案例。
在获得DGA算法后,战场现在转移到随机种子前线……
魔术数字种子
一些DGA仅使用当前日期作为种子,并在二进制文件中硬编码一些数字;这些DGA在算法被逆向工程时可以很容易地预测,例如在Conficker家族、Nymaim等中。
由于攻击者的目标是避免检测,使用魔术数字作为动态种子变得实用。魔术数字技术在今天非常普遍,Necurs(后门)、Locky(勒索软件)是结合使用日期/时间和魔术数字的好例子。魔术数字通常与日期结合在位移中并提供额外的变化。像Locky这样的流行恶意软件可以部署许多变体,每个变体都有不同的魔术数字以逃避检测(另见——博客 )。
由于DGA可以使用种子生成DNS流量,敏锐的研究人员可以通过使用DNS流量和DGA获取种子。为了捕获动态魔术数字种子,研究人员通常使用“重放攻击”技术,通过再现可能的DGA域并在DNS流量中验证它。OpenDNS,例如,使用一种暴力方法在DNS流量中搜索可能的数字种子(魔术数字),通过生成所有2³²组的Ramnit名称。
这种方法不仅对ramnit有效,对Necurs和其他DGA也有效,特别是当魔术数字较小时。然而,这种方法并不总是有用,因为生成所有2³²个名称可能很昂贵,恶意软件可以通过升级到2⁶⁴种子轻松逃避它,正如Murofet的DGA已经发生的那样。有团队提出并实施了一种更复杂的哈希碰撞方法,主要用于破解Locky的动态种子。这种方法不是在DNS流量中的所有种子与域上使用暴力线性测试,而是使用GPU计算并将可能的Locky DNS查询的哈希值与实时DNS流量碰撞以检测新种子。
除了魔术数字,魔术字符串或魔术域名也用于生成DGA域。目前,除了逆向工程二进制文件外,没有许多有效的方法来检测这些种子。
其他类型的种子
货币汇率可以用作随机种子。例如,广告/点击欺诈僵尸网络Bedep使用外汇汇率作为其种子。一些僵尸网络使用Twitter上最流行的标签作为DGA种子,正如Cybereason报道的那样,这些种子的共同想法是它们难以再现,并且种子可能不是一个简单的数字。
好的DGA,坏的DGA
DGA算法的创建者希望保持DGA的独特性,以便他们可以将其C&C流量与合法流量区分开来,并避免与其他DGA的碰撞。研究表明,一些DGA比其他DGA更聪明。
基于字典的DGA
在基于字典的方法中,算法生成的域名的创建方式有一点变化。正如我们所见,安全研究人员使用DNS字符串中的特征将恶意DGA流量与合法流量分开。建模工作查看了随机性、熵和其他词法字符串特征等属性,这些特征经常生成具有“随机”、“非人类可读”外观的域名。(参见博客 )。一些设计巧妙的DGA如Suppobox试图通过使用字典词来规避这种随机性。
高碰撞DGA
像Pykspa和Virut这样的DGA在我们的笔记本中得分较低:它们与其他合法名称和其他DGA有很强的碰撞。
Pykspa是一种蠕虫,其DGA在项目被逆向工程。这个DGA使用常见的TLD如com、biz、net、org、info和cc生成数千个可能的DGA域,其核心域有6-15个字符。这些数千个域淹没了递归DNS流量。由于这些大量域的常见TLD集和短域长度,安全研究人员很难清楚地识别和阻止它们,即使他们知道DGA+种子来预测。例如,一些短域如wgxodod.info.
、ydnpxkv.info.
、hrvxccq.org.
有很大机会与其他DGA(如Locky)或合法的.com名称碰撞。
Virut是另一种DGA,其中域名只有6个a-z字符,带有.com TLD,算法本身设计简单,因此生成的域与合法服务碰撞的机会非常高。我们观察到许多域名如wenxin.com
,这是一个合法域名,但它被一些安全研究人员报告为Virut。顺便说一句,域名akamai.com
遵循Virut DGA的确切模式。但不要太担心……
以安全的方式阻止这些高碰撞DGA域需要安全研究人员结合域预测方法与DNS流量;有团队最近实施了一个实时新核心域检测系统(用于从未见过的域),其中只有预测的DGA被阻止,只有在也被识别为新核心域时才被阻止。
非DGA
在DNS流量中,我们观察到许多“DGA样”,实际上不是DGA域。例如,在最近的流量中,我们看到这些7个字符的.ru域具有非常高的感染率:
bhzlyxh.ru.
qsxxzni.ru.
gwjijru.ru.
fyxkmbh.ru.
qwoumzw.ru.
kulfxxy.ru.
nrxboty.ru.
这些域名不是DGA,作者在二进制文件中硬编码了它们,并在不同的二进制文件中部署了不同的列表。这些名称在Ruskill/Dorkbot中使用,正如tech和360netlab 所报道的。
更新:关于Dorkbot背后的DGA正在进行讨论,Johannes Bader评论说Dorkbot每10秒生成这些名称并用作诱饵。

总结
DGA是攻击者工具箱中最有效和最流行的工具之一。它被各种恶意软件家族用来隐藏其C&C服务器的位置,从而保持僵尸网络的稳健性。同时,DGA在DNS流量中留下了大量的足迹。
在DGA创建者和安全研究人员之间的生死对决中,攻击者尽最大努力隐藏C&C并避免与其他DGA和合法服务的碰撞,而研究人员使用传统的逆向工程和现代机器学习来清楚地识别和阻止这些DGA。这场战斗远未结束,随着双方的成长将继续出现。