简介

OpenSSH是SSH(Secure SHell)协议的免费开源实现。OpenSSH是个SSH的软件,linux/unix都用openssh软件提供SSH服务。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

漏洞概述

1. CVE-2021-41617

OpenSSH(OpenBSD Secure Shell)是Openbsd计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。

OpenSSH 6.2到8.8之前版本存在安全漏洞。该漏洞源于允许权限提升,因为补充组未按预期初始化。
该漏洞编号CVE-2020-15778。OpenSSH的8.3p1及之前版本中的scp允许在scp.c远程功能中注入命令,攻击者可利用该漏洞执行任意命令。目前绝大多数linux系统受影响。

2. CVE-2020-15778

OpenSSH(OpenBSD Secure Shell)是OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。

openssh <= openssh-8.3p1版本中的scp的scp.c文件存在命令注入漏洞。该漏洞源于外部输入数据构造可执行命令过程中,网络系统或产品未正确过滤其中的特殊元素。攻击者可利用该漏洞执行非法命令。

本地环境

[root@master ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

[root@master ~]# openssl version
OpenSSL 1.1.1m  14 Dec 2021

漏洞修复

一、安装telnet

  1. 安装telnet-server以及xinetd

[root@master ~]# yum install xinetd telnet-server -y
  1. 配置telnet

[root@master ~]# vim /etc/xinetd.d/telnet
[root@master ~]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#   unencrypted username/password pairs for authentication.
service telnet
{
    disable = yes
    flags       = REUSE
    socket_type = stream       
    wait        = no
    user        = root
    server      = /usr/sbin/in.telnetd
    log_on_failure  += USERID
}
  1. 配置telnet登录的终端类型,在/etc/securetty文件末尾增加一些pts终端,如下

[root@master ~]# vim /etc/securetty
pts/0
pts/1
pts/2
pts/3

[root@master ~]# tail -5 /etc/securetty
xvc0
pts/0
pts/1
pts/2
pts/3
  1. 启动telnet服务,并设置开机自动启动

[root@master ~]# systemctl enable xinetd
  
[root@master ~]# systemctl enable telnet.socket
Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.

[root@master ~]# systemctl start telnet.socket
[root@master ~]# systemctl start xinetd
[root@master ~]# netstat -lntp|grep 23
tcp6       0      0 :::23                   :::*                    LISTEN      1/systemd          
[root@master ~]#

二、安装组件

  1. 安装编译相关组件

[root@master ~]# yum install  -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel
  1. 安装pam

[root@master ~]# yum install  -y pam* 
  1. 安装zlib

# 方式一
[root@master ~]# yum install  -y zlib*

# 方式二
[root@master ~]# wget http://www.zlib.net/zlib-1.2.11.tar.gz
[root@master ~]# tar xzvf zlib-1.2.11.tar.gz
[root@master ~]# cd zlib-1.2.11
[root@master zlib-1.2.11]# ./configure --prefix=/usr/local/zlib
[root@master zlib-1.2.11]# make && make install

三、安装openssl

  1. 下载openssl

[root@master ~]# wget https://www.openssl.org/source/openssl-1.1.1m.tar.gz
  1. 编译安装openssl

[root@master ~]# tar xzvf openssl-1.1.1m.tar.gz
[root@master ~]# cd openssl-1.1.1m
[root@master openssl-1.1.1m]# ./config --prefix=/usr/local/ssl -d shared
[root@master openssl-1.1.1m]# make && make install
[root@master openssl-1.1.1m]# echo '/usr/local/ssl/lib' >> /etc/ld.so.conf
[root@master openssl-1.1.1m]# ldconfig -v

四、安装openssh

  1. 下载openssh

[root@master ~]# wget https://mirror.leaseweb.com/pub/OpenBSD/OpenSSH/portable/openssh-8.8p1.tar.gz
  1. 编译安装openssh

[root@master ~]# tar xzvf openssh-8.8p1.tar.gz
[root@master ~]# cd openssh-8.8p1
[root@master openssh-8.8p1]# ./configure --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl
[root@master openssh-8.8p1]# make && make install

五、修改配置文件

  1. sshd_config文件修改

[root@master ~]# echo 'PermitRootLogin yes' >>/usr/local/openssh/etc/sshd_config
[root@master ~]# echo 'PubkeyAuthentication yes' >>/usr/local/openssh/etc/sshd_config
[root@master ~]# echo 'PasswordAuthentication yes' >>/usr/local/openssh/etc/sshd_config
  1. 备份原有文件,并将新的配置复制到指定目录

[root@master ~]# mv /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
[root@master ~]# cp /usr/local/openssh/etc/sshd_config /etc/ssh/sshd_config
[root@master ~]# mv /usr/sbin/sshd /usr/sbin/sshd.bak
[root@master ~]# cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
[root@master ~]# mv /usr/bin/ssh /usr/bin/ssh.bak
[root@master ~]# cp /usr/local/openssh/bin/ssh /usr/bin/ssh
[root@master ~]# mv /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
[root@master ~]# cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
[root@master ~]# mv /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub.bak
[root@master ~]# cp /usr/local/openssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub

六、启动ssh

[root@master ~]# systemctl daemon-reload
[root@master ~]# service sshd restart
[root@master ~]# ssh -V
OpenSSH_8.8p1, OpenSSL 1.1.1m 24 Aug 2021

七、问题答疑

如果无法重启ssh,ssh启动报错为超时(timedout),且 sshd -t 无报错日志

[root@188 ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: timeout) since Mon 2022-05-16 17:45:07 CST; 39s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 4782 ExecStart=/usr/sbin/sshd -D $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 4782 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/sshd.service
           ├─  467 java -jar -Xdebug -Xnoagent -Xmx1024m -Xms512m -XX:NewRatio=1 -XX:SurvivorRatio=8 -Dconfig.path=file:/dw-system/dw-schedule/;file:/dw-system/common.properties -Dlogger.root=/software/logs/dubbo-jars ...
           ├─ 1058 sshd: root@pts/0
           ├─ 1060 -bash
           ├─ 3235 sshd: root@pts/1
           ├─ 3243 -bash
           ├─ 4153 sshd: root@pts/3
           ├─ 4161 -bash
           ├─ 5077 tail -fn 200 /var/log/messages
           ├─ 5101 systemctl status sshd.service
           ├─32566 java -jar -Xdebug -Xnoagent -Xmx1024m -Xms512m -XX:NewRatio=1 -XX:SurvivorRatio=8 -Dconfig.path=file:/dw-system/dw-admin/;file:/dw-system/common.properties -Dlogger.root=/software/logs/dubbo-jars -Dl...
           └─32767 java -jar -Xdebug -Xnoagent -Xmx1024m -Xms512m -XX:NewRatio=1 -XX:SurvivorRatio=8 -Dconfig.path=file:/dw-system/dw-open/;file:/dw-system/common.properties -Dlogger.root=/software/logs/dubbo-jars -Dlo...

May 16 17:45:07 188 systemd[1]: Failed to start OpenSSH server daemon.
May 16 17:45:07 188 systemd[1]: Unit sshd.service entered failed state.
May 16 17:45:07 188 systemd[1]: sshd.service failed.

解决方案:

  1. 关闭Port注释:/etc/ssh/sshd_config

  2. 修改 /etc/systemd/system/multi-user.target.wants/sshd.service 文件,将[Service] 中 Type=notify 改为 Type=simple直接注释

  3. 重新启动ssh,第一次启动失败,就再来一次,基本第二次会成功(原因未知)

[root@master ~]# systemctl daemon-reload
[root@master ~]# service sshd restart

不为明天而烦恼,不为昨天而叹息,只为今天更美好