Introduction

简介

这个房间需要您了解基本的 Linux 知识,例如安装软件和用于系统常规导航的命令。此外,这个房间并非旨在测试您的知识或得分。它旨在鼓励您跟随并尝试您在这里学到的知识。

与往常一样,我希望您从这个房间中学到一些东西,即 Yara(又一个荒谬的缩写)的奇妙之处及其在当今信息安全中的重要性。Yara 由 Victor M. Alvarez (@plusvic) 和 @VirusTotal 开发。查看 GitHub 存储库 此处

What is Yara?

关于 Yara 的一切

“恶意软件研究人员(以及其他所有人)的模式匹配瑞士军刀”(Virustotal.,2020)

有了这样一句恰当的引言,Yara 可以根据二进制和文本模式(例如文件中包含的十六进制和字符串)识别信息。

规则用于标记这些模式。例如,Yara 规则经常被编写为根据文件呈现的特征(或模式)来确定文件是否是恶意的。字符串是编程语言的基本组成部分。应用程序使用字符串来存储文本等数据。

例如,下面的代码片段在 Python 中打印“Hello World”。文本“Hello World”将存储为字符串。

print("Hello World!")

如果愿意,我们可以编写一个 Yara 规则,在操作系统的每个程序中搜索“hello world”。

恶意软件为什么使用字符串?

恶意软件就像我们的“Hello World”应用程序一样,使用字符串来存储文本数据。以下是各种恶意软件类型在字符串中存储的数据的几个示例:

类型 数据 描述
勒索软件 12t9YDPgwueZ9NyMgw519p7AA8isjr6SMw 用于支付赎金的比特币钱包
僵尸网络 12.34.56.7 命令和控制 (C&C) 服务器的 IP 地址

警告:恶意软件分析

Introduction to Yara Rules

您的第一条 Yara 规则

Yara 用于规则的专有语言相当容易掌握,但很难掌握。这是因为您的规则的有效性取决于您对要搜索的模式的理解。

使用 Yara 规则很简单。每个 yara 命令都需要两个参数才能有效,它们是:
1) 我们创建的规则文件
2) 要使用该规则的文件、目录或进程 ID 的名称。

每条规则都必须有名称和条件。

例如,如果我们想在目录“some directory”上使用“myrule.yar”,我们将使用以下命令:
yara myrule.yar somedirectory

请注意,**.yar** 是所有 Yara 规则的标准文件扩展名。我们将在下面制定您可以制定的最基本的规则之一。

  1. 通过 touch somefile 创建一个名为“somefile”的文件
  2. 创建一个新文件并将其命名为“myfirstrule.yar”,如下所示:

创建一个名为 somefile 的文件

cmnatic@thm:~$ touch somefile

创建名为 myfirstrule.yar 的文件

cmnatic@thm touch myfirstrule.yar
  1. 使用文本编辑器(例如“nano”)打开“myfirstrule.yar”,输入以下代码片段并保存文件:
rule examplerule {
condition: true
}

使用 nano 将我们的第一个代码片段输入到“myfirstrule.yar”中

cmnatic@thm nano myfirstrule.yar   GNU nano 4.8 myfirstrule.yar Modified
rule examplerule {
condition: true
}

此代码片段中规则的名称examplerule,其中我们有一个条件 - 在这种情况下,条件condition。如前所述,每个规则都需要名称和条件才能有效。此规则满足了这两个要求。

简单来说,我们制定的规则通过condition: true检查我们指定的文件/目录/PID是否存在。如果文件确实存在,我们将得到examplerule的输出

让我们在第一步中创建的文件“somefile”上尝试一下:
yara myfirstrule.yar somefile

如果“somefile”存在,Yara 会说examplerule,因为模式已经满足 - 如下所示:

验证我们的 examplerule 是否正确

cmnatic@thm:~$ yara myfirstrule.yar somefile 
examplerule somefile

如果文件不存在,Yara 将输出如下错误:

Yara 抱怨文件不存在

cmnatic@thm:~$ yara myfirstrule.yar sometextfile
error scanning sometextfile: could not open file

恭喜!您已制定第一条规则。

Expanding on Yara Rules

Yara Conditions Continued…

检查文件是否存在并没有多大帮助。毕竟,我们可以自己弄清楚……使用更好的工具来完成这项工作。

Yara 有一些条件,我鼓励您在闲暇时阅读。不过,我将在下面详细介绍一些条件并解释它们的用途。

KeyWord
Desc
Meta
Strings
Conditions
Weight

Meta

Yara 规则的此部分由规则作者保留,用于描述信息。例如,您可以使用 desc(description 的缩写)来总结规则检查的内容。此部分中的任何内容都不会影响规则本身。与注释代码类似,总结规则很有用。

