Skip to main content

高级妥协指标 (IOC) 提取器。

项目描述

由 InQuest 开发 构建状态 文件状态 代码健康 测试覆盖率 派皮版本

高级妥协指标(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

@例子com

. -> (.)

我@example(.)com

@例子com

. -> {.}

@例子{ }com

@例子com

. -> _dot_

@ example.com _

@例子com

@ -> [@]

我[@]example.com

@例子com

@ -> (@)

我(@)example.com

@例子com

@ -> {@}

我{ @ }例子com

@例子com

@ -> _at_

我在 example.com

@例子com

部分的

我@} 例子[.com

@例子com

添加了空格

@示例[.] com

@例子com

任意组合

我@example [.)com

@例子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 正则表达式是使用@deadpixibase64 正则表达式工具生成的。

自定义正则表达式

如果您想使用 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 (14.8 kB 查看哈希

已上传 source

内置分布

iocextract-1.13.1-py2.py3-none-any.whl (12.7 kB 查看哈希

已上传 py2 py3