防火墙是网络安全的关键部分,它充当受信任的内部网络和不受信任的外部网络(如 Internet)之间的屏障。根据预定义的安全规则监控和控制传入和传出的网络流量。
防火墙可以作为硬件设备、软件应用程序或两者的组合来实现。它们有多种用途:
存取控制: 防火墙根据配置的规则来调节允许或阻止哪些网络连接。
威胁预防: 它们可以防止各种外部威胁,例如恶意软件、病毒和潜在的黑客攻击。
流量过滤: 防火墙可以配置为根据各种标准允许或阻止特定类型的网络流量,包括:
- 源 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 隧道工具提供了一种绕过下一代防火墙的独特方法:
基本功能:
- 它不同于传统代理或标准隧道。
- 允许将应用程序流量路由到目标服务器,避免 NGFW 检测。
操作机制:
- 数据碎片化: 应用程序的传入数据被拆分为较小的块。
- 多会话传输: 每个片段都通过单独的 TCP 会话单独发送。
- 数据重组: 片段在目标位置重新组合以重建原始数据。
- 最终交付: 重新组合的数据将转发到预期目标。
安装
要开始使用,只需从 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
等工具不受限制地访问服务器。