如今越来越多的设备添加了与互联网相连的功能,借此来提高自身性能,改善用户体验。但是大多数设备都没有配备足够的安全措施来保护自己的数据,这就使得这些设备很容易被滥用。
滥用的最普遍形式之一就是用这些相互关联的设备创建僵尸网络,这是个拥有强大计算能力的互连设备隐蔽网络,这种强大的计算能力往往会被滥用来大范围操纵垃圾电子邮件或DOS攻击活动。经过这几年企业与执法部门之间的共同努力,主要的几个僵尸网络(如Rustock、Ramnet和 Waledac)已经被打破。但是,由于很难确定它们发送指令和控制的服务器,目前仍有无数的此类网络依旧活跃。
很明显我们需要开发出更先进的识别技术,尤其是查明C2面板的好办法,这样才能提供明确的证据要求禁用托管C2的IP/域名,这也是发生滥用的指标。这种方法也会十分有利于研究僵尸网络,并最终彻底击败僵尸网络。
一般情况下,我们会先观察到存在恶意软件活动,然后才会发现僵尸网络面板,接下来会确定具体的恶意软件所连接的“背后凶手”。这种鉴定过程往往需要对C2面板类型十分了解的研究人员手动操作。在接下来的文章中,我们将会讨论一种新型的、易于规模化应用的全自动鉴定C2面板方法,这种方法需要的请求数量非常少,所以基本不会被僵尸网络操作人员发现。
介绍
机器学习可以解决查明僵尸网络指挥和控制(C2)面板这个大问题。虽然机器学习本身就是一个难以掌握的难题,但是这带来了一个全新的解决问题工具,对于黑客和工程师来说这是划时代的变化。
在感受过机器学习的能量之后,我迫切地想要将其攻破并运用在更多的安全工具中。在2016年美国黑帽大会上我们展示了这一系列工具。这一项目的相关内容以及项目的Chrome 扩展可以在GitHub 中找到。
鉴别僵尸网络面板
在追踪僵尸网络时,像我一样的安全工作者经常会发现隐藏很深的C2面板。尽管DiamondFox的开发者选择确定面板的真正目的,但事实上大多数开发者都习惯于掩盖自己的意图。
举例来说,Zeus的登陆页面看起来十分正常,毫不起眼:
在许多案例中,僵尸网络的运行者都会粉饰自己的C2面板,甚至会骗过最专业的研究人员,使其难以辨别真相。
但是按常理来说,这些运营商一定不会花费心思改写整个面板,所以总会有一些残留的内容。这些残留一般会藏在资源文件中。
机器学习vs 僵尸网络面板
我们可以结合机器学习与模糊哈希打造一个弹性分类器,这样可以按需优化成尽可能少的请求,用来查明这些僵尸网络面板,不管这些面板是否经过修改。
从机器学习的角度来看,这一课题带来了许多有趣的挑战。最大的问题就是已知的活跃僵尸网络面板数量有限。回顾过去可以找到很多已知的活跃面板,但是在给定时间内已知的活跃面板少之又少。这是因为在大多数案例中,某个面板一经发现,用不了多少时间就会被取缔。
活跃样本数量稀缺使得分类变得困难,只有找到更多的数据我们才能更顺利地开展工作。此外,由于这是一个对抗性问题,我们的分类手段必须要能适应僵尸网络运营商的策略,以避免检测。这就意味着我们可能会需要做很多不必要的工作。
最后,我们需要隐身和效率,这就意味着请求数量越少越好。因此,我们需要尽可能减少分类所需的信息量,这就要求我们要以一种微妙的平衡来处理这一问题。
经过这一方法分类之后,僵尸网络面板主要有以下几类:
Andromeda
Betabot
Citadel
Cythosia
Dendroid
Dexter
DiamondFox
Ice IX
JackPOS (Easter variety)
Pony
Solar bot
VertexNet
Zeus
收集特征和样本
将机器学习融入现实世界面临的最重要也是最困难的问题之一就是特征工程。特征通常情况下会表示为0到1之间的值,这些值会从数据中提取,然后输入机器学习的算法当中。
在许多情况下,这一过程中的困难就是确定有关信息,这将会贯穿所有样本(数据点),并且为分类提供了所需值。在我们的示例中,我们正打算在请求结果的基础上创建特征,借此来确定它是否是C2面板。
为了创建功能设置,我们需要确定所有已知的、与僵尸网络C2面板有关的偏移量,我将这一设置叫做“prevectors”。我们对测验组中的每一个样本都请求了所有的已知偏移量,这组测验组当中的所有URL我们都已经确定了它们的属性。这样操作之后界面非常混乱,因为每一个面板都产生了成千上万个请求。
为了更加清晰,我们为测验组中的每一个面板都请求了所有已知偏移量,并将HTTP回应代码和使用这些结果返回结果的ssDeep都存储下来。这使得我们能够确认所有的状态代码都是相同的,并且比较内容时无需存储这些内容。因为首先会匹配回应代码,所以ssDeep对比产生的评分就相当于特征值。
我们已经在所有已知僵尸网络和非僵尸网络中运行了 prevectors,之后需要通过查找重复结果来减少请求数量。如果对于同一个给定请求,相应代码是相同的,那么ssDeep值就是100%匹配,那我们就可以删除这个多余特征。
在减少了特征集之后,我们开始将prevectors 转换为矢量。简单来说,机器学习领域的矢量就是一维数组的值,它们代表从样品中提取的特征。将一个样本转换成矢量时,我们会以同样的顺序处理每一个特征,并且更新矢量中的每个值来匹配特征结果。
一旦生成了矢量集,就可以将其贴上“标签”存储起来,标签会说明这是哪个僵尸网络的面板:
训练
现在我们有了自己的矢量和对应标签,可以将其分类为训练组和测试组。训练组大约占到样本数量的80%,剩下的就是测试组。
我们需要确保每一个标签都经过这两个组的检验,尽管这一步骤十分简单,却是极其重要不容忽略的一步。如果我们没能在每个组中包括每一个标签的样本,我们就无法让模型学会区分每个标签,并在模型建成后测试其准确性。
在我们的示例中,我们选择使用决策树集合以满足需求。决策树是一个简单的分类,针对每个特征制定二进制决策,从而将训练数据完美地分成包含大多数(或全部)标签的多个小组。决策树的最大优势就是能够基于很小数目特征制定决策,并因此为我们提供实际所需的信息。
不幸的是,这种做法总会过拟合,意思就是它们从训练数据中提取太多信息,对测试数据却完全不够。为此,我们重新整合了决策树(训练多重决策树并让其表决答案),这可以避免过拟合:
分类
一旦模型建立,我们就可以将其传递给决策树。每一个决策树都会为其分配标签,之后所有的决策树结果会结合出出现最多的最终结果。对于这种对抗性问题,用户还会看到标签的置信水平,可以说明该标签的可信程度。
例如:
Chrome扩展
一般来说,我会在浏览器中检查、搜索页面来确定僵尸网络。为此,我已经创建了一个Chrome扩展,结合这个模型可以在我访问的任何网站中自动执行这个分类方法。
在访问一个新的网站目录时,它就会自动执行请求分类(请求数目少于40个),如果发现有关僵尸网络的任何迹象会立刻警告用户。相关结果会存储下来,以便日后参考。
详情请参考:
结论
僵尸网络面板分类是个棘手的问题,但是机器学习的创新应用可以快速有效地解决它,随着数据的不断增长,这个强有力工具的价值会日益显现。它对安全专业人员和工程师的作用也会越来越大,至少目前这是个了解机器学习的好帮手。
发表评论
您还未登录,请先登录。
登录