0%

OpenSSH 命令注入漏洞(CVE-2020-15778)

第一章 下载软件包及依赖

  1. openssl-1.1.1n

  2. openssh8.8p1传送门

    我用的CentOS 7.9系统默认集成了许多依赖,所以我只需安装PAM这个依赖,大家如果缺什么依赖就自行到网络自行下载,这里需要注意的是openssl依赖的软件太多,所以在升级openssl时,不用卸载旧的版本。如果强制卸载可能导致系统不能正常运行

  3. 安装openssl所需要的依赖

    1
    2
    3
    4
    5
    6
    7
     yum -y install zlib-devel gcc perl
    [root@localhost src]# openssl version #检查当前版本
    OpenSSL 1.0.2k-fips 26 Jan 2017
    [root@localhost src]# which openssl #检查openssl目录
    /usr/bin/openssl
    [root@localhost src]# whereis openssl #升级新版本后重新链接替换为新版本对应的 文件目录
    openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/ openssl.1ssl.gz
  4. 备份openssl软链接

    1
    2
    3
    [root@localhost src]# mkdir /home/ssl_bak
    [root@localhost src]# mv /usr/bin/openssl /home/ssl_bak/
    [root@localhost src]# mv /etc/ssl /home/ssl_bak/etc_ssl
  5. 开始升级OpenSSL

    1
    2
    3
    4
    5
    [root@localhost src]# tar -zxf openssl-1.1.1l.tar.gz
    [root@localhost src]# cd openssl-1.1.1l
    [root@localhost openssl-1.1.1l]# ./config --prefix=/usr/local/openssl --openssldir=/etc/ssl shared zlib
    [root@localhost openssl-1.1.1l]# make
    [root@localhost openssl-1.1.1l]# make install
  6. 配置升级后的openssl的相关目录(链接openssl程序)

    1
    2
    3
    4
    5
    [root@localhost src]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
    [root@localhost src]# ln -s /usr/local/openssl/include/openssl /usr/include/openssl
    [root@localhost src]# echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
    [root@localhost src]# openssl version #查看升级后的版本
    OpenSSL 1.1.1l 24 Aug 2021

第二章 开启Telnet

  1. 开启Telnet服务是为了防止升级OpenSSH过程中出现不可预估的故障。例如:停电、服务器突发性故障而导致SSH无法登录。很显然你不想成为那个倒霉蛋子,当然如果你觉得你很勇可以忽略此步骤。
    Telnet服务在CentOS7上是单独的一个服务,不用安装xinetd,只要安装telnet-server

    1
    yum install telnet-server  #安装Telnet服务
  2. 默认telnet不允许root用户登陆,需要做一些配置vim /etc/securetty 需要添加一些pts终端入口,就能以root用户登陆

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pts/0
    pts/1
    pts/2
    pts/3
    pts/4
    pts/5
    pts/6
    pts/7
    pts/8
    pts/9
  3. telnet使用的是23号端口,如果你的服务器启用了防火墙请临时放行23端口

    1
    2
    3
    4
    5
    # 启用Telnet服务
    [root@localhost ~]# systemctl enable telnet.socket
    [root@localhost ~]# systemctl start telnet.socket

    # 使用Telnet工具登录服务器 Telnet 192.168.0.1 23

第三章 开始升级OpenSSH

  1. 下载好适用CentOS 7PAM-devel1.1.8依赖

         chmod 600 /etc/ssh/*  #设置文件夹权限,以免写入失败
    
  2. 设置文件夹权限以及备份ssh启动文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chmod 600 /etc/ssh/*  #设置文件夹权限,以免写入失败
    [root@localhost src]# cp /usr/bin/ssh /usr/bin/ssh.bak
    [root@localhost src]# cp /usr/sbin/sshd /usr/sbin/sshd.bak
    [root@localhost src]# mv /etc/ssh /etc/ssh.bak
    rpm -ivh pam-devel-1.1.8-23.el7.x86_64.rpm --nodeps --force # 安装依赖
    [root@localhost src]# tar -zxvf openssh-8.8p1.tar.gz
    [root@localhost src]# cd openssh-8.8p1
    [root@localhost openssh-8.8p1]# ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-openssl --with-md5-passwords --mandir=/usr/share/man --with-zlib --with-ssl-engine --with-ssl-dir=/usr/local/openssl
    [root@localhost openssh-8.8p1]#make # 编译
    [root@localhost openssh-8.8p1]#make install # 编译通过直接安装
  3. 修改启动文件和PAM

    1
    2
    3
    [root@localhost openssh-8.8p1]# cp ./contrib/redhat/sshd.init /etc/init.d/sshd
    [root@localhost openssh-8.8p1]# cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
    [root@localhost openssh-8.8p1]# mv /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd.service_bak
  4. 编辑/etc/pam.d/sshd文件,删除原有配置,替换如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #%PAM-1.0
    auth required pam_sepermit.so
    auth substack password-auth
    auth include postlogin
    # Used with polkit to reauthorize users in remote sessions
    -auth optional pam_reauthorize.so prepare
    account required pam_nologin.so
    account include password-auth
    password include password-auth
    # pam_selinux.so close should be the first session rule
    session required pam_selinux.so close
    session required pam_loginuid.so
    # pam_selinux.so open should only be followed by sessions to be executed in the user context
    session required pam_selinux.so open env_params
    session required pam_namespace.so
    session optional pam_keyinit.so force revoke
    session include password-auth
    session include postlogin
    # Used with polkit to reauthorize users in remote sessions
    -session optional pam_reauthorize.so prepare
  5. OpenSSH升级后默认不允许root登陆,需要修改编辑/etc/ssh/sshd_config

    1
    2
    3
    4
    5
    6
    7
    8
    PermitRootLogin yes  # 在空白处添加
    cat /etc/selinux/config # 检查selinux状态是否关闭,如果开启会导致服务无法启动成功
    systemctl restart sshd.service # 重启sshd服务
    systemctl status sshd.service # 检查服务
    ps -ef | grep sshd #检查SSH进程
    systemctl enable sshd.service # 设置开机启动
    [root@localhost ~]# ssh -V #检查SSH版本
    OpenSSH_8.8p1, OpenSSL 1.1.1l 24 Aug 2021