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’s),如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)
Output: ['example.com', 'partner.com', 'related.com']
for d in domains:
    pass # 您的用例在这里。

图2:示例输出

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

思考过程与经验教训

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

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

结论

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

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

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

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

PyFunnels库可以在以下位置找到: https://github.com/packetvitality/PyFunnels https://pypi.org/project/PyFunnels/

我作为MSISE一部分撰写的完整论文可以在以下位置找到: https://www.sans.org/reading-room/whitepapers/OpenSource/pyfunnels-data-normalization-infosec-workflows-38785

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

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