
Eine eigenständige DLL, die nach der Injektion in den KeePass-Prozess Datenbanken im Klartext exportiert.
Eine eigenständige DLL, die Datenbanken im Klartext exportiert, sobald sie in den KeePass-Prozess injiziert wurde.
Stark inspiriert von den großartigen Projekten KeeFarce, KeeThief und KeePassHax.
Vor einigen Jahren veröffentlichte @denandz KeeFarce, das erste offensive Tool, das entwickelt wurde, um KeePass-Datenbanken im Klartext zu extrahieren. Es funktioniert, indem es eine DLL in den laufenden Prozess injiziert und dann mit ClrMD den Heap durchläuft, um die notwendigen Objekte zu finden und KeePass' eingebaute Exportmethode per Reflektion aufzurufen. Sein einziger Nachteil damals war, dass mehrere Dateien auf dem Zielsystem abgelegt werden mussten (die Extraktions-DLL + ClrMD-DLL + der Injector + eine Bootstrap-DLL).
Ein Jahr später veröffentlichten @tifkin_ und @harmj0y eine ausführliche Analyse offensiver Techniken gegen KeePass (obwohl sie nicht mehr auf harmj0ys Blog verfügbar sind, sind die Artikel über die Wayback Machine zu finden: Teil 1, Teil 2). Dies führte zur Veröffentlichung von KeeThief, einem Tool, das in der Lage ist, KeePass' Masterkey zu entschlüsseln (auch wenn alternative Authentifizierungsmethoden verwendet werden). Es funktionierte so gut, dass die KeePass-Entwickler einen Parameter hinzufügten, um diese Technik abzuschwächen (er kann deaktiviert werden, indem man die KeePass-Konfigurationsdatei bearbeitet, sofern der Benutzer über ausreichende Rechte verfügt, was recht häufig vorkommt).
Diese Tools wurden während Penetrationstests schnell zu meinen bevorzugten Werkzeugen, aber sie wurden bald obsolet, da ihre Injektionstechniken (namentlich die berüchtigte Win32-API-Gang aus VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, WriteProcessMemory, usw.) mittlerweile sofort Erkennung auslösen. @snovvcrash ging dieses Problem an, indem er KeeThief forkte (jetzt in einem privaten Repo, aber weiterhin hier zugänglich), um den Injektionsmechanismus mit D/Invoke zu verbessern, und schrieb einen großartigen Artikel, der den von ihm verfolgten Prozess detailliert beschreibt. Auch wenn dies die Machbarkeit der Pflege von KeeThief demonstrierte, fällt es mir schwer, regelmäßig neue Injektionstechniken zu implementieren, da KeeThiefs Code eng mit seinem Injector verknüpft ist.
@holly-cracker veröffentlichte außerdem KeePassHax, das als einzelne DLL daherkommt und ausschließlich Reflektion verwendet, um KeePass' Masterkey zu entschlüsseln. Inspiriert von dieser Arbeit entschied ich mich, dasselbe mit KeeFarce zu tun und mein eigenes KeePass-Extraktionstool mit den folgenden Funktionen zu schreiben:
KeeFarce Reborn bietet außerdem eine KeePass-Plugin-DLL, damit KeePass sich selbst injiziert, ohne sich mit Injectoren herumschlagen zu müssen!
Da der Code ausschließlich auf .NET Framework ohne externe Abhängigkeiten basiert, sollte er problemlos mit Visual Studio 2015 und höher kompilieren.
KeeFarce Reborn enthält keinen Injector, um die DLL in den KeePass-Prozess zu laden. Das ist beabsichtigt, da Injectoren alle paar Monate veralten – du musst also deinen eigenen verwenden. Die folgenden Abschnitte zeigen zwei typische Möglichkeiten, eine Injektion durchzuführen.
Voraussetzung: Schreibzugriff auf das KeePass-Plugin-Verzeichnis.
KeePass verfügt über ein Plugin-Framework, um Benutzern zusätzliche Funktionen bereitzustellen. Es funktioniert, indem eine DLL in den KeePass-Prozess geladen wird, was Plugin-Entwicklern ermöglicht, Aktionen innerhalb der KeePass-Anwendungsdomäne auszuführen.
Folglich können wir diese Funktionalität missbrauchen, um KeeFarce Reborn als Plugin zu laden, ohne überhaupt einen externen Injector verwenden zu müssen! Du musst nur das Projekt KeeFarceRebornPlugin kompilieren und die DLL in das Plugin-Verzeichnis kopieren (das sich im KeePass-Wurzelverzeichnis befindet, nämlich "C:\Program Files\KeePass Password Safe 2\Plugins" bei einer globalen Installation).
Damit das Projekt korrekt erstellt wird, musst du die jeweilige KeePass.exe-Assemblyversion in das Verzeichnis KeeFarceRebornPlugin kopieren oder die PLGX verwenden, wenn das resultierende Plugin mit jeder KeePass-Version kompatibel sein soll.
Beim nächsten Start von KeePass und dem Entsperren einer Datenbank wird die DLL geladen und die Injektion durchgeführt. Wenn KeePass bereits läuft, musst du auf den nächsten Neustart warten, damit die Injektion erfolgt (oder den Neustart selbst erzwingen).
⚠️ Sobald ein Plugin geladen ist, ist die DLL-Datei bis zum Schließen von KeePass schreibgeschützt. Denke daran, um sicherzustellen, dass du bei Assessments keine schädlichen Plugins hinterlässt.
Wenn du keinen Schreibzugriff auf das KeePass-Plugin-Verzeichnis hast, wirf einen Blick auf Quarkslabs Artikel, der zeigt, wie Plugins mit weniger Rechten über den Plugin-Cache geladen werden können.
Voraussetzung: KeePass läuft + eine Datenbank ist vom Benutzer entsperrt + du hast ausreichende Rechte, um in den KeePass-Prozess zu injizieren.
Da ich persönlich es einfacher finde, Shellcode unauffällig zu injizieren als eine DLL in einen entfernten Prozess, beginne ich typischerweise damit, positionsunabhängigen Shellcode aus unserer DLL zu erzeugen. Es scheint, dass das donut-Projekt von @odzhan und @TheWover perfekt unsere Bedürfnisse erfüllt!
Wir kompilieren donut von einem Commit im Dev-Branch, da dieser ein Problem in der Anwendungsdomänenverwaltung behebt, das uns daran hindern würde, Reflektion in der Standarddomäne durchzuführen.
git clone https://github.com/TheWover/donut/
cd donut
git checkout 9d781d8da571eb1499122fc0e2d6e89e5a43603c
Wir können es problemlos aus der x64 Native Tools Command Prompt von Visual Studio mit dem Dienstprogramm nmake erstellen:
nmake -f Makefile.msvc
Das Erzeugen des Shellcodes ist so einfach wie:
.\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