0
点赞
收藏
分享

微信扫一扫

OpenSSH漏洞修复编译升级日记

一、修复背景

这两天接到公司安全漏洞扫描报告,告知有2台服务器均存在4个漏洞,请求尽快对其进行修复!


二、准备工作

第1步:了解漏洞

CVE-2020-15778:

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

CVE-2021-41617:

漏洞描述:OpenSSH 6.2到8.8之前版本存在安全漏洞。该漏洞源于允许权限提升,因为补充组未按预期初始化。

CVE-2018-15919:

漏洞描述:OpenSSH 7.8及之前版本,auth-gss2.c文件存在安全漏洞。远程攻击者可利用该漏洞检测其指定的用户是否存在。

CVE-2017-15906:

漏洞描述:OpenSSH 7.6之前的版本中的sftp-server.c文件的‘process_open’函数存在安全漏洞,该漏洞源于程序在只读模式下没有正确的阻止写入操作。攻击者可利用该漏洞创建长度为零的文件。


第2步:分析原因

经过查看安全扫描日志与实际情况分析,产生以上漏洞的原因均由于CentOS 7.6默认内置的OpenSSH版本较低所引起的安全漏洞问题,并非外部原因引起(如人为、黑客攻击)。


第3步:确定方案

漏洞等级危险性一般分为高、中高、中、中低、低5个等级,如果最高等级以10分计算,以上5个漏洞危险等级分别为:7.8/7.0/5.3/5.3/5.3,漏洞修复方式目前主要有2种:版本升级修复,补丁修复2种主要方式。其中第1、2漏洞属于中高级风险,需要尽快修复。

因为OpenSSH官方没有提供修复补丁,目前考虑采用直接升级新版本修复以上漏洞。


第4部:修复漏洞

(1)下载准备资源包

1、OpenSSH 8.9p1-1.1.x86_64. tar:​​https://mirrors.aliyun.com/openssh/portable/​​

2、OpenSSL 1.1.1n.tar: ​​https://www.openssl.org/source/mirror.html​​

(2)使用你想能到的任何方法上传到服务器,我提前使用yum安装了较轻便的lrzsz,当然你用xftp等工具也OK,我这里上传到服务器目录:/data/tools

​(3)更新OpenSSH会导致SSHD服务中断,因此需要提前部署好telnet登录服务,在更新过程保持使用telnet而不用SSH!

  --- 先确认服务器是否有安装xinetd和telnet-server

rpm -qa|grep xinetd
rpm -qa|grep telnet-server

#若无结果,使用yum直接静默安装
yum install -y telnet-server
yum install -y xinetd

--- 新版xinetd默认没有telnet配置文件,因此即使安装成功也不会启动telnet服务,需要手动添加配置文件,重启服务开启!

ll /etc/xinetd.d/telnet
#确认该文件是否存在(新版肯定不存在) No such file or directory

#创建该文件,并将下面的配置贴上去、保存(VIM若没有就装一个,懒就直接vi)
vim /etc/xinetd.d/telnet

#telnet配置
service telnet
{
disable = no //启用
flags = REUSE //默认都启用REUSE
socket_type = stream //tcp
wait = yes //允许多进程响应请求
user = root //运行服务的用户
server = /usr/sbin/in.telnetd //服务的二进制文件路径
only_from = //只允许哪个IP或哪个网络访问
no_access = //不允许哪些用户访问,
access_time = 00:00-23:59 //允许哪些时间段访问服务
bind = 192.168.105.112 //绑定IP
per_source = 10 //每个ip允许请求的最大
cps = 10 30 //每秒最多允许访问多少,超过等待30秒
banner = /etc/telnet.banner //登录时显示的信息
log_type = FILE /var/log/telnet.log //自定义日志文件路径
log_on_failure += USERID //如果登录式失败,再记录上用户的ID
}

#重新启动xinetd托管服务
systemctl restart xinetd

#尝试telnet自己
telnet localhost
#注意:如果使用root账号telnet自己,即使密码是正确的,也有可能会被安全策略禁止。
#root被禁止后的开启方法
#查看当前会话ID,留意日志中截图的这一行,记录下pts的值
tail /var/log/secure

OpenSSH漏洞修复编译升级日记_安全漏洞

#假设当前会话ID是 pts/15,就将其添加到安全会话控制文件中,保存之!
vim /etc/securetty

OpenSSH漏洞修复编译升级日记_服务器_02

---启动telnet服务

