AWS - API Gateway Enum

Reading time: 10 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

API Gateway

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

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

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

Типи API Gateway

  • 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

  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 також вимкнено.

Перерахування

tip

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

bash
# 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"}, коли спробуєте досягти кінцевої точки без будь-якої авторизації.

Один із простих способів згенерувати очікуваний токен додатком - це використати 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"

Інший спосіб - використовувати тип Authorization AWS Signature всередині Postman.

Встановіть 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

Зверніть увагу, що в інших випадках Authorizer міг бути погано закодований, і просто відправка будь-чого в Authorization header дозволить побачити прихований контент.

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

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

Можливо використовувати 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

Викличте це з чимось на кшталт:

curl "https://jhhqafgh6f.execute-api.eu-west-1.amazonaws.com/prod/custom_auth" -H 'Authorization: your-secret-token'

warning

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

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

Таким чином, ви могли б виявити цю авторизацію.

Необхідний API ключ

Можливо налаштувати API кінцеві точки, які вимагають дійсний API ключ для зв'язку з ними.

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

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

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

AWS - API Gateway Unauthenticated Enum

Privesc

AWS - Apigateway Privesc

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

AWS - API Gateway Post Exploitation

Постійність

AWS - API Gateway Persistence

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks