Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat

This commit is contained in:
Translator
2025-09-29 22:40:46 +00:00
parent d452cf43e5
commit 01d582ba7e
2 changed files with 44 additions and 46 deletions
@@ -4,20 +4,19 @@
## STS
Для отримання додаткової інформації:
Для додаткової інформації:
{{#ref}}
../aws-services/aws-iam-enum.md
{{#endref}}
### Від IAM облікових даних до консолі
### From IAM Creds to Console
Якщо вам вдалося отримати деякі IAM облікові дані, ви можете бути зацікавлені в **доступі до веб-консолі** за допомогою наступних інструментів.\
Зверніть увагу, що користувач/роль повинні мати дозвіл **`sts:GetFederationToken`**.
Якщо вам вдалося отримати деякі IAM credentials, можливо, вас зацікавить **доступ до веб-консолі** за допомогою наведених інструментів.\ Зауважте, що користувач/роль має мати дозвіл **`sts:GetFederationToken`**.
#### Користувацький скрипт
Наступний скрипт використовуватиме профіль за замовчуванням та стандартне місцезнаходження 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
@@ -55,7 +54,7 @@ echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.co
```
#### aws_consoler
Ви можете **згенерувати посилання на веб-консоль** з [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
Ви можете **згенерувати посилання на веб-консоль** за допомогою [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler).
```bash
cd /tmp
python3 -m venv env
@@ -64,22 +63,22 @@ pip install aws-consoler
aws_consoler [params...] #This will generate a link to login into the console
```
> [!WARNING]
> Переконайтеся, що у користувача IAM є дозвіл `sts:GetFederationToken`, або надайте роль для прийняття.
> Переконайтеся, що IAM користувач має дозвіл `sts:GetFederationToken`, або надайте роль, яку можна прийняти.
#### aws-vault
[**aws-vault**](https://github.com/99designs/aws-vault) - це інструмент для безпечного зберігання та доступу до облікових даних AWS у середовищі розробки.
[**aws-vault**](https://github.com/99designs/aws-vault) це інструмент для безпечного зберігання та доступу до облікових даних AWS у середовищі розробки.
```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 на основі user agent), можливо використовувати попередню техніку для **підключення до веб-консолі через браузер**, або ви можете безпосередньо **змінити user-agent boto3**, виконавши:
Якщо існує **обмеження на виконання певних дій залежно від використовуваного User-Agent** (наприклад, обмеження використання python boto3 library на основі User-Agent), можна скористатися попередньою технікою, щоб **підключитися до веб-консолі через браузер**, або безпосередньо **змінити boto3 user-agent**, зробивши:
```bash
# Shared by ex16x41
# Create a client
@@ -92,4 +91,16 @@ client.meta.events.register( 'before-call.secretsmanager.GetSecretValue', lambda
# Perform the action
response = client.get_secret_value(SecretId="flag_secret") print(response['SecretString'])
```
### **`sts:GetFederationToken`**
З цим дозволом можна створити федеративну ідентичність для користувача, який виконує цю дію, обмежену дозволами, якими володіє цей користувач.
```bash
aws sts get-federation-token --name <username>
```
Токен, повернутий sts:GetFederationToken, належить федеративній ідентичності користувача, який викликав запит, але має обмежені дозволи.
Навіть якщо користувач має права адміністратора, певні дії, такі як перелік користувачів IAM або приєднання політик, не можуть бути виконані через федеративний токен.
Крім того, цей метод дещо більш малопомітний, оскільки федеративний користувач не відображається в AWS Portal; його можна побачити лише через логи CloudTrail або інструменти моніторингу.
{{#include ../../../banners/hacktricks-training.md}}
@@ -6,9 +6,9 @@
### `sts:AssumeRole`
Кожна роль створюється з **політикою довіри до ролі**, ця політика вказує **хто може прийняти створену роль**. Якщо роль з **того ж облікового запису** говорить, що обліковий запис може її прийняти, це означає, що обліковий запис зможе отримати доступ до ролі (і потенційно **privesc**).
Кожна роль створюється з **політикою довіри ролі**, ця політика вказує **хто може прийняти створену роль**. Якщо роль з **того самого акаунту** вказує, що акаунт може її приймати, це означає, що цей акаунт зможе отримати доступ до ролі (і потенційно **privesc**).
Наприклад, наступна політика довіри до ролі вказує, що будь-хто може її прийняти, отже, **будь-який користувач зможе privesc** до дозволів, пов'язаних з цією роллю.
Наприклад, наступна політика довіри ролі вказує, що будь-хто може її прийняти, отже **будь-який користувач зможе здійснити privesc** до дозволів, пов'язаних з цією роллю.
```json
{
"Version": "2012-10-17",
@@ -23,39 +23,20 @@
]
}
```
Ви можете видати себе за роль, яка виконує:
Ви можете видаватися за роль, запустивши:
```bash
aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname
```
**Потенційний вплив:** Привілейоване підвищення до ролі.
**Потенційний вплив:** Privesc до ролі.
> [!CAUTION]
> Зверніть увагу, що в цьому випадку дозвіл `sts:AssumeRole` потрібно **вказати в ролі для зловживання** і не в політиці, що належить атакуючому.\
> З одним винятком, для того щоб **прийняти роль з іншого облікового запису**, обліковий запис атакуючого **також повинен** мати **`sts:AssumeRole`** над роллю.
> Зауважте, що в цьому випадку дозвіл `sts:AssumeRole` має бути **вказаний у ролі, яку збираються зловживати**, а не в політиці, що належить зловмиснику.\
> За одним винятком, щоб **прийняти роль з іншого облікового запису** обліковий запис зловмисника **також повинен** мати **`sts:AssumeRole`** щодо цієї ролі.
### **`sts:GetFederationToken`**
З цим дозволом можливо згенерувати облікові дані для видавання себе за будь-якого користувача:
```bash
aws sts get-federation-token --name <username>
```
Ось як ці дозволи можуть бути надані безпечно, не надаючи доступу до імітації інших користувачів:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:GetFederationToken",
"Resource": "arn:aws:sts::947247140022:federated-user/${aws:username}"
}
]
}
```
### `sts:AssumeRoleWithSAML`
Політика довіри з цією роллю надає **користувачам, аутентифікованим через SAML, доступ до наслідування ролі.**
Політика довіри для цієї ролі надає **користувачам, автентифікованим через SAML, можливість діяти від імені ролі.**
Приклад політики довіри з цим дозволом:
```json
@@ -78,21 +59,21 @@ aws sts get-federation-token --name <username>
]
}
```
Щоб згенерувати облікові дані для імітації ролі, ви можете використовувати щось на зразок:
Щоб згенерувати облікові дані для імітації ролі, можна використати щось на кшталт:
```bash
aws sts assume-role-with-saml --role-arn <value> --principal-arn <value>
```
Але **постачальники** можуть мати **власні інструменти**, щоб спростити це, такі як [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role):
Але **провайдери** можуть мати **власні інструменти**, щоб полегшити це, наприклад [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 to the role.
### `sts:AssumeRoleWithWebIdentity`
Ця дозволяє отримати набір тимчасових облікових даних безпеки для **користувачів, які були автентифіковані в мобільному, веб-додатку, EKS...** з постачальником веб-ідентичності. [Дізнайтеся більше тут.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)
Цей дозвіл дає можливість отримати набір тимчасових облікових даних безпеки для **користувачів, які були автентифіковані у мобільному, веб-застосунку, EKS...** з використанням провайдера web identity. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)
Наприклад, якщо **обліковий запис служби EKS** повинен мати можливість **видавати себе за IAM роль**, він матиме токен у **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** і може **прийняти роль і отримати облікові дані**, виконавши щось на зразок:
Наприклад, якщо **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_name> --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
@@ -105,9 +86,9 @@ aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/
### IAM Roles Anywhere Privesc
AWS IAM RolesAnywhere дозволяє навантаженням поза AWS приймати IAM ролі, використовуючи X.509 сертифікати. Але коли політики довіри не мають належних обмежень, їх можна зловживати для ескалації привілеїв.
AWS IAM RolesAnywhere дозволяє робочим навантаженням поза AWS assume IAM roles за допомогою X.509 certificates. Але коли trust policies не належним чином обмежені, їх можна зловживати для privilege escalation.
Ця політика не має обмежень на те, які атрибути довірчого якоря або сертифіката дозволені. В результаті будь-який сертифікат, пов'язаний з будь-яким довірчим якорем в обліковому записі, може бути використаний для прийняття цієї ролі.
Ця policy не містить обмежень щодо того, який trust anchor або які certificate attributes дозволені. В результаті будь-який certificate, пов'язаний з будь-яким trust anchor в акаунті, може бути використаний, щоб assume this role.
```json
{
"Version": "2012-10-17",
@@ -127,9 +108,9 @@ AWS IAM RolesAnywhere дозволяє навантаженням поза AWS
}
```
Для підвищення привілеїв, `aws_signing_helper` потрібен з https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html
Щоб виконати privesc, `aws_signing_helper` потрібен з https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html
Потім, використовуючи дійсний сертифікат, зловмисник може перейти до ролі з вищими привілеями.
Потім, використовуючи дійсний сертифікат, зловмисник може pivot у role з вищими привілеями
```bash
aws_signing_helper credential-process \
--certificate readonly.pem \
@@ -138,7 +119,13 @@ aws_signing_helper credential-process \
--profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \
--role-arn arn:aws:iam::123456789012:role/Admin
```
### Посилання
Точка довіри перевіряє, що клієнтський сертифікат `readonly.pem` походить від його авторизованого CA; коли точку довіри створювали, був включений публічний сертифікат CA (який тепер використовується для валідації `readonly.pem`). Усередині `readonly.pem` міститься відкритий ключ, який AWS використовує для перевірки того, що підпис було зроблено відповідним приватним ключем `readonly.key`.
Сертифікат також підтверджує ідентичність і надає атрибути (наприклад CN або OU), які профіль `default` перетворює на теги — політика довіри ролі може використовувати ці теги, щоб вирішити, чи надавати доступ; якщо в політиці довіри немає умов, ці теги ігноруються і будь-хто з дійсним сертифікатом допускається.
Щоб ця атака була можливою, і точка довіри, і профіль `default` повинні бути активними.
### References
- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation)