高级妥协指标 (IOC) 提取器。
项目描述
高级妥协指标(IOC) 提取器。
概述
该库从文本语料库中提取 URL、IP 地址、MD5/SHA 哈希、电子邮件地址和 YARA 规则。它在输出中包含一些编码和“去齿”的 IOC,并且可以选择对它们进行解码/重排。
问题
恶意软件分析师或端点软件通常会“去除” IOC,例如 URL 和 IP 地址,以防止意外暴露于实时恶意内容。能够提取和汇总这些 IOC 通常对分析师很有价值。不幸的是,现有的“IOC 提取”工具经常被它们忽略,因为它们没有被标准正则表达式捕获。
例如,用括号括住句号的简单去牙技术:
127[.]0[.]0[.]1
使用简单 IP 地址正则表达式的现有工具将完全忽略此 IOC。
解决方案
通过将特制的正则表达式与一些自定义的后处理相结合,我们能够检测和去混淆“去牙印”的 IOC。这为分析师节省了时间和精力,否则他们可能不得不手动查找 IOC 并将其转换为机器可读的格式。
一个简单的用例
许多 Twitter 用户使用不正确的 URL 发布 C2 或其他有价值的 IOC 信息。例如,来自@InQuest 的这条推文:
Recommended reading and great work from @unit42_intel: https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ... InQuest customers have had detection for threats delivered from hotfixmsupload[.]com since 6/3/2017 and cdnverify[.]net since 2/1/18.
如果我们通过提取器运行它,我们可以轻松地提取 URL:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ hotfixmsupload[.]com cdnverify[.]net
在提取时传入refang =True会消除混淆,但由于这些是真正的 IOC,所以让我们在文档中将它们去除。:)
安装
您可能需要安装 Python 开发头文件才能安装 正则表达式依赖项。在基于 Ubuntu/Debian 的系统上,尝试:
sudo apt-get install python-dev
然后从 pip安装iocextract :
pip install iocextract
如果您在 Windows 上安装时遇到问题,请尝试通过从 PyPI下载适当的轮子并运行例如直接安装正则表达式:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
用法
尝试提取一些损坏的 URL:
>>> content = """ ... I really love example[.]com! ... All the bots are on hxxp://example.com/bad/url these days. ... C2: tcp://example[.]com:8989/bad ... """ >>> import iocextract >>> 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 被多个正则表达式捕获,它们可能会显示两次。
如果你愿意,你也可以“refang”,或者从 IOC 中移除常见的混淆方法:
>>> 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
您甚至可以提取和解码十六进制编码和 base64 编码的 URL:
>>> content = '612062756e6368206f6620776f72647320687474703a2f2f6578616d706c652e636f6d2f70617468206d6f726520776f726473' >>> for url in iocextract.extract_urls(content): ... print url ... 687474703a2f2f6578616d706c652e636f6d2f70617468 >>> for url in iocextract.extract_urls(content, refang=True): ... print url ... http://example.com/path
此库中的所有extract_*函数都返回迭代器,而不是列表。这种行为的好处是iocextract可以以非常低的开销处理非常大的输入。但是,如果由于某种原因您需要多次迭代 IOC,则必须将结果保存为列表:
>>> 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]
Advanced Indicator of Compromise (IOC) extractor. If no arguments are
specified, the default behavior is to extract all IOCs.
optional arguments:
-h, --help show this help message and exit
--input INPUT default: stdin
--output OUTPUT default: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE
file with custom regex strings, one per line, with one
capture group each
--refang default: no
--strip-urls remove possible garbage from the end of urls. default:
no
--wide preprocess input to allow wide-encoded character
matches. default: no
只有 URL、电子邮件和 IPv4 地址可以“重新命名”。
我应该使用iocextract吗?
你是…
从纯文本中提取可能有缺陷的 IOC,例如推文或博客文章的内容?
是的!这正是 iocextract 的设计目的,也是它表现最好的地方。想要更进一步并自动化提取和存储?查看 ThreatIngestor。
提取十六进制或 base64 编码的 URL?
是的,但 CLI 可能不会给您最好的结果。尝试编写 Python 脚本并直接调用iocextract.extract_encoded_urls。
请注意,您很可能会在 URL 的末尾添加额外的垃圾。
从 HTML/XML/RTF 中提取未去牙的 IOC?
也许吧,但是您应该考虑使用--strip-urls CLI 标志(或库中的 strip=True参数),并且您可能仍然会在输出中得到一些额外的垃圾。
如果您从 HTML 中提取,请考虑使用Beautiful Soup之类的东西 来首先隔离文本内容,然后将其传递给 iocextract, 就像这样。
从可执行文件之类的二进制数据或非常大的输入中提取尚未除齿的 IOC?
可能不是。iocextract 中的正则表达式旨在灵活地捕获有缺陷的 IOC,因此它的性能明显低于旨在仅捕获标准 IOC 的解决方案。
考虑改用Cacador之类的东西。
更多细节
该库当前支持以下 IOC:
- IP 地址
完全支持 IPv4
部分支持 IPv6
- 网址
带协议说明符:http、https、tcp、udp、ftp、sftp、ftps
使用[.]锚点,即使没有协议说明符
支持 IPv4 和 IPv6 (RFC2732) URL
带有协议说明符的十六进制编码 URL:http、https、ftp
带有协议说明符的 URL 编码 URL:http、https、ftp、ftps、sftp
带有协议说明符的 Base64 编码 URL:http、https、ftp
- 电子邮件
部分支持,锚定在@或at
- 雅拉规则
带有导入、包含和注释
- 哈希
MD5
SHA1
SHA256
SHA512
- 自定义正则表达式
只有一个捕获组
对于 IPv4 地址,支持以下 defang 技术:
技术 |
去牙的 |
重牙 |
|---|---|---|
. -> [。] |
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 |
对于电子邮件地址,支持以下 defang 技术:
技术 |
去牙的 |
重牙 |
|---|---|---|
. -> [。] |
我@example[.]com |
|
. -> (.) |
我@example(.)com |
|
. -> {.} |
||
. -> _dot_ |
||
@ -> [@] |
我[@]example.com |
|
@ -> (@) |
我(@)example.com |
|
@ -> {@} |
||
@ -> _at_ |
我在 example.com |
|
部分的 |
我@} 例子[.com |
|
添加了空格 |
我@示例[.] com |
|
任意组合 |
我@example [.)com |
对于 URL,支持以下 defang 技术:
技术 |
去牙的 |
重牙 |
|---|---|---|
. -> [。] |
示例[.]com/path |
http://example.com/path |
. -> (.) |
示例(.)com/path |
http://example.com/path |
. -> \。 |
示例\.com/path |
http://example.com/path |
部分的 |
http://example[.com/path |
http://example.com/path |
/ -> [/] |
http://example.com[/] 路径 |
http://example.com/path |
http://示例 .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__ 示例(.com[/] 路径 |
http://example.com/path |
十六进制编码 |
687474703a2f2f6578616d706c652e636f6d2f70617468 |
http://example.com/path |
网址编码 |
http%3A%2F%2fexample%2Ecom%2Fpath |
http://example.com/path |
Base64 编码 |
aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK |
http://example.com/path |
请注意,上面的表格并不详尽,也可以正确提取其他 URL/defang 模式。如果您发现缺少某些内容或无法正常工作,请随时通过 GitHub问题告诉我们。
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
变更日志
每个版本的新功能、改进和错误修复都可以在 GitHub 版本中找到。
贡献
如果你有一个无法通过提取器的去牙技术,或者如果你发现任何错误,PR 和问题总是受欢迎的。该库是在“BSD-New”(又名“BSD 3-Clause”)许可下发布的。
谁在使用 iocextract
你在用吗?想在此处查看您的网站吗?让我们知道!
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置分布
iocextract -1.13.1.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 8b45ee9547ab32a056a4dcaf762def88b776bb69f65e53b4ecd27d742965ff15 |
|
| MD5 | 92386afc30a7901e15140415c77d0e42 |
|
| 布莱克2-256 | e9df18b782b6d761834c21b2b188a521adc52efa159f7e1b2fbfaebaa7752dce |
iocextract -1.13.1-py2.py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 5d33d4eb48cc96887bf18a81cd57bee5779b1f18e0dcb0c1dede9716c930ef54 |
|
| MD5 | f26f8b6f06116a04f21e59b175141bd4 |
|
| 布莱克2-256 | b0cd6c76133aa7d430d320d33034d1550475e412f1c76e7dedc38204136c9914 |