Yara在应急响应中的使用基础

Yara在应急响应中的使用基础

YARA 是一款被广泛用于应急响应人员和恶意代码分析师的模式匹配与恶意软件识别工具。它的全称是 Yet Another Ridiculous Acronym。通过编写结构清晰、易读的规则,我们可以在文件或内存中快速定位攻击者留下的特征信息。

在应急响应流程中,YARA 类似于 Suricata 分析网络流量、Sigma 分析日志,而 YARA 则专注于对文件、内存、进程进行静态或半动态检测,是研判恶意样本与横向排查过程中最常用的“武器”。

为什么在应急响应中需要 YARA 规则?

把它想象成在应急处理过程中寻找“假币”的过程:恶意软件和攻击者工具都具有一些典型特征。YARA 规则就是记录这些特征的方式,能够在大量正常文件里精确过滤出恶意对象。

在真实响应场景中,它帮助:

  • 快速定位攻击者使用的程序或脚本
  • 在多台主机上批量排查是否存在相同的恶意样本
  • 快速构建 IOC(Indicator of Compromise)规则进行横向调查
  • 通过特征匹配判断是否属于某个已知恶意家族

YARA 的关键应用场景

恶意软件检测与分类

可以编写特征规则来识别某个家族样本,例如:

  • C2 域名
  • 特定硬编码字符串
  • 漏洞利用的固定 Shellcode 片段
  • 加密常量等

在威胁溯源中,这些特征能快速帮助判断感染范围与恶意软件类别。

应急响应与横向排查

当发现攻击者使用了某个工具(如 Cobalt Strike Beacon、Mimikatz、恶意 PowerShell),IR 团队通常会在第一时间为该工具生成 YARA 规则。然后用它对所有主机磁盘、内存快照或进程进行扫描,快速确认攻击是否扩散。

数字取证(Forensics)

在分析硬盘镜像或内存镜像时,YARA 是最常见的取证扫描工具。
可以通过它:

  • 寻找被删除或隐藏的恶意文件残留
  • 匹配攻击者的指令、路径、编译信息
  • 在内存中定位恶意进程的特定 payload

它非常适合弥补日志缺失时的证据收集。

威胁狩猎(Threat Hunting)

基于最新的情报(如攻击者使用的新 loader、DLL、组件等),团队会提前写好 YARA 规则,并对全网进行定期扫描。这能提前发现潜伏的威胁,避免攻击扩大或造成破坏。

与现有安全体系集成

YARA 规则可以集成到:

  • EDR / XDR
  • SIEM
  • 沙箱
  • 文件扫描系统
  • SOAR 自动化任务

从而在常规检测之外补充更灵活的自定义检测逻辑,提高应急响应效率。

YARA 的工作原理

页面里的图示表示了 YARA 的基本流程:

  1. Dataset(扫描对象)
    IR 中常见的数据集包括:磁盘镜像、某路径下的文件、可疑进程的内存 dump、网络挂载路径等。
  2. YARA Rule(YARA 规则)
    规则中描述攻击者或恶意软件的行为特征、字符串特征、字节特征等。
  3. Pattern Matching Tool(匹配引擎)
    核心扫描工具(如 yara 或 yara64),会把规则逐一匹配到文件或内存内容中。
  4. Scan Result(匹配结果)
    IR 场景中最核心:哪些文件、进程或内存区域命中了规则,即可能的受感染点。

YARA 能在现场快速定位攻击者痕迹,是应急响应环节中不可或缺的精准排查手段。

YARA 规则示例

示例规则检测字符串 “malware” 的出现:

rule ExampleRule {
    strings:
        $a = "malware-strings"
    condition:
        $a
}
  • 这是最基础的规则,实际场景中常会匹配多个字符串、字节序列、正则表达式
  • 复杂家族会使用模块(如 PE 模块)来检查文件结构
  • 条件部分可使用逻辑表达式、计数条件等完成高级检测

YARA 开发与集成工具

在应急响应场景中,我们常需要根据 IOC(入侵指标)快速编写、调试并验证 YARA 规则,用于在受感染主机或样本库中进行大规模排查。因此,一个高效、带语法提示的开发环境非常关键。

