使用动态种子的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通信通道的寿命,但安全研究人员的工作是对这些措施最好的反击。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/608556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 基础 输入输出

一 C 的基本IO 系统中的预定义流对象cin和cout: 输入流:cin处理标准输入,即键盘输入; 输出流:cout处理标准输出,即屏幕输出; 流:从某种IO设备上读入或写出的字符系列 使用cin、cout这两个流对…

在Ubuntu上安装Anaconda之后,启动失败

为了方便管理Pythonu环境,在Ubuntu的Docker容器中安装了Anaconda,安装完成,启动时出现如下错误: conda activate xxx usage: conda [-h] [--no-plugins] [-V] COMMAND ... conda: error: argument COMMAND: invalid choice: acti…

Linux的基础IO:文件描述符 重定向本质

目录 前言 文件操作的系统调用接口 open函数 close函数 write函数 read函数 注意事项 文件描述符-fd 小补充 重定向 文件描述符的分配原则 系统调用接口-dup2 缓冲区 缓冲区的刷新策略 对于“2”的理解 小补充 前言 在Linux中一切皆文件,打开文件…

springcloud服务间调用 feign 的使用

引入依赖包 <!-- 服务调用feign --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>创建调用外部服务的接口 需要使用的地方注入 使用 启动类增…

CTFHUB-技能树-Web题-RCE(远程代码执行)-eval执行

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09; 文章目录 CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;eval执行解题方法&#xff1a;构造网址&#xff0c;查找当前目录文件并没有发现flag,接着查看上一级目录接着查看上一级接着查看上一级目录…

luceda ipkiss教程 66:金属线的钝角转弯

案例分享&#xff1a;金属线的135度转弯&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipkiss.geometry.shape_modifier import __ShapeModifierAutoOpenClosed__ from numpy import sqrtclass ShapeManhattanStub(__…

一种快速H.264 NALU快速搜索算法

1. 引言 在播放H.264码流的时候,进行NALU的搜索的效率高低影响着系统的性能。有采用普通逐字节搜索的算法,有利用cpu的simd的单指令多数据操作的并行功能进行搜索的算法,今天要介绍的是一个非常简单而且高效的快速搜索算法,而且不需要利用simd指令,搜索的速度甚至快于我之…

Spring-依赖来源

依赖来源 1 Spring BeanDefinition&#xff08;xml,注解&#xff0c;BeanDefinitionBuilder, 还有API实现的单例对象&#xff09; 2 Spring 内建BeanDefinition 3 内建单例对象 依赖注入和依赖查找的区别 Context.refresh() 的时候会调用这个方法&#xff1a;prepareBeanF…

如何通过wifi网络将串口数据发送到多个设备

摘要&#xff1a;当lora电台的速率无法满足高速传输时&#xff0c;可以考虑用“串口服务器”。本文介绍一下如何使用TP-LINK的TL-CPE300D实现一对多的数据发送。 当前也有使用lora电台的&#xff0c;但是lora电台支持的速率有限&#xff0c;可能最大支持到9600&#xff0c;甚至…

[虚拟机+单机]梦幻契约H5修复版_附GM工具

本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#xff0c;踩过的坑都给你们填上了 视频演示 [虚拟机单…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

PTP 对时协议 IEEE1588 网络对时 硬件基础

前言 在很多应用场景有精确对时的需求&#xff0c;例如车载网络&#xff0c;音视频流&#xff0c;工业网络。本文档将会阐述对时的硬件需求。 协议 流行的协议为 IEEE1588 标准指定的对时方法&#xff0c;名为 PTP 对时协议。 网卡硬件要求 找到某型网卡的特性描述&#x…

Antd Table组件,state改变,但是render并不会重新渲染

背景 在table上面&#xff0c;当鼠标放在cell上面的时候&#xff0c;需要去请求接口拉取数据&#xff0c;然后setList(res.result)后&#xff0c;希望render中的traceIds也能够实时更新渲染。 const [traceIds, setTraceIds] useState() // 需要展示在popover上面的数据&…

基于STM32F401RET6智能锁项目(环境搭建)

工程搭建 MDK&#xff0c;固件库&#xff0c;芯片包下载 下载keil5&#xff0c;stm32f4xx的固件库以及stm32f4的芯片包 keil官网&#xff1a;https://www2.keil.com/mdk5/ stm32中国官网&#xff1a;https://www.stmcu.com.cn/ 创建工程 1、新建一个工程文件夹&#xff0c;…

漫威争锋Marvel Rivals怎么搜索 锁区怎么搜 游戏搜不到怎么办

即将问世的《漫威争锋》&#xff08;Marvel Rivals&#xff09;作为一款万众期待的PvP射击游戏新星&#xff0c;荣耀携手漫威官方网站共同推出。定档5月11日清晨9时&#xff0c;封闭Alpha测试阶段将正式揭开序幕&#xff0c;持续时间长达十天之久。在此首轮测试窗口&#xff0c…

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…

Facebook消息群发脚本的制作思路!

在数字化社交日益盛行的今天&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;为企业和个人提供了广阔的交流与合作空间。 然而&#xff0c;手动向大量用户发送消息既耗时又低效&#xff0c;因此&#xff0c;开发一款能够自动群发消息的脚本成为了许多人的需求&…

JavaWeb之Servlet(上)

前言 1. 什么是Servlet (1) Servlet介绍 (2) Servlet运行于支持Java的应用服务器中。 (3) Servlet工作模式&#xff1a; 2. Servlet API 3. 第一个Servlet (1) 创建一个类实现Servlet接口,重写方法。或继承HttpServlet亦可 (2) 在web.xml文档中配置映射关系 标签的执行…

48. UE5 RPG 实现攻击伤害数字显示

在前面的文章中&#xff0c;我们实现了对敌人的攻击的受击效果&#xff0c;并且能够降低目标的血量&#xff0c;实现死亡效果。相对于正常的游戏&#xff0c;我们还需要实现技能或者攻击对敌人造成的伤害数值&#xff0c;并直观的显示出来。 所以&#xff0c;接下来&#xff0c…

电商核心技术揭秘52:数字化内容营销创新

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…
最新文章