特殊恶意软件JsOutProx问世,或能绕过SymantecVIP验证 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

特殊恶意软件JsOutProx问世,或能绕过SymantecVIP验证

Change 恶意软件 2020-01-10 10:38:00
收藏

导语:Yoroi安全团队近期检测到了一类新型恶意软件,它具有复杂的混淆和反逆向技术,让研究人员在分析时遭遇了许多困难,且似乎与当前的主流恶意软件都无关联,于是研究人员决定对其深入研究。

Yoroi安全团队近期检测到了一类新型恶意软件,它具有复杂的混淆和反逆向技术,让研究人员在分析时遭遇了许多困难,且似乎与当前的主流恶意软件都无关联,于是研究人员决定对其深入研究。

技术分析

image.png

表1.样本信息

初始感染文件是一个又一万多行高度混淆的代码的Javascript文件。文件的第一行嵌入了一个由Base64编码的元素组成的大型数组,对它原始解码后产生的数据无法理解,证明了还有更复杂的保护层。

1.PNG

图1.具有Base64编码元素的数组

浏览代码时,我们注意到一些疑似初始化的指令。函数“ t_ey”是“ t_ep”数组中字符块的去混淆函数,使我们能够恢复一些明文。

对代码初步整理后,我们发现了一些值得注意的信息,例如在恶意软件执行阶段初始化的静态配置,以及远程C2地址91.189.180.199(该地址在挪威服务器供应商“ ServeTheWorld”的名下),代码中还有一个名为“ JsOutProx”的特殊标签。

2.png

图2.恶意软件的一些基础信息

继续分析代码,我们重构了攻击者用来混淆负载的方法:所有必要的信息都经过了加密、拆分,然后以Base64块的形式编码,并存储在不同的结构中,这些结构分别称为“ta”、“t_ep”、“t_eq”。

 3.PNG

图3.包含Base64数据的结构

通过解码例程“t_ey”,能在运行时检索明文代码,进而使恶意软件的结构具体化,恶意软件的结构存储在“t_fT”对象中,如下图所示。

 4.PNG

图4.恶意软件的核心结构

结构里包含了恶意软件的对象和函数。很多时候对象之间都有命名对应关系,例如“Outlook”和“OutlookPlugin”,或者“Proxy”和“ProxyPlugin”。这表明该恶意软件具有一个模块化的结构,其中包含能够执行各种操作的特定插件,通过填充关联对象来窃取数据。例如,“OutlookPlugin”填充“Outlook”对象后就能窃取关于电子邮件和联系人的信息。

每个插件都嵌入了一个名为“ receive”的混淆函数用于执行特定的操作。该函数名称是常量,表示恶意软件模块之间的一种通用接口。

 5.png

图5.将“ receive”函数转换为“ InfoPlugin”

检入和命令列表

一旦创建了主结构,恶意软件运行的第一个函数就是“init”。它的设计目的是为受感染计算机创建一个标识字符串,并将标识字符串存储到“t_fT[" ID "] "变量中。

如下图所示,标识字符串是由计算机名、用户名和操作系统版本组成,后接一个后缀,其中包含恶意软件正在执行的当前操作。在本例中是“ ping”,一种确保命令和控制服务已启动并正在运行的心跳机制。 6.png

图6.创建受害者ID

然后恶意软件不断循环,在循环中每5秒调用一次“ receive”函数。“ receive”函数本质上来说是一个能让攻击者与恶意软件交互的接口。

恶意软件连接到C2并检索字符串,字符串指示了下一个要执行的命令进入“np[0x0]”变量。恶意软件有许多功能,能够处理一个完整的感染生命周期,可以更新、重启,或是执行另一段JavaScript代码、其他VB脚本,以及删除自身痕迹。

 7.PNG

图7.支持命令

综上所述,分析样本支持以下操作:

image.png

表2.支持的命令

此外,主循环结构默认包括一系列IF-Else,用于计算接收到的字符串并检查特定的前缀。每个前缀都与一个插件模块相关联。

 8.PNG

图8.调用插件

分析选择链可以重建此样本完整的支持插件列表。

image.png

表3.恶意软件支持插件

现在,我们把注意力转移到函数和插件的功能及工作机制上,并简要介绍其中最值得注意的一些:

持久性

顺便说一下,为了确保重启后仍然存在,恶意软件将初始JS脚本的副本写入“%appdata%”和“%temp%”文件夹,通过流行的“HKCU\Software\Microsoft\Windows\CurrentVersion\Run”注册表项设置系统的持久性。

 9.PNG

图9.设置持久性

插件模块

从插件数量上可以看出这个恶意软件是相当成熟且危险的。有些插件对某些RAT和间谍软件的标准功能重新进行了编码,包括一些不常见的功能。

