什么是 HASSH?
HASSH 是由 Salesforce 安全研究人员提出的一种网络指纹方法,依据 SSH 在算法协商阶段的行为识别客户端与服务器。名称由 “hash” 与 “SSH” 联想而来,核心做法是对 SSH 握手中的特定参数拼接后计算 MD5。
建立 SSH 连接时,客户端与服务器会交换各自支持的密码算法列表。HASSH 从 Key Exchange Init(KEXINIT)等消息中提取这些列表,生成相对稳定的指纹,用于区分不同的 SSH 软件、版本与实现——即便后续信道已加密,握手阶段的信息对旁路观察者仍是可见的。
要点:HASSH 并不“破解”SSH 加密,而是分析握手阶段的公开元数据。这对威胁检测、异常发现和网络监控很有价值。
HASSH 如何计算
HASSH 从 SSH Key Exchange Init(KEXINIT)中取出若干字段,按约定顺序拼接后做 MD5:
- 从 SSH 握手中取得客户端或服务器的 KEXINIT
- 将四类算法列表按顺序用分号拼接
- 对拼接字符串计算 MD5
- 得到的哈希即为 HASSH 指纹
四类算法列表
HASSH 字符串格式
格式: kex_algs;enc_algs;mac_algs;comp_algs
示例 HASSH 字符串:
diffie-hellman-group14-sha256,ecdh-sha2-nistp256;aes128-ctr,aes256-ctr;hmac-sha2-256,hmac-sha1;none,zlib@openssh.com
MD5(HASSH 指纹):
92674389fa1e47a27ddd8d9b63ecd42b
HASSH 客户端指纹
HASSH Client Fingerprint 标识 SSH 客户端软件。不同客户端(OpenSSH、PuTTY、WinSCP 等)宣告的算法集合与顺序不同,因而指纹不同。
常见客户端与指纹(示意)
| SSH 客户端 |
版本 |
HASSH 指纹 |
| OpenSSH |
7.4 |
92674389fa1e47a27ddd8d9b63ecd42b |
| PuTTY |
0.70 |
9f7b9f7b5e3d9b2e0e3e9b7f5e3d9b2e |
| WinSCP |
5.15 |
a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6 |
| Paramiko |
2.7.2 |
9f71a5d8c5d9b6e9f0e0b3c7a8d6e5f4 |
说明:上表指纹仅为示例;真实环境随版本与配置变化。识别时应维护并及时更新指纹库。
客户端指纹的典型用途
- 异常检测:发现网络中出现的陌生 SSH 客户端
- 策略执行:发现未授权的 SSH 客户端
- 威胁狩猎:关联已知恶意工具或后门
- 资产盘点:统计环境中使用的 SSH 客户端类型
- 事件调查:在应急响应中关联 SSH 客户端行为
HASSH 服务器指纹
HASSH Server Fingerprint 标识 SSH 服务端实现,可用于发现未授权 SSH 服务、辅助识别蜜罐,或在组织内清点 SSH 软件版本。
常见服务器与指纹(示意)
| SSH 服务器 |
版本 |
HASSH 指纹 |
| OpenSSH |
7.4 |
b12d2871a1189eff20364cf5333619ee |
| Dropbear |
2019.78 |
c3e5f3e5b7d9a6f8e1c4b5a7d9e6f8a1 |
| libssh |
0.9.4 |
d4f8e6a1c9b7e5f3a2d8c6e9b1f4a7d5 |
| AsyncSSH |
2.7.0 |
e9f3b1d6c8a5e7f4b2d9c1e8a6f5b3d7 |
服务器指纹的典型用途
- 未授权服务检测:发现内网中未登记的 SSH 服务
- 蜜罐识别:部分蜜罐具有特征性指纹
- 服务清点:统计 SSH 服务端版本
- 漏洞管理:定位存在已知问题的 SSH 实现
- 合规:确认仅部署经批准的 SSH 软件
在 CyberChef 中使用 HASSH
CyberChef 提供两个相关 Operation:
HASSH Client Fingerprint
根据 SSH 客户端的 Key Exchange Init 数据生成 HASSH 指纹。
输入:
来自客户端的 SSH_MSG_KEXINIT 数据包
输出:
标识客户端的 MD5 哈希
HASSH Server Fingerprint
根据 SSH 服务端的 Key Exchange Init 数据生成 HASSH 指纹。
输入:
来自服务端的 SSH_MSG_KEXINIT 数据包
输出:
标识服务端的 MD5 哈希
生成指纹的步骤:
- 使用 Wireshark、tcpdump 等抓取 SSH 流量
- 提取 SSH Key Exchange Init(KEXINIT)报文
- 复制客户端或服务端 KEXINIT 的 hex(或按 Operation 要求输入)
- 粘贴到 CyberChef Input
- 添加 HASSH Client Fingerprint 或 HASSH Server Fingerprint
- 查看输出的指纹哈希
- 与已知指纹库比对
实际应用
安全运营中心(SOC)
将 HASSH 接入 SIEM 等系统,可例如:
- 对首次出现的 SSH 客户端/服务端告警
- 发现利用 SSH 作 C2 的恶意软件
- 通过异常客户端发现横向移动
- 按客户端类型统计暴力破解行为
威胁情报
可建立 HASSH 与下列对象的关联库:
- 已知恶意软件家族
- 攻击者工具与基础设施
- 失陷主机与僵尸网络
- 合法软件基线(用于对比)
事件响应
调查过程中可:
- 判断攻击者使用的 SSH 客户端类型
- 在多系统间关联 SSH 活动
- 判断是否部署了非预期 SSH 服务
- 梳理攻击者 SSH 工具使用时间线
网络监控
持续监控例如:
- 意外的 SSH 客户端/服务端软件
- 违反策略的未授权 SSH 工具
- 带嵌入式 SSH 的 IoT 设备
- 影子 IT 下的 SSH 部署
流量分析与抓包
捕获 KEXINIT
以 Wireshark 为例:
# 捕获过滤器:SSH
tcp port 22
# 显示过滤器:SSH KEXINIT
ssh.message_code == 20
# 步骤:
1. 在网卡上开始抓包
2. 发起 SSH 连接
3. 过滤 SSH KEXINIT(消息类型 20)
4. 右键数据包 → Copy → …as Hex Dump
5. 粘贴到 CyberChef 按流程处理
自动化指纹
不少安全产品已支持 HASSH,例如:
- Zeek(原 Bro):带 HASSH 日志的 SSH 分析脚本
- Suricata:可提取 HASSH 的 IDS 规则
- NetworkMiner:从 PCAP 解析 HASSH
- Elastic Stack:Packetbeat 等含 SSH HASSH 相关能力
局限与注意点
指纹稳定性
以下情况可能导致 HASSH 变化:
- 软件升级换代
- 配置修改改变了默认算法偏好
- 自定义编译改变了算法列表
- 用户手动限定算法
哈希碰撞
MD5 碰撞在理论上存在,但对 HASSH 实际场景而言概率极低;不同软件版本通常有明显不同的算法组合。
加密流量
HASSH 利用的是握手阶段未加密(或明文可见)的部分,故适用于 SSH;但必须在连接建立过程中抓到相应报文。
对抗与定制实现
了解 HASSH 的攻击者可能:
- 修改客户端以模仿常见软件
- 使用大众客户端“混入”正常流量
- 打乱算法顺序以干扰特征匹配
纵深防御:HASSH 只是整体安全策略中的一环,宜与行为分析、认证监控、异常检测等结合使用。
数据库与资源
公开资源
- Salesforce HASSH:原始项目与示例指纹
- GitHub:社区维护的指纹列表
- 威胁情报源:含恶意软件 HASSH 的商业/开源情报
自建指纹库
可按下述思路维护:
- 清点所有授权 SSH 客户端与服务端
- 为各环境生成 HASSH
- 记录版本与配置
- 随升级更新指纹
- 视情况与安全社区共享发现(注意脱敏)
CyberChef Recipe 思路
与 HASSH 相关的组合示例:
- PCAP: Extract SSH packets → HASSH Client/Server Fingerprint
- 批量: Split packets → HASSH Fingerprint → Unique
- 狩猎: HASSH Fingerprint → Find / Replace → 与恶意列表比对
- 报表: HASSH Fingerprint → To Table
- 格式: From Hex → HASSH Fingerprint
实践建议
安全监控
- 建立环境内“正常”HASSH 基线
- 对首次出现的指纹告警并跟进
- 将 HASSH 与用户名、IP、时间等元数据关联
- 定期更新指纹库
- 及时调查异常
事件响应
- 从抓包中提取 HASSH
- 与已知攻击工具指纹比对
- 在环境中搜索相同指纹
- 记录事件中发现的新的指纹
- 将含 HASSH 的 IOC 在安全流程中共享(合规前提下)
防护
- 勿单独依赖 HASSH——存在规避手段
- 结合认证监控与行为分析
- 落实 SSH 密钥与访问策略
- 对 SSH 访问尽量采用多因素认证等措施
- 在网络边界监控 SSH 流量
← 返回操作指南