黑客业务

24小时接单的黑客,黑客业务,黑客怎么找,网络黑客,黑客技术

取证分析之 OpenSSH Session 信息解密

不久前,我们遇到了一个取证案例,一个Linux服务器被打破,一个修改过的OpenSSH二进制文件加载到一个web服务器内存。修改后的OpenSSH二进制文件被攻击者用作系统的后门。在系统遭到破坏时,客户拥有pcap以及系统虚拟机监控程序的截图。根据这一发现,我们开始怀疑是否有可能通过从内存截图中恢复密钥材料来解密SSH session并获得关于它的知识。

本文将介绍我对OpenSSH研究发布了一些从内存中转储的研究OpenSSHsession密钥工具,结合使用pcap解密和解析session,此外,我还向2020年 Volatility framework plugin contest提交了我的研究成果。

SSH协议

首先,我会读书OpenSSH及其工作原理。幸运的是,OpenSSH它是开源的,所以我们可以很容易地下载和阅读细节。RFC虽然读起来有点无聊,但它也包含了丰富的信息。从更高的层次来看,SSH协议如下:

(1) SSH协议 软件版本交换;

(2) 算法协商(KEX INIT):

                   
  • 密钥交换算法;
  •                
  • 加密算法;
  •                
  • MAC算法;
  •                
  • 压缩算法;

(3) 密钥交换;

(4) 用户认证;

(5)客户请求“session”频道类型;

(6)客户端要求伪终端;

(7)客户端与session进行交互;

一开始,客户端将连接到服务器并发送协议版本和软件版本:

SSH-2.0-OpenSSH_8.3,服务器响应其协议和软件版本。交换初始协议和软件版本后,所有流量都包装在内SSH框架中。SSH框架主要存在于框架长度、填充长度、有效载荷数据、填充内容和MAC中。 SSH框架示例如下:

取证分析之 OpenSSH Session 信息解密

使用dissect.cstruct解析的SSH框架示例

在协商加密算法并生成session密钥之前,SSH框架将不被加密,并且即使加密了该框架,根据算法的不同,部分框架可能也不会被加密。例如,aes256-gcm框架中的四个字节长度不会加密,但是chacha20-poly1305加密。

接下来,客户端将发送到服务器KEX_INIT开始谈判的消息session参数,如密钥交换和加密算法。根据这些算法的顺序,客户端和服务器将选择双方支持的首选算法。KEX_INIT新闻发布后,交换几条与密钥交换相关的信息,然后双方互相发送NEWKEYS这个消息会告诉对方一切都准备好开始加密。session,下一个流程中的下一个框架将被加密。双方获得新的加密钥生效后,客户端将要求用户身份验证,并根据服务器上配置的身份验证机制进行基于密码/密钥/等的身份验证。session身份验证后,客户端将根据要求打开通道进行操作(ssh/ sftp/ scp等)通过该通道要求服务。

恢复session密钥

恢复session密钥的第一步是分析OpenSSH并调试现有的源代码OpenSSH我试着自己编译二进制文件OpenSSH,将生成的session在某个地方记录密钥,并添加调试器,然后在程序内存中搜索密钥。成功后,session密钥保存在堆中的内存中。对源代码的更多深入研究使我了解了负责发送和接收NEWKEYS框架函数。我发现有一个存储器“session_state”结构的“ssh”该结构还包括当前的结构SSHsession所有相关信息,包括一个newkeys结构包括加密,mac与压缩算法相关的信息。经过深入研究,我们终于找到了密码名称、密钥、IV和块长度的“shenc”结构。OpenSSH结构概述如下:

取证分析之 OpenSSH Session 信息解密

SSHENC结构与关系

以及shenc结构定义:

取证分析之 OpenSSH Session 信息解密

SSHENC结构

在内存中很难找到密钥本身(因为它只是一个随机字节的字符串),但是shenc它比其他结构更独特,具有一些我们可以验证的属性。然后,我们可以捕获程序的整个内存地址空间,并验证这些限制的每个偏差。我们可以检查以下属性:

                   
  • 名称、密码、密钥和iv成员是有效的指针;
  •                
  • name成员指向一个有效的密码名,相当于cipher-> name;
  •                
  • key_len在有效范围内;
  •                
  • iv_len在有效范围内;
  •                
  • block_size在有效范围内;

如果我们验证所有这些约束,我们应该能够可靠地找到它们shenc结构。为此,我开始建造一个POC Python脚本,脚本可以在实时主机上运行,主机连接到过程并勾勒出结构中的内存。你可以在这里找到脚本的源代码,它实际上工作得很好,并输出每个密钥json blob。因此,我演示了它可以使用Python和ptrace恢复活动主机session但是如何从内存截图中恢复密钥呢?session密钥呢?Volatility发挥作用的地方。Volatility是一个用Python自定义插件可以编写内存取证框架。经过一些努力,我可以写Volatility 2插件可分析内存截图并转存session密钥!对于Volatility 3 plugin contest ,我也把插件移植到了Volatility 3,并提交插件进行研究。

取证分析之 OpenSSH Session 信息解密

Volatility 2 SSH Session密钥转储器的输出结果

解密和分析流量

用于加密和解密通信session密钥恢复成功,下一步是解密通信流量!我开始使用它pynids(TCP分析和重组库pcap。我使用内部开发dissect.cstruct对数据结构进行分析,并开发了分析框架ssh等待协议。分析框架基本上以正确的顺序将数据包发送到协议分析器。因此,如果客户发送两个数据包,服务器响应三个数据包,这些数据包也将以相同的顺序提供给分析器。这对保持整体协议状态非常重要,基本上使用分析器SSH框架,直到遇到NEWKEYS到目前为止,这表明下一个框架已经加密。现在,分析器从源中窥视流中的下一个框架并迭代session试着解密框架的密钥。如果成功,分析器将在此状态下安装session密钥以解密session解析器几乎可以处理其他框架OpenSSH对于支持的所有加密算法,请参见以下动图:

取证分析之 OpenSSH Session 信息解密

SSH协议解析

最后是运行中的分析器,你可以看到解密和分析SSHsession该过程还暴露了用户用于身份验证的密码:

取证分析之 OpenSSH Session 信息解密

解密和分析SSHsession示例

总结

我研究过这篇文章SSH协议,以及如何将session存储和保存密钥OpenSSH在内存中,从内存中提取并在网络解析器中使用它们进行解密SSH对话并将其分析为可读输出的方法。本研究中使用的脚本可在以下链接中找到:

                   
  • 将Python POC转储为SSHsession密钥;
  •                
  • Volatility 2插件;
  •                
  • Volatility 3插件;
  •                
  • SSH协议解析器;
  •                
  • 会有更好的选择Wireshark该解密器和解析器在中间实现。

有趣的是,在研究期间,我还在OpenSSH源代码的ssh_set_newkeys这些注释行在函数中遇到。事实上,如果不注释这些行,这是讽刺的OpenSSH如果在二进制文件中编译,这项研究将更加困难。

 取证分析OpenSSH Session 信息解密

OpenSSH源代码片段

本文翻译自:https://research.nccgroup.com/2020/11/11/decrypting-openssh-sessions-for-fun-and-profit/

【责任编辑:赵宁宁 TEL:(010)68476606】

   
  • 评论列表:
  •  余安清淮
     发布于 2022-06-04 09:11:46  回复该评论
  • 结合使用pcap解密和解析session,此外,我还向2020年 Volatility framework plugin contest提交了我的研究成果。SSH协议首先,我会读书OpenSSH及其工作原理。幸运的是,Ope

发表评论:

Powered By

Copyright Your WebSite.Some Rights Reserved.