前一篇总结了Powershell恶意代码检测相关研究,并结合开源工具分享抽象语法树提取过程。这篇文章将详细讲解CCS2019的Powershell去混淆工作,这篇文章质量非常高,来自于浙江大学的李振源老师。我将从他在InforSec分享的视频和论文原文阅读两个方面进行讲解,希望您喜欢。
代码语言:javascript复制原文作者:Zhenyuan Li, Qi Alfred Chen, Chunlin Xiong, Yan Chen, et al.
原文标题:Effective and Light-Weight Deobfuscation and Semantic-Aware
Attack Detection for PowerShell Scripts
原文链接:https://dl.acm.org/doi/pdf/10.1145/3319535.3363187
发表会议:CCS 2019
参考文献:感谢老师们的论文以及InforSec的分享
http://https//www.inforsec.org/wp/?p=4349
https://www.bilibili.com/video/av800038481
希望自己能在科研路上不断前行,不断学习和总结更高质量的论文。由于自己很菜,只能通过最土的办法慢慢提升,也请大家批评和指正。最后希望这篇文章对您有所帮助,这些大佬真值得我们学习,献上小弟的膝盖,加油!
文章目录:
- 一.InforSec作者分享的学习笔记 1.研究动机 2.相关工作比较 3.整体方案 4.结合例子介绍具体技术 5.实验结果 6.结论
- 二.论文阅读分享 1.摘要学习 2.引言和背景及动机 3.总体框架 4. POWERSHELL DEOBFUSCATION 5.对比实验
- 三.总结
《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正。同时,前期翻译提升为主,后续随着学习加强会更多分享论文的精华和创新,在之后是复现和论文撰写总结分析。虽然自己科研很菜,但喜欢记录和分享,也欢迎大家给我留言评论,学术路上期待与您前行,加油~
前文推荐:
- [AI安全论文] 01.人工智能真的安全吗?浙大团队分享AI对抗样本技术
- [AI安全论文] 02.清华张超老师 GreyOne和Fuzzing漏洞挖掘各阶段进展总结
- [AI安全论文] 03.什么是生成对抗网络?GAN的前世今生(Goodfellow)
- [AI安全论文] 04.NLP知识总结及NLP论文撰写之道——Pvop老师
- [AI安全论文] 05.RAID-Cyber Threat Intelligence Modeling Based on GCN
- [AI安全论文] 06.NDSS2020 UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats
- [AI安全论文] 07.S&P19 HOLMES:基于可疑信息流相关性的实时APT检测
- [AI安全论文] 08.基于溯源图的APT攻击检测安全顶会论文总结
- [AI安全论文] 09.ACE算法和暗通道先验图像去雾算法详解(Rizzi | 何恺明老师)
- [AI安全论文] 10.英文论文引言introduction如何撰写及精句摘抄——以入侵检测系统(IDS)为例
- [AI安全论文] 11.英文论文模型设计(Model Design)如何撰写及精句摘抄——以IDS为例
- [AI安全论文] 12.英文论文实验评估(Evaluation)如何撰写及精句摘抄(上)——以IDS为例
- [AI安全论文] 13.英文SCI论文审稿意见及应对策略学习笔记总结
- [AI安全论文] 14.S&P2019-Neural Cleanse 神经网络中的后门攻击识别与缓解
- [AI安全论文] 15.Powershell恶意代码检测论文总结及抽象语法树(AST)提取
- [AI安全论文] 16.CCS2019 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)
一.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 Defender
和 VirusTotal
对解混淆的效果。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.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的恶意检测文章很少。最后,我们读论文,也需要看看未解决的问题、存在的困难或者下一步工作,作者说到了逃逸攻击,包括反调试、高价值攻击无法检测等,以及逻辑混淆。具体参见下图:
这篇文章就写到这里,希望对您有所帮助。由于作者英语实在太差,论文的水平也很低,写得不好的地方还请海涵和批评。同时,也欢迎大家讨论,继续加油!感恩遇见,且看且珍惜。