文章

绕过下一代防火墙

防火墙是网络安全的关键部分,它充当受信任的内部网络和不受信任的外部网络(如 Internet)之间的屏障。根据预定义的安全规则监控和控制传入和传出的网络流量。

防火墙可以作为硬件设备、软件应用程序或两者的组合来实现。它们有多种用途:

  1. 存取控制: 防火墙根据配置的规则来调节允许或阻止哪些网络连接。
  2. 威胁预防: 它们可以防止各种外部威胁,例如恶意软件、病毒和潜在的黑客攻击。
  3. 流量过滤: 防火墙可以配置为根据各种标准允许或阻止特定类型的网络流量,包括:

    • 源 IP 地址和目标 IP 地址
    • 端口号
    • 协议
    • 应用层数据

4. 日志记录和监控: 许多防火墙提供网络活动的详细日志,使安全团队能够检测和响应潜在威胁。

5. 网络地址转换 (NAT): 一些防火墙执行 NAT,这有助于向外部网络隐藏内部网络地址,从而增加额外的安全层。

现代防火墙超越了简单的数据包过滤。它们结合了深度数据包检测和应用程序级过滤等高级功能,以针对复杂的网络威胁提供更全面的保护。

在本文中,我们将重点介绍在 OSI 模型的第 7 层(也称为应用程序层)运行的防火墙。

设计缺陷

当您了解下一代防火墙 (NGFW) 的工作原理时,您可能会注意到一些有趣的事情。假设防火墙规则为只有组 A 可以使用 Web 端口(80 和 443)。使用 nmap 等工具进行初始端口扫描可能会显示许多开放端口,这可能会误导观察者认为防火墙配置错误或无效。但是,当尝试连接到那些看起来打开的端口时,连接很快就会意外断开。

此行为的一个具体示例可以在 Cisco Firepower 威胁防御 (FTD) 中看到,它使用 Snort 引擎进行深度数据包检测。根据 Cisco 文档:

“为了让 Snort 引擎确定应用程序,它必须检查几个数据包(通常为 3-10 个,具体取决于应用程序解码器)。因此,允许某些数据包通过 FTD 并到达目的地。允许的数据包仍根据“在确定访问控制规则之前使用的 Access Policy > Advanced > Intrusion Policy”选项进行入侵策略控制。

这意味着,即使连接似乎已启动,防火墙也可能在解析这些初始数据包后阻止它。这种方法允许防火墙对流量做出更明智的决策,但也可能导致出现实际上无法访问的“开放”端口。

要了解这种情况是如何发生的,了解 TCP 连接的工作原理会很有帮助。

建立 TCP 连接:

1. SYN: 客户端发送一个序列号为随机 A 的 SYN 数据包。

2. SYN-ACK: 服务器以 SYN-ACK 响应。确认编号为 A + 1,并将其自己的序列号设置为 B。

3. Acknowledgment: 客户端发送序号为 A + 1 且鸣谢编号为 B + 1 的 ACK。

从现在开始,应用程序可以开始通过创建的会话进行通信和发送数据。要关闭连接,要终止通信的终端节点将启动连接终止:

终止 TCP 连接:

1. FIN: 主机发送 FIN 数据包以开始关闭连接。

2. Acknowledgment: 另一位主持人确认 FIN。

3. FIN: 第二台主机在准备关闭时发送自己的 FIN。

4. Acknowledgment: 第一个主机发送最终 ACK。

回归基础

到目前为止,我们知道 IPS/IDS 引擎最初会允许一些数据包通过,直到它确定它是否是恶意/恶意流量。因此,我们可以改变常见的编程实践并利用此功能。

套接字调度的一般架构如下所示:

我们可以连接、发送数据、接收响应、关闭套接字并重复。这有助于避免被 IDS/IPS 系统检测到,否则可能会阻止连接。修改后的算法如下所示:

这正是 Fragtunnel 所做的!

Fragtunnel

这种基于 Python 的 TCP 隧道工具提供了一种绕过下一代防火墙的独特方法:

基本功能:

  1. 它不同于传统代理或标准隧道。
  2. 允许将应用程序流量路由到目标服务器,避免 NGFW 检测。

操作机制:

  1. 数据碎片化: 应用程序的传入数据被拆分为较小的块。
  2. 多会话传输: 每个片段都通过单独的 TCP 会话单独发送。
  3. 数据重组: 片段在目标位置重新组合以重建原始数据。
  4. 最终交付: 重新组合的数据将转发到预期目标。

安装

要开始使用,只需从 GitHub 下载脚本并运行它。但是,请注意,需要设置隧道服务器和隧道客户端才能使脚本正常工作。

服务器

在服务器上执行以下步骤:

1
git clone https://github.com/efeali/fragtunnel.git
1
cd fragtunnel/
1
 sudo python3 fragtunnel.py -b 127.0.0.1:80 -v**
  • -b, –bind:指定 IP 地址和端口,隧道服务器将在其上侦听传入连接。
  • v, –verbose:启用 verbose 模式,在运行隧道应用程序时提供更详细的输出或日志记录信息。

客户端:

1
sudo Python fragtunnel.py -p 1234 -t :80 -T :80 -v
  • -p、–port:指定本地应用程序将侦听以建立连接的端口号。
  • -t, –target:指定本地应用程序要连接到的目标服务器或服务的 IP 地址和端口。
  • -T, –Tunnel:指定隧道服务器的 IP 地址和端口,以便于本地应用程序和目标服务器之间的连接。

一旦 tunnel 客户端执行并连接到 tunnel 服务器,您就可以与目标进行交互,就像直接在计算机上本地访问它一样。

如果我们运行 tcpdump,我们会注意到所有通信都是与服务器进行的,在本例中为 AWS。

总结

在许多情况下,当我们进行侦察时,我们注意到我们可以扫描服务器并获取端口信息,但是当我们尝试连接到系统时,它被防火墙阻止了。对这些下一代系统的工作原理有一点了解可以帮助我们克服它们。

大多数下一代防火墙使用的 IDS/IPS 引擎允许一些数据包到达目的地,同时收集足够的信息来判断是允许还是阻止流量。这是一个设计缺陷,可以利用它让我们使用 fragtunnel 等工具不受限制地访问服务器。

本文由作者按照 CC BY 4.0 进行授权