De-DOSfuscator一款对cmd.exe执行命令进行记录的工具

xiaohui 安全工具 2019年3月6日发布
Favorite收藏

导语:flare-qdb是由fireeye开发,旨在帮助分析人员提高分析效率。flare-qdb是一个命令行工具,基于python开发,其中的虚拟代码执行使用了python的 vivisect库,工具可以很方便的用来查询和改变二进制样本运行时的状态变量,同时也可使用系统模拟等。

前言

flare-qdb是由fireeye开发,旨在帮助分析人员提高分析效率。flare-qdb是一个命令行工具,基于python开发,其中的虚拟代码执行使用了python的vivisect库,工具可以很方便的用来查询和改变二进制样本运行时的状态变量,同时也可使用系统模拟等。我之前写过关于一篇题为“如何使用flare-qdb来检测和修改恶意软件行为”的文章。 当时Flare-qdb还刚刚在一些技术大会上亮相,且新引入了Windows事件日志服务,以删除流程创建事件。在这篇文章中,我将展示如何使用flare-qdb将“脚本块记录(script block logging)”引入Windows命令解释器。最后,我将分享我添加到flare-qdb的脚本,这样你就可以通过执行它们来删除恶意命令脚本(当然,在安全的环境中)。但首先,我得谈谈让我采用这种解决方案的一些想法来源。

方案分析

下图显示了一个批处理脚本(MD5 hash 6C8129086ECB5CF2874DA7E0C855F2F6),该脚本使用了BatchEncryption工具进行了混淆,BatchEncryption(BAT批处理加密程序)是一个全平台通用的强度较高的批处理加密程序,使用这款工具可以对批处理文件内的大小写字母,数字,字符进行变量偏移编码从而进行加密。在撰写本文时,这个脚本虽然还没有出现在VirusTotal的数据库中,但是其dropper确实已经存在(MD5哈希值为ABD0A49FDA67547639EEACED7955A01A)。我的目标是删除对此脚本进行的混淆处理,并分析出攻击者的攻击过程。

Picture1.png

XYNT.bat的具体内容

这个165k的批处理文件经过混淆处理后,变为 C:\Windows\Temp\XYNT.bat并由其dropper执行,它的执行命令是在环境变量子串中构建的。下图显示了如何使用ECHO命令对第一个命令进行解码处理的过程:

Picture2.png

通过ECHO命令解码部分命令

该脚本使用数百个命令来设置最终要进行反混淆处理的环境变量,以完成对恶意命令进行的反混淆处理。一般来说要对这个脚本进行反混淆处理,方法很繁琐,就是通过预先添加ECHO语句来将每个反混淆处理的命令输出到控制台,从而完成对每个命令的反混淆处理。不幸的是,尽管ECHO命令可以解码每个命令,但BatchEncryption需要执行SET命令来解码将来可能出现的命令。更重要的是要解码此脚本,就要允许所有的恶意功能按预期运行,为此你必须仔细查看并有选择的执行数百个混淆的SET命令。

BatchEncryption的麻烦之处在于,批处理脚本会被视为非常简单的反混淆处理脚本,这使得二进制代码难以被发现并进行处理。但BatchEncryption通过在环境变量中大范围、多层次地使用原始命令进行环境重建,从而为分析增添了一道巨大的障碍。

以Cmd为例

我决定看看BatchEncryption是否可以对 cmd.exe 执行命令进行记录,而不是自己对脚本进行反混淆处理。首先,我调试了cmd.exe,在CreateProcessW上设置了断点,并从命令提示符执行了一个相关程序。下图显示了CreateProcessW作为cmd.exe执行记事本时的调用堆栈:

3.png

CreateProcessW作为cmd.exe执行记事本时的调用堆栈

从cmd!ExecPgm开始,我查看了cmd.exe中的所有反混淆处理的函数,这样做是为了跟踪调用堆栈中命令字符串的来源。就是在此期间,我发现了cmd!Dispatch,它接收的不是字符串结构,而是带有指向的命令、参数和任何I/O重定向信息(例如将标准输出或程序的错误流重定向到文件或设备)的指针结构。测试显示这些带有指向的指针结构会重建所有环境变量,这意味着我们应该能够从其中读取反混淆处理的命令。

下图就是在运行 "echo hai > nul"命令之后,对WinDbg中的这种结构的探索。此命令会将单词hai输出到标准输出流中,之后再使用直角括号将标准输出重定向到NUL设备,这样,设备里的所有数据都会被删除。以下用橙色框突出表示的是在分析过程中引起我注意的非空指针,箭头指向的地方就是我用来发现这些非空指针内容的命令。

4.png

探索第二个参数中有趣的指针到cmd!Dispatch

