mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-01 23:39:52 -08:00
Translated ['src/README.md', 'src/banners/hacktricks-training.md', 'src/
This commit is contained in:
@@ -6,38 +6,37 @@
|
||||
|
||||
### Basic Information
|
||||
|
||||
AWS API Gateway is a comprehensive service offered by Amazon Web Services (AWS) designed for developers to **create, publish, and oversee APIs on a large scale**. It functions as an entry point to an application, permitting developers to establish a framework of rules and procedures. This framework governs the access external users have to certain data or functionalities within the application.
|
||||
AWS API Gateway - це комплексна служба, що пропонується Amazon Web Services (AWS), призначена для розробників, щоб **створювати, публікувати та контролювати API в масштабах**. Вона функціонує як точка входу до програми, дозволяючи розробникам встановлювати набір правил і процедур. Ця структура регулює доступ зовнішніх користувачів до певних даних або функціональностей у програмі.
|
||||
|
||||
API Gateway enables you to define **how requests to your APIs should be handled**, and it can create custom API endpoints with specific methods (e.g., GET, POST, PUT, DELETE) and resources. It can also generate client SDKs (Software Development Kits) to make it easier for developers to call your APIs from their applications.
|
||||
API Gateway дозволяє вам визначити, **як повинні оброблятися запити до ваших API**, і може створювати користувацькі кінцеві точки API з конкретними методами (наприклад, GET, POST, PUT, DELETE) та ресурсами. Вона також може генерувати клієнтські SDK (набори засобів розробки програмного забезпечення), щоб спростити розробникам виклик ваших API з їхніх програм.
|
||||
|
||||
### API Gateways Types
|
||||
|
||||
- **HTTP API**: Build low-latency and cost-effective REST APIs with built-in features such as OIDC and OAuth2, and native CORS support. Works with the following: Lambda, HTTP backends.
|
||||
- **WebSocket API**: Build a WebSocket API using persistent connections for real-time use cases such as chat applications or dashboards. Works with the following: Lambda, HTTP, AWS Services.
|
||||
- **REST API**: Develop a REST API where you gain complete control over the request and response along with API management capabilities. Works with the following: Lambda, HTTP, AWS Services.
|
||||
- **REST API Private**: Create a REST API that is only accessible from within a VPC.
|
||||
- **HTTP API**: Створюйте API REST з низькою затримкою та економічними витратами з вбудованими функціями, такими як OIDC та OAuth2, а також нативною підтримкою CORS. Працює з наступними: Lambda, HTTP backends.
|
||||
- **WebSocket API**: Створюйте WebSocket API, використовуючи постійні з'єднання для реальних випадків використання, таких як чат-додатки або інформаційні панелі. Працює з наступними: Lambda, HTTP, AWS Services.
|
||||
- **REST API**: Розробляйте REST API, де ви отримуєте повний контроль над запитом і відповіддю разом із можливостями управління API. Працює з наступними: Lambda, HTTP, AWS Services.
|
||||
- **REST API Private**: Створіть REST API, який доступний лише зсередини VPC.
|
||||
|
||||
### API Gateway Main Components
|
||||
|
||||
1. **Resources**: In API Gateway, resources are the components that **make up the structure of your API**. They represent **the different paths or endpoints** of your API and correspond to the various actions that your API supports. A resource is each method (e.g., GET, POST, PUT, DELETE) **inside each path** (/, or /users, or /user/{id}.
|
||||
2. **Stages**: Stages in API Gateway represent **different versions or environments** of your API, such as development, staging, or production. You can use stages to manage and deploy **multiple versions of your API simultaneousl**y, allowing you to test new features or bug fixes without affecting the production environment. Stages also **support stage variables**, which are key-value pairs that can be used to configure the behavior of your API based on the current stage. For example, you could use stage variables to direct API requests to different Lambda functions or other backend services depending on the stage.
|
||||
- The stage is indicated at the beggining of the URL of the API Gateway endpoint.
|
||||
3. **Authorizers**: Authorizers in API Gateway are responsible for **controlling access to your API** by verifying the identity of the caller before allowing the request to proceed. You can use **AWS Lambda functions** as custom authorizers, which allows you to implement your own authentication and authorization logic. When a request comes in, API Gateway passes the request's authorization token to the Lambda authorizer, which processes the token and returns an IAM policy that determines what actions the caller is allowed to perform. API Gateway also supports **built-in authorizers**, such as **AWS Identity and Access Management (IAM)** and **Amazon Cognito**.
|
||||
4. **Resource Policy**: A resource policy in API Gateway is a JSON document that **defines the permissions for accessing your API**. It is similar to an IAM policy but specifically tailored for API Gateway. You can use a resource policy to control who can access your API, which methods they can call, and from which IP addresses or VPCs they can connect. **Resource policies can be used in combination with authorizers** to provide fine-grained access control for your API.
|
||||
- In order to make effect the API needs to be **deployed again after** the resource policy is modified.
|
||||
1. **Resources**: У API Gateway ресурси - це компоненти, які **складають структуру вашого API**. Вони представляють **різні шляхи або кінцеві точки** вашого API і відповідають різним діям, які підтримує ваш API. Ресурс - це кожен метод (наприклад, GET, POST, PUT, DELETE) **всередині кожного шляху** (/, або /users, або /user/{id}).
|
||||
2. **Stages**: Стадії в API Gateway представляють **різні версії або середовища** вашого API, такі як розробка, тестування або продуктивність. Ви можете використовувати стадії для управління та розгортання **декількох версій вашого API одночасно**, що дозволяє вам тестувати нові функції або виправлення помилок без впливу на продуктивне середовище. Стадії також **підтримують змінні стадії**, які є парами ключ-значення, що можуть використовуватися для налаштування поведінки вашого API в залежності від поточної стадії. Наприклад, ви можете використовувати змінні стадії, щоб направляти запити API до різних функцій Lambda або інших служб бекенду в залежності від стадії.
|
||||
- Стадія вказується на початку URL кінцевої точки API Gateway.
|
||||
3. **Authorizers**: Авторизатори в API Gateway відповідають за **контроль доступу до вашого API**, перевіряючи особу виклику перед тим, як дозволити запит. Ви можете використовувати **функції AWS Lambda** як користувацькі авторизатори, що дозволяє вам реалізувати власну логіку аутентифікації та авторизації. Коли надходить запит, API Gateway передає токен авторизації запиту авторизатору Lambda, який обробляє токен і повертає політику IAM, що визначає, які дії дозволено виконувати виклику. API Gateway також підтримує **вбудовані авторизатори**, такі як **AWS Identity and Access Management (IAM)** та **Amazon Cognito**.
|
||||
4. **Resource Policy**: Політика ресурсу в API Gateway - це документ JSON, який **визначає дозволи для доступу до вашого API**. Вона подібна до політики IAM, але спеціально адаптована для API Gateway. Ви можете використовувати політику ресурсу, щоб контролювати, хто може отримати доступ до вашого API, які методи вони можуть викликати та з яких IP-адрес або VPC вони можуть підключатися. **Політики ресурсів можуть використовуватися в поєднанні з авторизаторами** для надання детального контролю доступу до вашого API.
|
||||
- Щоб зміни набрали чинності, API потрібно **знову розгорнути після** зміни політики ресурсу.
|
||||
|
||||
### Logging
|
||||
|
||||
By default, **CloudWatch Logs** are **off**, **Access Logging** is **off**, and **X-Ray tracing** is also **off**.
|
||||
За замовчуванням **CloudWatch Logs** **вимкнено**, **Access Logging** **вимкнено**, а **X-Ray tracing** також **вимкнено**.
|
||||
|
||||
### Enumeration
|
||||
|
||||
> [!TIP]
|
||||
> Note that in both AWS apis to enumerate resources (**`apigateway`** and **`apigatewayv2`**) the only permission you need and the only read permission grantable is **`apigateway:GET`**, with that you can **enumerate everything.**
|
||||
> Зверніть увагу, що в обох API AWS для перерахунку ресурсів (**`apigateway`** та **`apigatewayv2`**) єдине дозволення, яке вам потрібно, і єдине дозволення на читання, яке можна надати, - це **`apigateway:GET`**, з цим ви можете **перерахувати все.**
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="apigateway" }}
|
||||
|
||||
```bash
|
||||
# Generic info
|
||||
aws apigateway get-account
|
||||
@@ -78,11 +77,9 @@ aws apigateway get-usage-plan-key --usage-plan-id <plan_id> --key-id <key_id>
|
||||
###Already consumed
|
||||
aws apigateway get-usage --usage-plan-id <plan_id> --start-date 2023-07-01 --end-date 2023-07-12
|
||||
```
|
||||
|
||||
{{#endtab }}
|
||||
|
||||
{{#tab name="apigatewayv2" }}
|
||||
|
||||
```bash
|
||||
# Generic info
|
||||
aws apigatewayv2 get-domain-names
|
||||
@@ -124,49 +121,43 @@ aws apigatewayv2 get-models --api-id <id>
|
||||
## Call API
|
||||
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
|
||||
```
|
||||
|
||||
{{#endtab }}
|
||||
{{#endtabs }}
|
||||
|
||||
## Different Authorizations to access API Gateway endpoints
|
||||
## Різні авторизації для доступу до кінцевих точок API Gateway
|
||||
|
||||
### Resource Policy
|
||||
### Політика ресурсів
|
||||
|
||||
It's possible to use resource policies to define who could call the API endpoints.\
|
||||
In the following example you can see that the **indicated IP cannot call** the endpoint `/resource_policy` via GET.
|
||||
Можливо використовувати політики ресурсів, щоб визначити, хто може викликати кінцеві точки API.\
|
||||
У наступному прикладі ви можете побачити, що **вказана IP-адреса не може викликати** кінцеву точку `/resource_policy` через GET.
|
||||
|
||||
<figure><img src="../../../images/image (256).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### IAM Authorizer
|
||||
### IAM Авторизатор
|
||||
|
||||
It's possible to set that a methods inside a path (a resource) requires IAM authentication to call it.
|
||||
Можливо встановити, що методи всередині шляху (ресурсу) вимагають IAM аутентифікації для виклику.
|
||||
|
||||
<figure><img src="https://lh3.googleusercontent.com/GGx-kfqNXu6zMqGidnO8_eR88fYPpJG-wNuBBnedAJntiRUEPTEScl7OvWthGYRiI_msYCdC6oBFvJc827Tb4-4UogxpOyrEXyst-8IDzP9DC2NOtXSY7w58L0baCAcBQjSyvBhJREvWWCtiboNYPSKuEw=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
When this is set you will receive the error `{"message":"Missing Authentication Token"}` when you try to reach the endpoint without any authorization.
|
||||
|
||||
One easy way to generate the expected token by the application is to use **curl**.
|
||||
Коли це встановлено, ви отримаєте помилку `{"message":"Missing Authentication Token"}`, коли спробуєте досягти кінцевої точки без будь-якої авторизації.
|
||||
|
||||
Один простий спосіб згенерувати очікуваний токен додатком - це використати **curl**.
|
||||
```bash
|
||||
$ curl -X <method> https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource> --user <AWS_ACCESS_KEY>:<AWS_SECRET_KEY> --aws-sigv4 "aws:amz:<region>:execute-api"
|
||||
```
|
||||
|
||||
Another way is to use the **`Authorization`** type **`AWS Signature`** inside **Postman**.
|
||||
Інший спосіб - використовувати тип **`Authorization`** **`AWS Signature`** всередині **Postman**.
|
||||
|
||||
<figure><img src="../../../images/image (168).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Set the accessKey and the SecretKey of the account you want to use and you can know authenticate against the API endpoint.
|
||||
|
||||
Both methods will generate an **Authorization** **header** such as:
|
||||
Встановіть accessKey та SecretKey облікового запису, який ви хочете використовувати, і ви зможете аутентифікуватися проти API-інтерфейсу.
|
||||
|
||||
Обидва методи згенерують **Authorization** **header** такий як:
|
||||
```
|
||||
AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2
|
||||
```
|
||||
|
||||
Note that in other cases the **Authorizer** might have been **bad coded** and just sending **anything** inside the **Authorization header** will **allow to see the hidden content**.
|
||||
Зверніть увагу, що в інших випадках **Authorizer** міг бути **погано закодований**, і просто відправка **будь-чого** в **Authorization header** дозволить **побачити прихований контент**.
|
||||
|
||||
### Request Signing Using Python
|
||||
|
||||
```python
|
||||
|
||||
pip install requests
|
||||
@@ -193,59 +184,56 @@ response = requests.get(url, auth=awsauth)
|
||||
print(response.text)
|
||||
|
||||
```
|
||||
|
||||
### Custom Lambda Authorizer
|
||||
|
||||
It's possible to use a lambda that based in a given token will **return an IAM policy** indicating if the user is **authorized to call the API endpoint**.\
|
||||
You can set each resource method that will be using the authoriser.
|
||||
Можливо використовувати лямбду, яка на основі даного токена **поверне IAM політику**, що вказує, чи користувач **уповноважений викликати API кінцеву точку**.\
|
||||
Ви можете налаштувати кожен метод ресурсу, який буде використовувати авторизатор.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Lambda Authorizer Code Example</summary>
|
||||
|
||||
```python
|
||||
import json
|
||||
|
||||
def lambda_handler(event, context):
|
||||
token = event['authorizationToken']
|
||||
method_arn = event['methodArn']
|
||||
token = event['authorizationToken']
|
||||
method_arn = event['methodArn']
|
||||
|
||||
if not token:
|
||||
return {
|
||||
'statusCode': 401,
|
||||
'body': 'Unauthorized'
|
||||
}
|
||||
if not token:
|
||||
return {
|
||||
'statusCode': 401,
|
||||
'body': 'Unauthorized'
|
||||
}
|
||||
|
||||
try:
|
||||
# Replace this with your own token validation logic
|
||||
if token == "your-secret-token":
|
||||
return generate_policy('user', 'Allow', method_arn)
|
||||
else:
|
||||
return generate_policy('user', 'Deny', method_arn)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {
|
||||
'statusCode': 500,
|
||||
'body': 'Internal Server Error'
|
||||
}
|
||||
try:
|
||||
# Replace this with your own token validation logic
|
||||
if token == "your-secret-token":
|
||||
return generate_policy('user', 'Allow', method_arn)
|
||||
else:
|
||||
return generate_policy('user', 'Deny', method_arn)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {
|
||||
'statusCode': 500,
|
||||
'body': 'Internal Server Error'
|
||||
}
|
||||
|
||||
def generate_policy(principal_id, effect, resource):
|
||||
policy = {
|
||||
'principalId': principal_id,
|
||||
'policyDocument': {
|
||||
'Version': '2012-10-17',
|
||||
'Statement': [
|
||||
{
|
||||
'Action': 'execute-api:Invoke',
|
||||
'Effect': effect,
|
||||
'Resource': resource
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
return policy
|
||||
policy = {
|
||||
'principalId': principal_id,
|
||||
'policyDocument': {
|
||||
'Version': '2012-10-17',
|
||||
'Statement': [
|
||||
{
|
||||
'Action': 'execute-api:Invoke',
|
||||
'Effect': effect,
|
||||
'Resource': resource
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
return policy
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Call it with something like:
|
||||
@@ -254,25 +242,25 @@ Call it with something like:
|
||||
</strong></code></pre>
|
||||
|
||||
> [!WARNING]
|
||||
> Depending on the Lambda code, this authorization might be vulnerable
|
||||
> Залежно від коду Lambda, ця авторизація може бути вразливою
|
||||
|
||||
Note that if a **deny policy is generated and returned** the error returned by API Gateway is: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
|
||||
Зверніть увагу, що якщо **генерується і повертається політика заборони**, помилка, повернена API Gateway, виглядає так: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
|
||||
|
||||
This way you could **identify this authorization** being in place.
|
||||
Таким чином, ви могли б **виявити цю авторизацію**.
|
||||
|
||||
### Required API Key
|
||||
### Необхідний API ключ
|
||||
|
||||
It's possible to set API endpoints that **require a valid API key** to contact it.
|
||||
Можна налаштувати API кінцеві точки, які **вимагають дійсний API ключ** для зв'язку з ними.
|
||||
|
||||
<figure><img src="../../../images/image (88).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
It's possible to generate API keys in the API Gateway portal and even set how much it can be used (in terms of requests per second and in terms of requests per month).
|
||||
Можна генерувати API ключі в порталі API Gateway і навіть налаштувати, скільки разів їх можна використовувати (в термінах запитів на секунду та в термінах запитів на місяць).
|
||||
|
||||
To make an API key work, you need to add it to a **Usage Plan**, this usage plan mus be added to the **API Stage** and the associated API stage needs to have a configured a **method throttling** to the **endpoint** requiring the API key:
|
||||
Щоб API ключ працював, потрібно додати його до **Плану використання**, цей план використання повинен бути доданий до **Стадії API**, а асоційована стадія API повинна мати налаштоване **обмеження методів** для **кінцевої точки**, що вимагає API ключа:
|
||||
|
||||
<figure><img src="../../../images/image (198).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Unauthenticated Access
|
||||
## Неавтентифікований доступ
|
||||
|
||||
{{#ref}}
|
||||
../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md
|
||||
@@ -284,20 +272,16 @@ To make an API key work, you need to add it to a **Usage Plan**, this usage plan
|
||||
../aws-privilege-escalation/aws-apigateway-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Post Exploitation
|
||||
## Постексплуатація
|
||||
|
||||
{{#ref}}
|
||||
../aws-post-exploitation/aws-api-gateway-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Persistence
|
||||
## Постійність
|
||||
|
||||
{{#ref}}
|
||||
../aws-persistence/aws-api-gateway-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user