dga (Domain Generation Algorithm) 域名 生成算法 简介

article/2025/9/20 20:56:04

目录

一、引言

二、背景

三、检测

四、发展

五、总结


一、引言

恶意软件如今已经发展为威胁网络安全的头号公敌,为了逃避安全设施的检测,其制作过程也越来越复杂,其中一个典型做法是在软件中集成DGA(Domain Generation Algorithm)算法,产生速变域名,该方式作为备用或者主要的与C2服务器通信的手段,可以构造更加鲁棒的僵尸网络,做到对感染肉鸡的持续性控制。对应地,针对DGA算法的研究现在也是安全圈讨论的热点话题,学术界和工业界也有大量DGA域名检测的工作,但是在实际使用中存在误报过多的现象。由于传统DNS使用明文进行数据传输,造成严重的用户隐私泄露问题,DoT(DNS-over-TLS)、DoH(DNS-over-http)协议陆续通过RFC标准,用于保护用户隐私,但另一方面,加密DNS的使用将给DGA域名的检测带来新的挑战。

本文首先对DGA域名的背景做简单介绍,然后对各种DGA域名检测方法做梳理和汇总,并选择其中一种方法用于实际产品测试,对结果进行深入分析并给出相应建议,接着简单介绍加密DNS给DGA检测带来的挑战和检测加密DGA流量方法,最后总结DGA域名检测目前工作的不足和待解决的问题。

二、背景

近年来,恶意软件的数量和复杂度持续增长,催生了大量黑色产业链和网络犯罪行为,据统计,网络空间犯罪的资本市场到2018年止已经高达1500亿美元[1],为了维持持续的经济效益或其他目的,攻击者对肉鸡的管理是僵尸网络控制的重要问题,对肉鸡的进行有效管理,不仅有利于各种攻击类型的发起,更可以延长攻击被发现时间,并且实现攻击者真实身份的隐藏。现代恶意软件一般通过使用DGA算法与C2服务器建立通信,从而达到上述目的。

DGA域名原理

恶意软件利用DGA算法与C2服务器进行通信的原理如图1[2]所示,客户端通过DGA算法生成大量备选域名,并且进行查询,攻击者与恶意软件运行同一套DGA算法,生成相同的备选域名列表,当需要发动攻击的时候,选择其中少量进行注册,便可以建立通信,并且可以对注册的域名应用速变IP技术,快速变换IP,从而域名和IP都可以进行快速变化。

很显然,在这种方式下,传统基于黑名单的防护手段无法起作用,一方面,黑名单的更新速度远远赶不上DGA域名的生成速度,另一方面,防御者必须阻断所有的DGA域名才能阻断C2通信,因此,DGA域名的使用使得攻击容易,防守困难[3]。

图1 DGA域名工作原理

DGA域名分类

DGA算法由两部分构成,种子(算法输入)和算法,可以根据种子和算法对DGA域名进行分类,DGA域名可以表示为AGD(Algorithmically-Generated Domains)。

2.1 按照种子进行分类

种子是攻击者和客户端恶意软件共享的一个DGA算法的输入参数之一,不同的种子得出的DGA域名是不一样的。一般来说,种子可按如下方式进行分类:

1.基于时间的种子(Time dependence)。DGA算法将会使用时间信息作为输入,如:感染主机的系统时间,http响应的时间等。

2.是否具有确定性(Determinism)。主流的DGA算法的输入是确定的,因此AGD可以被提前计算,但是也有一些DGA算法的输入是不确定的,如:Bedep[4]以欧洲中央银行每天发布的外汇参考汇率作为种子,Torpig[5]用twitter的关键词作为种子,只有在确定时间窗口内注册域名才能生效。

根据种子的分类方法,DGA域名可以分为以下4类:

1.TID(time-independent and deterministic),与时间不相关,可确定;

2.TDD(time-dependent and deterministic),与时间相关,可确定;

3.TDN(time-dependent and non-deterministic),与时间相关,不可确定;

4.TIN(time-independent and non-deterministic),与时间不相关,不可确定;

2.2 按照生成算法进行分类

