入侵指标 (IOC) 提取器,用于提取一些最常见的入侵工件。
iocextract 是一个库和命令行界面 (CLI),用于从文本语料中提取 URL、IP 地址、MD5/SHA 哈希、电子邮件地址和 YARA 规则。它允许提取编码和"去毒化"的 IOC,并可选地进行解码或复原。
恶意软件分析师或端点软件通常会"去毒化" IOC(如 URL 和 IP 地址),以防止意外暴露于活跃的恶意内容。提取和聚合这些 IOC 对分析师来说通常很有价值。不幸的是,现有的"IOC 提取"工具常常会忽略它们,因为它们无法被标准正则表达式捕获。
例如,用括号包围句点的简单去毒化技术:
127[.]0[.]0[.]1
使用简单 IP 地址正则表达式的现有工具将完全忽略这个 IOC。
通过将精心设计的正则表达式与一些自定义后处理相结合,我们能够检测并反混淆"去毒化"的 IOC。这为分析师节省了时间和精力,否则他们可能需要手动寻找并将 IOC 转换为机器可读格式。
许多 Twitter 用户发布含有去毒化 URL 的 C2 或其他有价值的 IOC 信息。 例如,@InQuest 的这条推文:
推荐阅读,来自 @unit42_intel 的优秀工作:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
InQuest 客户自 2017 年 6 月 3 日起已检测到来自 hotfixmsupload[.]com 的威胁,
自 2018 年 2 月 1 日起检测到来自 cdnverify[.]net 的威胁。
如果我们通过提取器运行这段文本,我们可以轻松提取出 URL:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
在提取时传入 refang=True 会去除混淆,但由于这些是真实的 IOC,我们还是在文档中保留其去毒化形式。
您可能需要安装 Python 开发头文件才能安装 regex 依赖。在基于 Ubuntu/Debian 的系统上,请尝试:
sudo apt-get install python-dev
然后通过 pip 安装 iocextract:
pip install iocextract
如果在 Windows 上安装遇到问题,请尝试直接安装 regex,方法是从 PyPI 下载相应版本的 wheel 并通过 pip 安装:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
尝试提取一些去毒化的 URL:
import iocextract
content = \
"""
我真的很喜欢 example[.]com!
现在所有机器人都访问 hxxp://example.com/bad/url。
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# 输出
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
注意:某些 URL 可能会被多个正则表达式捕获,因而出现两次。
如果需要,您还可以"复原"或去除 IOC 中的常见混淆方法:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# 输出
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
如果您在提取时完全不想去毒化提取到的 IOC,也可以禁用此功能:
import iocextract
content = \
"""
http://example.com/bad/url
http://example.com:8989/bad
http://example.com
http://example.com:8989/bad
"""
for url in iocextract.extract_urls(content, defang=False):
print(url)
# 输出
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
该库中的所有 extract_* 函数返回的是迭代器,而不是列表。这种行为的优点在于 iocextract 可以处理极大的输入,并且开销非常低。但是,如果您由于某些原因需要多次迭代 IOC,则必须将结果保存为列表:
import iocextract
content = \
"""
我真的很喜欢 example[.]com!
现在所有机器人都访问 hxxp://example.com/bad/url。
C2: tcp://example[.]com:8989/bad
"""
print(list(iocextract.extract_urls(content)))
# ['hxxp://example.com/bad/url', 'tcp://example[.]com:8989/bad', 'example[.]com', 'tcp://example[.]com:8989/bad']
还包含一个命令行工具:
$ iocextract -h
usage: iocextract [-h] [--input INPUT] [--output OUTPUT] [--extract-emails]
[--extract-ips] [--extract-ipv4s] [--extract-ipv6s]
[--extract-urls] [--extract-yara-rules] [--extract-hashes]
[--custom-regex REGEX_FILE] [--refang] [--strip-urls]
[--wide]
高级入侵指标 (IOC) 提取器。如果未指定任何参数,默认行为是提取所有 IOC。
可选参数:
-h, --help 显示此帮助信息并退出
--input INPUT 默认值:stdin
--output OUTPUT 默认值:stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE 包含自定义正则表达式字符串的文件,每行一个,每个包含一个捕获组
--refang 默认值:否
--strip-urls 移除 URL 末尾可能的垃圾字符。默认值:否
--wide 预处理输入以允许宽编码字符匹配。默认值:否
注意:只有 URL、电子邮件和 IPv4 地址才能被"复原"。
问:你是在提取纯文本(例如推文或博客文章内容)中可能去毒化的 IOC 吗?
答:是的!这正是 iocextract 的设计目的,也是其表现最好的场景。想更进一步,实现自动化提取和存储吗?请查看 ThreatIngestor。
问:你是在提取经过 hex 或 base64 编码的 URL 吗?
答:是的,但 CLI 可能无法给出最佳结果。请尝试编写 Python 脚本并直接调用
iocextract.extract_encoded_urls。
注意:URL 末尾很可能会有额外的垃圾字符。
问:你是在从未去毒化的 HTML/XML/RTF 中提取 IOC 吗?
答:可能可以,但建议使用
--strip-urlsCLI 标志(或库中的strip=True参数),并且输出中仍可能包含一些额外垃圾。如果是从 HTML 中提取,请考虑使用类似 Beautiful Soup 的工具先提取文本内容,再将其传递给 iocextract,就像这样。
问:你是在从二进制数据(如可执行文件)或非常大的输入中提取未去毒化的 IOC 吗?
答:以库的形式运行时有一个非常简单的版本可用,但需要
defang=False参数,并且可能会错过一些 IOC。iocextract 中的正则表达式旨在灵活地捕获去毒化的 IOC。如果您无法收集所需信息,请考虑使用 Cacador 等替代方案。
该库当前支持以下 IOC:
[.] 锚点,即使没有协议说明符@ 或 at 为锚点对于 IPv4 地址,支持以下去毒化技术:
对于电子邮件地址,支持以下去毒化技术:
对于 URL,支持以下去毒化技术:
注意:上表并非详尽无遗,其他 URL/去毒化模式也可能被正确提取。如果您发现缺少或工作不正常的内容,请随时通过 GitHub Issues 告知我们。
base64 正则表达式是使用 @deadpixi 的 base64 正则表达式工具 生成的。
如果您想使用 CLI 通过自己的自定义正则表达式提取 IOC,请创建一个纯文本文件,每行一个正则表达式字符串,然后使用 --custom-regex 标志传入。请确保每个正则表达式字符串恰好包含一个捕获组。
例如:
http://(example\.com)/
(?:https|ftp)://(example\.com)/
这个自定义正则表达式文件将从匹配的 URL 中提取域名 example.com。(?: ) 非捕获组不会包含在匹配结果中。
如果您想提取整个匹配项,只需将整个正则表达式字符串用括号括起来,如下所示:
(https?://.*?.com)
如果您的正则表达式无效,您将看到如下错误信息:
Error in custom regex: missing ) at position 5
如果您的正则表达式不包含捕获组,您将看到如下错误信息:
Error in custom regex: no such group
使用自定义正则表达式时,请始终使用单个捕获组。以下是一个快速示例:
[
r'(my regex)', # 如果模式匹配,则返回 'my regex'
r'my (re)gex', # 如果模式匹配,则返回 're'
]
使用多于一个捕获组可能会导致意外结果。请查看以下示例:
[
r'my regex', # 不返回任何内容
r'(my) (re)gex', # 如果模式匹配,则返回 'my'
]
为什么?因为结果始终只返回每个正则表达式的第一个组匹配。
对于更复杂的正则表达式查询,您可以像这样组合捕获组和非捕获组:
[
r'(?:my|your) (re)gex', # 如果模式匹配,则返回 're'
]
您现在可以比较用于非捕获组的 (?: ) 语法和用于捕获组的 ( ) 语法。
如果 iocextract 不符合您的用例,还有一些类似的项目。请查看 GitHub 上的 defang 和 indicators-of-compromise 标签,以及:
如果您想自动化 IOC 提取、丰富、导出等操作,请查看 ThreatIngestor。
如果您正在使用 YARA 规则,您可能对 plyara 感兴趣。
如果您有一种无法被提取器处理的去毒化技术,或者发现了任何错误,欢迎提交 Pull Requests 和 Issues。该库使用 GPL-2.0 许可证。
您也在使用它吗?希望在此列出您的网站?请告诉我们!
| 技术 | 去毒化 | 复原 |
|---|
. -> [.] | 1[.]1[.]1[.]1 | 1.1.1.1 |
. -> (.) | 1(.)1(.)1(.)1 | 1.1.1.1 |
. -> \. | 1.1.1.1 | 1.1.1.1 |
| 部分去毒 | 1[.1[.1.]1 | 1.1.1.1 |
| 任意组合 | 1.)1[.1.)1 | 1.1.1.1 |
| 技术 | 去毒化 | 复原 |
|---|
. -> [.] | me@example[.]com | [email protected] |
. -> (.) | me@example(.)com | [email protected] |
. -> {.} | me@example{.}com | [email protected] |
. -> _dot_ | me@example dot com | [email protected] |
@ -> [@] | me[@]example.com | [email protected] |
@ -> (@) | me(@)example.com | [email protected] |
@ -> {@} | me{@}example.com | [email protected] |
@ -> _at_ | me at example.com | [email protected] |
| 部分去毒 | me@} example[.com | [email protected] |
| 添加空格 | me@example [.] com | [email protected] |
| 任意组合 | me @example [.)com | [email protected] |
| 技术 | 去毒化 | 复原 |
|---|
. -> [.] | example[.]com/path | http://example.com/path |
. -> (.) | example(.)com/path | http://example.com/path |
. -> \. | example\.com/path | http://example.com/path |
| 部分去毒 | http://example[.com/path | http://example.com/path |
/ -> [/] | http://example.com[/]path | http://example.com/path |
| Cisco ESA | http:// example .com /path | http://example.com/path |
:// -> __ | http__example.com/path | http://example.com/path |
:// -> :\\ | http:\\example.com/path | http://example.com/path |
: -> [:] | http[:]//example.com/path | http://example.com/path |
hxxp | hxxp://example.com/path | http://example.com/path |
| 任意组合 | hxxp__ example( .com[/]path | http://example.com/path |
| Hex 编码 | 687474703a2f2f6578616d706c652e636f6d2f70617468 | http://example.com/path |
| URL 编码 | http%3A%2F%2fexample%2Ecom%2Fpath | http://example.com/path |
| Base64 编码 | aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK | http://example.com/path |