概述
SSH(Secure Shell)协议是一种用于远程登录和安全网络传输的协议,默认端口是22,主要用于主机间的身份认证。SSH 协议支持多种身份验证方式,比如密码、公钥、证书等多种方式。当用户使用 SSH 连接到远程主机时,会先进行身份验证,以确保用户具有访问权限。如果身份验证成功,用户就可以在远程主机上执行命令或传输文件等。SSH 协议还提供了加密和完整性校验机制,可以确保数据在传输过程中不被篡改或窃听。
SSH协议分析
SSH 协议为了确保数据在传输过程中的安全性和完整性,使用了加密和消息认证码(MAC)两种技术。在 SSH 协议中,每个数据包都会使用 Cipher 加密算法进行加密,以防止数据被窃听或篡改。每个数据包发送之前,会生成一个 MAC,用于验证数据包在传输过程中是否发生了修改或被篡改。SSH 协议支持多种 MAC 算法,常用的有 HMAC-SHA1、HMAC-SHA2 等。
输入ssh -Q cipher获取客户端支持的加密算法列表。
SSH 协议认证过程一般分为以下几个步骤:
(1)SSH属于应用层协议,首先客户端和服务端会在传输层进行TCP三次握手。
(2)客户端连接服务器发送版本交换信息,并请求服务端返回相应的版本信息。
(3)服务端回应版本信息。
(4)接下来进入密钥协商阶段(Server: Key Exchange Init),服务端发送支持的各种加密算法。
kex_algorithms: 密钥交换算法,里边即包含我们使用的D-H算法,用于生成会话密钥
server_host_key_algorithms: 服务器主机密钥算法,有公私钥之分
encryption_algorithms: 对称加密算法
mac_algorithms: MAC算法,主要用于保证数据完整性
compression_algorithms: 压缩算法
(5)客户端发送支持的各种加密算法(Client: Key Exchange Init)。内容和服务端发送的大体一致。
(6)接下来进行密钥交换,密钥交换初始化阶段(Client: Elliptic Curve Diffie-Hellman Key Exchange Init),这个阶段涉及到客户端和服务器之间进行密钥交换,以便在会话期间安全地加密通信。ECDH是一种使用椭圆曲线算法的Diffie-Hellman密钥交换协议。它允许客户端和服务器协商出一个共享的密钥,而不必将该密钥通过网络传输,从而防止在传输过程中被中间人窃听或篡改。
(7)Server: Elliptic Curve Diffie-Hellman Key Exchange Reply, New Keys, Encrypted packet ,服务器端通过Diffie-Hellman密钥交换协议向客户端发送响应。在此步骤中,服务器回应客户端发送的密钥交换请求,以便双方协商共享一个加密密钥。
"New Keys":在密钥交换响应成功后,服务器和客户端都会生成新的会话密钥。该会话密钥用于加密在SSH连接期间传输的数据,以确保通信的保密性。
"Encrypted packet":在完成密钥交换并生成新的会话密钥后,SSH连接中的所有后续数据包都将使用该会话密钥进行加密,以保护数据在网络中的传输。
这次交互描述了SSH连接建立的过程。服务器通过Diffie-Hellman密钥交换协议回应客户端的密钥交换请求,然后双方生成新的加密密钥,并在后续的通信中使用该密钥对数据进行加密。
(8)Client: New Keys。这里说明两端的加密通道已经建立。接下来就到了SSH认证流程。传输的数据都会用会话密钥进行加密了。
应用场景
1、SSH登录
执行命令"ssh root@172.17.10.52"进行ssh连接,还没有输入密码时,客户端和服务端在进行密钥交换(New keys)后会产生两次数据传输。
输入错误的密码,客户端和服务端会进行一次数据交互。
当再次输入错误密码后,客户端和服务端还是只进行一次数据交互。
当输入正确的密码时,服务端会返回基本信息,因此客户端和服务端会进行多次数据传输。
由于SSH流量是加密的,在Wireshark中不容易区分登录成功或者失败。通过上述分析我们可以通过流量的其他特征得出是否登录成功。
(1)流长度,登录成功会产生比失败的会话更长的会话。
(2)数据包大小,登录成功或者失败服务端返回的内容是不一样的,通过观察SSH报文的长度,可以判断认证是否成功。
2、SSH爆破
这里我们使用hydra进行ssh暴力破解账密,分析产生的流量。
attacker: 172.17.10.43
victim: 172.17.10.52
首先使用hydra加载不包含真实密码的字典进行ssh爆破,抓取期间存在流量。
可以看到受害端响应的数据包长度为44、52
通过跟踪流可以看到回包长度为44的是客户端与服务端进行身份认证初始阶发送的数据包。响应长度为52说明是认证失败了。
然后使用hydra加载包含正确密码的字典进行ssh爆破,抓取期间存在流量。
可以看到受害端响应的数据包长度为28、44、52。
通过跟踪流可以看到第7次发包回包长度为28。
正确密码也在第7行。
通过会话的字节传输也可以看到登录成功传输的字节和登录失败有明显的差异。
3、SSH隧道
SSH 隧道(SSH Tunnel)是通过SSH协议建立的加密通道,原理是利用 SSH 协议的端口转发功能,将本地端口与远程服务器端口进行绑定,从而实现数据的加密传输。SSH 隧道分为本地转发和远程转发两种方式:
**本地转发:**将本地计算机上的应用程序请求发送到远程服务器上,并在远程服务器上执行相应的操作后将结果返回给本地计算机。
**远程转发:**将远程服务器上的应用程序请求发送到本地计算机上,并在本地计算机上执行相应的操作后将结果返回给远程服务器。
通过使用 SSH 隧道,可以在不安全的网络环境中实现安全的数据传输,同时也可以绕过某些网络限制和防火墙策略。
创建ssh隧道的常用参数如下:
\-C:压缩传输,提高传输速度
\-f :将ssh传输转入后台执行,不占用当前的shell
\-N:建立静默连接(建立了连接,但是看不到具体的会话)
\-g 允许远程主机连接本地用于转发的端口。
\-L:本地端口转发
\-R:远程端口转发
\-D:动态转发(socks代理)
\-p:指定ssh端口
这里搭建下本地端口转发的环境,并分析传输的数据包。
attacker: 172.17.10.43
victim: 172.17.10.52
首先使用python在受害主机上搭建http服务,开启 8888端口
`# python -m SimpleHTTPServer 8888`
在攻击机器上执行如下命令将受害主机本地的8888端口,转发到攻击机器的2222端口。
`ssh -g -L 2222:172.17.10.52:8888 -fN root@172.17.10.52`
在攻击机上执行请求2222端口,受害主机的8888端口收到响应
可以看到在攻击机登录成功后,执行curl发送命令,服务端连续发送了多个包来响应请求包,并且每个包长度都在1000+字节。
工具使用
packetStrider是一款针对SSH的数据包取证工具。通过对ssh协议的消息内容、方向、数据包大小、延迟时间等维度进行解析,利用统计分析和滑动窗口对解析后的数据包进行特征提取和匹配,来分析会话启动、按键、人类/脚本行为、密码长度、客户端证书的使用情况等信息,并得出对应的分析报告。
项目地址:https://github.com/thisisfalcon/packetStrider
使用方法:
# python packetStrider-ssh.py -f /root/44.pcap -k -p -o out
参考链接