💻
Notes-CS
  • INTRO
  • 操作系统
    • 操作系统原理
      • 操作系统概述
        • 操作系统的分类
          • 批处理操作系统
          • 分时操作系统
          • 实时操作系统
          • 个人计算机操作系统
          • 网络操作系统
          • 分布式操作系统
          • 嵌入式操作系统
        • 操作系统的运行环境与机制
          • 中断与异常
          • 系统调用
      • 进程与线程
        • 进程
        • 线程
        • 协程
      • 处理器调度
      • 同步机制
      • 存储模型
      • 文件系统
        • 分区类型
      • 输入输出系统
    • 通用操作系统
      • GNU/Linux
        • Linux 内核
          • Linux 启动过程
          • 几种内核映像的区别
          • 终端设备
          • Ptrace
        • 可执行文件 ELF
        • 文件系统
          • swap
          • Linux 文件系统目录描述
          • 特殊文件
        • 软件生态
          • 基于 Linux 的 OS
            • Arch Linux
            • CentOS
            • Debian
            • Fedora
            • Gentoo
            • Kali
            • OpenSUSE
            • OpenWRT
            • Ubuntu
          • 桌面环境
            • KDE
            • GNOME
            • Xfce
            • DDE
            • Unity
            • MATE
          • 包管理器
            • apt
              • apt install
            • yum
            • pacman
        • Utils
          • dd
          • motd
          • 系统状态分析工具
          • TTY和PTS
          • SysVInit 与 SystemD
          • Linux 系统参考手册
          • 文本IO处理
            • awk
            • sed
            • cut
            • grep
            • xargs
            • diff & patch
      • MacOS
        • Darwin 内核
        • 快捷键
      • Windows
        • NT 内核
        • 可执行文件 PE
        • 文件系统组织
        • 发行版本
          • 古董
            • Windows 3.1
            • Windows 95
            • Windows 98
            • Windows 2000
            • Windows me
            • Windows Vista
            • Windows 8
          • Windows XP
          • Windows 7
          • Windows 10
            • 常用快捷键
      • Android
        • 系统结构
        • 软件包格式 APK
        • 版本历史
    • 通用系统概念
      • ANSI转义序列
        • 终端颜色控制符
      • POSIX
      • 虚拟化
        • 常见虚拟化OS镜像格式
      • Secure Boot
      • 常见文件系统
        • NTFS
        • FAT
        • JFFS
        • tmpfs
  • 编程
    • 编程语言
      • C
        • 语法
          • const
          • typedef
        • 库
          • C standard library(libc)
            • glibc
              • ptrace
          • C POSIX library
            • pthread
        • GNU C
        • 其它
          • 链接库的构成
          • 头文件规范
          • 动态链接库
      • C++
        • 语法
        • 库
          • SL/STL
            • 容器
              • vector
              • string
              • unordered_map
            • 迭代器
            • 其它
              • man page 解决方案
        • 面向对象
          • 重写与重载
            • 运算符重载
      • Python
        • 语法
        • 包
          • 内建
          • 第三方
            • requests
        • 其它
          • PyPI 的使用
          • 内建模块
      • Rust
        • 入门实例
      • Java
      • shell
        • set
    • 数据结构与算法
      • 数据结构
        • 栈
        • 队列
        • 链表
        • 哈希表
        • 并查集
        • 堆
        • 树
          • 二叉树
        • 图
      • 算法
        • 算法基础
          • 枚举
          • 模拟
          • 递归 & 分治
          • 贪心
          • 排序
        • 搜索
        • 动态规划
        • 字符串
        • 数学
          • 快速幂
        • 图论
    • 编译原理
      • 编译器与解释器
      • 词法分析
      • 语法分析
      • 类型检查
      • 中间代码生成
      • 目标代码生成
      • 代码优化
    • 软件工程
      • 编程范式
        • 指令式
          • 过程式
          • 块结构
          • 结构化
          • 非结构化
          • 递归
          • 模块化
        • 面向对象
          • 基于类
          • 基于原型
        • 声明式
          • 函数式
            • 纯函数式
            • 函数响应
        • 多态
          • 多分派
          • 泛型
            • 模板
        • 元编程
          • 宏
          • 元类
          • 反射式
      • 开发方法
        • 敏捷开发
        • 过程模型
          • 瀑布模型
          • V 模型
          • 增量模型
          • 螺旋模型
      • 开发流程
        • 问题定义
        • 可行性研究
        • 需求分析
        • 概要设计
        • 详细设计
        • 编码与测试
        • 运行与维护
      • 开源软件
        • 版本后缀规则
        • 开源协议
          • GPL
          • LGPL
          • MIT
          • BSD
          • Apache
          • Mozilla
  • 信息安全
    • 信息安全原理
      • IoT
        • 交叉编译
        • 固件格式
        • 常见协议
          • UPnP
      • 二进制
        • 常见漏洞
          • Stack Overflow
          • Format String Bug
          • Integer Overflow
          • Double Free
          • Use After Free
          • Race Condition
        • 通用工具
          • IDA
          • ghidra
          • pwntools
          • binutils
          • GDB
          • 脚本工具
            • LibcSearcher
            • main_arena_offset
            • one_gadget
            • ROPgadget
        • 常用技术
          • 符号执行
            • 传统符号执行
            • 现代符号执行
          • 模糊测试
      • Web
        • 常见漏洞
          • SQLi - SQL injection
          • XSS - Cross Site Scripting
            • 基本原理
          • CSRF - Cross Site Request Forgery
          • SSRF - Server-Side Request Forgery
          • XXE - XML External Entity
            • 基本原理
        • 通用工具
          • Burp Suite
          • Wireshark
      • 密码学
        • 流密码
          • XOR
          • RC4
        • 分组密码
          • DES - Data Encryption Standard
          • AES - Advanced Encryption Standard
        • 公钥密码
          • RSA
            • 欧几里得算法
            • 扩展欧几里得算法
            • 中国剩余定理
            • 共模攻击
          • 椭圆曲线算法
        • 数字签名
        • 数据校验
          • CRC
      • 区块链
        • 以太坊
    • 信息安全实践
      • 环境准备
        • IOT
          • 固件获取
          • 固件打包与解包
          • QEMU 模拟
          • 交叉编译
          • 制作文件系统镜像
          • UART 调试
      • 漏洞挖掘
        • 漏洞概览
          • 漏洞编号与管理机构
        • 漏洞挖掘技术
          • 静态分析
          • 模糊测试
            • 工具与框架
              • AFL
          • 污点分析
          • 符号执行
            • 工具与框架
              • Angr
              • KLEE
              • S2E
      • 安全开发
      • 渗透测试
        • shell
        • 网络空间测绘系统
          • quake
          • shodan
        • 内网渗透
          • Linux 靶机
            • 信息搜集
            • 持久化
            • 痕迹清理
        • 工具与框架
          • Metasploit
    • 论文与演示
  • Web 与计算机网络
    • 协议栈
      • 链接层
        • PPP
        • ARP
        • MAC
      • 网络层
        • IP - Internet Protocol
          • IPv4
            • IPv4 分级式寻址
            • IPv4 私有地址划分
          • IPv6
        • ICMP - Internet Control Message Protocol
      • 传输层
        • TCP
        • UDP
        • TLS/SSL
      • 应用层
        • UPnP
        • HTTP
        • DNS
        • FTP
    • Web
      • 浏览器
        • Chrome
          • 内建功能
          • 快捷键
        • Tor
      • Web容器
        • Apache
        • Nginx
        • lighttpd
      • CGI
      • MIME type
      • 搜索引擎
  • 体系结构与硬件
    • 计算机体系结构
      • 指令集
        • X86
        • AMD64
        • ARM
        • RISC-V
        • MIPS
    • 设备与接口
      • 接口协议
        • UART
        • USB
        • HDMI
        • PCI
      • 存储设备
        • 固态硬盘
          • 闪存颗粒 ?LC
        • 识别 Linux上的设备(磁盘)类型
        • 字符设备与块设备
        • MTD
      • 网络设备
        • 路由器
        • 交换机
        • 网卡与虚拟网卡
        • 光接入网络
          • 光猫
  • 数学
    • 离散数学
    • 线性代数
    • 概率与统计
    • 计算理论
  • 软件与框架
    • 通用
      • bash
      • Vim
        • 配置
        • 快捷键
        • 插件
        • VIM Script
      • git
      • Tmux
      • gdb
      • ssh
      • make
      • 双拼
    • 专用
      • 🪜Untitled
        • clash
      • gcc
      • nmap
      • QEMU
        • QEMU source
        • 模拟 raw Linux
        • 模拟发行版
      • docker
      • buildroot
      • burpsuite
    • 轮子
      • LaTeX
      • LLVM
      • libpcap
  • reCTF
    • PWN
      • QEMU PWN
      • Kernel PWN
    • Web
    • Reverse
    • Crypto
    • MISC
  • 资源
    • 学习站
      • 安全学习站
        • 门户
        • 论坛
        • 教程
        • 会议
        • 博客
      • 编程学习站
        • 文档
    • 工具站
      • 安全工具站
        • 二进制
        • Web
        • IoT
        • 社工
      • 应用工具站
  • 实践记录
    • 事件
      • 对于 UDPt 漏洞的跟踪实践
    • 编译
      • alware 静态交叉编译
      • buildroot 编译 arm target
