AWS - API Gateway Enum

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

API Gateway

Основна інформація

AWS API Gateway - це комплексний сервіс, який пропонується Amazon Web Services (AWS) для розробників з метою створення, публікації та контролю API великого масштабу. Він діє як точка входу до додатка, дозволяючи розробникам встановлювати рамки правил та процедур. Ця рамка регулює доступ зовнішніх користувачів до певних даних або функцій у додатку.

API Gateway дозволяє визначити як повинні оброблятися запити до ваших API, і може створювати власні API-точки з конкретними методами (наприклад, GET, POST, PUT, DELETE) та ресурсами. Він також може генерувати SDK клієнта (набори розробки програмного забезпечення), щоб зробити виклики ваших API з їх додатків розробникам легше.

Типи API Gateways

  • HTTP API: Створюйте низьколатентні та ефективні з точки зору витрат REST API з вбудованими функціями, такими як 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

  1. Ресурси: У API Gateway ресурси - це компоненти, які складають структуру вашого API. Вони представляють різні шляхи або кінцеві точки вашого API та відповідають різним діям, які підтримує ваше API. Ресурс - це кожен метод (наприклад, GET, POST, PUT, DELETE) всередині кожного шляху (/, або /users, або /user/{id}.

  2. Етапи: Етапи в API Gateway представляють різні версії або середовища вашого API, такі як розробка, стадіонування або продакшн. Ви можете використовувати етапи для управління та розгортання декількох версій вашого API одночасно, що дозволяє вам тестувати нові функції або виправлення помилок без впливу на середовище продакшн. Етапи також підтримують змінні етапу, які є пари ключ-значення, які можна використовувати для налаштування поведінки вашого API на основі поточного етапу. Наприклад, ви можете використовувати змінні етапу для направлення запитів API до різних функцій Lambda або інших служб забезпечення залежно від етапу.

  • Етап вказується на початку URL-адреси точки входу API Gateway.

  1. Авторизатори: Авторизатори в API Gateway відповідають за контроль доступу до вашого API, перевіряючи ідентичність викликача перед тим, як дозволити запиту продовжуватися. Ви можете використовувати функції AWS Lambda як власні авторизатори, що дозволяє вам реалізувати власну логіку аутентифікації та авторизації. Коли надходить запит, API Gateway передає токен авторизації запиту авторизатору Lambda, який обробляє токен і повертає політику IAM, яка визначає, які дії дозволено виконувати викликачеві. API Gateway також підтримує вбудовані авторизатори, такі як AWS Identity and Access Management (IAM) та Amazon Cognito.

  2. Політика ресурсів: Політика ресурсів в API Gateway - це JSON-документ, який визначає дозволи для доступу до вашого API. Вона схожа на політику IAM, але спеціально налаштована для API Gateway. Ви можете використовувати політику ресурсів для контролю, хто може отримати доступ до вашого API, які методи вони можуть викликати та з яких IP-адрес або VPC вони можуть підключатися. Політику ресурсів можна використовувати в поєднанні з авторизаторами, щоб забезпечити дрібнозерновий контроль доступу до вашого API.

  • Для того, щоб політика ресурсів набула чинності, API потрібно розгорнути знову після того, як було змінено політику ресурсів.

Логування

За замовчуванням CloudWatch Logs вимкнені, Access Logging вимкнений, а також вимкнений X-Ray tracing.

Перелік

Зверніть увагу, що в обох API AWS для переліку ресурсів (apigateway та apigatewayv2) єдине дозвіл, який вам потрібно, і єдиний дозвіл на читання, який можна надати, - це apigateway:GET, з цим ви можете перелічити все.

# Generic info
aws apigateway get-account
aws apigateway get-domain-names
aws apigateway get-usage-plans
aws apigateway get-vpc-links
aws apigateway get-client-certificates

# Enumerate APIs
aws apigateway get-rest-apis # This will also show the resource policy (if any)
## Get stages
aws apigateway get-stages --rest-api-id <id>
## Get resources
aws apigateway get-resources --rest-api-id <id>
## Get API resource action per HTTP verb (check authorizers and api key required)
aws apigateway get-method --http-method GET --rest-api-id <api-id> --resource-id <resource-id>

## Call API
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
## API authorizers
aws apigateway get-authorizers --rest-api-id <id>
## Models
aws apigateway get-models --rest-api-id <id>
## More info
aws apigateway get-gateway-responses --rest-api-id <id>
aws apigateway get-request-validators --rest-api-id <id>
aws apigateway get-deployments --rest-api-id <id>

# Get api keys generated
aws apigateway get-api-keys --include-value
aws apigateway get-api-key --api-key <id> --include-value # Get just 1
## Example use API key
curl -X GET -H "x-api-key: AJE&Ygenu4[..]" https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test
## Usage plans
aws apigateway get-usage-plans #Get limit use info
aws apigateway get-usage-plan-keys --usage-plan-id <plan_id> #Get clear text values of api keys
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

Різні авторизації для доступу до кінцевих точок API Gateway

Політика ресурсів

Можна використовувати політику ресурсів для визначення, хто може викликати кінцеві точки API. У наступному прикладі можна побачити, що вказана IP-адреса не може викликати кінцеву точку /resource_policy через GET.

IAM Авторизатор

Можливо встановити, що методи всередині шляху (ресурсу) вимагають аутентифікацію IAM для його виклику.

Коли це встановлено, ви отримаєте помилку {"message":"Missing Authentication Token"}, коли спробуєте дістатися до кінцевої точки без будь-якої авторизації.

Один простий спосіб згенерувати очікуваний токен за допомогою додатка - використовувати тип Authorization AWS Signature всередині Postman.

Встановіть accessKey та SecretKey облікового запису, який ви хочете використовувати, і ви зможете аутентифікуватися проти кінцевої точки API.

Це згенерує заголовок авторизації такий як:

AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2

Зверніть увагу, що у інших випадках Авторизатор може бути погано закодованим і просто надсилання будь-чого всередині заголовка авторизації дозволить побачити схований вміст.

Підпис запиту за допомогою Python


pip install requests
pip install requests-aws4auth
pip install boto3

import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'us-east-1'  # Region
service = 'execute-api'
access_key = 'YOUR_ACCESS_KEY'
secret_key = 'YOUR_SECRET_KEY'

url = 'https://<apiid>.execute-api.us-east-1.amazonaws.com/<stage>/<resource>'

session = boto3.Session(aws_access_key_id=access_key, aws_secret_access_key=secret_key)
credentials = session.get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

response = requests.get(url, auth=awsauth)

print(response.text)

Спеціальний авторизатор Lambda

Можливо використовувати лямбду, яка на основі наданого токену поверне політику IAM, вказуючи, чи має користувач доступ до виклику кінцевої точки API. Ви можете встановити кожний метод ресурсу, який буде використовувати авторизатор.

Приклад коду авторизатора Lambda

```python import json

def lambda_handler(event, context): token = event['authorizationToken'] method_arn = event['methodArn']

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' }

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

</details>

Викличте його щось на зразок:

<pre class="language-bash" data-overflow="wrap"><code class="lang-bash"><strong>curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'
</strong></code></pre>

<div data-gb-custom-block data-tag="hint" data-style='warning'>

Залежно від коду Lambda, ця авторизація може бути вразливою

</div>

Зверніть увагу, що якщо **генерується та повертається політика відмови**, помилка, яку повертає API Gateway, буде: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Таким чином ви можете **визначити, що ця авторизація** встановлена.

### Обов'язковий API ключ

Можливо встановити API-точки, які **вимагають дійсного API ключа** для звернення до них.

<figure><img src="../../../.gitbook/assets/image (92) (1).png" alt=""><figcaption></figcaption></figure>

Можливо створити API ключі в порталі API Gateway та навіть встановити, скільки разів його можна використовувати (в термінах запитів на секунду та в термінах запитів на місяць).

Щоб API ключ працював, вам потрібно додати його до **Плану використання**, цей план використання має бути доданий до **Етапу API** і пов'язаний етап API повинен мати налаштоване **обмеження методу** до **точки доступу**, яка вимагає API ключа:

<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>

## Неаутентифікований доступ

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md'>

[aws-api-gateway-unauthenticated-enum.md](../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md)

</div>

## Підвищення привілеїв

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-privilege-escalation/aws-apigateway-privesc.md'>

[aws-apigateway-privesc.md](../aws-privilege-escalation/aws-apigateway-privesc.md)

</div>

## Пост-експлуатація

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-post-exploitation/aws-api-gateway-post-exploitation.md'>

[aws-api-gateway-post-exploitation.md](../aws-post-exploitation/aws-api-gateway-post-exploitation.md)

</div>

### Збереження

<div data-gb-custom-block data-tag="content-ref" data-url='../aws-persistence/aws-api-gateway-persistence.md'>

[aws-api-gateway-persistence.md](../aws-persistence/aws-api-gateway-persistence.md)

</div>

<details>

<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

Інші способи підтримки HackTricks:

* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поділіться своїми хакінг-трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.

</details>

Last updated