Strings

还记得我们在任务 2 中讨论过的字符串吗?好了,我们开始吧。您可以使用字符串在文件或程序中搜索特定文本或十六进制。例如,假设我们想在目录中搜索所有包含“Hello World!”的文件,我们将创建如下规则:

rule helloworld_checker{
strings:
$hello_world = "Hello World!"
}

我们定义关键字 Strings,其中我们要搜索的字符串,即“Hello World!”存储在变量 $hello_world 中

当然,我们需要一个条件来使规则有效。在此示例中,要使此字符串成为条件,我们需要使用变量的名称。在本例中为 $hello_world:

rule helloworld_checker{
strings:
$hello_world = "Hello World!"

condition:
$hello_world
}

本质上,如果任何文件包含字符串“Hello World!”,则规则将匹配。但是,这实际上是说,只有找到“Hello World!”时才会匹配,而“hello world”或“HELLO WORLD”则不会匹配。

为了解决这个问题,条件 any of them 允许搜索多个字符串,如下所示:

rule helloworld_checker{
strings:
$hello_world = "Hello World!"
$hello_world_lowercase = "hello world"
$hello_world_uppercase = "HELLO WORLD"

condition:
any of them
}

现在,任何包含以下字符串的文件:

  1. Hello World!
  2. hello world
  3. HELLO WORLD

现在将触发规则。

Conditions

我们已经使用了 true 和 any of them 条件。与常规编程非常相似,您可以使用以下运算符:

<= less than or equal to

= more than or equal to
!= not equal to

例如,下面的规则将执行以下操作:

rule helloworld_checker{
strings:
$hello_world = "Hello World!"
condition:
#hello_world <= 10
}

该规则现在将:

  1. 查找“Hello World!”字符串
  2. 仅当“Hello World!”字符串出现次数小于或等于 10 次时,规则才匹配

Combining keywords

此外,您还可以使用以下关键字:

and
not
or

组合多个条件。假设您想检查某个文件是否包含字符串且大小为特定值(在此示例中,我们检查的样本文件小于 <10 kb 且包含“Hello World!”,您可以使用如下规则:

rule helloworld_checker{
strings:
$hello_world = "Hello World!"

condition:
$hello_world and filesize < 10KB
}

只有当两个条件都为真时,规则才会匹配。举例来说:下面,我们在本例中创建的规则不匹配,因为虽然文件包含“Hello World!”,但文件大小大于 10KB:

cmnatic@thm:~$ <output intentionally left blank>

但是,这次规则匹配,因为该文件既有“Hello World!”,又有小于 10KB 的文件大小。

cmnatic@thm:~$ yara myfirstrule.yar mytextfile.txt
helloworld_textfile_checker mytextfile.txt

记住红色框内的文本是我们规则的名称,绿色框内的文本是匹配的文件。

Anatomy of a Yara Rule

信息安全研究员“fr0gger_”最近创建了一个方便的备忘单,分解并可视化了 YARA 规则的元素(如上所示,所有图片均归他所有)。这是入门的绝佳参考点!

Yara Modules

与其他库集成
诸如 Cuckoo Sandbox 或 Python 的 PE 模块之类的框架可让您将 Yara 规则的技术性提高十倍。

Cuckoo
Cuckoo Sandbox 是一个自动化的恶意软件分析环境。此模块允许您根据从 Cuckoo Sandbox 发现的行为生成 Yara 规则。当此环境执行恶意软件时,您可以针对特定行为(例如运行时字符串等)创建规则。

Python PE
Python 的 PE 模块允许您从 Windows 可移植可执行 (PE) 结构的各个部分和元素创建 Yara 规则。

解释此结构超出了范围,因为它已在我的恶意软件介绍室中介绍。但是,此结构是 Windows 上所有可执行文件和 DLL 文件的标准格式。包括使用的编程库。

检查 PE 文件的内容是恶意软件分析中的一项基本技术;这是因为无需逆向工程或执行样本就可以在很大程度上识别诸如加密或蠕虫之类的行为。

Other tools and Yara

Yara Tools

了解如何创建自定义 Yara 规则很有用,但幸运的是,您不必从头开始创建许多规则即可开始使用 Yara 搜索邪恶。有大量 GitHub 资源和开源工具(以及商业产品)可用于在搜索操作和/或事件响应活动中利用 Yara。

LOKI (What, not who, is Loki?)

LOKI 是一款免费的开源 IOC(入侵指标)扫描器,由 Florian Roth 创建/编写。

根据 GitHub 页面,检测基于 4 种方法:

文件名 IOC 检查
Yara 规则检查(我们在这里)
哈希检查
C2 反向连接检查
LOKI 还可用于其他检查。有关完整概述,请参考 GitHub 自述文件

LOKI 可在 Windows 和 Linux 系统上使用,可在此处下载。

请注意,您不应在此房间使用此工具。

显示 Loki 的帮助菜单

cmnatic@thm:~/Loki$ python3 loki.py -h
usage: loki.py [-h] [-p path] [-s kilobyte] [-l log-file] [-r remote-loghost]
[-t remote-syslog-port] [-a alert-level] [-w warning-level]
[-n notice-level] [--allhds] [--alldrives] [--printall]
[--allreasons] [--noprocscan] [--nofilescan] [--vulnchecks]
[--nolevcheck] [--scriptanalysis] [--rootkit] [--noindicator]
[--dontwait] [--intense] [--csv] [--onlyrelevant] [--nolog]
[--update] [--debug] [--maxworkingset MAXWORKINGSET]
[--syslogtcp] [--logfolder log-folder] [--nopesieve]
[--pesieveshellc] [--python PYTHON] [--nolisten]
[--excludeprocess EXCLUDEPROCESS] [--force]

Loki - Simple IOC Scanner

optional arguments:
-h, --help show this help message and exit

THOR (superhero named programs for a superhero blue teamer)

THOR Lite 是 Florian 最新的多平台 IOC 和 YARA 扫描器。它有适用于 Windows、Linux 和 macOS 的预编译版本。THOR Lite 的一个不错的功能是它的扫描节流功能,可以限制耗尽的 CPU 资源。如需更多信息和/或下载二进制文件,请从此处开始。您需要订阅他们的邮件列表才能获得二进制文件的副本。请注意,THOR 面向企业客户。THOR Lite 是免费版本。

请注意,您不应在此房间中使用此工具。

Displaying Thor Lite’s help menu

cmnatic@thm:~$ ./thor-lite-linux-64 -h
Thor Lite
APT Scanner
Version 10.7.3 (2022-07-27 07:33:47)
cc) Nextron Systems GmbH
Lite Version

