写在前面
在此只是对ssh协议的报文进行了一次简单的分析,对于平常经常使用到ssh协议却不明白其中的缘由的人,看完之后可能会恍然大悟,这是有助于在平常生活和工作中更好的使用ssh协议的
1. SSH协议介绍
SSH (Security Shell)为建立在应用层基础上的安全协议。SSH 是 较可靠,专为 远程登录会话 和其他 网络服务提供安全性 的协议SSH,为建立在应用层基础上的安全协议。
SSH只是一种协议,它有很多的实现方法。Linux基本都会预装SSH功能,现在Windows也有对SSH功能的扩展。SSH协议是C/S模式所以会分客户端程序和服务端程序(一般是 sshd进程 ),Windows10有的SSH客户端和服务端功能,也可以下载putty,xshell,xftp等远程客户端软件,进行远程连接。
利用SSH协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。
它有两个不兼容的版本分别为:1.x 和 2.x。
1.1 功能 远程登陆(替代Telnet,ssh提供更安全可靠的服务且支持压缩,telnet端口23,ssh端口22)为其他网络服务提供一个 安全的“通道” ,消息会以密文的方式传输支持 压缩 传输的数据
1.2 SSH协议基本架构
可以看到SSH基本分为三层,先不考虑建立在SSH协议上的高层网络应用协议
传输层协议(SSH-TRANS):提供服务器认证、完整性和保密性功能,会进行密钥交换,建立在TCP/IP协议基础上验证协议(SSH-USERAUTH):服务器验证客户端用户,有两种验证方式,由客户端选择即client-driven。方式一:口令(密码);方式二:证书(公钥)。建立在传输层协议(SSH-TRANS)基础之上连接协议(SSH-CONNECT):构建加密通道(这个过程比较复杂,在这儿不讨论),从而提供给其他应用层协议使用。建立在验证协议(SSH-USERAUTH)基础之上 2. SSH协议抓包分析
几个概念:
会话密钥:是由客户端和服务端通过D-H算法生成的,每次连接的会话密钥都是不通过,用户在传输数据时加密MAC:一种哈希加密算法,在此用于保证数据的完整性和安全性rsa:一种非对称加密算法公钥私钥:用于认证,在这并没有用于数据传输过程中加密,非对称密钥的加解密较慢
先整体看一眼
在这之前会有3个TCP连接建立的包(不做具体分析,可看详情)
2.1 第一阶段(SSH-TRANS)
1、客户端告知服务器自己的SSH协议版本 格式:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符)
2、服务器将自己的SSH协议发送给客户端
3、客户端初始化连接,进行加密算法交换
交换的算法和其它信息列表
NO.名称说明1kex_algorithms密钥交换算法,包含D-H算法,用户生成会话密钥2server_host_key_algorithms服务器主机密钥算法,如ssh-rsa3encryption_algorithms_client_to_server对称加密算法4encryption_algorithms_server_to_client对称加密算法5mac_algorithms_client_to_serverMAC算法,用于保证数据完整性6mac_algorithms_server_to_clientMAC算法,用于保证数据完整性7compression_algorithms_client_to_server压缩算法8compression_algorithms_server_to_client压缩算法9languages_client_to_server语言10languages_server_to_client语言
4、服务端初始化连接,进行加密算法交换
与上一个报文是相似的
5、客户端发送D-H公钥,服务端与客户端使用D-H算法生成会话密钥key
6、服务端回复,服务端与客户端使用D-H算法生成会话密码key
服务端回复的内容:
DH回复包:
一个服务端的公钥,即证书,客户端会将该公钥与本地公钥对比,看是否是被信任的服务器,如过是第一次访问则会询问用户是否信任这样的公钥。服务端回复的D-H公钥签名
服务端端还会回复一个new Key包 用于表明服务端可以使用会话密码key加密消息了
一个加密消息包:服务器已经有了会话密码,可以使用会话密码加密了
这三个包我在两种不通的情景下也看到了两种不同的情况
在windwos10中使用口令远程连接
用git通过公私钥的方式获取github创库中的资源
表现的不同可能是由于两者的实现方式具有一些差别,因为这两者情况使用的客户端和服务端协议都是稍有不同的
7、客户端回复new key包
客户端要回复服务端的new key包以表明双方构建了一个加密通道,可以使用会话密码key加密来传输信息了
接下来就是加密后的数据了,我们无法从中看出任何有用信息,只能知道其组成,如下图:
2.2 第二阶段(认证) 第一种方式:基于口令的验证
客户端将口令用会话密钥加密后传送到服务端,由服务端解密认证
第二种方式:基于公钥私钥的验证方式
也称为免登陆的方式,需要客户端自己生成公钥和私钥,然后将公钥添加保存到服务器中。之后,客户端会发送经过加密后的公钥,由服务端解密和公钥对比(这是网络中的一般说法,具体的验证我并没有找到,也是符合《信息安全原理与实践(第2版)》书的,但加密的消息应该不仅仅只有客户端的公钥。在该书中描述是还包含,会话密钥和签名数据)。
检验自己理解的方式是回到第一次整体图中能将每个报文的作用说出来就OK了 快速跳转
写在最后
ssh协议的复杂度也是远超于此的,对信息安全的工作人员和ssh协议的编程实现相关人员可能会更进一步的学习。(信息安全领域和业务开发领域两者关注点是不同的,业务开发是为了提供服务,信息安全则是为了提供安全的服务。为了更好的提供服务,业务开发人员需要了解信息安全的知识,这对工作和自己的学习发展都是有好处的[额~ 属于个人观点,知识广度],这也是我愿意花时间做ssh协议分析工作的原因)