AWS API Gateway to kompleksowa usługa oferowana przez Amazon Web Services (AWS), zaprojektowana dla programistów do tworzenia, publikowania i nadzorowania API na dużą skalę. Działa jako punkt wejścia do aplikacji, pozwalając programistom ustalić ramy zasad i procedur. Te ramy regulują dostęp zewnętrznych użytkowników do określonych danych lub funkcjonalności w aplikacji.
API Gateway umożliwia zdefiniowanie jak żądania do twoich API powinny być obsługiwane, a także może tworzyć niestandardowe punkty końcowe API z określonymi metodami (np. GET, POST, PUT, DELETE) i zasobami. Może również generować zestawy SDK (Software Development Kits) dla klientów, aby ułatwić programistom wywoływanie twoich API z ich aplikacji.
Typy API Gateway
HTTP API: Twórz niskolatencyjne i opłacalne REST API z wbudowanymi funkcjami takimi jak OIDC i OAuth2 oraz natywnym wsparciem CORS. Działa z następującymi: Lambda, HTTP backends.
WebSocket API: Twórz API WebSocket z użyciem trwałych połączeń do zastosowań w czasie rzeczywistym, takich jak aplikacje czatu lub pulpity nawigacyjne. Działa z następującymi: Lambda, HTTP, AWS Services.
REST API: Rozwijaj REST API, w którym masz pełną kontrolę nad żądaniem i odpowiedzią oraz możliwościami zarządzania API. Działa z następującymi: Lambda, HTTP, AWS Services.
REST API Prywatne: Twórz REST API, które jest dostępne tylko z wewnątrz VPC.
Główne komponenty API Gateway
Zasoby: W API Gateway zasoby to komponenty, które tworzą strukturę twojego API. Reprezentują różne ścieżki lub punkty końcowe twojego API i odpowiadają różnym akcjom, które twoje API obsługuje. Zasobem jest każda metoda (np. GET, POST, PUT, DELETE) w każdej ścieżce (/, lub /users, lub /user/{id}).
Etapy: Etapy w API Gateway reprezentują różne wersje lub środowiska twojego API, takie jak rozwój, testowanie lub produkcja. Możesz używać etapów do zarządzania i wdrażania wielu wersji twojego API jednocześnie, co pozwala na testowanie nowych funkcji lub poprawek błędów bez wpływu na środowisko produkcyjne. Etapy również obsługują zmienne etapu, które są parami klucz-wartość, które mogą być używane do konfigurowania zachowania twojego API w zależności od aktualnego etapu. Na przykład, możesz użyć zmiennych etapu, aby kierować żądania API do różnych funkcji Lambda lub innych usług backendowych w zależności od etapu.
Etap jest wskazywany na początku URL punktu końcowego API Gateway.
Autoryzatory: Autoryzatory w API Gateway są odpowiedzialne za kontrolowanie dostępu do twojego API poprzez weryfikację tożsamości wywołującego przed pozwoleniem na kontynuację żądania. Możesz używać funkcji AWS Lambda jako niestandardowych autoryzatorów, co pozwala na wdrożenie własnej logiki uwierzytelniania i autoryzacji. Gdy żądanie przychodzi, API Gateway przekazuje token autoryzacji żądania do autoryzatora Lambda, który przetwarza token i zwraca politykę IAM, która określa, jakie działania wywołujący może wykonać. API Gateway obsługuje również wbudowane autoryzatory, takie jak AWS Identity and Access Management (IAM) i Amazon Cognito.
Polityka zasobów: Polityka zasobów w API Gateway to dokument JSON, który definiuje uprawnienia do dostępu do twojego API. Jest podobna do polityki IAM, ale specjalnie dostosowana do API Gateway. Możesz użyć polityki zasobów, aby kontrolować, kto może uzyskać dostęp do twojego API, które metody mogą wywoływać i z jakich adresów IP lub VPC mogą się łączyć. Polityki zasobów mogą być używane w połączeniu z autoryzatorami, aby zapewnić szczegółową kontrolę dostępu do twojego API.
Aby wprowadzić zmiany, API musi być ponownie wdrożone po modyfikacji polityki zasobów.
Logowanie
Domyślnie CloudWatch Logs są wyłączone, logowanie dostępu jest wyłączone, a śledzenie X-Ray jest również wyłączone.
Enumeracja
Zauważ, że w obu API AWS do enumeracji zasobów (apigateway i apigatewayv2) jedynym uprawnieniem, którego potrzebujesz i jedynym uprawnieniem do odczytu, które można przyznać, jest apigateway:GET, dzięki czemu możesz enumerować wszystko.
# 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-domain-namesawsapigatewayv2get-domain-name--domain-name<name>awsapigatewayv2get-vpc-links# 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>
Różne autoryzacje do uzyskania dostępu do punktów końcowych API Gateway
Polityka zasobów
Możliwe jest użycie polityk zasobów do zdefiniowania, kto może wywoływać punkty końcowe API.
W poniższym przykładzie widać, że wskazany adres IP nie może wywołać punktu końcowego /resource_policy za pomocą GET.
Autoryzator IAM
Możliwe jest ustawienie, że metody w obrębie ścieżki (zasobu) wymagają uwierzytelnienia IAM do ich wywołania.
Gdy to jest ustawione, otrzymasz błąd {"message":"Missing Authentication Token"} gdy spróbujesz uzyskać dostęp do punktu końcowego bez jakiejkolwiek autoryzacji.
Jednym z łatwych sposobów na wygenerowanie oczekiwanego tokena przez aplikację jest użycie typu AuthorizationAWS Signature w Postmanie.
Ustaw accessKey i SecretKey konta, którego chcesz użyć, a będziesz mógł uwierzytelnić się w punkcie końcowym API.
Możliwe jest użycie lambdy, która na podstawie danego tokena zwróci politykę IAM, wskazując, czy użytkownik jest uprawniony do wywołania punktu końcowego API.
Możesz ustawić każdą metodę zasobu, która będzie korzystać z autoryzatora.
</details>
Wywołaj to za pomocą czegoś takiego:
<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'>
W zależności od kodu Lambda, ta autoryzacja może być podatna
</div>
Zauważ, że jeśli **zostanie wygenerowana i zwrócona polityka odmowy**, błąd zwrócony przez API Gateway to: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
W ten sposób możesz **zidentyfikować tę autoryzację**.
### Wymagany klucz API
Możliwe jest ustawienie punktów końcowych API, które **wymagają ważnego klucza API** do kontaktu.
<figure><img src="../../../.gitbook/assets/image (88).png" alt=""><figcaption></figcaption></figure>
Możliwe jest generowanie kluczy API w portalu API Gateway, a nawet ustawienie, jak często mogą być używane (w kategoriach żądań na sekundę i w kategoriach żądań na miesiąc).
Aby klucz API działał, musisz dodać go do **Planu Użytkowania**, ten plan użytkowania musi być dodany do **Etapu API**, a powiązany etap API musi mieć skonfigurowane **ograniczenie metod** dla **punktu końcowego** wymagającego klucza API:
<figure><img src="../../../.gitbook/assets/image (198).png" alt=""><figcaption></figcaption></figure>
## Nieautoryzowany dostęp
<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>
## Privesc
<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>
## Po eksploatacji
<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>
## Utrzymywanie
<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>
<div data-gb-custom-block data-tag="hint" data-style='success'>
Ucz się i ćwicz Hacking AWS:<img src="/.gitbook/assets/image.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/image.png" alt="" data-size="line">\
Ucz się i ćwicz Hacking GCP: <img src="/.gitbook/assets/image (2).png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/image (2).png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Wsparcie HackTricks</summary>
* Sprawdź [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się sztuczkami hackingowymi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów github.
</details>
</div>