RIG Exploit Kit使用PROPagate注入技术传播Monero Miner

导语:FireEye研究人员探讨了综合使用RIG EK与各种漏洞利用来攻击终端的技术,展示了NSIS Loader如何利用鲜为人知的PROPagate进程注入技术来规避安全产品。

一、介绍

通过FireEye动态威胁情报(DTI),我们观察到RIG漏洞利用工具包(EK)增添了一个新功能代码:使用PROPagate注入技术来注入、下载并执行Monero矿工(类似的活动已经被Trend Micro报告)。除了利用鲜为人知的注入技术之外,攻击链还有一些其他有趣的特色,我们将在文中谈到。

二、攻击链

攻击链始于用户访问受感染网站时,其iframe中将加载RIG EK登录页面。RIG EK使用各种技术来分发NSIS(Nullsoft脚本安装系统)Loader,该Loader利用PROPagate注入技术将shellcode注入explorer.exe。shellcode执行下一个有效载荷,下载并执行Monero矿工。攻击链的流程图如图1所示。

图1:攻击链流程图

三、Exploit Kit 分析

当用户访问使用iframe注入的受感染站点时,iframe会加载登陆页。图2显示了注入受感染网站的iframe。

图2:注入的iframe

登陆页面包含三个不同的JavaScript代码片段,每个片段使用不同的技术来分发有效载荷。这些都不是新技术,所以我们只会简要介绍一下。

1. JavaScript 1

第一个JavaScript有一个函数fa,它返回一个将使用execScript函数执行的VBScript,如图3中的代码所示。

图3:JavaScript 1代码片段

VBScript利用CVE-2016-0189,下载有效载荷并使用图4中所示的代码片段执行。

图4:VBScript代码片段

2. JavaScript 2

第二个JavaScript包含一个函数,该函数将获取其他JavaScript代码,并使用图5中所示的代码片段将此脚本代码附加到HTML页面。

图5:JavaScript 2代码片段

新附加的JavaScript利用CVE-2015-2419,JSON.stringify中的漏洞。该脚本通过在图6所示的变量中存储漏洞利用部分,混淆对JSON.stringify的调用。

图6:使用变量进行混淆

使用这些变量,JavaScript会调用带有错误格式参数的JSON.stringify,触发CVE-2015-2419,从而导致本机代码执行,如图7所示。

图7:调用JSON.Stringify

3. JavaScript 3

第三个JavaScript包含添加其它JavaScript的代码,类似于第二个JavaScript。这个额外的JavaScript添加了一个利用CVE-2018-4878的Flash对象,如图8所示。

图8:JavaScript 3代码片段

一旦利用成功,shellcode会调用命令行来创建一个文件名为u32.tmp的JavaScript,如图9所示。

图9:WScript命令行

这个JavaScript文件是使用WScript启动的,它下载下一阶段有效载荷并使用图10中的命令行执行它。

图10:恶意命令行

四、Payload分析

在本次攻击行动中,攻击者使用了多种有效载荷和反分析技术来绕过分析环境。图11显示了完整的恶意软件活动流程图。

图11:恶意软件活动流程图

1.NSIS Loader (SmokeLoader)分析

RIG EK下载的第一个有效载荷是一个名为SmokeLoader的已编译的NSIS可执行文件。除了NSIS文件之外,有效载荷还有两个组件:DLL和数据文件(在我们的分析案例中名为'kumar.dll'和'abaram.dat')。该DLL有一个由NSIS可执行文件调用的导出函数。该导出函数具有读取和解密数据文件的代码,数据文件生成第二阶段有效载荷(可移植的可执行文件)。

之后,DLL在SUSPENDED_MODE中下自我复制(dropper),并使用进程挖空注入解密的PE。

2.注入代码分析(第二阶段Payload)

第二阶段的有效载荷是一个高度混淆的可执行文件。它由解密、执行、重新加密的例程组成。

在入口点,可执行文件包含检查操作系统主要版本代码,主版本从Process Environment Block(PEB)中提取。如果操作系统版本值小于6(在Windows Vista之前),则可执行文件自行终止。它还包含检查可执行文件是否处于调试模式的代码,调试模式从PEB的偏移0x2中提取。如果设置了BeingDebugged标志,则可执行文件会自行终止。

