Bootstrap

记一次手动将OpenSSH从7.4升级到9.8的过程

背景

OpenSSH远程代码执行漏洞(CNVD-2024-29805)

漏洞介绍
OpenSSH是加拿大OpenBSD计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。该漏洞源于信号处理程序中存在竞争条件,攻击者利用该漏洞可以在无需认证的情况下远程执行任意代码并获得系统控制权。

危害影响
OpenSSH 8.5p1版本至9.8p1之前版本均受该漏洞影响。
8.5p1 <= OpenSSH < 9.8p1

修复建议
目前,OpenSSH官方已发布新版本修复了该漏洞,建议用户及时确认产品版本,尽快采取修补措施。官方更新版本下载链接:
https://www.openssh.com/txt/release-9.8

相关介绍

OpenSSH 是 SSH(Secure Shell)协议的实现,用于在不安全的网络上提供安全的通信手段。它广泛用于远程登录、远程命令执行和安全文件传输。
OpenSSH 提供了许多工具,包括 ssh(用于登录到远程机器)、scp 和 sftp(用于文件传输),以及 sshd(SSH 守护进程)。
它确保通信的机密性和完整性,防止中间人攻击。

OpenSSL 是一个强大的加密库,提供了各种加密算法、哈希函数和加密协议(例如 TLS/SSL)的实现。
它被广泛用于保护网络通信,确保数据在传输过程中不会被窃听或篡改。
OpenSSL 提供了加密和解密功能、密钥生成和管理、数字证书处理等。

zlib 的作用
数据压缩:
OpenSSH 使用 zlib 来压缩和解压缩传输的数据。通过压缩数据,可以减少传输的数据量,从而提高传输速度和效率,尤其是在带宽有限的网络环境中。
减少带宽使用:
压缩可以显著减少 SSH 会话中数据传输所需的带宽。这对于需要传输大量数据的场景(例如文件传输或远程执行大量命令)特别有用。
提高传输效率:
对于文本数据,压缩效果尤其明显。通过减少传输的数据量,可以提高传输效率,并减少传输时间。

安装 telnet-server

避免ssh关闭后无法远程。

rpm -q telnet-server
#检查是否安装了telnet服务端
rpm -q telnet
#检查是否安装了telnet客户端

离线模式:通过有网主机下载
sudo yum install yum-utils
mkdir telnet-server-install
cd telnet-server-install
yumdownloader --resolve telnet-server

可通过ftp上传后安装
cd ~/telnet-server-install
sudo rpm -ivh *.rpm

下载 telnet-server 及其所有依赖包到当前目录。

或直接安装
yum install telnet -y

启动
systemctl enable telnet.socket
#设置开机启动该

systemctl start telnet.socket
#打开服务

防火墙开放telnet 或 开放23端口
sudo firewall-cmd --permanent --add-service=telnet
sudo firewall-cmd --reload

使用telnet ip地址进行连接登录

允许root登录
默认系统不允许root用户使用telnet远程登陆

echo ‘pts/0’ >>/etc/securetty
echo ‘pts/1’ >>/etc/securetty

可通过其它主机尝试:

[root@standby opt]# telnet 10.10.10.171
Trying 10.10.10.171...
Connected to 10.10.10.171.
Escape character is '^]'.

Kernel 3.10.0-1160.el7.x86_64 on an x86_64
localhost login: root
Password: 
Last failed login: Thu Jul  4 13:56:07 CST 2024 from ::ffff:10.10.10.42 on pts/0
There were 3 failed login attempts since the last successful login.
Last login: Thu Jul  4 10:30:43 from 172.20.1.1

可能还需要添加下 pts/3 和 pts/4

输入正确的密码还是不能登录

主机端执行:tail /var/log/secure

看到了access denied: tty ‘pts/3’ is not secure !

再添加一个

echo ‘pts/3’ >>/etc/securetty
重启了telnet后再登录一切正常了

安装zlib

安装zlib:https://www.zlib.net/fossils/

cd /usr/local/src/

wget https://www.zlib.net/fossils/zlib-1.3.1.tar.gz

#解压文件

tar zxvf zlib-1.3.tar.gz

cd zlib-1.3

#安装前置依赖

yum install gcc gcc-c++ make -y

#编译安装zlib

./configure --prefix=/usr/local/zlib

make && make install

安装openssl

安装openssl:https://www.openssl.org/source/

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-3.2.2.tar.gz

#解压文件

tar zxvf openssl-3.2.0.tar.gz

cd openssl-3.2.0

#安装相应的前置依赖

yum install -y perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

完成后输出:

已安装:
  perl-CPAN.noarch 0:1.9800-299.el7_9                                       perl-ExtUtils-CBuilder.noarch 1:0.28.2.6-299.el7_9                                       perl-ExtUtils-MakeMaker.noarch 0:6.68-3.el7                                      

