SOC Prime Bias: Medio

26 Mar 2026 16:14

RegPhantom Backdoor: Análisis de Amenazas e Información de Detección

Author Photo
Ruslan Mikhalov Jefe de Investigación de Amenazas en SOC Prime linkedin icon Seguir
RegPhantom Backdoor: Análisis de Amenazas e Información de Detección
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumen

RegPhantom es un rootkit del núcleo de Windows enfocado en el sigilo que permite a los procesos de modo usuario de bajo privilegio ejecutar código arbitrario en el espacio del núcleo a través de un canal de comando oculto basado en el registro. El controlador está firmado con certificados válidos, se basa en la carga reflexiva de PE y elimina los artefactos de ejecución una vez que se completa su tarea. Su arquitectura está diseñada para evadir los controles de imposición de firmas de controladores mientras evita archivos persistentes o entradas en el registro. Por lo tanto, la detección efectiva depende de identificar el binario del controlador en sí y los patrones de código distintivos que contiene.

Investigación

La investigación revisó varios .sys muestras firmadas y no firmadas recopiladas entre junio y agosto de 2025, exponiendo una base de código CFG compartida ofuscada y un mecanismo de intercepción de registro basado en CmRegisterCallback. El controlador descifra una carga útil protegida por XOR de 56 bytes, la mapea reflexivamente en la memoria del núcleo, la ejecuta y luego borra la evidencia. La cronología de las muestras y el uso de certificados apuntan a una actividad de desarrollo continua asociada con un actor de amenazas vinculado a China.

Mitigación

Los equipos de seguridad deben bloquear los controladores de núcleo no confiables, estar atentos al uso sospechoso de CmRegisterCallback and PsSetCreateThreadNotifyRoutine, y aplicar una validación de integridad en el momento de lanzamiento para los archivos del controlador. Se deben desplegar reglas YARA para coincidir con las secuencias de bytes únicas del controlador, mientras que la imposición estricta de firmas de código debe mantenerse. Monitorizar fallos inusuales en las escrituras del registro, especialmente eventos repetidos de acceso denegado, también puede exponer el canal de comunicación encubierto.

Respuesta

Si se descubre RegPhantom, aísle el punto final afectado, elimine el controlador malicioso y capture un volcado completo de memoria del núcleo para una revisión forense más profunda. Revoque cualquier certificado de firma abusado y actualice los almacenes de certificados de confianza según sea necesario. La búsqueda de amenazas debe enfocarse luego en el comportamiento de intercepción del registro del controlador en todo el entorno, seguido de la remediación de todos los sistemas Windows potencialmente expuestos.

