前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[AI安全论文] 16.CCS19 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)

[AI安全论文] 16.CCS19 针对PowerShell脚本的轻量级去混淆和语义感知攻击检测(经典)

作者头像
Eastmount
发布2022-04-18 20:18:12
7140
发布2022-04-18 20:18:12
举报

前一篇总结了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.对比实验
  • 三.总结

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正。同时,前期翻译提升为主,后续随着学习加强会更多分享论文的精华和创新,在之后是复现和论文撰写总结分析。虽然自己科研很菜,但喜欢记录和分享,也欢迎大家给我留言评论,学术路上期待与您前行,加油~

前文推荐:

一.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.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的恶意检测文章很少。最后,我们读论文,也需要看看未解决的问题、存在的困难或者下一步工作,作者说到了逃逸攻击,包括反调试、高价值攻击无法检测等,以及逻辑混淆。具体参见下图:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 娜璋AI安全之家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.InforSec作者分享的学习笔记
  • 1.研究动机
  • 2.相关工作比较
  • 3.整体方案
  • 4.结合例子介绍具体技术
  • 5.实验结果
  • 6.结论
    • 二.论文阅读分享
    • 1.摘要学习
    • 2.引言和背景及动机
    • 3.总体框架
    • 4.DEOBFUSCATION
    • 5.对比实验
      • 三.总结
      相关产品与服务
      主机安全
      主机安全(Cloud Workload Protection,CWP)基于腾讯安全积累的海量威胁数据,利用机器学习为用户提供资产管理、木马文件查杀、黑客入侵防御、漏洞风险预警及安全基线等安全防护服务,帮助企业构建服务器安全防护体系。现支持用户非腾讯云服务器统一进行安全防护,轻松共享腾讯云端安全情报,让私有数据中心拥有云上同等级别的安全体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档