《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。
前一篇总结了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(网络安全研究国际学术论文)内容简介:
越来越多的报道显示,PowerShell被广泛的用于各种网络攻击。这些攻击包括高级持续性威胁、勒索病毒、网络钓鱼邮件等等。基于PowerShell的攻击,利用了PowerShell的动态性,构造了复杂的混淆模式,绕过检测。为了克服这一难题,我们提出来第一个轻量且有效的解混淆方案,并基于解混淆后的脚本构造了基于攻击语义的检测系统。实验显示,通过解混淆,我们可以将混淆后脚本和原始脚本之间的相似度从仅0.5%提高到了近80%。同时解混淆过程有效的改善了已有系统的检测效率,Windows Defender和VirusTotal的攻击检测率分别从0.3%和2.65%大幅增加到75.0%和90.0%。
嘉宾介绍:
李振源,浙江大学在读博士,研究兴趣包括终端安全,入侵检测,威胁分析等。
接下来,我们将从研究动机、相关工作比较、结合案例的具体技术、实验结果和结论五个方面讲解。
Powershell越来越多出现在各种攻击事件中,根据Mcafee和Symantec报告显示,在2016年至2019年期间,基于Powershell的攻击发生的频率逐年上升,占所有攻击中的45%。
为什么Powershell这么受攻击者欢迎呢?
主要是Powershell符合现代攻击的需求,包括三点内容:
那么,针对前两个问题,微软近几年也提出了 ScriptBlock
的记录方案,可以将执行的大多数脚本块记录下来。这种方法具有先天解混淆的能力,因为它可以记录最后执行的 ScriptBlock
,通常混淆后的代码需要解混淆后执行,因此该方法可以解混淆。
但是,混淆并不一定需要从 ScriptBlock
中完成,它也可以在更小的代码片段或token中混淆。此时,该方法就无能为力。基于此,提出了我们的工作,弥补该不足。
混淆是阻碍反病毒引擎查杀包括Powershell在内的恶意程序的最大元凶。
我们可以看看混淆对反病毒引擎的影响。该实验通过40多个样本,在 VirusTotal
上的56个杀毒引擎检测的结果,分为Malicious和Benign两部分,每部分都包括五组数据,对应原始脚本和四种混淆方法加密的结果。
其中,S1和S2是基于字符串操作的,S3和S4是基于编码的。
由图可知,对于恶意样本来说,原始样本平均被13个引擎所查杀,但进行混淆后,检测率大幅度下降。这里有2至3个可以固定将编码混淆找出,但存在一个问题,它其实检测的是编码混淆方法,而不是恶意性,从而带来误报。
经过解混淆后,整体的检测率会大幅提升,将近87%。
传统的解混淆方法分为三个阶段:
这类方法存在如下问题:
基于上述动机和问题,我们提出了一种细粒度的,且将各个步骤整合得比较好的系统。此外,我们利用恶意代码或混淆代码自身带有的逻辑来开展解混淆工作。
从直觉上来讲,一个混淆后的代码或脚本想要在机器上正确执行,它肯定是要包含一个解混淆的逻辑,在它们执行之前将内容解析出来。我们提出了比较核心的部分——基于模拟器的解混淆。
在《网络安全系列》,我的博客中也有Powershell解混淆的分享。这里举个简单例子,下图是一段字符混淆Powershell脚本,代码的最后就是自带的解混淆逻辑,当它会调用IEX在内存中执行解析,再实施真实的攻击。
本文系统的核心框架包括五个步骤,后续详细讲解。
该方案的具体实现过程如下:
首先,我们会把混淆后的代码使用AST(抽象语法树)解析,根据一定的规则提取部分子树。判断哪些子树包含混淆代码,取出子树并量化。
然后,基于子树的混淆检测,我们会通过基于token、字符串和AST三层特性的分类器来判断子树是否存在混淆。
其次,如果子树存在混淆,则基于模拟器开展解混淆,将原始代码片段还原。
再次,更新抽象语法树。接着进行解析,并将新生成的抽象语法树合并到原有抽象语法树中(子树栈),更新分类器的特征值。
最后,当没有剩余的混淆子树,整个解混淆工作基本完成,开展善后处理,使得混淆代码更具可读性。
相对于之前工作,本文具有第三个优点。
第一点:抽象语法子树级的细粒度分析
有效实现局部解混淆,将混淆片段准确找到
第二点:利用混淆代码自带逻辑解混淆
覆盖面更广,不需要自己去写解混淆的逻辑
第三点:解混淆的三个阶段紧密联系
形成一个循环,可以将多层混淆问题解决,具体详见论文
为了更好地理解,我们结合例子具体介绍。Powershell是一种高层次、富含语义的语义,假设存在如下代码,可以看到几个明显的特性。
Invoke-Expression
:调用命令的操作Net.WebClient
:网络命名空间.DownloadString()
:下载函数它会建立一个Web服务,然后下载文件并执行,这是一个典型的恶意行为。
如果不经过混淆,很容易就能检测出其恶意性。
接下来使用主流的Invoke-Obfuscation进行混淆,将之前的检测特征进行字符串重组混淆。
需要注意:这些操作本身就是混淆后的代码,又是一个解混淆的逻辑。当然,对于更复杂的情况,解混淆逻辑和解混淆内容会分开,也会提出一些基于AST重组的方法解混淆。
在第一层混淆之后,紧接着进行第二层混淆。这次使用编码的方法,即 Convertto-securestring。
该混淆的本质是一个AES加密,根据信息论的观点来说,加密后的密文和明文信息熵的关系非常弱。那么,我们想利用混淆后的脚本检测原始脚本基本不可能,所以我们需要做一个解混淆的操作。
那么,解混淆怎么做呢?
刚才提到,混淆的过程就是把每个片段或整块代码进行一一重组或编码操作,解混淆的过程也会将这些节点找出来。首先,将其解析成一个抽象语法树,我们经过一些裁剪,将有可能参与混淆节点的识别出来。
接着会利用一个分类器来判断哪些是真正含有混淆的,完成之后就可以得到这五棵子树。其实,我们需要解混淆的是标红的四棵。
总之,解混淆大概逻辑是一个自底向上的遍历。 为什么自底向上呢?因为解混淆的最下面两棵树,每个节点下面都有一个子树。
解混淆完成之后,我们对抽象语法树进行更新。重组后,可以看到新的节点不具备混淆特征,就不再处理黑色节点。
接着处理其他红色节点并进行重组。
完成解混淆的过程后,整个节点中不再含有混淆的子树。
最终生成如下图所示的Powershell代码。
我们第一个实验是比较解混淆对代码相似度的提升。与经典的PSDEM方法进行比较,相对于混淆代码提升79.2%,比PSDEM提升42.2%。需要注意,传统方法对很多未知混淆方案无法解混淆,所以说它的鲁棒性较差,攻击者可以较好地针对,并绕过传统的解混淆方法。
第二个实验比较解混淆对检测的提升。我们比较 Windows Defender
和 VirusTotal
对解混淆的效果。VirusTotal
是56个的平均结果。由图可知, Windows Defender
可以提升74.7%,VirusTotal
可以提升87.3%。
此外,解混淆的效率很高。对于平均5.4Kb大小的脚本,解混淆只需要0.5秒,而且用的是普通家用电脑。
解混淆完成之后,我们也提供了一个检测系统。关键是训练、检测之前,进行解混淆操作,我们使用比较基础的OOA方法,通过挖掘平凡子集,提取一些可以用于检测的规则。
可以看到,解混淆之后的规则都比较清晰,包括各种典型的恶意行为函数等。所以,解混淆后的脚本不但能较好地进行恶意性检测,其本身逻辑和语义分析也比较清晰,从而能进行针对性保护。
最后总结,我们针对攻击者常用工具PowerShell的混淆难题。
实现了第一个轻量且有效的PowerShell解混淆系统。有效的提升了解混淆后脚本的检测精度。
通过上面李老师的分享后,我们再来阅读这篇论文,就会发现文章很多美妙的地方。在该部分,我将站在读者的第一视角,介绍这篇论文很多值得我们学习的地方和亮点。
首先,我们来看这篇文章的摘要。前面的博客我们说过,一篇论文的摘要和引言非常重要。如何写好摘要和引言,写高质量摘要,写引人入胜的引言很关键。
近年来,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。
这篇论文的引言写得非常棒,有效突出了Powershell在网络攻击中的重要性,以及现有方法的诸多缺陷,进一步体现本文研究的必要性和贡献。
紧接着是方法对比,体现解混淆、恢复质量和轻量级的优点。
接下来简要介绍本文工作如何解决现有挑战,提出的方法。主要包括解混淆和攻击检测两块。
最后是本文的贡献,分别从解混淆、语义感知攻击检测两个工作,以及实验性能提升方面介绍,很多顶会论文也都采取这种方式介绍贡献。
接下来是论文的总体概述。
论文整体框架分为三部分:
在应用场景中,突出本文方法比现有方法更好,同时介绍两种经典的安全应用场景。
第四部分是详细的解混淆工作,该部分推荐读者阅读原文。
作者从整个解混淆框架的五个核心步骤,依次讲解,具体包括:
包括子树提取、更新AST等步骤。
一个恶意脚本混淆和去混淆后和AST效果图如下所示:
此外,第五部分详细介绍了语义感知攻击检测工作。
个人感受:
本文的重点是解混淆,解混淆后的代码其实语义比较丰富,其恶意检测也相对容易,所以仅选择了OOA。该部分应该是为了丰富整体的工作,让论文更加的充实和完整,或许也是审稿老师的修改意见。不过,确实很多顶会论文,包括攻防攻系列,漏洞挖掘防御系列,都会采用这种方式,从而让论文更加完美,值得我学习。
实验主要包括学术界(PSDEM)和工业界(Defender、VT)的对比,恶意代码分析相关论文都可以尝试这种对比实验。总体而言,本文方法的TP更高,性能更好,解混淆速度较快,再次建议读者阅读原文。
此外,作者在讨论部分补充了下表,通过这种画龙点睛,回头点题,进一步突出论文的贡献和工作量。这篇文章确实是Powershell领域的顶级论文,写得非常棒,真心值得大家学习,也感谢李老师的分享。
此外,由于去混淆做得非常好,Powershell源码有丰富的语义,因此关于Powershell的恶意检测文章很少。最后,我们读论文,也需要看看未解决的问题、存在的困难或者下一步工作,作者说到了逃逸攻击,包括反调试、高价值攻击无法检测等,以及逻辑混淆。具体参见下图:
这篇文章就写到这里,希望对您有所帮助。由于作者英语实在太差,论文的水平也很低,写得不好的地方还请海涵和批评。同时,也欢迎大家讨论,继续加油!感恩遇见,且看且珍惜。
(By:Eastmount 2022-03-25 周五夜于武汉 http://blog.csdn.net/eastmount/ )