作为依赖被安装:
  gdbm-devel.x86_64 0:1.10-8.el7              libdb-devel.x86_64 0:5.3.21-25.el7                 perl-Digest-SHA.x86_64 1:5.85-4.el7            perl-ExtUtils-Install.noarch 0:1.58-299.el7_9         perl-ExtUtils-Manifest.noarch 0:1.61-244.el7     
  perl-ExtUtils-ParseXS.noarch 1:3.18-3.el7   perl-IPC-Cmd.noarch 1:0.80-4.el7                   perl-Locale-Maketext.noarch 0:1.23-3.el7       perl-Locale-Maketext-Simple.noarch 1:0.21-299.el7_9   perl-Module-CoreList.noarch 1:2.76.02-299.el7_9  
  perl-Module-Load.noarch 1:0.24-3.el7        perl-Module-Load-Conditional.noarch 0:0.54-3.el7   perl-Module-Metadata.noarch 0:1.000018-2.el7   perl-Params-Check.noarch 1:0.38-2.el7                 perl-Perl-OSType.noarch 0:1.003-3.el7            
  perl-Test-Harness.noarch 0:3.28-3.el7       perl-devel.x86_64 4:5.16.3-299.el7_9               perl-local-lib.noarch 0:1.008010-4.el7         perl-version.x86_64 3:0.99.07-6.el7                   pyparsing.noarch 0:1.5.6-9.el7                   
  systemtap-sdt-devel.x86_64 0:4.0-13.el7 

#–prefix指定编译到的目录,"shared"作用是生成动态链接库(即.so库)

./config --prefix=/usr/local/ssl --shared

完成后输出:

[root@localhost openssl-3.2.2]# ./config --prefix=/usr/local/ssl --shared
Configuring OpenSSL version 3.2.2 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
Created include/openssl/configuration.h

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL.md file first)      ***
***                                                                ***
**********************************************************************

#编译安装ssl,这个安装过程很长大概有10分钟左右

make && make install(安装时间有点长哟·)

#路径写入etc/ld.so.conf

echo ‘/usr/local/ssl/lib64’ >> /etc/ld.so.conf

备份并卸载老版本OpenSSH

#备份ssh配置文件
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cp -p /usr/sbin/sshd /usr/sbin/sshd.bak
cp -p /usr/bin/ssh /usr/bin/ssh.bak
cp -p /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
cp -p /etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub.bak

#停止ssh服务

systemctl stop sshd

切勿关闭远程

#备份ssh文件

cp -r /etc/ssh /etc/ssh.old

#查询原有ssh包并卸载

rpm -qa | grep openssh

openssh-server-7.4p1-21.el7.x86_64
openssh-7.4p1-21.el7.x86_64
openssh-clients-7.4p1-21.el7.x86_64

#根据查询结果,卸载原有OpenSSH包

yum remove openssh-7.4p1-21.el7.x86_64

#再次查看已经没有了

rpm -qa | grep openssh

卸载后输出:

删除:
  openssh.x86_64 0:7.4p1-21.el7                                                                                                                                                                                                                         

作为依赖被删除:
  anaconda-core.x86_64 0:21.48.22.159-1.el7.centos       anaconda-gui.x86_64 0:21.48.22.159-1.el7.centos                    anaconda-tui.x86_64 0:21.48.22.159-1.el7.centos                  fence-agents-all.x86_64 0:4.2.1-41.el7                  
  fence-agents-apc.x86_64 0:4.2.1-41.el7                 fence-agents-bladecenter.x86_64 0:4.2.1-41.el7                     fence-agents-brocade.x86_64 0:4.2.1-41.el7                       fence-agents-drac5.x86_64 0:4.2.1-41.el7                
  fence-agents-hpblade.x86_64 0:4.2.1-41.el7             fence-agents-ilo-moonshot.x86_64 0:4.2.1-41.el7                    fence-agents-ilo-mp.x86_64 0:4.2.1-41.el7                        fence-agents-ilo-ssh.x86_64 0:4.2.1-41.el7              
  fence-agents-rsa.x86_64 0:4.2.1-41.el7                 fence-agents-rsb.x86_64 0:4.2.1-41.el7                             fence-agents-wti.x86_64 0:4.2.1-41.el7                           firstboot.x86_64 0:19.12-1.el7                          
  gdm.x86_64 1:3.28.2-23.el7                             gnome-classic-session.noarch 0:3.28.1-14.el7                       gnome-initial-setup.x86_64 0:3.28.0-2.el7                        gnome-keyring.x86_64 0:3.28.2-1.el7                     
  gnome-keyring-pam.x86_64 0:3.28.2-1.el7                gnome-shell.x86_64 0:3.28.3-30.el7                                 gnome-shell-extension-alternate-tab.noarch 0:3.28.1-14.el7       gnome-shell-extension-apps-menu.noarch 0:3.28.1-14.el7  
  gnome-shell-extension-common.noarch 0:3.28.1-14.el7    gnome-shell-extension-horizontal-workspaces.noarch 0:3.28.1-14.el7 gnome-shell-extension-launch-new-instance.noarch 0:3.28.1-14.el7 gnome-shell-extension-places-menu.noarch 0:3.28.1-14.el7
  gnome-shell-extension-top-icons.noarch 0:3.28.1-14.el7 gnome-shell-extension-user-theme.noarch 0:3.28.1-14.el7            gnome-shell-extension-window-list.noarch 0:3.28.1-14.el7         gnome-tweak-tool.noarch 0:3.28.1-7.el7                  
  initial-setup.x86_64 0:0.3.9.45-1.el7.centos           initial-setup-gui.x86_64 0:0.3.9.45-1.el7.centos                   openssh-clients.x86_64 0:7.4p1-21.el7                            openssh-server.x86_64 0:7.4p1-21.el7                    
  pulseaudio-gdm-hooks.x86_64 0:10.0-5.el7               python-meh.noarch 0:0.25.3-1.el7                                   python-meh-gui.noarch 0:0.25.3-1.el7                            