现有DGA生成算法一般可以分为如下4类:

1.基于算术。该类型算法会生成一组可用ASCII编码表示的值,从而构成DGA域名,流行度最高。

2.基于哈希。用哈希值的16进制表示产生DGA域名,被使用的哈希算法常有:MD5,SHA256。

3.基于词典。该方式会从专有词典中挑选单词进行组合,减少域名字符上的随机性,迷惑性更强,字典内嵌在恶意程序中或者从公有服务中提取。

4.基于排列组合。对一个初始域名进行字符上的排列组合。

根据种子和生成算法的不同,DGA域名可以选择不同种子类型和算法类型的组合方式,因此最终DGA域名的生成形式多样性高。

DGA域名存活时间

Plohmann Daniel等人[3]对43个恶意软件家族做逆向分析,实现了DGA算法并对超过1亿个DGA域名做分析,结合WHOIS信息,统计出了不同DGA家族域名存活时间的分布。每个DGA家族的域名存活详细信息不在此列出,感兴趣的读者可以直接阅读原文。

总结来说DGA域名的存活时间一般较短,大部分域名的存活时间为1-7天,因此DGA域名这种存活时间短的特性对防守方的检测实时性提出了更高的要求,防守方需要在尽量短的时间内对检测出DGA域名,并作出相应的处置措施,才能有效降低风险。

三、检测

DGA域名自曝光以来,其检测工作就在持续进行,在不同场景、不同时期,检测方法也呈现出一定区别,本节梳理相关工作并在实际产品中进行测试,给出算法在实际场景中遇到的问题和优化建议。

相关工作

按照检测方法的不同,DGA域名检测大致可以分为以下两种:基于文本分析、基于行为分析。

基于文本分析的代表工作有[9][10][11],[9]通过分析DGA域名与正常域名之间字符分布的差异,对IP产生的域名进行批量分类,[10]通过LSTM算法分析DGA域名与正常域名之间的差异,可以判定每个域名是否为DGA域名, 由于DGA域名的请求过程中会产生大量NXDomain,[11]对NXDomain进行分类,有效识别DGA域名。

基于行为分析的代表工作有[12][13],[12]对同一主机产生的NXDomain进行聚类和分类,可以发现感染主机,进一步发现C2域名,[13]将检测问题转为图的推理问题,从代理日志构造主机与域名之间的关系图,用一些真实信息作为种子作为图的输入,然后使用信念传播算法估计域名为恶意的边缘概率。

产品测试

该部分分为两部分,离线模型训练和线上产品检测。我们利用深度学习技术,自动化提取特征,对NXDomain进行分类,找出其中的DGA域名[15]。

2.1 模型训练

数据集:我们从DGArchive[14]收集DGA域名,其中包含约4570万个DGA域名,包含62个DGA家族,另外收集收集了大量良性NXDomain,包含1530万个域名,以这些数据为原始输入,进行有监督学习。

预处理:首先我们剔除良性NXDomain数据集中的少量噪声和DGArchive中的噪声,构造更加纯净的数据集,然后对数据集中包含的字符进行one-hot编码,作为神经网络模型的输入。

数据采样:由于各个类别的数据量不一致,为了使分类结果不产生偏差,我们确定一个阈值,对高于该阈值的类别进行下采样,最终保证每个类别的域名数量一致。

模型选择:选择CNN、LSTM、BiLSTM三种神经网络模型进行测试,神经网络最后一层分别选择:sigmod和sofmax两种函数,实现二分类和多分类,并且进行模型调参。

交叉验证:对数据集进行5折交叉验证。

实验结果。图2为3种神经网络模型的多分类统计结果,由于包含的DGA家族数量较多,多分类的实验效果总体表现不佳。我们查看每种DGA家族的分类情况,如图3所示,我们随机选择33种DGA家族和良性域名进行展示(34类),可以发现很多DGA家族几乎可以做到100%的分类准确率,尤其是基于字典的DGA家族,如:suppobox,banjori,volatile等。

图2 不同神经网络模型的多分类统计结果

