Un moyen facile de «modifier» le trafic provenant d'un hôte TCP (Linux)

9

J'ai besoin d'apporter une petite modification au trafic entrant d'un hôte TCP connu: port avant que le processus gérant la connexion ne reçoive le flux.

Par exemple, laissez 192.168.1.88 être un hôte distant qui exécute un serveur Web.
J'ai besoin de cela, lorsqu'un processus sur mon hôte local reçoit des données de 192.168.1.88:80 (par exemple le navigateur), les données sont d'abord modifiées en remplaçant text-Apar text-B, comme ceci:

  • 127.0.0.1: ... se connecte à 192.168.1.88:80
  • 127.0.0.1: ... envoie à 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 envoie à 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Ces données sont quelque peu interceptées par le système et transmises à un programme dont la sortie est:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • le système donne les données ainsi modifiées au processus gérant 127.0.0.1: ..., comme si elles venaient de 192.168.1.88:80.

En supposant que j'ai une méthode basée sur le flux pour effectuer ces modifications (en utilisant sedpar exemple), quelle est la façon la plus simple de prétraiter le flux TCP entrant?

Je suppose que cela impliquerait iptables, mais je ne suis pas très bon dans ce domaine.

Notez que l'application doit sembler traiter l'hôte d'origine, donc la configuration d'un proxy n'est probablement pas une solution.

etuardu
la source
S'agit-il de requêtes HTTP?
polynôme
Votre question n'est pas assez claire. Vous devez fournir plus de détails.
Khaled
1
Vous ne pouvez pas le faire au niveau des paquets. Un paquet peut contenir "text-" et le suivant peut contenir "A". Vous devrez développer un proxy invisible qui suit le protocole. (Vous devez suivre le protocole parce que si vous obtenez "text-" et qu'il fait partie de "text-A", vous devez attendre le prochain morceau avant de le transmettre ou votre filtre ne fonctionnera pas. Mais si c'est la fin d'un message logique, vous ne pouvez pas attendre parce que vous attendriez pour toujours.) Je crois qu'il n'y a pas de moyen facile de le faire.
David Schwartz
Il existe déjà des systèmes d'inspection de paquets avec état qui peuvent faire par exemple la réécriture du trafic FTP pour qu'il fonctionne à travers NAT. C'est le genre de point de départ.
pjc50
J'en ai besoin pour travailler avec la réponse http principalement, mais ce serait bien si cela fonctionne sur n'importe quelle couche d'application.
etuardu

Réponses:

21

Utilisez un proxy en réseau et iptables.

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

Exécutez ensuite:

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

NetSED est un petit utilitaire pratique conçu pour modifier, en temps réel, le contenu des paquets transmis via votre réseau. Il est très utile pour l'altération, la falsification ou la manipulation de paquets réseau. NetSED prend en charge:

  • audit de protocole de boîte noire - chaque fois que deux ou plusieurs boîtiers propriétaires communiquent à l'aide d'un protocole non documenté. En imposant des changements dans les transmissions en cours, vous pourrez tester si l'application examinée peut être revendiquée comme sécurisée.

  • expériences de génération de fuzz, tests d'intégrité - chaque fois que vous effectuez des tests de stabilité d'une application pour voir comment elle se soucie de l'intégrité des données;

  • autres cas d'utilisation courants: transferts trompeurs, filtrage de contenu, conversion de protocole - tout ce qui convient le mieux à votre tâche.

dfc
la source
C'est vraiment simple et cool.
mbrownnyc
Je ne savais pas netsed, cela correspond presque parfaitement à mon objectif. La seule chose que je ne comprends pas, c'est comment configurer le "proxy transparent local" (voir la question). Je devrais peut-être mettre en place une autre interface réseau (virtuelle) pour l'obtenir. Soit dit en passant, pour l'instant, c'est la réponse la plus satisfaisante.
etuardu
Utilisez-vous un noyau de distribution générique? Si vous êtes, le support iptables est probablement déjà compilé. Pour configurer le proxy transparent, il vous suffit de remplir les détails appropriés pour votre hôte / ports. Jetez un œil au fichier Lisez-moi et voyez s'il remplit certains détails. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc
Je pensais que le net ne fonctionnerait que sur un paquet à la fois? Donc, si la requête http était divisée en deux paquets, l'expression régulière de la substitution ne correspondra pas et la requête sera transmise au serveur sans modification.
paulos
1
ok maintenant, juste au cas où quelqu'un en aurait besoin un jour: pas que je le comprenne bien, mais pour réellement modifier les paquets SORTANTS (ce que op ne voulait PAS faire), vous devrez le modifier OUTPUT, non PREROUTING. aussi, l' -Doption devait être -A pour moi. aussi, pour l' -joption, j'ai dû utiliser DNAT --to-destination (ip) ou REDIRECT --to-port. Enfin, je n'ai PAS pu corriger l'erreur de segmentation de netsed. voir aussi: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ l'utilisation de libnetfilter_qu est une autre option qui fera ce que vous souhaitez:

"... [réinjecter] les paquets modifiés au sous-système du noyau nfnetlink_queue."

Il vous donnera probablement la plus grande extensibilité car c'est à vous de coder le logiciel.

Il y a un wrapper python disponible.

mbrownnyc
la source
2
Exemple d'application qui utilise netfilter_queue: github.com/rgerganov/nfqsed
rgerganov