完毕!
[root@localhost src]# rpm -qa | grep openssh
[root@localhost src]# 

升级OpenSSH

cd /usr/local/src/

wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

#解压

tar zxvf openssh-9.8p1.tar.gz

cd openssh-9.8p1

#编译安装openssh 指明zlib路径和ssl路径

./configure --prefix=/usr/local/openssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl

完成后输出:


OpenSSH has been configured with the following options:
                     User binaries: /usr/local/openssh/bin
                   System binaries: /usr/local/openssh/sbin
               Configuration files: /usr/local/openssh/etc
                   Askpass program: /usr/local/openssh/libexec/ssh-askpass
                      Manual pages: /usr/local/openssh/share/man/manX
                          PID file: /var/run
  Privilege separation chroot path: /var/empty
            sshd default user PATH: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/openssh/bin
                    Manpage format: doc
                       PAM support: no
                   OSF SIA support: no
                 KerberosV support: no
                   SELinux support: no
                   libedit support: no
                   libldns support: no
  Solaris process contract support: no
           Solaris project support: no
         Solaris privilege support: no
       IP address in $DISPLAY hack: no
           Translate v4 in v6 hack: yes
                  BSD Auth support: no
              Random number source: OpenSSL internal ONLY
             Privsep sandbox style: seccomp_filter
                   PKCS#11 support: yes
                  U2F/FIDO support: yes

              Host: x86_64-pc-linux-gnu
          Compiler: cc -std=gnu11
    Compiler flags: -g -O2 -pipe -Wall -Wextra -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-parameter -Wno-unused-result -fno-strict-aliasing -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-strong -fPIE  
Preprocessor flags: -I/usr/local/ssl/include -I/usr/local/zlib/include  -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_GNU_SOURCE -DOPENSSL_API_COMPAT=0x10100000L
      Linker flags: -L/usr/local/ssl/lib64 -L/usr/local/zlib/lib  -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-strong -pie 
         Libraries: -ldl -lutil  -lresolv
     +for channels: -lcrypto  -lz
         +for sshd: -lcrypt 

make && make install

#ssh允许root登录、需要密码进行验证

echo ‘PermitRootLogin yes’ >>/usr/local/openssh/etc/sshd_config
echo ‘PubkeyAuthentication yes’ >>/usr/local/openssh/etc/sshd_config
echo ‘PasswordAuthentication yes’ >>/usr/local/openssh/etc/sshd_config

#将编译安装的新配置文件 拷贝到原路径下
cp /usr/local/openssh/etc/sshd_config /etc/ssh/sshd_config
cp /usr/local/openssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/openssh/bin/ssh /usr/bin/ssh
cp /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
cp /usr/local/openssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub

#拷贝启动脚本

cp -p contrib/redhat/sshd.init /etc/init.d/sshd

#给sshd添加可执行权限

chmod +x /etc/init.d/sshd

#设置开机自启

systemctl enable sshd

#重新启动sshd服务

systemctl restart sshd

#查看sshd服务状态

systemctl status sshd

#查看ssh版本是否升级成功,可以查看到已经是9.5版本了

ssh -V
OpenSSH_9.8p1, OpenSSL 3.2.2 4 Jun 2024

到此 OpenSSH 升级完成,还望大家多多指点。

;