Modo semplice per "modificare" il traffico proveniente da un host tcp (linux)


9

Devo apportare alcune piccole modifiche al traffico in entrata da un host tcp noto: porta prima che il processo che gestisce la connessione ottenga il flusso.

Ad esempio, lasciare 192.168.1.88 essere un host remoto che esegue un server web.
Ho bisogno che, quando un processo sul mio host locale riceve i dati da 192.168.1.88:80 (ad esempio il browser), i dati vengano prima cambiati sostituendoli text-Acon text-B, in questo modo:

  • 127.0.0.1: ... si collega a 192.168.1.88:80
  • 127.0.0.1: ... invia a 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 invia a 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Tali dati vengono in qualche modo intercettati dal sistema e passati a un programma il cui output è:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • il sistema fornisce i dati così modificati al processo gestendo 127.0.0.1: ..., come se provenisse da 192.168.1.88:80.

Supponendo che io abbia un modo basato sul flusso per effettuare queste modifiche (usando sedad esempio), qual è il modo più semplice per pre-elaborare il flusso tcp in entrata?

Immagino che ciò implicherebbe iptables, ma non sono molto bravo.

Si noti che l'applicazione dovrebbe avere a che fare con l'host originale, quindi l'impostazione di un proxy non è probabilmente una soluzione.


Queste sono richieste HTTP?
polinomio

La tua domanda non è abbastanza chiara. Devi fornire maggiori dettagli.
Khaled,

1
Non puoi farlo a livello di pacchetto. Un pacchetto potrebbe contenere "testo-" e il prossimo potrebbe contenere "A". Dovrai sviluppare un proxy invisibile che segue il protocollo. (Devi seguire il protocollo perché se ottieni "text-" ed è parte di "text-A", devi aspettare il prossimo pezzo prima di passarlo o il tuo filtro non funzionerà. Ma se è la fine di un messaggio logico, non puoi aspettare perché ti aspetteresti per sempre.) Credo che non ci sia un modo semplice per farlo.
David Schwartz,

Esistono già sistemi di ispezione dei pacchetti con stato che possono ad esempio riscrivere il traffico FTP in modo che funzioni su NAT. Questo è il tipo di posto da cui iniziare.
pjc50,

Ho bisogno che funzioni principalmente con la risposta http, ma sarebbe utile se funziona su qualsiasi livello di applicazione.
etuardu,

Risposte:


21

Utilizzare il proxy netsed e iptables.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Quindi eseguire:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED è una piccola e pratica utility progettata per modificare, in tempo reale, il contenuto dei pacchetti inoltrati attraverso la rete. È davvero utile per l'alterazione, la forgiatura o la manipolazione dei pacchetti di rete. NetSED supporta:

  • controllo del protocollo black-box - ogni volta che ci sono due o più box proprietari che comunicano usando un protocollo non documentato. Applicando le modifiche alle trasmissioni in corso, sarai in grado di verificare se la domanda esaminata può essere rivendicata sicura.

  • esperimenti di generazione di fuzz, test di integrità - ogni volta che esegui test di stabilità di un'applicazione per vedere come si prende cura dell'integrità dei dati;

  • altri casi d'uso comuni: trasferimenti ingannevoli, filtro dei contenuti, conversione del protocollo - qualunque cosa si adatti meglio al tuo compito.


È davvero semplice e interessante.
mbrownnyc,

Non lo sapevo netsed, si adattava quasi perfettamente al mio scopo. L'unica cosa che non capisco è come impostare il "proxy trasparente locale" (vedi la domanda). Forse dovrei impostare un'altra interfaccia di rete (virtuale) per ottenerlo. A proposito, per ora questa è la risposta più soddisfacente.
etuardu,

Stai eseguendo un kernel di distribuzione generico? Se sei iptables, probabilmente è già stato compilato il supporto. Per configurare il proxy trasparente devi solo inserire i dettagli appropriati per il tuo host / le tue porte. Dai un'occhiata al file Leggimi e vedi se riempie alcuni dettagli. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc

Pensavo che le reti funzionassero solo su un pacchetto alla volta? Pertanto, se la richiesta http fosse suddivisa in due pacchetti, la regex per la sostituzione non corrisponderà e la richiesta verrà passata al server non modificata.
paulos,

1
ok ora, nel caso in cui qualcuno ne abbia bisogno un giorno: non che io lo capisca appieno, ma per modificare effettivamente i pacchetti OUTGOING (che è ciò che OP NON voleva fare), dovrai modificare OUTPUT, no PREROUTING. inoltre, l' -Dopzione doveva essere -A per me. inoltre, per l' -jopzione, ho dovuto usare DNAT --to-destination (ip) o REDIRECT --to-port. Infine, NON ho potuto correggere l'errore di segmentazione di netsed. vedi anche: ubuntuforums.org/showthread.php?t=2337389
phil294


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.