Maneira fácil de "editar" o tráfego proveniente de um host tcp (linux)


9

Preciso fazer algumas pequenas modificações no tráfego de entrada de um host tcp: port conhecido antes que o processo de manipulação da conexão obtenha o fluxo.

Por exemplo, seja 192.168.1.88 um host remoto que execute um servidor web.
Eu preciso disso, quando um processo no meu host local recebe dados de 192.168.1.88:80 (por exemplo, o navegador), os dados são alterados primeiro substituindo text-Apor text-B, como este:

  • 127.0.0.1: ... conecta-se a 192.168.1.88:80
  • 127.0.0.1: ... envia para 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 envia para 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Esses dados são um pouco interceptados pelo sistema e transmitidos para um programa cuja saída é:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • o sistema fornece os dados alterados para o processo que manipula 127.0.0.1: ..., como se fosse de 192.168.1.88:80.

Supondo que eu tenha uma maneira baseada em fluxo para fazer essas alterações (usando, sedpor exemplo), qual é a maneira mais fácil de pré-processar o fluxo tcp recebido?

Acho que isso envolveria iptables, mas não sou muito bom nisso.

Observe que o aplicativo deve lidar com o host original, portanto, a configuração de um proxy provavelmente não é uma solução.


Essas solicitações HTTP são?
— polinomial

Sua pergunta não é clara o suficiente. Você precisa fornecer mais detalhes.
— Khaled

1
Você não pode fazer isso no nível do pacote. Um pacote pode conter "texto" e o próximo pode conter "A". Você precisará desenvolver um proxy invisível que siga o protocolo. (É necessário seguir o protocolo porque, se você receber "texto-" e fizer parte de "texto-A", precisará aguardar o próximo bloco antes de transmiti-lo ou o filtro não funcionará. Mas se for o fim de uma mensagem lógica, você não pode esperar porque estaria esperando para sempre.) Acredito que não há uma maneira fácil de fazer isso.
— David Schwartz

Já existem sistemas de inspeção de pacotes com estado, que podem, por exemplo, reescrever o tráfego FTP, para que funcione no NAT. Esse é o tipo de lugar para começar.
— Pjc50 6/10/11

Eu preciso que ele funcione principalmente com a resposta http, mas seria bom se funcionasse em qualquer camada de aplicativo.
— 18711 etuardu

Respostas:


21

Use proxies com redes e iptables.

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

Então corra:

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

O NetSED é um utilitário pequeno e útil projetado para alterar, em tempo real, o conteúdo dos pacotes encaminhados pela sua rede. É realmente útil para alteração, falsificação ou manipulação de pacotes de rede. O NetSED suporta:

  • auditoria de protocolo de caixa preta - sempre que houver duas ou mais caixas proprietárias se comunicando usando algum protocolo não documentado. Ao impor alterações nas transmissões em andamento, você poderá testar se o aplicativo examinado pode ser reivindicado como seguro.

  • experimentos de geração de fuzz, testes de integridade - sempre que você faz testes de estabilidade de um aplicativo para ver como ele se importa com a integridade dos dados;

  • outros casos de uso comuns: transferências enganosas, filtragem de conteúdo, conversão de protocolo - o que melhor se adequar à sua tarefa.


Isso é realmente simples e legal.
— mbrownnyc

Eu não sabia netsed, ele se encaixa quase perfeitamente para o meu propósito. A única coisa que não entendo é como configurar o "proxy transparente local" (veja a pergunta). Talvez eu deva configurar outra interface de rede (virtual) para obter isso. A propósito, por enquanto esta é a resposta mais satisfatória.
— etuardu

Você está executando um kernel de distribuição genérico? Se você é o iptables, o suporte provavelmente já está compilado. Para configurar o proxy transparente, basta preencher os detalhes apropriados para o seu host / portas. Dê uma olhada no leia-me e veja se ele preenche alguns dos detalhes. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
— dfc

Eu pensei que o netsed funcionaria apenas em um pacote de cada vez? Portanto, se a solicitação http for dividida em dois pacotes, a regex para a substituição não corresponderá e a solicitação será passada ao servidor sem modificação.
— paulos 17/10

1
ok agora, apenas no caso de alguém precisar disso um dia: não que eu o compreenda completamente, mas para modificar pacotes OUTGOING (que é o que op NÃO queria fazer), você terá que modificar OUTPUT, não PREROUTING. Além disso, a -Dopção tinha que ser -A para mim. Além disso, para a -jopção, eu tive que usar DNAT --to-destination (ip) ou REDIRECT --to-port. Por fim, não consegui corrigir o erro de segmentação do netsed. veja também: ubuntuforums.org/showthread.php?t=2337389
— phil294


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.