GWS - App Scripts
Scripts de Aplicaciones
Los Scripts de Aplicaciones son código que se activará cuando un usuario con permiso de editor acceda al documento con el que el Script de Aplicación está vinculado y después de aceptar el aviso de OAuth. También se pueden configurar para que se ejecuten cada cierto tiempo por el propietario del Script de Aplicación (Persistencia).
Crear Script de Aplicación
Existen varias formas de crear un Script de Aplicación, aunque las más comunes son desde un Documento de Google (de cualquier tipo) y como un proyecto independiente:
Escenario de Script de Aplicación
Crear Hoja de Cálculo de Google con Script de Aplicación
Comienza creando un Script de Aplicación, mi recomendación para este escenario es crear una Hoja de Cálculo de Google e ir a Extensiones > Scripts de Aplicaciones
, esto abrirá un nuevo Script de Aplicación vinculado a la hoja.
Fuga de token
Para dar acceso al token de OAuth necesitas hacer clic en Servicios +
y agregar ámbitos como:
AdminDirectory: Acceder a usuarios y grupos del directorio (si el usuario tiene suficientes permisos)
Gmail: Para acceder a datos de Gmail
Drive: Para acceder a datos de Drive
Google Sheets API: Para que funcione con el disparador
Para cambiar tú mismo los ámbitos necesarios puedes ir a la configuración del proyecto y habilitar: Mostrar archivo de manifiesto "appsscript.json" en el editor
.
Para capturar la solicitud, simplemente puedes ejecutar:
Permisos solicitados para ejecutar el App Script:
Al realizar una solicitud externa, el cuadro de diálogo de OAuth también pedirá permiso para acceder a puntos finales externos.
Crear Desencadenador
Una vez que se haya leído la aplicación, haga clic en ⏰ Desencadenadores para crear un desencadenador. En función a ejecutar, elija getToken
, se ejecuta en la implementación Head
, en la fuente del evento seleccione Desde la hoja de cálculo
y seleccione el tipo de evento Al abrir
o Al editar
(según sus necesidades) y guarde.
Tenga en cuenta que puede verificar las ejecuciones de los App Scripts en la pestaña Ejecuciones si desea depurar algo.
Compartir
Para activar el App Script, la víctima necesita conectarse con Acceso de editor.
El token utilizado para ejecutar el App Script será el del creador del desencadenador, incluso si el archivo se abre como Editor por otros usuarios.
Abusando de documentos Compartidos conmigo
Si alguien compartió contigo un documento con App Scripts y un desencadenador utilizando el Head del App Script (no una implementación fija), puedes modificar el código del App Script (agregando, por ejemplo, funciones para robar tokens), acceder a él y el App Script se ejecutará con los permisos del usuario que compartió el documento contigo (ten en cuenta que el token de OAuth del propietario tendrá como alcance de acceso los otorgados cuando se creó el desencadenador).
Se enviará una notificación al creador del script indicando que alguien modificó el script (¿Qué tal usar permisos de gmail para generar un filtro que evite la alerta?)
Si un atacante modifica los alcances del App Script, las actualizaciones no se aplicarán al documento hasta que se cree un nuevo desencadenador con los cambios. Por lo tanto, un atacante no podrá robar el token del creador con más alcances de los que estableció en el desencadenador que creó.
Copiar en lugar de compartir
Cuando creas un enlace para compartir un documento se crea un enlace similar a este: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
Si cambias el final "/edit" por "/copy", en lugar de acceder, Google te preguntará si deseas generar una copia del documento:
Si el usuario lo copia y lo accede, tanto el contenido del documento como los App Scripts se copiarán, sin embargo, los desencadenadores no lo harán, por lo tanto nada se ejecutará.
Compartir como Aplicación Web
Ten en cuenta que también es posible compartir un App Script como una aplicación web (en el Editor del App Script, implementar como una aplicación web), pero aparecerá una alerta como esta:
Seguido por el cuadro de diálogo de OAuth típico pidiendo los permisos necesarios.
Pruebas
Puedes probar un token recopilado para listar correos electrónicos con:
Listar calendario del usuario:
Script de aplicación como persistencia
Una opción para la persistencia sería crear un documento y agregar un desencadenador para la función getToken y compartir el documento con el atacante para que cada vez que el atacante abra el archivo exfiltre el token de la víctima.
También es posible crear un Script de aplicación y hacer que se active cada cierto tiempo (como cada minuto, hora, día...). Un atacante que haya comprometido credenciales o una sesión de una víctima podría configurar un desencadenador de tiempo en un Script de aplicación y filtrar un token OAuth muy privilegiado cada día:
Simplemente crea un Script de aplicación, ve a Desencadenadores, haz clic en Agregar desencadenador y selecciona como fuente de evento Programado y elige las opciones que mejor se adapten a ti:
Esto creará un correo electrónico de alerta de seguridad y un mensaje push a tu móvil alertando sobre esto.
Bypass de la advertencia no verificada de documento compartido
Además, si alguien compartió contigo un documento con acceso de editor, puedes generar Scripts de aplicación dentro del documento y el PROPIETARIO (creador) del documento será el propietario del Script de aplicación.
Esto significa que el creador del documento aparecerá como creador de cualquier Script de aplicación que cualquier persona con acceso de editor cree dentro de él.
Esto también significa que el Script de aplicación será confiable para el entorno de Workspace del creador del documento.
Esto también significa que si un Script de aplicación ya existía y las personas han concedido acceso, cualquier persona con permiso de Editor en el documento puede modificarlo y abusar de ese acceso.
Para abusar de esto también necesitas que las personas activen el Script de aplicación. Y un truco ingenioso es publicar el script como una aplicación web. Cuando las personas que ya han concedido acceso al Script de aplicación accedan a la página web, activarán el Script de aplicación (esto también funciona usando etiquetas <img>
).
Última actualización