解密利器:破解SSH加密会话的终极指南!
字数 3481 2025-10-02 20:43:13
SSH加密会话解密技术深度解析
1 SSH协议基础
1.1 协议概述
SSH(Secure Shell)是由芬兰学者Tatu Ylönen于1995年设计的加密通信协议,广泛应用于远程登录、文件传输和运维自动化场景。作为Linux系统标准配置,它通过加密登录信息显著提升网络安全性。
1.2 协议工作流程
SSH协议通信包含七个关键阶段:
- 连接建立:客户端向服务器22端口发起TCP连接
- 版本协商:交换并确定SSH版本号
- 算法协商:确定密钥交换、加密、签名和数据完整性保护算法
- 密钥交换:通过Diffie-Hellman算法生成共享会话密钥和会话ID
- 用户认证:支持密码认证或密钥认证方式
- 会话请求:客户端请求特定服务(如远程shell)
- 会话交互:使用会话密钥进行数据加解密通信
2 SSH数据包深度剖析
2.1 版本协商分析
- 客户端标识:SSH-2.0-OpenSSH_7.2p2 Ubuntu
- 服务端标识:SSH-2.0-OpenSSH_9.3p2 Debian
- 协商结果:使用SSH 2.0协议版本
2.2 算法协商细节
客户端和服务端交换的算法信息包括:
密钥交换算法:
- curve25519-sha256@libssh.org
- ecdh-sha2-nistp256/384/521
- diffie-hellman-group-exchange-sha256
- diffie-hellman-group-exchange-sha1
- diffie-hellman-group14-sha1
- ext-info-c
加密算法(客户端到服务端):
- chacha20-poly1305@openssh.com
- aes128-ctr/aes192-ctr/aes256-ctr
- aes128-gcm@openssh.com/aes256-gcm@openssh.com
- aes128-cbc/aes192-cbc/aes256-cbc
- 3des-cbc
最终协商结果:
- encryption: chacha20-poly1305@openssh.com
- mac: <implicit>
- compression: none
2.3 密钥交换过程
- 客户端发送Elliptic Curve Diffie-Hellman Key Exchange Init (30)
- 服务端回复Elliptic Curve Diffie-Hellman Key Exchange Reply (31)
- 双方交换New Keys (21)消息确认密钥交换成功
- 后续通信使用加密数据进行
3 SSH会话解密技术
3.1 解密原理
SSH通信分为两个阶段:
- 生成会话密钥(明文通信)
- 使用会话密钥加密通信
解密需要获取OpenSSH的会话密钥,利用密钥对加密数据进行解密。
3.2 会话密钥提取方法
3.2.1 使用OpenSSH-Session-Key-Recovery工具
- GitHub项目:https://github.com/fox-it/OpenSSH-Session-Key-Recovery
- 技术原理:在ssh/sshd进程堆栈中匹配sshenc结构体数据
- 输出内容:包含Client/Server端的加密算法、key值、IV值等信息
sshenc结构体定义:
struct sshenc {
char *name; /* 算法名称 */
Cipher *cipher; /* 密码算法指针 */
int enabled; /* 是否启用 */
u_int key_len; /* 密钥长度 */
u_int iv_len; /* IV长度 */
u_int block_size; /* 块大小 */
u_char *key; /* 密钥指针 */
u_char *iv; /* IV指针 */
};
3.2.2 手动提取会话密钥
通过GDB调试工具附加sshd-session进程:
- 附加进程:
sudo gdb attach <PID> - 查找堆栈地址:
info proc mappings - DUMP堆栈内存:
dump memory heapdump <start_addr> <end_addr> - 定位sshenc结构体:在二进制数据中查找特征值
3.2.3 辅助提取脚本
可编写自动化脚本从堆栈内存中提取SSH会话密钥,提高提取效率。
3.3 解密工具使用
3.3.1 OpenSSH-Network-Parser工具
- GitHub项目:https://github.com/fox-it/OpenSSH-Network-Parser
- 功能:解析pcap包并利用提取的密钥解密SSH通信
工作流程:
- 解析pcap数据包,提取SSH载荷
- 识别New Keys消息,从key.json提取密钥数据
- 尝试解密并识别Client/Server端
- 使用密钥解密后续通信数据
3.3.2 定制化解密工具
针对标准工具的局限性,可开发定制化解密工具,实现以下增强功能:
- 支持HMAC算法解密(针对流加密算法配套的HMAC)
- 提供解密前后数据对比展示
- 结构化解析解密内容
- 支持更多加密算法组合
4 SSH加密会话解析
4.1 认证与会话建立过程
| SSH消息类型 | 消息号 | 关键信息 | 说明 |
|---|---|---|---|
| Client ServiceRequest | 0x05 | ssh-userauth | 请求用户认证服务 |
| Server ServiceAccept | 0x06 | ssh-userauth | 接受用户认证服务 |
| Client UserAuthRequest | 0x32 | ssh-connection | 发起认证请求(用户名) |
| Server UserAuthFailure | 0x33 | "Methods": ["publickey","password"] | 返回可用认证方法 |
| Client UserAuthRequest | 0x32 | ssh-connection | 发起认证请求(用户名+密码) |
| Server UserAuthSuccess | 0x34 | 用户认证成功 | |
| Client ChannelOpen | 0x5A | session | 请求打开会话通道 |
| GlobalRequest | 0x50 | no-more-sessions@openssh.com | 全局请求:"不再有更多会话" |
| Server GlobalRequest | 0x50 | hostkeys-00@openssh.com | 传输主机公钥列表 |
| ChannelOpenConfirm | 0x5B | 确认通道已成功打开 |
4.2 会话交互过程
- 终端请求:Client发送pty-req请求终端
- 环境设置:Client发送env设置环境变量
- 执行命令:Client发送shell执行命令
- 数据传输:通过ChannelData(0x5E)传输实际数据
- 会话终止:通过exit、eow@openssh.com和ChannelClose消息关闭会话
4.3 解密数据解析
服务端返回数据包含ANSI转义码,例如:
\x1b[4m:设置文本下划线格式\x1b[24m:取消下划线格式\x1b[38;2;153;153;153m:设置前景色为RGB(153,153,153)\x1b[39m:重置前景色\x1b[8D:光标左移8字符位置
5 技术局限性与应对策略
5.1 工具使用缺陷
- HMAC算法支持不足:流加密算法配套的HMAC密钥提取不完整
- 进程名识别限制:仅识别ssh/sshd进程,新版OpenSSH使用sshd-session
- 解密过程不透明:标准工具缺乏解密过程的可视化展示
5.2 应对策略
- 修改工具源码:增加对新进程名的支持
- 手动密钥提取:通过GDB直接提取内存中的密钥数据
- 开发定制工具:增强解密过程的可视化和解析能力
6 实际应用场景
6.1 安全审计
- 解密SSH会话进行安全审计和异常行为检测
- 分析加密通道中的敏感数据传输
6.2 取证调查
- 调查安全事件中的SSH会话内容
- 恢复攻击者在加密通道中的操作记录
6.3 教学研究
- 深入理解SSH协议工作原理
- 研究加密算法的实际应用和安全性
7 总结
SSH协议解密技术需要深入理解协议细节和OpenSSH实现机制。通过内存中的sshenc结构体提取会话密钥,结合通信数据包解析,可以实现SSH加密会话的解密。这项技术对安全审计、取证分析和协议研究都有重要价值,但需要注意算法的完整性和工具的限制性。
注意事项:本技术仅适用于合法授权的安全测试和研究目的,严禁用于未授权访问和非法活动。