Yara开发工具 VSCode

VS Code 是最适合Yara开发使用的代码编辑器之一,通过安装 YARA 扩展,可显著提高规则编写效率。

安装步骤:

  1. 访问官方页面并安装 VS Code(https://code.visualstudio.com/download
  2. 在编辑器中打开扩展视图(Ctrl + Shift + X)
  3. 搜索并安装 “YARA” 扩展

YARA 集成与 IOC 扫描工具

在编写完规则后,必须结合扫描工具对样本或整机进行检测,以确认规则是否准确命中恶意文件。常用工具包括:

YARA32/64 命令行工具

https://github.com/virustotal/yara/releases

从 YARA 官方 GitHub 下载对应架构的可执行文件(如 yara64.exe)。查看帮助

.\yara64.exe --help
YARA 4.5.5,模式匹配的瑞士军刀。
用法: yara [选项]... [命名空间:]规则文件... 文件 | 目录 | PID

长选项的强制参数对于短选项也是强制的。

       --atom-quality-table=FILE           包含原子质量表的文件路径
  -C,  --compiled-rules                    加载编译后的规则
  -c,  --count                             仅打印匹配的数量
  -E,  --strict-escape                     警告未知的转义序列
  -d,  --define=VAR=VALUE                  定义外部变量
  -q,  --disable-console-logs              禁用打印控制台日志消息
       --fail-on-warnings                  出现警告时失败
  -f,  --fast-scan                         快速匹配模式
  -h,  --help                              显示此帮助并退出
  -i,  --identifier=IDENTIFIER             仅打印名为 IDENTIFIER 的规则
       --max-process-memory-chunk=NUMBER   设置读取进程内存时的最大块大小(默认值=1073741824)
  -l,  --max-rules=NUMBER                  在匹配到 NUMBER 个规则后中止扫描
       --max-strings-per-rule=NUMBER       设置每个规则的最大字符串数(默认值=10000)
  -x,  --module-data=MODULE=FILE           将 FILE 的内容作为额外数据传递给 MODULE
  -n,  --negate                            仅打印未满足的规则(取反)
  -N,  --no-follow-symlinks                扫描时不要跟随符号链接
  -w,  --no-warnings                       禁用警告
  -m,  --print-meta                        打印元数据
  -D,  --print-module-data                 打印模块数据
  -M,  --module-names                      显示模块名称
  -e,  --print-namespace                   打印规则的命名空间
  -S,  --print-stats                       打印规则的统计信息
  -s,  --print-strings                     打印匹配的字符串
  -L,  --print-string-length               打印匹配字符串的长度
  -X,  --print-xor-key                     打印匹配字符串的 xor 密钥和明文
  -g,  --print-tags                        打印标签
  -r,  --recursive                         递归搜索目录
       --scan-list                         扫描 FILE 中列出的文件,每行一个
  -z,  --skip-larger=NUMBER                扫描目录时跳过大于给定大小的文件
  -k,  --stack-size=SLOTS                  设置最大堆栈大小(默认值=16384)
  -t,  --tag=TAG                           仅打印标记为 TAG 的规则
  -p,  --threads=NUMBER                    使用指定的 NUMBER 个线程扫描目录
  -a,  --timeout=SECONDS                   在给定的 SECONDS 秒后中止扫描
  -v,  --version                           显示版本信息

发送错误报告和建议至:vmalvarez@virustotal.com。

用于了解所有可用的参数与执行方式。基础扫描流程如,从样本中提取了 IOC(如“RyukReadMe.html”),并将其写入规则里,保存为:

rule Sample_Rule
{
    strings:
        $str1 = "RyukReadMe.html" wide
    condition:
        $str1
}

执行扫描(对目录递归扫描,并打印匹配详情):

.\yara64.exe -s -r .\SampleRule.yara <Directory>

关键参数:

  • -s → 打印扫描统计与命中内容
  • -r → 递归扫描目录

输出中会显示匹配的文件名、偏移位置、匹配字符串,非常适合用于取证分析和定位关键 IOC。

Loki 工具

Loki 是应急响应场景中常用的“轻量化威胁扫描工具”,比单纯的 YARA 工具更全面,因为:

  • 内置大量威胁情报规则
  • 自动化扫描与日志输出
  • 支持 YARA、自定义特征、文件元信息检测

从官方 GitHub 页面获取。查看帮助

.\loki.exe --help
用法: loki.exe [-h] [-p 路径] [-s 千字节] [-l 日志文件] [-r 远程日志主机] [-t 远程Syslog端口]
                [-a 警报级别] [-w 警告级别] [-n 注意级别] [--allhds] [--alldrives] [--printall]
                [--allreasons] [--noprocscan] [--nofilescan] [--vulnchecks] [--nolevcheck] [--scriptanalysis]
                [--rootkit] [--noindicator] [--dontwait] [--intense] [--csv] [--onlyrelevant] [--nolog] [--update]
                [--debug] [--maxworkingset 最大工作集] [--syslogtcp] [--logfolder 日志文件夹] [--nopesieve]
                [--pesieveshellc] [--python PYTHON] [--nolisten] [--excludeprocess 排除进程] [--force]
                [--version]

Loki - 简单IOC扫描器

选项:
  -h, --help            显示此帮助信息并退出
  -p 路径               要扫描的路径
  -s 千字节           要检查的最大文件大小,单位为KB (默认 5000 KB)
  -l 日志文件           日志文件
  -r 远程日志主机     远程Syslog系统
  -t 远程Syslog端口
                        远程Syslog端口
  -a 警报级别        警报分数
  -w 警告级别        警告分数
  -n 注意级别        注意分数
  --allhds              扫描所有本地硬盘 (仅限Windows)
  --alldrives           扫描所有驱动器(包括网络驱动器和可移动介质)
  --printall            打印所有扫描的文件
  --allreasons          打印导致该分数的所有原因
  --noprocscan          跳过进程扫描
  --nofilescan          跳过文件扫描
  --vulnchecks          运行漏洞检查
  --nolevcheck          跳过Levenshtein距离检查
  --scriptanalysis      脚本的统计分析以检测混淆的代码(测试版)
  --rootkit             跳过rootkit检查
  --noindicator         不显示进度指示器
  --dontwait            退出时不等待
  --intense             密集扫描模式(也扫描未知文件类型和所有扩展名)
  --csv                 将CSV日志格式写入STDOUT(机器处理)
  --onlyrelevant        仅打印警告或警报
  --nolog               不写入本地日志文件
  --update              从“signature-base”子存储库更新签名
  --debug               调试输出
  --maxworkingset 最大工作集
                        要扫描的进程的最大工作集大小(单位为MB,默认 100 MB)
  --syslogtcp           使用TCP而不是UDP进行Syslog日志记录
  --logfolder 日志文件夹
                        在未指定日志文件时用于日志记录的文件夹
  --nopesieve           不执行pe-sieve扫描
  --pesieveshellc       执行pe-sieve shellcode扫描
  --python PYTHON       覆盖默认的python路径
  --nolisten            不显示侦听连接
  --excludeprocess 排除进程
                        指定要从扫描中排除的可执行文件名,可以多次使用
  --force               强制扫描某个文件夹(即使在LOKI的代码中被硬性排除)
  --version             显示欢迎文本和loki的版本,然后退出

更新签名,Loki 自带升级器:

.\loki-upgrader.exe --sigsonly

这会更新所有已知威胁的规则库,使扫描更加准确。使用自定义 YARA 规则,将 SampleRule 复制到:

loki/signature-base/yara/

执行扫描(不扫描进程,仅扫描文件系统)

.\loki.exe -p <Directory> --noprocscan

扫描结果会显示:

  • 由 Loki 内置规则命中的威胁(例如:MAL_Ryuk_Ransomware)
  • 由你自定义规则命中的结果(Sample_Rule)
  • 匹配的 IOC 字符串、变量
  • 并生成 .log 文件记录详细内容

适合在大规模主机排查中使用。

YARA 规则结构

在应急响应场景中,YARA 是快速识别恶意文件、定位威胁家族、批量排查主机的重要武器。要写出高质量、低误报、可复用的检测规则,必须理解 YARA 规则的整体结构。

YARA 规则主要由三个部分组成:

  • meta:规则元信息(便于文档化、审计、协作)
  • strings:匹配用的特征(文本/hex/正则)
  • condition:触发规则的逻辑条件

下面我们用实战视角逐一拆解。

rule MAL_Ransom_Sample
{
    meta:
        author = "zgao"
        description = "Sample rule"
        date = "2099-09-09"
        reference = "https://zgao.top"

    strings:
        $str = "Pattern snippet"
        $hex = { 7a 67 61 6f 2e 74 6f 70 }     // zgao.top 字符串的十六进制
        $regex = /https:\/\/www\.[A-Za-z]+\.com/

    condition:
        any of ($str, $hex, $regex) and filesize < 1MB
}

规则声明(Rule Declaration)

每条规则都从 rule 关键字开始,后跟唯一、清晰的规则名。

YARA 本身不限制规则名格式,但在应急响应与威胁情报共享中,约定俗成的命名规范可以大幅提高可读性,例如:

MAL_Ransom_Ryuk_LNX_July2024
  • MAL:威胁类型(Malware / Exploit / Tooling)
  • Ransom:恶意软件类别
  • Ryuk:恶意家族名称
  • LNX:目标平台
  • July2024:版本或识别时间

这样的命名方式能让团队快速识别规则来源和目的。

Metadata(元数据)

meta 结构保存规则的说明信息,用于审计、追踪、知识库管理。

典型字段(应急响应常用):

  • author:编写者
  • description:规则目标,如“Ryuk勒索笔迹检测”
  • date:规则创建或更新时间
  • reference:相关样本、报告或链接
  • hash:目标样本哈希(便于复现)
  • version:规则版本
  • severity:严重程度
  • confidence:置信度(内部使用)

这些信息非常重要,尤其是在多团队协作、需要可溯源的情况下。

Strings(特征字符串)

strings 是规则最核心的部分,用来定义匹配模式。

YARA 支持三类内容:

类型用法典型用途
文本 "text"简单字符匹配固定字符串、可读文本
Hex { 7a 67 61 6f ... }十六进制模式PE 结构、opcode、embedded config
正则 /https:\/\/.*\.com/灵活匹配URL、域名、动态特征
  • $str:搜索 ASCII 字符串
  • $hex:用十六进制标识“zgao.top”
  • $regex:正则匹配 https://wwwXXX.com 格式的 URL

每个字符串都会给一个名字 ($str1, $config, $url),用于在 condition 中引用。

Condition(规则触发逻辑

这是规则判断命中与否的核心逻辑,通常根据以下类别组合:

常见逻辑:

  • all of them — 所有字符串都命中
  • any of them — 任意一个命中
  • n of them — 至少 n 个命中

分组使用:

any of ($a, $b, $c)
all of ($config*, $url*)

适用于多个同类特征。

应急响应中非常常用,例如:

  • filesize < 1MB — 过滤大文件
  • uint16(0) == 0x5A4D — 检查 MZ 头(小端)
  • uint16be(0) == 0x4D5A — 大端格式的 MZ

按照示例规则逻辑,规则会命中当:

  1. 文件小于 1MB
  2. 文件开头是 Windows 可执行文件(MZ 头)
  3. $str$hex$regex 中任意一个匹配

这是典型的 执行文件初筛 + IOC 特征匹配 的组合方式。

YARA 的修饰符(Modifiers)与模块(Modules)

在应急响应中,当我们分析恶意样本、进行内网大规模 IOC 扫描、或编写检测规则时,通常需要应对大量经过混淆、编码、变形的恶意特征。YARA 的 修饰符 (modifiers)模块 (modules) 能帮助规则变得更精准、更灵活、更适合真实战场环境。

修饰符用于改变字符串(patterns)的匹配方式。它们的目的非常明确:让 YARA 能命中经过变形、编码、混淆的恶意特征

nocase(忽略大小写)

适用于威胁行为者尝试改变大小写来躲避检测的场景,例如:

  • CamelCase
  • snake_case
  • ALLCAPS
  • mixedCase

IR 中非常常见,例如:
PowerShell, PoWeRShElL, powershell 都需要识别。

wide(匹配 Unicode/UTF-16 字符)

Windows 程序和文档常用 UTF-16 LE 存储文本。
恶意样本中“关键字符串被 Unicode 编码”是非常普遍的混淆方式。

例如:
M Z 会以 4D 00 5A 00 存在。

wide 对 PE 样本分析非常重要。

fullword(只匹配完整词语)

避免误报的关键修饰符。

例如要匹配:

cmd

但不希望匹配到:

command, scmd.exe, cmdline

使用 fullword 可以让 YARA 在:

[非字母数字字符]cmd[非字母数字字符]

之间才算命中。适用于防止大规模内网扫描时误报过多。

base64 / base64wide(匹配 Base64 编码内容)

应急场景中常见:

  • 恶意 PowerShell 脚本被 Base64 混淆
  • 恶意宏内嵌 Base64 payload
  • C2 通信中使用 Base64

使用 base64wide 则用于 UTF-16 Base64 形式。适合检测:

  • CobaltStrike 配置
  • loader 阶段的 encoded shellcode
  • 恶意 payload 片段

xor(匹配 XOR 混淆内容)

非常重要,90% 的小型恶意样本都会通过简单 XOR 混淆敏感字符串。

例如:

  • C2 域名
  • “cmd.exe”, “powershell”
  • 配置文件中的关键字

使用 xor 可以自动尝试所有单字节键值(0x00-0xFF)。这在 IR 过程中对付轻量恶意样本非常有效。

ascii(仅匹配 ASCII 文本)

默认就是 ASCII,但可用于明确告诉 YARA:
不要尝试 wide/unicode 匹配

用于:

  • 减少误报
  • 提升扫描性能(企业大规模扫描时)

修饰符可组合

例如:

$cmd = "powershell" nocase wide

表示要命中:

  • wide 编码
  • 不区分大小写
  • unicode 中的 powershell

这是 IR 中最常见的组合之一。

模块为 YARA 提供更高级的解析能力,使其能理解复杂文件结构,尤其对应急场景非常关键。以下模块都是 IR 中非常、非常常用的。

PE 模块(解析 Windows EXE/DLL 样本)

用来检测:

  • PE headers
  • sections
  • imports / exports
  • imphash
  • 编译时间
  • 是否 32/64 位

常用 IR 场景:

  • 检测恶意 Loader 的导入表异常
  • 利用 imphash 找家族相似样本
  • 识别伪造时间戳(未来时间、1970 年时间)
  • 检查特定导入(如 VirtualAlloc/InternetOpenA 等)

例子中展示了:

pe.imports()
pe.exports()
pe.is_64bit()
pe.number_of_sections

这些在鉴别恶意样本非常核心。

ELF 模块(分析 Linux 恶意程序)

因为越来越多攻击者针对 Linux:

  • Cryptominer
  • backdoor
  • C2 implant
  • rootkit 组件

例子展示了检测 ELF 64-bit x86_64

非常适合:

  • 云原生环境(容器、K8s)
  • Linux 主机入侵分析

math 模块(用于分析文件熵等)

熵高 → 文件被压缩、加密、混淆
例如:

  • packer
  • shellcode
  • loader
  • 加密 payload

例子中:

math.entropy() > 7.5

用于在大规模扫描中快速筛选“可疑高熵样本”。

hash 模块(计算 MD5/SHA1/SHA256)

用于:

  • 精准匹配已知恶意样本
  • 验证文件完整性
  • 做恶意文件指纹库(IOC 库)

例子中展示:

hash.md5()

注意:哈希必须小写(yara 语法要求)

magic 模块(文件类型识别)

类似 Linux 的 file 命令。

用于检测“文件类型伪装”的场景:

  • .txt 外壳包着 .exe
  • 恶意文件改扩展名混淆
  • 非法 MIME 类型

适用于 IR 排查时识别:

  • 冒充图片的脚本
  • 假 zip
  • 假 pdf
  • 假 png

注意:Windows 中不支持 magic 模块,需要用:

uint16(0) == 0x5A4D

来识别 PE 头。

time 模块(检测 PE 时间戳)

在恶意样本中常见:

  • 编译时间设成未来时间
  • 全部设成同一时间(偷懒行为)
  • 1970 年(默认值)
  • 与实际行为不匹配的时间

图中展示了一条检测 PE 文件编译的时间戳,这是蓝队常用技巧。

YARA在实战中的规则解析

在应急响应中,YARA 规则被大量用于:

  • 快速识别正在被利用的恶意样本
  • 对主机进行 IOC 扫描
  • 对文件进行“威胁狩猎”式检测
  • 识别同家族的变种样本

本节内容展示了真实世界中用于检测热门恶意软件(如 PikaBot、BadRabbit)的规则,并解释了它们的结构设计、逻辑考量,以及如何在实战中借鉴。

PikaBot 规则解析(Loader + Payload)

展示的规则文件包含 三个 YARA 规则

  • PikaBotLoader(加载器检测)
  • PikaBot(有效载荷检测)
  • Pik23

这是威胁检测中非常典型的策略:恶意软件生命周期的不同阶段有不同的特征,因此需要分别检测。

Meta 元数据

Meta 字段描述了规则来源与用途,包括:

  • author:规则作者 Kevoreilly(知名恶意软件分析研究员)
  • cape_type:此规则适用于 CAPE 沙箱中的哪个类别
  • packed hash:恶意文件样本的哈希值

在 IR 工作中,Meta 信息用于:

  • 溯源规则来源
  • 识别分析样本版本
  • 支持规则管理平台(SOAR/EDR/YARA repo)

Strings(字符串特征)

所有列出的字符串都是 十六进制字节序列,通常来自以下来源:

  • 样本的关键逻辑片段
  • 函数指令序列
  • 特定“恶意行为片段”

这类序列通常难以被攻击者通过简单的混淆彻底隐藏,因此是高级 YARA 检测中常用的高稳定特征。

Condition(触发条件)

条件中要求:

uint16(0) == 0x5A4D   → 文件必须是 PE 文件(MZ 头)
至少两个特征字符串命中

这体现了实战检测的一条黄金法则:

“多个中置信度较高的字符串组合,能降低误报,同时保持较强的泛化能力。”

也就是说,至少有两个行为特征匹配,才能确定命中 PikaBot。

BadRabbit 勒索软件规则解析

https://github.com/Neo23x0/signature-base/blob/master/yara/crime_badrabbit.yar

第二个 YARA 示例来自 Neo23x0 的 signature-base,这是全球最广泛使用的安全检测规则库之一。

Meta

BadRabbit 规则的 Meta 字段包含:

  • 规则描述(BadRabbit 勒索软件)
  • 作者(Florian Roth,signature-base 作者)
  • 参考链接
  • 恶意样本哈希

这些帮助 IR 工程师快速知道:

  • 该规则是否可靠
  • 是否有外部验证
  • 可以从哪里查找更多样本与背景信息

Strings(分两类:高置信度 vs 低置信度)

规则将字符串拆分成:

$x* → 高置信度特征字符串

通常是唯一性很高的构件,例如:

  • 特定路径
  • 任务计划名称
  • 被恶意软件固定使用的文件名

$s* → 较低置信度的特征

例如:

  • 注册表路径片段
  • 系统 API 名称
  • 常见的错误信息或提示文本

这样分层的好处:“检测更灵活,误报更可控。”

规则条件(Condition)

该规则的触发条件为:

文件是 PE(MZ 头)
文件小于 700KB
满足以下之一:
    至少 1 个高置信度字符串($x*)
    或 至少 2 个任意字符串($x* + $s*)

这是威胁检测领域非常典型的“分层置信度策略”。

简单总结就是:

  • 优先用高置信度强指纹快速命中
  • 如果是弱特征,则至少需要两个组合匹配以减少误报
  • 添加了文件大小约束来进一步优化查杀的精确度

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论