2017-08-26 93 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協議。