zoukankan      html  css  js  c++  java
  • SSH抓包分析

    打开xshell, 登入linux服务器,开始wireshake抓包。

    SSH抓包从测试如下:

     一、3次握手建立tcp连接

    1、 seq = 0表示客户端当前的TCP包序列号。

    2、seq = 0,表示服务器端当前的TCP包序列号ack = 1(客户端seq + 1),表示对客户端第 seq = 0 的TCP包进行应答

    3、seq = 1,表示客户端端当前的TCP包序列号ack = 1(服务器seq + 1),表示对服务器端第 seq = 0 的TCP包进行应答

    二、ssh版本协议交换

     4、服务器将自己的SSH协议版本发送到客户端,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车) LF(换行)。如:SSH-2.0-OpenSSH_7.4

    5、客户端将自己的SSH协议版本发送到服务器,格式为:SSH-protoversion(版本号)-softwareversion(自定义) SP(空格一个,可选) comments(注释,可选) CR(回车符) LF(换行符)。如:SSH-2.0-nsssh2_6.0.0037 NetSarang Computer, Inc.

    三、协商出会话ID和会话密钥

     后面加解密用的是会话密钥。

     四、然后接下来才是认证阶段

      用账号名密码登入的是password认证。还有一种是公钥认证,这个是在免密登入的时候有用到。如果是password认证客户端会把账号密码和认证方法用会话密钥加密传输到服务端进行认证。

      免密登陆,简单地说,就是客户端自己生成公钥私钥(通常采用ssh-keygen程序生成),然后将公钥以某种方式(通常是手动添加)保存到服务器~/.ssh/authorized_keys文件中,以后服务器都会接受客户端传过来的经过会话密钥加密过的公钥,然后解密得到公钥之后和本地authorized_keys配置的公钥是否相等,如果是,则允许登陆。
     
     
    以上归纳的原理图如下:这个图是从别人那边copy来的,
     
    注意点:会话密钥的协商
       会话密钥是用DH算法得出来的。
     
    其中DH算法协商会话密钥的流程如下,这是摘自维基百科的,就是会话密钥(对称)的协商过程其实是有很多种算法实现,DH只是其中一种,比如tls的协商的时候就是用的eccdh算法。
     

       如果爱丽丝是客户端,鲍勃是服务端,但是其中如果伊芙假装成鲍勃跟爱丽丝通信,假装成爱丽丝和鲍勃通信?这也很好解释了为什么我们第一次登陆的时候,Shell终端总是会出现这个提示,你是否信任服务端公钥,这也是将确认权留给客户端自己去判断的一种策略,所以用这样保证客户端爱丽丝只对服务端鲍勃协商,而不会对伊芙协商,所以爱丽丝就不会把账号密码给伊芙。如果伊芙伪装成爱丽丝和服务端鲍勃通信,这个时候伊芙没有root账号、密码,最终肯定没有办法成功登入的。

  • 相关阅读:
    POJ3666 Making the Grade[动态规划]
    vector内部的实现1
    win32概述
    stl概述
    C++概要简介
    类的常量成员
    模板
    c11标准
    异常处理
    pak文件的打包和解包
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/14160559.html
Copyright © 2011-2022 走看看