mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-13 05:16:32 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
@@ -67,7 +67,7 @@ aws codebuild start-build-batch --project <project-name> --buildspec-override fi
|
||||
|
||||
### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
|
||||
|
||||
Зловмисник з правами **`iam:PassRole`, `codebuild:CreateProject` та `codebuild:StartBuild` або `codebuild:StartBuildBatch`** зможе **підвищити привілеї до будь-якої ролі IAM Codebuild**, створивши працюючу.
|
||||
Зловмисник з правами **`iam:PassRole`, `codebuild:CreateProject` та `codebuild:StartBuild` або `codebuild:StartBuildBatch`** зможе **підвищити привілеї до будь-якої ролі IAM codebuild**, створивши працюючу.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Example1" }}
|
||||
@@ -302,7 +302,7 @@ aws codebuild start-build-batch --project-name codebuild-demo-project
|
||||
|
||||
### SSM
|
||||
|
||||
Маючи **достатньо прав для запуску сесії ssm**, можна **потрапити всередину проекту Codebuild**, що будується.
|
||||
Маючи **достатньо прав для запуску сесії ssm**, можна потрапити **в проект Codebuild**, що будується.
|
||||
|
||||
Проект codebuild повинен мати точку зупинки:
|
||||
|
||||
|
||||
@@ -79,8 +79,8 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
|
||||
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`
|
||||
|
||||
Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** в ECS, може **створити нову задачу** з **шкідливим контейнером**, який краде облікові дані метаданих і **запустити його**.\
|
||||
Однак у цьому випадку потрібно, щоб був контейнерний екземпляр для запуску шкідливої задачі.
|
||||
Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** в ECS, може **створити нове визначення завдання** з **шкідливим контейнером**, який краде облікові дані метаданих і **запустити його**.\
|
||||
Однак у цьому випадку потрібно, щоб контейнерна інстанція запустила шкідливе визначення завдання.
|
||||
```bash
|
||||
# Generate task definition with rev shell
|
||||
aws ecs register-task-definition --family iam_exfiltration \
|
||||
@@ -100,7 +100,7 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
|
||||
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
|
||||
|
||||
Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** або **`ecs:CreateService`** в ECS, може **згенерувати нове визначення завдання** з **шкідливим контейнером**, який краде облікові дані метаданих, і **запустити його, створивши нову службу з принаймні 1 завданням, що виконується.**
|
||||
Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** або **`ecs:CreateService`** в ECS, може **створити нову задачу** з **шкідливим контейнером**, який краде облікові дані метаданих, і **запустити її, створивши нову службу з принаймні 1 запущеною задачею.**
|
||||
```bash
|
||||
# Generate task definition with rev shell
|
||||
aws ecs register-task-definition --family iam_exfiltration \
|
||||
@@ -141,10 +141,10 @@ aws ecs run-task \
|
||||
|
||||
Цей сценарій схожий на попередні, але **без** дозволу **`iam:PassRole`**.\
|
||||
Це все ще цікаво, оскільки, якщо ви можете запустити довільний контейнер, навіть якщо він без ролі, ви могли б **запустити привілейований контейнер, щоб втекти** на вузол і **вкрасти роль EC2 IAM** та **інші ролі контейнерів ECS**, що працюють на вузлі.\
|
||||
Ви навіть могли б **примусити інші завдання працювати всередині EC2 екземпляра**, який ви скомпрометували, щоб вкрасти їхні облікові дані (як обговорюється в [**Розділі підвищення привілеїв до вузла**](aws-ecs-privesc.md#privesc-to-node)).
|
||||
Ви навіть могли б **примусити інші завдання працювати всередині EC2 інстансу**, який ви скомпрометували, щоб вкрасти їхні облікові дані (як обговорювалося в [**Розділі підвищення привілеїв до вузла**](aws-ecs-privesc.md#privesc-to-node)).
|
||||
|
||||
> [!WARNING]
|
||||
> Цей напад можливий лише якщо **ECS кластер використовує EC2** екземпляри, а не Fargate.
|
||||
> Цей напад можливий лише якщо **ECS кластер використовує EC2** інстанси, а не Fargate.
|
||||
```bash
|
||||
printf '[
|
||||
{
|
||||
@@ -187,8 +187,8 @@ aws ecs run-task --task-definition iam_exfiltration \
|
||||
```
|
||||
### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
|
||||
|
||||
Зловмисник з **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** може **виконувати команди** всередині запущеного контейнера та ексфільтрувати IAM роль, що до нього прикріплена (вам потрібні права опису, оскільки це необхідно для виконання `aws ecs execute-command`).\
|
||||
Однак, для цього екземпляр контейнера повинен працювати з **агентом ExecuteCommand** (який за замовчуванням не працює).
|
||||
Зловмисник з **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** може **виконувати команди** всередині запущеного контейнера та ексфільтрувати IAM роль, що до нього прикріплена (вам потрібні дозволи на опис, оскільки це необхідно для виконання `aws ecs execute-command`).\
|
||||
Однак, для цього екземпляр контейнера повинен працювати з **агентом ExecuteCommand** (який за замовчуванням не активований).
|
||||
|
||||
Отже, зловмисник може спробувати:
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ aws sns publish --topic-arn <value> --message <value>
|
||||
|
||||
### `sns:Subscribe`
|
||||
|
||||
Зловмисник може підписатися на тему SNS, потенційно отримуючи несанкціонований доступ до повідомлень або порушуючи нормальне функціонування додатків, які покладаються на цю тему.
|
||||
Зловмисник може підписатися на тему SNS, потенційно отримуючи несанкціонований доступ до повідомлень або порушуючи нормальне функціонування додатків, що покладаються на цю тему.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
```
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Step Functions
|
||||
|
||||
Для отримання додаткової інформації про цей сервіс AWS, перегляньте:
|
||||
Для отримання додаткової інформації про цю службу AWS, перевірте:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
### `states:TestState` & `iam:PassRole`
|
||||
|
||||
Зловмисник з дозволами **`states:TestState`** та **`iam:PassRole`** може тестувати будь-який стан і передавати будь-яку IAM роль без створення або оновлення існуючої машини станів, що потенційно дозволяє несанкціонований доступ до інших сервісів AWS з дозволами ролі. У поєднанні ці дозволи можуть призвести до широкомасштабних несанкціонованих дій, від маніпуляцій з робочими процесами для зміни даних до витоків даних, маніпуляцій з ресурсами та підвищення привілеїв.
|
||||
Зловмисник з дозволами **`states:TestState`** та **`iam:PassRole`** може тестувати будь-який стан і передавати будь-яку роль IAM без створення або оновлення існуючої машини станів, що потенційно дозволяє несанкціонований доступ до інших служб AWS з дозволами ролі. У поєднанні ці дозволи можуть призвести до широкомасштабних несанкціонованих дій, від маніпуляцій з робочими процесами для зміни даних до витоків даних, маніпуляцій з ресурсами та підвищення привілеїв.
|
||||
```bash
|
||||
aws states test-state --definition <value> --role-arn <value> [--input <value>] [--inspection-level <value>] [--reveal-secrets | --no-reveal-secrets]
|
||||
```
|
||||
@@ -63,7 +63,7 @@ aws stepfunctions test-state --definition file://stateDefinition.json --role-arn
|
||||
|
||||
### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`)
|
||||
|
||||
Зловмисник з **`states:CreateStateMachine`**& **`iam:PassRole`** зможе створити машину станів і надати їй будь-яку IAM роль, що дозволить несанкціонований доступ до інших сервісів AWS з дозволами ролі. На відміну від попередньої техніки підвищення привілеїв (**`states:TestState`** & **`iam:PassRole`**), ця не виконується сама по собі, вам також потрібно мати дозволи **`states:StartExecution`** або **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **не доступний для стандартних робочих процесів**, **тільки для виразних машин станів**) для того, щоб розпочати виконання над машиною станів.
|
||||
Зловмисник з **`states:CreateStateMachine`**& **`iam:PassRole`** зможе створити машину станів і надати їй будь-яку IAM роль, що дозволить несанкціонований доступ до інших сервісів AWS з дозволами цієї ролі. На відміну від попередньої техніки підвищення привілеїв (**`states:TestState`** & **`iam:PassRole`**), ця не виконується сама по собі, вам також потрібно мати дозволи **`states:StartExecution`** або **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **не доступний для стандартних робочих процесів**, **тільки для виразних машин станів**) для того, щоб розпочати виконання над машиною станів.
|
||||
```bash
|
||||
# Create a state machine
|
||||
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
|
||||
@@ -143,7 +143,7 @@ aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:1
|
||||
Залежно від того, наскільки дозволяючим є IAM роль, асоційована зі станом машини, атакуючий зіткнеться з 2 ситуаціями:
|
||||
|
||||
1. **Дозволяюча IAM роль**: Якщо IAM роль, асоційована зі станом машини, вже є дозволяючою (вона має, наприклад, прикріплену політику **`arn:aws:iam::aws:policy/AdministratorAccess`**), тоді дозвіл **`iam:PassRole`** не буде необхідним для ескалації привілеїв, оскільки не буде необхідності також оновлювати IAM роль, з визначенням стану машини буде достатньо.
|
||||
2. **Недозволяюча IAM роль**: На відміну від попереднього випадку, тут атакуючий також вимагатиме дозвіл **`iam:PassRole`**, оскільки буде необхідно асоціювати дозволяючу IAM роль зі станом машини на додаток до зміни визначення стану машини.
|
||||
2. **Недозволяюча IAM роль**: На відміну від попереднього випадку, тут атакуючий також вимагатиме дозвіл **`iam:PassRole`**, оскільки буде необхідно асоціювати дозволяючу IAM роль зі станом машини, крім зміни визначення стану машини.
|
||||
```bash
|
||||
aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
|
||||
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
Компанії можуть мати **неправильно налаштовані дозволи бакетів**, що надає доступ або до всього, або до всіх, хто автентифікований в AWS в будь-якому обліковому записі (тобто до будь-кого). Зверніть увагу, що навіть з такими неправильними налаштуваннями деякі дії можуть не бути виконані, оскільки бакети можуть мати свої власні списки контролю доступу (ACL).
|
||||
|
||||
**Дізнайтеся про неправильне налаштування AWS-S3 тут:** [**http://flaws.cloud**](http://flaws.cloud/) **і** [**http://flaws2.cloud/**](http://flaws2.cloud)
|
||||
**Дізнайтеся про неправильні налаштування AWS-S3 тут:** [**http://flaws.cloud**](http://flaws.cloud/) **та** [**http://flaws2.cloud/**](http://flaws2.cloud)
|
||||
|
||||
### Пошук AWS Бакетів
|
||||
|
||||
@@ -28,17 +28,17 @@ http://[bucket_name].s3.amazonaws.com/
|
||||
- Перевірте **CNAMES**, оскільки `resources.domain.com` може мати CNAME `bucket.s3.amazonaws.com`
|
||||
- **[s3dns](https://github.com/olizimmermann/s3dns)** – легкий DNS-сервер, який пасивно ідентифікує бакети хмарного зберігання (S3, GCP, Azure), аналізуючи DNS-трафік. Він виявляє CNAME, слідкує за ланцюгами розв'язання та співвідносить шаблони бакетів, пропонуючи тиху альтернативу брутфорсу або відкриттю через API. Ідеально підходить для розвідки та OSINT-робочих процесів.
|
||||
- Перевірте [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), веб-сайт з уже **виявленими відкритими бакетами**.
|
||||
- **Назва бакета** та **доменна назва бакета** повинні бути **однаковими.**
|
||||
- **flaws.cloud** знаходиться в **IP** 52.92.181.107, і якщо ви туди перейдете, він перенаправить вас на [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Також, `dig -x 52.92.181.107` дає `s3-website-us-west-2.amazonaws.com`.
|
||||
- **Ім'я бакета** та **доменне ім'я бакета** повинні бути **однаковими.**
|
||||
- **flaws.cloud** знаходиться за **IP** 52.92.181.107, і якщо ви туди перейдете, він перенаправить вас на [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Також, `dig -x 52.92.181.107` дає `s3-website-us-west-2.amazonaws.com`.
|
||||
- Щоб перевірити, чи це бакет, ви також можете **відвідати** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/).
|
||||
|
||||
#### Брутфорс
|
||||
|
||||
Ви можете знайти бакети, **брутфорсуючи назви**, пов'язані з компанією, яку ви тестуєте:
|
||||
Ви можете знайти бакети, **брутфорсуючи імена**, пов'язані з компанією, яку ви тестуєте:
|
||||
|
||||
- [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
- [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector)
|
||||
- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (містить список потенційних назв бакетів)
|
||||
- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (містить список потенційних імен бакетів)
|
||||
- [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets)
|
||||
- [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky)
|
||||
- [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers)
|
||||
@@ -96,21 +96,21 @@ nslookup 52.218.192.11
|
||||
Non-authoritative answer:
|
||||
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.
|
||||
```
|
||||
Перевірте, що в розв'язаному домені є слово "website".\
|
||||
Перевірте, чи має розв'язане доменне ім'я слово "website".\
|
||||
Ви можете отримати доступ до статичного веб-сайту, перейшовши за адресою: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\
|
||||
або ви можете отримати доступ до бакету, відвідавши: `flaws.cloud.s3-us-west-2.amazonaws.com`
|
||||
|
||||
|
||||
|
||||
#### Спробувавши
|
||||
#### Спробуючи
|
||||
|
||||
Якщо ви намагаєтеся отримати доступ до бакету, але в **імені домену вказуєте інший регіон** (наприклад, бакет знаходиться в `bucket.s3.amazonaws.com`, але ви намагаєтеся отримати доступ до `bucket.s3-website-us-west-2.amazonaws.com`, тоді вам буде **вказано на правильне місце**:
|
||||
Якщо ви намагаєтеся отримати доступ до бакету, але в **доменному імені вказуєте інший регіон** (наприклад, бакет знаходиться в `bucket.s3.amazonaws.com`, але ви намагаєтеся отримати доступ до `bucket.s3-website-us-west-2.amazonaws.com`, тоді вам буде **вказано на правильне місце**:
|
||||
|
||||
.png>)
|
||||
|
||||
### Перерахування бакету
|
||||
|
||||
Щоб перевірити відкритість бакету, користувач може просто ввести URL у своєму веб-браузері. Приватний бакет відповість "Доступ заборонено". Публічний бакет відобразить перші 1,000 об'єктів, які були збережені.
|
||||
Щоб перевірити відкритість бакету, користувач може просто ввести URL у свій веб-браузер. Приватний бакет відповість "Доступ заборонено". Публічний бакет відобразить перші 1,000 об'єктів, які були збережені.
|
||||
|
||||
Відкрито для всіх:
|
||||
|
||||
@@ -128,15 +128,15 @@ Non-authoritative answer:
|
||||
#Opcionally you can select the region if you now it
|
||||
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
|
||||
```
|
||||
Якщо бакет не має доменного імені, при спробі його перерахувати, **вкажіть лише ім'я бакета** і не вводьте ціле доменне ім'я AWSs3. Приклад: `s3://<BUCKETNAME>`
|
||||
Якщо у бакета немає доменного імені, при спробі його перерахувати, **вкажіть лише ім'я бакета** і не вводьте ціле доменне ім'я AWSs3. Приклад: `s3://<BUCKETNAME>`
|
||||
|
||||
### Шаблон публічного URL
|
||||
```
|
||||
https://{user_provided}.s3.amazonaws.com
|
||||
```
|
||||
### Отримання ID облікового запису з публічного бакету
|
||||
### Отримати ID облікового запису з публічного бакету
|
||||
|
||||
Можливо визначити обліковий запис AWS, скориставшись новим **`S3:ResourceAccount`** **ключем умови політики**. Ця умова **обмежує доступ на основі S3 бакету**, в якому знаходиться обліковий запис (інші політики, що базуються на облікових записах, обмежують доступ на основі облікового запису, в якому знаходиться запитуючий суб'єкт).\
|
||||
Можливо визначити обліковий запис AWS, скориставшись новим **`S3:ResourceAccount`** **ключем умови політики**. Ця умова **обмежує доступ на основі S3 бакету**, в якому знаходиться обліковий запис (інші політики на основі облікового запису обмежують доступ на основі облікового запису, в якому знаходиться запитуючий суб'єкт).\
|
||||
І оскільки політика може містити **шаблони**, можливо знайти номер облікового запису **лише по одному числу за раз**.
|
||||
|
||||
Цей інструмент автоматизує процес:
|
||||
@@ -161,7 +161,7 @@ curl -X GET "[bucketname].amazonaws.com/" \
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>
|
||||
```
|
||||
Якщо помилка є "Доступ заборонено", це означає, що ідентифікатор облікового запису був неправильним.
|
||||
Якщо помилка - це "Доступ заборонено", це означає, що ідентифікатор облікового запису був неправильним.
|
||||
|
||||
### Використані електронні адреси для перерахунку кореневих облікових записів
|
||||
|
||||
|
||||
Reference in New Issue
Block a user