导语:多年来,网络安全供应商和研究人员一直在分析PowerShell是如何被网络攻击者用来安装后门程序、执行恶意代码,以及如何在企业内网中实现攻击目的的。PowerShell的灵活性和其特别的属性使传统的检测行为和方法疲于应对。为此,本文特以Fire
前言
多年来,网络安全供应商和研究人员一直在分析PowerShell是如何被网络攻击者用来安装后门程序、执行恶意代码,以及如何在企业内网中实现攻击目的的。目前的安全关系不再是攻击者和防御者的攻防游戏了,其中越来越多的研究人员也参与进来了。PowerShell的灵活性和其特别的属性使传统的检测行为和方法疲于应对。为此,本文特以FireEye为例,说说他们是如何利用人工智能和机器学习来进行恶意PowerShell检测的。
在这篇文章中,你会了解到:
1.为什么恶意PowerShell很难用传统的“基于签名”或“基于规则”的检测引擎进行检测;
2.如何应用自然语言处理(NLP)来应对恶意PowerShell的挑战;
3.NLP模型如何检测恶意的PowerShell命令,即使有混淆的PowerShell命令也可以被检测出来;
4.如何增加攻击者绕过安全解决方案的代价(成本、时间),同时尽可能缩短检测引擎的安全内容的发布时间;
PowerShell如此难防的原因
PowerShell是最流行的用于执行攻击的工具之一,来自FireEye Dynamic Threat Intelligence (DTI)云的数据显示,整个2017年恶意PowerShell攻击都在不断增加。
上图是FireEye DTI Cloud在2017年观察到的PowerShell攻击统计数据,蓝色条为检测到的攻击数量,红色曲线为增长速率
FireEye多年来一直在追踪PowerShell的恶意使用,2014年,Mandiant(Mandiant就是FireEye的全资子公司,其在2013年被FireEye以10亿美元收购)的高级威胁情报分析师发布了一份文件,里面涵盖了PowerShell攻击中使用的各种攻击策略、攻击技术和过程(TTP),以及在磁盘、日志和内存中恶意使用PowerShell生成的各种取证工件。2016年,FireEye发布了一篇关于如何改进PowerShell日志记录的博客文章,该文章可以更好地让用户了解潜在的攻击活动。最近,FireEye在关于APT32的深入报告中,再次强调了攻击者使用PowerShell进行侦察和感染的过程,过程如下图所示。
PowerShell攻击在APT32的整个攻击过程中扮演的角色
现在让我们来深入探讨一个恶意PowerShell命令的样本:
恶意PowerShell命令样本
以下是对其中一些命令参数的简要解释:
· -noprofile:表示在PowerShell引擎启动时不应该执行当前用户的配置文件设置脚本;
· -NonI:NonInteractive的简写,意思是用户不会看到交互提示符。
· -W Hidden :“- window style Hidden”的简写,表示PowerShell会话窗口应该以隐藏的方式启动;
· -Exec Bypass :“-ExecutionPolicy Bypass”的简写,禁用当前PowerShell会话的执行策略(默认不允许执行)。应该注意的是,执行策略并不代表着是安全策略;
· -encodedcommand :表示下面的文本块是用base64编码的命令;
在Base64解码的部分代码中隐藏着什么呢?下图就为我们显示了解码后的命令。
样本的解码命令
有趣的是,解码命令还顺便揭露了一个隐藏的无文件网络访问和远程内容执行攻击。
· IEX是Invoke-Expression cmdlet的别名,它负责执行本地计算机上提供的命令。
· 通过New-Object创建新对象时会创建了一个. net框架或COM对象的实例,本文为net.webclient对象。
· Downloadstring负责将创建的内容从<url>下载到内存缓冲区(IEX将执行该缓冲区)。
值得一提的是,最近一次利用CVE-2017-10271进行加密货币挖掘的加密攻击中使用了类似的恶意PowerShell策略。这种攻击涉及利用该漏洞来提供PowerShell脚本,而不是直接下载可执行文件。这个PowerShell命令特别隐蔽,因为它在感染的主机上几乎没有文件构件,这使得传统的杀毒程序很难检测到PowerShell攻击。
我认为PowerShel如此受攻击者喜欢的原因主要有以下3个:
1.PowerShell作为一种强大的系统管理脚本工具,已经在Microsoft Windows中得到了广泛的应用;
2.大多数攻击逻辑都可以用PowerShell编写,而不需要安装恶意的二进制文件,这样就可以在攻击端实现最小的内存占用;
3.传统的基于签名的检测规则是无法应对PowerShell的灵活语法所带来的挑战;
此外,从攻击成本的角度来看:在攻击性方面,攻击者修改PowerShell以绕过基于签名的规则的成本非常低,尤其是使用开源混淆工具时。在反检测方面,为针对PowerShell攻击,而专门编写基于签名的规则非常耗时,而且仅限于专家层面。接下来,看看FireEye是如何对PowerShell进行研究然后进行防御的。
用于检测恶意PowerShell的自然语言处理(Natural language processing,NLP)
首先我先问大家一个问题,你认为是否可以使用机器学习来预测恶意的PowerShell命令?
FireEye的一个优势是他们拥有高质量的PowerShell样本库,这些样本是从FireEye的各种解决方案和部署在全球的数据库中获得的。另外,FireEye与PowerShell专家密切合作,制作了许多用于测试的命令集,其中包括恶意命令,以及企业网络中的良性命令。
在查看了PowerShell语料库之后,研究人员很快就意识到使用机器学习来检测恶意PowerShell。为此他们构建了一个识别PowerShell命令文本的NLP模型,类似于Amazon Alexa对语音命令的识别。
自然语言处理的技术难题之一是同义词问题,这应该是语言学研究的一个问题。例如“NOL”,“NOLO”和“NOLOGO”在PowerShell语法中具有相同的语义。而在NLP中,词干算法会将词干还原为其原始形式,如“Innovating”利用词干算法被还原为 “Innovate”。
FireEye使用名为Trie的高效数据结构为PowerShell命令语法创建了一个基于Trie的词干分析器。Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。Trie树可以利用字符串的公共前缀来节约存储空间。如下图所示,该trie树用10个节点保存了6个字符串tea,ten,to,in,inn,int:
在该trie树中,字符串in,inn和int的公共前缀是“in”,因此可以只存储一份“in”以节省空间。当然,如果系统中存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存,这也是trie树的一个缺点。
如下图所示,即使在PowerShell等复杂的脚本语言中,trie也可以在几纳秒内阻止命令令牌。
PowerShell语法中的同义词(左)和trie词干分析器中捕获的内容(右)的对等关系
FireEye研究人员开发的整个NLP插件关键功能模块如下表所示:
· 解码器:检测和解码任何编码的文本;
· 命名实体识别(Named Entity Recognition,NER):检测并识别任何实体,如IP、URL、电子邮件、注册表项等;
· 令牌标记器(Tokenizer):将PowerShell命令标记为一个令牌列表;
· 词干分析器:使用trie将词干令牌转换成语义相同的令牌;
· 词汇向量化处理器(Vocabulary Vectorizer):将令牌列表量向量化为机器学习的格式;
· 监督分类器(Supervised classifier):实施二进制分类算法的有内核支持向量机(Support Vector Machine);GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注;以及深层神经网络;
· 推理(Reasoning):解释机器学习为什么会做出这样的预测,使分析人员能够验证预测结果;
以下是通过NLP插件传输上述样本的关键步骤:
1.如果有Base64命令的话,会向检测并解码Base64命令;
2.使用命名实体识别(NER)识别实体,例如<URL>;
3.标记整个文本,包括清晰的文本和模糊的命令;
4.处理每个令牌,并基于词汇表对它们进行向量化处理;
5.使用监督分类模型预测恶意概率;
预测PowerShell命令的恶意概率的NLP插件
更重要的是,研究人员建立了一个生产端到端机器学习插件(下图),这样我们就可以通过重新标记和重新培训,将发布的机器学习模型不断改进。
利用端到端机器学习技术不断发现PowerShell的过程
总结
这样,研究人员就成功地实现并优化了这个机器学习的模型,使其能够以最小的代价满足终端代理的需要,该代理能够在主机上以毫秒为单位进行安检。在2018年,FireEye已经在事件响应方面部署了这个PowerShell机器学习检测引擎,且成功确认了许多恶意的PowerShell攻击,包括:
· 广告欺诈恶意软件——Kovter;
· 研究人员进行的渗透测试活动;
· 对于那些绕过传统签名的新变体,机器学习可以以高概率置信度检测到;
PowerShell机器学习检测引擎带来的独特体验包括:
1.机器学习模型可以自动的从有规划的语料库中学习恶意模式,与传统的基于布尔表达式和正则表达式的检测签名规则引擎相比,NLP模型具有较低的操作成本,且明显降低了安全内容的发布时间。
2.该模型通过学习某些攻击模式的非线性组合,对未知的PowerShell命令执行概率推理,增加了防护能力。