2017-08-26 638 views
0

Howto拦截tcp数据包并在Linux(Ubuntu)中无代理地修改?举例来说,捕获包作为wireshark但修改数据包。如何拦截tcp数据包并在飞行中修改?

需要捕获,搜索和替换包,但例如:

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

仅限使用FTP,SMTP,HTTP等HOWTO使这个地方包替换?

回答

2

给出你的例子,你不想只改变一个数据包中的单个字节,而是一个可能跨越多个数据包的字符串。另外,您的替换可能与原始字符串的长度不同。如果你这样做在数据包级别(因为你不想使用代理服务器),你将需要:

  • 可能推迟的情况下,数据包的转发,他们可能需要根据内容进行更改下面的数据包
  • 重写不仅是少量的数据包,您可以更改有效负载,但也可以重写所有数据包,因为由于数据大小的变化需要调整所有的序列号
  • 也会重写所有未来的数据包因为需要调整ACK中的序列号,使得原始发送者可以将ACK与原始分组关联起来

除了实现这一点的复杂性之外,延迟数据包的第一点也可以通过TCP流量控制来推断哪个连接可能会减慢甚至停止。

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

我不知道你没有代理的要求是多么的不可改变。这可能是因为你只是不想有一个需要在客户端配置的显式代理。但是,代理也可以以透明的方式使用,不需要客户端的显式配置。

因此,您最好使用透明代理实现您的实际需求。有关如何为HTTP执行此操作,请参阅例如this documentation for mitmproxy。我们也可以用类似的方法来实现这个协议,而不是HTTP协议。