yara是一个旨在(但不限于)帮助恶意软件研究人员识别和分类恶意软件样本的开源工具,yara的每一条描述、规则都由一系列字符串和一个布尔型表达式构成,并阐述其逻辑。yara规则可以扫描文件或在运行的进程,以帮助研究人员识别其是否属于某个已进行规则描述的恶意软件等,yara 支持在Windows、Linux 和 Mac OS X 平台上运行。
项目地址:https://github.com/VirusTotal/yara
官方文档:https://yara.readthedocs.io/
具体使用过程可以根据官方文档动手实验,这里就不记录了,一开始肯定写不出比较优秀的规则这是自然的,也不用灰心,多给自己一些信心,凡事都有一个历练过程,因为这是自己的真实感受。自己刚开始也是不太会使用yara,也是因为去年需要hunting才逐步接触这个工具然后去应用它获取到更多的可疑样本辅助研究。yara在安全方向应用很多,这里也是根据自己以往hunting过程简单记录下。yara规则给人的感觉类似于反病毒引擎的特征库,不过可能比特征库的灵活性大,因为反病毒引擎产品面对的通用场景需要考虑到性能,因此尽可能利用较少的特征来命中或检出更多的恶意文件才是最合理的(这里是自己给反病毒引擎写了一点点规则的感受),而yara面对的场景远远比不上产品面对的场景,因此留给研究人员可扩展应用的方式就变得灵活起来。
yara规则的最终输出也不是一个简单的流程,如果要输出质量较高的规则依然要遵循一定的事物发展规律才行。比如需要经过黑白文件的扫描检测,确保编写的规则在白文件中不存在误报,同时也确实在黑文件中存在较少数量(如果在黑文件中存在较多结果很大概率可能不适于特定hunting场景,不利于追踪,但是对于反病毒引擎的特征则是合适的,较少的规则却能命中检测出较多的恶意文件)。上述这些过程通过后还需要在环境中灰度测试一段时间,之后如果没啥误报出现就可以真正应用编写的yara规则,这是一个理想情况下规则输出流程。yara的输出过程也存在一定的技术性,需要逆向分析人员逆向对应的恶意样本来找到一些有趣且独特的检测特征,这类特征往往也需要经过上述测试流程。yara规则的测试流程也是一个迭代的过程,当发现存在误报则需要回到最初点进行修改并寻找新的特征继续进行测试,直到符合要求。
因为上面是理想的规则输出流程,所以一般情况下作为个体研究人员很难达到这个效果。首先就是黑白文件的样本库就并不是个容易的事情,收集与建设过程需要考虑必要的成本。其次是需要去hunting的数据来源,数据源一般分为内部数据源以及外部数据源,内部数据源根据每个组织的情况不一样(客户群体不同,以及内部采集数据能力不同),外部数据源则是分为免费数据源(在线免费沙箱)收费数据源(VirusTotal等商业数据服务商),当这些条件满足后一般就可以开始利用yara来推动hunting的流程与效果。
在一些场景下,考虑到自建黑白样本库需要一定的时间与成本,当组织条件允许时(购买了VirusTotal的相关服务)可以利用VirusTotal的Intelligence服务搜索中组合不同的字节序列(使用“content”修饰符)。如果编写的规则完全基于字符串和字节序列,那自己可以通过在VirusTotal中进行几次搜索来测试其有效性,这是一种预先测试自己编写yara准确性的一种方法,如果命中数据过多表明规则编写过于宽泛不利于hunting效果,如果数量符合预期表明该规则表现良好可以先期投入运营看看效果,这一块的实践最初是发现周围有人使用便自己模仿学习了下感觉效果挺不错。
VirusTotal上验证yara规则
首先这是一种收费的服务,个人账号是没有该功能的。搜索语法采用content语法进行内容搜索,与yara中的字符串搜索类似。在本地没有大量待检测数据集的情况下,可用来临时验证yara规则的准确性与泛性。
content搜索
使用说明链接:https://support.virustotal.com/hc/en-us/articles/360001386897-Content-search-VTGrep-
VTGrep支持yara中的一些与内容相关的功能。一些有效的内容搜索查询示例为:
转义的UTF-8(包括ASCII) |
content:”résumé”, x22x45x64″ |
十六进制 |
content:{CAFEBABE} |
AND |
content:”Hello World!” content:{CAFEBABE} |
OR |
content:”This program cannot be run in DOS mode” OR content:{CAFEBABE} |
特定偏移量的内容 |
content:{CA FE BA BE}@0 |
在偏移范围内开始 |
content:{CAFEBABE}@0-10 |
十六进制偏移 |
content:{CAFEBABE}@0x00-0x0A |
?? 通配符 |
content:{686f6c61 ?? 6d756e646f} |
可变长度通配符 |
content:{CAFEBABE [1-100] 686F6C61} |
二中选一 |
content:{686F6C6120(6d756e646f|686F6C6120)} |
在搜索特定字符时,双引号包含的字符串是需要进行转义的:content:”C:\Windows\System32″,如果将鼠标悬停在左侧的眼睛图标上,则会看到该文件的匹配情况。
或者如果不需要转义,则可以使用十六进制格式进行搜索:content:{43 3a 5c 57 69 6e 64 6f 77 73 5c 53 79 73 74 65 6d 33 32}。
应急响应场景与yara
在之前写的《情报驱动应急响应读书笔记》系列中已经提到,如果有条件面临应急响应事件或者各类APT入侵被动响应事件等,随着参与并处理这类事件的不断增加,出现类似事件的概率也将会增加,因此针对已有事件响应调查后获取的所有痕迹编写对应的yara规则便能应用到后续遇到的应急响应事件中提高发现异常的效率,这也属于情报驱动应急响应的经典案例。由于yara属于二进制模式匹配的工具,这类应用目前集中在待排查系统上的所有文件与可疑进程的排查,相关的开源工具有spyre等。
yara始终是一个工具,也是一个可扩展的工具,最终规则输出的质量好坏,很大程度取决于编写者的个人经验以及不断测试实践而得到的效果。虽然yara编写的规则可以很简单,但是也可以很巧妙,灵活性很大,比如自己之前9月份发现的CVE-2022-37969在野漏洞样本。
在6月份发现的CVE-2022-24521在野漏洞利用样本
2021年11月初发现的CVE-2021-36955漏洞样本
除了Windows平台漏洞相关外,还可以发现更多有价值的样本,这块也考验分析人员的经验以及运气。如果是从事逆向分析的人员那么有价值的样本是挺重要的,如果不是这个方向的安全人员那么其实有价值的恶意样本对自己的方向并不是很重要,毕竟术业有专攻。
介绍了以上的帮助内容之后,接下来记录下如何去VirusTotal搜索。首先是需要将搜索的字符串转换为十六进制数据(这样会避免掉转义符合的影响,例如@符号等),采用的工具为CyberChef。工具地址:https://github.com/gchq/CyberChef,通过以下的设置就可以得到字符串不同编码下的十六进制数据了。
然后在VT上通过content语法进行搜索,可以发现命中了两个文件。
content:{53 00 2D 00 31 00 2D 00 35 00 2D 00 32 00 31 00 2D 00 32 00 35 00 34 00 35 00 35 00 36 00 34 00 36 00 30 00 34 00 2D 00 31 00 32 00 30 00 33 00 30 00 35 00 32 00 35 00 2D 00 32 00 31 00 31 00 35 00 33 00 34 00 36 00 36 00 31 00 37 00 2D 00 31 00 30 00 30 00 30 00}
原文始发于微信公众号(OnionSec):ThreatHunting之Yara的应用