CVE-2023-46747和AJP走私漏洞
字数 1626 2025-08-19 12:41:48
AJP走私漏洞与CVE-2023-46747深度分析
1. AJP协议基础
1.1 AJP协议概述
AJP (Apache JServ Protocol)是一种用于连接web服务器与应用服务器的二进制协议,主要用于:
- Apache HTTP Server或Nginx与Tomcat等Java应用服务器间的通信
- 提供比HTTP更高效的二进制通信方式
- 支持请求属性、头部和正文的传输
1.2 AJP协议特点
- 二进制协议(不同于HTTP的文本协议)
- 默认使用8009端口
- 在Tomcat中实现为AJP连接器
- 协议详细文档:Apache AJPv13协议
2. AJP走私漏洞原理
2.1 基本概念
AJP走私漏洞利用的是:
- AJP协议与HTTP协议之间的差异
- 中间件(如代理服务器或负载均衡器)和应用服务器对HTTP请求的不同解析方式
2.2 攻击原理
攻击者通过特殊构造的请求:
- 操纵AJP协议下的数据流
- 实现请求走私(Request Smuggling)
- 发送额外的"隐藏"请求
2.3 实际危害
- 访问原本无法访问的地址
- 绕过外部访问配置限制
- 结合其他漏洞提升攻击效果
2.4 历史案例
最著名的AJP利用案例是长亭发现的"Ghostcat"漏洞:
- 允许读取目标机器webapp目录下的任意文件
- 影响范围广,危害严重
3. CVE-2023-46747漏洞分析
3.1 漏洞背景
- 影响F5 BIG-IP设备的Apache定制版(基于Apache 2.4.6)
- 结合AJP走私和其他漏洞实现攻击链
3.2 漏洞利用前提
- 已知BIG-IP历史漏洞CVE-2022-1388可通过
/mgmt/tm/util/bash执行命令 - 但该漏洞的权限绕过(X-F5-Auth-Token)已被修复
- 需要新的认证方式来获取有效token
3.3 完整攻击流程
3.3.1 第一阶段:创建管理员账户
- 通过AJP走私访问
/tmui/Control/form - 调用
/tmui/system/user/create.jsp创建新用户 - 关键点:需要绕过CSRF防护
3.3.2 CSRF防护绕过
需要构造三个特殊参数:
_timenow= aTmui-Dubbuf= BBBBBBBBBBB_bufvalue= eIL4RUnSwXYoPUIOGcOFx2o00Xc=
要求:_bufvalue的值必须等于Tmui-Dubbuf + Tmui-Dubbuf
3.3.3 第二阶段:获取认证token
- 使用新创建的用户凭证
- 访问
/mgmt/shared/authn/login - 获取有效的X-F5-Auth-Token
3.3.4 第三阶段:命令执行
- 使用获取的token
- 访问
/mgmt/tm/util/bash - 执行任意系统命令
3.4 技术细节
请求构造要点
- 使用
Transfer-Encoding: chunked头 - 第一个204表示trunk size大小(十进制516,对应十六进制请求长度)
- 最后的0表示请求结束
实际攻击注意事项
- 可能需要多次尝试才能成功
- 成功标志:返回的不是登录界面
- 成功后获取token并执行命令
4. 漏洞利用POC示例
POST /tmui/Control/form HTTP/1.1
Host: target
Transfer-Encoding: chunked
204
... [走私请求内容,长度516字节] ...
0
[空行]
5. 防御建议
- 禁用不必要的AJP连接器
- 限制AJP端口的访问(默认8009)
- 及时更新F5 BIG-IP到安全版本
- 实施严格的输入验证
- 监控异常的AJP请求模式
6. 扩展思考
- 老版本组件中可能存在类似漏洞
- AJP走私可与其他漏洞形成攻击链
- 在代码审计和渗透测试中应关注:
- 系统使用的中间件版本
- AJP协议是否暴露
- 历史漏洞的潜在利用方式
7. 总结
CVE-2023-46747展示了AJP走私漏洞的实际危害:
- 通过请求走私重新利用已修复的老漏洞
- 绕过安全防护措施
- 最终实现权限提升和命令执行
该案例强调了:
- 协议级漏洞的重要性
- 防御纵深的需要
- 及时更新和全面安全评估的必要性