由 GitBook 提供支持
在本页
  • 参考
  • SSH 介绍
  • 应用篇
  • ssh 常用配置
  • 原理篇
  • 代理
  1. 软件与框架
  2. 通用

ssh

上一页gdb下一页make

最后更新于3年前

参考

SSH 介绍

  • Secure Shell(安全外壳协议,简称 SSH)是一种加密的,可在不安全的网络中为网络服务提供安全的传输环境

  • SSH 通过在网络中创建来实现 SSH 客户端与服务器之间的连接

  • 在设计上,SSH 是 和非安全 的替代品,Telnet 和 Berkeley 、、等协议采用传输,使用不可靠的密码,容易遭到监听、和

  • SSH使用模型,标准端口为 22。服务器端需要开启SSH以便接受远端的连接,而用户需要使用 SSH 客户端与其创建连接

  • SSH 的经典用途是登录到远程电脑中执行命令。除此之外,SSH 也支持、和 连接。借助 或 协议,SSH 还可以传输文件

应用篇

SSH 常用命令

  • ssh -v <user>@<hostip> - 打印运行情况和调试信息

  • ssh -vv <user>@<hostip> - 打印更详细的运行情况和调试信息

  • ssh -vvv <user>@<hostip> - 打印最详细的运行情况和调试信息

