[论文阅读] (17)CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[论文阅读] (17)CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)相关的知识,希望对你有一定的参考价值。

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。

前一篇总结了Powershell恶意代码检测相关研究,并结合开源工具分享抽象语法树提取过程。这篇文章将详细讲解CCS2019的Powershell去混淆工作,这篇文章质量非常高,来自于浙江大学的李振源老师。我将从他在InforSec分享的视频和论文原文阅读两个方面进行讲解。希望这篇文章对您有所帮助,深知自己很菜,通过这种最笨分享来提升和记录,欢迎大家批评指正。这些大佬是真的值得我们去学习,献上小弟的膝盖~fighting!

原文作者:Zhenyuan Li, Qi Alfred Chen, Chunlin Xiong, Yan Chen, et al.
原文标题:Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts
中文翻译:针对PowerShell脚本的有效轻量级去混淆和语义感知攻击检测
原文链接https://dl.acm.org/doi/pdf/10.1145/3319535.3363187
发表会议:CCS2019
参考文献: 感谢老师们的论文以及InforSec的分享

文章目录

前文赏析:


一.InforSec作者分享的学习笔记

InforSec(网络安全研究国际学术论文)内容简介:
越来越多的报道显示,PowerShell被广泛的用于各种网络攻击。这些攻击包括高级持续性威胁、勒索病毒、网络钓鱼邮件等等。基于PowerShell的攻击,利用了PowerShell的动态性,构造了复杂的混淆模式,绕过检测。为了克服这一难题,我们提出来第一个轻量且有效的解混淆方案,并基于解混淆后的脚本构造了基于攻击语义的检测系统。实验显示,通过解混淆,我们可以将混淆后脚本和原始脚本之间的相似度从仅0.5%提高到了近80%。同时解混淆过程有效的改善了已有系统的检测效率,Windows Defender和VirusTotal的攻击检测率分别从0.3%和2.65%大幅增加到75.0%和90.0%。


嘉宾介绍:
李振源,浙江大学在读博士,研究兴趣包括终端安全,入侵检测,威胁分析等。

接下来,我们将从研究动机、相关工作比较、结合案例的具体技术、实验结果和结论五个方面讲解。

1.研究动机

Powershell越来越多出现在各种攻击事件中,根据Mcafee和Symantec报告显示,在2016年至2019年期间,基于Powershell的攻击发生的频率逐年上升,占所有攻击中的45%。

为什么Powershell这么受攻击者欢迎呢?
主要是Powershell符合现代攻击的需求,包括三点内容:

  • Live-off-the-Land
    攻击者倾向于使用系统中已有的工具开展攻击,从而避免使用自制的可执行文件及检测。并且,Powershell作为管理员工具,很容易访问和利用Windows组件。
  • Fileless Attack(无文件攻击)
    Powershell可以直接从内存中执行而不需要涉及文件。攻击者可以直接从网络上下载攻击脚本,整个过程不涉及文件读写而在内存中执行,可以避免基于文件的杀毒引擎查杀。
  • Obufscation
    Powershell作为一种动态语言,灵活性很强,容易被混淆。

那么,针对前两个问题,微软近几年也提出了 ScriptBlock 的记录方案,可以将执行的大多数脚本块记录下来。这种方法具有先天解混淆的能力,因为它可以记录最后执行的 ScriptBlock ,通常混淆后的代码需要解混淆后执行,因此该方法可以解混淆。

但是,混淆并不一定需要从 ScriptBlock 中完成,它也可以在更小的代码片段或token中混淆。此时,该方法就无能为力。基于此,提出了我们的工作,弥补该不足。

混淆是阻碍反病毒引擎查杀包括Powershell在内的恶意程序的最大元凶。

我们可以看看混淆对反病毒引擎的影响。该实验通过40多个样本,在 VirusTotal 上的56个杀毒引擎检测的结果,分为Malicious和Benign两部分,每部分都包括五组数据,对应原始脚本和四种混淆方法加密的结果。

其中,S1和S2是基于字符串操作的,S3和S4是基于编码的。

由图可知,对于恶意样本来说,原始样本平均被13个引擎所查杀,但进行混淆后,检测率大幅度下降。这里有2至3个可以固定将编码混淆找出,但存在一个问题,它其实检测的是编码混淆方法,而不是恶意性,从而带来误报。

