Fragscapy:通过协议Fuzz的方法探测IDS/防火墙检测规则的漏洞

lucywang 安全工具 2019年10月25日发布
Favorite收藏

导语:Fragscapy是一个可以测试防火墙保护能力的工具,旨在通过模糊通过防火墙发送的网络消息来检测防火墙和IDS中的漏洞,该开源项目可从Amossys的Github获得。

hammer.gif

Fragscapy是一个可以测试防火墙保护能力的工具,旨在通过模糊通过防火墙发送的网络消息来检测防火墙和IDS中的漏洞,该开源项目可从Amossys的Github获得。

什么是所谓的“ Fragscapy”?

我们经常分析防火墙和IDS,测试它们的配置可能很耗时。当然,开发了一些基本工具和脚本来自动化这些测试。Fragscapy旨在对这些工具进行现代化和改进,它用自动化,模块化,可扩展和高级的Python 3项目代替了它们。顾名思义,Fragscapy基于Scapy进行网络数据包处理。

简而言之,Fragscapy是一种可以针对防火墙的保护运行连续测试的工具,其背后的原理实际上非常简单。

1.png

Fragscapy的一般原理

Fragscapy运行的过程是:

1.启动将与网络交互的应用程序(如果测试基于HTTP的规则或ping以测试较低层,则通常为wget);

2.拦截传出数据包;

3.对数据包应用一组修改,这是进程中最重要的步骤,这是模糊测试的真正定义所在。目的是获得经过修改的数据包,该数据包经过充分修改可以绕过防火墙检查,但防火墙后面的服务仍然可以理解。

4.发送修改后的数据包并等待回复;

5.从第1步重新启动,但设置不同;

什么是“修改”?

该工具最有趣的部分发生在步骤3的修改中,其余的只是编排这些修改。那么,这些修改会产生任何可能的结果。

实际上,从技术上讲,修改是一种功能,该功能接收一个数据包列表并返回另一个数据包列表。介于两者之间,任何事情都可能发生;可以对数据包进行修改,延迟,丢弃,替换,分割,重新组合……该工具包含一些基本修改,可以执行通用修改,例如:

1.丢包(每个包或特定包的概率固定);

2.延迟数据包;

3.过滤和重新排序数据包;

4.对IPv4和IPv6数据包进行分段(具有一些特殊的选项);

5.分割TCP数据包;

6.修改数据包的任何字段;

有关如何进行这些修改的更多详细信息,可以在fragscapy/modifications/中查看其背后的python代码。

如何使用这个很棒的工具?

示例1:如何发现Linux中未记录的行为

对于第一个用法示例,我们来看一个简单的案例。假设我们具有以下设置,并且希望尝试访问服务器上端口80和8080上的网页,但是有一个iptables防火墙阻止了对端口8080的请求。

2.png

第一个示例的初始情况

让我们配置Fragscapy

现在,我们将通过模糊IPv6碎片来尝试绕过防火墙的安全性。为此,我们需要配置Fragscapy,一切都应通过以下方式配置:

· JSON配置文件(用于测试行为);

· 命令行选项(用于输出、日志和美学);

因此,以下JSON文件(ipv6_frag.json)定义了测试的3个方面:

1.运行命令:一个curl来获取两个端口上的web页面,只有当端口80上的页面可以被获取时,才使用0状态码退出;

2.仅捕获特定数据包的防火墙配置:该工具无法猜测,因此默认情况下会捕获所有内容;

3.要应用的修改列表:可以指定参数,并且INPUT和OUTPUT链上的修改可以不同。

{
  "cmd": "/usr/bin/curl -6 -f -m 1 http://www.example.com:80 -o results/http_{i}_{j}.html; e1=$?; /usr/bin/curl -6 -f -m 1 http://www.example.com:8080 -o results/alt_{i}_{j}.html; e2=$? if [ $e1 -eq 0 && $e2 -ne 0 ]; then return 0; else return 1; fi",

  "nfrules": [
    {"host": "www.example.com", "port": 80, "ipv4": false, "input_chain": false}
  ],

  "input": [
  ],

  "output": [
    {
      "mod_name": "ipv6_frag",
      "mod_opts": "range 10 3000 10"
    }
  ]}

在本示例中,我们计划以10为固定测量长度,对所有数据包进行分段,其分段大小在10到3000字节之间。然后,剩下的就是通过运行以下命令来开始运行测试:

fragscapy start fragment.json \
  -o run/std/stdout_{i}_{j}.txt \
  -e run/std/stderr_{i}_{j}.txt \
  -W run/pcap/local_{i}_{j}.txt \
  -w run/pcap/remote_{i}_{j}.txt

此命令具有多个选项,以指定在何处输出有关每个测试的某些日志(标准输出和错误,数据包捕获)。这样,在测试触发有趣行为的情况下,我们可以轻松地详细检查发生了什么。 {i}和{j}语法只是python格式的语法,它由测试编号和重复编号代替(在测试不确定的情况下,可以重复多次)。

