从内存中偷取未加密的 SSH-agent 密钥 【已翻译100%】

如果你曾使用SSH密钥来管理多台机器,那么你可能使用过SSH-agent.这个工具使SSH密钥在内存中持续化,这样用户就不用每次都输入口令。然而,这会导致一些安全风险。root用户可能有权限从内存中取出解密后的SSH密钥,并重构它。

由于需要root权限,这种攻击看起来没什么用。例如,一个攻击者可能安装一个Keylogger并使用它来获得SSH密钥的口令。然而,这要等待肉鸡输入它们的口令。这取决于肉鸡掉线的频度,可能需要几个小时,几天或几周。在快速攻击方法中,这也是为什么从内存中获取SSH密钥对于转向其他机器至关重要。

使用SSH-agent

使用SSH-agent的一个常用方法就是运行"SSH-agent bash",再运行"SSH-add"把键值添加到代理中。一旦添加完成,键值将常驻SSH-agent堆栈中,直到进程终止.当用户使用带有-d或-D选项的SSH-add命令,其他键值也被添加。大多数人只运行一次并遗忘,除非他们需要重启机器。

**从内存中取出SSH Key
**
有一些方法创建SSH-agent内存的副本。最简单的方法是围绕gdb的使用。Gdb使用ptrace调用来绑定SSH-agent。这就为gdb创建运行进程中的内存dump提供了必需权限。 grabagentmem.sh 脚本 提供了一种自动dump内存的方法。默认情况下,当它运行时就会创建一个关于每个SSH-agent进程堆栈的内存dump.这些文件命名为SSHagent-PID.stack.

root@test:/tmp# grabagentmem.sh
Created /tmp/SSHagent-17019.stack

如果机器上的gdb不可用,把整个机器上的内存dump下来,并使用volatility提取SSH-agent进程的堆,这也是一种可行的方案。然而,这个进程当前超过了本文档的范围。

从内存dump中解析SSH密钥

一旦我们得到了堆栈的副本,就有可能从该文件中提取密钥。然而,这个有 SSH-agent 创建的密钥在堆栈中用不同的格式保存的。因此,就有了parse_mem.py 脚本。它需要安装 pyasn1 模块.安装好后,就可以处理内存文件了。如果内存文件中包含了一个合法的 RSA SSH 密钥,就会把它保存在磁盘中。该工具的后续版本将会支持附加关键格式,例如 DSA, ECDSA, ED25519 和 RSA1。

root@test:/tmp# parse_mem.py /tmp/SSHagent-17019.stack /tmp/key
Found rsa key
Creating rsa key: /tmp/key.rsa

这个 key.rsa 文件可作为 SSH 中 switch 的 -i 参数。这就像原始的用户密钥,不需要口令去解析。

获取合法可用的 SSH 密钥可以帮助渗透者获取更高的客户端网络访问权限。密钥被用户账号和服务器上的

root 账户同时使用,也是很常见的事情。也可能是服务器配置成只有密钥才可访问。获取到未加密的密钥,才能在环境中游刃有余。

时间: 2024-10-24 07:47:47

从内存中偷取未加密的 SSH-agent 密钥 【已翻译100%】的相关文章

如何从内存中抓取大智慧的全推送数据

问题描述 大智慧的所有最新行情数据是全推送的,即连接网络后就会把所有股票的最新数据加载到本机内存的,如果能获取到,相当于一个效率极高的行情接口,使用.NET可以做到,但目前还没思路. 解决方案 解决方案二:这个得大量用到WindowsAPI,通过程序注入,获取另一个程序的内存内容.最关键的是怎么找到哪段内容是你需要的数据,而且里面格式的问题,说不定还有加密.解决方案三:加密是必須的解决方案四:哪天楼主搞出来了,第一个购买!解决方案五:不知道用钩子能注入不不过我想没这么简单了解决方案六:大智慧是什

用手机从锁定的计算机中偷取凭证信息

了解到这一点之后,我们就可以尝试用Android网络共享功能--也就是所谓的Tethering来创建网络.启用网络共享功能之后,手机设备就能够接收来自主机的所有通信数据,手机是作为网关存在.这样一来要执行中间人攻击简直轻而易举. 本文中,我将为大家讲解其中涉及的步骤,工具,以及进行一次成功攻击所需要的配置. Android网络共享功能 Android设备进入USB Tethering网络共享模式的时候,系统会在USB接口新增一个USB接口描述符并重启. 主机操作系统会查询Android设备,也就

在 HAproxy 1.5 中使用 SSL 证书 【已翻译100%】(1/2)

概述 如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们. 单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码.由于负载均衡器处在客户端和更多服务器之间,SSL连接解码就成了需要关注的焦点. 有两种主要的策略. SSL终端是在负载均衡器终止/解码SSL连接并发送非加密连接到后台服务器的做法 这意味着负载均衡器负责解码SSL连接 - 涉及非SSL请求的缓慢的CPU密集型处理. 这与SSL穿透相反, 它是直接向代理服务器发送SSL连接的. 使用SSL穿透,SSL连接

在 HAproxy 1.5 中使用 SSL 证书 【已翻译100%】(2/2)

接着,我们要调整后台end配置.注意,我们还要将这个更改成TCP模式,并删除一些directives以避免因为修改/增加HTTP报头功能所带来的冲突: backend nodes mode tcp balance roundrobin option ssl-hello-chk server web01 172.17.0.3:443 check server web02 172.17.0.4:443 check 正如你所看到的,这里设置成了mode tcp - 前端和后台配置都需要设置成这个模式.

Vagrant 中高效的 Puppet 模块管理 【已翻译100%】

到现在我还记得首次尝试使用vagrant和puppet这两个工具来准备本地开发环境时候的场景.找出适当的方式来捆绑puppet模块与项目后一切都是很容易做到.基本上它可以通过三步阶段来实现. 1.运行"puppet module install "并将它们添加到 git repo (不是最棒的主意但相对简单). 2.在项目中把puppet模块作为 git 的子模块添加好.这原来是更加麻烦,添加/删除/更新模块成为了真正的痛苦. 3.作为它们的依赖项 使用 puppet-libraria

在 AngularJS 应用中通过 JSON 文件来设置状态 【已翻译100%】

想象一个使用简单的angular UI路由的 angularjs 应用: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example</title> <script src="bower_components/angular/angular.js"></script> <script src

AngularJS 中的友好 URL —— 移除URL 中的 # 【已翻译100%】

AngularJS 默认将会使用一个 # 号来对URL进行路由. 例如: http://example.com/ http://example.com/#/about http://example.com/#/contact 要获得干净的URL并将井号从URL中移除是很容易的. 完成两件事情就行了. 1.配置 $locationProvider 2.设置我们的相对连接的起点路径 $location 服务 在Angular中, $location服务会解析地址栏中的URL,并对你的应用程序作出改变

Docker 中如何连接多个 Container 协同工作 【已翻译100%】

在Docker使用部分我们接触到了通过网络端口来连接运行在Docker容器内的服务.这是同Docker容器内服务和应用互动的方法之一.在这一节中,我们将带你复习一下通过网络端口连接到Docker容器并给你介绍容器连接的概念. 网络端口映射刷新 在Docker的使用部分中,我们创建了一个运行Python Flask应用的容器. $ sudo docker run -d -P training/webapp python app.py 注意:容器有一个内部网络和IP地址(还记得在使用Docker部分

Docker 中管理数据 【已翻译100%】

到目前我们介绍了一些Docker的基础概念, 知道了如何使用Docker的image, 也知道了如何在多个container间通过网络通讯. 在这章里我们将介绍如何在docker的container内管理数据以及如何在不同的container间共享数据. 我们将介绍两种主要的在docker中管理数据的方法: Data volumes Data volume container Data volumes 一个 data volume 就是一个在一个或者多个container里的特殊用途的目录.它绕