"gráfico TB %% Sección de Definiciones de Clases classDef technique fill:#ffcc99 classDef action fill:#99ccff classDef operator fill:#ff9900 classDef builtin fill:#cccccc %% Definiciones de nodos step_persistence["<b>Paso</b> – Persistencia a través de un controlador malicioso firmado cargado en el arranque usando un certificado de firma de código válido."] class step_persistence action tech_boot_autostart["<b>Técnica</b> – <b>T1547.009 Controladores y Módulos del Núcleo</b><br/>Cargar controlador malicioso al inicio del sistema para lograr persistencia y obtener privilegio de modo núcleo."] class tech_boot_autostart technique tech_code_signing["<b>Técnica</b> – <b>T1553.002 Subvertir Controles de Confianza: Firma de Código</b><br/>Aprovechar un certificado de firma de código legítimo para eludir la imposición de firmas de controladores."] class tech_code_signing technique tech_priv_esc["<b>Técnica</b> – <b>T1068 Explotación para Escalamiento de Privilegios</b><br/>El controlador del núcleo otorga privilegios de nivel de sistema al código del atacante.""" class tech_priv_esc technique step_hook_registration["<b>Paso</b> – El controlador registra callbacks del sistema para ocultar su presencia e interceptar operaciones."] class step_hook_registration action tech_rootkit["<b>Técnica</b> – <b>T1014 Rootkit</b><br/>Instalar componentes rootkit del modo núcleo y enganchar callbacks para ocultar actividad maliciosa."] class tech_rootkit technique step_registry_channel["<b>Paso</b> – Canal de comandos encubierto usando escrituras en el registro interceptadas y descifradas por el controlador."] class step_registry_channel action tech_query_registry["<b>Técnica</b> – <b>T1012 Consultar el Registro</b><br/>Leer valores del registro para recibir comandos o datos de configuración.""" class tech_query_registry technique tech_deobfuscate["<b>Técnica</b> – <b>T1140 Desofuscar/Descodificar Archivos o Información</b><br/>Descifrar carga útil encriptada con XOR recuperada del registro.""" class tech_deobfuscate technique step_reflective_load["<b>Paso</b> – Cargar carga útil PE de forma refleja en la memoria del núcleo usando un cargador personalizado."] class step_reflective_load action tech_reflective_loading["<b>Técnica</b> – <b>T1620 Carga de Código Reflectiva</b><br/>Cargar y ejecutar código directamente desde la memoria sin tocar el disco. """ class tech_reflective_loading technique step_memory_wipe["<b>Paso</b> – Limpiar memoria asignada y eliminar artefactos temporales después de la ejecución."] class step_memory_wipe action tech_clear_persistence["<b>Técnica</b> – <b>T1070.009 Limpiar Persistencia</b><br/>Eliminar rastros de módulos cargados y artefactos de persistencia relacionados.""" class tech_clear_persistence technique step_hook_hijack["<b>Paso</b> – La carga útil secuestra los punteros de enganche del controlador para mantener la persistencia y ocultar aún más la actividad."] class step_hook_hijack action %% Conexiones mostrando el flujo step_persistence –>|utiliza| tech_boot_autostart step_persistence –>|subvierte| tech_code_signing step_persistence –>|habilita| tech_priv_esc step_persistence –>|conduce_a| step_hook_registration step_hook_registration –>|implementa| tech_rootkit step_hook_registration –>|conduce_a| step_registry_channel step_registry_channel –>|accede_a| tech_query_registry step_registry_channel –>|realiza| tech_deobfuscate step_registry_channel –>|conduce_a| step_reflective_load step_reflective_load –>|ejecuta| tech_reflective_loading step_reflective_load –>|conduce_a| step_memory_wipe step_memory_wipe –>|limpia| tech_clear_persistence step_memory_wipe –>|conduce_a| step_hook_hijack step_hook_hijack –>|mantiene| tech_rootkit "

Flujo de Ataque

Ejecución de Simulación

Prerrequisito: La Verificación Previa de Telemetría y Línea Base debe haber pasado.

Justificación: 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 la telemetría exacta esperada por la lógica de detección.

  • Narrativa de Ataque y Comandos

    1. Objetivo: Emular el intento de RegPhantom de registrar un callback de registro de modo núcleo que interceptará operaciones de registro relacionadas con credenciales.
    2. Método: Cargar un controlador mínimo, deliberadamente defectuoso que llama CmRegisterCallback con una rutina de callback apuntando a RegNtPreSetValueKey. El controlador pasa intencionalmente una estructura de registro malformada que resulta en STATUS_ACCESS_DENIED.
    3. Resultado: Sysmon registra EventID 13 con ObjetoDestino conteniendo ambos CmRegisterCallback and RegNtPreSetValueKey, Detalles informando Tamaño de datos exactamente 56 bytes (0x38), y Estado establecido en STATUS_ACCESS_DENIED.
  • Guion de Prueba de Regresión (PowerShell + fuente del controlador C embebida – compilar en el host objetivo)

    # --------------------------------------------------------------
    # Paso 1: Escribir la fuente del controlador mínimo en el disco
    # --------------------------------------------------------------
    $driverSource = @"
    #include <ntddk.h>
    
    // Callback dummy – nunca llamado
    NTSTATUS DummyCallback(
        _In_ PVOID CallbackContext,
        _In_ PVOID Argument1,
        _In_ PVOID Argument2
    )
    {
        UNREFERENCED_PARAMETER(CallbackContext);
        UNREFERENCED_PARAMETER(Argument1);
        UNREFERENCED_PARAMETER(Argument2);
        return STATUS_SUCCESS;
    }
    
    extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
    {
        UNREFERENCED_PARAMETER(DriverObject);
        UNREFERENCED_PARAMETER(RegistryPath);
    
        // Uso intencional de un tamaño incorrecto (56 bytes) y solicitar un registro de callback
        // que será rechazado con STATUS_ACCESS_DENIED.
        UNICODE_STRING altitude = RTL_CONSTANT_STRING(L"1234.5678.90ab");
        LARGE_INTEGER cookie = {0};
    
        // Forzar un fallo pasando un puntero de callback nulo (simula una solicitud malformada)
        NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie);
    
        // Sobrescribir el estado para imitar la condición exacta que ve RegPhantom
        status = STATUS_ACCESS_DENIED; // 0xC0000022
    
        // Mantener el controlador cargado por un breve período para permitir que Sysmon capture el evento
        LARGE_INTEGER interval;
        interval.QuadPart = -10 * 1000000; // 1 segundo
        KeDelayExecutionThread(KernelMode, FALSE, &interval);
    
        // Desregistrar antes de descargar
        CmUnregisterCallback(cookie);
    
        return STATUS_SUCCESS;
    }
    "@
    $srcPath = "$env:TEMPRegPhantomStub.c"
    $srcPath | Set-Content -Value $driverSource -Encoding ASCII
    
    # --------------------------------------------------------------
    # Paso 2: Compilar el controlador (requiere Visual Studio Build Tools)
    # --------------------------------------------------------------
    Write-Host "Compilando controlador – requiere Windows Driver Kit (WDK) y VS Build Tools."
    $compileCmd = "cl /nologo /W3 /WX- /O2 /DUNICODE /D_UNICODE /Zi /MD /LD $srcPath /link /OUT:`"$env:TEMPRegPhantomStub.sys`""
    & cmd /c $compileCmd
    
    # --------------------------------------------------------------
    # Paso 3: Cargar el controlador (debe ejecutarse como Administrador)
    # --------------------------------------------------------------
    Write-Host "Cargando controlador para desencadenar el intento de registro..."
    $driverPath = "$env:TEMPRegPhantomStub.sys"
    sc create RegPhantomStub binPath= $driverPath type= kernel start= demand
    sc start RegPhantomStub
    
    # --------------------------------------------------------------
    # Paso 4: Dar tiempo a Sysmon para que ingiera el evento
    # --------------------------------------------------------------
    Start-Sleep -Seconds 5
    
    # --------------------------------------------------------------
    # Paso 5: Descargar y eliminar el controlador
    # --------------------------------------------------------------
    sc stop RegPhantomStub
    sc delete RegPhantomStub
    Remove-Item -Path $driverPath -Force
    Remove-Item -Path $srcPath -Force
    
    Write-Host "Simulación completa. Verifique la detección en su SIEM."
  • Comandos de Limpieza (si el controlador no pudo ser compilado o cargado)

    # Asegúrese de que cualquier servicio de controlador parcialmente creado sea eliminado
    if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) {
        sc stop RegPhantomStub
        sc delete RegPhantomStub
    }
    # Eliminar archivos residuales
    Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue