红队 | CS加载宏上线初探

2021-05-14 15:26:06 浏览数 (1)

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 文档是恶意的,安全分析人员可以轻易的通过监控进程树的方式观察恶意行为。

0 人点赞