SOC Prime Bias: Alto

14 Abr 2026 18:38

VIPERTUNNEL Backdoor em Python: Uma Análise Detalhada

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
VIPERTUNNEL Backdoor em Python: Uma Análise Detalhada
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O relatório detalha a análise do VIPERTUNNEL, um backdoor baseado em Python que atinge persistência por meio de uma tarefa agendada e utiliza um sitecustomize.py malicioso para carregar um DLL ofuscado. O DLL descriptografa e executa uma carga útil em múltiplas etapas que estabelece um proxy SOCKS5 para um servidor C2 codificado por hardware na porta 443. A infraestrutura está vinculada ao UNC2165 e EvilCorp e compartilha técnicas de ofuscação com o ladrão de credenciais ShadowCoil.

Investigação

Pesquisadores examinaram a saída do Autoruns, identificaram a tarefa agendada 523135538 e rastrearam a execução até C:ProgramDatacp49spythonw.exe e seu módulo sitecustomize.py. A engenharia reversa do b5yogiiy3c.dll revelou ofuscação em camadas, rotinas de descriptografia e um estágio final que cria um túnel SOCKS5 usando credenciais codificadas. A análise da infraestrutura vinculou múltiplos domínios e IPs à campanha e destacou o uso do framework Pyramid C2.

Mitigação

Implante a detecção de endpoint que monitore a execução do pythonw.exe sem argumentos, a criação de tarefas agendadas com nomes numéricos e a presença de sitecustomize.py em locais inesperados. Bloqueie o tráfego de saída para domínios C2 conhecidos e portas 443/8000 com respostas HTTP 401 anômalas. Implemente um controle estrito de aplicativos para impedir que módulos Python não autorizados sejam carregados.

Resposta

Alerta sobre a criação da tarefa agendada suspeita e a execução do pythonw.exe sem um script. Isolar hosts afetados, coletar dumps de memória, e buscar os nomes das classes características e credenciais codificadas. Invalidar as credenciais comprometidas e interromper a infraestrutura C2 identificada no relatório.

"graph TB %% Definições de classe classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef tool fill:#ffeb99 classDef file fill:#d9d9d9 classDef component fill:#cce5ff classDef c2 fill:#f4b084 classDef credential fill:#ffe6e6 %% Nós de Técnica tech_persistence["<b>Técnica</b> – T1053.005 Tarefa Agendada : Persistência<br/><b>Descrição</b>: Cria ou modifica uma tarefa agendada para executar código malicioso na inicialização do sistema ou em um cronograma."] class tech_persistence technique tech_obfuscation["<b>Técnica</b> – T1027 Arquivos ou Informações Ofuscados<br/><b>Descrição</b>: Usa codificação, compressão e primitivas criptográficas para ocultar o código malicioso."] class tech_obfuscation technique tech_deobfuscate["<b>Técnica</b> – T1140 Desofuscar/Decodificar Arquivos ou Informações<br/><b>Descrição</b>: Decodifica Base85 e outras transformações para recuperar o código da próxima etapa."] class tech_deobfuscate technique tech_compile["<b>Técnica</b> – T1027.004 Compilar Após a Entrega<br/><b>Descrição</b>: Compila código recuperado na memória usando compile() e exec()."] class tech_compile technique tech_reflect["<b>Técnica</b> – T1620 Carregamento de Código Reflexivo<br/><b>Descrição</b>: Carrega e executa código diretamente da memória sem escrever no disco."] class tech_reflect technique tech_proxy_ext["<b>Técnica</b> – T1090.002 Proxy Externo<br/><b>Descrição</b>: Configura um proxy SOCKS5 externo para encaminhar tráfego."] class tech_proxy_ext technique tech_proxy_int["<b>Técnica</b> – T1090.001 Proxy Interno<br/><b>Descrição</b>: Usa componentes de proxy interno para retransmitir tráfego."] class tech_proxy_int technique tech_tunnel["<b>Técnica</b> – T1572 Tunelamento de Protocolo<br/><b>Descrição</b>: Encapsula o tráfego da vítima dentro do túnel SOCKS5."] class tech_tunnel technique tech_encrypted["<b>Técnica</b> – T1573 Canal Criptografado<br/><b>Descrição</b>: Criptografa a comunicação C2 com ChaCha20/XOR."] class tech_encrypted technique tech_webc2["<b>Técnica</b> – T1102 Serviço Web<br/><b>Descrição</b>: Comunica-se com C2 via HTTPS usando serviço Pyramid customizado."] class tech_webc2 technique tech_nonstd["<b>Técnica</b> – T1571 Porta Não Padrão<br/><b>Descrição</b>: Usa porta 443 para se misturar com o tráfego HTTPS legítimo."] class tech_nonstd technique %% Nós de Processo e Ferramenta process_task["<b>Processo</b> – Tarefa Agendada 523135538<br/><b>Comando</b>: C:ProgramDatacp49spythonw.exe"] class process_task process tool_pythonw["<b>Ferramenta</b> – pythonw.exe<br/><b>Função</b>: Executa scripts Python sem uma janela de console."] class tool_pythonw tool %% Nós de Arquivo file_sitecustomize["<b>Arquivo</b> – sitecustomize.py<br/><b>Finalidade</b>: Auto importa e aciona execução de DLL."] class file_sitecustomize file file_dll["<b>Arquivo</b> – b5yogiiy3c.dll<br/><b>Tipo</b>: Carga útil Python ofuscada."] class file_dll file %% Nós de Componente component_wire["<b>Componente</b> – Classe Wire<br/><b>Função</b>: Implementa cliente SOCKS5."] class component_wire component component_relay["<b>Componente</b> – Classe Relay<br/><b>Função</b>: Gerencia encaminhamento de tráfego."] class component_relay component component_commander["<b>Componente</b> – Classe Commander<br/><b>Função</b>: Gerencia comandos C2."] class component_commander component %% Nós de C2 e Credencial c2_server["<b>Servidor C2</b> – Serviço Pyramid<br/><b>Resposta</b>: HTTP 401 Basic realm=Proxy"] class c2_server c2 credentials["<b>Credenciais</b> – AnyUser / AnyPassword<br/><b>Uso</b>: Autentica com proxy."] class credentials credential %% Conexões tech_persistence –>|cria| process_task process_task –>|lança| tool_pythonw tool_pythonw –>|importa| file_sitecustomize file_sitecustomize –>|carrega| file_dll file_dll –>|usa| tech_obfuscation file_dll –>|aciona| tech_deobfuscate tech_deobfuscate –>|leva a| tech_compile tech_compile –>|leva a| tech_reflect tech_reflect –>|executa| component_wire component_wire –>|trabalha com| component_relay component_relay –>|controla| component_commander component_commander –>|contata| c2_server c2_server –>|usa| tech_proxy_ext c2_server –>|usa| tech_proxy_int c2_server –>|túnel via| tech_tunnel c2_server –>|cria canal criptografado| tech_encrypted c2_server –>|comunica-se sobre| tech_webc2 c2_server –>|usa porta| tech_nonstd component_commander –>|autentica com| credentials %% Aplicar classes class tech_persistence,tech_obfuscation,tech_deobfuscate,tech_compile,tech_reflect,tech_proxy_ext,tech_proxy_int,tech_tunnel,tech_encrypted,tech_webc2,tech_nonstd technique class process_task process class tool_pythonw tool class file_sitecustomize,file_dll file class component_wire,component_relay,component_commander component class c2_server c2 class credentials credential "