由于用户可以在一个命令中重定向多个I/O流,因此cmd.exe会表示带有链接列表的I/O重定向。例如,列表1中的命令将标准输出(stream #1 是隐式调用)重定向到shares.txt和error .txt的标准错误(stream #2被显式引用)。

net use > shares.txt 2>errors.txt

命令行I/O重定向示例

下图用模块结构显示了命令数据结构和I/O重定向链表:

Picture5.png

命令数据结构图

通过检查,我发现cmd!Dispatch负责执行shell内置函数和可执行程序,因此与在CreateProcess上设置断点不同,进程创建命令会一直存在其中。基于这些发现,我编写了一个flare-qdb脚本,以便在执行命令时解析和转储命令。

De-DOSfuscator

De-DOSfuscator使用flare-qdb和Vivisect挂钩cmd.exe中的Dispatch函数,从而从内存中解析命令。De-DOSfuscator脚本会运行在64位的Python 2解释器中,并将命令转储到控制台和日志文件中。该脚本附带了flare-qdb的最新版本,并在名为dedosfuscator.exe的Python入口点进行安装。

De-DOSfuscator依赖于非导出的Dispatch函数的位置来记录命令,其具体的位置因系统而异。为方便起见,如果互联网连接可用,De-DOSfuscator将使用微软的符号服务器(symbol server)自动检索此函数的偏移量。要允许脱机使用,你可以从脱机的计算机向–getoff开关提供cmd.exe副本的路径以获取此偏移量。然后,你可以将该输出作为参数提供给脱机计算机中的–useoff开关,并最终得到De-DOSfuscator函数所在的位置。或者,你还可以将De-DOSfuscator与下载的PDB或包含正确符号的本地符号缓存一起使用。

下图演示了在单个会话中获取和使用的偏移量,请注意,要使其在隔离的虚拟机中工作,你需要指定特定于该虚拟机的guest命令解释程序副本的路径。

Picture6.png

获取和使用偏移量并测试De-DOSfuscator

这对于图1中的BatchEncrypted脚本非常有用,运行结果如下。

运行结果分析

下图显示了运行XYNT.bat后De-DOSfuscator创建的日志,数百行SET语句会逐步构建环境变量以组成更多命令。如果你最后仔细查看,也会注意到endlocal命令行扩展关键字时的拼写错误。

Picture7.png

转储命令的开始

如下图所示,这些环境变量操作会让位于实际命令。该脚本的第一个操作便是使用reg.exe检查NUMBER_OF_PROCESSORS环境变量。该分析系统只有一个vCPU,可以在620行的“a = 1”输出集中看到。此后,脚本执行goto del命令,执行批处理操作,最终删除脚本和其他删除的文件。

Picture8.png

绕过沙箱的测试

以上是一个针对常见沙箱的绕过技巧—— batch-oriented spin。它的工作原理如下:因为许多恶意软件分析沙箱使用单个CPU运行,以最小化虚拟机管理程序资源,而大多数现代系统至少有两个CPU内核。现在我们可以轻松的读取脚本的命令,例如,通过增加虚拟机可用的vCPU数量来避免这种绕过。下图就显示了显示了在引导其余代码运行之后的De-DOSfuscator日志:

Picture9.png

XYNT.bat调用已删除的二进制文件来创建和启动Windows服务以实现持久性,其中被删除的最大二进制文件是XMRig加密货币挖掘程序的一种变体,脚本引用的许多服务和可执行文件似乎也与加密货币相关。

在我分析cmd.exe的过程中,我注意到一个名为fDumpParse的变量只有一个交叉引用,该引用会导致一个有趣的行为。单独的交叉引用和相关代码如下图所示,虽然fDumpParse在代码中的任何其他地方都不可访问,但它会通过控制调用函数来转储有关已解析的命令的信息。

Picture10.png

fDumpParse评估和交叉引用(EDI为NULL)

要对此进行测试,你可以使用De-DOSfuscator的–fDumpParse开关。然后,你将看到一个命令提示符,该命令提示符会让其解析的内容更加透明。下图显示的一个示例,是用解析的命令令牌的抽象语法树(AST)的图形表示的。

Picture11.png

使用fDumpParse集设置的命令解释器

我在想,微软可能是插入fDumpParse标志,以便开发人员可以用cmd.exe调试相关问题。尽管如此,fDumpParse标志还是不适合批量处理反混淆的情况,原因有以下6个方面:

1. 这个输出比普通命令更难读取,因为它是以预先制定的顺序遍历转储树,而不是按输入的顺序遍历;

2.从控制台复制过来的输出可能包含无关的换行符,这具体取决于控制台宿主程序的文本换行行为;

3.在命令解释器中通过滚动的方式读取或复制输出内容可能非常繁琐;

4.控制台缓冲区是有限的,所以不能捕获所有内容;

5.恶意脚本的开发者仍然可以使用CLS命令删除屏幕显示并使所有fDumpParse输出消失;

6.将命令分隔符(就像在XYNT.bat中发现的那样)随意地连接到命令中,会产生超出控制台的不可读的抽象语法树,如下图所示;

Picture12.png

超出控制台控制的fDumpParse输出

可见,fDumpParse不适用于对大型恶意批处理文件进行反混淆处理,然而,对于短脚本或一次性命令的反混淆处理仍然很有用。你可以通过–getoff获得De-DOSfuscator脱机使用所需要的偏移量,并通过–useoff使用它,就像正常操作一样。

总结

如上所示,我先给出了一个经过严重混淆的命令脚本的示例,然后通过De-DOSfuscator,进行了反混淆处理。 De-DOSfuscator脚本代码附带最新版本的flare-qdb,并且在安装flare-qdb时可以作为脚本入口点(dedosfuscator.exe)访问。我希望本文不仅可以帮助你方便的对恶意脚本进行批处理,还可以激发你使用flare-qdb来抵御恶意应用。

本文翻译自:https://www.fireeye.com/blog/threat-research/2018/11/cmd-and-conquer-de-dosfuscation-with-flare-qdb.html如若转载,请注明原文地址: https://www.4hou.com/tools/15036.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论