Le Local Administrator Password Solution (LAPS) rend aléatoire le mot de passe d'administrateur local de chaque machine et le stocke dans l'objet d'annuaire de l'ordinateur. Pratique, et directement exploitable : un droit de lecture sur le bon attribut vous remet le mot de passe d'administrateur local de cet hôte. BloodHound le représente par l'arête ReadLAPSPassword. Il existe deux générations, stockées dans des attributs différents.
LAPS hérité ou Windows LAPS#
- LAPS hérité : le mot de passe est en clair dans
ms-Mcs-AdmPwd(expiration dansms-Mcs-AdmPwdExpirationTime). Tout principal disposant d'un accès en lecture à cet attribut obtient le mot de passe tel quel. - Windows LAPS (intégré aux Windows actuels) : utilise
msLAPS-Password(JSON en clair lorsque le chiffrement est désactivé) etmsLAPS-EncryptedPassword(chiffré en DPAPI-NG pour un principal/groupe choisi), plus des attributs d'historique de mots de passe. La forme chiffrée exige que vous soyez (ou que vous atteigniez) le déchiffreur autorisé. BloodHound suit aussiSyncLAPSPassword, une arête au niveau du domaine permettant de récupérer des attributs confidentiels et filtrés RODC (y compris lems-Mcs-AdmPwdhérité) via la synchronisation de l'annuaire, à distinguer deReadLAPSPassword, qui est un accès en lecture directe sur un seul objet ordinateur.
Le lire#
# NetExec: pull LAPS passwords over LDAP (handles legacy and Windows LAPS attributes)
nxc ldap <dc> -u user -p pass -M laps
nxc ldap <dc> -u user -p pass -M laps -o COMPUTER='WKSTN-*' # filter to hosts
# pyLAPS: get (and set) the LAPS attribute from Linux
pyLAPS.py --action get -u user -p pass -d example.local --dc-ip <dc>
# bloodyAD: raw attribute read
bloodyAD --host <dc> -d example.local -u user -p pass get object 'WKSTN01$' --attr ms-Mcs-AdmPwd
Notes d'exploitation#
- Un mot de passe LAPS récupéré donne administrateur local sur ce seul hôte (LAPS attribue à chaque machine un mot de passe unique), il s'agit donc de mouvement latéral une machine à la fois, pas d'une clé maîtresse : extrayez-en les secrets et pivotez.
- Qui peut lire LAPS est défini par la délégation de l'OU ; cherchez des droits de lecture trop larges (un groupe de support, ou
Authenticated Userspar mauvaise configuration) avec l'énumération des ACL. - Les mots de passe chiffrés de Windows LAPS nécessitent le déchiffreur autorisé ; si vous n'avez que la lecture et non les droits de déchiffrement, le blob est inutile tant que vous n'atteignez pas ce principal.
- L'historique des mots de passe LAPS (Windows LAPS) peut exposer un mot de passe plus ancien encore valide ailleurs ou utile contre du matériel mis en cache.
Outils#
- NetExec (
nxc)-M laps: lire par LDAP les attributs LAPS hérités et Windows LAPS. - pyLAPS / LAPSDumper : get/set des attributs LAPS depuis Linux.
- bloodyAD (
get object --attr) : lecture brute dems-Mcs-AdmPwd/msLAPS-Password.