
Автономная DLL, которая после внедрения в процесс KeePass экспортирует базы данных в открытом виде.
Автономная DLL, которая экспортирует базы данных в открытом виде после внедрения в процесс KeePass.
Во многом вдохновлён замечательными проектами KeeFarce, KeeThief и KeePassHax.
Несколько лет назад @denandz выпустил KeeFarce — первый наступательный инструмент, предназначенный для извлечения баз данных KeePass в открытом виде. Он работает путём внедрения DLL в запущенный процесс, а затем обходит кучу с помощью ClrMD, чтобы найти нужные объекты и с помощью рефлексии вызвать встроенный метод экспорта KeePass. Единственным недостатком на тот момент было то, что на цель нужно было скинуть несколько файлов (экспортирующая DLL + DLL ClrMD + инжектор + загрузочная DLL).
Год спустя @tifkin_ и @harmj0y выпустили подробный обзор атакующих техник, нацеленных на KeePass (хотя в блоге harmj0y их больше нет, статьи можно найти в Wayback Machine: часть 1, часть 2). Результатом стал выпуск KeeThief — инструмента, способного расшифровать мастер-ключ KeePass (в том числе при использовании альтернативных методов аутентификации). Он работал настолько хорошо, что разработчики KeePass добавили параметр для противодействия этой технике (его можно отключить, отредактировав конфигурационный файл KeePass, если у пользователя достаточно прав, что довольно часто бывает).
Эти инструменты быстро стали моим выбором по умолчанию при пентестах, но вскоре устарели, поскольку их техники инжекции (а именно знаменитая группа Win32 API: VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, WriteProcessMemory и т.д.) теперь мгновенно детектируются. @snovvcrash решил эту проблему, форкнув KeeThief (сейчас он в приватном репозитории, но всё ещё доступен здесь), чтобы улучшить механизм инжекции с помощью D/Invoke, и написал отличную статью с описанием проделанной работы. Хотя это показало, что поддерживать KeeThief реально, мне сложно регулярно реализовывать новые техники инжекции, так как код KeeThief жёстко связан с его инжектором.
@holly-cracker также выпустил KeePassHax, который представляет собой одну DLL и использует только рефлексию для расшифровки мастер-ключа KeePass. Вдохновившись этой работой, я решил сделать то же самое с KeeFarce и написать собственный инструмент для извлечения данных из KeePass со следующими возможностями:
KeeFarce Reborn также предоставляет DLL-плагин для KeePass, позволяющий KeePass внедрить сам себя без возни с инжекторами!
Поскольку код использует только .NET Framework без внешних зависимостей, он должен легко компилироваться в Visual Studio 2015 и новее.
KeeFarce Reborn не включает инжектор для загрузки DLL в процесс KeePass. Это сделано намеренно: инжекторы устаревают каждые несколько месяцев, поэтому вам придётся использовать свой собственный. В следующих разделах показаны два типичных способа выполнить инжекцию.
Предварительное требование: доступ на запись в каталог плагинов KeePass.
KeePass имеет плагинный фреймворк, предоставляющий пользователям дополнительные возможности. Он работает за счёт загрузки DLL в процесс KeePass, что позволяет разработчикам плагинов выполнять действия в домене приложения KeePass.
Следовательно, мы можем злоупотребить этой функциональностью, чтобы загрузить KeeFarce Reborn как плагин, даже не используя внешний инжектор! Вам нужно лишь скомпилировать проект KeeFarceRebornPlugin и скопировать DLL в каталог плагинов (он расположен в корне KeePass, а именно "C:\Program Files\KeePass Password Safe 2\Plugins" для глобальной установки).
Для правильной сборки проекта вам нужно скопировать целевую версию сборки KeePass.exe в каталог KeeFarceRebornPlugin либо использовать PLGX, если вы хотите, чтобы итоговый плагин был совместим с любой версией KeePass.
При следующем запуске KeePass и после разблокировки базы данных DLL будет загружена и инжекция выполнена. Если KeePass уже запущен, придётся дождаться следующего перезапуска, чтобы инжекция произошла (или перезапустить его самостоятельно).
⚠️ После загрузки плагина файл DLL будет защищён от записи, пока KeePass не будет закрыт. Имейте это в виду, чтобы не оставлять после себя вредоносные плагины во время тестов.
Если у вас нет доступа на запись в каталог плагинов KeePass, обратите внимание на статью Quarkslab, в которой показано, как загружать плагины с меньшими привилегиями через кэш плагинов.
Предварительное требование: KeePass запущен + база данных разблокирована пользователем + у вас достаточно прав для внедрения в процесс KeePass.
Поскольку лично мне проще скрытно внедрять шеллкод, чем DLL, в удалённый процесс, обычно я начинаю с генерации позиционно-независимого шеллкода из нашей DLL. Оказывается, проект donut от @odzhan и @TheWover идеально подходит для наших нужд!
Мы компилируем donut из коммита в ветке dev, так как там исправлена проблема с управлением доменами приложений, которая не позволяла нам выполнять рефлексию в домене по умолчанию.
git clone https://github.com/TheWover/donut/
cd donut
git checkout 9d781d8da571eb1499122fc0e2d6e89e5a43603c
Мы можем легко собрать его из x64 Native Tools Command Prompt от Visual Studio с помощью утилиты nmake:
nmake -f Makefile.msvc
Генерация шеллкода выглядит так:
.\donut.exe "C:\KeeFarceReborn\KeePassReborn\bin\Release\KeeFarceReborn.dll" -c KeeFarceReborn.Program -m Main -e 1
[ Donut shellcode generator v0.9.3
[ Copyright (c) 2019 TheWover, Odzhan
[ Instance type : Embedded
[ Module file : "C:\KeeFarceReborn\KeePassReborn\bin\Release\KeeFarceReborn.dll"
[ Entropy : None
[ File type : .NET DLL
[ Class : KeeFarceReborn.Program
[ Method : Main
[ Target CPU : x86+amd64
[ AMSI/WDLP : continue
[ Shellcode : "loader.bin"
Обратите внимание, что
-e 1необходим для отключения энтропии, иначе внедрённый процесс не окажется в домене приложения по умолчанию.
Сожмём его с помощью PowerShell для более удобной интеграции в код инжектора: