一文读懂系列:结合抓包分析,详解SSH协议通信原理

SSH协议通过建立加密通道来提供安全的远程访问、文件传输和执行远程命令等操作。接下来我们就通过具体示例和抓包分析,让大家清楚地了解SSH协议的神秘面纱!如有更多疑问,欢迎讨论区留言讨论~

1. SSH简介

SSH(Secure Shell)协议是一种用于在不安全的网络上提供安全通信的网络协议。

SSH客户端和服务器应用程序可广泛用于大多数操作系统。它已成为远程登录和X隧道的首选方法,并迅速成为嵌入式系统之外加密技术最普遍的应用之一。

最初的版本SSHv1侧重于提供安全的远程登录设施,以取代Telnet和其他不提供安全的远程登录方案。新版本SSHv2修复了原始方案中的许多安全漏洞。相关标准文档可以参阅RFC 4250RFC 4256

2. SSH协议栈介绍

SSH协议主要由三个子协议组成:传输层协议、用户认证协议和连接协议。

SSH协议构成

2.1. 传输协议

传输协议负责建立安全的通道,确保数据在传输过程中的机密性和完整性。它使用公钥加密算法(如RSA、DSA等)进行身份验证,并通过密钥交换算法(如Diffie-Hellman)生成共享会话密钥来保护会话数据。

连接确认提示

在SSH客户端第一次连接某服务器时,我们会注意到上图中的连接提示。这其实就是客户端在通过host key验证服务器身份,确保其连接的是正确的服务器,而不是中间人攻击者。

$ ls -lht ~/.ssh
total 32
-rw-------  1 me  staff   1.6K 11  7 22:54 known_hosts
-rw-------  1 me  staff   1.7K 11  8  2015 github_rsa
-rw-r--r--  1 me  staff   405B 11  8  2015 github_rsa.pub

客户端将这个密钥(host key)存储起来,以便将来连接时进行验证,如果服务器发送过来的host key与客户端本地存储的一致,将不再弹出连接确认提示。

known-hosts文件

此外,传输协议还可能提供数据压缩功能,以提高传输效率。

2.2. 用户认证协议

用户认证协议运行在传输协议之上,用于验证客户端用户的合法性。SSH支持多种认证方式,包括公钥认证、密码认证和基于主机的认证。

在公钥认证中,客户端使用自己的私钥对消息进行签名,服务器则使用客户端提供的公钥验证签名的有效性。密码认证则涉及客户端发送明文密码,由服务器进行验证。

2.3. 连接协议

连接协议基于传输层和用户认证协议提供的安全隧道,将多个逻辑通道复用在一起。这些通道可以用于不同的目的,如安全的交互式shell会话、TCP端口转发和X11连接。

每个通道都有唯一的编号,并且支持流控制,以确保数据按顺序传输。当一个通道关闭时,不会影响其他通道的正常工作。

3. 工作原理

SSH交互过程可分为5个阶段:

  • 版本协商:SSH支持SSHv1、SSHv2两个版本,双方通过协商确定本次会话使用的版本;
  • 算法协商:SSH支持多种密码算法,双方会根据各自支持的算法协商出本次会话使用的密码算法;
  • 密钥交换:通过密钥交换算法生成会话密钥,用于后续加密通信;
  • 用户认证:SSH客户端向服务器发起认证请求服务器对登录用户进行认证;
  • 会话交互:用户认证通过后,双方便可以开始通信。

以上5个阶段与上一章节介绍的协议栈关系可以用如下一张简图表示:

SSH交互过程

接下来我们以下面的客户端和服务器进行SSH交互为例,结合抓包进行分析。通信双方的信息如下:

  • 客户端:10.211.55.2,OpenSSH 8.6

  • 服务器:10.211.55.7,OpenSSH 9.4

在本地计算机上打开CMD窗,通过执行命令ssh root10.211.55.7启动SSH客户端并连接到服务器,服务器SSH端口默认是22。

三次握手建立TCP连接

3.1. 版本协商

版本协商时客户端和服务器会交换各自支持的SSH协议版本信息。

客户端会首先发送一个包含其支持的SSH协议版本的消息到SSH服务器。消息格式为“SSH-2.0-clientname/version”这样的消息,其中“clientname/version” 代表客户端的名称和版本信息。如下图:SSH-2.0-OpenSSH_8.6

客户端发送支持的协议版本

收到此消息后,SSH服务器将回应一个相同格式的消息(如下图的SSH-2.0-OpenSSH_9.4p1 Debian-1),表明服务器支持的SSH协议版本。

服务器发送支持的协议版本

随后,客户端和服务端会基于它们都支持的最高协议版本进行后续的密钥交换和认证过程。

3.2. 算法协商

客户端和服务器分别发出Key Exchange Init请求,告诉对方自己支持的相关加密算法列表、MAC算法列表和压缩算法。

密钥交换

如果对消息认证码MAC算法原理感兴趣可以参阅博主前期文章《图解 | 消息认证码(MAC)到底解决了什么问题?还有什么问题是它解决不了的?》。

消息认证码工作流程

算法协商过程比较简单,先从客户端支持的算法列表中取出第一个算法,服务器在自身的算法列表中查找,若匹配上相同的算法,则协商成功,接着按以上流程协商出下一种算法。否则继续从客户端的该种算法列表中取出下一个算法,在服务器的算法列表中匹配,直到匹配成功。

3.3. 密钥交换

双方使用Diffie-Hellman密钥交换算法生成共享会话密钥,通过运用数学理论可巧妙地实现不直接传递会话密钥的密钥交换,避免了在不安全通道传送会话密钥。双方协商得到的会话密钥用于加密后续通信,即使通信被截获,攻击者在没有会话密钥的前提下也无法解密内容。

下图中的12、13两个数据包即通过DH密钥交换算法协商出了会话密钥。

DH密钥交换

若对DH密钥交换(也称密钥协商)算法原理感兴趣,可能参阅博主前期文章《一文读懂密钥交换(DH、ECDH)算法(附密码国标)》,本文将不再展开介绍DH密钥交换的具体细节。

DH密钥交换原理

注意观察第13个数据包,服务端端会回复一个New Keys包,表明服务端可以使用会话密钥加密消息了。

Server to Client

紧接着客户端回复服务端的New Keys包,用于表明双方已经完成构建了一个加密通道,可以使用会话密钥来加密通信了。

Client to Server

密钥交换完成后,后续所有报文交互(用户认证、会话请求、会话交互)都会被会话密钥加密。

3.4. 用户认证

服务器向客户端展示其公钥,客户端验证该公钥是否合法(通常通过预存的已知主机列表):

  • 如果是密码认证,系统会提示输入密码;
  • 如果是公钥认证,客户端会自动使用本地存储的私钥对数据进行签名,并将签名发送给服务器。密钥存储在~/.ssh/id_rsa文件中,客户端在执行连接时可执行命令ssh user@remote_server_ip -i ~/.ssh/id_rsa

如果验证通过,服务器返回SSH_MSG_USERAUTH_SUCCESS消息。

比如,典型的服务器认证为密码认证,具体流程如下图所示:

密码认证流程

但是,这种认证方式存在中间人攻击的风险,如果有人截获了SSH客户端的登录请求后,冒充SSH服务器将伪造的公钥发送给SSH客户端,就可以获取到用户的登录密码。所以,在首次登录SSH服务器时,SSH客户端上会提示公钥指纹(host key),并询问用户是否确认登录。

连接确认提示

从第15个数据包之后就开始了加密通信,已经无法看到SSH的认证阶段、会话请求和会话交互的明文数据包。

3.5. 会话交互

认证成功后,客户端和服务器创建多个逻辑通道,用于执行不同的任务,如shell会话、文件传输等。

加密通信

4. 参考资料

本文写作过程中参考了以下技术文献,如果大家对SSH协议的更多内容细节感兴趣,可以关注博主公众号,并回复”20241109“获取如下资料包。

  • RFC 4251-4254
  • Cryptography, Network and Security Principles and Practice.pdf
  • SSH 5.1.4.2 版本发布.pdf
  • Computer Networking Principles, Protocols and Practice.pdf

SSH协议学习资源


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9812.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据冒险-ld和add(又称load-use冒险)

第一张图没有使用前递,第二张图使用前递,chatgpt分析第二张图 这张图展示了一个流水线的执行过程,其中存在读后写(RAW)数据冒险。我们可以通过**前递(Forwarding)**技术来解决这个数据冒险&…

Java 的 Scanner 类:控制台输入与文件扫描

Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解…

安卓市场如何做APP的分发、推广?

今天主要跟大家分享一些分发、推广这块操作的内容以及对安卓用户的一些理解。 分发的日常生活:“某渠道怎样怎样,应用宝是不是要加点预算,OPPO是不是要加点预算,你的成本又高了,华为又掉注册,应用宝又掉注册…

基于JavaWeb的图书售卖网站(源码+部署+LW)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于JavaWeb的图书售卖网…

高级 <HarmonyOS主题课>构建华为支付服务的课后习题

五色令人目盲&#xff1b; 五音令人耳聋&#xff1b; 五味令人口爽&#xff1b; 驰骋畋猎&#xff0c;令人心发狂&#xff1b; 难得之货&#xff0c;令人行妨&#xff1b; 是以圣人为腹不为目&#xff0c;故去彼取此。 本篇内容主要来自&#xff1a;<HarmonyOS主题课>构建…

python全栈开发《63.判断两个集合中是否有相同的元素》

目录 1.isdisjoint的功能2.isdisjoint的用法3.代码 1.isdisjoint的功能 判断两个集合是否包含相同的元素。如果没有&#xff0c;返回True&#xff1b;如果有&#xff0c;返回False。 2.isdisjoint的用法 a_set {name,xiaomu,xiaoming} b_set {xiaoming,xiaogang,xiaohong} re…

