macOS Electron Applications Injection
Last updated
Last updated
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)
Si no sabes qué es Electron, puedes encontrar mucha información aquí. Pero por ahora solo debes saber que Electron ejecuta node. Y node tiene algunos parámetros y variables de entorno que se pueden usar para hacer que ejecute otro código aparte del archivo indicado.
Estas técnicas se discutirán a continuación, pero en tiempos recientes Electron ha añadido varios indicadores de seguridad para prevenirlos. Estos son los Fusibles de Electron y estos son los que se utilizan para prevenir que las aplicaciones de Electron en macOS carguen código arbitrario:
RunAsNode
: Si está deshabilitado, evita el uso de la variable de entorno ELECTRON_RUN_AS_NODE
para inyectar código.
EnableNodeCliInspectArguments
: Si está deshabilitado, los parámetros como --inspect
, --inspect-brk
no serán respetados. Evitando de esta manera inyectar código.
EnableEmbeddedAsarIntegrityValidation
: Si está habilitado, el archivo asar
cargado será validado por macOS. Previniendo de esta manera la inyección de código al modificar el contenido de este archivo.
OnlyLoadAppFromAsar
: Si está habilitado, en lugar de buscar para cargar en el siguiente orden: app.asar
, app
y finalmente default_app.asar
. Solo verificará y usará app.asar, asegurando así que cuando se combine con el fusible embeddedAsarIntegrityValidation
sea imposible cargar código no validado.
LoadBrowserProcessSpecificV8Snapshot
: Si está habilitado, el proceso del navegador utiliza el archivo llamado browser_v8_context_snapshot.bin
para su instantánea de V8.
Otro fusible interesante que no prevendrá la inyección de código es:
EnableCookieEncryption: Si está habilitado, el almacenamiento de cookies en disco se cifra utilizando claves de criptografía a nivel de sistema operativo.
Puedes verificar estas banderas desde una aplicación con:
Como se menciona en la documentación, la configuración de los Fusibles de Electron se encuentra dentro del binario de Electron que contiene en algún lugar la cadena dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
.
En las aplicaciones de macOS, esto suele estar en aplicacion.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
Puedes cargar este archivo en https://hexed.it/ y buscar la cadena anterior. Después de esta cadena, puedes ver en ASCII un número "0" o "1" que indica si cada fusible está deshabilitado o habilitado. Simplemente modifica el código hexadecimal (0x30
es 0
y 0x31
es 1
) para modificar los valores de los fusibles.
Ten en cuenta que si intentas sobrescribir el binario del Marco de Electron dentro de una aplicación con estos bytes modificados, la aplicación no se ejecutará.
Podrían existir archivos JS/HTML externos que una Aplicación Electron esté utilizando, por lo que un atacante podría inyectar código en estos archivos cuya firma no será verificada y ejecutar código arbitrario en el contexto de la aplicación.
Sin embargo, actualmente existen 2 limitaciones:
Se necesita el permiso kTCCServiceSystemPolicyAppBundles
para modificar una Aplicación, por lo que por defecto esto ya no es posible.
El archivo compilado asap
generalmente tiene los fusibles embeddedAsarIntegrityValidation
y
onlyLoadAppFromAsar
habilitados
Lo que hace que esta ruta de ataque sea más complicada (o imposible).
Ten en cuenta que es posible evadir el requisito de kTCCServiceSystemPolicyAppBundles
copiando la aplicación a otro directorio (como /tmp
), renombrando la carpeta app.app/Contents
a app.app/NotCon
, modificando el archivo asar con tu código malicioso, renombrándolo de nuevo a app.app/Contents
y ejecutándolo.
Puedes desempaquetar el código del archivo asar con:
Y empaquétalo de nuevo después de haberlo modificado con:
ELECTRON_RUN_AS_NODE
Según la documentación, si esta variable de entorno está configurada, iniciará el proceso como un proceso Node.js normal.
Si el fusible RunAsNode
está deshabilitado, la variable de entorno ELECTRON_RUN_AS_NODE
será ignorada y esto no funcionará.
Como se propuso aquí, podrías abusar de esta variable de entorno en un plist para mantener la persistencia:
NODE_OPTIONS
Puedes almacenar el payload en un archivo diferente y ejecutarlo:
Si el fusible EnableNodeOptionsEnvironmentVariable
está deshabilitado, la aplicación ignorará la variable de entorno NODE_OPTIONS al iniciarse a menos que la variable de entorno ELECTRON_RUN_AS_NODE
esté configurada, la cual también será ignorada si el fusible RunAsNode
está deshabilitado.
Si no configuras ELECTRON_RUN_AS_NODE
, te encontrarás con el error: Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
Podrías abusar de esta variable de entorno en un plist para mantener la persistencia agregando estas claves:
Según este artículo, si ejecutas una aplicación de Electron con banderas como --inspect
, --inspect-brk
y --remote-debugging-port
, se abrirá un puerto de depuración para que puedas conectarte a él (por ejemplo desde Chrome en chrome://inspect
) y podrás inyectar código en él o incluso lanzar nuevos procesos.
Por ejemplo:
Si el fusible EnableNodeCliInspectArguments
está deshabilitado, la aplicación ignorará los parámetros de node (como --inspect
) al iniciarse a menos que la variable de entorno ELECTRON_RUN_AS_NODE
esté configurada, la cual también será ignorada si el fusible RunAsNode
está deshabilitado.
Sin embargo, aún se puede utilizar el parámetro de electron --remote-debugging-port=9229
pero la carga útil anterior no funcionará para ejecutar otros procesos.
Usando el parámetro --remote-debugging-port=9222
es posible robar información de la Aplicación Electron como el historial (con comandos GET) o las cookies del navegador (ya que están descifradas dentro del navegador y hay un punto final json que las proporcionará).
Puedes aprender cómo hacerlo aquí y aquí y utilizar la herramienta automática WhiteChocolateMacademiaNut o un script simple como:
En esta publicación de blog, este proceso de depuración es abusado para hacer que un chrome sin interfaz gráfica descargue archivos arbitrarios en ubicaciones arbitrarias.
Podrías abusar de esta variable de entorno en un plist para mantener la persistencia agregando estas claves:
El demonio TCC de macOS no verifica la versión ejecutada de la aplicación. Por lo tanto, si no puedes inyectar código en una aplicación Electron con ninguna de las técnicas anteriores, podrías descargar una versión anterior de la APP e inyectar código en ella ya que seguirá obteniendo los privilegios de TCC (a menos que la Caché de Confianza lo prevenga).
Las técnicas anteriores te permitirán ejecutar código JS dentro del proceso de la aplicación electron. Sin embargo, recuerda que los procesos secundarios se ejecutan bajo el mismo perfil de sandbox que la aplicación principal y heredan sus permisos de TCC. Por lo tanto, si deseas abusar de los permisos para acceder a la cámara o al micrófono, por ejemplo, simplemente podrías ejecutar otro binario desde el proceso.
La herramienta electroniz3r se puede utilizar fácilmente para encontrar aplicaciones electron vulnerables instaladas e inyectar código en ellas. Esta herramienta intentará utilizar la técnica --inspect
:
Necesitas compilarla tú mismo y puedes usarla de la siguiente manera:
Aprende y practica Hacking en AWS: HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)