来源:https://www.endgame.com/blog/technical-blog/data-science-security-using-passive-dns-query-data-analyze-malware
大多数情况下,DNS服务——生成与数字IP地址相对应的人类友好、易于记忆的域名——用于合法目的。但它们也被黑客大量利用,将恶意软件(或恶意软件)路由到受害计算机,并构建僵尸网络来攻击目标。在这篇文章中,我将演示如何将数据科学技术应用于被动DNS查询数据,以识别和分析恶意软件。
僵尸网络是一个受恶意软件影响的主机网络,通常在其所有者不知情的情况下进行恶意活动。隐藏在网络中的一个命令和控制主机与受影响的计算机通信,发出指令并接收结果。在这种僵尸网络拓扑中,命令与控制成为单点故障。一旦它的IP地址被识别,它就很容易被阻塞,与僵尸网络的整个通信就会丢失。因此,黑客更可能使用域名来识别命令和控制,并使用快速流量等技术来切换映射到单个域名的IP地址。
作为Endgame的数据科学家,我们利用大量的数据集来对付僵尸网络。虽然我们每天分析的数据通常是专有的和保密的,但佐治亚理工学院提供了一个公开的数据集,记录了恶意软件在2011年至2014年间发出的DNS查询。恶意软件被包含在一个受控的环境中,互联网接入受到限制。每个域名查询都被记录下来,如果一个域名可以被解析,相应的IP地址也被记录下来。
这个恶意软件的被动DNS数据本身并不能提供足够的信息来进行全面的僵尸网络分析,但它确实在DNS查询方面拥有丰富和有价值的关于恶意软件行为的见解。我将解释如何根据这个数据集来识别恶意软件,并使用Endgame data science团队日常使用的一些方法。
一、DNS查询的图形表示
这是我要检查的数据集。每一行都是DNS查询的记录,包括日期、恶意软件文件的MD5、被查询的域名以及查询结果的IP地址。
什么方法可以使用特定的域名对恶意软件或可疑程序分组?由于我们没有关于恶意软件的信息,传统的静态恶意软件分析侧重于调查二进制文件将没有帮助。只有将每个域名作为一个特征来处理时,使用机器学习进行聚类才可能有效,但是特征空间将非常稀疏。这将导致昂贵的计算。
相反,我们可以使用一个显示恶意软件感兴趣的域名的图形网络来表示DNS查询,如图1所示。每个恶意软件程序都用MD5字符串标记。虽然图1只演示了网络的一小部分,但是整个数据集实际上可以转换到一个巨大的网络中。
以图形的格式表示查询有很多优点。首先,这加快了查询复杂关系的速度。现代图形数据库(如Neo4j、Orientdb或Titandb)可以有效地存储大型图形网络并执行联合查询,而对于关系数据库(如MS SQL Server、Oracle或MySql)来说,联合查询的计算开销通常比较大。其次,可以使用来自不同科学领域的网络分析方法来分析数据集,以获得额外的见解。
二、恶意软件网络图分析
整个被动DNS数据集涵盖了几年,所以我随机挑选一天数据收集期间,将分析减少数据集。图中被创造出来一天的数据,包括域名和节点和恶意软件MD5字符串。换句话说,图中的节点可以是MD5字符串或域名,如果MD5查询该域名,则边(或连接)链接MD5和域。节点总数为17629条,边数为54939条。每个节点的平均连接数约为3。
在我的DNS查询图中,有两组不同的节点:域名和恶意软件。图论将这样的网络定义为二部图,如图2所示。我想把这个图分成两个图,一个包含域名的所有节点,另一个只包含恶意程序。这可以通过将大型图投射到两组节点上来实现,这将创建两个图。在每个图中,如果两个节点与另一种类型的相同节点有连接,则它们由一条边连接。例如,域xudunux.info和rylicap.info将在域图中连接,因为它们都与较大图中的相同恶意软件有连接。
让我们先看看恶意软件的图表。仅2012年9月29日一天,数据集中记录有9876个唯一的恶意软件。首先,我想知道这些恶意软件的拓扑布局,并找出恶意软件图中有多少个连接组件。
连接组件是节点的子集,其中任意两个节点通过一条或多条路径彼此连接。我们可以把相互连接的组件(或者仅仅是组件)看作是没有桥相互连接的岛屿。
Python编程语言有一个优秀的网络分析包,称为networkx。它有一个函数来计算一个图的连通分量的数量。运行名为number_connected_components的函数的结果显示,在9,876个节点的图中有2,114个组件,其中1,619个是单节点组件。仍然有11个组件中有超过100个节点。我将分析这些大型组件,因为恶意软件可能是同一程序的变种。
图3显示了恶意软件图的四个组件。每个组件中的节点彼此紧密相连,但不与任何其他组件相连。这意味着分配给组件的恶意软件明显具有一些类似的特征,而其他组件的恶意软件则没有这些特征。
组件1包含201个节点。我计算了图中节点的介数中心性,它们都是0,而节点的紧密中心性值都是1。这表明每个节点与组件中的其他节点有直接连接,这意味着每个恶意软件查询的域名与其他恶意软件程序的域名完全相同。这是一个强有力的证据,表明所有201个恶意软件都是某种恶意可执行文件的变种。
让我们回到大型DNS查询图,找出恶意软件的目标域。使用像Neo4j或OrientDB这样的图形数据库,或像networkx这样的图形分析工具,搜索很容易。结果表明,组件1中的恶意软件只对三个域名感兴趣:ns1.musicmixa.net、ns1.musicmixa.org和ns1.musiczipz.com。
我查询了组件1中的201个恶意软件。VirusTotal将MD5提交给扫描引擎列表,并从这些引擎返回报告。一份报告包括其对MD5的肯定或否定的判断。如果是肯定的,报告将根据扫描引擎使用的签名,提供更多关于MD5是哪种恶意软件的信息。
我通过计算阳性结果数与总结果数之比,给每个恶意软件打分。分数分布如图4所示。扫描报告暗示该恶意软件是一个Wind32木马。
三、使用社交网络分析来了解未知
当我观察每一个分量时,并不是所有的分量都有像分量1那样高的同质性。一个不同的组件有2722个恶意软件节点和681060条边。该组件中的2722个恶意软件中,有309个未被VirusTotal发现,其余的2413个恶意软件在网站上有报告。我们需要一种方法来分析那些未知的恶意软件。
社会网络分析(SNA)方法通过识别已知的类似于未知的恶意软件来洞察未知的恶意软件。第一步是尝试将大型组件分解为社区。社区的概念在社交网络中很容易理解。社区内的联系通常比社区外的联系紧密得多。社区成员往往具有一些共同的特征,如使命、地理位置或职业。在这个分析中,恶意软件被连接,如果他们查询同一个域,可以解释为两个恶意软件显示了一个域名的共同兴趣。因此,我们可以预期,查询过类似域的恶意程序代表了一个社区。社区存在于一个连接的组件中,与组件的概念不同,社区之间仍然有连接。
社区检测是机器学习领域中一种特殊的数据聚类方法。在图形网络中,社区检测的方法有很多种。Louvain方法是一种著名的、性能良好的方法,它试图通过将图划分为密集连接的节点组来优化模块化度量。通过将Louvain方法应用于具有2,722个节点的大组件,我可以确定15个社区以及每个社区中的节点数量,如图5所示。
让我们以一个特定的恶意软件为例。该恶意软件的MD5为0398eff0ced2fe28d93daeec484feea6,在VirusTotal上搜索该恶意软件未找到结果,如图6所示。
我想知道什么恶意软件程序有最相似的行为在DNS查询这未知的恶意软件。通过研究我们确实了解的类似恶意软件,我们可以洞察未知的恶意软件。
我发现恶意软件0398eff0ced2fe28d93daeec484feea6在社区4,其中有256个恶意软件。为了找到最相似的恶意软件程序,我们需要一个定量的相似度定义。我选择使用Jaccard索引来计算两组查询域的相似性。
假设恶意软件M1查询一组域D1,恶意软件M2查询另一组域D2。集合D1和D2的Jaccard指数计算如下:
Jaccard索引从0到1,1表示精确匹配。
在组件1的2722个节点中,有100个恶意软件程序有与恶意软件0398eff完全相同的域查询。这意味着他们针对恶意软件0398eff的Jaccard指数为1。然而,已知的恶意软件只有9种。9个恶意软件如下图所示。
100个恶意软件程序中的每一个,包括已知的9个,都有与恶意软件0398eff相同的域查询。Jaccard指数的直方图如图7所示。
从直方图中我们可以看出,community 4中的恶意软件程序一般可以分为两组。一组包含100个恶意软件,它们的域查询与恶意软件0398eff完全相同,而另一组包含的节点与恶意软件的相似度要低得多。图8中的图形可视化演示了分割。通过这一分析,我们发现那些以前不为人知的恶意软件的行为与一些已知的恶意软件相似。
这篇博客文章演示了我如何使用DNS查询数据进行基于网络的恶意软件图形分析。对域名也可以进行类似的分析,以识别可能被恶意软件程序一起查询的域名组。这可以帮助识别以前未知的潜在恶意域。
考虑到我们这些身处安全世界的人每天处理的大量数据,数据科学技术是识别恶意软件和目标领域的一种日益有效和信息丰富的方法。虽然机器学习和集群倾向于主导这类分析,但基于社交网络的图形方法应该越来越多地成为数据科学工具箱中检测恶意软件的另一个工具。通过识别社区、中介和相似度评分,网络分析不仅有助于显示连接性,还有助于显示网络中的逻辑分组和异常值。将恶意软件和域视为一个网络,为大数据安全环境的争论提供了另一种更直观的方法。鉴于DNS被动查询数据的有限特性,图形分析方法补充了传统的静态和动态方法,提高了恶意软件分析的能力。