【问题标题】:Howto intercept tcp packet and modify in the fly?如何拦截 tcp 数据包并即时修改?
【发布时间】:2017-08-26 00:44:24
【问题描述】:

如何在 Linux (Ubuntu) 中在没有代理的情况下拦截 tcp 数据包并即时修改?例如,将数据包捕获为wireshark,但修改数据包。

需要捕获、搜索和替换数据包,但是示例:

搜索正则表达式"/(<form\s+.*?>)/i",替换为"$1\n<input name=\"newinput\">"

仅适用于使用 ftp、smtp、http 等的本地数据包。如何制作?

【问题讨论】:

    标签: linux networking tcp packet-capture sniffing


    【解决方案1】:

    鉴于您的示例,您不想仅更改数据包中的单个字节,而是更改可能跨越多个数据包的字符串。此外,您的替换可能与原始字符串的长度不同。如果您在数据包级别执行此操作(因为您不想使用代理),您需要:

    • 可能会延迟数据包的转发,以防它们可能需要根据后续数据包的内容进行更改
    • 不仅要重写您更改有效负载的少数数据包,还要重写所有后续数据包,因为由于数据大小的变化,所有序列号都需要调整
    • 还要重写你从对等方收到的所有未来数据包,因为需要调整 ACK 中的序列号,以便原始发送者可以将 ACK 与原始数据包相关联

    除了实现这一点的复杂性之外,延迟数据包的第一点还可以推断出 TCP 流控制,这可能会使您的连接变慢甚至停止。

    因此,实现这种深度数据包修改的常用方法是使用代理,其中客户端和代理之间有一个 TCP 连接,代理和服务器之间有另一个 TCP 连接。这样你就有了两个独立的 TCP 连接,它们都有自己独立的 TCP 流控制。此外,内核会自动处理正确的序列号等,因此无需手动调整。

    我不知道您对没有代理的要求有多不变。您可能只是不想拥有需要在客户端配置的显式代理。但是,代理也可以以不需要在客户端显式配置的透明方式使用。

    因此,您最好使用透明代理来实现您的实际需求。例如,请参阅this documentation for mitmproxy,了解如何为 HTTP 执行此操作。也可以以类似的方式为不同于 HTTP 的协议实现这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2020-12-12
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多