恶意软件还通过打开注册表项HKLM\SYSTEM\ControlSet001\Services\Disk\Enumwith(值为0)来实施Anti-VM检查。

它检查注册表值数据是否包含这些字符串:vmware,virtual,qemu或xen。这些字符串中的每一个都代表虚拟机。

运行反分析和环境检查后,恶意软件执行核心代码开始恶意活动。

恶意软件使用PROPagate注入技术在目标进程中注入和执行代码。PROPagate注入技术类似于SetWindowLong。在该技术中,恶意软件使用SetPropA函数修改UxSubclassInfo的回调并导致远程进程执行恶意代码。

此代码注入技术仅适用于完整性级别较低或相同的进程。恶意软件首先检查当前正在运行的进程的完整性是否为中等完整性级别(2000,SECURITY_MANDATORY_MEDIUM_RID)。图12显示了代码片段。

图12:检查当前进程的完整性级别

如果进程高于中等完整性级别,则恶意软件会继续进行。如果该进程低于中等完整性级别,则恶意软件将以中等完整性重新生成自身。

恶意软件创建文件映射对象并将dropper文件路径写入其中,并通过注入的代码访问相同的映射对象,来读取dropper文件路径并删除dropper文件。映射对象的名称源自系统驱动器的卷序列号和带有硬编码值的XOR操作(图13)。

File Mapping Object Name = “Volume Serial Number” + “Volume Serial Number” XOR 0x7E766791

图13:创建文件映射对象名称

然后,恶意软件使用异或解密第三阶段有效载荷,并使用RTLDecompressBuffer对其进行解压缩。第三阶段有效载荷也是一个PE可执行文件,但作者修改了该文件的头部以避免在内存扫描中将其检测为PE文件。数据解密后,修改几个头字段后,可以得到正确的可执行头(图14)。

图14:没有头部(左)和有头部(右)的可执行文件

解密有效载荷后,恶意软件将攻击注入的shell进程explorer.exe。它使用GetShellWindow和GetWindowThreadProcessId API来获取shell窗口的线程ID(图15)。

图15:获取shell窗口线程ID

恶意软件将解密的PE注入并映射到远程进程(explorer.exe)中。它还会注入shellcode,用于在SetPropA中配置回调函数。

在将有效载荷注入到目标进程之后,使用EnumChild和EnumProps函数来枚举shell窗口的属性列表中的所有条目,并将其与UxSubclassInfo比较。

找到shell窗口的UxSubclassInfo属性后,保存句柄信息并通过SetPropA使用它设置回调函数。

SetPropA有三个参数,其中第三个是数据。回调过程地址存储在从数据开始的偏移量0x14处。恶意软件将回调地址修改为注入的shellcode地址(图16)。

图16:修改回调函数

然后,恶意软件将特定消息发送到窗口以执行与UxSubclassInfo属性相对应的回调过程,这样shellcode就会执行。

shellcode包含使用CreateThread执行注入的第三阶段有效载荷入口点地址的代码。然后它重置SetPropA的回调,该回调在PROPagate注入期间被恶意软件修改。图17显示了注入shellcode的代码片段。

图17:注入shellcode的汇编视图

3.第三阶段Payload分析

在执行之前,恶意代码会进行反分析检查以确保系统中没有运行分析工具。它创建两个无限运行的线程,其中包含用于实施反分析检查的代码。

第一个线程使用CreateToolhelp32Snapshot枚举进程并检查通常用于分析的进程名称。它使用自定义操作从进程名称生成DWORD哈希值,并将其与硬编码的DWORD值数组进行比较。如果生成的值与数组中的任一值匹配,则会终止相应的进程。

第二个线程使用EnumWindows枚举窗口。它使用GetClassNameA函数来提取与相应窗口关联的类名称。像第一个线程一样,它使用自定义操作从类名生成DWORD哈希值,并将其与硬编码的DWORD数组进行比较。如果生成的值与数组中的任何值匹配,则会终止与相应窗口相关的过程。

除了这两种反分析技术之外,它还通过访问URL:www.msftncsi[.]com/ncsi.txt检查网络连接。

为了在系统中保持持久性,恶意软件会在%startup%文件夹中安装计划任务和快捷方式文件。计划任务命名为“Opera Scheduled Autoupdate {GetTickCount()的十进制值}”。