经过解混淆后,整体的检测率会大幅提升,将近87%。


2.相关工作比较

传统的解混淆方法分为三个阶段:

  • 检测阶段:脚本是否混淆
  • 解混淆阶段:动态和静态解混淆
  • 验证阶段

这类方法存在如下问题:

  • 粗粒度的混淆检测
    不能处理局部混淆,比如恶意程序只对关键逻辑混淆,它整体代码仍符合为混淆恶意代码的特征。或者,整个逻辑都应用到脚本上解混淆,未混淆代码会受解混淆的影响,导致漏报和误报
  • 解混淆逻辑需手工
    需要大量手工工作,无法处理未知混淆,鲁棒性较差
  • 各阶段逻辑未整合
    每个阶段的逻辑需要独立实现,大大增加人工处理工作


3.整体方案

基于上述动机和问题,我们提出了一种细粒度的,且将各个步骤整合得比较好的系统。此外,我们利用恶意代码或混淆代码自身带有的逻辑来开展解混淆工作。

从直觉上来讲,一个混淆后的代码或脚本想要在机器上正确执行,它肯定是要包含一个解混淆的逻辑,在它们执行之前将内容解析出来。我们提出了比较核心的部分——基于模拟器的解混淆。

在《网络安全系列》,我的博客中也有Powershell解混淆的分享。这里举个简单例子,下图是一段字符混淆Powershell脚本,代码的最后就是自带的解混淆逻辑,当它会调用IEX在内存中执行解析,再实施真实的攻击。

本文系统的核心框架包括五个步骤,后续详细讲解。

  • (1) 提取子树
  • (2) 基于子树的混淆检测
  • (3) 基于模拟器的解混淆
  • (4) 更新抽象语法树
  • (5) 后处理

该方案的具体实现过程如下:

  • 首先,我们会把混淆后的代码使用AST(抽象语法树)解析,根据一定的规则提取部分子树。判断哪些子树包含混淆代码,取出子树并量化。

  • 然后,基于子树的混淆检测,我们会通过基于token、字符串和AST三层特性的分类器来判断子树是否存在混淆。

  • 其次,如果子树存在混淆,则基于模拟器开展解混淆,将原始代码片段还原。

  • 再次,更新抽象语法树。接着进行解析,并将新生成的抽象语法树合并到原有抽象语法树中(子树栈),更新分类器的特征值。

  • 最后,当没有剩余的混淆子树,整个解混淆工作基本完成,开展善后处理,使得混淆代码更具可读性。

相对于之前工作,本文具有第三个优点。

  • 第一点:抽象语法子树级的细粒度分析
    有效实现局部解混淆,将混淆片段准确找到

  • 第二点:利用混淆代码自带逻辑解混淆
    覆盖面更广,不需要自己去写解混淆的逻辑

  • 第三点:解混淆的三个阶段紧密联系
    形成一个循环,可以将多层混淆问题解决,具体详见论文


4.结合例子介绍具体技术

为了更好地理解,我们结合例子具体介绍。Powershell是一种高层次、富含语义的语义,假设存在如下代码,可以看到几个明显的特性。

  • Invoke-Expression:调用命令的操作
  • Net.WebClient:网络命名空间
  • .DownloadString():下载函数
  • “Invoke-Shellcode.ps1”:恶意脚本

它会建立一个Web服务,然后下载文件并执行,这是一个典型的恶意行为。

如果不经过混淆,很容易就能检测出其恶意性。

接下来使用主流的Invoke-Obfuscation进行混淆,将之前的检测特征进行字符串重组混淆。

需要注意:这些操作本身就是混淆后的代码,又是一个解混淆的逻辑。当然,对于更复杂的情况,解混淆逻辑和解混淆内容会分开,也会提出一些基于AST重组的方法解混淆。

在第一层混淆之后,紧接着进行第二层混淆。这次使用编码的方法,即 Convertto-securestring。

该混淆的本质是一个AES加密,根据信息论的观点来说,加密后的密文和明文信息熵的关系非常弱。那么,我们想利用混淆后的脚本检测原始脚本基本不可能,所以我们需要做一个解混淆的操作。