图3 CNN多分类(34分类)的混淆矩阵

我们将多分类中所有DGA家族的类别合成一种类别,比较二分类与FANCI[11]的实验结果,如图4所示,实验结果表明,我们在二分类上具有很高的准确率,并且优于现有的基于NXDomain检测DGA域名的方案。

图4 二分类结果

2.2 产品测试

在离线模型中,我们发现各种深度学习算法的表现相差不大,挑选速度最快的CNN模型用于产品的日志检测,检测过程如下。

选取2019年产品DNS日志,挑选出其中的NXDomain进行检测,共计669万域名。经过如下过滤手段:

本地白名单。我们构建了本地白名单列表,二级域名如果能匹配上该列表则过滤该域名,过滤后剩余545万域名。

顶级域名合法。数据中存在大量顶级域名不存在的DNS请求,这些域名不是DGA域名,过滤后剩余463万域名。

Alexa_top_10000。Alexa top 10000的域名一般认为都是对大型企业的访问,理论上不存在DGA域名,过滤后剩余444万域名。

将剩余的444万个域名通过保存的CNN模型进行检测,检测结果显示有42万DGA域名。

2.3 结果验证

2.3.1确定误报

对检测出的高可疑的DGA域名进行分析,制定如下将误报的策略:

1.去除二级域名为”afftb288.com”的域名,检测结果中有38万主域名为“afftb288.com”,如“41959214.afftb288.com”、“34308479.afftb288.com”,虽然该域名属于赌博网站,但经判定该域名不符合DGA域名特征,过滤。

2.去除主域名长度小于等于5的域名,由于DGA域名要避免与正常域名碰撞,被恶意软件使用的DGA域名长度一般也大于5,因此删除此类域名,如“baidu.com”中,主域名“baidu”长度 <=5,需要进行过滤。

3.删除正规机构域名,检测结果中有少量正规机构的域名,如”ztmbec.com”,“speedy.com.ar”等。

经过上述过滤手段,待确认域名剩余2.7w

2.3.2确定DGA域名

根据公开的威胁情报,我们发现两类DGA域名,

第一类包含2572DGA域名,其中主域名有206个,如:

lhsjtcl.com

dfwpmpm.me

lzxemfc.com

tmhufuf.com

zccaotl.com

orahcre.org

eoerkfc.com

pycbumk.com

第二类为挖矿木马C2,如:zeruuoooshfrohlo.su,大约110个,

2.3.3持续监测

对于剩余2万多高可疑DGA域名,我们给出DGA域名的置信度评分和可能的恶意软件家族信息,并进行持续监控、与恶意样本关联分析等后续操作。

四、发展

DGA域名从最开始的伪随机字符串开始进入人们的视野,由于该方式产生域名的字符分布与正常域名的分布有明显区别,易被检测,攻击者转而使用基于字典的DGA域名算法,从字符分布上尽量拟合正常域名,极大地降低了字符的随机性。近年来,随着DNSCrypt、DoT、DoH等DNS加密协议的制定和部署,越来越多的恶意软件使用加密流量逃脱监控,并且有研究表明已经发现使用DoH的恶意软件[6]。

随着加密DNS的进一步部署,预计将来有更多DGA域名通过加密DNS协议进行传输,针对使用DGA域名botnet的检测将会更加困难,文章[7]利用pydig工具对DGA域名和正常域名发送请求,产生加密流量,做了进一步分析,去除TLS握手等阶段的无效信息,文章对数据包大小进行分析,发现DGA域名与Alexa域名的的加密数据包大小分布存在明显差异,图5[7]表明,数据包大小可以在加密DNS流量中可以作为区分DGA域名的重要依据。

图5 DGA域名与Alexa域名通过DoT协议传输的数据包大小分布

虽然文章没有对加密协议、是否使用Padding技术、如何识别DoH流量等因素做深入讨论,但这些因素对于数据包大小的影响很大,对检测结果的影响有待进一步研究。

五、总结

