写在前面

SSRF 打 Redis 也是老生常谈的东西了,这里复现学习一下之前在 xz 看到某师傅写的关于 SSRF 利用 dict 和 gopher 打内网服务的文章,主要是对 webshell 和 sshkey 的写入进行复现,做一点小笔记。

准备环境

centos:有计划任务服务、redis4.x 版本

kali:作为攻击机,模拟 vps

物理机:phpstudy+ssrf.php

redis4.x 下载

SSRF 漏洞代码

网上找了一份 demo

探测漏洞

首先验证 SSRF 是否存在,可以通过获取远程服务器上的一些资源(比如图片),看看响应包是否能抓到,如果目标机能出网直接 DNSLOG 就能拿到真实 IP。

(当然用 dict 协议也可以)

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图1

dict 协议利用

dict 进行端口探测

抓包将端口那里设为要爆破的参数

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图2

可以事先准备个端口字典,根据 Length 升序即可

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图3

dict 打 Redis 之写 webshell

先 INFO 探测是否设置口令,比如下图提示就是有的

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图4

照样可以 Inturder 模块爆破去,注意用 : 代替 空格

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图5

注意变量后面与 HTTP/1.1 一定要有空格

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图6

更改 rdb 文件的目录至网站目录下

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图7

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图8

将 rdb 文件名 dbfilename 改为 webshell 的名字

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图9

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图10

如果存在 payload 被转义或有过滤情况,可利用 16 进制,写入 webshell

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图11

清空一下数据, 试试写一句话能不能连上

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图12

靶机 redis 有成功写入,注意最后写 save 刷新缓存。

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图13

蚁剑连接

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图14

dict 打 Redis 之计划任务反弹 shell

因为利用 redis 去 ubuntu 写总会有很多玄学问题,这里就用上面准备的 centos 的 redis 环境。

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图15

gopher 协议利用

gopher 写入 webshell

这里利用 sec_tools 生成 gopher 协议的 payload

工具:https://github.com/firebroo/sec_tools/tree/master/

使用方法:

redis.cmd写入攻击所需的 redis 指令

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图16

运行 redis-over-gopher.py 得到 payload

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图17

根据目标信息把 ip 和 port 换一下即可

如果这里使用的是curl命令(比如在命令行 curl + gopher)url 编码一次即可。也就是用下面的 payload 就可以

如果是 web 端的参数有 ssrf,需要 url 编码两次才可以打进去,只编码一次时 会作为干扰使得后面 payload 打不进去。编码时只把特殊符号编码即可,如下:

写入成功。

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图18

gopher 定时任务反弹 shell

关于定时任务:

centos: 在 / var/spool/cron/root 或 /etc/crontab

ubuntu: 在 / var/spool/cron/crontabs/root 或 /etc/crontab

Ubuntu 这个计划任务吧,利用 redis 写入总会出现问题,这里使用 centos 的环境。

与 dict 打 redis 类似先将弹 shell 语句写入 redis.cmd

运行redis-over-gopher.py生成 payload,更改 payload 中的 ip 和 port

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图19

同样的,如果不是利用 curl 的话,直接打需要再次 url 编码。

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图20

参考文章

https://xz.aliyun.com/t/8613

https://www.cnblogs.com/sijidou/p/13681845.html

EOF

SSRF之利用dict和gopher吊打Redis - Zh1z3ven - 博客园 - 图21
https://www.cnblogs.com/Zh1z3ven/p/14214208.html