Fluxo de Ataque

Execução de Simulação

Pré-requisito: O Verificação Prévia de Telemetria e Linha de Base deve ter sido aprovado.

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 narrativas DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa de Ataque & Comandos:

    O adversário primeiro deposita um sitecustomize.py malicioso sitecustomize.py no mesmo diretório que pythonw.exe. Python importa automaticamente sitecustomize.py no início da execução do interpretador, permitindo ao invasor executar código arbitrário sem passar um caminho de script na linha de comando. Ao iniciar pythonw.exe sem qualquer argumento, o evento de criação de processo contém um CommandLine vazio, satisfazendo as condições da regra Sigma. A carga útil estabelece uma tarefa agendada para persistência, garantindo que o interpretador execute na inicialização do sistema, mantendo assim um ponto de apoio de longo prazo.

  • Script de Teste de Regressão:

    # -------------------------------------------------
    # Configuração do malicioso sitecustomize.py
    # -------------------------------------------------
    $payloadPath = 'C:ProgramDatacp49ssitecustomize.py'
    $exePath     = 'C:ProgramDatacp49spythonw.exe'
    
    # Garantir que a pasta de destino exista
    New-Item -ItemType Directory -Path (Split-Path $exePath) -Force | Out-Null
    
    # Implantar uma cópia inofensiva do pythonw.exe para o teste (se ainda não estiver presente)
    # Em um cenário real de red-team, este seria o interpretador legítimo
    if (-Not (Test-Path $exePath)) {
        # Copiar da instalação do sistema Python (ajuste o caminho conforme necessário)
        Copy-Item 'C:Python39pythonw.exe' $exePath
    }
    
    # Criar o sitecustomize.py malicioso (cria uma tarefa agendada como prova de conceito)
    @"
    import subprocess, sys
    # Cria uma tarefa agendada que executa pythonw.exe a cada minuto (persistência)
    subprocess.run(['schtasks', '/Create', '/SC', 'MINUTE', '/MO', '1',
                '/TN', 'UpdateTask', '/TR', sys.executable])
    "@ | Set-Content -Path $payloadPath -Encoding UTF8
    
    # -------------------------------------------------
    # Aciona a detecção (execução maliciosa)
    # -------------------------------------------------
    Write-Host '[+] Iniciando pythonw.exe com linha de comando vazia...'
    Start-Process -FilePath $exePath -ArgumentList '' -WindowStyle Hidden
    
    # Espere pouco tempo para a tarefa agendada ser criada (opcional)
    Start-Sleep -Seconds 5
    
    Write-Host '[+] Carga útil executada. Verifique seu SIEM para o alerta.'
    # -------------------------------------------------
    # Fim do script
    # -------------------------------------------------
  • Comandos de Limpeza:

    # Remover o sitecustomize.py malicioso
    Remove-Item -Path 'C:ProgramDatacp49ssitecustomize.py' -Force -ErrorAction SilentlyContinue
    
    # Excluir a tarefa agendada criada pela carga útil
    schtasks /Delete /TN UpdateTask /F
    
    # Opcionalmente remover o pythonw.exe copiado (se foi uma cópia de teste)
    # Remove-Item -Path 'C:ProgramDatacp49spythonw.exe' -Force
    
    Write-Host '[+] Limpeza completa.'