Desentrañando OysterLoader: Dentro de un Cargador de Evasión en Múltiples Etapas
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumen
OysterLoader es un cargador de etapas múltiples en C++ utilizado para desplegar ransomware y malware común como Vidar. Se propaga a través de sitios comprometidos que imitan instaladores de software legítimos y se entrega como un Instalador de Microsoft (MSI). Para complicar el análisis, utiliza inundación de llamadas API, resolución de API dinámica personalizada, comprobaciones anti-depuración y una rutina de descompresión personalizada LZMA. El cargador se comunica con una infraestructura C2 HTTPS jerarquizada usando encabezados HTTP ofuscados y una codificación propia similar a Base64.
Investigación
El informe describe cuatro etapas: un ofuscador empaquetado (TextShell), una capa de shellcode que infla el contenido con LZMA, un descargador que realiza chequeos de entorno y crea un mutex, y una etapa final que suelta un DLL e instala una tarea programada. El tráfico C2 depende de IPs/dominios codificados, user-agents personalizados y entrega de cargas útiles esteganográficas a través de iconos PNG. La persistencia se mantiene mediante una tarea programada configurada para ejecutarse cada 13 minutos.
Mitigación
Bloquee los instaladores MSI no firmados de fuentes no confiables y monitoree la creación de patrones de mutex conocidos. Alerta sobre patrones de nombres de tareas programadas y el uso de rundll32.exe para cargar DLLs desde %APPDATA%. Donde sea posible, aplique inspección de TLS para identificar los encabezados HTTP personalizados y user-agents utilizados por el cargador.
Respuesta
Si se detecta, aisle el host, termine la tarea programada y elimine el archivo COPYING3.dll soltado. Busque cargas útiles adicionales, enumere procesos que coincidan con los valores de mutex, bloquee los dominios/IPs C2 listados y actualice las detecciones para el comportamiento de inundación de API y la codificación Base64 personalizada.
«graph TB %% Definiciones de clases classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Nodos initial_access[«<b>Acceso Inicial</b> – <b>T1218.007 Ejecución de Proxy de Binario del Sistema: Msiexec</b><br />MSI malicioso firmado entregado a través de un sitio web comprometido.»] class initial_access action process_msiexec[«<b>Proceso</b> – msiexec.exe<br />Ejecuta MSI malicioso»] class process_msiexec process stage1[«<b>Etapa 1</b> – Empaquetador/Obfuscador<br /><b>Técnicas</b>: T1027 Archivos o Información Ofuscados, T1027.007 Resolución de API Dinámica, T1614.001 Descubrimiento de Lenguaje del Sistema, T1480.002 Exclusión Mutua de Guardias de Ejecución, T1497.002 Evasión de Virtualización/Sandbox: Comprobaciones Basadas en Actividad del Usuario»] class stage1 malware stage2[«<b>Etapa 2</b> – Shellcode<br /><b>Técnicas</b>: T1140 Desofuscar/Decodificar Archivos (RC4), Descompresión LZMA»] class stage2 malware stage3[«<b>Etapa 3</b> – Descargador & C2<br /><b>Técnicas</b>: T1102 Servicio Web, T1001.003 Impersonación de Protocolo o Servicio, T1001.002 Esteganografía, T1102.001 Resolutor de Gota Muerta»] class stage3 malware c2_server[«<b>C2</b> – Servidor HTTPS<br />Encabezados personalizados y Useru2011Agente falso»] class c2_server c2 dll_payload[«<b>Malware</b> – DLL Soltado<br />Almacenado en %APPDATA%»] class dll_payload malware process_rundll32[«<b>Proceso</b> – rundll32.exe<br />Ejecuta DLL a través de DllRegisterServer»] class process_rundll32 process task_schtasks[«<b>Persistencia</b> – Tarea Programada<br />Ejecuta rundll32 con el DLL soltado»] class task_schtasks persistence stage4[«<b>Etapa 4</b> – Persistencia & Ejecución<br /><b>Técnicas</b>: T1546.009 Ejecución Disparada por Evento: AppCert DLLs, T1027.003 Esteganografía, T1102.002 Comunicación Bidireccional»] class stage4 malware %% Conexiones initial_access u002du002d>|ejecuta| process_msiexec process_msiexec u002du002d>|entrega| stage1 stage1 u002du002d>|genera| stage2 stage2 u002du002d>|descarga| stage3 stage3 u002du002d>|se comunica con| c2_server c2_server u002du002d>|proporciona carga a| stage3 stage3 u002du002d>|escribe DLL a| dll_payload dll_payload u002du002d>|usado por| process_rundll32 process_rundll32 u002du002d>|disparado por| task_schtasks task_schtasks u002du002d>|programado desde| stage4 «
Flujo de Ataque
Detecciones
Schtasks apunta a Directorio / Binario / Script sospechoso (via línea de comandos)
Ver
Ejecución de Ruta Suspiciosa de Rundll32 Dll (vía creación de proceso)
Ver
IOCs (IP de origen) para detectar: OysterLoader Desenmascarado: El Cargador de Evasión de Múltiples Etapas
Ver
IOCs (IP de destino) para detectar: OysterLoader Desenmascarado: El Cargador de Evasión de Múltiples Etapas
Ver
Detección de Comunicación C2 de OysterLoader [Conexión de Red de Windows]
Ver
Detección de Técnicas de Anti-Análisis y Ejecución de OysterLoader [Creación de Procesos de Windows]
Ver
Ejecución de Simulación
Prerrequisito: El Chequeo de Telemetría y Línea Base debe haber sido aprobado.
Justificación: Esta sección detalla la ejecución precisa de la técnica 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 la telemetría exacta esperada por la lógica de detección. Ejemplos abstractos o no relacionados llevarán a un diagnóstico erróneo.
-
Narrativa del Ataque y Comandos:
El adversario, habiendo ganado acceso inicial en el punto final, despliega la carga útil OysterLoader.- Registro de DLL vía Rundll32 – El cargador copia un DLL malicioso (
COPYING3.dll) en el directorio temporal y lo registra usandorundll32.execon elDllRegisterServerpunto de entrada, produciendo una línea de comandos que coincide conselección1. - Chequeo Anti‑Debug – Para evadir análisis, la carga utiliza
ntdll.dlly llama aIsDebuggerPresent. Esto genera un registro de proceso dondeImagencontienentdll.dlly la línea de comandos incluyeIsDebuggerPresent, satisfaciendoselección2. - Asignación de Memoria – Para ejecución en memoria, el cargador invoca
NtAllocateVirtualMemoryviantdll.dll. El evento de creación de proceso resultante contieneNtAllocateVirtualMemoryen la línea de comandos, satisfaciendoselección3.
- Registro de DLL vía Rundll32 – El cargador copia un DLL malicioso (
-
Script de Prueba de Regresión:
# Script de validación de detección de OysterLoader – PowerShell # ---------------------------------------------------- # 1. Crear un DLL malicioso ficticio (archivo vacío para simulación) $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. Activar selección1 – rundll32 con DllRegisterServer Write-Host "Ejecutando selección1 (registro de DLL de rundll32)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. Activar selección2 – ntdll con IsDebuggerPresent Write-Host "Ejecutando selección2 (IsDebuggerPresent)..." $scriptBlock = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern bool IsDebuggerPresent(); "@ -Namespace WinAPI -Name NativeMethods [WinAPI.NativeMethods]::IsDebuggerPresent() | Out-Null } Start-Job -ScriptBlock $scriptBlock | Wait-Job | Receive-Job # 4. Activar selección3 – ntdll con NtAllocateVirtualMemory Write-Host "Ejecutando selección3 (NtAllocateVirtualMemory)..." $scriptBlock2 = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern int NtAllocateVirtualMemory( IntPtr HandleProceso, ref IntPtr DirecciónBase, IntPtr ZeroBits, ref UIntPtr TamañoRegión, uint TipoAsignación, uint Proteger); "@ -Namespace WinAPI -Name NativeMethods $process = [System.Diagnostics.Process]::GetCurrentProcess() $handle = $process.Handle $base = [IntPtr]::Zero $size = [UIntPtr]::Zero [WinAPI.NativeMethods]::NtAllocateVirtualMemory($handle, [ref]$base, [IntPtr]::Zero, [ref]$size, 0x1000, 0x04) | Out-Null } Start-Job -ScriptBlock $scriptBlock2 | Wait-Job | Receive-Job # Limpieza Remove-Item -Path $dllPath -Force Write-Host "Simulación completada." -
Comandos de Limpieza:
# Asegúrese de que cualquier proceso rundll32 o trabajo persistente se termine Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # Eliminar el DLL temporal si aún está presente $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }