Drunkmars's Blog

cs加载宏上线初探

字数统计: 2.8k阅读时长: 10 min
2021/04/28 Share

邮件钓鱼通常出现在APT攻击里面,但是在日常生活中我们的邮箱也会经常出现一些钓鱼邮件,为了更好的了解原理,我在本地探索了一下宏上线钓鱼邮件,分享出来供师傅们交流。

原理初探

宏(Macro)是一种批量处理的称谓,是指能组织到一起作为独立的命令使用的一系列Word命令,可以实现任务执行的自动化,简化日常的工作。那么关于宏的安装和录制就不在这里详述了,我们再来把视线转向我们今天的主角——宏病毒

宏病毒是一种寄存在文档或模板的宏中的计算机病毒,存在于数据文件或模板中(字处理文档、数据表格、数据库、演示文档等),使用宏语言编写,利用宏语言的功能将自己寄生到其他数据文档

一旦打开带有宏病毒的文档,宏就会被执行,宏病毒就会被激活,转移到计算机上,驻留在Normal模板上。在此之后所有自动保存的文档都会“感染”上这种宏病毒,如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上

在Word和其他微软Office系列办公软件中,宏分为两种

内建宏:局部宏,位于文档中,对该文档有效,如文档打开(AutoOpen)、保存、打印、关闭等

全局宏:位于office模板中,为所有文档所共用,如打开Word程序(AutoExec)

宏病毒的传播路线如下:

单机:单个Office文档 => Office文档模板 => 多个Office文档(文档到模块感染)

网络:电子邮件居多

首先Office文档被感染病毒,当文档打开会执行自动宏,如果宏被执行,它会去检测当前模板是否被感染病毒,如果没有被感染,它会将释放自身的病毒代码。当模板被感染之后,系统中任何一个文档被打开,都会执行模板中的病毒,宏病毒进行传播

宏病毒的感染方案就是让宏在这两类文件之间互相感染,即数据文档、文档模板

宏病毒也可以通过网络进行传播,譬如电子邮件

宏病毒的实现

本地加载

用cs生成一个Office类型的后门

使用实现设置好的监听器

复制宏代码

新建一个word文档生成一个宏

找到project里面的Word对象,将代码粘贴

ctrl+s保存,这里可以保存成.dotm或.docm都可以,这两个文件格式都是启用宏的Word格式

我这里生成一个.dotm模板文件

这里我假设已经将word发给了我要钓鱼的主机上,可以使用社工的方法使诱导被害者点击启用这个宏,具体方法我就不说了,师傅们自行拓展

点击过后发现已经上线了

看一下上线方式是调用了rundii32.exe这个dll

科普一下rundll32.exe如下:

rundll32的正常位置:c:\\windows\\system32

rundll32.exe是什么?顾名思义,“执行32位或者64位的DLL文件”。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有 Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。如果看到系统中有多个Rundll32.exe,不必惊慌,这证明用Rundll32.exe启动了多少个的DLL文件。当然,这些Rundll32.exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。

对于Rundll32.exe这个文件,意思上边已经说过,功能就是以命令行的方式调用动态链接程序库。这里要注意一下。在来看看Rundll32.exe使用的函数原型:

1
2
3
4
5
6
7
8
9
10
11
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() 获取 函数的地址。

  4. 它调用 <entrypoint> 函数,并传递作为 的命令行尾。

  5. <entrypoint> 函数返回时,Rundll.exe 将卸载 DLL 并退出。

所以说rundll32在杀软里肯定是检测重点,因为他要调用dll,果不其然,被杀,所以我们光制作好钓鱼邮件是不够的,还要能够免杀,这个在下文会提到

远程加载

在word里新建一个模板

将模板另存为一个新的docx

把docx后缀名改为zip后缀

对zip进行解压得到以下几个文件

找到word路径下的_rels目录再找到settings.xml_rels这个文件

我这里用notepad++打开发现这里他是加载了一个远程的网站,因为他要加载模板就会访问远程

这里用github实现远程加载的作用,将之前生成好的.dotm或.docm文件上传到github

将链接复制并在后缀加上?raw=true放入xmlns里

再将这几个文件压缩成zip

改成docx后缀

此时钓鱼邮件就制作好了,这里又假设我已经开始钓鱼,被害人点开了这个文档,还是社工各种方式让被害人点击启用这个宏

回到cs发现已经上线

老生常谈的还是过不了杀软,因为我最近也在看杀软这一部分,其实免杀最好的方法就是自己的方法去免杀,而不是用网上的工具,因为你拿的网上的工具每个人都可以拿到,免杀效果很差。

但是这里我还没有到能够自己免杀的水平,所以这里先用一款工具进行免杀

免杀

免杀这里我选择了一款软件: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进行运行,命令如下:

1
csc /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe \*.cs

我这里用的是在linux环境进行免杀,需要先安装mono环境,我这里是ubuntu系统,如果是kali或cent命令会不一样

1
2
3
4
5
6
7
8
9
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验证一下

先对软件进行编译

1
mcs /reference:OpenMcdf.dll,System.IO.Compression.FileSystem.dll /out:EvilClippy.exe *.cs

再查看下软件能否正常运行

1
mono EvilClippy.exe -h

然后进行免杀操作:

首先需要创建一个vba文件,后续需要进行混淆,vba内容如下

1
2
3
4
5
Sub Hello()

Dim X

X=MsgBox("Hello VBS")

科普一下vba文件:

1
2
3
4
5
6
7

VBA(Visual Basic for Applications)是Visual
Basic的一种宏语言,是在其[桌面应用程序](https://baike.baidu.com/item/%E6%A1%8C%E9%9D%A2%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F/2331979)中执行通用的自动化(OLE)任务的编程语言。


主要能用来扩展[Windows](https://baike.baidu.com/item/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 版本打开时执行正常宏代码

再进行混淆操作

1
2
3
4
5
6
7
#先使用一个模块来设置随机模块名,混淆了一些分析工具,会生成一个以_EvilClippy.docm结尾的文件

mono EvilClippy.exe -r Doc1.docm

#其次使用之前设置的vba文件对生成文件进行伪装混淆

mono EvilClippy.exe -s 3.vba Doc1_EvilClippy.docm

成功后就会生成一个test_EvilClippy.dotm文件,这时候把文件拿去vt检测一下,免杀效果还是比之前强了很多

再放进火绒看一下,已经免杀

后记

我们知道宏加载使用的是rundll32,而rundll32在正常情况下启动的路径应该为:c:\windows\system32

所以不是这个路径启动的一定不是计算机主动调用的,我用procexe64查看了一下这个dll启动的位置,如图所示,很明显不为c:\windows\system32

宏钓鱼有两个重点,一是怎样社工受害人点击启用宏这个选项,二是怎样躲避杀软的查杀。

目前杀软查杀 VBA 基本上都是静态查杀,所以静态免杀至关重要,从源头上讲 Word 是一个 zip 文件,解压之后的 vbaProject.bin 包含着要执行的宏信息,也是杀软的重点关注对象。

很多诱饵文档喜欢在 VBA 中启动脚本程序执行 ps 或者从网络上下载一段 shellcode 或恶意程序等等,这样非常容易被杀软的行为拦截拦住,同时沙箱可以根据进程链和流量判定该 word 文档是恶意的,安全分析人员可以轻易的通过监控进程树的方式观察恶意行为。

CATALOG
  1. 1. 原理初探
  2. 2. 宏病毒的实现
    1. 2.1. 本地加载
    2. 2.2. 远程加载
  3. 3. 免杀
  4. 4. 后记