标题 | 简介 | 类型 | 公开时间 | ||||||||||
|
|||||||||||||
|
|||||||||||||
详情 | |||||||||||||
[SAFE-ID: JIWO-2024-3264] 作者: 浩丶轩 发表于: [2023-02-03]
本文共 [685] 位读者顶过
该shellcode提取器的应用对象是Maldoc,通过将市面上存在的相关分析工具进行组合,形成工具链,达到自动化定位及提取shellcode的目的。
一、[出自:jiwo.org]
实现并不复杂,本人认为该工具的实现思路是它的闪光点。实现思路,即将分析人员手动定位并提取shellcode的步骤自动化。整体流程主要由解包、定位、提取这三个环节组成,后续的优化并不会改变整体流程。
解包判断文件类型通过oleid检查maldoc的基本信息,并根据其中Container format字段的键值判断该文件的具体类型,根据类型进入不同的分支,但最终都会走入OLE对象处理分支。
若该文件被加密,可以通过msoffcrypto-crack对密码进行爆破,并保存完成解密的文件。
通过“-F”选项找到所有OLE对象后,将所有OLE对象的标识保存下来,为后续提取做准备。
将所有找到的OLE对象,根据标识定位并保存下来,传给OLE对象处理模块,进行后续处理。
本人所实现的hook是基于frida的,整体实现十分简洁,准备部分是由python实现的,hook部分是用js实现的,python部分没啥可说的,很容易理解,可以看一下frida官方给出的例子,以及DarunGrim的Using Frida For Windows Reverse Engineering这篇文章,且这篇文章写的非常精彩,它为我们提供了基于frida hook对office宏指令进行有效处理的方法,值得学习。那我们来看一下hook的实现吧。
要想获取到OLE对象,OleConvertOLESTREAMToIStorage是关键API,我们来看一下Microsoft给出的详细解释,该API功能是将OLE对对象的格式从OLE1转换到OLE2,其中一定包含了我们想要的OLE对象信息。
因而我们可以hook该API,并通过该API的第一个参数lpolestream(其是指向包含OLE1格式的OLE对象的指针)找到OLE对象,再根据存储结构找到OLE对象的具体位置及OLE对象的整体长度即可,具体操作请看Silver Bullet方法,大佬写的十分清晰且详细,复现非常简单,本文也不再进行过多赘述,hook的具体实现请看本人写的js代码,主要就是进行了获取并保存OLE地址和OLE长度的工作。 js代码如下:
通过复现Silver Bullet,我也发现了一个小问题,即通过API参数获取到的OLE对象地址(0x0A6A5B28),并未直接指向OLE对象的标识头(红框中十六进制字节),若直接根据地址和长度对该块内存进行dump,所获取的文件并不能直接传入本人所写的shellcode提取器,这是由于文件头的问题,导致oledump无法对该OLE对象进行正确解析,后续的操作也就无从谈起。
通过查阅frida文档,我发现可以用frida提供的内存数据匹配来实现精确拷贝,将OLE对象头作为匹配所用的模式串即可解决该问题。
js代码如下:
再利用偏移值和scdbg进行测试,确定shellcode的具体开始位置。
若scdbg不能确定shellcode的具体位置,则将整个子stream保存为文件,作为最终的shellcode。
三、
对得到的shellcode(final_shellcode_file)进行一下简单的验证。 静态:可以看到其中有LoadLibraryW和GetProcAddress,看到这俩函数可以确定,其在获取目标函数的地址,方便后续使用;又看到ExpandEnvironmentStringsW,可以确定其是将其中的“%APPDATA%”进行扩展;随后再调用URLDownloadToFileW来下载后续文件,写入指定路径中。
动态:选择scdbg进行模拟执行来获取更加准确的信息,通过shellcodedbg执行后的结果,可以更加清晰地看到,其调用了哪些函数,参数是什么,整体流程与上文通过静态分析得到的结果基本一致,但模拟执行向我们展示了准确的URL,以及从远端下载了什么。
可以看到通过两者结合我们快速且精确的得到了maldoc中的shellcode,并通过静态或模拟执行来获取到其主要行为,快速结束maldoc的前戏,将主要精力放在分析后续的主体行为上,提高效率,愉悦心情。 该工具目前只是一个雏形,逻辑较为简单,且可能存在不严谨之处,亦存在一定问题和优化空间,主要是提供一种从特例中提取特征,从而向普适化转变的思路。
运行环境基于 Remnux (https://remnux.org/)docker
Didier Stevens (https://isc.sans.edu/handler_list.html#didier-stevens)大佬的工具集及博客
oletools 工具集(https://github.com/decalage2/oletools)
frida-python github(https://github.com/frida/frida-python)
frida 官方文档(https://frida.re/docs/home/)
Denis O'Brien 大佬的 Silver Bullet(http://malwageddon.blogspot.com/2018/11/deobfuscation-tips-rtf-files.html)
DarunGrim 的 Using Frida For Windows Reverse Engineering(https://darungrim.com/research/2020-06-17-using-frida-for-windows-reverse-engineering.html)
|