背景
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 升级完成,还望大家多多指点。