· “Process”插件

ProcessPlugin能够操作系统中运行的其他进程,既可以按PID和名称杀死进程,也可以通过WSH或WMI创建新进程,还可以收集特定进程的内存转储。这项功能对常规的恶意软件而言并不常见。它的存在可能表明幕后的运营人员会对受害者环境作分析,通过内存抓取来窃取数据。

 10.PNG

图10.ProcessPlugin的部分代码

· “Dns”插件

DnsPlugin处理机器的DNS配置。它可以向C2发送当前配置并设置新配置,如下图所示。

 11.PNG

图11.DnsPlugin的部分代码

· “Token”插件和SymantecVIP对象

这个插件很有趣,从名字来看是窃取令牌,但它是专门为盗窃SymantecVIP一次性密码而设计的。SymantecVIP是赛门铁克团队开发的一种多因素身份验证技术,许多公司都有采用他家的服务。

 12.PNG

图12. TokenPlugin的部分代码的

· “ Outlook”插件

OutlookPlugin将植入程序武器化。它具备常见的信息窃取功能,使攻击者能够收集账户信息和联系人列表。

此插件是嵌入在恶意软件中的唯一一个信息窃取插件。

商品恶意软件中,通常能支持对多个电子邮件客户端、Web浏览器和ftp客户端的窃取工作,但此恶意软件仅能处理Outlook,而Outlook正是大多数企业环境中使用的标准电子邮件客户端。

 13.PNG

图13.部分OutlookPlugin代码

· “Prompt”插件

PromptPlugin提供了另一项有趣的功能,它使攻击者能够通过C2向受害者显示自定义消息提示。

 14.png

图14. PromptPlugin部分代码

JS和.NET之间的桥梁

所有的JavaScript插件似乎只是攻击者用来与恶意软件通信的高级接口。深入研究代码搜索插件的实现时,我们遇到了另一个名为“ DotUtil”的神秘组件,该组件似乎是JavaScript接口与实际操作实现之间的链接。

同样,在挖掘JS代码时,我们发现了一种称为“ hasDotnet”的方法,让我们怀疑是否存在其他.NET部件,用以掩盖上述某些功能的实现。此外,此方法包含对“ DotUtil”模块实例下载和内存加载的引用。

 15.PNG

图15. DotUtil模块的一部分

通过动态分析恶意软件,我们拦截名为“ libDotJs.dll”的.NET DLL的下载。分析后发现在它实现的函数和到“DotUtil”组件中声明函数之间存在一个完整的映射。

16.png

图16. DotUtil和.NET DLL之间的映射

从更广的角度来看,我们可以断言植入程序至少有两个不同的层:JavaScript接口作为第一阶段传递到目标机器,并不断进行更改以降低其可检测性,从而提供了核心机制以确保对目标计算机的灵活访问,以及利用.NET依赖项的高级功能层。

 17.png

图17.恶意软件的宏观透视

结论

以JsOutProx的复杂性和工程级别来看,在当今恶意软件世界中算是比较特殊的。它是一个具有特殊远程访问功能的工具箱。从架构的角度来看,JsOutProx包含了核心引擎内的所有函数原型,并且可以在运行时进行远程扩展。

JsOutProx的功能实现则通过对“ dotUtil”类(NET插件的加载程序)实现的共享接口与JavaScript内核分离。这些类通过序列化远程提供,这种解耦提供了可延展的模块化实现,使恶意软件背后的运营人员能够进行通用的代码管理。另外JsOutProxy还有处理SymantecVIP技术的功能,我们推测此举是应对高价值的企业目标。

JsOutProx于今年12月首次出现,目前可能处于开发阶段,Cybaze-Yoroi Zlab将保持持续关注。

IOC

Hashes:

6bf0d9a7ca91f27a708c793832b0c7b6e3bc4c3b511e8b30e3d1ca2e3e2b90a7

af10e6d1e3a3b4ed1d5524da25b782a4deddbd14d04e259f13dd1502d43b3045

C2:

91.189.180.199:9989

Yara Rules

rule JsOutProx_Dec_2019{
meta:
   description = "Yara Rule for JsOutProx"
   author = "Cybaze Zlab_Yoroi"
   last_updated = "2019-12-19"
   tlp = "white"
   category = "informational"
 
strings:
     $re1 = /,'([0-9a-zA-Z])+=',/
 $re2 = /[a-zA-Z]{1}_[a-zA-Z]{2}\[0x/
     $a1 = "WScript"
 $a2 = "0x"
    condition:
     $re1 and $a1 and #a2>20000 and #re2>1000
}
本文翻译自:https://blog.yoroi.company/research/unveiling-jsoutprox-a-new-enterprise-grade-implant/如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论