从正在运行的Apache实例中检索RSA密钥?


26

我为SSL证书创建了RSA密钥对,并将私钥存储在中/etc/ssl/private/server.key。不幸的是,这是我拥有的唯一私钥副本。

然后我不小心覆盖了磁盘上的文件(是的,我知道)。

Apache仍在运行并仍在处理SSL请求,这使我相信恢复私钥可能会有希望。(也许在某处/proc或某处有符号链接?)

该服务器正在运行Ubuntu 12.04 LTS。

Answers:


39

成功!

我能够检索到私钥。但这并不容易。这是您需要做的:

  1. 制作确保你不重新启动服务器或Apache。比赛到此结束。这也意味着确保没有监视服务重新启动Apache。
  2. 抓住这个文件 -源代码的工具名为过时,partout
  3. 提取源代码并调整第9行Makefile.main以读取:

    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
    

    (请注意,$(OBJS)$(LDFLAGS)的顺序相反。)

  4. 运行./build.sh
  5. 使用以下命令获取Apache的PID:

    service apache2 status
    
  6. passe-partout超级用户身份运行命令:

    sudo passe-partout [PID]
    

    ... [PID]您在步骤5中检索到的值在哪里。

  7. 如果程序成功执行,则当前目录将具有一堆额外的键:

    you@server:~# ls
    id_rsa-0.key  id_rsa-1.key  id_rsa-2.key
    

如果一切顺利(并希望它做得很好),那么其中之一就是您需要的钥匙。但是,如果您使用的证书/密钥文件不止一个,那么您需要确定它是哪个。这是您的操作方式:

首先获取与签名密钥匹配的证书副本。假设文件名为server.crt,请运行以下命令:

openssl x509 -noout -modulus -in server.crt | openssl md5

这将输出一个您需要与每个键匹配的值。对于每个键,运行以下命令:

openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5

如果其中之一匹配,则说明已找到密钥。


信用: 这篇文章指出我要过路。


2
在该实用程序上很好的发现。
Falcon Momot

3
+1代表文章撰写(而虚拟+1代表文章作者:感到羞耻并仍然写下来可以帮助其他人)。
约阿希姆·绍尔

2
哦,太好了,太脏了。我喜欢它。
汤姆·奥康纳

8

它最有可能将密钥存储在内存中,因为它需要在删除特权和/或使用提供的密码短语对密钥进行解密后保留副本,因此需要这样做。

从理论上讲,如果您连接了调试器,则可以将其从过程映像中删除,尽管如果调试器遵循最佳实践,则会针对内存中的内容对其进行加密。

就是说,如果碰巧它仍然保持打开状态,/proc/${PID}/fd/${SOMETHING}也许就是这样。如果覆盖了它,则密钥将不存在,因为将覆盖数据。如果将其他内容复制到其位置(或删除或取消链接,或递归删除其父目录),则该目录将在那里。


我曾经cp复制新密钥代替旧密钥。
内森·奥斯曼

我浏览了/proc…… 的打开文件描述符。
内森·奥斯曼

那时可能没有打开副本,这是读取私钥的常见情况。您唯一的选择是弄清楚从源中存储它的方式和位置,使用调试器将其取出(假设您使用符号构建),然后对其进行解密...或替换证书。
Falcon Momot

我知道了!您是对的-Apache确实将密钥保留在内存中,并且我能够检索到它们。请看我的回答。
内森·奥斯曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.