那么,解混淆怎么做呢?
刚才提到,混淆的过程就是把每个片段或整块代码进行一一重组或编码操作,解混淆的过程也会将这些节点找出来。首先,将其解析成一个抽象语法树,我们经过一些裁剪,将有可能参与混淆节点的识别出来。

接着会利用一个分类器来判断哪些是真正含有混淆的,完成之后就可以得到这五棵子树。其实,我们需要解混淆的是标红的四棵。

总之,解混淆大概逻辑是一个自底向上的遍历。 为什么自底向上呢?因为解混淆的最下面两棵树,每个节点下面都有一个子树。

解混淆完成之后,我们对抽象语法树进行更新。重组后,可以看到新的节点不具备混淆特征,就不再处理黑色节点。

接着处理其他红色节点并进行重组。

完成解混淆的过程后,整个节点中不再含有混淆的子树。

最终生成如下图所示的Powershell代码。


5.实验结果

我们第一个实验是比较解混淆对代码相似度的提升。与经典的PSDEM方法进行比较,相对于混淆代码提升79.2%,比PSDEM提升42.2%。需要注意,传统方法对很多未知混淆方案无法解混淆,所以说它的鲁棒性较差,攻击者可以较好地针对,并绕过传统的解混淆方法。

第二个实验比较解混淆对检测的提升。我们比较 Windows DefenderVirusTotal 对解混淆的效果。VirusTotal 是56个的平均结果。由图可知, Windows Defender 可以提升74.7%,VirusTotal 可以提升87.3%。

此外,解混淆的效率很高。对于平均5.4Kb大小的脚本,解混淆只需要0.5秒,而且用的是普通家用电脑。

解混淆完成之后,我们也提供了一个检测系统。关键是训练、检测之前,进行解混淆操作,我们使用比较基础的OOA方法,通过挖掘平凡子集,提取一些可以用于检测的规则。

可以看到,解混淆之后的规则都比较清晰,包括各种典型的恶意行为函数等。所以,解混淆后的脚本不但能较好地进行恶意性检测,其本身逻辑和语义分析也比较清晰,从而能进行针对性保护。


6.结论

最后总结,我们针对攻击者常用工具PowerShell的混淆难题。

  • (1) 通过对抽象语法子树细粒度的分析,准确定位混淆片段;
  • (2) 利用混淆脚本自身逻辑进行解混淆,减少了手工分析的工作,可以处理未知混淆,提高了鲁棒性;
  • (3) 最后将混淆检测、解混淆逻辑、验证三个阶段有机的结合在一起,可以处理多层混淆。

实现了第一个轻量且有效的PowerShell解混淆系统。有效的提升了解混淆后脚本的检测精度。


二.论文阅读分享

通过上面李老师的分享后,我们再来阅读这篇论文,就会发现文章很多美妙的地方。在该部分,我将站在读者的第一视角,介绍这篇论文很多值得我们学习的地方和亮点。

1.摘要学习

首先,我们来看这篇文章的摘要。前面的博客我们说过,一篇论文的摘要和引言非常重要。如何写好摘要和引言,写高质量摘要,写引人入胜的引言很关键。

近年来,PowerShell 越来越多地出现在各种网络攻击中,从高级持续威胁、勒索软件、网络钓鱼电子邮件、加密劫持、金融威胁到无文件攻击。但是,由于 PowerShell 语言在设计上是动态的,并且可以在不同级别构建脚本片段,因此基于最新静态分析的 PowerShell 攻击检测方法本质上容易受到混淆。

为了克服这一挑战,本文为 PowerShell 脚本设计了第一个有效且轻量级的反混淆方法。为了解决精确识别可恢复脚本片段的挑战,设计了一种新颖的基于子树的反混淆方法。该方法在 PowerShell 脚本的抽象语法树(Abstract Syntax Tree)中的子树级别执行混淆检测和基于仿真的恢复。

基于新的反混淆方法,我们进一步设计了第一个语义感知的 PowerShell 攻击检测系统。为了实现基于语义的检测,我们利用了经典的面向目标的关联挖掘算法,并为 PowerShell 攻击新识别了 31 个语义签名。我们对 2342 个良性样本和 4141 个恶意样本的集合进行了评估,发现我们的去混淆方法平均耗时不到 0.5 秒,同时将混淆后的脚本与原始脚本之间的相似度从仅 0.5% 提高到 80% 左右,这既有效又轻便。

