基于IOC和YARA的扫描器,通过文件名正则表达式、YARA签名、哈希匹配以及端点上的C2回连检测,来识别入侵指标。
我编写了一个名为 LOKI RS(Rust)的新开源 YARA 扫描器。 LOKI (Python) 现已正式废弃。
该项目现已进入非活跃维护模式。这意味着我会合并针对错误修复和简单问题的拉取请求,但目前没有时间添加新功能或扩展现有功能。多年来,我一直在开发一款更先进的扫描器 THOR,它在很多方面都优于本项目。有一款免费版本 THOR Lite 可供使用;它速度更快、更稳定,并在我们的 CI 环境中经过严格测试——是一个更好的解决方案。您可以在此处找到开源、免费和商业扫描器的对比:此处。
我还开始开发一个基于 Rust 的 LOKI 版本,名为 LOKI 2。不过,我不确定它何时能达到当前 LOKI 版本的功能完整度。此外,我创建了一个流程图,帮助您决定哪个扫描器最适合您的需求。

简易入侵指标扫描器
检测基于四种检测方法:
1. 文件名 IOC
对完整文件路径/名称进行正则匹配
2. Yara 规则检查
对文件数据和进程内存进行 Yara 签名匹配
3. 哈希检查
将已知恶意哈希(MD5、SHA1、SHA256)与扫描文件进行比对
4. C2 回连检查
将进程连接端点与 C2 IOC 进行比对(自 v10 版起新增)
额外检查:
1. Regin 文件系统检查(通过 --reginfs)
2. 进程异常检查(基于 [Sysforensics](http://goo.gl/P99QZQ))
3. SWF 解压扫描(自 v0.8 版起新增)
4. SAM 转储检查
Windows 二进制文件由 PyInstaller 编译,应作为 x86 应用程序在 x86 和 x64 系统上运行。
如果使用编译后的 EXE,则不需要任何要求。
如果要自己构建:
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] [--nolisten]
[--excludeprocess EXCLUDEPROCESS] [--force]
Loki - 简易 IOC 扫描器
optional arguments:
-h, --help 显示此帮助信息并退出
-p path 要扫描的路径
-s kilobyte 要检查的最大文件大小(KB,默认 5000 KB)
-l log-file 日志文件
-r remote-loghost 远程 syslog 系统
-t remote-syslog-port 远程 syslog 端口
-a alert-level 告警分数
-w warning-level 警告分数
-n notice-level 通知分数
--allhds 扫描所有本地硬盘(仅限 Windows)
--alldrives 扫描所有驱动器(包括网络驱动器和可移动介质)
--printall 打印所有已扫描的文件
--allreasons 打印导致分数的所有原因
--noprocscan 跳过进程扫描
--nofilescan 跳过文件扫描
--vulnchecks 运行漏洞检查
--nolevcheck 跳过 Levenshtein 距离检查
--scriptanalysis 对脚本进行统计分析以检测混淆代码(beta)
--rootkit 跳过 rootkit 检查
--noindicator 不显示进度指示器
--dontwait 退出时不等待
--intense 高强度扫描模式(也扫描未知文件类型和所有扩展名)
--csv 以 CSV 日志格式输出到 STDOUT(机器处理)
--onlyrelevant 仅打印警告或告警
--nolog 不写入本地日志文件
--update 从 "signature-base" 子仓库更新签名
--debug 调试输出
--maxworkingset MAXWORKINGSET
要扫描的进程最大工作集大小(MB,默认 100 MB)
--syslogtcp 使用 TCP 而非 UDP 进行 syslog 日志记录
--logfolder log-folder
未指定日志文件时用于日志记录的文件夹
--nopesieve 不执行 pe-sieve 扫描
--pesieveshellc 执行 pe-sieve shellcode 扫描
--nolisten 不显示侦听连接
--excludeprocess EXCLUDEPROCESS
指定要从扫描中排除的可执行文件名称,可多次使用
--force 强制扫描特定文件夹(即使被 LOKI 代码中的硬排除项排除)
自 0.15 版起,Yara 签名位于子仓库 signature-base 中。通过 ZIP 文件下载 LOKI 时不会获得子仓库。克隆仓库时它将包含在内。
哈希和文件名的 IOC 文件存储在 './signature-base/iocs' 文件夹中。所有放置在 './signature-base/yara' 文件夹中的 '.yar' 文件将与已包含的规则集一起初始化。使用 'score' 值定义签名匹配时的消息级别。
您可以通过将文件添加到 './signature-base/iocs' 子文件夹来添加哈希、C2 和文件名 IOC。所有哈希 IOC 和文件名 IOC 文件必须采用 LOKI 使用的格式(参见默认文件)。文件名中必须包含字符串 "hash"、"filename" 或 "c2" 才能在初始化时被加载。
对于哈希 IOC(按换行符分隔;哈希类型自动检测)
Hash;Description [Reference]
对于文件名 IOC(按换行符分隔)
# (optional) Description [Reference]
Filename as Regex[;Score as integer[;False-positive as Regex]]
自 v0.16.2 版起,LOKI 支持通过 "./config" 文件夹中的 "excludes.cfg" 定义用户自定义排除项。每一行是一个正则表达式,应用于目录遍历期间的完整文件路径。这样您可以排除某些目录(无论其驱动器名称如何)、某些文件夹中的文件扩展名以及属于对防病毒扫描敏感的产品中的所有文件和目录。
'''exclude.cfg''' 内容如下:
# Excluded directories
#
# - add directories you want to exclude from the scan
# - double escape back slashes
# - values are case-insensitive
# - remember to use back slashes on Windows and slashes on Linux / Unix / OSX
# - each line contains a regex that matches somewhere in the full path (case insensitive)
# e.g.:
# Regex: \\System32\\
# Matches C:\Windows\System32\cmd.exe
#
# Regex: /var/log/[^/]+\.log
# Matches: /var/log/test.log
# Not Matches: /var/log/test.gz
#
# Useful examples
\\Ntfrs\\
\\Ntds\\
\\EDB[^\.]+\.log
Sysvol\\Staging\\Nntfrs_cmp
\\System Volume Information\\DFSR
Loki 扫描

Regin 匹配

Regin 误报

基于哈希的 IOC

基于文件名的 IOC

生成的日志文件

LOKI 扫描器公司主页 https://www.nextron-systems.com/loki/
Twitter @cyb3rOps @thor_scanner
如果您对 APT 扫描的企业解决方案感兴趣,请查看 Loki 的“大哥” THOR。
下载 PyInstaller,切换到 pyinstaller 程序目录并执行:
python ./pyinstaller.py -F C:\path\to\loki.py
这将在子文件夹 ./loki/dist 中创建 loki.exe。
要包含 msvcr100.dll 以提高目标操作系统兼容性,请将文件 ./loki/loki.spec 中包含 a.binaries, 的行修改为:
a.binaries + [('msvcr100.dll', 'C:\Windows\System32\msvcr100.dll', 'BINARY')],
venv,然后运行 python -m venv path/to/venv,其中 path/to/venv 是虚拟环境的路径。通过运行 path/to/venv/bin/python --version 测试您的虚拟环境。
升级虚拟环境模块 pip、setuptools 和 wheel:运行 path/to/venv/bin/python -m pip install --upgrade pip setuptools wheel。path/to/venv/bin/python -m pip install colorama yara-python psutil rfc5424-logging-handler netaddrpath/to/venv/bin/python path/to/loki/loki-upgrader.py,其中 path/to/loki 是 Loki 仓库的路径。sudo path/to/venv/bin/python loki.py从此处下载 Yara 源码:此处
编译后的扫描器可能会被防病毒引擎检测到。这是因为扫描器是一个编译后的 Python 脚本,实现了某些文件系统和进程扫描功能,这些功能也常用于编译后的恶意软件代码。
如果您不信任编译后的可执行文件,请自行编译。
Loki - 简易 IOC 扫描器 版权所有 (c) 2015 Florian Roth
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/