$ ssh root@aliyun -v
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to aliyun [106.15.72.140] port 22.
debug1: Connection established.
...
  • identity file type .../.ssh/id_* type <number> 中的数字只是 sshkey_types 枚举 的整数值(基于零),-1表示错误

    • KEY_RSA, // id_rsa has type 0

    • KEY_DSA, // id_dsa has type 1, but as you have no id_dsa key file, -1 is used

    • KEY_ECDSA, // id_ecdsa has type 2

  • debug [123]: 行前缀中的数字表示其后面的消息的调试级别。它对应于您在命令行上给出的 -v 的数量(3 是最大值)。即如果设置 -v,将打印 debug1 消息,使用 -vv,您将获得 debug1 和 debug2,最多是三级,即 -vvv

  • ssh -T git@xxx.com - 测试 ssh 密钥连接是否成功

    # github
    $ ssh -T git@github.com
    # gitee
    $ ssh -T git@gitee.com
    # coding
    $ ssh -T git@e.coding.net
  • ssh <user>@<hostip> - 登录 host

  • ssh <user>@<hostip> "[command]" - 登录 host 并执行命令

  • ssh -J <跳板机登录用户>@<ip>:<port> <目标机登录用户>@<ip> -p <port>- 通过跳板机登录目标机

ssh 命令登录失败后,重试时总是卡住,一般在重试前先重启 sshd 服务就可以解决

  • ssh <user>@<hostip> <command> - 登录 host 直接执行命令