有关可用选项的更多信息,可以运行以下命令以获取每个可能参数的详细信息:

fragscapy --help
fragscapy start --help

结果测试

有多种方法可以检查测试是否正确。首先,fragscapy start命令的输出显示了基于命令的退出代码运行的测试的摘要(0 =通过,其他=失败)。

100%|██████████████████████████████████████████████████████████████████|300/300
Results (300 tests done over 300 scenarios)
==================
Pass : 174
    n°0_0, n°127_0, n°128_0, n°129_0, n°130_0, n°131_0, n°132_0, n°133_0, ...
Fail : 126
    n°1_0, n°2_0, n°3_0, n°4_0, n°5_0, n°6_0, n°7_0, n°8_0, n°9_0, n°10_0, ...
Not Done : 0

这意味着,首先这是一个进度条,用于指示测试过程中的进度。我们可以看到,使用此配置总共要运行300个测试。之后的所有行仅在所有测试完成时显示。它包含3个部分:

1.通过的测试数量(此处为174),然后是通过的第一个测试编号;

2.测试失败的次数(此处为126),然后是第一个失败的测试号码;

3.在测试中间中断的情况下未完成的测试数量(此处为0),然后是未完成的第一个测试编号(如果有);

因此,正如我们在示例中看到的那样,有174个测试通过了含义,端口80上的页面被获取,而端口8080上的页面则没有。但是,奇怪的是,在前126个案例中(碎片大小在10到1270之间),发生了一些事情,这就是我们在命令行中指定的日志的方便位置。

通过查看results/输出目录,我们可以看到端口8080上的页面从未被检索过(\o/iptables完成了它的工作),但是端口80上的页面却在测试#1至#126中丢失了。发生了什么?让我们继续调查。

在run/pcap/ 中,我们捕获了发生的情况。经过简短的研究,似乎以某种方式拒绝了1280字节以下的片段……这可能很奇怪。但是1280可能会敲响警钟,因为这是IPv6数据包的下限大小,这可能不是巧合。

经过检测,确实是的,经过几次搜索,似乎在Linux中引入了小于1280字节的拒绝片段,而没有任何文档或规范“以避免病理情况”。这就是一切的来历:Linux内核删除了这些片段,但没有文档提及它。但是,最近由于兼容性问题在Linux 5.0中对其进行了还原。

以下就是Fragscapy的使用方式:配置,运行测试,分析日志和结果。当然,在这样一个简单的示例中,我们没有揭示iptables的任何缺陷,但是我们揭示了iptables的奇怪行为。

示例2:碎片的正确处理

现在,让我们更深入地使用Fragscapy进行正确的测试。该示例来自真实示例,因此结果只能在此特定设备上重现。测试情况如下:

7.png

真实示例的虚拟配置

我们将从“用户”区域模糊DMZ中的Web服务器。Web应用程序防火墙已配置,因此我们不应发送具有给定参数的请求。让我们运行一些测试,看看会发生什么:

fragment_ipv4.json

{
  "cmd": "/usr/bin/curl -f -m 1 http://www.example.com/index.html?azerty -o results/{i}_{j}.html",

  "nfrules": [
    {"host": "www.example.com", "port": 80, "ipv6": false, "input_chain": false}
  ],

  "input": [
  ],

  "output": [
    {
      "mod_name": "ipv4_frag",
      "mod_opts": "range 1 1000"
    },
    {
      "mod_name": "drop_proba",
      "mod_opts": "seq_float 0.1 0.2 0.3 0.4 0.5",
      "optional": true
    },
    {
      "mod_name": "duplicate",
      "mod_opts": "seq_str first last random",
      "optional": true
    },
    {
      "mod_name": "reorder",
      "mod_opts": "seq_str reverse random",
      "optional": true
    }
  ]}

segment_tcp.json

{
  "cmd": "/usr/bin/curl -f -m 1 http://www.example.com/index.html?azerty -o results/{i}_{j}.html",

  "nfrules": [
    {"host": "www.example.com", "port": 80, "input_chain": false}
  ],

  "input": [
  ],

  "output": [
    {
      "mod_name": "tcp_segment",
      "mod_opts": "range 1 1000"
    },
    {
      "mod_name": "drop_proba",
      "mod_opts": "seq_float 0.1 0.2 0.3 0.4 0.5",
      "optional": true
    },
    {
      "mod_name": "duplicate",
      "mod_opts": "seq_str first last random",
      "optional": true
    },
    {
      "mod_name": "reorder",
      "mod_opts": "seq_str reverse random",
      "optional": true
    }
  ]}
fragscapy start fragment_ipv4.json segment_tcp.json \
  -o run/std/stdout_{i}_{j}.txt \
  -e run/std/stderr_{i}_{j}.txt \
  -W run/pcap/local_{i}_{j}.txt \
  -w run/pcap/remote_{i}_{j}.txt \
  --append

