首页
社区
课程
招聘
[原创]MMTS(一) -- Windows CMD命令去混淆脚本
2021-1-8 16:29 5010

[原创]MMTS(一) -- Windows CMD命令去混淆脚本

2021-1-8 16:29
5010

MMTS(一) -- deDosfuscation.py

基于Python实现的Windows CMD命令去混淆脚本。

 

项目地址:mmts

安装

1
$ pip install mmts

1. 命令行使用

1
2
3
# decmd
# $cmd_file每行一条混淆CMD命令,处理完成输出$cmd_file.clear到当前目录
$ mmts-decmd $cmd_file

2. 快速开始

1
2
3
4
5
6
7
8
from mmts import de_dosfuscation_work
 
def main():
    clear_str = de_dosfuscation_work("$Obfuscated_string")
    print(clear_str)
 
if __name__ == "__main__":
    main()

常规CMD命令符号一览

首先,一起回顾下CMD命令中常使用的命令符号,了解符号的意义,有助于掌握命令的意义与逻辑,以及了解去混淆的时机。

  • @:隐藏命令的回显。
  • ~:变量扩展或者扩展环境变量指定位置的字符串。
  • %:引用环境变量或者单个%表示引用命令行参数。
  • ^: 取消转义字符。
  • &: 命令连接字符。
  • |: 管道符,将上一个命令的输出,作为下一个命令的输入。
  • :: 标签符,接受goto命令所指向的标签。
  • "":界定符,使用带有空格的路径时用""将路径括起来。
  • /: 其后的字符是命令的功能开关。
  • >: 命令重定向符,输入在前,输出在后,覆盖之前的内容。
  • >>: 命令重定向符。输入在前,输出在后,不覆盖之前的内容。
  • <:将后面文件的内容输出到前面。
  • = :赋值符号,用于变量赋值。
  • \ :当前路径所在的根路径。
  • && :连接两个命令,&&前的命令成功时,才执行&&后的命令。
  • || :连接两个命令,||前的命令失败时,才执行||后的命令。
  • $:findstr命令中表示一行的结束。
  • ``:for/f中表示它们所包含的内容当作命令行执行并分析它的输出。
  • !: 延迟变量,使用!!将变量名扩起来表示对变量值的引用。

CMD混淆介绍

介绍完常用命令符号,再介绍一下当前比较有名的混淆工具:Invoke-DOSfuscation

 

该工具主要是用于混淆powershell脚本,同时兼容混淆cmd命令,详情参考fireeye白皮书

 

据作者自己介绍,他是在研究APT攻击的过程中对命令混淆这块产生的兴趣,并花了几个月的时间完成了这个混淆工具。作者本意是为了方便defenders去测试自己产品对混淆技术的检测能力。(PS:不过,考虑到实际情况,这个工具被攻击者用来躲避杀软检测的可能性更高。)

 

详细说明请参考该项目的README),这里就不展开介绍了。

已有CMD去混淆工具

为了检测命令混淆这类攻击,fireeye开发了基于flare-qdb的动态去混淆的工具De-DOSfuscator

 

flare-qdb是一套基于Python和Vivisect的命令行交互式模拟执行工具。该工具主要用于记录恶意程序的执行过程的某些状态值,方便分析人员去发现和回溯。

 

De-DOSfuscator是基于flare-qdb的Python脚本,用于记录混淆Powershell脚本或混淆cmd命令执行过程,并从中提取出原始的powershell或cmd命令。使用手册参考dedosfuscator.md,详细介绍参考cmd-and-conquer-de-dosfuscation-with-flare-qdb一文。

python脚本去混淆介绍

python脚本拆分为5个过程,实现去混淆,其中第2、第3、第4步是关键,可以通过不断优化这三个步骤,实现对更多混淆类型的去混淆支持。

1. 替换^符号

^符号用于取消转义。

 

在命令混淆中,常见于s^Etfin^Ds^TrE^ch^O

2. 通过=%的规则,查找混淆变量

=用于赋值,%%用于取值。

 

流程如下:

  1. 提取混淆字符串中所有=的位置,保存为equ_list
  2. 提取混淆字符串中所有%的位置,按奇偶位拆分为两个odd_list(索引为1,3,5,7,...),even_list(索引为0,2,4,6,...)。odd_list保存%%符号对结束符号的索引,even_list保存%%符号对开始符号的索引,(0,1),(2,3),...称为一个%%符号对
  3. 移除odd_list中小于min(equ_list)的值,移除even_list中小于min(equ_list)的值
  4. 递归:定位目标=号位置,若=号位于%%符号对之间,并且离结束%最近,则提取变量名和变量值,替换原始字符串中的混淆变量;如果字符串中不存在=号,或者=号不在%%符号对之间,则退出递归,返回新字符串

3. 通过set关键字,查找混淆变量

set命令用于显示、设置或删除 cmd.exe 环境变量。

 

流程如下:

  1. 通过正则表达式匹配set命令,提取=两边的变量名和变量值
  2. 替换原始字符串中的混淆变量,替换规则包括%%%s:%%%%%s%%!%s!:%s%s(替换过程按顺序执行,不可更改)
  3. 递归如上流程,不存在set则退出递归,返回新字符串

4. 通过%:~n,m%关键字,查找混淆变量

%.*:~n,m%用于变量截断,提取指定数据

 

程如下:

  1. 通过正则表达式匹配%(.*?):~(.*?),(.*?)%命令,提取变量字符串、提取,两边的起始位置和长度
  2. 利用提取的字符串替换匹配的字符
  3. 递归如上流程,不存在%(.*?):~(.*?),(.*?)%则退出递归,返回新字符串

5. 统一常用命令、程序名称

统一小写常用命令、程序名称,当前包括['echo', 'set', 'explorer', 'temp']

其他一些想法

  • 比如不用去混淆,直接使用机器学习做检测;
  • 比如按混淆类型分类团伙之类的

运行截图


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回