《Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts》论文阅读
1. Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for PowerShell Scripts
主要工作
- 先基于子树去混淆(利用了机器学习识别混淆的子树)
- 利用OOA提取了恶意代码的语义规则然后进行检测
POWERSHELL DEOBFUSCATION
处理混淆大体分为5个阶段
- 把脚本文件解析为AST树(在解析的时候,对变量两端进行链接,在下面的第2步,第3步也这样操作)
- 用分类器识别混淆的子树(用到了机器学习, 混淆的子树并不都是可恢复的)
- 利用仿真器恢复混淆的片段
- 把第三步解混淆后的片段再弄成AST子树,替换进去
- (1-4步循环,直到找不到混淆的子树)利用Post Processing模块把找不到混淆的那个最终的AST树再变成脚本文件
1. Extract Suspicious Subtrees
因为在AST数中,只有2种方法传递恢复的片段给上层节点
- 管道(pipe)
- 变量
所以只检测2种类型的子树 PipelineAst
和 AssignmentStatementAst
,称这2种子树为Suspicious Subtrees, 以广度优先的方式遍历AST, 并将可疑子树推送到堆栈中以进行后续步骤
2. Subtree-based Obfuscation Detection
基于机器学习的子树混淆检测。。
提出4种类型的特征
- Entropy of script pieces
- Lengths of tokens
- Distribution of AST types
- Depth of AST
3. Emulation-based Recovery
直接启动一个powershell进程,然后去执行,返回值就是易经恢复好的字符串
比如 ("{0}{1}" -f'ie','x')
–> iex
如果返回值不是字符串,说明上一步检测的这个子树有问题,即给这个子树标记为非混淆子树,然后继续跳过去分析下一个obfuscation-subtree
4. AST Update
当得到一个恢复的脚本片段的时候,将其变为AST(Recovered subtree)而且更新AST
这个过程主要有2步:
- 将已经恢复的AST子树去替换掉刚才的可恢复的AST子树,并且修改这个子树的祖先的特征,以及把这个子树的所有的可疑子树推到堆栈中。
- 更新脚本片段,在子树的根节点位置存储具体的脚本片段,这个脚本片段应该被更新
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进行操作
- 首先用FP-Growth算法来生成frequent patterns,比如{z, r}, {z,x,y,t}这种
- 选择满足条件的patterns来作为OOA rules
满足什么条件呢?这里用到了2个数据,一个支持度,一个置信度
至于支持度、置信度是什么?可以看下面2个文章
$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规则
后面的评估部分之后再看