概述
本文主要介绍了如何使用YARA规则来寻找DoppelPaymer、BitPaymer和Dridex加载程序等恶意软件家族。
前言
无论是寻找恶意软件,还是发现用于威胁情报的APT,每当我们讨论到如何主动发现想要寻找的恶意软件时,都会联想到YARA这把“瑞士军刀”。借助YARA规则,往往会使恶意软件研究人员和威胁情报分析的工作更加轻松。
对于恶意软件开发人员来说,其工作过程就像是合法软件的开发人员,他们往往希望能提升工作自动化的程度,并尽可能减少在重复性工作中浪费的时间。这也就意味着,恶意软件开发者会学习其他恶意软件的代码,编写通用代码并在不同的恶意软件中重复使用。这样的方式,不仅能减少恶意软件作者开发所需的时间,也为安全研究人员提供了一个有力的线索。我们可以尝试创建搜索规则来检测这种代码重用的情况,从而降低研究所需花费的时间成本。在这篇文章中,我们详细说明如何为Dridex恶意软件家族中的三个恶意软件变种编写YARA规则,这三个恶意软件变种分别是:
1、Everis勒索事件中使用的BitPaymer勒索软件(称为“wp_encrypt”);
2、PEMEX勒索事件中使用的DoppelPaymer勒索软件;
3、Dridex加载程序(称为“ldr”),僵尸网络ID 23005。
简而言之,我们的目标是利用代码重用对应的YARA规则,而不是依赖于容易被攻击者轻松篡改的字符串规则来寻找相同恶意软件开发人员开发的代码。
最开始,YARA规则的主要目的是对恶意软件样本进行分类和识别。这是一种非常简单的基于Ruby语言的语法,用于描述各种模式。
YARA的最新版本是3.11.0。YARA是一个基于签名的工具,具有支持各种编程语言的多种命令行界面。换而言之,YARA与用于检测恶意文件的静态反病毒签名相类似。
YARA的主要功能是扫描文件夹中的文件,并扫描缓冲区中的模式。有许多工具都依赖于YARA,例如yarashop。
对我们而言,使用YARA的最常见场景,就是根据代码和字符串重用,对想要深入调查的恶意软件样本进行扫描、分类和识别。
典型的YARA语法示例如下:
import <module> <rule type> rule <rule name> : <tags> { meta: <name> = "<value>" ... strings: $<string name> = <value> <modifiers> ... condition: <some condition> }
我们尝试为Zero2Hero编写YARA规则:
/* We practice writing YARA rules for Zero2Hero */ import "pe" rule zero2hero_course : best { meta: // Comment description = "This is an example rule to demonstrate typical syntax" reference = "https://www.sentinelone.com/lp/zero2hero" author = "@VK_Intel" tlp = "white" strings: $hero = "helloworld" xor wide $unique_function = { ?? ?? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? } condition: uint16(0) == 0x5A4D and pe.exports("CryptEncrypt") and all of them }
其后面的修饰符(modifiers),有如下几个选项:
· global:在任何后续规则之前匹配;
· private:创建其他规则;
· none:除非使用global,否则匹配。
可以使用的标签(tag)如下:
· strings:正则表达式,文本或十六进制;
· string modifiers:wide、ascii、xor、fullword、nocase。
可以使用的条件(condition)如下:
· 布尔表达式;
· 内置、外部、模块变量、函数。
YARA字符串&发现代码重用的过程
用于寻找恶意软件的YARA规则与用于检测恶意软件的YARA规则相比是存在一些区别的。在本章的研究中,我们会生成一些条件更为宽松的YARA规则,以用于发现威胁,尝试捕获到新的变种(其中也可能会包含一些误报)。在其他一些场景中,我们可能会希望在特定的检测机制中,或针对特定的恶意软件,使用更为严格的YARA规则。
总体来说,YARA规则的效果是由生成YARA规则的数据源质量来决定的。反病毒研究人员和恶意软件研究人员需要依赖于大量已知样本(包括合法样本、恶意样本)的数据集来生成最具保真度的规则,考虑到单一某位研究人员的视野有限,通常很难预测YARA规则的性能。
有关YARA规则的一些恶意/合法数据来源,可以参考VirusTotal、Hybrid-Analysis、VirusBay、Malpedia、Microsoft和VirusShare。Florian Roth开发的工具yarGen中还包括一些必要的字符串和操作码数据集,以用于YARA性能检查。用于YARA规则管理的另一个出色工具,是由卡巴斯基开发的KLara工具。
要想设计出成功的YARA规则,需要将基于字符串的检测与基于代码的检测相结合。我们认为,要生成有效的YARA规则的,其关键在于选用简单而清晰的规则集,并综合考虑上述二者。我强烈推荐大家观看Jay Rosenberg在2019年Confidence Conference上的演讲,其主题是“利用YARA检测不断发展的恶意软件”(Utilizing YARA to Find Evolving Malware)。
在创建代码重用YARA规则时,我们需要考虑编译标志、不同的编译器及代码略有改动的情况,恶意软件作者可能会对代码进行改动,而这一改动有可能就会破坏掉YARA规则。因此,我们应该对某些字段使用通配符,例如使用的寄存器,因为这些内容在不同样本中可能会不一样。
举例来说,诸如xor eax之类的各种指令,会根据xor的寄存器产生不同的操作码。为了使编译器能持续有效,同时使YARA规则涵盖不同的环境,通常需要将“[1-2]”操作码从1字节变为2字节。
YARA规则开发的周期,本质上可以归纳为以下的7个步骤:
1、对恶意软件进行分析;
2、识别恶意软件字符串和代码的“唯一性”;
3、根据分析结果,制作YARA规则的原型;
4、在各种恶意软件家族、合法软件、恶意软件数据源中,测试YARA规则原型;
5、部署规则,发现其它样本;
6、在测试阶段和最开始的恶意软件分析阶段中,检测并监控可能产生的误报或漏报;
7、重复这一循环。
实际恶意软件代码重用案例:Dridex恶意软件家族
截至目前,Dridex是网络安全领域中最复杂、分析难度最大的恶意软件之一。
该恶意软件也曾被一些研究人员命名为“Bugat”和“Cridex”。最初的Bugat恶意软件可以追溯到2010年,这一点甚至可以和“Zeus”银行恶意软件相媲美。
其背后的恶意开发团队开发过三种不同的恶意软件变种,这也是我们在创建YARA时的主要研究目标,这三个恶意软件变种分别是:
1、Everis勒索事件中使用的BitPaymer勒索软件(称为“wp_encrypt”);
2、PEMEX勒索事件中使用的DoppelPaymer勒索软件;
3、Dridex加载程序(称为“ldr”),僵尸网络ID 23005。
在Dridex开发者重用的代码中,最为典型的一个示例就是用于解析Windows API调用的独特API哈希函数。这是该恶意软件家族最为明显的特征之一。
基于API哈希函数(如上图所示),可以借助这个YARA规则,按照以下方式来描述Dridex开发者开发的恶意软件:
rule dridex_family { strings: $code = { 5? 5? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? ?? ?? ?? ?? 7? ?? } condition: $code }
我们对该规则进行测试,可以输入以下命令行命令:
yara -s <rule_name> <malware_location>
通过对YARA规则进行测试,可以发现文件夹中有多个Dridex家族恶意软件匹配该规则。
将代码重用与字符串检测相结合
1、DoppelPaymer勒索软件中,包含一些在Dridex恶意软件家族的不同样本中都重复使用的特殊字符串。这些恶意软件通过lstrcpyW API调用,将Unicode字符串“setup run\n”复制到eax。
基于此,我们可以设计一个特定的DoppelPaymer勒索软件检测规则:
rule crime_win32_ransomware_doppelpaymer_1 { strings: $str1 = "Setup run\n" wide $code = { 5? 5? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? ?? ?? ?? ?? 7? ??} condition: $code and $str1 }
2、在BitPaymer勒索软件的不同样本中包含相同的引用字符串,其作用是用于对抗Windows Defender的标志,恶意软件会检查“C:\\aaa_TouchMeNot_.txt”文件是否存在,该文件用于指示Windows Defender沙箱活动。
基于此,我们可以设计一个特定的BitPaymer勒索软件检测规则:
rule crime_win32_ransomware_bitpaymer_1 { strings: $str1 = "C:\\aaa_TouchMeNot_.txt" wide $code = { 5? 5? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? ?? ?? ?? ?? 7? ??} condition: $code and $str1 }
3、在Dridex加载程序示例中,该恶意软件使用OutputDebugStringW多次调用相同的字符串“installed”,该字符串可以表明Dridex加载工具的存在。
基于此,我们可以设计一个特定的Dridex加载工具检测规则:
rule crime_win32_loader_dridex_1 { strings: $str1 = "installed" wide $code = { 5? 5? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? ?? ?? ?? ?? 7? ??} condition: $code and $str1 }
我们最后生成的YARA规则,涵盖了DoppelPaymer勒索软件未加壳Payload的代码和字符串,如下所示:
rule crime_win32_doppelpaymer_ransomware_1 { meta: description = "Detects DoppelPaymer payload Nov 11 Signed" author = "@VK_Intel" reference = "https://twitter.com/VK_Intel/status/1193937831766429696" date = "2019-11-11" hash1 = "46254a390027a1708f6951f8af3da13d033dee9a71a4ee75f257087218676dd5" strings: $s1 = "Setup run" wide $hash_function = { 5? 5? 8b fa 8b ?? 8b cf e8 ?? ?? ?? ?? 85 c0 75 ?? 81 ?? ?? ?? ?? ?? 7? ??} condition: ( uint16(0) == 0x5a4d and filesize < 2500KB and ( all of them ) ) }
恶意软件样本
DoppelPaymer勒索软件(未加壳)SHA-256:
46254a390027a1708f6951f8af3da13d033dee9a71a4ee75f257087218676dd5
BitPaymer勒索软件(未加壳)SHA-256:
78e180e5765aa7f4b89d6bcd9bcef1dd1e0d0261ad0f9c3ec6ab0635bf494eb3
Dridex银行木马(未加壳)SHA-256:
ce509469b80b97e857bcd80efffc448a8d6c63f33374a43e4f04f526278a2c41
本文翻译自:https://www.sentinelone.com/blog/yara-hunting-for-code-reuse-doppelpaymer-ransomware-dridex-families/如若转载,请注明原文地址: https://www.4hou.com/binary/21697.html