# 本地 ~/file 文件通过 ssh 加密传输到 hostip 的 ~ 目录下
$ ssh <user>@<hostip> 'tar cz file' | tar zxv
# hostip 的 ~/file 文件通过 ssh 加密传输到本地的 ~ 目录下
$ ssh <user>@<hostip> 'tar cz file' | tar xzv
  • ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no <user>@<hostip> - 不验证 host key 登录

  • ssh -L <port_a>:<remote host>:<port_b> user_b@ip_b - 本地端口转发

  • ssh -R <port_a>:<remote host>:<port_a> user_a@ip_a - 远程端口转发

  • ssh -g -L <port_a>:<remote host>:<port_b> user_b@ip_b - 路由转发

  • ssh -D <port> user@remote_ip - 动态端口转发

ssh-keygen 常用命令

  • ssh-keygen - 默认在 ~/.ssh/ 下生成 RSA 公私密钥对

  • ssh-keygen -t dsa - 在 ~/.ssh/ 下生成 dsa 公私密钥对

  • ssh-keygen -t rsa -C '电子邮箱'

  • ssh-keygen -y -f [私钥路径] > [公钥路径] - 私钥生成公钥

$ ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
  • ssh-keygen -f "/home/xcq/.ssh/known_hosts" -R "192.168.7.47" - 删除指定 known_hosts 文件中的主机公钥

  • ssh-keyscan

  • ssh-keysign

  • ssh-add

ssh-copy-id 常用命令

  • ssh-copy-id <user>@<hostip> - 默认将本地主机公钥 ~/.ssh/id_rsa.pub 添加到远程服务器 <user>/.ssh/authorized_keys 文件中,实现无密码登录

  • ssh-copy-id -i <公钥路径>/id_rsa.pub <user>@<hostip> - 将本地主机公钥 公钥路径 中的 id_rsa.pub 添加到远程服务器 <user>/.ssh/authorized_keys 文件中,实现无密码登录

SCP 常用命令

  • scp <local_file_path> <user>@<hostip>:<remote_folder_path> - 上传本地文件到远程

  • scp -r <local_file_path> <user>@<hostip>:<remote_folder_path> - 上传本地文件夹到远程

  • scp <user>@<hostip>:<remote_folder_path> <local_file_path> - 下载远程文件到本地

  • scp -r <user>@<hostip>:<remote_folder_path> <local_file_path>- 下载远程文件夹到本地

  • Linux 和 Windows 实现 scp 互传文件

因为 Windows 系统本身不支持 ssh 协议,所以要想实现两者 scp 互传文件,必须在 Windows 客户端安装 ssh for windows 的客户端软件,比如 winsshd,使 Windows 系统支持 ssh 协议

  • scp /root/README.md administrator@<winIP>:/d:/test/ - 通过 scp 命令上传本地 (Linux) 文件到远程 (Windows) 上

  • scp administrator@<winIP>:/d:/test/README.md /root/ - 通过 scp 命令下载远程 (Windows) 文件到本地 (Linux)

scp -o "ProxyCommand=nc -X connect -x <proxy_ip>:<proxy_port> %h %p"  filename  <username>@<target_ip>:/<target_path>
scp -o "ProxyCommand=nc -X connect -x 47.101.133.201:22 %h %p"  /home/xcq/test1  root@54.250.52.188:/root

无密码公钥登陆

Linux

ssh-keygen
ssh-copy-id <user>@<remote_ip>

Windows

ssh-keygen
scp C:\Users\<Windows_User>\.ssh\id_rsa.pub <user>@<remote_ip>:~/.ssh/id_rsa.win.pub
cat ~/.ssh/id_rsa.win.pub >> ~/.ssh/authorized_keys

Windows 下的 openssh 没有 ssh-copy-id 命令。故手动将本地公钥添加至远程服务器的 ~/.ssh/authorized_keys 文件中即可。

ssh 常用配置

常用配置文件

  • /etc/ssh/ssh.config - 客户端配置文件

  • /etc/ssh/sshd.config - 服务的配置文件

  • ~/.ssh/known_hosts - 查看已知主机的公钥

  • ~/.ssh/authorized_keys - 存放需要密钥登录本机的 host 公钥

