Manera fácil de "editar" el tráfico proveniente de un host TCP (Linux)

9

Necesito hacer una pequeña modificación al tráfico entrante desde un host tcp conocido: puerto antes de que el proceso que maneja la conexión obtenga la transmisión.

Por ejemplo, deje que 192.168.1.88 sea un host remoto que ejecuta un servidor web.
Necesito que, cuando un proceso en mi host local reciba datos de 192.168.1.88:80 (por ejemplo, el navegador), los datos se cambien primero y se reemplacen text-Apor text-B, de esta manera:

  • 127.0.0.1: ... se conecta a 192.168.1.88:80
  • 127.0.0.1: ... envía a 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 envía a 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • El sistema intercepta esos datos y los pasa a un programa cuya salida es:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • el sistema proporciona los datos cambiados al proceso que maneja 127.0.0.1: ..., como si viniera de 192.168.1.88:80.

Suponiendo que tengo una forma basada en transmisión para hacer estos cambios (usando, sedpor ejemplo), ¿cuál es la forma más fácil de preprocesar la transmisión de TCP entrante?

Supongo que esto implicaría iptables, pero no soy muy bueno en eso.

Tenga en cuenta que la aplicación debería tratar con el host original, por lo que configurar un proxy probablemente no sea una solución.

etuardu
fuente
¿Son estas solicitudes HTTP?
polinomio
Tu pregunta no es lo suficientemente clara. Necesita proporcionar más detalles.
Khaled
1
No puedes hacerlo a nivel de paquete. Un paquete puede contener "texto-" y el siguiente puede contener "A". Tendrá que desarrollar un proxy invisible que siga el protocolo. (Debe seguir el protocolo porque si obtiene "texto-" y es parte de "texto-A", debe esperar al siguiente fragmento antes de pasarlo o su filtro no funcionará. Pero si es el final de un mensaje lógico, no puedes esperar porque estarías esperando para siempre.) Creo que no hay una manera fácil de hacer esto.
David Schwartz
Ya existen sistemas de inspección de paquetes con estado que pueden hacer, por ejemplo, reescribir el tráfico FTP para que funcione en NAT. Ese es el tipo de lugar para comenzar.
pjc50
Necesito que funcione principalmente con la respuesta http, pero sería bueno si funciona en cualquier capa de aplicación.
etuardu

Respuestas:

21

Use proxy de redes e iptables.

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

Entonces corre:

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

NetSED es una utilidad pequeña y práctica diseñada para alterar, en tiempo real, el contenido de los paquetes enviados a través de su red. Es realmente útil para la alteración, falsificación o manipulación de paquetes de red. NetSED admite:

  • Auditoría de protocolo de recuadro negro: siempre que haya dos o más recuadros propietarios que se comuniquen utilizando algún protocolo no documentado. Al hacer cumplir los cambios en las transmisiones en curso, podrá probar si la solicitud examinada se puede reclamar como segura.

  • experimentos de generación de fuzz, pruebas de integridad: siempre que realice pruebas de estabilidad de una aplicación para ver cómo se preocupa por la integridad de los datos;

  • otros casos de uso comunes: transferencias engañosas, filtrado de contenido, conversión de protocolos, lo que mejor se adapte a su tarea actual.

dfc
fuente
Eso es realmente simple y genial.
mbrownnyc
No lo sabía netsed, encaja casi perfectamente para mi propósito. Lo único que no entiendo es cómo configurar el "proxy transparente local" (vea la pregunta). Tal vez debería configurar otra interfaz de red (virtual) para obtener eso. Por cierto, por ahora esta es la respuesta más satisfactoria.
etuardu
¿Está ejecutando un núcleo de distribución genérico? Si es compatible con iptables, es probable que ya esté compilado. Para configurar el proxy transparente, solo necesita completar los detalles apropiados para su host / puertos. Eche un vistazo al archivo Léame y vea si completa algunos de los detalles. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc
¿Pensé que netsed solo funcionaría en un paquete a la vez? Entonces, si la solicitud http se dividió en dos paquetes, la expresión regular para la sustitución no coincidirá y la solicitud se pasará al servidor sin modificaciones.
paulos
1
ok ahora, solo en caso de que alguien necesite esto algún día: no es que lo entienda completamente, pero para modificar realmente los paquetes SALIENTES (que es lo que el OP NO quería hacer), tendrá que modificar OUTPUT, no PREROUTING. Además, la -Dopción tenía que ser -A para mí. Además, para la -jopción, tuve que usar DNAT --to-destination (ip) o REDIRECT --to-port. Finalmente, NO pude corregir el error de segmentación de netsed. ver también: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ el uso de libnetfilter_qu es otra opción que hará lo que desee:

"... [reinyectar] paquetes alterados en el subsistema kernel nfnetlink_queue".

Es probable que le brinde la mayor extensibilidad, ya que depende de usted codificar el software.

También hay un contenedor de python disponible.

mbrownnyc
fuente
2
Aplicación de muestra que usa netfilter_queue: github.com/rgerganov/nfqsed
rgerganov