基本上,我们正在运行Fragscapy,以便在请求中使用参数azerty提取index.html(不过这不可能)。但是,我们还在许多不同的配置中搞砸了IPv4分段和TCP分段。在运行144k测试需要许多小时之后,出现了非常有趣的结果:

100%|██████████████████████████████████████████████████████████████|72000|72000
Results (666000 tests done over 72000 scenarios)
==================
Pass : 0

Fail : 666000
    n°0_0, n°1_0, n°2_0, n°2_1, n°2_2, n°2_3, n°2_4, n°2_5, n°2_6, n°2_7, ...
Not Done : 0

100%|██████████████████████████████████████████████████████████████|72000|72000
Results (666000 tests done over 72000 scenarios)
==================
Pass : 98
    n°0_0, n°1_0, n°2_0, n°2_1, n°2_2, n°2_3, n°2_4, n°2_5, n°2_6, n°2_7, ...
Fail : 665987
    n°22_5, n°23_3, n°25_5, n°32_1, n°32_6, n°33_8, n°34_1, n°35_6, n°35_7, ...
Not Done : 0

上半部分显示了IPv4分段的结果,一切都失败了,这意味着防火墙阻止了数据包,或者通过的数据包对Web服务器毫无意义。但是,后半部分处理TCP分段,并显示一些测试设法检索了该网页。确实,在查看了result/目录之后,似乎防火墙无法很好地处理从1到46的分段,并且没有触发阻止规则,而Web服务器正在完美地重建数据并对请求做出响应。

不过,这是此特定防火墙的结果,即可以使用小型分段通过防火墙传输有效数据。这是小范围分析的结果之一,它不能正确地确保承诺的保护措施。

注意:防火墙允许某些错误构造的数据包通过(Web服务器无法理解)的情况是合理的,但实际上并不是Fragscapy可以检测到的。尽管显然这是一个容易解决的安全问题,但Fragscapy的解释却更高:该协议在仍然有效的同时,是否正确绕过了防火墙?但是,可以想象这样一种情况,即防火墙两端使用格式错误的数据包的客户端和服务器。 Fragscapy的测试命令可以从客户端发送数据,并检查在服务器端接收和解释的内容(就像攻击者可以窃取数据一样)。由于Fragscapy不会解释命令的含义,因此对它没有任何影响。

示例3:劫持Fragscapy获得有趣结果

让我们用最后一个有趣的示例来演示Fragscapy可以完成的其他操作。现在我们知道它可以用于对安全产品进行测试并声明其符合性,但是相同的机制也可以用于其他目的。我们将配置Fragscapy看起来像HTTP代理,像HTTP代理那样交谈,而不是HTTP代理。

这实际上非常简单,你只需要使用以下配置文件启动Fragscapy:

{
  "cmd": "while true; do sleep 1; done",

  "nfrules": [
    {"port": 80, "output_chain": false},
    {"port": 8080, "input_chain": false}
  ],

  "input": [
    {
      "mod_name": "field",
      "mod_opts": ["TCP", "sport", 8080]
    },
    {
      "mod_name": "field",
      "mod_opts": ["TCP", "chksum", "none"]
    }
  ],

  "output": [
    {
      "mod_name": "field",
      "mod_opts": ["TCP", "dport", 80]
    },
    {
      "mod_name": "field",
      "mod_opts": ["TCP", "chksum", "none"]
    }
  ]}

此配置有什么作用?其实这只是一个无限循环命令,因此它实际上不会运行任何测试。它会拦截所有从端口8080出站并进入端口80的数据包。然后,它修改端口8080上的传出数据包,使其在端口80上进入并对传入数据包进行反向处理。要对其进行测试,请启动Fragscapy(无需在此处保存输出和数据包捕获):

fragscapy start http_proxy.json

就是如此,现在所有网站都可以通过端口8080而不是80进行访问,至少对于使用HTTP的浏览器和本地工具来说,情况就是这样。你可以转到http://www.example.com:8080,它之所以起作用,是因为你实际上是在端口80上发送数据包。

如何改善Fragscapy?

这个工具真棒,它可以完成许多惊人的技巧!但是它仍然需要改进,你可以在很多方面提供帮助。所有源代码都可以在Amossys的Github上找到,因此请检查一下以进行深入的了解和改进。

添加修改

实际上,该工具的设计使其可以通过新的修改及其附带的精确行为轻松扩展。要添加可以满足自己需求的新修改,只需查看如何定义其他修改,然后按照文档中的说明进行操作(关于fragscapy.modifications.Mod类)。

改善核心引擎

Fragscapy可以看作是围绕修改的大型编排工具。因此,可以改进的工具的关键部分是其核心,即建立一切并连续运行所有测试的代码。坦白地说,与添加修改相比,这部分更难掌握,也不那么直观。

本文翻译自:https://blog.amossys.fr/fragscapy-fuzzing-protocols-to-evade-firewalls.html如若转载,请注明原文地址: https://www.4hou.com/tools/20657.html
点赞 0
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论