DGA域名从2009年被曝光以来[5],至今发展了整整10年,虽然有大量文献研究DGA域名的性质、检测、防御、追踪等一系列话题,也有大量机构参与DGA域名的阻断、sinkhole工作,但是DGA域名迄今为止仍然作为一种主流与C2服务器通信的手段被广泛采用,由于笔者能力限制,无法给出产生这种现象的原因,到底是学术论文中的方法在实际使用中有效性弱,还是工业界的部署、处置方式不当,需要进一步进行探索,总之我们对DGA域名的研究治理工作仍然任重而道远。

 

 


http://chatgpt.dhexx.cn/article/fVE8qUV1.shtml

相关文章

你没见过的中文编程工具,用中文开发android安卓应用,安卓开发的初体验!

如果你对中文开发有一定的了解&#xff0c;那么你一定会知道易语言。易语言是仿VB制作的一款中文编程工具。它可以用来开发Windows软件。那有没有用于android安卓开发的中文编程工具呢&#xff1f;有&#xff01;那就是猎码安卓中文开发工具 小编身为一个程序员&#xff0c;在…

自学android编程教程,安卓编程入门教程 安卓编程如何自学

安卓编程入门教程 安卓编程如何自学 时间:2017-04-10 来源:Android开发学习网 安卓编程越来越火,发展前景无比诱人,越来越多的人加入了android开发者的行列。安卓编程入门很简单,今天小编给大家提供一份安卓编程入门教程,告诉大家安卓编程如何自学,希望能够给您带去帮…

没有编程基础如何做安卓开发,试试这款简单易学的中文开发编程工具!

对于没有java编程基础的人来说,想要开发自己的安卓app可能很难。 我们都知道,现在流行的编程工具都是外国人开发的。全英文的界面,再加上全程使英文来写代码,让很多初学者望而却步。绝大部分人选择花费一大笔学费去参加培训班,一学就是几个月,有的甚至半年多。那有没有什…

安卓编程基础——网格布局

目录 前言 一、新课讲解 &#xff08;一&#xff09;网格布局概述 1、布局特点 2、继承关系图 3、常用属性 &#xff08;二&#xff09;案例演示&#xff1a;计算器界面 1、创建安卓应用 2、准备背景图片 3、字符串资源文件 4、自定义边框配置文件 5、主布局资源文件…

Android应用程序开发需要哪些编程语言?

开发一款Android上的应用程序通常需要以下编程语言&#xff1a; Java&#xff1a;Java是Android开发的主要编程语言。几乎所有的Android应用程序都使用Java进行核心开发。你可以使用Java编写应用程序的业务逻辑、界面设计和数据处理等。 刚好我这里有嵌入式、plc、单片机的资料…

安卓编程基础——触摸事件

文章目录 前言 一、安卓事件触摸概述 1、触摸分类 2、触摸动作 3、触摸监听器 4、触摸方法 5、触点个数与坐标 6、安卓触摸事件处理机制 二、使用步骤讲解 1.创建安卓应用 3、字符串资源文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用&#xff0c;查看效果​编辑 总结…

在手机上如何用c语言编译器编程,如何用手机进行编程?

这里介绍3种可以在手机上编程的app&#xff0c;分别是c语言编译器(c语言)、AIDE集成开发环境(java)、QPython3(python)&#xff0c;都不需要root&#xff0c;可以直接编写程序并运行&#xff0c;下面我简单介绍一下这3个app的安装和简单使用&#xff0c;主要内容如下&#xff1…

Android 网络编程

【Android 网络编程】 HTTP HTTP简介 HTTP是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&#xff0c;经过几年的使用与发展&#xff0c;得到不断地完善和扩展。 HTTP协议的主要特点 支持C/…

安卓编程基础——手势编程

目录 前言 &#xff08;一&#xff09;安卓手势操作原理 &#xff08;二&#xff09;安卓手势类与接口 二、利用手势切换图片 1.创建安卓应用 3、字符串资源文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用&#xff0c;查看效果 总结 前言 现代智能手机都支持…

安卓编程基础——列表

