GWS - App Scripts
Script dell'Applicazione
Gli App Scripts sono codici che verranno attivati quando un utente con permessi di modifica accede al documento a cui lo Script dell'App è collegato e dopo aver accettato il prompt OAuth. Possono anche essere impostati per essere eseguiti ogni certo tempo dal proprietario dello Script dell'App (Persistenza).
Creare uno Script dell'Applicazione
Ci sono diversi modi per creare uno Script dell'Applicazione, anche se i più comuni sono da un Documento Google (di qualsiasi tipo) e come progetto autonomo:
Scenario dello Script dell'Applicazione
Crea un Foglio Google con lo Script dell'Applicazione
Inizia creando uno Script dell'Applicazione, la mia raccomandazione per questo scenario è creare un Foglio Google e andare su Estensioni > Script dell'App
, questo aprirà uno nuovo Script dell'App collegato al foglio.
Leak del token
Per dare accesso al token OAuth è necessario fare clic su Servizi +
e aggiungere ambiti come:
AdminDirectory: Accesso agli utenti e ai gruppi della directory (se l'utente ha abbastanza permessi)
Gmail: Per accedere ai dati di Gmail
Drive: Per accedere ai dati di Drive
API di Google Sheets: Per farlo funzionare con il trigger
Per modificare tu stesso gli ambiti necessari puoi andare nelle impostazioni del progetto e abilitare: Mostra il file manifesto "appsscript.json" nell'editor
.
Per catturare la richiesta puoi semplicemente eseguire:
Permessi richiesti per eseguire lo Script dell'App:
Poiché viene effettuata una richiesta esterna, il prompt OAuth chiederà anche il permesso di raggiungere endpoint esterni.
Creare Trigger
Una volta letto l'App, fare clic su ⏰ Triggers per creare un trigger. Come funzione da eseguire scegliere getToken
, eseguito al rilascio Head
, nella sorgente dell'evento selezionare Da foglio di calcolo
e selezionare il tipo di evento All'apertura
o Modifica
(a seconda delle esigenze) e salvare.
Si noti che è possibile controllare i run degli Script dell'App nella scheda Esecuzioni se si desidera eseguire il debug di qualcosa.
Condivisione
Per attivare lo Script dell'App la vittima deve connettersi con Accesso Editor.
Il token utilizzato per eseguire lo Script dell'App sarà quello del creatore del trigger, anche se il file viene aperto come Editor da altri utenti.
Abuso dei documenti condivisi con me
Se qualcuno ha condiviso con te un documento con Script dell'App e un trigger che utilizza l'Head dello Script dell'App (non un rilascio fisso), è possibile modificare il codice dello Script dell'App (aggiungendo ad esempio le funzioni di furto del token), accedervi e lo Script dell'App verrà eseguito con i permessi dell'utente che ha condiviso il documento con te! (si noti che il token OAuth dei proprietari avrà come ambiti di accesso quelli forniti al momento della creazione del trigger).
Una notifica verrà inviata al creatore dello script indicando che qualcuno ha modificato lo script (Cosa ne pensi di utilizzare i permessi di gmail per generare un filtro per evitare l'allerta?)
Se un attaccante modifica gli ambiti dello Script dell'App gli aggiornamenti non verranno applicati al documento fino a quando non viene creato un nuovo trigger con le modifiche. Pertanto, un attaccante non sarà in grado di rubare il token del creatore con più ambiti di quelli impostati nel trigger che ha creato.
Copiare anziché condividere
Quando si crea un link per condividere un documento viene creato un link simile a questo: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
Se si cambia la parte finale "/edit" in "/copy", anziché accedervi Google chiederà se si desidera generare una copia del documento:
Se l'utente lo copia e vi accede, sia i contenuti del documento che gli Script dell'App verranno copiati, tuttavia i trigger no, quindi nulla verrà eseguito.
Condivisione come Applicazione Web
Si noti che è anche possibile condividere uno Script dell'App come applicazione Web (nell'Editor dello Script dell'App, distribuire come applicazione Web), ma comparirà un avviso come questo:
Seguito dal tipico prompt OAuth che chiede i permessi necessari.
Testing
È possibile testare un token raccolto per elencare le email con:
Elenco calendario dell'utente:
Script dell'app come Persistenza
Una opzione per la persistenza sarebbe creare un documento e aggiungere un trigger per la funzione getToken e condividere il documento con l'attaccante in modo che ogni volta che l'attaccante apre il file esfiltrerà il token della vittima.
È anche possibile creare uno Script dell'App e impostarlo per attivarsi ogni X tempo (come ogni minuto, ora, giorno...). Un attaccante che ha compromesso le credenziali o una sessione di una vittima potrebbe impostare uno Script dell'App per attivarsi regolarmente e rivelare un token OAuth molto privilegiato ogni giorno:
Basta creare uno Script dell'App, andare su Trigger, fare clic su Aggiungi Trigger e selezionare come origine dell'evento Time-driven e scegliere le opzioni che meglio si adattano a te:
Questo genererà una email di allerta sulla sicurezza e un messaggio push sul tuo dispositivo mobile per avvisarti di questo.
Bypass della Richiesta Non Verificata del Documento Condiviso
Inoltre, se qualcuno ti ha condiviso un documento con accesso come editor, puoi generare Script dell'App all'interno del documento e il PROPRIETARIO (creatore) del documento sarà il proprietario dello Script dell'App.
Questo significa che il creatore del documento apparirà come creatore di qualsiasi Script dell'App che chiunque con accesso come editor crei al suo interno.
Questo significa anche che lo Script dell'App sarà considerato attendibile dall'ambiente Workspace del creatore del documento.
Questo significa anche che se uno Script dell'App esisteva già e le persone hanno concesso l'accesso, chiunque con permesso Editor sul documento può modificarlo e abusare di quell'accesso.
Per abusare di questo è necessario anche che le persone attivino lo Script dell'App. E un trucco utile è pubblicare lo script come web app. Quando le persone che hanno già concesso l'accesso allo Script dell'App accedono alla pagina web, attiveranno lo Script dell'App (questo funziona anche utilizzando tag <img>
).
Last updated