使用动态种子的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 基于上术组件开发 资源 …

uniapp video 层级覆盖

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

2024.5.6 关于 SpringCloud 的基本认知

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

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

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

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

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

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

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

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′|┛ 嗷~~ 目录 一.前言 二.代码 三.分析 一.前言 月支出是指个人或家庭在一个月内用于消费、投资、储蓄等方面的资金流出总额。它是反映个人或家庭经济状况的重要指标之一,可以帮助人们更好地规划和管理自己的财务。 月支出的构成…

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略 目录 GPT4ALL的简介 0、新功能 1、特点 2、功能 3、技术报告 GPT4ALL的安装和使用方法 1、安装 2、使用方法 GPT4ALL的案例应用 LLMs之LLaMA3:基于GPT4ALL框架对LLaMA-3实现…

【DeepLearning.AI】吴恩达系列课程——使用ChatGPT API构建系统(持续更新中——)

目录 前言一、Language Models, the Chat Format and Tokens(LLM,交互形式)1-1、加载api-key1-2、使用辅助函数(即指令调整LLM)1-2、使用辅助函数(聊天格式)1-3、辅助函数修改(输出字…

文件各种上传,离不开的表单 [html5]

作为程序员的我们,经常会要用到文件的上传和下载功能。到了需要用的时候,各种查资料。有木有..有木有...。为了方便下次使用,这里来做个总结和备忘。 利用表单实现文件上传 最原始、最简单、最粗暴的文件上传。 前端代码: //方…

WPF 图片显示某一部分区域

效果图&#xff1a; 代码&#xff1a; <Image Width"32"HorizontalAlignment"Right"Height"32"Source"../../Resources/Images/BLUEWOLF.jpg"><Image.Clip><PathGeometry><PathFigure StartPoint"32,32&quo…