零、本讲学习目标 理解列表视图的四大组成元素 能使用基于数组适配器的列表视图 能使用基于简单适配器的列表视图 能使用基于基适配器的列表视图 一、导入新课 列表视图是基于适配器的供用户从多个选项中进行选择控件&#xff0c;可以通过滑动显示很多列表项。 二、新课讲解…

安卓编程基础——标签

目录 前言 &#xff08;一&#xff09;继承关系图 &#xff08;二&#xff09;标签常用属性 &#xff08;三&#xff09;教学案例&#xff1a;标签演示 1、创建安卓应用 2、字符串资源文件 3、自定义边框配置文件 4、主布局资源文件 5、主界面类实现功能 6、启动应用&a…

安卓编程基础——菜单

前言&#xff1a;学习目标 知道三种菜单使用场景能够正确使用三种菜单 一、新课讲解 菜单在安卓应用程序中占有比较重要的位置。原生安卓提供了三种类型的菜单&#xff1a;选项菜单&#xff08;OptionsMenu&#xff09;、上下文菜单&#xff08;ContextMenu&#xff09;和子菜…

安卓并发编程基础

1.线程 1.线程与进程的区别。 进程是程序运行和资源分配的基本单位&#xff0c;一个程序至少有一个进程&#xff0c;一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元&#xff0c;而多个线程共享内存资源&#xff0c;减少切换次数&#xff0c;从而效率更高。线程是…

【安卓开发】安卓网络编程

目录 一、安卓Socket客户端二、安卓Socket客户端优化&#xff08;小车遥控器拓展&#xff09;三、Android非UI线程修改空间程序崩溃问题一种新的解决办法&#xff1a;Handler类&#xff08;倒计时软件&#xff09; 四、Android网络接收数据并刷新界面&#xff08;综合练习&…

storm-executor-spout(2)

2121SCSDUSC storm-executor-spout&#xff08;2&#xff09; 用一个spout读取Twitter数据。采用拓扑并行化&#xff0c;多个spout从同一个流读取数据的不同部分。如果有多个流要读取&#xff0c;可以在任意组件内&#xff08;spouts/bolts&#xff09;访问TopologyContext。…

php读取excel效率,PhpSpreadsheet VS Box\Spout读取excel性能对比

phpspreadsheet版本:1.5.0 spout版本:2.7.3 在同样的环境下,运行代码,spout的在内存使用和时间花费上都占优,在phpspreadsheet读取失败的文档spout依然能正确完成读取。 spout代码 ini_set(memory_limit, 2G); var_dump(memory_get_usage()); var_dump(microtime()); $loa…

KafkaSpout 浅析

最近在使用storm做一个实时计算的项目,Spout需要从 KAFKA 集群中读取数据&#xff0c;为了提高开发效率&#xff0c;直接使用了Storm提供的KAFKA插件。今天抽空看了一下KafkaSpout的源码&#xff0c;记录下心得体会。 KafkaSpout基于kafka.javaapi.consumer.SimpleConsumer实现…

storm trident的多数据流,多spout

storm trident的多数据流&#xff0c;多spout (STORM)[storm, kafka] storm可以使用接收多个spout作为数据源&#xff0c;core storm与trident均可以&#xff0c;本文主要介绍trident的用法。 在trident中设置多个spout的基本思路是先建立多个spout&#xff0c;然后分别创建…

storm学习笔记(二)——Storm组件详解之Tuple、Spout

目录 Tuple元组 结构 生命周期 Spout数据源 结构 开发spout组件 Storm的核心概念包括&#xff1a;Stream、Spout、Bolt、Tuple、Task、Worker、Stream Grouping、Topology Stream是被处理的数据&#xff0c;Spout是数据源&#xff0c;Bolt是处理数据的容器&#xff0c;T…

java 纳秒 格式化_Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。...

通过Java日期时间API系列1-----Jdk7及以前的日期时间类中得知,Java8以前除了java.sql.Timestamp扩充纳秒,其他类最大只精确到毫秒;Java8 time包所有相关类都支持纳秒。下面是示意图: 图中的nano 是 一秒钟包含的纳秒值,0到999999999。毫秒,微秒和纳秒都是通过这个值计算得…