> Scan Options
-t, --template string Process default scan parameters from this YAML file
-p, --path strings Scan a specific file path. Define multiple paths by specifying this option multiple times. Append ':NOWALK' to the path for non-recursive scanning (default: only the system drive) (default [])
--allhds (Windows Only) Scan all local hard drives (default: only the system drive)
--max_file_size uint Max. file size to check (larger files are ignored). Increasing this limit will also increase memory usage of THOR. (default 30MB)

> Scan Modes
--quick Activate a number of flags to speed up the scan at cost of some detection.
This is equivalent to: --noeventlog --nofirewall --noprofiles --nowebdirscan --nologscan --noevtx --nohotfixes --nomft --lookback 3 --lookback-modules filescan

FENRIR (naming convention still mythical themed)

这是 Neo23x0 (Florian Roth) 创建的第三个工具。您猜对了;前两个工具已在上面列出。更新版本是为了解决其前身的问题而创建的,即必须满足要求才能运行。Fenrir 是一个 bash 脚本;它可以在任何能够运行 bash 的系统上运行(如今甚至包括 Windows)。

请注意,您不应在此房间中使用此工具。

Running Fenrir

cmnatic@thm-yara:~/tools$ ./fenrir.sh
##############################################################
____ _
/ __/__ ___ ____(_)___
/ _// -_) _ \/ __/ / __/
/_/ \__/_//_/_/ /_/_/
v0.9.0-log4shell

Simple Bash IOC Checker
Florian Roth, Dec 2021
##############################################################

YAYA (Yet Another Yara Automaton)

YAYA 由 EFF(电子前沿基金会)创建,并于 2020 年 9 月发布。根据其网站,“YAYA 是一款新的开源工具,可帮助研究人员管理多个 YARA 规则存储库。YAYA 首先导入一组高质量的 YARA 规则,然后让研究人员添加自己的规则、禁用特定规则集并运行文件扫描。”

注意:目前,YAYA 只能在 Linux 系统上运行。

Running YAYA

cmnatic@thm-yara:~/tools$ yaya
YAYA - Yet Another Yara Automaton
Usage:
yaya [-h]
-h print this help screen
Commands:
update - update rulesets
edit - ban or remove rulesets
add - add a custom ruleset, located at
scan - perform a yara scan on the directory at

在下一节中,我们将进一步研究 LOKI……

Using LOKI and its Yara rule set

Using LOKI

