解混淆Emotet powershell payload

栏目: 编程工具 · 发布时间: 6年前

内容简介:Emotet是2014年发现的一种银行木马,之后研究人员发现了大量的Emotet垃圾邮件活动,使用多种钓鱼方法诱使用户下载和加载恶意payload,主要使用恶意Word文档传播。

解混淆Emotet powershell payload

Emotet是2014年发现的一种银行木马,之后研究人员发现了大量的Emotet垃圾邮件活动,使用多种钓鱼方法诱使用户下载和加载恶意payload,主要使用恶意Word文档传播。

解混淆Emotet powershell payload

图1 Emotet感染链

用户在收到钓鱼邮件时,点击邮件中的链接后,就会下载恶意Word文档。然后恶意文档会诱使用户启用内容和宏来加载嵌入的VBA代码。但是VBA代码是混淆过的,最后会加载一个powershell命令。下面讲述使用沙盒和powershell审计技术在不解混淆的情况下获取VBA代码加载的powershell命令。

解混淆Emotet powershell payload

混淆方法

Powershell代码本身也是经过混淆的,在虚拟环境下加载的问题就是我们可能看不到任何网络IoC。最好的办法就是将代码解混淆,这样才能更好地理解它。

混淆是一种使恶意代码不便于阅读的方法,有两个作用:一是欺骗杀毒软件,二是使对恶意代码的分析更耗时间也更困难。

下面介绍2017年12月起Emotet恶意软件使用的三种混淆方法:

1. 字符串替换方法

字符串替换方法使用多个powershell的replace函数来交换无用的字符串和一些关键字,最终产生有效的powershell代码。

解混淆Emotet powershell payload

图3. 用代码替换方法混淆的代码

可以通过替换字符串的方式在文本编辑器中解混淆代码,用正则表达式可以加速这一过程。最后可以通过 python 脚本中的正则表达式自动完成解混淆。

在python中实施解混淆时应注意:

  • 字符串连接。代码中的+会使正则表达式出错,因为需要提前处理。
  • 字符类型映射。有时候为了增强混淆的效果,字符串可能不是直接用powershell中的代码类型替换,而是用int转化为char。因此也需要提取处理。
  • 替换代码的一部分会生成新的替换。这是因为无用字符串可能是在替换器的中间,因此,最好把正则表达式加入循环中,如果还可以替换就一直替换。

解混淆Emotet powershell payload

图4 解混淆图3中代码的结果

2. 字符串压缩

字符串压缩方法也很简单,使用powershell内置的DeflateStream类来解压缩和执行压缩流。

解混淆Emotet powershell payload

图5 解压缩字符串混淆方法

最简单的解混淆方法是用powershell简单的解压缩字符串。

需要注意的是要手动移除前两个括号中的命令,因为这是混淆的Invoke-Expression cmdlet(接受任何字符串输入并将它视为PowerShell代码)。在处理恶意代码时,最好使用安全的虚拟环境。

解混淆Emotet powershell payload

图6 powershell中使用的解压缩解混淆方法

查看MSDN文档,可以看到RFC 1951 Deflate数据格式说明中的DeflateStream类,所以可以用zlib库完成解压缩。Zlib的解压缩方法默认需要准确的zlib文件头,而DeflateStream是不需要的,因为这就变成了一个流而不是文件。为了让zlib解压缩流,可以在文件中加一个header或者简单的传递一个-zlib.MAX_WBITS参数给解压缩函数。zlib.MAX_WBITS参数如果是负值就表示解压缩函数应该跳过header位。

3. ASCII代码数组

计算机用0101数字串来表示字符串,但对人类而言,字符串更易读,所以数字串要通过程序转变成字符串。恶意代码可以利用这个技巧来隐藏真正目的,这是第三种混淆方法,ASCII码数组混淆方法。

解混淆Emotet powershell payload

图7 ASCII码数组混淆方法

在图5的例子中,我们可以看到一些含有数字的长字符串。如果熟悉ASCII码,可能就可以马上认出来。如果不熟悉的话,可以通过映射表将数字转化为int然后在转化为char。例子中的方法使用了切割函数,通过给定的分割器将字符串分割开来进行下一步的混淆。

为了在python中解混淆代码,可以使用一个简单的split方法,然后用chr()函数将字符与数字进行映射。

解混淆Emotet powershell payload

图8 用split方法在python中解混淆出的ASCII码数组

真实代码

在解混淆出源代码后,可以看出是一个简单的释放器,用WebClient类来连接硬编码的域名,在%TEMP%目录下载二进制文件,然后加载。代码中使用break,try-catch语句来确保脚本在下载完成前能够连接到域名。

Invoke-Expression

许多混淆powershell脚本都用Invoke-Expression cmdlet来把混淆后的字符串当作代码运行。在Windows console中运行powershell恶意代码是有必要的,因为如果没有invoke-expression cmdlet,混淆后的恶意代码就不能运行。

因此,找出伪装的Invoke-Expression cmdlet就非常重要。首先,powershell允许为长命令使用缩写。所以Invoke-Expression的内置缩写就是iex,但powershell还允许将字符串连接并用作cmdlets,而且字符串可以保存为变量。

那么问题来了,我们可以用DeflateString压缩的例子来说明。脚本开始的一行代码是:

$vERBOsepreFErEncE.tOStRIng()[1,3]+'X'-JoIn''

这行代码将powershell内置变量$verbosepreference的值转化为字符串,然后在第2和第4个字符后面连接了X,之后再用join将所有的字符连接成一个字符串。

那么变量$verbosepreference的默认值是什么呢? SilentlyContinue 第2个第4个字符分别是i和e。当连接一个x后就变成了iex,也就是Invoke-Expression cmdlet的缩写。事实上,这类技巧在powershell中应用还是很普遍的,尤其是在恶意软件开发中。

解混淆Emotet powershell payload

图9 Invoke-Expression混淆示例

Emotet解混淆代码脚本下载地址: https://github.com/lasq88/deobfuscate/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Node.js实战

Node.js实战

[美] Mike Cantelon、[美] TJ Holowaychuk、[美] Nathan Rajlich / 吴海星 / 人民邮电出版社 / 2014-5 / 69.00元

服务器端JavaScript?没错。Node.js是一个JavaScript服务器,支持可伸缩的高性能Web应用。借助异步I/O,这个服务器可以同时做很多事情,能满足聊天、游戏和实时统计等应用的需求。并且既然是JavaScript,那你就可以全栈使用一种语言。 本书向读者展示了如何构建产品级应用,对关键概念的介绍清晰明了,贴近实际的例子,涵盖从安装到部署的各个环节,是一部讲解与实践并重的优秀......一起来看看 《Node.js实战》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具