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.

etuardu
fonte
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.

dfc
fonte
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
3

iptables+ o uso de libnetfilter_qu é outra opção que fará o que você deseja:

"... [reinicializa] pacotes alterados para o subsistema nfnetlink_queue do kernel."

Provavelmente, você terá mais extensibilidade, pois depende de você codificar software.

Também existe um wrapper python .

mbrownnyc
fonte
2
Aplicação da amostra que está a utilizar netfilter_queue: github.com/rgerganov/nfqsed
rgerganov