使用YARA规则进行威胁狩猎

YARA (yet another regex alternative) 是一种具有多种用途的模式匹配工具,在恶意软件分析和报警中有广泛的应用。框架本身很简单,相对容易理解(特别是基本字符串匹配方面),而且非常灵活。然而,在应用到非常具体的恶意软件示例之后,YARA通常仅限于签名式使用。虽然这本身并不是一个“坏”的用途,但人为地限制了安全研究人员在环境中进行和捕获的内容。

​ 在典型应用中,YARA被用作另一种基于签名的恶意软件检测方法。在由Christopher Culling撰写的SANS论文中可以找到YARA的优秀概述。 在去年年底围绕TRISIS/TRITON 恶意软件的激烈讨论是一个更具体的例子。当时,FireEye研究员尼克·卡尔(Nick Carr)发布了YARA规则,并强调它在几个月内没有发现误报。 从针对特定威胁的集中检测的角度来看,这是一个非常有效的,高度针对性的规则,用于捕获在特定的攻击中观察到的非常具体的恶意软件实例。 然而,在这种检测过程中,由于规则本身受限,仅能捕获TRISIS事件中观察到的恶意软件的特定实例 ,在这种情况下,针对有一些变化的类似软件会有大量漏报。用Matthew Dunwoody和Daniel Bohannon所描述的概念来解释 :签名是有效的,但不一定是“有弹性”。 因此,所应用的检测方法对于特定事件非常有效,但可能对变化的攻击无效。 本质上,仅为观察到的安全系统攻击框架的实现创建规则。

​ 另一种观点认为,YARA和现在的反病毒产品中的恶意软件检测是重复的 。 考虑到YARA在许多情况下的应用,这种立场是可以理解的,但大大低估了YARA在检测和警报方面的多功能性。 当以“传统”方式应用时,对传统防病毒来说,YARA只是代表了开源,灵活的竞争者。 虽然这是有用的,但最终的功能和限制仍然是相同。

​ 上述两种观点对YARA的理解都是片面的。 YARA当然可以用于针对确切的恶意软件类型,家族甚至样本进行非常具体的检测,但这样做完全忽略了YARA的灵活性,可以检测文件中的可疑(如果不是彻头彻尾的恶意)功能。从狩猎的角度来看,我们作为防御者不希望追求明确知道的恶意软件,可能其他安全控制已经处理过这些恶意软件(例如商业防病毒)。 相反,威胁搜寻应该通过搜索找出进一步研究和分析的潜在攻击来寻找可能的恶意活动的迹象。 从YARA的角度来看,这意味着不会寻找确切的恶意软件签名,而是在文件中检测可能的恶意活动。

为了举例说明我用YARA进行威胁狩猎,请遵循以下非常简单的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rule odd_creation_date
{
meta:
description = "Identifying times either in the distant past or future for alerting."
author = "Joe Slowik, Dragos Inc"
condition:
pe.timestamp > time.now() or pe.timestamp < 946684800
}

以上规则是查找具有特定编译时间戳的可移植可执行文件。 就其本身而言,这是一个可疑的检测点 ,但不一定是恶意的。 但作为与上下文信息配对的检测点,这个非常简单的规则可以变得非常强大:例如,在监视环境中对“新”二进制文件的过滤器进行配对或作为搜索应用时,或从未知或者之前没有见过的网站下载二进制文件。

稍微复杂一点,以下是程序化混淆或打包的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rule suspicious_pe_entropy
{
meta:
description = "Identify PE sections with high levels of entropy indicating encoding."
author = "Joe Slowik, Dragos Inc."
condition:
uint16(0) == 0x5a4d and pe.number_of_sections > 2 and
for any i in (0..pe.number_of_sections -1): (
math.entropy(pe.sections[i].raw_data_offset,
pe.sections[i].raw_data_size) >= 7.4)
}
在这种情况下,查看PE部分熵来识别混淆或打包的代理,规则迭代每个部分以确定是否满足阈值。一些合法的软件为了防止逆向工程或是竞争对手分析,具有这些方面,但这可作为与其他方面相结合的指标,上述内容可以作为狩猎(或监控)初始输入,以识别新的,尚未知晓的恶意活动。 

