mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
110 lines
16 KiB
Markdown
110 lines
16 KiB
Markdown
# AD CS Certificate Theft
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
**Αυτή είναι μια μικρή περίληψη των κεφαλαίων Κλοπής της καταπληκτικής έρευνας από [https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf](https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf)**
|
||
|
||
## Τι μπορώ να κάνω με ένα πιστοποιητικό
|
||
|
||
Πριν ελέγξετε πώς να κλέψετε τα πιστοποιητικά, εδώ έχετε μερικές πληροφορίες σχετικά με το πώς να βρείτε για ποιο σκοπό είναι χρήσιμο το πιστοποιητικό:
|
||
```bash
|
||
# Powershell
|
||
$CertPath = "C:\path\to\cert.pfx"
|
||
$CertPass = "P@ssw0rd"
|
||
$Cert = New-Object
|
||
System.Security.Cryptography.X509Certificates.X509Certificate2 @($CertPath, $CertPass)
|
||
$Cert.EnhancedKeyUsageList
|
||
|
||
# cmd
|
||
certutil.exe -dump -v cert.pfx
|
||
```
|
||
## Εξαγωγή Πιστοποιητικών Χρησιμοποιώντας τα Crypto APIs – THEFT1
|
||
|
||
Σε μια **διαδραστική επιφάνεια εργασίας**, η εξαγωγή ενός πιστοποιητικού χρήστη ή μηχανής, μαζί με το ιδιωτικό κλειδί, μπορεί να γίνει εύκολα, ιδιαίτερα αν το **ιδιωτικό κλειδί είναι εξαγώγιμο**. Αυτό μπορεί να επιτευχθεί πλοηγούμενοι στο πιστοποιητικό στο `certmgr.msc`, κάνοντας δεξί κλικ πάνω του και επιλέγοντας `All Tasks → Export` για να δημιουργηθεί ένα αρχείο .pfx με προστασία κωδικού πρόσβασης.
|
||
|
||
Για μια **προγραμματική προσέγγιση**, εργαλεία όπως το PowerShell `ExportPfxCertificate` cmdlet ή έργα όπως το [TheWover’s CertStealer C# project](https://github.com/TheWover/CertStealer) είναι διαθέσιμα. Αυτά χρησιμοποιούν το **Microsoft CryptoAPI** (CAPI) ή το Cryptography API: Next Generation (CNG) για να αλληλεπιδράσουν με το κατάστημα πιστοποιητικών. Αυτά τα APIs παρέχουν μια σειρά κρυπτογραφικών υπηρεσιών, συμπεριλαμβανομένων εκείνων που είναι απαραίτητες για την αποθήκευση και την πιστοποίηση πιστοποιητικών.
|
||
|
||
Ωστόσο, αν ένα ιδιωτικό κλειδί έχει οριστεί ως μη εξαγώγιμο, τόσο το CAPI όσο και το CNG θα μπλοκάρουν κανονικά την εξαγωγή τέτοιων πιστοποιητικών. Για να παρακαμφθεί αυτός ο περιορισμός, μπορούν να χρησιμοποιηθούν εργαλεία όπως το **Mimikatz**. Το Mimikatz προσφέρει τις εντολές `crypto::capi` και `crypto::cng` για να διορθώσει τα αντίστοιχα APIs, επιτρέποντας την εξαγωγή ιδιωτικών κλειδιών. Συγκεκριμένα, το `crypto::capi` διορθώνει το CAPI μέσα στη τρέχουσα διαδικασία, ενώ το `crypto::cng` στοχεύει τη μνήμη του **lsass.exe** για διόρθωση.
|
||
|
||
## Κλοπή Πιστοποιητικού Χρήστη μέσω DPAPI – THEFT2
|
||
|
||
Περισσότερες πληροφορίες σχετικά με το DPAPI στο:
|
||
|
||
{{#ref}}
|
||
../../windows-local-privilege-escalation/dpapi-extracting-passwords.md
|
||
{{#endref}}
|
||
|
||
Στα Windows, **τα ιδιωτικά κλειδιά πιστοποιητικών προστατεύονται από το DPAPI**. Είναι κρίσιμο να αναγνωρίσουμε ότι οι **θέσεις αποθήκευσης για τα ιδιωτικά κλειδιά χρηστών και μηχανών** είναι διαφορετικές, και οι δομές αρχείων ποικίλλουν ανάλογα με το κρυπτογραφικό API που χρησιμοποιείται από το λειτουργικό σύστημα. Το **SharpDPAPI** είναι ένα εργαλείο που μπορεί να πλοηγηθεί σε αυτές τις διαφορές αυτόματα κατά την αποκρυπτογράφηση των DPAPI blobs.
|
||
|
||
**Τα πιστοποιητικά χρηστών** φιλοξενούνται κυρίως στο μητρώο κάτω από `HKEY_CURRENT_USER\SOFTWARE\Microsoft\SystemCertificates`, αλλά κάποια μπορούν επίσης να βρεθούν στον κατάλογο `%APPDATA%\Microsoft\SystemCertificates\My\Certificates`. Τα αντίστοιχα **ιδιωτικά κλειδιά** για αυτά τα πιστοποιητικά αποθηκεύονται συνήθως στο `%APPDATA%\Microsoft\Crypto\RSA\User SID\` για **κλειδιά CAPI** και στο `%APPDATA%\Microsoft\Crypto\Keys\` για **κλειδιά CNG**.
|
||
|
||
Για να **εξάγουμε ένα πιστοποιητικό και το σχετικό ιδιωτικό κλειδί του**, η διαδικασία περιλαμβάνει:
|
||
|
||
1. **Επιλογή του στοχευμένου πιστοποιητικού** από το κατάστημα του χρήστη και ανάκτηση του ονόματος του καταστήματος κλειδιών του.
|
||
2. **Εντοπισμός του απαιτούμενου DPAPI masterkey** για την αποκρυπτογράφηση του αντίστοιχου ιδιωτικού κλειδιού.
|
||
3. **Αποκρυπτογράφηση του ιδιωτικού κλειδιού** χρησιμοποιώντας το απλό DPAPI masterkey.
|
||
|
||
Για **την απόκτηση του απλού DPAPI masterkey**, οι παρακάτω προσεγγίσεις μπορούν να χρησιμοποιηθούν:
|
||
```bash
|
||
# With mimikatz, when running in the user's context
|
||
dpapi::masterkey /in:"C:\PATH\TO\KEY" /rpc
|
||
|
||
# With mimikatz, if the user's password is known
|
||
dpapi::masterkey /in:"C:\PATH\TO\KEY" /sid:accountSid /password:PASS
|
||
```
|
||
Για να απλοποιηθεί η αποκρυπτογράφηση των αρχείων masterkey και των αρχείων ιδιωτικού κλειδιού, η εντολή `certificates` από το [**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) αποδεικνύεται χρήσιμη. Δέχεται τα `/pvk`, `/mkfile`, `/password` ή `{GUID}:KEY` ως παραμέτρους για να αποκρυπτογραφήσει τα ιδιωτικά κλειδιά και τα συνδεδεμένα πιστοποιητικά, παράγοντας στη συνέχεια ένα αρχείο `.pem`.
|
||
```bash
|
||
# Decrypting using SharpDPAPI
|
||
SharpDPAPI.exe certificates /mkfile:C:\temp\mkeys.txt
|
||
|
||
# Converting .pem to .pfx
|
||
openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx
|
||
```
|
||
## Κλοπή Πιστοποιητικού Μηχανής μέσω DPAPI – THEFT3
|
||
|
||
Τα πιστοποιητικά μηχανής που αποθηκεύονται από τα Windows στο μητρώο στη διαδρομή `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates` και τα αντίστοιχα ιδιωτικά κλειδιά που βρίσκονται στη διαδρομή `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys` (για CAPI) και `%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys` (για CNG) είναι κρυπτογραφημένα χρησιμοποιώντας τα κύρια κλειδιά DPAPI της μηχανής. Αυτά τα κλειδιά δεν μπορούν να αποκρυπτογραφηθούν με το κλειδί αντιγράφου ασφαλείας DPAPI του τομέα; αντίθετα, απαιτείται το **DPAPI_SYSTEM LSA secret**, το οποίο μπορεί να προσπελαστεί μόνο από τον χρήστη SYSTEM.
|
||
|
||
Η χειροκίνητη αποκρυπτογράφηση μπορεί να επιτευχθεί εκτελώντας την εντολή `lsadump::secrets` στο **Mimikatz** για να εξάγει το DPAPI_SYSTEM LSA secret, και στη συνέχεια χρησιμοποιώντας αυτό το κλειδί για να αποκρυπτογραφήσει τα κύρια κλειδιά της μηχανής. Εναλλακτικά, η εντολή `crypto::certificates /export /systemstore:LOCAL_MACHINE` του Mimikatz μπορεί να χρησιμοποιηθεί μετά την επιδιόρθωση του CAPI/CNG όπως περιγράφηκε προηγουμένως.
|
||
|
||
**SharpDPAPI** προσφέρει μια πιο αυτοματοποιημένη προσέγγιση με την εντολή πιστοποιητικών του. Όταν χρησιμοποιείται η σημαία `/machine` με ανυψωμένα δικαιώματα, αναβαθμίζεται σε SYSTEM, εξάγει το DPAPI_SYSTEM LSA secret, το χρησιμοποιεί για να αποκρυπτογραφήσει τα κύρια κλειδιά DPAPI της μηχανής και στη συνέχεια χρησιμοποιεί αυτά τα κλειδιά σε απλή μορφή ως πίνακα αναζήτησης για να αποκρυπτογραφήσει οποιαδήποτε ιδιωτικά κλειδιά πιστοποιητικού μηχανής.
|
||
|
||
## Εύρεση Αρχείων Πιστοποιητικών – THEFT4
|
||
|
||
Τα πιστοποιητικά βρίσκονται μερικές φορές απευθείας μέσα στο σύστημα αρχείων, όπως σε κοινές διανομές αρχείων ή στον φάκελο Λήψεις. Οι πιο συχνά συναντώμενοι τύποι αρχείων πιστοποιητικών που στοχεύουν σε περιβάλλοντα Windows είναι τα αρχεία `.pfx` και `.p12`. Αν και λιγότερο συχνά, αρχεία με επεκτάσεις `.pkcs12` και `.pem` εμφανίζονται επίσης. Άλλες αξιοσημείωτες επεκτάσεις αρχείων που σχετίζονται με πιστοποιητικά περιλαμβάνουν:
|
||
|
||
- `.key` για ιδιωτικά κλειδιά,
|
||
- `.crt`/`.cer` για μόνο πιστοποιητικά,
|
||
- `.csr` για Αιτήσεις Υπογραφής Πιστοποιητικού, οι οποίες δεν περιέχουν πιστοποιητικά ή ιδιωτικά κλειδιά,
|
||
- `.jks`/`.keystore`/`.keys` για Java Keystores, τα οποία μπορεί να περιέχουν πιστοποιητικά μαζί με ιδιωτικά κλειδιά που χρησιμοποιούνται από εφαρμογές Java.
|
||
|
||
Αυτά τα αρχεία μπορούν να αναζητηθούν χρησιμοποιώντας το PowerShell ή τη γραμμή εντολών αναζητώντας τις αναφερόμενες επεκτάσεις.
|
||
|
||
Σε περιπτώσεις όπου βρεθεί ένα αρχείο πιστοποιητικού PKCS#12 και είναι προστατευμένο με κωδικό πρόσβασης, η εξαγωγή ενός hash είναι δυνατή μέσω της χρήσης του `pfx2john.py`, διαθέσιμου στο [fossies.org](https://fossies.org/dox/john-1.9.0-jumbo-1/pfx2john_8py_source.html). Στη συνέχεια, μπορεί να χρησιμοποιηθεί το JohnTheRipper για να προσπαθήσει να σπάσει τον κωδικό πρόσβασης.
|
||
```bash
|
||
# Example command to search for certificate files in PowerShell
|
||
Get-ChildItem -Recurse -Path C:\Users\ -Include *.pfx, *.p12, *.pkcs12, *.pem, *.key, *.crt, *.cer, *.csr, *.jks, *.keystore, *.keys
|
||
|
||
# Example command to use pfx2john.py for extracting a hash from a PKCS#12 file
|
||
pfx2john.py certificate.pfx > hash.txt
|
||
|
||
# Command to crack the hash with JohnTheRipper
|
||
john --wordlist=passwords.txt hash.txt
|
||
```
|
||
## NTLM Credential Theft via PKINIT – THEFT5 (UnPAC the hash)
|
||
|
||
Το παρόν περιεχόμενο εξηγεί μια μέθοδο κλοπής διαπιστευτηρίων NTLM μέσω PKINIT, συγκεκριμένα μέσω της μεθόδου κλοπής που ονομάζεται THEFT5. Ακολουθεί μια επαναδιατύπωση σε παθητική φωνή, με το περιεχόμενο ανώνυμο και συνοπτικό όπου είναι απαραίτητο:
|
||
|
||
Για να υποστηριχθεί η αυθεντικοποίηση NTLM `MS-NLMP` για εφαρμογές που δεν διευκολύνουν την αυθεντικοποίηση Kerberos, ο KDC έχει σχεδιαστεί να επιστρέφει τη μία κατεύθυνση λειτουργία (OWF) NTLM του χρήστη εντός του πιστοποιητικού χαρακτηριστικών προνομίων (PAC), συγκεκριμένα στο buffer `PAC_CREDENTIAL_INFO`, όταν χρησιμοποιείται το PKCA. Ως εκ τούτου, εάν ένας λογαριασμός αυθεντικοποιηθεί και εξασφαλίσει ένα Ticket-Granting Ticket (TGT) μέσω PKINIT, παρέχεται εγγενώς ένας μηχανισμός που επιτρέπει στον τρέχοντα υπολογιστή να εξάγει το NTLM hash από το TGT για να υποστηρίξει τα παλαιά πρωτόκολλα αυθεντικοποίησης. Αυτή η διαδικασία περιλαμβάνει την αποκρυπτογράφηση της δομής `PAC_CREDENTIAL_DATA`, η οποία είναι ουσιαστικά μια NDR σειριοποιημένη απεικόνιση του απλού κειμένου NTLM.
|
||
|
||
Η χρησιμότητα **Kekeo**, προσβάσιμη στο [https://github.com/gentilkiwi/kekeo](https://github.com/gentilkiwi/kekeo), αναφέρεται ως ικανή να ζητήσει ένα TGT που περιέχει αυτά τα συγκεκριμένα δεδομένα, διευκολύνοντας έτσι την ανάκτηση του NTLM του χρήστη. Η εντολή που χρησιμοποιείται για αυτόν τον σκοπό είναι η εξής:
|
||
```bash
|
||
tgt::pac /caname:generic-DC-CA /subject:genericUser /castore:current_user /domain:domain.local
|
||
```
|
||
**`Rubeus`** μπορεί επίσης να αποκτήσει αυτές τις πληροφορίες με την επιλογή **`asktgt [...] /getcredentials`**.
|
||
|
||
Επιπλέον, σημειώνεται ότι το Kekeo μπορεί να επεξεργαστεί πιστοποιητικά που προστατεύονται από smartcard, εφόσον μπορεί να ανακτηθεί το pin, με αναφορά στο [https://github.com/CCob/PinSwipe](https://github.com/CCob/PinSwipe). Η ίδια δυνατότητα υποστηρίζεται από **Rubeus**, διαθέσιμο στο [https://github.com/GhostPack/Rubeus](https://github.com/GhostPack/Rubeus).
|
||
|
||
Αυτή η εξήγηση συνοψίζει τη διαδικασία και τα εργαλεία που εμπλέκονται στην κλοπή διαπιστευτηρίων NTLM μέσω PKINIT, εστιάζοντας στην ανάκτηση των NTLM hashes μέσω TGT που αποκτήθηκε χρησιμοποιώντας PKINIT, και τα εργαλεία που διευκολύνουν αυτή τη διαδικασία.
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|