systemctl enable xinetd --now
systemctl enable telnet.socket --now
netstat -nltp|grep 23
#若23处于侦听状态,表示telnet服务正常运行

--- 到了这一步,本机已经正常登录了,再尝试从远程登录,如果OK那么可以跳过下面这个流程,若远程无法登录,请先检查防火墙 TCP 23端口是否已对公共区域开放,若未开放则设置开放之

firewall-cmd --query-port=23/tcp
#若为no,则添加规则开放一下

#开放防火墙端口(反正只开放一次,可以不加--permanent参数)
firewall-cmd --zone=public --add-port=23/tcp

#重新加载防火墙模块
firewall-cmd --complete-reload

#再次查询端口开放状态
firewall-cmd --query-port=23/tcp
#应该为yes

(4)现在开始进入主戏,从现在开始一律采用telnet登录

---安装OpenSSL

#安装依赖包
yum -y install gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel pam-devel

#安装zlib
yum install -y zlib*

#编译安装OpenSSL
#开始之前,先检查是否有旧版文件,有就备份一下原有的OpenSSL文件
ll /usr/bin/openssl

mv /usr/bin/openssl{,.bak}
mv /usr/include/openssl{,.bak}

#进入你的tar包目录并解压
tar -xvf openssl-1.1.1n.tar
cd openssl-1.1.1n

##检查配置并自动编译安装
./config shared && make && make install

#编译完成后,可以在/usr/local目录下找到openssl的二进制文件和目录
ll /usr/local/bin/openssl
-rwxr-xr-x 1 root root 749136 Jan 14 14:25 /usr/local/bin/openssl
ll -d /usr/local/include/openssl/
drwxr-xr-x 2 root root 4096 Jan 14 14:25 /usr/local/include/openssl/

#建立软连接
ln -s /usr/local/bin/openssl /usr/bin/openssl
ln -s /usr/local/include/openssl/ /usr/include/openssl

#若软连接建立异常,会有红色字提示在,这时要仔细检查注意路径是否有误
ll /usr/bin/openssl
lrwxrwxrwx 1 root root 22 Jan 14 14:32 /usr/bin/openssl -> /usr/local/bin/openssl

ll -d /usr/include/openssl
lrwxrwxrwx 1 root root 27 Jan 14 14:33 /usr/include/openssl -> /usr/local/include/openssl/

#验证openssl版本
#追加库路径到配置文件
echo "/usr/local/lib64" >> /etc/ld.so.conf
#重新加载配置
/sbin/ldconfig
#查看当前SSL版本
openssl version

#升级后如果执行 openssl version
命令出现openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory错误执行以下命令即可。
#是由于找不到libssl.so.1.1文件,先查找:find / -name 'libssl.so.1.1',将/etc/ld.so.conf 里面的lib64改成find出来的路径即可。
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

---安装OpenSSH

#万事先备份绝不会错,备份原有的ssh目录
mv /etc/ssh{,.bak}
mkdir /usr/local/openssh

#解包,进入目录
tar -xvf openssh-8.9p1.tar
cd ssh

#编译安装
./configure --prefix=/usr/local/openssh \
sysconfdir=/etc/ssh \
with-openssl-includes=/usr/local/include \
with-ssl-dir=/usr/local/lib64 \
with-zlib \
with-md5-passwords \
with-pam && \
make && \
make install

#配置sshd_config文件
echo "UseDNS no" >> /etc/ssh/sshd_config
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config
echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config

#创建新的sshd二进制文件
#先备份
mv /usr/sbin/sshd{,.bak}
mv /usr/bin/ssh{,.bak}
mv /usr/bin/ssh-keygen{,.bak}

#创建软连接
ln -s /usr/local/openssh/bin/ssh /usr/bin/ssh
ln -s /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
ln -s /usr/local/openssh/sbin/sshd /usr/sbin/sshd


#查看openssh当前版本
ssh -V

#重新启动openssh服务
#先停止服务
systemctl disable sshd --now

#备份文件
mv /usr/lib/systemd/system/sshd.service{,.bak}

#重载守护进程
systemctl daemon-reload

#复制配置文件
cp -a data/tools/ssh/contrib/redhat/sshd.init /etc/init.d/sshd
cp -a data/tools/ssh/contrib/redhat/sshd.pam /etc/pam.d/sshd.pam

#添加设置
chkconfig --add sshd

#重新开启服务
systemctl enable sshd --now



举报

相关推荐

0 条评论