然后与恶意URL进行通信以下载最终的有效载荷,这是一个Monero矿工。它使用来自计算机名称和卷信息的Microsoft CryptoAPI创建MD5哈希值,并在POST请求中将哈希值发送到服务器。图18显示了网络通信。

图18:网络通信

最后恶意软件从服务器下载最终的有效载荷——Monero矿工,并将其安装在系统中。

五、总结

虽然我们观察到Exploit Kit活动一直在减少,但攻击者并未完全放弃它们。在这篇博文中,我们探讨了综合使用RIG EK与各种漏洞利用来攻击终端。此外,我们还展示了NSIS Loader如何利用鲜为人知的PROPagate进程注入技术,规避安全产品。

Exploit Kit——hacker入侵web,某iframe中将加载RIG EK登录页面,最终下载并执行Monero矿工的更多相关文章

  1. iframe异步加载技术及性能

    我们会经常使用iframes来加载第三方的内容.广告或者插件.使用iframe是因为它可以和主页面并行加载,不会阻塞主页面.当然使用iframe也是有利有弊的:Steve Souders在他的blog ...

  2. 判断 iframe 是否加载完成的完美方法

    一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:var iframe = document.createElement(" ...

  3. Js控制iFrame切换加载网址

    <html> <head> <title>Js控制 iFrame 切换加载网址</title> </head> <body> & ...

  4. ExtJs非Iframe框架加载页面实现

    在用Ext开发App应用时,一般的框架都是左边为菜单栏,中间为tab页方式的显示区域.而tab页面大多采用的嵌入一个iframe来显示内容.但是采用iframe方式有一个很大的弊端就是每次在加载一个新 ...

  5. 兼容:判断 iframe 是否加载完成

    判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似 var iframe = document.createElement("iframe ...

  6. 用JS实现判断iframe是否加载完成

    本文出至:新太潮流网络博客 var iframe = document.createElement("iframe"); iframe.src = "blog.iinu. ...

  7. js下判断 iframe 是否加载完成的完美方法

    一般来说,我们判断 iframe 是否加载完成其实与 判断JavaScript 文件是否加载完成.     采用的方法很类似: var iframe = document.createElement( ...

  8. java web eclipse中项目的加载过程

    java web eclipse中项目的加载过程: Tomcat默认从WEB-INF/目录下加载资源,Eclipse在发布程序的时候,并没有把User Libraries的相关资源拷贝到WEB-INF ...

  9. js 判断iframe是否加载完毕

      js 判断iframe是否加载完毕 CreationTime--2018年9月13日15点30分 Author:Marydon 1.javascript实现 window.onload = fun ...

随机推荐

  1. [BZOJ2186]沙拉公主的困惑

    [BZOJ2186]沙拉公主的困惑 题面 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定 ...

  2. kubernetes 中遇见的一些坑(持续更新)

    一.官网镜像无法下载 解决方法:需要翻墙 配置docker翻墙机: cat /usr/lib/systemd/system/docker.service   [Service] Environment ...

  3. SQL和PL/SQL的区别

    SQL和PL/SQL的区别 1. SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一 ...

  4. 数据库连接池, websocket

    转自: https://www.cnblogs.com/xiao987334176/p/9605536.html 一.DButils 什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它 ...

  5. Atlassian JIRA 插件开发之一 环境搭建

    参考 https://developer.atlassian.com/server/framework/atlassian-sdk/  download the SDK 说明 Download the ...

  6. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  7. Docker的安装与使用

    Docker的安装 (1)卸载老版本yum remove docker \                  docker-client \                  docker-clien ...

  8. golang socket与Linux socket比较分析

    在posix标准推出后,socket在各大主流OS平台上都得到了很好的支持.而Golang是自带runtime的跨平台编程语言,Go中提供给开发者的socket API是建立在操作系统原生socket ...

  9. golang基础语法

    golang语言的常量定义: const  filename="abc.txt"; const filename String="abc.txt" golang ...

  10. python 搭建 websocket server 发送 sensor 数据

    搞了几天,顺便把代码贴这里,需要的 python 包: gevent,gevent-websocket,bottle,wiringpi-python 简单说明: - gevent 提供了支持 conc ...