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
Ресурси: У API Gateway ресурси - це компоненти, які складають структуру вашого API. Вони представляють різні шляхи або кінцеві точки вашого API та відповідають різним діям, які підтримує ваше API. Ресурс - це кожен метод (наприклад, GET, POST, PUT, DELETE) всередині кожного шляху (/, або /users, або /user/{id}.
Етапи: Етапи в API Gateway представляють різні версії або середовища вашого API, такі як розробка, стадіонування або продакшн. Ви можете використовувати етапи для управління та розгортання декількох версій вашого API одночасно, що дозволяє вам тестувати нові функції або виправлення помилок без впливу на середовище продакшн. Етапи також підтримують змінні етапу, які є пари ключ-значення, які можна використовувати для налаштування поведінки вашого API на основі поточного етапу. Наприклад, ви можете використовувати змінні етапу для направлення запитів API до різних функцій Lambda або інших служб забезпечення залежно від етапу.
Етап вказується на початку URL-адреси точки входу API Gateway.
Авторизатори: Авторизатори в API Gateway відповідають за контроль доступу до вашого API, перевіряючи ідентичність викликача перед тим, як дозволити запиту продовжуватися. Ви можете використовувати функції AWS Lambda як власні авторизатори, що дозволяє вам реалізувати власну логіку аутентифікації та авторизації. Коли надходить запит, API Gateway передає токен авторизації запиту авторизатору Lambda, який обробляє токен і повертає політику IAM, яка визначає, які дії дозволено виконувати викликачеві. API Gateway також підтримує вбудовані авторизатори, такі як AWS Identity and Access Management (IAM) та Amazon Cognito.
Політика ресурсів: Політика ресурсів в 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 infoawsapigatewayget-accountawsapigatewayget-domain-namesawsapigatewayget-usage-plansawsapigatewayget-vpc-linksawsapigatewayget-client-certificates# Enumerate APIsawsapigatewayget-rest-apis# This will also show the resource policy (if any)## Get stagesawsapigatewayget-stages--rest-api-id<id>## Get resourcesawsapigatewayget-resources--rest-api-id<id>## Get API resource action per HTTP verb (check authorizers and api key required)awsapigatewayget-method--http-methodGET--rest-api-id<api-id>--resource-id<resource-id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>## API authorizersawsapigatewayget-authorizers--rest-api-id<id>## Modelsawsapigatewayget-models--rest-api-id<id>## More infoawsapigatewayget-gateway-responses--rest-api-id<id>awsapigatewayget-request-validators--rest-api-id<id>awsapigatewayget-deployments--rest-api-id<id># Get api keys generatedawsapigatewayget-api-keys--include-valueawsapigatewayget-api-key--api-key<id>--include-value# Get just 1## Example use API keycurl-XGET-H"x-api-key: AJE&Ygenu4[..]"https://e83uuftdi8.execute-api.us-east-1.amazonaws.com/dev/test## Usage plansawsapigatewayget-usage-plans#Get limit use infoawsapigatewayget-usage-plan-keys--usage-plan-id<plan_id>#Get clear text values of api keysawsapigatewayget-usage-plan-key--usage-plan-id<plan_id>--key-id<key_id>###Already consumedawsapigatewayget-usage--usage-plan-id<plan_id>--start-date2023-07-01--end-date2023-07-12
# Generic infoawsapigatewayv2get-account--awsapigatewayv2get-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-usage-plans--awsapigatewayv2get-vpc-linksawsapigatewayv2get-client-certificates--# Enumerate APIsawsapigatewayv2get-apis# This will also show the resource policy (if any)awsapigatewayv2get-api--api-id<id>## Get all the info from an api at onceawsapigatewayv2export-api--api-id<id>--output-typeYAML--specificationOAS30/tmp/api.yaml## Get stagesawsapigatewayv2get-stages--api-id<id>## Get routesawsapigatewayv2get-routes--api-id<id>awsapigatewayv2get-route--api-id<id>--route-id<route-id>## Get deploymentsawsapigatewayv2get-deployments--api-id<id>awsapigatewayv2get-deployment--api-id<id>--deployment-id<dep-id>## Get integrationsawsapigatewayv2get-integrations--api-id<id>## Get authorizersawsapigatewayv2get-authorizers--api-id<id>awsapigatewayv2get-authorizer--api-id<id>--authorizer-id<uth-id>## Get domain mappingsawsapigatewayv2get-api-mappings--api-id<id>--domain-name<dom-name>awsapigatewayv2get-api-mapping--api-id<id>--api-mapping-id<map-id>--domain-name<dom-name>## Get modelsawsapigatewayv2get-models--api-id<id>## Call APIhttps://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
Різні авторизації для доступу до кінцевих точок API Gateway
Політика ресурсів
Можна використовувати політику ресурсів для визначення, хто може викликати кінцеві точки API.
У наступному прикладі можна побачити, що вказана IP-адреса не може викликати кінцеву точку /resource_policy через GET.
IAM Авторизатор
Можливо встановити, що методи всередині шляху (ресурсу) вимагають аутентифікацію IAM для його виклику.
Коли це встановлено, ви отримаєте помилку {"message":"Missing Authentication Token"}, коли спробуєте дістатися до кінцевої точки без будь-якої авторизації.
Один простий спосіб згенерувати очікуваний токен за допомогою додатка - використовувати тип AuthorizationAWS Signature всередині Postman.
Встановіть accessKey та SecretKey облікового запису, який ви хочете використовувати, і ви зможете аутентифікуватися проти кінцевої точки API.
Зверніть увагу, що у інших випадках Авторизатор може бути погано закодованим і просто надсилання будь-чого всередині заголовка авторизації дозволить побачити схований вміст.
Можливо використовувати лямбду, яка на основі наданого токену поверне політику IAM, вказуючи, чи має користувач доступ до виклику кінцевої точки API.
Ви можете встановити кожний метод ресурсу, який буде використовувати авторизатор.
</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>