员工管理系统(python)

利用python的自定义函数以及循环函数写一个小的员工管理系统&#xff0c;以下是详细代码&#xff1a; # 定义一个空的员工列表&#xff0c;用于存储员工信息 list_ems []# 添加员工的函数 def add():# 提示用户输入员工的各项信息employee_id input("请输入员工的工号&…

做AI大模型应用层产品研发,基本绕不开这几个大模型API

国内有不少独立模型厂商提供 API 可供调用&#xff0c;几乎都会成为技术选择的可选项&#xff1a; Moonshot AI&#xff1a; API 特点&#xff1a;其 API 与 OpenAI 兼容&#xff0c;方便开发者平滑迁移&#xff0c;开发者无需对代码做除基本参数外的“额外”修改&#xff0c;…

MySQL数据库专栏(五)连接MySQL数据库C API篇

摘要 本篇文章主要介绍通过C语言API接口链接MySQL数据库&#xff0c;各接口功能及使用方式&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、环境配置 1.1、添加头文件 1.2、添加库目录 2、接口介绍 2.1、MySql初始化及数据清理 2.1.…

Ubuntu系统被木马程序攻击,运行莫名进程杀掉又自动重启解决办法

问题&#xff1a;Ubuntu系统被攻击了&#xff0c;有莫名进程运行杀掉又自动重启。 原因&#xff1a;攻击原因估计是用户名和密码过于简单&#xff0c;ssh服务穿透时等被暴力破解了。 nvidia-smi&#xff1a;存在莫名的./java程序&#xff0c;kill掉也会重启其它木马进程&#…

Java基于SpringBoot+Vue框架的宠物寄养系统(V2.0),附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【MySQL】函数

3.函数 MySQL中的函数主要分为以下四类&#xff1a; 字符串函数、数值函数、日期函数、流程函数。 3.1 字符串函数 演示如下&#xff1a; A. concat : 字符串拼接 select concat(Hello , MySQL);B. lower : 全部转小写 select lower(Hello);C. upper : 全部转大写 select…

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗&#xff0c;每个弹窗是否弹出都有自己的策略&#xff0c;以及哪个优先弹出&#xff0c;哪个在上一个关闭后再弹出&#xff0c;为了更好管理&#xff0c;于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计&#xff0c;控制优先级及弹…

【实战篇P2-5】手把手实现STM32+ESP8266+原子云服务器+手机APP应用——第五节-编写Android手机APP程序实现接入原子云服务器

使用的开发软件是Android studio Android SDK(运行环境 :最低版本 21(Android 5.0) 最高版本 29 (Android 9.0) Gradle 版本 :4.6 根据源码,可自定义修改界面,修改名称,根据需求自定义数据展示界面等,修改app图标及名称等。 目录 Android程序设计 Android…

2024双十一数码好物推荐?双十一超值数码好物汇总别错过!

随着2024年双十一购物狂欢节临近尾声&#xff0c;各大电商平台的促销活动已经进入了最后的冲刺阶段。在这场年度最大的购物盛宴中&#xff0c;数码产品无疑是消费者关注的焦点。无论是提升工作效率的电脑、平板&#xff0c;还是丰富娱乐生活的手机、耳机&#xff0c;各大品牌纷…

Android V 挂起线程超时导致system_server挂掉

问题背景 最近Android v的平台频繁爆monkey异常停止的问题,分析到根因不是频繁dump堆栈导致system_server挂掉就是三方应用进程内部死锁导致anr,然后system_server挂起线程超时,system_server就崩了。 解决方案 先来看看anr导致死锁的场景如何分析 从log来看确认为syste…

评估 机器学习 回归模型 的性能和准确度

回归 是一种常用的预测模型&#xff0c;用于预测一个连续因变量和一个或多个自变量之间的关系。 那么&#xff0c;最后评估 回归模型 的性能和准确度非常重要&#xff0c;可以帮助我们判断模型是否有效并进行改进。 接下来&#xff0c;和大家分享如何评估 回归模型 的性能和准…

图片循环轮播,悬停停止

可直接执行HTML 代码 template 代码在下面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Swip…

Transformer介绍(一)

Transformer是一种特殊的神经网络&#xff0c;一种机器学习模型。 谷歌在2017年推出的原版Transformer&#xff0c;论文《Attention Is All You Need》&#xff0c;专注于将一种语言的文本翻译成另一种。 而我们要关注的Transformer变种&#xff0c;即构建ChatGPT等工具的模型…

MySQL之索引(1)(索引概念与作用、红黑树、b树、b+树)(面试高频)

目录 一、索引的概念、作用。 &#xff08;1&#xff09;介绍。 &#xff08;2&#xff09;为啥索引能优化sql查询&#xff1f; 1、某张表(emp)结构以及数据如下。 2、假如执行的SQL语句为&#xff1a;select * from emp where empno7844; 3、对比与总结。 &#xff08;3&#…