作为一名安全分析师,您可能需要研究各种威胁情报报告、博客文章等,并收集有关过去或现在在野使用的最新策略和技术的信息。通常在这些读数中,IOC(哈希、IP 地址、域名等)将被共享,以便可以创建规则来检测您环境中的这些威胁以及 Yara 规则。另一方面,您可能会发现自己遇到未知的情况,而您的安全工具堆栈无法/没有检测到。使用 Loki 等工具,您需要根据您的威胁情报收集或事件响应参与(取证)的发现添加自己的规则。

如前所述,Loki 已经有一套 Yara 规则,我们可以从中受益并立即开始扫描端点上的邪恶。

Loki 位于tools中。

Listing the tools directory

cmnatic@thm-yara:~/tools$ ls
Loki yarGen

导航到“Loki”目录。运行“python loki.py -h”以查看可用的选项。

如果您在自己的系统上运行 Loki,则应运行的第一个命令是“–update”。这将添加“signature-base”目录,Loki 使用该目录扫描已知恶意程序。此命令已在附加的 VM 中执行。

列出 Loki signature-base 目录

cmnatic@thm-yara:~/tools/Loki/signature-base$ ls
iocs misc yara

导航到“yara”目录。请随意检查 Loki 使用的不同 Yara 文件,以了解这些规则将寻找什么。

要运行 Loki,您可以使用以下命令(请注意,我是在文件 1 目录中调用 Loki)

指示 Loki 扫描可疑文件

cmnatic@thm-yara:~/suspicious-files/file1$ python ../../tools/Loki/loki.py -p .

场景:您是一家中型律师事务所的安全分析师。一位同事在您组织的 Web 服务器上发现了可疑文件。这些文件是在对公司网站进行更新时发现的。这些文件已复制到您的计算机进行分析。这些文件位于“可疑文件”目录中。使用 Loki 回答以下问题。

Creating Yara rules with yarGen

Creating Yara rules with yarGen

从上一节中,我们意识到我们有一个 Loki 没有标记的文件。此时,我们无法在其他 Web 服务器上运行 Loki,因为如果文件 2 存在于任何 Web 服务器中,它将不会被检测到。

我们需要创建一个 Yara 规则来检测我们环境中的这个特定 Web Shell。通常,这是在发生事件时所做的,事件是对组织产生负面影响的事件。

我们可以手动打开文件并尝试筛选一行又一行的代码,以找到可以在我们新创建的 Yara 规则中使用的可能的字符串。

让我们检查一下这个特定文件有多少行。您可以运行以下命令:strings <file name> | wc -l

Using wc to count the amount of lines in the file

cmnatic@thm-yara:~/suspicious-files/file2$ strings 1ndex.php | wc -l
3580

如果您尝试手动逐行检查每个字符串,您很快就会意识到这是一项艰巨的任务。

Catting the output of 1ndex.php

if(res=='error'){
$('.ulProgress'+ulType+i).html('( failed )');
}
else{
$('.ulRes'+ulType+i).html(res);
}
loading_stop();
},
error: function(){
loading_stop();
$('.ulProgress'+ulType+i).html('( failed )');
$('.ulProgress'+ulType+i).removeClass('ulProgress'+ulType+i);
$('.ulFilename'+ulType+i).removeClass('ulFilename'+ulType+i);
}
});
}

