Alerta Sysadmins: Malware Lunex se Propaga vía Sitios Ucranianos Comprometidos
TL;DR — Lo que vas a tener al final
- Tiempo de setup: 30 minutos a 2 horas dependiendo de la complejidad del entorno.
- Requisitos: Acceso root, Linux moderno, conexión a internet para descargar dependencias.
- Resultado: Servicio funcional y estable, documentado paso a paso.
- Troubleshooting: Logs estándar en /var/log/, comandos de verificación al final de cada sección.
Por qué Lunex Stealer importa a tu homelab o servidor Linux
El 24 de septiembre de 2026, Ontinue publicó el primer análisis binario profundo de Lunex, una plataforma Malware-as-a-Service (MaaS) de origen ruso que se distribuye desde sitios web ucranianos comprometidos disfrazados de páginas CAPTCHA de Cloudflare. Lo que parecía un stealer más de Chromium resultó ser, en realidad, un agente C2 completo con persistencia por Chrome Native Messaging Host y exfiltración de carteras cripto.
Aunque el ataque inicial llega por Windows, los administradores de infraestructura Linux no pueden mirar para otro lado: el 45% del bloque de drivers de seguridad que Lunex intenta desactivar apunta a productos populares en servidores y endpoints de la región CIS (Kaspersky y Dr.Web), y la fase de robo de credenciales se ejecuta sobre navegadores que también se usan dentro de sesiones RDP, escritorios remotos y túneles SSH desde workstations Windows.
Además, la infraestructura C2 (panel de operadores en 193.178.159.128 sobre UFO Technologies en Roubaix, Francia, y entrega desde 107.175.82.242 en Seattle) ya está confirmada operativa contra usuarios ucranianos y como infraestructura de phishing para marcas occidentales. BlueTeamCoolTeam había mapeado seis paneles en junio; Ontinue encontró 28 paneles en 13 países.
La cadena de ataque en cuatro etapas
Ontinue recuperó cuatro binarios del ataque, extraídos junto a la infraestructura de cebo en uasputnik[.]com. Los SHA-256 están disponibles en el repositorio IOC de Ontinue. La cadena avanza así:
| Etapa | Binario | Tamaño | Función |
|---|---|---|---|
| 1 | elita.msi |
1.1 MB | Instalador MSI silencioso, sin UAC, propiedades LIMITUI=1 + Custom Action auto-launch |
| 2 | psychedelic.exe (config.exe) |
2.3 MB | Loader MinGW-w64, strings AES-256-CTR, escalada a kernel vía COM Elevation Moniker |
| 3 | PDFWKRNL.sys |
80 KB | Driver BYOVD firmado por AMD, exploit de CVE-2023-20598 para zero-out de callbacks |
| 4 | psychedeliclove.exe |
275 KB | LunexStealer + agente C2, robo de 7 navegadores y 9 wallets, persistencia NMH |
Lo notable es que el MSI no contiene código malicioso en sí: toda la persistencia y la carga útil se delegan al binario instalado. Esto facilita que los antivirus lo clasifiquen como instalador benigno mientras el payload real nunca toca el MSI.
Etapa 1: MSI con ingeniería social firmada como “Vertification”
El paquete elita.msi usa el nombre producto “Vertification” (con la errata intencional, igual a la palabra en el cebo ucraniano) y fabricante “Internal Software”, algo que baja sospechas en entornos corporativos. Dos propiedades clave lo hacen invisible al usuario:
# Propiedades MSI clave en el archivo elita.msi
LIMITUI=1 # Suprime el wizard de instalación
ARPNOMODIFY=1 # Oculta el botón Modify en Add/Remove Programs
ARPNOREPAIR=1 # Oculta el botón Repair
# Ruta de instalación per-user, sin UAC
%LOCALAPPDATA%ProgramsInternal SoftwareVertification
La persistencia se logra con un Custom Action tipo 226 en la secuencia 6700 (justo después de InstallFinalize en 6600). Esto significa que la acción solo dispara en instalación limpia, no en repair ni uninstall. El flag “continue on error” hace que el MSI reporte éxito incluso si el binario falla. La tabla Upgrade permite reemplazar versiones anteriores con solo distribuir un MSI nuevo del mismo UpgradeCode {2F40B8FA-6CB2-4328-B2A3-4B15A124F441}.
Etapa 2: Loader con AES, PEB masquerade y elevación sin UAC
El loader (renombrado config.exe en disco, entregado como psychedelic.exe) está compilado con MinGW-w64. Tiene dos TLS callbacks que corren antes del entry point — indicador claro de malware. Su información de versión suplanta a “Canonical Ltd. Update Manager” (un producto que no existe en Windows), y el timestamp de compilación está falsificado al año 2054.
Todas las 126 strings operativas están cifradas con AES-256-CTR. La clave de 32 bytes y el IV de 16 bytes viven en la sección .rdata. Funciones decodificadoras resuelven los nombres de API, rutas, WMI queries, URLs C2 y nombres de drivers en tiempo de ejecución, así que strings sobre el binario solo revela la tabla de imports y la cadena payload.exe.
Hay además un dead-code anchor gateado por GetTickCount() == 0x9E3779B9 (la constante del cifrado TEA/XTEA derivada del número áureo). Esta condición es matemáticamente imposible bajo ejecución normal. Dentro, llama a 55 APIs importadas con parámetros NULL — pura decoración para inflar la IAT con entradas señuelo de SHELL32, WINHTTP, WS2_32 y CRYPT32.
La escalada de privilegios hace cuatro cosas en orden:
# 1. PEB masquerade — sobreescribe ImagePathName/CommandLine/InMemoryOrderModuleList
# con ruta que sale de GetWindowsDirectoryA (apariencia de binario legítimo)
# 2. CoGetObject con COM Elevation Moniker (CMSTPLUA CLSID auto-elevate)
# Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}
# 3. OpenProcessToken + LookupPrivilegeValueA(SeLoadDriverPrivilege) +
# AdjustTokenPrivileges — habilita cargar drivers de kernel
# 4. OpenSCManagerA + CreateServiceA + StartServiceA — instala y arranca PDFWKRNL.sys
El paso 2 es la pieza interesante: la CLSID {3E5FC7F9-9A51-4367-9063-A120244FBEC7} pertenece al objeto COM CMSTPLUA de Microsoft Connection Manager, marcado como auto-elevate en el registro. Cualquier binario que parezca “de confianza” puede instanciarlo sin disparar el prompt UAC. El PEB masquerade del paso 1 es prerrequisito para que el chequeo de “trusted binary” pase.
Etapa 3: BYOVD con el driver AMD PDFWKRNL.sys (CVE-2023-20598)
El driver vulnerable es PDFWKRNL.sys, el USB-C Power Delivery Firmware Update Utility Driver de AMD. Está firmado legítimamente por AMD → Sectigo → USERTrust → Microsoft Code Verification Root. Lo crítico: el binario fue modificado después de firmarse, así que el Authentihash calculado sobre la imagen PE no coincide con el digest embebido en la firma, pero Windows lo carga igual porque la cadena de certificados valida y el timestamp está dentro del período de validez del certificado.
El driver registra el dispositivo .PdFwKrnl y maneja IRP_MJ_DEVICE_CONTROL con un switch sobre 12 IOCTLs. No hay ningún control de acceso en ninguna ruta: cualquier proceso de usuario con handle al dispositivo tiene acceso completo.
| IOCTL | Operación | Uso en la cadena |
|---|---|---|
0x80002028 |
Lectura de memoria kernel | Copia entradas de las tablas de callback al buffer user-mode |
0x80002014 |
Escritura de memoria kernel | Copia ceros en entradas de callback de productos de seguridad |
El loader usa la lectura IOCTL para extraer los callbacks activos, llama a K32GetDeviceDriverBaseNameA para identificar a qué módulo pertenece cada uno, y compara contra una lista negra de 20 drivers de seguridad: Microsoft Defender (WdFilter.sys, MsSecFlt.sys), seis de Kaspersky, tres de Dr.Web, tres de ESET, Elastic, Sysinternals Sysmon, CrowdStrike (dos), SentinelOne, y fltMgr.sys (el Windows Filter Manager). Cuando una entrada coincide, la sobreescribe con ceros vía la IOCTL de escritura. El EDR queda “vivo pero ciego”: sigue corriendo, pero no recibe eventos.
Antes de instalar el driver, el loader hace algo muy astuto: descarga los símbolos de PDB del kernel desde el Microsoft Symbol Server para resolver offsets exactos en la build específica de Windows de la víctima:
# User-Agent disfrazado de Windows Symbol Resolver
curl.exe
-A "Microsoft-Symbol-Server/10.1700.661.0"
"https://mssymbols.blob.core.windows.net/symbols/ntkrnlmp.pdb/<GUID>/ntkrnlmp.pdb"
-o ntkrnlmp.pdb
# Después usa dbghelp.dll para resolver:
# PspCreateProcessNotifyRoutine
# PspCreateThreadNotifyRoutine
# PspLoadImageNotifyRoutine
# ActiveProcessLinks, Token, Protection, SignatureLevel, CallbackListHead
Los offsets resueltos se guardan en siete variables globales. Esto hace que la cadena funcione en cualquier build de Windows 10 u 11 sin recompilar.
Etapa 4: Stealer + agente C2 con persistencia nativa de Chrome
Con los callbacks de EDR en cero, el loader descarga el payload final de http://107.175[.]82[.]242:9000/wilow/psychedeliclove.exe. Es un binario MinGW-w64 de 281 KB, compilado el 12 de septiembre de 2026, con 11 secciones PE y 169 imports. Habla con el panel Lunex en 193.178.159[.]128 sobre HTTP sin TLS (API puerto 8080, panel puerto 8000).
Ataca siete navegadores Chromium: Chrome, Edge, Brave, Yandex Browser, Opera, Opera GX y Vivaldi. Mata cada proceso con taskkill /F /IM <exe> /T para liberar los locks de SQLite, copia Login Data, Web Data y Cookies a un archivo temporal wd_tmp.db, y los descifra con la master key extraída del Local State JSON. Para Chrome 127+ (App-Bound Encryption, julio 2024) hace inyección COM vía el servicio IElevator del propio Chrome para recuperar la app_bound_encrypted_key. Para el formato más nuevo usa ChaCha20-Poly1305.
El robo de carteras cripto apunta a cinco wallets de escritorio (Bitcoin Core, Litecoin, Exodus, Atomic, Electrum) y cuatro extensiones (MetaMask, MetaMask Legacy, OKX Wallet, SafePal). Lo empaca en wallet.zip con PK headers crudos (sin librería zip) y lo exfiltra vía POST multipart a /api/v1/ext/wallets.
La persistencia es la parte más interesante operacionalmente. Tres canales simultáneos:
# Canal 1: Run key de registro
HKCUSoftwareMicrosoftWindowsCurrentVersionRunUserStarts
# Canal 2: Scheduled task oculta
psychedelicloveUtils (dispara en logon de usuario)
# Canal 3: Native Messaging Host de Chrome — el más persistente
HKCUSoftwareGoogleChromeNativeMessagingHostscom.lunex.explorer
HKCUSoftwareMicrosoftEdgeNativeMessagingHostscom.lunex.explorer
# El NMH es un script PowerShell de 13,200 bytes embebido en .rdata
# que implementa 6 acciones sobre el sistema de archivos:
# list_drives list_dir read_file write download run
El Native Messaging Host corre dentro del proceso de Chrome. Sobrevive al borrado del binario del stealer, a reinicios del sistema y al cierre del navegador. Si quitás solo el ejecutable y no auditas las claves NMH, el atacante conserva acceso completo de lectura/escritura al filesystem a través del navegador. Mutex Localpsychedeliclove-guard evita múltiples instancias.
Además, el stealer manipula Secure Preferences de Chrome para inyectar una extensión maliciosa con permisos para cookies, history, bookmarks, tabs, storage, proxy, scripting, declarativeNetRequest y todas las URLs HTTP/HTTPS. Para esto evade el HMAC de Secure Preferences extrayendo el seed, recomputando el árbol MAC recursivamente y eliminando los hashes de integridad — la misma técnica que Volexity documentó en SUPERSTOMP de APT31 el 9 de septiembre, pero que según Ontinue ya proliferó a cuatro operaciones independientes durante septiembre, así que no es un indicador confiable de actor estatal.
Lo que puedes hacer en tu entorno
Para administradores de endpoints Windows y servidores con sesiones RDP desde workstations, el orden de operaciones razonable es:
# 0. Habilitar Microsoft Vulnerable Driver Blocklist si no está activo
# (Windows 11 22H2+ lo trae, pero requiere HVCI o Smart App Control)
# Verificar:
reg query "HKLMSYSTEMCurrentControlSetControlCIConfig" /v VulnerableDriverBlocklistEnable
# Valor esperado: 1
Después, para detección y contención:
# 1. Bloquear la IOC principal del driver BYOVD vía WDAC/HVCI rule
# Hash SHA-256 del PDFWKRNL.sys malicioso:
# 6e8b49cf70bf854e8c59c7d27cefa89406caf8978461190dabb86dafcd8554e1
# 2. Auditar Native Messaging Hosts registrados (es la IOC más persistente)
reg query "HKCUSoftwareGoogleChromeNativeMessagingHosts" /s
reg query "HKCUSoftwareMicrosoftEdgeNativeMessagingHosts" /s
# Cualquier clave con nombre "com.lunex.explorer" es compromiso confirmado
# 3. Auditar scheduled tasks sospechosas
schtasks /query /fo TABLE /v | findstr /i "psychedelicloveUtils"
# 4. Buscar Run keys anómalas
reg query "HKCUSoftwareMicrosoftWindowsCurrentVersionRun"
# 5. Si usas Sysmon, asegurar captura de:
# - curl.exe desde proceso no-devel hacia mssymbols.blob.core.windows.net
# - service creation para driver .sys desde path no estándar
# - drop de .sys a %TEMP% o %LOCALAPPDATA%
El consejo más importante es el que dio John Bambenek en Security Magazine: “detection must focus on the stages before EDR blindness occurs”. Una vez que el driver BYOVD zeró los callbacks, tu EDR no ve nada. Las señales tempranas son las descargas de PDB desde procesos que no son devenv.exe o windbg.exe, drops de drivers a paths temporales, y creación de servicios para drivers no firmados desde rutas no estándar.
Veredicto: ¿vale la pena alertar?
Sí, y por dos razones que afectan directamente a audiencia hispanohablante. La primera es operativa: aunque el ataque inicial apunta a ucranianos, la infraestructura C2 ya sirve phishing a marcas occidentales (Sam’s Club, Teamwork, Namshi, WhatsApp Business) desde paneles turcos, y los clientes globales con employees remotos en LATAM terminan dentro del alcance. La segunda es defensiva: la técnica de zeroing de callbacks por IOCTL sin matar procesos es más silenciosa que los EDR killers ruidosos típicos, y los productos comerciales de varios vendors de la lista negra 20 son populares en PYMES de la región.
Si administras endpoints Windows, conviene agregar las IOCs de Ontinue a tu plataforma de threat intel y revisar las reglas de HVCI/WDAC para PDFWKRNL.sys modificado — recuerda que el hash solo no alcanza porque el driver está firmado legítimamente. Y si ves cualquier clave com.lunex.explorer en NativeMessagingHosts de Chrome o Edge, asume compromiso completo de esa cuenta y rota credenciales desde otro host limpio.
Preguntas frecuentes
¿Por qué Alerta Sysadmins: Malware Lunex se Propaga vía Sitios Ucranianos Comprometidos es relevante para sysadmins Linux?
Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.
¿Qué necesito para empezar con Alerta Sysadmins: Malware Lunex se?
Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.
¿Cuáles son los errores más comunes con Alerta Sysadmins: Malware Lunex se?
Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.
¿Cuándo usar Alerta Sysadmins: Malware Lunex se y cuándo una alternativa?
Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.
¿Cómo migro desde una configuración previa a Alerta Sysadmins: Malware Lunex se?
Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.
Lee también
- Protege tu SSH: Guía esencial para configurar Fail2ban en Linux
- Guía Definitiva: Configura AppArmor para Proteger tus Aplicaciones en Linux
- GPG para Sysadmins: Guía Definitiva para Cifrar Archivos en Linux
- Protege tu SSH: Configura 2FA con Google Authenticator, Guía Definitiva para Sysadmins
- Configuración de AppArmor para endurecer aplicaciones en Linux
