多年来,网络安全经销商和研究人员都有报道过网络威胁分子如何利用PowerShell安装后门,运行恶意代码,或者在企业中达成他们的目的。安全是攻击者、研究人员和蓝队(译者注:防守方)之间的一个猫捉老鼠的游戏。PowerShell的灵活性和性能让传统的检测无法应用到这里。本文会详细描述FireEye如何利用人工智能和机器学习检测恶意PowerShell。
在本文中,你将看到如下内容:
为什么传统的“基于签名的”和“基于规则”的检测引擎无法恶意PowerShell检测。
如何使用自然语言处理(Nature Language Processing,NLP)技术解决这个问题。
我们的NLP模型是如何检测恶意PowerShell命令的,即使这些命令被混淆过。
在缩短检测引擎的安全内容的发布时间的同时提高攻击者绕过安全方案的经济代价。
PowerShell是用来实施攻击的众多流行工具中的一款。根据FireEye 动态威胁智能云(Dynamic Threat Intelligence ,DTI)收集到的数据,2017年整年的恶意PowerShell攻击如下所示(Figure 1):
FireEye多年来一直跟踪恶意PowerShell的使用情况。在2014年,Mandiant的应急响应人员发表了一篇Black Hat论文,文中包括了PowerShell攻击的策略、技术和过程,还包括如何从恶意PowerShell使用过的磁盘、日志和内存中取证。2016年,我们就如何改进PowerShell日志发表了一篇博文,通过日志记录可以更清晰地知道攻击者的潜在行为。最近,我们针对APT32的深入报道再一次强调了攻击者使用PowerShell进行侦查和进行后续操作这一威胁,如Figure 2 所示:
让我们来看看恶意PowerShell长什么样(Figure 3)
对其参数的解释如下:
-NoProfile,意味着当前用户的安装脚本不会在PowerShell引起启动时运行。
-Nonl,是-NonInteracive的缩写,意味着不会和用户进行交互
-W Hidden,是“-WindowStyle Hidden”的缩写,意味着PowerShell的session窗口将以一种隐藏的方式启动。
-Exec Bypass,是“-ExecutionPolicy Bypass”的缩写,意味着禁用当前PowerShell session的执行策略(默认不允许)。需注意,设置了执行策略并不意味着就安全了。
-encodedcommand,意味着接下来的文本是一个base64加密的命令。
在Base64加密部分的是什么?Figure 4是该命令解密后的样子:
有趣的是,这个命令的功能是偷偷访问无文件网络和远程内容执行。
IEX是Invoke-Expression cmdlet的别名,将在本地运行提供给它的命令。
new-object cmdlet新建一个.NET框架或一个COM对象,这里是一个net.webclient对象
downloadstring将下载<url>的内容到内存缓冲区(最后将被IEX执行)
值得一提的是,类似的恶意PowerShell近期被用于一起Cryptojacking攻击,它利用CVE-2017-10271漏洞进行挖矿。该攻击的exploit是用PowerShell脚本发送的,而不是直接下载可执行文件。该PowerShell命令非常的隐蔽,因为它没有在主机上留下任何文件,这样传统的杀软很难将其检测出来。
出于以下原因,攻击者更乐意使用PowerShell:
PowerShell作为一种非常有用的系统管理员脚本工具在微软的Windows中广泛使用。
攻击者的攻击逻辑可以写在PowerShell中,无需安装任何恶意二进制文件,这样可以减少在终端上所占的内存。
PowerShell语法的灵活性让传统的基于签名的检测规则很难检测到它。
还有,从经济角度:
不客气地说,攻击者修改PowerShell绕过基于签名的检测引擎所花的代价非常小,尤其是使用开源混淆工具。
就防守方来说,为新威胁更新基于签名的检测规则是一件特别花时间的事,而且需要专家才能做到。
下一步,我们将介绍FireEye如何将大数据技术与PowerShell威胁研究结合起来以抵御此种威胁,从而提高攻击者的攻击成本。
我们是否可以使用机器学习预测某个PowerShell是否恶意?
FireEye的一大优点就是我们拥有高质量的PowerShell用例仓库,这些PowerShell来源于FireEye 解决方案和服务的全球部署。我们和公司的PowerShell专家合作,使用恶意命令和在网络中搜集的良性命令构建了一个庞大的训练集。
之后,我们检查PowerShell语料库,发现它适用于NLP问题。我们建立了一个用于解析PowerShell命令文本的NLP模型,类似于亚马逊用于解析你的语音命令的Alexa模型。
我们要解决的一个技术难题是同义词,这也是语言学研究的一个问题。例如,“NOL”,“NOLO”,和“NOLOGO”在PowerShell语法中是同一语义。在NLP中,可使用词根算法将一个词恢复到它初始的样子,例如“innovating”取词根后将变成“innovate”。
我们基于词根,利用trie数据结构,如Figure 5 所示,为PowerShell命令语法创建了一个前缀树。即使复杂如PowerShell,trie也可以在纳秒内为某个命令取词根。
我们创建的所有NLP 管道如下表所示:
接下来的内容是利用NLP 管道对上述例子取词根的关键步骤:
检测和解密Base64命令,如果有的话
使用Named Entity Recognition(NER)识别实体,例如<URL>
将整个文本句柄化,包括干净文本和混淆过的命令
就每一个句柄取词根,并基于词库将其向量化
使用监督学习模型预测恶意概率
更重要的是,我们建立了一个端对端机器学习管道(Figure 7),这样我们就可以通过重新标记和重新训练,并将机器学习模型发布到我们的产品中,应对敌手的不断进化。
##验证字段中的值
我们成功地实现并优化了这个机器学习模型缩减占用内存将其部署到我们的研究终端代理上,这个代理在主机上可以在毫秒内进行预测。2018年,我们将这个机器学习模型应用到事件响应中。早期字段验证已经证实了恶意PowerShell攻击检测,包括:
商用恶意软件,例如Kovter
红队渗透测试活动
绕过合法签名的新变体,可以被我们的机器学习模型以较高的置信率检测出来。
这个PowerShell机器学习检测引擎产生的唯一值包括:
机器学习模型自动从语料库中学习恶意模式。不同于传统的签名规则检测引擎使用布尔表达式和基于正则表达式,NLP模式的运算代价较低,而且大大缩减了安全内容发布时间。
该模型对未知PowerShell命令进行概率推断,它通过隐式学习特定模型的非线性组合来完成,这样将提高敌手绕过的成本。
这一思想最重要的部分是,扩大威胁边界,让对手更难绕过。
我们想要感谢:
Daniel Bohannon, Christopher Glyer 和Nick Carr 对威胁分析的支持
Alex Rivlin, HeeJong Lee, 和来自FireEye实验室的Benjamin Chang 提供DTI数据
Caleb Madrigal提供研究终端.
FireEye ICE-DS 团队
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)