使用动态种子的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 npimport pandas as pdfrom 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.mzph.cn/web/8092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式,完成引导进程。 启动的代码init.c中的main函数执行过程:system\core\init.c中: 主要下面两个重要的过程: 1…

批量将GOID转成GO term名并添加BP,MF,CC分类信息

基因本体论(Gene Ontology,GO,https://www.geneontology.org)是一个广泛应用于生物信息学领域的知识库,它提供了一套标准化的词汇和分类体系,用于描述基因功能、细胞组分和生物过程。GO旨在统一科研人员对基…

无人机+垂直起降:微型共轴双旋翼无人机技术详解

微型共轴双旋翼无人机技术是一种独特的无人机设计,它结合了垂直起降(VTOL)能力和微型无人机的灵活性。这种设计允许无人机在无需跑道的情况下垂直起降,并具备在空中悬停和执行各种飞行动作的能力。 适用于集群控制,荷载…

自动选择图表类型:基于数据特征智能决策

前言 在数据可视化的世界中,选择正确的图表类型对于有效地传达信息至关重要。图表类型的选择不仅影响数据的呈现方式,而且直接影响观众对数据的理解。自动选择图表类型可以大大简化数据分析的流程,尤其是在处理动态源或大量数据集时。本文将…

NXP i.MX8系列平台开发讲解 - 1.1 导读前言

专栏文章目录传送门:返回专栏目录 文章目录 目录 1. 本专辑介绍 2. 学习本专辑作用 3.关于作者 1. 本专辑介绍 本专辑将会介绍Linux 驱动开发,Android BSP 驱动涉及HAL层调试,适用于嵌入式软件开发人员,和有兴趣向该方向发展…

基于单片机的无线数据传输系统设计

摘要:基于单片机的无线数据传输系统的设计,实现了温度和湿度的自动采集、无线通讯和报警功能。该系统包括了LCD1602显示电路、DHT11温湿度采集电路等,完成了基于无线数据传输的方法来实现温湿度的采集。 关键词:温湿度检测;N RF 24 L 01;单片机 0 引言 随着科技水平的提高,…

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

前端实现导入Excel进行数据展示、导出

需求 一个 excel 文档 需要对文档里面的数据进行筛选拆分重组 由于数据量巨大 后端又抽不出来手 于是使用纯前端解决方案 解决思路 前端导入excel 把 excel 的数据解析为 json 格式 对数据进行相应操作后 重新导出为新 excel 虽笨但有效 第一步 导入excel 该方案需引…

Promise魔鬼面试题

文章目录 题目解析难点分析分析输出step1step2step3step4step5step6 参考/致谢:渡一袁老师 题目 Promise.resolve().then(() > {console.log(0);return Promise.resolve(4);}).then((res) > {console.log(res);});Promise.resolve().then(() > {console.l…

spark sql 与scala混合开发实现数据入mongodb

目录 概述资源解决问题效果环境配置相关包关键代码 测试测试结果 概述 在此提供 spark sql 与scala混合开发实现数据入mongodb 相关思路 将部分重复性功能进行通用化(使用SQL与Scala混合开发模式)。 相关组件 hadoop 3.3.6 spark 3.4.2 kyuubi 1.8.0 基于上术组件开发 资源 …

QT设计模式:抽象工厂模式

基本概念: 抽象工厂模式是一种创建型设计模式,封装了一组相关或依赖的对象的创建逻辑,而不需要指定具体的类。 使用抽象工厂模式,客户端可以创建一系列相关的对象,而无需关心这些对象的具体实现细节,从而…

uniapp video 层级覆盖

层级覆盖 cover-view组件 我这里做了个判断 监听全屏时隐藏按钮 根据项目需求自行更改

c++ 判断点和折线 距离

目录 点在折线y方向的投影的距离 判断点是否在折线下方&#xff0c;不求距离 点在折线y方向的投影的距离 x相同时&#xff0c;y的差异。 #include <iostream> #include <vector> #include <cmath> #include <limits>struct Point {double x, y; };…

鸿蒙编译子系统详解(八)hb env、clean、tool、help

1.5.5 hb其他 除了编译相关的hb set和hb build&#xff0c;hb还有其他模块。 1.5.5.1 hb env env主要是打印编译环境信息。 env的相关源码与set、build类似&#xff1a; build/hb/modules/interface/env_module_interface.pybuild/hb/modules/ohos_env_module.pybuild/hb/resol…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格&#xff0c;按照业务板块来划分应用代码…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限&#xff0c;想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation(&#xff09; 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

群晖上部署农场管理系统farmOS

什么是 farmOS &#xff1f; farmOS 是一个基于 Web 的应用程序&#xff0c;用于农场管理、规划和记录保存。它由志愿者社区开发&#xff0c;旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是&#xff0c;群晖内核版本太低会遇到下面的错误&#xff0c;这个 AH0…

高实时、高可靠的微内核操作系统——鸿道Intewell

近年来&#xff0c;我国不断推进工业转型升级&#xff0c;力求实现从传统工业大国向现代工业强国的跨越。想要在新一轮科技革命中“超车”&#xff0c;需要从多个维度进行深度布局和全面发力。 ——科技创新是核心驱动力 积极推动工业结构的优化和升级&#xff0c;通过发展新…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

python环比分析日常消费数据掌握月支出增减情况

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.分析 一.前言 月支出是指个人或家庭在一个月内用于消费、投资、储蓄等方面的资金流出总额。它是反映个人或家庭经济状况的重要指标之一,可以帮助人们更好地规划和管理自己的财务。 月支出的构成…