VIPERTUNNEL, un backdoor en Python: Un análisis profundo
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
El informe detalla el análisis de VIPERTUNNEL, un backdoor basado en Python que logra persistencia a través de una tarea programada y aprovecha un sitecustomize.py malicioso para cargar un DLL ofuscado. El DLL descifra y ejecuta una carga útil de múltiples etapas que establece un proxy SOCKS5 a un servidor C2 codificado en dureza sobre el puerto 443. La infraestructura está vinculada a UNC2165 y EvilCorp y comparte técnicas de ofuscación con el ladrón de credenciales ShadowCoil.
Investigación
Los investigadores examinaron la salida de Autoruns, identificaron la tarea programada 523135538 y rastrearon la ejecución a C:ProgramDatacp49spythonw.exe y su módulo sitecustomize.py. La ingeniería inversa del b5yogiiy3c.dll reveló ofuscación por capas, rutinas de descifrado y una etapa final que crea un túnel SOCKS5 usando credenciales codificadas en dureza. El análisis de infraestructura vinculó múltiples dominios e IPs a la campaña y destacó el uso del marco Pyramid C2.
Mitigación
Despliegue detección en el endpoint que monitoree la ejecución de pythonw.exe sin argumentos, creación de tareas programadas con nombres numéricos y la presencia de sitecustomize.py en ubicaciones inesperadas. Bloquee el tráfico saliente hacia dominios C2 conocidos y puertos 443/8000 con respuestas HTTP 401 anómalas. Implemente un control estricto de aplicaciones para evitar la carga de módulos de Python no autorizados.
Respuesta
Alerta sobre la creación de la tarea programada sospechosa y la ejecución de pythonw.exe sin un script. Ponga en cuarentena los hosts afectados, recolecte volcados de memoria y busque los nombres de clase característicos y credenciales codificadas en dureza. Invalide las credenciales comprometidas y rompa la infraestructura C2 identificada en el informe.
"graph TB %% Class definitions 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 %% Technique nodes tech_persistence["<b>Technique</b> – T1053.005 Tarea Programada : Persistencia<br/><b>Description</b>: Crea o modifica una tarea programada para ejecutar código malicioso al inicio del sistema o en un horario."] class tech_persistence technique tech_obfuscation["<b>Technique</b> – T1027 Archivos o Información Ofuscados<br/><b>Description</b>: Usa codificación, compresión y primitivas criptográficas para ocultar código malicioso."] class tech_obfuscation technique tech_deobfuscate["<b>Technique</b> – T1140 Desofuscar/Decodificar Archivos o Información<br/><b>Description</b>: Decodifica Base85 y otras transformaciones para recuperar código de la siguiente etapa."] class tech_deobfuscate technique tech_compile["<b>Technique</b> – T1027.004 Compilar Después de la Entrega<br/><b>Description</b>: Compila código recuperado en memoria usando compile() y exec()."] class tech_compile technique tech_reflect["<b>Technique</b> – T1620 Carga Reflexiva de Código<br/><b>Description</b>: Carga y ejecuta código directamente desde la memoria sin escribir en el disco."] class tech_reflect technique tech_proxy_ext["<b>Technique</b> – T1090.002 Proxy Externo<br/><b>Description</b>: Establece un proxy externo SOCKS5 para reenviar tráfico."] class tech_proxy_ext technique tech_proxy_int["<b>Technique</b> – T1090.001 Proxy Interno<br/><b>Description</b>: Usa componentes de proxy interno para retransmitir tráfico."] class tech_proxy_int technique tech_tunnel["<b>Technique</b> – T1572 Tunelización de Protocolo<br/><b>Description</b>: Encapsula tráfico de la víctima dentro del túnel SOCKS5."] class tech_tunnel technique tech_encrypted["<b>Technique</b> – T1573 Canal Encriptado<br/><b>Description</b>: Encripta comunicación C2 con ChaCha20/XOR."] class tech_encrypted technique tech_webc2["<b>Technique</b> – T1102 Servicio Web<br/><b>Description</b>: Se comunica con C2 a través de HTTPS usando servicio Pyramid personalizado."] class tech_webc2 technique tech_nonstd["<b>Technique</b> – T1571 Puerto No Estándar<br/><b>Description</b>: Usa el puerto 443 para mezclarse con el tráfico HTTPS legítimo."] class tech_nonstd technique %% Process and tool nodes process_task["<b>Proceso</b> – Tarea Programada 523135538<br/><b>Comando</b>: C:ProgramDatacp49spythonw.exe"] class process_task process tool_pythonw["<b>Herramienta</b> – pythonw.exe<br/><b>Rol</b>: Ejecuta scripts de Python sin una ventana de consola."] class tool_pythonw tool %% File nodes file_sitecustomize["<b>Archivo</b> – sitecustomize.py<br/><b>Propósito</b>: Importaciones automáticas y desencadena la ejecución del DLL."] class file_sitecustomize file file_dll["<b>Archivo</b> – b5yogiiy3c.dll<br/><b>Tipo</b>: Carga útil de Python ofuscada."] class file_dll file %% Component nodes component_wire["<b>Componente</b> – Clase Wire<br/><b>Función</b>: Implementa cliente SOCKS5."] class component_wire component component_relay["<b>Componente</b> – Clase Relay<br/><b>Función</b>: Gestiona el reenvío de tráfico."] class component_relay component component_commander["<b>Componente</b> – Clase Commander<br/><b>Función</b>: Maneja comandos C2."] class component_commander component %% C2 and credential nodes c2_server["<b>Servidor C2</b> – Servicio Pyramid<br/><b>Respuesta</b>: HTTP 401 Basic realm=Proxy"] class c2_server c2 credentials["<b>Credenciales</b> – AnyUser / AnyPassword<br/><b>Uso</b>: Autentica con proxy."] class credentials credential %% Connections tech_persistence –>|crea| process_task process_task –>|lanza| tool_pythonw tool_pythonw –>|importa| file_sitecustomize file_sitecustomize –>|carga| file_dll file_dll –>|usa| tech_obfuscation file_dll –>|desencadena| tech_deobfuscate tech_deobfuscate –>|conduce a| tech_compile tech_compile –>|conduce a| tech_reflect tech_reflect –>|ejecuta| component_wire component_wire –>|trabaja con| component_relay component_relay –>|controla| component_commander component_commander –>|contacta| c2_server c2_server –>|usa| tech_proxy_ext c2_server –>|usa| tech_proxy_int c2_server –>|canaliza a través de| tech_tunnel c2_server –>|encripta canal| tech_encrypted c2_server –>|se comunica a través de| tech_webc2 c2_server –>|usa puerto| tech_nonstd component_commander –>|autenticación con| credentials %% Apply 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 "
Flujo de Ataque
Detecciones
Ejecución de Python desde Carpetas Sospechosas (vía línea de comandos)
Ver
Tarea Programada Sospechosa (vía auditoría)
Ver
IOC (IP de origen) para detectar: Deslizándose a través del Ruido – Profundizando en el Backdoor VIPERTUNNEL Python Parte 2
Ver
IOC (IP de origen) para detectar: Deslizándose a través del Ruido – Profundizando en el Backdoor VIPERTUNNEL Python Parte 1
Ver
IOC (IP de destino) para detectar: Deslizándose a través del Ruido – Profundizando en el Backdoor VIPERTUNNEL Python Parte 2
Ver
IOC (IP de destino) para detectar: Deslizándose a través del Ruido – Profundizando en el Backdoor VIPERTUNNEL Python Parte 1
Ver
Ejecución Sospechosa de Python para Persistencia vía sitecustomize.py [Creación de Procesos de Windows]
Ver
Ejecución de Simulación
Prerrequisito: La verificación de Telemetría & Línea Base Previa debe haber pasado.
Razonamiento: Esta sección detalla la ejecución precisa de la técnica del adversario (TTP) diseñada para activar la regla de detección. Los comandos y la narrativa DEBEN reflejar directamente los TTPs identificados y tienen como objetivo generar la telemetría exacta esperada por la lógica de detección.
-
Narrativa de Ataque y Comandos:
El adversario primero coloca un
sitecustomize.pymalicioso en el mismo directorio quepythonw.exe. Python importa automáticamentesitecustomize.pyal iniciar el intérprete, permitiendo al atacante ejecutar código arbitrario sin pasar una ruta de script en la línea de comandos. Al lanzarpythonw.exesin argumentos, el evento de creación de procesos contiene unaCommandLinevacía, satisfaciendo las condiciones de la regla Sigma. La carga útil establece una tarea programada para la persistencia, asegurando que el intérprete se ejecute al inicio del sistema, manteniendo así un punto de apoyo a largo plazo. -
Script de Prueba de Regresión:
# ------------------------------------------------- # Configurar sitecustomize.py malicioso # ------------------------------------------------- $payloadPath = 'C:ProgramDatacp49ssitecustomize.py' $exePath = 'C:ProgramDatacp49spythonw.exe' # Asegurar que la carpeta objetivo exista New-Item -ItemType Directory -Path (Split-Path $exePath) -Force | Out-Null # Desplegar una copia benigna de pythonw.exe para la prueba (si no está presente) # En un escenario real de equipo rojo, este sería el intérprete legítimo if (-Not (Test-Path $exePath)) { # Copiar desde la instalación del sistema Python (ajustar la ruta según sea necesario) Copy-Item 'C:Python39pythonw.exe' $exePath } # Crear sitecustomize.py malicioso (crea una tarea programada como prueba de concepto) @" import subprocess, sys # Crear una tarea programada que ejecute pythonw.exe cada minuto (persistencia) subprocess.run(['schtasks', '/Create', '/SC', 'MINUTE', '/MO', '1', '/TN', 'UpdateTask', '/TR', sys.executable]) "@ | Set-Content -Path $payloadPath -Encoding UTF8 # ------------------------------------------------- # Desencadenar la detección (ejecución maliciosa) # ------------------------------------------------- Write-Host '[+] Lanzando pythonw.exe con línea de comandos vacía...' Start-Process -FilePath $exePath -ArgumentList '' -WindowStyle Hidden # Esperar un corto periodo para que se cree la tarea programada (opcional) Start-Sleep -Seconds 5 Write-Host '[+] Carga útil ejecutada. Revisa tu SIEM para la alerta.' # ------------------------------------------------- # Fin del script # ------------------------------------------------- -
Comandos de Limpieza:
# Eliminar el sitecustomize.py malicioso Remove-Item -Path 'C:ProgramDatacp49ssitecustomize.py' -Force -ErrorAction SilentlyContinue # Eliminar la tarea programada creada por la carga útil schtasks /Delete /TN UpdateTask /F # Opcionalmente eliminar el pythonw.exe copiado (si era una copia de prueba) # Remove-Item -Path 'C:ProgramDatacp49spythonw.exe' -Force Write-Host '[+] Limpieza completa.'