RenEngine Loader y HijackLoader: Cadena de Ataque de Doble Etapa Alimentando Campañas de Robo
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
Desde abril de 2025, los investigadores han seguido una operación de robo a gran escala construida alrededor de una cadena de carga de dos etapas. La primera etapa, RenEngine Loader, está incrustada dentro de un lanzador de juegos Ren’Py aparentemente legítimo y descifra un cargador de seguimiento denominado HijackLoader. Luego, HijackLoader abusa de la carga lateral de DLLs y el doppelgänging de procesos, utilizando un marco modular que puede organizar más de 30 módulos auxiliares antes de finalmente entregar una carga útil de stealer ACR. La distribución está vinculada a instaladores de juegos crackeados promovidos a través de ecosistemas de piratería, afectando a cientos de miles de víctimas a nivel mundial.
Investigación
El equipo de Howler Cell reconstruyó toda la cadena de ejecución, revirtiendo la ingeniería de la lógica Python de RenEngine, extrayendo artefactos de configuración e identificando un archivo cifrado con XOR utilizado para la organización. Su análisis de HijackLoader catalogó 38 módulos, incluidos controles anti-VM, omisión de UAC, persistencia de tareas programadas y capacidades de shell inverso. El análisis de infraestructura vinculó la campaña a un único punto final público de C2, 78.40.193.126, y al dominio de entrega dodi-repacks.site, que se utilizó para sembrar las descargas iniciales del instalador.
Mitigación
Monitorear ejecuciones anómalas del lanzador Ren’Py, especialmente cuando se combinan con carga lateral de DLLs de nombres comunes como d3dx9_43.dll. Buscar creación sospechosa de directorios en %ProgramData% y %AppData%, particularmente rutas nombradas broker_crypt_v4_i386. Agregar detecciones de comportamiento para rutinas de evasión de sandbox, doppelgänging de procesos y patrones de acceso al registro inusuales asociados con verificaciones de artefactos de máquina virtual. Bloquear dominios conocidos de distribución de piratería en el gateway web y aplicar listas de permitidos de aplicaciones para restringir ejecutables lanzadores de juegos y “instaladores” no firmados de ejecutarse en ubicaciones con permisos de escritura para el usuario.
Respuesta
Al detectar, aislar el punto de acceso, preservar evidencia (volcados de memoria, archivos cifrados y artefactos de cargadores), y examinar el entorno en busca de los módulos identificados y archivos descartados. Bloquear inmediatamente 78.40.193.126 y dodi-repacks.site en los controles de perímetro. Realizar un análisis de exposición de credenciales enfocado en contraseñas de navegador, cookies de sesión y billeteras de criptomonedas, luego rotar cuentas y tokens afectados. Remover la persistencia atacante (particularmente tareas programadas) y purgar archivos maliciosos, luego continuar monitoreando rutas de reinfección relacionadas con instalaciones de software pirateado.
"graph TB %% Class definitions classDef action fill:#99ccff classDef file fill:#ffcc99 classDef process fill:#ff9966 classDef malware fill:#ff6666 classDef network fill:#ccccff %% Step 1 u2013 User Execution step1_user_exec["<b>Technique</b> – <b>T1204.002 User Execution: Malicious File</b><br/><b>Description</b>: User is tricked into executing a malicious file such as a cracked game installer.<br/><b>Artifact</b>: Instaler.exe"] class step1_user_exec action file_installer["<b>File</b> – Instaler.exe<br/>Appears legitimate but contains malicious payload"] class file_installer file step1_user_exec –>|executes| file_installer %% Step 2 u2013 Python Interpreter step2_python["<b>Technique</b> – <b>T1059.006 Command and Scripting Interpreter: Python</b><br/><b>Description</b>: Executes embedded malicious Python code from archive.rpa via the Ren'Py launcher."] class step2_python action file_archive["<b>File</b> – archive.rpa<br/>Contains malicious Python script"] class file_archive file file_installer –>|launches| step2_python step2_python –>|loads| file_archive %% Step 3 u2013 Obfuscated Payload step3_obfusc["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/><b>Description</b>: Payload is hidden using Base64 encoding, XOR encryption and compressed into an archive."] class step3_obfusc action file_obf_payload["<b>File</b> – obfuscated_payload.bin<br/>Compressed and encrypted payload"] class file_obf_payload file file_archive –>|contains| file_obf_payload file_obf_payload –>|decoded and decrypted by| step3_obfusc %% Step 4 u2013 Sandbox Evasion step4_sandbox["<b>Technique</b> – <b>T1497 Virtualization/Sandbox Evasion</b><br/><b>Subu2011technique</b> – <b>T1497.002 User Activity Based Checks</b><br/><b>Description</b>: Loader performs extensive VM and sandbox checks (RAM, CPU, registry) and aborts if analysis environment is detected."] class step4_sandbox action step3_obfusc –>|provides code to| step4_sandbox %% Step 5 u2013 Process Injection step5_injection["<b>Technique</b> – <b>T1055 Process Injection</b><br/><b>Subu2011technique</b> – <b>T1055.002 Portable Executable Injection</b><br/><b>Description</b>: HijackLoader injects malicious code into legitimate system DLL rasapi32.dll to execute shellcode."] class step5_injection action process_rasapi["<b>Process</b> – rasapi32.dll<br/>Target for PE injection"] class process_rasapi process step4_sandbox –>|loads| step5_injection step5_injection –>|injects into| process_rasapi %% Step 6 u2013 AppInit DLL Sideu2011Loading step6_appinit["<b>Technique</b> – <b>T1546.010 Event Triggered Execution: AppInit DLLs</b><br/><b>Description</b>: Malicious DLLs (d3dx9_43.dll, VSDebugScriptAgent170.dll) are sideu2011loaded via the trusted installer executable for persistence."] class step6_appinit action file_d3dx9["<b>File</b> – d3dx9_43.dll<br/>Malicious sideu2011loaded DLL"] class file_d3dx9 file file_vsddebug["<b>File</b> – VSDebugScriptAgent170.dll<br/>Malicious sideu2011loaded DLL"] class file_vsddebug file process_rasapi –>|triggers loading of| file_d3dx9 process_rasapi –>|triggers loading of| file_vsddebug file_d3dx9 –>|used by| step6_appinit file_vsddebug –>|used by| step6_appinit %% Step 7 u2013 UAC Bypass step7_uac["<b>Technique</b> – <b>T1548.002 Abuse Elevation Control Mechanism: Bypass User Account Control</b><br/><b>Description</b>: Loader attempts to bypass UAC to gain higher privileges."] class step7_uac action step6_appinit –>|attempts elevation via| step7_uac %% Step 8 u2013 Scheduled Task Persistence step8_task["<b>Technique</b> – <b>T1053 Scheduled Task/Job</b><br/><b>Description</b>: A scheduled task is created to maintain persistence and reu2011execute the payload."] class step8_task action step7_uac –>|creates| step8_task %% Step 9 u2013 Credential Harvesting step9_cred["<b>Techniques</b> – <b>T1555.003 Credentials from Password Stores: Credentials from Web Browsers</b> and <b>T1550.004 Use Alternate Authentication Material: Web Session Cookie</b><br/><b>Description</b>: Final ACR stealer harvests browser passwords, cookies, crypto wallets and other credential data."] class step9_cred action step8_task –>|executes| step9_cred %% Step 10 u2013 Exfiltration step10_exfil["<b>Technique</b> – <b>T1041 Exfiltration Over C2 Channel</b><br/><b>Description</b>: Collected data is sent to attacker C2 server at 78.40.193.126."] class step10_exfil action network_c2["<b>Network</b> – C2 Server 78.40.193.126"] class network_c2 network step9_cred –>|exfiltrates data to| network_c2 network_c2 –>|receives data from| step10_exfil "
Flujo de Ataque
Detecciones
RenPy o motor Python ejecutando binario desde directorio con permisos de escritura para el usuario (mediante cmdline)
Ver
PowerShell consultando NumberOfLogicalProcessors para detectar VM o Sandbox (mediante cmdline)
Ver
Posibles verificaciones de evasión (mediante powershell)
Ver
RenPy o Python realizando comandos de descubrimiento de VM o Sandbox
Ver
IOCs (DestinationIP) para detectar: RenEngine Loader y HijackLoader: Cadena de Ataque de Dos Etapas Impulsando Campañas de Stealer
Ver
IOCs (Emails) para detectar: RenEngine Loader y HijackLoader: Cadena de Ataque de Dos Etapas Impulsando Campañas de Stealer
Ver
IOCs (SourceIP) para detectar: RenEngine Loader y HijackLoader: Cadena de Ataque de Dos Etapas Impulsando Campañas de Stealer
Ver
IOCs (HashSha256) para detectar: RenEngine Loader y HijackLoader: Cadena de Ataque de Dos Etapas Impulsando Campañas de Stealer
Ver
Detección del uso de la API de HijackLoader para la carga de módulos maliciosos [Windows Sysmon]
Ver
Detección de Cadena de Ejecución Maliciosa Usando el Lanzador Ren’Py [Creación de Procesos de Windows]
Ver
Ejecución de Simulación
Prerrequisito: La verificación pre-vuelo de Telemetría y Línea Base debe haber pasado.
Racional: 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 apuntar a generar exactamente la telemetría esperada por la lógica de detección.
-
Narrativa de Ataque & Comandos:
Un atacante obtiene un instalador de juegos Ren’Py malicioso (Installer.exe) que ha sido reempaquetado para incluir una carga útil de Python oculta. Cuando la víctima ejecuta el instalador, se activa un cargador secundario (W8CPbGQI.exe). Ese cargador desempaca un binario de tercera etapa (ZoneInd.exe) que realiza inyección de procesos, volcado de credenciales y establece un canal C2 sobre HTTP. El atacante evita deliberadamente nombrar cualquier proceso secundariochime.exepara satisfacer la cláusula de exclusión de la regla.Pasos realizados en el host comprometido:
- Lanzar el instalador de Ren’Py comprometido.
Installer.exese ejecuta como el proceso principal. - Iniciar el primer cargador malicioso.
Installer.execreaW8CPbGQI.exe(Evento de Creación de Procesos – coincide conTargetImage). - Iniciar la carga útil de segunda etapa.
W8CPbGQI.exelanzaZoneInd.exe(otro evento de Creación de Procesos – también coincide conTargetImage). - Realizar acciones maliciosas (inyección de procesos, volcado de credenciales, C2).
Estas acciones generan exactamente la telemetría que la regla Sigma monitorea: un proceso con
Image=*Installer.execreando un hijo conTargetImage=*W8CPbGQI.exeor*ZoneInd.exe, sin la exclusión*chime.exe. - Lanzar el instalador de Ren’Py comprometido.
-
Script de Prueba de Regresión:
El script a continuación crea archivos ejecutables de ejemplo (simples scripts de PowerShell guardados como.exeviapowershell -c "..."para demostración) y luego organiza la cadena. Ejecútelo en un prompt de PowerShell elevado.# ------------------------------------------------- # Script de Prueba de Regresión – Simular Cadena Maliciosa # ------------------------------------------------- # 1. Crear binarios de marcador de posición (ejecutables simulados) $binPath = "$env:TEMPRenPyChain" New-Item -ItemType Directory -Path $binPath -Force | Out-Null # Ayudante para crear un exe ligero que simplemente espera (usar el shim .exe de PowerShell) function New-StubExe($name) { $script = "Start-Sleep -Seconds 30" $ps1 = "$binPath$name.ps1" $exe = "$binPath$name.exe" Set-Content -Path $ps1 -Value $script -Encoding UTF8 # Usar el PS2EXE integrado de PowerShell (o cualquier envoltorio exe) – aquí mimetizamos con PowerShell -File # Para simplicidad, solo creamos una tarea programada que ejecuta el ps1; la ruta del .exe es un marcador de posición. New-Item -ItemType File -Path $exe -Force | Out-Null } # Crear ejecutables simulados New-StubExe "Installer" New-StubExe "W8CPbGQI" New-StubExe "ZoneInd" # 2. Ejecutar la cadena Write-Host "`n[+] Lanzando Installer.exe (padre)..." Start-Process -FilePath "$binPathInstaller.exe" -NoNewWindow # Pequeña demora para asegurar que el proceso padre aparezca en los registros Start-Sleep -Seconds 2 Write-Host "[+] Installer.exe generando W8CPbGQI.exe..." Start-Process -FilePath "$binPathW8CPbGQI.exe" -NoNewWindow Start-Sleep -Seconds 1 Write-Host "[+] W8CPbGQI.exe generando ZoneInd.exe..." Start-Process -FilePath "$binPathZoneInd.exe" -NoNewWindow Write-Host "`n[+] Cadena ejecutada. Verifique la detección en su SIEM." # ------------------------------------------------- -
Comandos de Limpieza:
Eliminar los archivos temporales y terminar cualquier proceso de espera restante.# Limpiar los ejecutables simulados y directorio $binPath = "$env:TEMPRenPyChain" Write-Host "`n[+] Deteniendo cualquier proceso simulado restante..." Get-Process -Name "Installer","W8CPbGQI","ZoneInd" -ErrorAction SilentlyContinue | Stop-Process -Force Write-Host "[+] Eliminando archivos temporales..." Remove-Item -Path $binPath -Recurse -Force Write-Host "[+] Limpieza completa."