PyFunnels:信息安全工作流的数据标准化利器

PyFunnels是一个Python3库,专为信息安全专业人员设计,用于从多种工具输出中提取和标准化数据点(如域名、IP地址等)。它通过模块化架构支持工具扩展,减少重复解析工作,提升工作流效率。

PyFunnels:信息安全工作流的数据标准化

TJ Nicholls // BHIS 特邀撰稿人

摘要

您是否曾多次解析同一工具的输出?是否希望找回这些时间?信息安全专业人员使用的工具和工作流存在大量重叠。我们不必每次从工具提取数据时都重新发明轮子。

PyFunnels 可作为集中化协作库。享受他人劳动的成果?如果功能尚未支持,考虑将您的 Python3 代码提交到 GitHub 库供未来使用。以下是一个快速入门示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
pip install pyfunnels

from PyFunnels import PyFunnels
# 在字典中指定每个工具的输出文件。
source_files = {
   "spiderfoot":"/path/to/file/spiderfoot.db",
   "nmap":"/path/to/file/nmap_results.xml",
   "TheHarvester":"/path/to/file/theharvester-tester.xml"
}
# 创建 PyFunnels 对象。
PyF = PyFunnels.Funnel(source_files)
# 使用它进行处理
domains = PyF.funnel_data("domains")
for d in domains:
    pass # 您的用例在此处。

当前支持的工具和数据点可通过方法查看:

1
2
3
PyF = PyFunnels.Funnel()
capabilities = PyF.get_capabilities()
print(capabilities)

项目启动

作为 SANS 信息安全管理工程硕士(MSISE)的一部分,我最近启动了一个新项目。项目需要解决安全领域尚未解决的问题。我为自己设定了一个优先事项:这将是一个 Python 编码项目,因为这是我需要提升的技能集。

在学习与 CIS 关键控制相关的 SANS 课程时,我了解到实施安全控制的一个关键成功因素是自动化。这样,当您转向新项目时,控制措施仍能持续。这是扩展安全性的好方法,也是我一直尝试融入项目的内容。考虑到这一点,我还希望项目有助于自动化。

那么,什么符合这个范围且尚未解决?这对我来说是一个具有挑战性的问题。我开始头脑风暴我定期执行的任务以及能让生活更轻松的流程。我向同事发出了一些试探,并与导师进行了反复讨论。

一个早期的想法是找出如何规范化事件或案例中的指标,以便将相关数据集成到工具中并可能共享。通过一些谷歌搜索,我很快发现了安全事件响应平台(SIRP),如 theHive 项目。这既是成功也是失败。该死,有人已经做了。哦,哇,太酷了,有人已经做了!

然后我开始思考一种规范化工具输出的方法。我相信这是我们作为信息安全专业人员在自己工作流中不断重新发明的东西。换句话说,我们使用的工具有很多重叠。如果您和我想枚举网络块的域和子域,很可能我们在该过程中至少使用一个相同的工具。所以我的想法是,当解析输出已经被做了上百次时,为什么要重做这项工作。解析输出通常没有什么特别困难,特别是如果您只使用一个工具。但我们有更好的事情要做,如果您使用多个工具来提高发现的保真度,任务开始花费更多时间。

PyFunnels

PyFunnels 登场。PyFunnels 是一个 Python3 库,旨在从工具聚合数据并返回统一数据集。尽管工具的输出可能不标准,但我们可以构建可靠的方法来检索数据。

考虑我们有一个或多个用于收集数据的工具。工具通常具有包含多个数据点的输出。当我说“数据点”时,我简单地指的是 IP 地址、URL、域名、电子邮件、文件、登录页面等。

想法是隔离这些数据点。您为每个工具这样做的方式会不同,但我们需要一种统一的方法从每个输出获取数据点。这确实是 PyFunnels 的核心,创建和存储代码以隔离数据。然后对隔离的数据进行去重和聚合。然后可以针对任何用例利用该聚合数据。

以下是我刚才描述的动画视图: 动画 1:PyFunnels 概念

示例场景

以一个使用五个工具收集域和子域的示例为例(我知道是过度杀伤)。目标是使用输出来比较发现的域与已知清单。一旦我们有了该信息,我们可以根据需要继续进行修复,停用未经批准的服务或向它们添加适当的保护。理想情况下,这是一个持续且自动化的过程,并在有发现时生成警报。

PyFunnels 的目标是加快提取数据的过程。以下是流程:

  1. 指定输出文件(图 1)
  2. 实例化对象(图 1)
  3. 在对象上调用方法,提供感兴趣的数据点(图 2)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from PyFunnels import PyFunnels
# 在字典中指定每个工具的输出文件。
source_files = {
   "spiderfoot":"/path/to/file/spiderfoot.db",
   "recon_ng":"/path/to/file/recon-ng-tester.db",
   "TheHarvester":"/path/to/file/theharvester-tester.xml",
   "photon":"/path/to/directory/photon_results/",
   "nmap":"/path/to/file/nmap_results.xml"
}
# 创建 PyFunnels 对象。
PyF = PyFunnels.Funnel(source_files)

图 1:示例设置

PyFunnels 将返回去重和聚合的数据作为列表(图 2)。

1
2
3
4
5
domains = PyF.funnel_data("domains")
print(domains)
输出: ['example.com', 'partner.com', 'related.com']
for d in domains:
    pass # 您的用例在此处。

图 2:示例输出

就这样… 继续您的一天… 让数据工作… 您不需要重新发明轮子。毕竟,您可能不是第一个从该输出文件解析此数据的人。使用 PyFunnels 节省时间,并使用您或其他人先前提交的代码。

思考过程与经验教训

PyFunnels 的设计是模块化的,每个工具是自己的类,每个数据点是该类的方法。工具类彼此独立工作。您不必为工具构建所有方法。理想情况下,每个工具都支持它收集的每个数据点,但这可以有机地发生。以这种方式布局库使得任何级别的程序员都容易贡献,并允许 PyFunnels 容纳不可预见的工具数量。

这是我第一个真正的编码项目。在我确定想法后,我就开始运行它。我遇到的一个早期问题是我发现自己在调用每个工具时重用代码块。我不知道布局类和方法的最佳方式。经过同行评审和一些研究,我能够将 147 行代码压缩到 12 行。这对我来说是一个巨大的时刻,对于库的增长是必要的。我在这里学到的教训是,如果您有一个想法,开始将其组合在一起。代码最初可能看起来不太好,但您可以在开发过程中改进和完善。

结论

信息安全是一个独特的领域,我们不需要彼此竞争。跨行业,在同一行业内,不竞争符合我们的最佳利益。这是该项目的一个大动机,我想找到一种协作方式并为社区提供价值。

我相信随着一些社区的采用,这可以变得非常强大。PyFunnels 的概念可以简化为:当您编写 Python3 代码从工具隔离数据时,提交代码以便重用。

我的目标是让 PyFunnels 对其他专业人员有用,并增长以支持大量工具和数据点。如果您使用该库和/或查看代码,我很乐意收到反馈。编码对我来说是新的,我确信我的实现可以改进。

感谢阅读,我希望您发现该库有用并能在您的工作流中使用它。

PyFunnels 库可以在以下位置找到:

我作为 MSISE 一部分撰写的完整论文可以在以下位置找到:

注意:自撰写论文以来,我已打包库并进行修改。请参考 Github 和库内的文档以获取当前使用示例

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计