写在前面
SSRF 打 Redis 也是老生常谈的东西了,这里复现学习一下之前在 xz 看到某师傅写的关于 SSRF 利用 dict 和 gopher 打内网服务的文章,主要是对 webshell 和 sshkey 的写入进行复现,做一点小笔记。
准备环境
centos:有计划任务服务、redis4.x 版本
kali:作为攻击机,模拟 vps
物理机:phpstudy+ssrf.php
redis4.x 下载
SSRF 漏洞代码
网上找了一份 demo
探测漏洞
首先验证 SSRF 是否存在,可以通过获取远程服务器上的一些资源(比如图片),看看响应包是否能抓到,如果目标机能出网直接 DNSLOG 就能拿到真实 IP。
(当然用 dict 协议也可以)
dict 协议利用
dict 进行端口探测
抓包将端口那里设为要爆破的参数
可以事先准备个端口字典,根据 Length 升序即可
dict 打 Redis 之写 webshell
先 INFO 探测是否设置口令,比如下图提示就是有的
照样可以 Inturder 模块爆破去,注意用 :
代替 空格
注意变量后面与 HTTP/1.1
一定要有空格
更改 rdb 文件的目录至网站目录下
将 rdb 文件名 dbfilename 改为 webshell 的名字
如果存在 payload 被转义或有过滤情况,可利用 16 进制,写入 webshell
清空一下数据, 试试写一句话能不能连上
靶机 redis 有成功写入,注意最后写 save 刷新缓存。
蚁剑连接
dict 打 Redis 之计划任务反弹 shell
因为利用 redis 去 ubuntu 写总会有很多玄学问题,这里就用上面准备的 centos 的 redis 环境。
gopher 协议利用
gopher 写入 webshell
这里利用 sec_tools 生成 gopher 协议的 payload
工具:https://github.com/firebroo/sec_tools/tree/master/
使用方法:
redis.cmd
写入攻击所需的 redis 指令
运行 redis-over-gopher.py
得到 payload
根据目标信息把 ip 和 port 换一下即可
如果这里使用的是curl
命令(比如在命令行 curl + gopher)url 编码一次即可。也就是用下面的 payload 就可以
如果是 web 端的参数有 ssrf,需要 url 编码两次才可以打进去,只编码一次时 ?
会作为干扰使得后面 payload 打不进去。编码时只把特殊符号编码即可,如下:
写入成功。
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
同样的,如果不是利用 curl 的话,直接打需要再次 url 编码。
参考文章
https://www.cnblogs.com/sijidou/p/13681845.html
EOF