此外,应用我们的去混淆处理后,Windows Defender 和 VirusTotal 的攻击检测率分别从 0.3% 和 2.65% 大幅提高到 75.0% 和 90.0%。同时,当应用我们的去混淆处理时,我们的语义感知攻击检测系统以 92.3% 的平均真阳性率和 0% 的假阳性率优于 Windows Defender 和 VirusTotal。


2.引言和背景及动机

这篇论文的引言写得非常棒,有效突出了Powershell在网络攻击中的重要性,以及现有方法的诸多缺陷,进一步体现本文研究的必要性和贡献。

紧接着是方法对比,体现解混淆、恢复质量和轻量级的优点。

接下来简要介绍本文工作如何解决现有挑战,提出的方法。主要包括解混淆和攻击检测两块。

最后是本文的贡献,分别从解混淆、语义感知攻击检测两个工作,以及实验性能提升方面介绍,很多顶会论文也都采取这种方式介绍贡献。


3.总体框架

接下来是论文的总体概述。

论文整体框架分为三部分:

  • Deobfuscation phase(去混淆):子树+AST+三层机制结合
  • Training and detection phases(训练和检测):OOA挖掘算法
  • Application scenarios(应用)
    – Real-time attack detection
    – Large-scale automated malware analysis

在应用场景中,突出本文方法比现有方法更好,同时介绍两种经典的安全应用场景。


4. POWERSHELL DEOBFUSCATION

第四部分是详细的解混淆工作,该部分推荐读者阅读原文。

作者从整个解混淆框架的五个核心步骤,依次讲解,具体包括:

  • 4.1 Subtree-based Deobfuscation Approach Overview
  • 4.2 Extract Suspicious Subtrees
  • 4.3 Subtree-based Obfuscation Detection
  • 4.4 Emulation-based Recovery
  • 4.5 AST Update
  • 4.6 Post processing

包括子树提取、更新AST等步骤。

一个恶意脚本混淆和去混淆后和AST效果图如下所示:

此外,第五部分详细介绍了语义感知攻击检测工作。

个人感受:
本文的重点是解混淆,解混淆后的代码其实语义比较丰富,其恶意检测也相对容易,所以仅选择了OOA。该部分应该是为了丰富整体的工作,让论文更加的充实和完整,或许也是审稿老师的修改意见。不过,确实很多顶会论文,包括攻防攻系列,漏洞挖掘防御系列,都会采用这种方式,从而让论文更加完美,值得我学习。


5.对比实验

实验主要包括学术界(PSDEM)和工业界(Defender、VT)的对比,恶意代码分析相关论文都可以尝试这种对比实验。总体而言,本文方法的TP更高,性能更好,解混淆速度较快,再次建议读者阅读原文。


三.总结

此外,作者在讨论部分补充了下表,通过这种画龙点睛,回头点题,进一步突出论文的贡献和工作量。这篇文章确实是Powershell领域的顶级论文,写得非常棒,真心值得大家学习,也感谢李老师的分享。

此外,由于去混淆做得非常好,Powershell源码有丰富的语义,因此关于Powershell的恶意检测文章很少。最后,我们读论文,也需要看看未解决的问题、存在的困难或者下一步工作,作者说到了逃逸攻击,包括反调试、高价值攻击无法检测等,以及逻辑混淆。具体参见下图:

这篇文章就写到这里,希望对您有所帮助。由于作者英语实在太差,论文的水平也很低,写得不好的地方还请海涵和批评。同时,也欢迎大家讨论,继续加油!感恩遇见,且看且珍惜。

(By:Eastmount 2022-03-25 周五夜于武汉 http://blog.csdn.net/eastmount/ )

以上是关于[论文阅读] (17)CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读 CVPR2017(Best Paper) Densely Connected Convolutional Networks

论文阅读自然语言模型的尺度法则(CS224N WINTER 2022 Lecture17 推荐阅读整理)

论文阅读自然语言模型的尺度法则(CS224N WINTER 2022 Lecture17 推荐阅读整理)

论文阅读自然语言模型的尺度法则(CS224N WINTER 2022 Lecture17 推荐阅读整理)

多目标跟踪:CVPR2019论文阅读

ACL2019论文阅读