一、配置密钥登录

1、生成本地 RSA 或 DSA 密钥对

$ ssh-keygen
# 一路回车就可
# root 用户生成公私钥在:/root/.ssh/
# 非 root 用户:在自己主目录下的 .ssh/

2、将本地公钥内容追加到远程服务器的/root/.ssh/authorized_keys 或 用户目录下的.ssh/authorized_keys

# 也可以使用 ssh-copy-id
$ ssh-copy-id root@192.168.56.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.56.101's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.56.101'"
and check to make sure that only the key(s) you wanted were added.

3、重启 ssh,退出再次登陆即可实现无密码登录

二、开启密钥认证登录

  # 开启密钥验证
  RSAAuthentication yes
  PubkeyAuthentication yes RSAAuthentication yes
  # 制定公钥文件路径
  AuthorsizedKeysFile $h/.ssh/authorized_keys

三、开启密码登录

PasswordAuthentication yes

四、开启 root 登录

PermitRootLogin yes

五、关闭 hostkeychecking,初次登录时不用输入 yes

StrictHostKeyChecking no

原理篇

密码学加密算法

  • 加密方法可以分为两大类,一类是单钥加密( private key cryptography ),还有一类叫做双钥加密( public key cryptography )。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码

  • 【mì yuè】读音下的“密钥”的意思:紧密的锁闭。这里的用法用了“密钥”的动词性质。

  • 【 mì yào】读音下的“密钥”的意思:密码学中的专有名词,指解密所需要的特殊代码。这里用了“密钥”的名词性

对称密钥加密 - Symmetric-key algorithm

  • 又称为对称加密、私钥加密、共享密钥加密、单钥加密

  • 这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,所以这被称为 "对称加密算法"

  • 1976 年以前,所有的加密算法都使用 "对称加密算法",通用的单钥加密算法为 DES( Data Encryption Standard )

  • 在对称密钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解

公开密钥加密 - Public-key cryptography

  • 又称为非对称加密 - asymmetric cryptography

  • 公开密钥加密需要两个密钥,一个是公开密钥( 加密使用 ),另一个是私有密钥( 解密使用 )

SSH 原理简述

  1. 用户使用ssh user@host 命令对远程主机发起登陆

  2. 远程主机将自己的公钥返回给请求主机

  3. 请求主机使用公钥对用户输入的密码进行加密

  4. 请求主机将加密后的密码发送给远程主机

  5. 远程主机使用私钥对密码进行解密

  6. 最后,远程主机判断解密后的密码是否与用户密码一致,一致就同意登陆,否则反之

  1. 用户使用ssh user@host 命令对远程主机发起登陆

  2. 远程主机对用户返回一个随机串

  3. 用户所在主机使用私钥对这个随机串进行加密,并将加密的随机串返回至远程主机

  4. 远程主机使用分发过来的公钥对加密随机串进行解密

  5. 如果解密成功,就证明用户的登陆信息是正确的,则允许登陆;否则反之

SSH 中间人攻击

由于 SSH 不像 https 协议那样,SSH 协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么 SSH 的安全机制就荡然无存了,这也就是我们常说的中间人攻击

代理

ssh 密码登录原理

ssh 密钥登录原理

SSH Kung Fu
scp 跨机远程拷贝
如何透过 SSH 代理穿越跳板机
数字签名是什么?- 阮一峰
SSH原理与运用 - 阮一峰
SSH原理与运用(一):远程登录 - 阮一峰
SSH原理与运用(二):远程操作与端口转发 - 阮一峰
详解SSH原理 - 果冻想
Linux ssh命令详解 - 小a玖拾柒
实战 SSH 端口转发 - IBM
SSH 端口转发教程
网络传输协议
安全隧道
Telnet
shell
rlogin
rsh
rexec
明文
嗅探
中间人攻击
客户端-服务器
守护进程
隧道协议
端口映射
X11
SFTP
SCP
https://kanda.me/2019/07/01/ssh-over-http-or-socks/