1. Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts

代码在 https://github.com/li-zhenyuan/Effective-and-Light-Weight-Deobfuscation-and-Semantic-Aware-Attack-Detection-for-PowerShell-Scripts

主要工作

  1. 先基于子树去混淆(利用了机器学习识别混淆的子树)
  2. 利用OOA提取了恶意代码的语义规则然后进行检测

POWERSHELL DEOBFUSCATION

处理混淆大体分为5个阶段

  1. 把脚本文件解析为AST树(在解析的时候,对变量两端进行链接,在下面的第2步,第3步也这样操作)
  2. 用分类器识别混淆的子树(用到了机器学习, 混淆的子树并不都是可恢复的)
  3. 利用仿真器恢复混淆的片段
  4. 把第三步解混淆后的片段再弄成AST子树,替换进去
  5. (1-4步循环,直到找不到混淆的子树)利用Post Processing模块把找不到混淆的那个最终的AST树再变成脚本文件

1. Extract Suspicious Subtrees

因为在AST数中,只有2种方法传递恢复的片段给上层节点

  1. 管道(pipe)
  2. 变量

所以只检测2种类型的子树 PipelineAstAssignmentStatementAst,称这2种子树为Suspicious Subtrees, 以广度优先的方式遍历AST, 并将可疑子树推送到堆栈中以进行后续步骤

2. Subtree-based Obfuscation Detection

基于机器学习的子树混淆检测。。

提出4种类型的特征

  1. Entropy of script pieces
  2. Lengths of tokens
  3. Distribution of AST types
  4. Depth of AST

3. Emulation-based Recovery

直接启动一个powershell进程,然后去执行,返回值就是易经恢复好的字符串

比如​ ("{0}{1}" -f'ie','x') –> iex

如果返回值不是字符串,说明上一步检测的这个子树有问题,即给这个子树标记为非混淆子树,然后继续跳过去分析下一个obfuscation-subtree

4. AST Update

当得到一个恢复的脚本片段的时候,将其变为AST(Recovered subtree)而且更新AST

这个过程主要有2步:

  1. 将已经恢复的AST子树去替换掉刚才的可恢复的AST子树,并且修改这个子树的祖先的特征,以及把这个子树的所有的可疑子树推到堆栈中。
  2. 更新脚本片段,在子树的根节点位置存储具体的脚本片段,这个脚本片段应该被更新

5. Post processing

根据字符串之间的符号来进行后处理,比如

"("DownloadFile").Invoke($url)" 因为有个.Invoke ,中间的.就说明$url是个参数,然后DowloadFile是个函数

SEMANTIC-AWARE POWERSHELL ATTACK DETECTION

检测系统主要是处理API集合,然后主要分为2个阶段, 训练阶段和检测阶段

Training Phase

先根据前面提到的AST子树去针对 InvokeMemberExpressionAst、CommandAst等 提取一些itemsets,比如 {’new-object’, ’downloadfile’, ’start-process’}就是一个itemset

然后用一个 classic classification based on OOA mining 去对分析出来的itemsets进行操作

  1. 首先用FP-Growth算法来生成frequent patterns,比如{z, r}, {z,x,y,t}这种
  2. 选择满足条件​的patterns来作为OOA rules

满足什么条件呢?这里用到了2个数据,一个支持度,一个置信度

至于支持度、置信度是什么?可以看下面2个文章

https://blog.csdn.net/wo334499/article/details/51698810

https://blog.csdn.net/cnweike/article/details/7311468

$support(I, Obj) = \frac { count(I\cup{ Obj}, DB) } {|DB|}$​

$confidence(I, Obj)= \frac { count(I\cup{ Obj}, DB) } {count(I, DB)}$​

根据图8,{z, r}的支持度为 2(即是{z,r}, 又是恶意的) / 5 = 0.4

{z, r}的置信度为 2 / 2 = 1

{z,x,y,t}的支持度是 1 / 5 = 0.2 (不知道为啥论文这里是0.6,我怀疑是不是写错了????)

{z,x,y,t}的置信度是 1 / 3 = 0.33

如果是支持度 > 0.2 且 置信度 >0.9,,则把它放到OOA规则中

最终提取了31个OOA规则,典型的一些列在下图

Detection Phase

将脚本解析为itemsets,然后去匹配上一步训练好的OOA规则

后面的评估部分之后再看