0x00 前言
邮件钓鱼通常出现在APT攻击里面,但是在日常生活中我们的邮箱也会经常出现一些钓鱼邮件,为了更好的了解原理,我在本地探索了一下宏上线钓鱼邮件,分享出来供师傅们交流。
0x01 原理初探
宏(Macro)是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列Word命令,可以实现任务执行的自动化,简化日常的工作。那么关于宏的安装和录制就不在这里详述了,我们再来把视线转向我们今天的主角——宏病毒
宏病毒是一种寄存在文档或模板的宏中的计算机病毒,存在于数据文件或模板中(字处理文档、数据表格、数据库、演示文档等),使用宏语言编写,利用宏语言的功能将自己寄生到其他数据文档
一旦打开带有宏病毒的文档,宏就会被执行,宏病毒就会被激活,转移到计算机上,驻留在Normal模板上。在此之后所有自动保存的文档都会“感染”上这种宏病毒,如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上
在Word和其他微软Office系列办公软件中,宏分为两种
内建宏:局部宏,位于文档中,对该文档有效,如文档打开(AutoOpen)、保存、打印、关闭等
全局宏:位于office模板中,为所有文档所共用,如打开Word程序(AutoExec)
宏病毒的传播路线如下:
单机:单个Office文档 => Office文档模板 => 多个Office文档(文档到模块感染)
网络:电子邮件居多
首先Office文档被感染病毒,当文档打开会执行自动宏,如果宏被执行,它会去检测当前模板是否被感染病毒,如果没有被感染,它会将释放自身的病毒代码。当模板被感染之后,系统中任何一个文档被打开,都会执行模板中的病毒,宏病毒进行传播
宏病毒的感染方案就是让宏在这两类文件之间互相感染,即数据文档、文档模板
宏病毒也可以通过网络进行传播,譬如电子邮件
0x02 宏病毒的实现
0x02.1 本地加载
用cs生成一个Office类型的后门
使用实现设置好的监听器
复制宏代码
新建一个word文档生成一个宏
找到project里面的Word对象,将代码粘贴
ctrl s保存,这里可以保存成.dotm或.docm都可以,这两个文件格式都是启用宏的Word格式
我这里生成一个.dotm模板文件
这里我假设已经将word发给了我要钓鱼的主机上,可以使用社工的方法使诱导被害者点击启用这个宏,具体方法我就不说了,师傅们自行拓展
点击过后发现已经上线了
看一下上线方式是调用了rundii32.exe这个dll
科普一下rundll32.exe如下:
rundll32的正常位置:c:windowssystem32
rundll32.exe是什么?顾名思义,“执行32位或者64位的DLL文件”。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有 Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。如果看到系统中有多个Rundll32.exe,不必惊慌,这证明用 Rundll32.exe启动了多少个的DLL文件。当然,这些Rundll32.exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。
对于Rundll32.exe这个文件,意思上边已经说过,功能就是以命令行的方式调用动态链接程序库。这里要注意一下。在来看看Rundll32.exe使用的函数原型:
代码语言:javascript复制Void CALLBACK FunctionName (
HWND hwnd,
HINSTANCE hinst,
LPTSTR lpCmdLine,
Int nCmdShow
);
其命令行下的使用方法为:Rundll32.exe DLLname,Functionname [Arguments]
DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;[Arguments]为引出函数的具体参数。
工作方式
Rundll 执行以下步骤:
1. 它分析命令行。
2. 它通过 LoadLibrary() 加载指定的 DLL。
3. 它通过 GetProcAddress() 获取 <entrypoint> 函数的地址。
4. 它调用 <entrypoint> 函数,并传递作为 <optional arguments> 的命令行尾。
5. 当 <entrypoint> 函数返回时,Rundll.exe 将卸载 DLL 并退出。
所以说rundll32在杀软里肯定是检测重点,因为他要调用dll,果不其然,被杀,所以我们光制作好钓鱼邮件是不够的,还要能够免杀,这个在下文会提到
0x02.2 远程加载
在word里新建一个模板
将模板另存为一个新的docx
把docx后缀名改为zip后缀
对zip进行解压得到以下几个文件
找到word路径下的_rels目录再找到settings.xml_rels这个文件
我这里用notepad 打开发现这里他是加载了一个远程的网站,因为他要加载模板就会访问远程
这里用github实现远程加载的作用,将之前生成好的.dotm或.docm文件上传到github
将链接复制并在后缀加上?raw=true放入xmlns里
再将这几个文件压缩成zip
改成docx后缀
此时钓鱼邮件就制作好了,这里又假设我已经开始钓鱼,被害人点开了这个文档,还是社工各种方式让被害人点击启用这个宏
回到cs发现已经上线
老生常谈的还是过不了杀软,因为我最近也在看杀软这一部分,其实免杀最好的方法就是自己的方法去免杀,而不是用网上的工具,因为你拿的网上的工具每个人都可以拿到,免杀效果很差。
但是这里我还没有到能够自己免杀的水平,所以这里先用一款工具进行免杀
0x03 免杀
免杀这里我选择了一款软件:EvilClippy
github链接如下:https://github.com/outflanknl/EvilClippy/releases/tag/v1.3
关于EvilClippy的介绍如下:
EvilClippy是一款专用于创建恶意MS Office测试文档的跨平台安全工具,它可以隐藏VBA宏和VBA代码,并且可以对宏代码进行混淆处理以增加宏分析工具的分析难度。当前版本的EvilClippy支持在Linux、macOS和Windows平台上运行,实现了跨平台特性。
关于EvilClippy的原理如下:
EvilClippy使用了OpenMCDF库来修改MS Office的CFBF文件,并利用了MS-OVBA规范和特性。该工具重用了部分Kavod.VBA.Compression代码来实现压缩算法,并且使用了Mono C#编译器实现了在Linux、macOS和Windows平台上的完美运行。
如果有vs环境的可以直接编译生成exe进行运行,命令如下:
代码语言:javascript复制csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs
我这里用的是在linux环境进行免杀,需要先安装mono环境,我这里是ubuntu系统,如果是kali或cent命令会不一样
代码语言:javascript复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
sudo apt-get update
sudo apt-get install mono-completesudo
apt-get install monodevelop
安装好了用mono -V验证一下
先对软件进行编译
代码语言:javascript复制mcs /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs
再查看下软件能否正常运行
代码语言:javascript复制mono EvilClippy.exe -h
然后进行免杀操作:
首先需要创建一个vba文件,后续需要进行混淆,vba内容如下
代码语言:javascript复制Sub Hello()
Dim X
X=MsgBox("Hello VBS")
科普一下vba文件:
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。 主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可说是一种应用程式视觉化的 Basic 脚本。 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 代码 这种特性很适合用于定向攻击,且不容易被发现。通过信息收集得知目标的 Office 版本,利用 VBA stomping 使宏被特定版本的 Office 打开时才会执行恶意行为宏代码,除此之外的 Office 版本打开时执行正常宏代码
再进行混淆操作
#先使用一个模块来设置随机模块名,混淆了一些分析工具,会生成一个以_EvilClippy.docm结尾的文件
代码语言:javascript复制mono EvilClippy.exe -r Doc1.docm
#其次使用之前设置的vba文件对生成文件进行伪装混淆
代码语言:javascript复制mono EvilClippy.exe -s 3.vba Doc1_EvilClippy.docm
成功后就会生成一个test_EvilClippy.dotm文件,这时候把文件拿去vt检测一下,免杀效果还是比之前强了很多
再放进火绒看一下,已经免杀
0x04 后记
我们知道宏加载使用的是rundll32,而rundll32在正常情况下启动的路径应该为:
代码语言:javascript复制c:windowssystem32
所以不是这个路径启动的一定不是计算机主动调用的,我用procexe64查看了一下这个dll启动的位置,如图所示,很明显不为c:windowssystem32
宏钓鱼有两个重点,一是怎样社工受害人点击启用宏这个选项,二是怎样躲避杀软的查杀。
目前杀软查杀 VBA 基本上都是静态查杀,所以静态免杀至关重要,从源头上讲 Word 是一个 zip 文件,解压之后的 vbaProject.bin 包含着要执行的宏信息,也是杀软的重点关注对象。
很多诱饵文档喜欢在 VBA 中启动脚本程序执行 ps 或者从网络上下载一段 shellcode 或恶意程序等等,这样非常容易被杀软的行为拦截拦住,同时沙箱可以根据进程链和流量判定该 word 文档是恶意的,安全分析人员可以轻易的通过监控进程树的方式观察恶意行为。