远程代码执行漏洞CVE-2024-6387修复
本文处理以下问题:
- OpenSSH_9.7p1升级到OpenSSH_9.8p1
- cp: 无法创建普通文件"/usr/sbin/sshd":文本文件忙
链接:https://pan.baidu.com/s/1tUBYK4WzCiJBcCqQDOtQhw?pwd=8tfv
提取码:8tfv
(已添加本次升级所需文件 openssh-9.8p1.tar.gz
)也可以自行下载。
本文适用CentOS7.7 和 7.8
且 OpenSSH 版本已升级到 9.7p1
的情况,升级过程的可以参考《OpenSSH漏洞修复》,其他版本未测试。
1.环境说明
如按照《OpenSSH漏洞修复》已升级到 9.7p1
版本, 以下依赖和 zlib-1.3.1.tar.gz
、openssl-3.2.0.tar.gz
均已安装。
# 1.【已下载】的26个依赖文件
perl-IPC-Cmd-0.80-4.el7.noarch.rpm
pyparsing-1.5.6-9.el7.noarch.rpm
gdbm-devel-1.10-8.el7.x86_64.rpm
perl-Test-Harness-3.28-3.el7.noarch.rpm
perl-ExtUtils-Manifest-1.61-244.el7.noarch.rpm
perl-version-0.99.07-6.el7.x86_64.rpm
perl-Perl-OSType-1.003-3.el7.noarch.rpm
perl-Module-Load-Conditional-0.54-3.el7.noarch.rpm
libdb-devel-5.3.21-25.el7.x86_64.rpm
perl-Module-Load-0.24-3.el7.noarch.rpm
perl-ExtUtils-MakeMaker-6.68-3.el7.noarch.rpm
perl-local-lib-1.008010-4.el7.noarch.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-Digest-1.17-245.el7.noarch.rpm
perl-Module-Metadata-1.000018-2.el7.noarch.rpm
perl-Digest-SHA-5.85-4.el7.x86_64.rpm
perl-Locale-Maketext-1.23-3.el7.noarch.rpm
perl-Params-Check-0.38-2.el7.noarch.rpm
perl-ExtUtils-ParseXS-3.18-3.el7.noarch.rpm
systemtap-sdt-devel-4.0-13.el7.x86_64.rpm
perl-devel-5.16.3-299.el7_9.x86_64.rpm
perl-ExtUtils-CBuilder-0.28.2.6-299.el7_9.noarch.rpm
perl-Locale-Maketext-Simple-0.21-299.el7_9.noarch.rpm
perl-ExtUtils-Install-1.58-299.el7_9.noarch.rpm
perl-Module-CoreList-2.76.02-299.el7_9.noarch.rpm
perl-CPAN-1.9800-299.el7_9.noarch.rpm
# 2.安装
rpm -ivh --force *.rpm
2.OpenSSH升级过程
升级前请多打开几个SSH
连接,并输入 top
使其保持连接状态,然后进行以下操作。
2.1 备份
# 备份ssh文件
cp -r /etc/ssh /etc/ssh.old
cp -p /usr/bin/ssh /usr/bin/ssh.bak
cp -p /usr/sbin/sshd /usr/sbin/sshd.bak
cp -p /usr/bin/ssh-keygen /usr/bin/ssh-keygen.bak
2.2 升级
- 直接下载或官网下载后上传
openssh-9.8p1.tar.gz
:
# 1.解压
tar -zxvf openssh-9.8p1.tar.gz
cd openssh-9.8p1
# 2.编译安装【3分钟左右】
./configure --prefix=/usr/local/ssh --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/ssl
make -j 4 && make install
- 配置及覆盖旧版本
# 1.ssh允许root登录 需要密码进行验证
echo 'PermitRootLogin yes' >> /usr/local/ssh/etc/sshd_config
echo 'PubkeyAuthentication yes' >> /usr/local/ssh/etc/sshd_config
echo 'PasswordAuthentication yes' >> /usr/local/ssh/etc/sshd_config
# 2.停止sshd服务
systemctl stop sshd
# 3.将编译安装的新配置文件拷贝到原路径下
cp /usr/local/ssh/bin/ssh /usr/bin/ssh
cp /usr/local/ssh/sbin/sshd /usr/sbin/sshd
cp /usr/local/ssh/bin/ssh-keygen /usr/bin/ssh-keygen
cp /usr/local/ssh/etc/sshd_config /etc/ssh/sshd_config
cp /usr/local/ssh/etc/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ecdsa_key.pub
# 4.拷贝启动脚本
cp -p ./contrib/redhat/sshd.init /etc/init.d/sshd
# 5.给sshd添加可执行权限
chmod +x /etc/init.d/sshd
# 6.设置开机自启
systemctl enable sshd
# 7.重新启动sshd服务
systemctl restart sshd
# 8.查看sshd服务状态
systemctl status sshd
# 9.查看ssh版本是否升级成功,可以查看到已经是9.8p1版本了
ssh -V
OpenSSH_9.8p1, OpenSSL 3.2.0 23 Nov 2023
ssh -V
查询的是客户端的版本,漏洞实际上是 Server 端的,所以需要验证 sshd 版本 【如果 sshd 文件没有覆盖成功 以下输出会依然是OpenSSH_9.7p1, OpenSSL 3.2.0 23 Nov 2023
】
# 查看sshd版本【sshd并没有查询版本的参数 错误参数也可以输出sshd的版本信息】
sshd -v
# 输出信息
unknown option -- v
OpenSSH_9.8p1, OpenSSL 3.2.0 23 Nov 2023
3.“/usr/sbin/sshd”:文本文件忙
3.1 原因分析
在停止 sshd 服务后,进行 sshd 文件的覆盖操作:
cp /usr/local/ssh/sbin/sshd /usr/sbin/sshd
此时报错:
cp:是否覆盖"/usr/sbin/sshd"? y
cp:无法创建普通文件"/usr/sbin/sshd":文本文件忙
虽然用 systemctl stop sshd
停止了 sshd 服务,但是 sshd 服务还有进程在运行中,导致其无法覆盖,此时如果我们是远程到服务器进行的升级操作,如果 kill 掉所有 sshd 服务,当前的所有连接都会断开,如果在机房用 KVM
进行操作则没有关系。
3.2 远程解决方法
以下是远程停止所有 sshd 进程并覆盖 sshd 文件再重启 sshd 服务的方法,编写执行脚本 sshdCp.sh
:
#!/bin/bash
echo "(1/4): 停止sshd服务..."
sudo systemctl stop sshd
sleep 5
echo "(1/4): 停止sshd服务完毕"
echo "(2/4): 杀掉全部SSHD进程..."
sudo killall sshd
sleep 5
echo "(2/4): 杀掉全部SSHD进程完毕"
echo "(3/4): 复制sshd文件..."
cp /usr/local/ssh/sbin/sshd /usr/sbin/sshd
sleep 2
echo "(3/4): 复制sshd文件完毕"
echo "(4/4): 启动SSHD服务..."
sudo systemctl start sshd
echo "(4/4): 启动SSHD服务成功"
给脚本可执行权限:
chmod +x sshdCp.sh
添加定时任务:
crontab -e
# 添加以下内容【12号的18点05分执行】也就是让其执行一次
05 18 12 * * sh pathTo/sshdCp.sh >> pathTo/sshdCp.log
覆盖成功后删除定时任务即可。