一、问题描述
某次漏扫发现,系统中SSH版本过低,存在漏洞,报:OpenSSH 代码问题漏洞(CVE-2023-38408)警示;CVE-2023-38408是一个远程代码执行漏洞,位于 ssh-agent 的转发功能内,特别是涉及提供PKCS#11相关服务的情况下。在某些条件下,可以操纵ssh-agent对PKCS#11的支持,以便通过转发的代理套接字来促进远程代码执行。利用的先决条件包括受害者系统上存在特定库以及需要将代理转发到攻击者控制的系统。其中,ssh-agent是一个后台程序,可缓存用于SSH公钥身份验证的私钥,通过跟踪用户的身份密钥和密码来简化用户身份验证过程。 一旦这些密钥存储在ssh-agent中,它就允许用户访问其他服务器,而无需重新输入密码或密码,从而提供流畅的单点登录(SSO)体验,从而减少常规密码输入的需要。它在X或登录会话开始时启动,通过将密钥存储在内存中并仅在进程结束时卸载来进行操作。它在自动化脚本或需要频繁服务器连接的任务中非常有用,因为它可以防止不安全的密码存储或持续的密码短语输入。另外,到ssh-agent的连接还可以从更远的远程转发,以避免需要将身份验证数据存储在其他机器上。
利用此漏洞允许远程攻击者可以在受漏洞影响的OpenSSH转发的ssh-agent上执行任意命令。Qualys安全研究人员已经能够独立验证该漏洞并在Ubuntu Desktop 22.04和21.10的安装上开发PoC漏洞。其他Linux发行版可能容易受到攻击并且可能被利用。另外根据debian官方漏洞影响范围,目前版本均受影响,其最新版本已经修复。
危险级别: 高危险
影响平台: OpenSSH before 9.3p2
现场环境:Anolis8.6、OpenSSH_8.0p1,、OpenSSL 1.1.1k
修复建议:目前厂商已发布升级补丁以修复漏洞,补丁获取: 补丁链接,或升级到9.4p1或9.5p1版本;
相关资源:stackoverflow、与BSD包的区别、Rhel 8 cryptographic-policies、 System-wide cryptographic policies、Linux SSH 加密算法的设置、安装指导
二、修复过程及问题处理
2.1、备份
cp -pr /usr/bin/ssh /usr/bin/ssh_src
cp -pr /usr/sbin/sshd /usr/sbin/sshd_src
cp -pr /etc/ssh/sshd_config /etc/ssh/sshd_config.src
cp -pr /usr/bin/sftp /usr/bin/sftp.src
cp -pr /usr/bin/ssh-add /usr/bin/ssh-add.src
cp -pr /usr/bin/ssh-agent /usr/bin/ssh-agent.src
cp -pr /usr/bin/ssh-keygen /usr/bin/ssh-keygen.src
cp -pr /usr/bin/ssh-keyscan /usr/bin/ssh-keyscan.src
yum install telnet-server xinetd
vi /etc/xinetd.d/telnet
service telnet #注意如下的空行
{
flags = REUSE #socket可重用
socket_type = stream #连接方式为TCP
wait = no ##为每个请求启动一个进程
user = root #启动服务的用户为root
server = /usr/sbin/in.telnetd ##要激活的进程
log_on_failure += USERID ##登录失败时记录登录用户名
disable = no
}
vi /etc/securetty #增加如下控制台,如果登录用户较多,需要更多的pts/*
pts/0
pts/1
pts/2
#完成后重启,这样root可以telnet登录了
systemctl enable xinetd
systemctl enable telnet.socket #因为是由xinetd管理,这里启动的是telnet.socket而不是telnet.service
/etc/init.d/xinetd restart
netstat -tulp|grep telnet
#默认情况下,PAM模块限制root不能telnet到telnet-server
/etc/pam.d/login #注释如下行
#auth required pam_securetty.so #将这一行加上注释!
#telnet端口修改
vi /etc/services #进入编辑模式后查找telnet(vi编辑方式下输入/telnet)
telnet 23/tcp
telnet 23/udp #将23修改成未使用的端口号(如:5223),退出vi,重启telnet服务,telnet默认端口号就被修改了
#对telnet使用限制,因telnet是明文传送口令和数据的
vi /etc/xinetd.d/telnet
service telnet
{
disable = no #激活 telnet 服务,no
bind = 192.168.10.2 #your ip
only_from = 192.168.10.0/24 #只允许 192.168.10.0/24 这个网段进入
only_from = .edu.cn #只有教育网才能进入!
no_access = 192.17.3.{
115,116} #这两个ip不可登陆
access_times= 8:00-12:00 20:00-23:59 # 每天只有这两个时间段开放服务
......
}
#登录验证
telnet 10.100.1.0 5223 #输出如下
Trying 10.100.1.205...
Connected to 10.100.1.205.
Escape character is '^]'.
Kernel 4.19.0-372.26.2.el8.bclinux.x86_64 on an x86_64
localhost login: root
Password: #输入密码
Last login: Tue Oct 17 16:33:54 from 10.100.8.206
Authorized users only. All activity may be monitored and reported
说明:处上述常用命令外,还有如下指令,所以最好别默认编译,先编译安装到其他目录文件下,按需替换二进制文件即可
ssh-add:用于将私钥添加到 SSH 身份验证代理的命令行工具,向ssh-agent添加私钥,以便进行身份验证和加密;
ssh-agent:管理私钥,以便在连接远程服务器时进行身份验证并安全地连接到远程服务器;
ssh-keygen:用于生成、管理和认证SSH密钥对的命令行工具;
ssh-keyscan:用于检索和管理SSH服务器的公钥的命令行实用程序;
sftp-server:是OpenSSH的关键组件,它提供了一种安全可靠的通过网络传输文件的方式;
sshd:SSH守护进程,通过加密技术来保护传输的数据,同时也提供了身份验证机制,以防止未经授权的访问;
ssh-keysign:工具程序,它被用于验证用户的身份,并生成可信任的证书来进行身份验证;
ssh-pkcs11-helper:辅助工具程序,用于通过PKCS#11接口来管理加密设备的工具程序。它充当了SSH客户端和加密设备之间的中间人,提供了与加密设备的通信和管理功能;
ssh-sk-helper:辅助工具程序,用于通过FIDO2安全密钥来进行身份验证。FIDO2安全密钥是一种硬件安全设备,可以用于存储加密密钥和进行身份验证,是一种更安全和方便的身份验证方式。
2.2、升级处理
注:升级SSH时你的SSH是不会因为升级或重启服务而断掉的;
前提:Zlib 1.1.4 or 1.2.1.2 or greater (earlier 1.2.x versions have problems);LibreSSL 3.1.0 or greater; OpenSSL1.1.1 or greater;
wget https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/openssh-9.5.tar.gz
wget https://www.x.org/archive/individual/util/makedepend-1.0.8.tar.xz
cd /usr/src/usr.bin
tar zxvf .../openssh-9.5.tar.gz
cd ssh
make -d obj #这里报错了,如下所示
GNU Make 4.2.1
为 x86_64-Anolis-linux-gnu 编译
Copyright (C) 1988-2016 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
正在读入 makefiles...
正在读入 makefile “Makefile”...
Makefile:3: *** 遗漏分隔符 (null)。 停止。
#上述报错原因是因为BSD的环境与现场系统GNU的不匹配导致
执行make时会调用系统相关命令,而因为命令前置分隔符的作用,检测到不一致时报错:上述安装包里这个 makefile 是为 BSD make 编写的,当我们正在尝试使用 GNU make 运行它时,就会报错,因为它们使用不同的格式。
cat -e -t -v Makefile #查看特殊字符,-v(识别特殊字符),-E (会识别空格字符,用$表示出来),-T(会识别tab字符,用^I显示出来),-e (-v和-E的组合)
#^I$OpenBSD: Makefile,v 1.17 2019/10/31 21:22:01 djm Exp $$
$
.include <bsd.own.mk>$ #报错的就是这行,所以没法修改该文件来实现,因特别是,.include命令在GNU make中无效
$
SUBDIR=^Issh sshd ssh-add ssh-keygen ssh-agent scp sftp-server ssh-keysign ssh-keyscan sftp ssh-pkcs11-helper ssh-sk-helper$
$
distribution:$
^I${INSTALL} -C -o root -g wheel -m 0644 ${.CURDIR}/ssh_config \$
^I ${DESTDIR}/etc/ssh/ssh_config$
^I${INSTALL} -C -o root -g wheel -m 0644 ${.CURDIR}/sshd_config \$
^I ${DESTDIR}/etc/ssh/sshd_config$
$
.include <bsd.subdir.mk>$
#重新下载编译好的替代文件,这里我们是使用aliyun的
wget https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-9.5p1.tar.gz
tar -xzf openssh-9.5p1.tar.gz
cd openssh-9.5p1/
yum install zlib-devel automake autoconf libtool -y
./configure --prefix=/root/ssh_9.5p1 --sysconfdir=/etc/ssh --with-pam --with-openssl-lib=/usr/lib64/ --with-md5-passwords --with-kerberos5 --with-ssl-engine --with-zlib --with-tcp-wrappers --disable-etc-default-login
#报错如下:
……
checking for openssl... /usr/bin/openssl
configure: error: *** working libcrypto not found, check config.log
#检查日志:
configure:15476: error: *** working libcrypto not found, check config.log
#涉及的代码如下
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
else $as_nop
as_fn_error $? "*** working libcrypto not found, check config.log" "$LINENO" 5
fi
#上述报错多是因为:安装依赖于 OpenSSL 加密库的软件包时出现;检查包含这些头文件的软件包,通常称为 “openssl-devel” 或 “libssl-dev”,查看是否安装
yum list installed|grep openssl-devel
yum list installed|grep libssl-devel
yum install openssl-devel -y
#再次报错:
configure: error: PAM headers not found
#同上,安装pam库
yum -y install pam-devel
#再次configure,通过
……
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 A