# AWS - API Gateway Enum {{#include ../../../banners/hacktricks-training.md}} ## 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. 3. **Авторизатори**: Авторизатори в API Gateway відповідають за **контроль доступу до вашого API**, перевіряючи особу виклику перед тим, як дозволити запиту продовжити. Ви можете використовувати **функції AWS Lambda** як користувацькі авторизатори, що дозволяє вам реалізувати власну логіку аутентифікації та авторизації. Коли запит надходить, API Gateway передає токен авторизації запиту авторизатору Lambda, який обробляє токен і повертає політику IAM, що визначає, які дії може виконувати викликач. API Gateway також підтримує **вбудовані авторизатори**, такі як **AWS Identity and Access Management (IAM)** та **Amazon Cognito**. 4. **Політика ресурсу**: Політика ресурсу в 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`**, з цим ви можете **перерахувати все.** {{#tabs }} {{#tab name="apigateway" }} ```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 ## Get resources aws apigateway get-resources --rest-api-id ## Get API resource action per HTTP verb (check authorizers and api key required) aws apigateway get-method --http-method GET --rest-api-id --resource-id ## Call API https://.execute-api..amazonaws.com// ## API authorizers aws apigateway get-authorizers --rest-api-id ## Models aws apigateway get-models --rest-api-id ## More info aws apigateway get-gateway-responses --rest-api-id aws apigateway get-request-validators --rest-api-id aws apigateway get-deployments --rest-api-id # Get api keys generated aws apigateway get-api-keys --include-value aws apigateway get-api-key --api-key --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 #Get clear text values of api keys aws apigateway get-usage-plan-key --usage-plan-id --key-id ###Already consumed aws apigateway get-usage --usage-plan-id --start-date 2023-07-01 --end-date 2023-07-12 ``` {{#endtab }} {{#tab name="apigatewayv2" }} ```bash # Generic info aws apigatewayv2 get-domain-names aws apigatewayv2 get-domain-name --domain-name aws apigatewayv2 get-vpc-links # Enumerate APIs aws apigatewayv2 get-apis # This will also show the resource policy (if any) aws apigatewayv2 get-api --api-id ## Get all the info from an api at once aws apigatewayv2 export-api --api-id --output-type YAML --specification OAS30 /tmp/api.yaml ## Get stages aws apigatewayv2 get-stages --api-id ## Get routes aws apigatewayv2 get-routes --api-id aws apigatewayv2 get-route --api-id --route-id ## Get deployments aws apigatewayv2 get-deployments --api-id aws apigatewayv2 get-deployment --api-id --deployment-id ## Get integrations aws apigatewayv2 get-integrations --api-id ## Get authorizers aws apigatewayv2 get-authorizers --api-id aws apigatewayv2 get-authorizer --api-id --authorizer-id ## Get domain mappings aws apigatewayv2 get-api-mappings --api-id --domain-name aws apigatewayv2 get-api-mapping --api-id --api-mapping-id --domain-name ## Get models aws apigatewayv2 get-models --api-id ## Call API https://.execute-api..amazonaws.com// ``` {{#endtab }} {{#endtabs }} ## Різні авторизації для доступу до кінцевих точок API Gateway ### Політика ресурсів Можливо використовувати політики ресурсів, щоб визначити, хто може викликати кінцеві точки API.\ У наступному прикладі ви можете побачити, що **вказана IP-адреса не може викликати** кінцеву точку `/resource_policy` через GET.
### IAM Авторизатор Можливо встановити, що методи всередині шляху (ресурсу) вимагають IAM аутентифікації для виклику.
Коли це встановлено, ви отримаєте помилку `{"message":"Missing Authentication Token"}`, коли спробуєте досягти кінцевої точки без будь-якої авторизації. Один із простих способів згенерувати очікуваний токен додатком - це використати **curl**. ```bash $ curl -X https://.execute-api..amazonaws.com// --user : --aws-sigv4 "aws:amz::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://.execute-api.us-east-1.amazonaws.com//' 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 ключа:
## Неавтентифікований доступ {{#ref}} ../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md {{#endref}} ## Privesc {{#ref}} ../aws-privilege-escalation/aws-apigateway-privesc/README.md {{#endref}} ## Постексплуатація {{#ref}} ../aws-post-exploitation/aws-api-gateway-post-exploitation/README.md {{#endref}} ## Постійність {{#ref}} ../aws-persistence/aws-api-gateway-persistence/README.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}