mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-privilege-escalat
This commit is contained in:
+21
-10
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user