VIPERTUNNEL Backdoor em Python: Uma Análise Detalhada
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
Detecções
Execução de Python em Diretórios Suspeitos (via linha de comando)
Visualizar
Tarefa Agendada Suspeita (via auditoria)
Visualizar
IOCs (FonteIP) para detectar: Deslizando pelo Ruído – Mergulho Profundo no Backdoor VIPERTUNNEL Parte 2
Visualizar
IOCs (FonteIP) para detectar: Deslizando pelo Ruído – Mergulho Profundo no Backdoor VIPERTUNNEL Parte 1
Visualizar
IOCs (DestinoIP) para detectar: Deslizando pelo Ruído – Mergulho Profundo no Backdoor VIPERTUNNEL Parte 2
Visualizar
IOCs (DestinoIP) para detectar: Deslizando pelo Ruído – Mergulho Profundo no Backdoor VIPERTUNNEL Parte 1
Visualizar
Execução Suspeita de Python para Persistência via sitecustomize.py [Criação de Processo do Windows]
Visualizar
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.pyno mesmo diretório quepythonw.exe. Python importa automaticamentesitecustomize.pyno 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 iniciarpythonw.exesem qualquer argumento, o evento de criação de processo contém umCommandLinevazio, 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.'