最后,通常利用文档文件格式来传递恶意payload。虽然宏很流行,但嵌入式ActiveX对象(如Flash对象或PE文件)可以类似地用于启动利用和渗透。

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
rule embedded_activex
{
meta:
Description = "Rule to identify embedded ActiveX objects in Documents."
Author = "Joe Slowik, Dragos Inc."
strings:
$header1 = { D0 CF 11 E0 }
$header2 = { 50 4B 03 04 }
$flashHeader1 = { 46 57 53 }
$flashHeader2 = { 43 57 53 }
$mzHeader = {4d 5a }
$wmfExtension = ".wmf" nocase ascii wide
$activex = "word/activex/activex" nocase wide ascii
$activex_reg = /word\/activeX\/activeX[1-9]\.bin/ nocase wide ascii
$active = "active" nocase ascii wide
condition:
1 of ($header*) and (#activex > 0) and (1 of ($flashHeader*) or $mzHeader or $wmfExtension) and #active < 170 and $activex_reg
}

同样,此规则将捕获“合法”项目 - 但与其他观察结果配合并实施为狩猎(如果不是警报)技术,可用于识别躲避传统控制的恶意文档文件。

上面的例子有两个互补的想法:首先,YARA可以用来寻找可疑行为的指标;第二,YARA不必局限于已知恶意活动的确切签名。

结果是YARA签名在某种程度上是“模糊的”:就他们自己而言,它们可能意义不大(并且可能导致大量误报,这取决于环境 - 所以不要在隔离中使用这些项目)。 但是,与其他丰富的数据点或分析相结合,这样的YARA检测可以变得非常有效,作为新的,而不是之前观察到的恶意活动的领先指标。

然而,还有第三个案例利用YARA进行狩猎,这利用了人类的弱点和懒惰。 在这种情况下,攻击者 - 甚至是高级攻击者 - 都是人类,并且易于或需要重用以前操作中的环境,开发材料和代码库。 正如我的前同事Micah Yates, 在2017年ReCon的 APT3/Pirpi talk 演讲中详细介绍的那样,“高级”对手在近10年的时间里使用了几乎相同的功能来应对多种恶意软件变种。 结果:寻找攻击者可以利用“常见”功能的独特实现(例如套接字创建或数据擦除)来检测未来其他安全解决方案无法检测到的变体。 例如,与CRASHOVERRIDE / INDUSTROYER中的“wiper”功能相关联的注册表操作项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
rule crashoverride_wiperModuleRegistry
{
meta:
description = "Registry Wiper functionality assoicated with CRASHOVERRIDE"
author = "Joe Slowik, Dragos Inc"
strings:
$s0 = { 8d 85 a0 ?? ?? ?? 46 50 8d 85 a0 ?? ?? ?? 68 68 0d ?? ?? 50 }
$s1 = { 6a 02 68 78 0b ?? ?? 6a 02 50 68 b4 0d ?? ?? ff b5 98 ?? ?? ?? ff 15 04 ?? ?? ?? }
$s2 = { 68 00 02 00 00 8d 85 a0 ?? ?? ?? 50 56 ff b5 9c ?? ?? ?? ff 15 00 ?? ?? ?? 85 c0 }
condition:
uint16(0) == 0x5a4d and all of them
}

三个字节码元素上的这个非常小的签名将CRASHOVERRIDE抽头模块中的非常特定的功能归零。上述签名跟踪观察到的恶意软件实例和应用程序,但也通过关注恶意软件中部署的独特功能来寻求提供更长期的功能:将Windows系统服务值重新映射为null。 YARA背后的假设很简单:此功能可能会被相同(或类似)的攻击者重用,开发特定于功能的检测将捕获重用相同底层代码库和功能的新恶意软件类型。 虽然类似签名,但此规则旨在寻找可重复使用或类似地实现相同基础功能的其他案例或样本 - 从而创建比经典的,狭窄定制的签名更广泛的检测基础。 这次检测特别有趣的是,OlympicDestroyer恶意软件利用了一种技术,表面上与CRASHOVERRIDE的擦除功能非常相似:重新映射关键的Windows系统服务注册表值,以防止成功的功能重启。