function ul_go(ulType){
ulFile = (ulType=='comp')? $('.ulFileComp'):$('.ulFileUrl');
ulResult = (ulType=='comp')? $('.ulCompResult'):$('.ulUrlResult');
ulResult.html('');

ulFile.each(function(i){
if(((ulType=='comp')&&this.files[0])||((ulType=='url')&&(this.value!=''))){
file = (ulType=='comp')? this.files[0]: this.value;
filename = (ulType=='comp')? file.name: file.substring(file.lastIndexOf('/')+1);

ulSaveTo = (ulType=='comp')? $('.ulSaveToComp')[i].value:$('.ulSaveToUrl')[i].value;
ulFilename = (ulType=='comp')? $('.ulFilenameComp')[i].value:$('.ulFilenameUrl')[i].value;

--snippet cropped for brevity--

幸运的是,我们可以使用 yarGen(是的,Florian Roth 创建的另一个工具)来帮助我们完成这项任务。

什么是 yarGen?yarGen 是 YARA 规则的生成器。

来自 README - “主要原则是从恶意软件文件中找到的字符串创建 yara 规则,同时删除所有也出现在 goodware 文件中的字符串。因此,yarGen 包含一个大型 goodware 字符串和操作码数据库作为 ZIP 存档,必须在第一次使用前提取。”

导航到工具内的 yarGen 目录。如果您在自己的系统上运行 yarGen,则需要先通过运行以下命令来更新它:python3 yarGen.py –update。

这将从在线存储库更新 good-opcodes 和 good-strings DB。此更新将需要几分钟。

成功更新后,您将在输出末尾看到以下消息。

Updating yarGen

cmnatic@thm-yara:~/tools/yarGen$ python3 yarGen.py --update
------------------------------------------------------------------------
_____
__ _____ _____/ ___/__ ___
/ // / _ `/ __/ (_ / -_) _ \
\_, /\_,_/_/ \___/\__/_//_/
/___/ Yara Rule Generator
Florian Roth, July 2020, Version 0.23.3

Note: Rules have to be post-processed
See this post for details: https://medium.com/@cyb3rops/121d29322282
------------------------------------------------------------------------
Downloading good-opcodes-part1.db from https://www.bsk-consulting.de/yargen/good-opcodes-part1.db ...

要使用 yarGen 为文件 2 生成 Yara 规则,可以运行以下命令:

python3 yarGen.py -m /home/cmnatic/suspicious-files/file2 --excludegood -o /home/cmnatic/suspicious-files/file2.yar 

上述参数的简要说明:

-m 是要为其生成规则的文件的路径

--excludegood 强制排除所有 goodware 字符串(这些字符串是在合法软件中找到的,可能会增加误报)

-o 您要输出 Yara 规则的位置和名称

如果一切顺利,您应该会看到以下输出。

使用 yarGen 为 file2 生成规则

       [=] Generated 1 SIMPLE rules.
       [=] All rules written to /home/cmnatic/suspicious-files/file2.yar
       [+] yarGen run finished

通常,您会检查 Yara 规则并删除您认为可能产生误报的任何字符串。对于本练习,我们将保留生成的 Yara 规则并测试 Yara 是否会标记文件 2。

注意:为协助此操作而创建的另一个工具称为 yarAnalyzer(您猜对了 - 由 Florian Roth 创建)。我们不会在本房间中检查该工具,但您应该阅读它,特别是如果您决定开始创建自己的 Yara 规则。

关于创建 Yara 规则和使用 yarGen 的进一步阅读:

https://www.bsk-consulting.de/2015/02/16/write-simple-sound-yara-rules/
https://www.bsk-consulting.de/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/
https://www.bsk-consulting.de/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/

Valhalla

Valhalla

“Valhalla” 是一个由 Nextron-Systems(呃,Florian Roth)创建和托管的在线 Yara 源。现在,您应该知道 Florian 为社区创建这些工具投入了大量的时间和精力。也许我们应该把它称为 Florian Roth 房间。(哈哈)

根据网站,“Valhalla 利用数千条手工制作的高质量 YARA 规则来增强您的检测能力。”

从上图可以看出,我们可以根据关键字、标签、ATT&CK 技术、sha256 或规则名称进行搜索。

注意:有关 ATT&CK 的更多信息,请访问 MITRE 房间。

看看提供给我们的数据,让我们检查下面屏幕截图中的规则:

我们获得了规则的名称、简要说明、有关规则的更多信息的参考链接以及规则日期。

请随意查看一些规则以熟悉 Valhalla 的实用性。学习该产品的最佳方式是直接开始。

从我们的场景中可以看出,此时,您知道这两个文件是相关的。即使 Loki 将文件归类为可疑文件,但您内心知道它们是恶意的。因此,您使用 yarGen 创建了 Yara 规则以在其他 Web 服务器上检测它。但让我们进一步假装您不懂代码(仅供参考 - 并非所有安全专业人员都知道如何编写代码/脚本或阅读它)。您需要对这些文件进行进一步研究,以获得从网络中删除这些文件的批准。

是时候使用 Valhalla 进行一些威胁情报收集了……

Conclusion

在这个房间里,我们探索了 Yara、如何使用 Yara,并手动创建了基本的 Yara 规则。我们还探索了各种开源工具,以便立即开始使用 Yara 规则来检测端点上的邪恶行为。

通过房间场景,您应该了解(作为蓝队成员)如果我们依赖此类工具,需要知道如何有效地创建 Yara 规则。商业产品虽然并不完美,但其 Yara 规则集将比开源产品丰富得多。商业和开源产品都允许您添加 Yara 规则以进一步扩展其检测威胁的能力。

如果不清楚,文件 2 未被检测到的原因是 Yara 规则不在 Loki 用于检测黑客工具(Web Shell)的 Yara 文件中,尽管该黑客工具已经存在多年,甚至被归因于至少一个民族国家。Yara 规则存在于 Loki 的商业变体中,即 Thor。

Yara 和 Yara 规则可以做更多的事情。我们鼓励您在闲暇时进一步探索此工具。