宏病毒的研究与实例分析06——终结篇 进击的MACRO
文章目录
- 背景
- VBA stomping
- 在VBA编辑器中隐藏宏
- 使用旧版宏警告
- 常用的规避杀软的手法
- 结语
- 参考文献
转自信安之路病毒分析小组组长::x-encounter
背景
Office版本历经十几年的变迁,现已趋于成熟,但仍存在着新老版本交替使用的问题。Office 97-2003 Word的文件后缀为doc,新版本的Office文件后缀为docx,包含宏的文档后缀为docm。微软是不会允许将包含宏的文档命名为docx,但是可以被命名为老版的doc。例如一个docm文件,文件头的魔数是504b0304(ZIP文件的魔数),修改其后缀为doc后,文件头的魔数不变,且能够正常执行。而老版的doc文件头的魔数是d0cf11e(docfile的十六进制表示_),所以我们可以通过文件后缀和魔数是否匹配来判断一个文档是不是恶意的。
随着这几年APT攻击的兴起,诱饵文档越来越多,对MACRO的研究自然也达到了新的高度,很多未公开的特性可以用来规避和绕过杀软,对威胁分析员造成了巨大的挑战。下面我就以威胁分析员的角度来介绍几种技术
VBA stomping
VBA在Office文档中可以以下面三种形似存在
1、源代码。宏模块的原始源代码被压缩,并存储在模块流的末尾。可以删除源代码,并不影响宏的执行
2、P-Code。与VB语言相同,VBA同样有P-Code,通过内置的VB虚拟机来解释P-Code并执行,平常我们Alt+F11打开所看到的正是反编译的P-Code。
3、ExeCodes。当P-Code执行一次之后,其会被一种标记化的形式存储在__SRP__流中,之后再次运行时会提高VBA的执行速度,可以将其删除,并不影响宏的执行。
每一个流模块中都会存在一个未被文档化的PerformanceCache,其中包含了被编译后的P-Code代码,如果_VBA_PROJECT流中指定的Office版本与打开的Office版本相同,则会忽略流模块中的源代码,去执行P-Code代码
官方文档解释_VBA_PROJECT流
一定为(Must be)0xFFFF,而在实际文件中,以Office 2010(32位)为例
emmm,微软还是秀啊……
这种特性很适合用于定向攻击,且不容易被发现。通过信息收集得知目标的Office版本,利用VBA stomping使宏被特定版本的Office打开时才会执行恶意行为宏代码,除此之外的Office版本打开时执行正常宏代码
目前VBA stomping已有利用工具EvilClippy
https://github.com/outflanknl/EvilClippy
通过目前主流的宏分析工具(oletools,oledump,Pcodedmp)来探究分析此类样本的方法:
首先创建一个带宏的文档
准备一个伪造的VBA文件fakecode_word_vba.txt
执行命令,-t参数指定Office版本
EvilClippy.exe -s fakecode_word_vba.txt -t 2010x64 x-encounter.doc
使用Office2010(64位)打开生成后的文档
VBA编辑器
与原来的文档没有任何区别,接下来使用Office2013(64位)打开
VBA编辑器
可以看到流模块中反编译的源代码被替换成了伪造的VBA代码,下面使用工具进行分析
OleTools
Olevba识别出来了所有的宏并给出VBA stomping警告
Oledump
Oledump并没有识别出含有宏的流模块
Pcodedmp
Pcodedmp精准的识别了真正的宏代码,忽略了伪造的VBA
通过VBA stomping原理可知,真正的代码存为了P-Code,所以olevba输出的结果中反编译形式的VBA即为真正的代码。可以通过Olevba判断是否使用了VBA stomping,如果是则直接使用Pcodedmp获取P-Code代码。静态看即可
如果想要调试,那么需要使用对应版本的Office,我这里通过_VBA_PROJECT中Version结构总结了一下32位下的版本号,64位研究方法一样。
2007(x86) 8800
2010(x86) 9700
2013(x86) A300
2016(x86) AF00
在VBA编辑器中隐藏宏
可以在VBA编辑器中隐藏真正的宏,只需要修改PROJECT流(可以将PROJECT流理解为VBA编辑器的配置文件)中的Module=NewMacros,将其抹零即可
在VBA编辑器中,NewMacros已经消失了,宏正常执行
还可以使项目锁定且不可看,需要修改PROJECT流ProjectProtectionState和ProjectVisibilityState这两个属性
虽然这两个属性的内容都是被加密的内容,但是经过实验,将其内容改为任意值(更改时注意长度)
会使得VBA工程被锁定且不可看,如果只修改ProjectVisibilityState,VBA工程目录可看,但单个代码模块不可看
理论上该过程是不可逆的,但通过实验发现将相关属性改为有效值并模拟密码保护即可解除锁定
ID = {00000000-0000-0000-0000-000000000000}
CMG = CAC866BE34C234C230C630C6
DPB = 94963888C84FE54FE5B01B50E59251526FE67A1CC76C84ED0DAD653FD058F324BFD9D38DED37
GC = 5E5CF2C27646414741474
可以使用EvilClippy解除锁定
EvilClippy -uu 目标文件
上述两种方法所隐藏的宏都可以通过工具检测出来。
使用旧版宏警告
新版本的宏警告
而旧版的宏警告提示更加的显眼
启动旧版宏警告步骤很简单
- 将.xlsm重命名为.zip并解压缩
- 将visibility =“hidden”属性添加到xl / workbook.xml文件中的workbookView元素。
- 将所有文件再次压缩回一个xlsm文件
问题在于只有excel能弹出这种宏警告框,如何让Word也弹出类似的警告框呢?
研究一个样本:ffaa6e86c13b9bb1952b42d07d9c94882e27bc3b0cfe51e81b310a7fd0a5b29b
该word(RTF)文档内嵌了五个带有旧版宏警告的Excel表格
当启动word时,会启动excel并弹出excel旧版宏警告,点击禁用宏后还会启动第二个excel,一共启动五次,用户体验极差,当excel处理完成之后才会弹出Word文档
分析此类样本时可以使用rtfobj来查看Ole对象
-s和-d参数dump出指定的嵌入对象,接着使用Olevba快速分析
内嵌的宏使用了VBA Stomping,接着使用Pcodedmp将P-Code反编译出来,解混淆找到URL即可
常用的规避杀软的手法
一、
目前杀软查杀VBA基本上都是静态查杀,所以静态免杀至关重要,从源头上讲Word是一个zip文件,解压之后的vbaProject.bin包含着要执行的宏信息,也是杀软的重点关注对象,可以修改该文件名用于规避检测,步骤分以下三步
1.将“vbaProject.bin”重命名为“no_macros_here.txt”
2.更新“word / _rels / document.xml.rels”中的关系
3.在“[Content_Types] .xml”中,将“bin”替换为“txt”
二、
很多诱饵文档喜欢在VBA中启动脚本程序执行ps或者从网络上下载一段shellcode或恶意程序等等,这样非常容易被杀软的行为拦截拦住,同时沙箱可以根据进程链和流量判定该word文档是恶意的,安全分析人员可以轻易的通过监控进程树的方式观察恶意行为。
推荐使用WMI来执行后续攻击链,由WMI启动的进程的父进程为wmiprvse.exe而不是word.exe这样就可以与恶意word文档取消关联,规避检测
三、动态检测沙箱
可以利用dotnet属性以及WMI来检测Office:是否含有最近的文档,正在运行的任务数,特定进程检查(vbox,vmware等等),检测备用数据流(ADS),判断计算机是否是域的一部分(Win32_ComputerSystem类中PartOfDomain对象),检测Bios信息,检测即插即用信息(Win32_PnPEntity),检查用户名,检测文件名hash,检测文件名是否被易名,检测CPU核心(Win32_Processor),检测应用及个数。
在vmware虚拟机中运行结果
结语
想要一起交流学习最新的技术,逆向相关,威胁情报(APT样本)相关,恶意代码相关,欢迎加入信安之路病毒分析小组,Twitter搬运工诚邀您的到来。
参考文献
https://medium.com/walmartlabs/ms-office-file-formats-advanced-malicious-document-maldoc-techniques-b5f948950fdf
https://medium.com/walmartlabs/evasive-vba-advanced-maldoc-techniques-1365e9373f80
https://medium.com/walmartlabs/vba-stomping-advanced-maldoc-techniques-612c484ab278
https://medium.com/walmartlabs/vba-project-locked-project-is-unviewable-4d6a0b2e7cac
https://outflank.nl/blog/2019/05/05/evil-clippy-ms-office-maldoc-assistant/
http://www.52bug.cn/content/plugins/openlink/viewPage.html?url=https://vbastomp.com/
7cac>
https://outflank.nl/blog/2019/05/05/evil-clippy-ms-office-maldoc-assistant/
http://www.52bug.cn/content/plugins/openlink/viewPage.html?url=https://vbastomp.com/
宏病毒的研究与实例分析06——终结篇 进击的MACRO相关推荐
- 宏病毒的研究与实例分析05——无宏文件携带宏病毒
文章目录 前言 远程模板注入执行宏 docx文件格式解析 窃取NTLM Hashes 小结 说明 前言 docx文件可能是宏病毒吗? 如果你是一周前问笔者这个问题,笔者一定会斩钉截铁的说:" ...
- 宏病毒的研究与实例分析02——复合文档格式分析
文章目录 复合文档二进制解析 复合文档数据结构解析 准备工作 基础知识 Header FAT Directory 补充 宏代码数据结构解析 说明 目前主流杀软在处理宏病毒时,都是直接删除含有宏病毒的文 ...
- 宏病毒的研究与实例分析03——宏病毒处理篇
文章目录 宏病毒处理思路 破坏宏标志 宏清除脚本 手工清理宏(针对* .DOCM和* .XLSM文档) 替换宏代码 说明 在前一章我们解析了宏病毒的二进制格式,本篇紧跟上文,利用宏病毒的二进制格式清除 ...
- 实现 | 朴素贝叶斯模型算法研究与实例分析
实现 | 朴素贝叶斯模型算法研究与实例分析 (白宁超 2018年9月4日10:28:49) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受 ...
- 开源软件软件著作权执照详细研究和实例分析
前言:LGPL大约是开源库商用绕不开的一条,如何使用LGPL,要实现LGPL的开源软件,作为开发者,使用者和商用者我们需要做哪些工作,需要注意哪些问题呢,文章希望通过实例来说明这些问题. 1 开源许可 ...
- Python-LBM(格子玻尔兹曼)程序源码实例分析—圆柱绕流篇
初次学习LBM计算方法,找到一个比较优秀的用python语言编写的圆柱绕流的实例,对每段代码详细添加了注释,帮助自己总结,也为初学的朋友们提供一点帮助(全部代码在文章最后). 先放一张结果图像: 1. ...
- 用户行为分析的背景以及几种模型分析、实例分析——淘宝用户行为分析
这里写目录标题 1. 绪论 1.1了解用户行为分析 1.2用户行为分析的目的 2.用户行为分析的具体内容 2.1用户行为分析的指标 2.2用户行为分析模型 2.2.1漏斗模型分析 2.2.2用户留存分 ...
- 【Matplotlib】数据可视化实例分析
数据可视化实例分析 作者:白宁超 2017年7月19日09:09:07 摘要:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.但是,这并不就意味着数据可视化就一定因为要实现其功能用途而令 ...
- gpgpu-sim卡分配程序设计实例分析
gpgpu-sim卡分配程序设计实例分析 运行代码地址:https://github.com/gpgpu-sim/gpgpu-sim_distribution 一.概述 此文件包含有关安装.生成和运行 ...
最新文章
- 分别用BFS和DFS求给定的矩阵中“块”的个数
- 网络yum源 自定义yum仓库 zip备份 编译安装
- pycharm如何分两页阅读_雅思高分喜报| 听力、阅读、写作突破7分,2个月轻松突破雅思总分7, 她是如何做到的?...
- java.lang.IncompatibleClassChangeError: Expected static method
- Java JVM总结
- jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
- 计算机考级各省份难度,2018年全国各省份高考难度排名,基于高分率最新统计数据!...
- 理工科学生计算机要求,理工科学生
- requests第三方库在测试中的使用
- 批发网商品采集API接口
- 六度空间 c语言 【详解】
- 怎么使用计算机英语段落,怎么在电脑word文档中添加英文朗读功能
- 个人公众号注销方法_微信公众号注销后可以再申请吗 公众号注销帐号方法介绍...
- 大一上学期C++课程设计——学生成绩管理系统(QT项目)
- 蓝桥ROS机器人系统更新和功能包安装记录
- 什么原因造成家里的WiFi网速慢?
- XAML开发入门之创建XAML应用程序
- cesium采用primitive方式加载geojson数据
- 如何理解照片后期处理
- Eddy's爱好 HDU - 2204
热门文章
- Personal preference
- 成功解决sklearn\grid_search.py:42: DeprecationWarning: This module was deprecated in version 0.18 in fav
- twisted:基于python的twisted框架编写一个客户端和服务端的对话聊天空间
- BeautifulSoup 一行代码获取今日日期,与smtplib结合
- WRF用户手册翻译:Chapter 5: WRF Model
- TensorFlowIO操作(一)----线程和队列
- Centos-挂载和卸载分区-mount
- Classical Inheritance in JavaScript
- [痛并快乐着 国外开发者总结欧美游戏坑钱指南] 讀後感想
- 【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)