13 KiB
AWS - API Gateway Enum
{{#include ../../../banners/hacktricks-training.md}}
API Gateway
Temel Bilgiler
AWS API Gateway, geliştiricilerin büyük ölçekli API'ler oluşturmasına, yayınlamasına ve denetlemesine olanak tanıyan Amazon Web Services (AWS) tarafından sunulan kapsamlı bir hizmettir. Uygulamaya bir giriş noktası olarak işlev görür ve geliştiricilerin bir dizi kural ve prosedür belirlemesine izin verir. Bu çerçeve, dış kullanıcıların uygulama içindeki belirli verilere veya işlevlere erişimini yönetir.
API Gateway, API'lerinize gelen isteklerin nasıl işleneceğini tanımlamanıza olanak tanır ve belirli yöntemler (örneğin, GET, POST, PUT, DELETE) ve kaynaklarla özel API uç noktaları oluşturabilir. Ayrıca, geliştiricilerin uygulamalarından API'lerinizi çağırmasını kolaylaştırmak için istemci SDK'ları (Yazılım Geliştirme Kitleri) oluşturabilir.
API Gateway Türleri
- HTTP API: OIDC ve OAuth2 gibi yerleşik özelliklere ve yerel CORS desteğine sahip düşük gecikme süresine ve maliyet etkin REST API'leri oluşturun. Aşağıdakilerle çalışır: Lambda, HTTP arka uçları.
- WebSocket API: Sohbet uygulamaları veya panolar gibi gerçek zamanlı kullanım senaryoları için kalıcı bağlantılar kullanarak bir WebSocket API oluşturun. Aşağıdakilerle çalışır: Lambda, HTTP, AWS Hizmetleri.
- REST API: İstek ve yanıt üzerinde tam kontrol elde ettiğiniz ve API yönetim yeteneklerine sahip bir REST API geliştirin. Aşağıdakilerle çalışır: Lambda, HTTP, AWS Hizmetleri.
- Özel REST API: Sadece bir VPC içinden erişilebilen bir REST API oluşturun.
API Gateway Ana Bileşenleri
- Kaynaklar: API Gateway'de kaynaklar, API'nizin yapısını oluşturan bileşenlerdir. API'nizin farklı yollarını veya uç noktalarını temsil eder ve API'nizin desteklediği çeşitli eylemlerle ilişkilidir. Bir kaynak, her yolun (/, veya /users, veya /user/{id}) içindeki her yöntemdir (örneğin, GET, POST, PUT, DELETE).
- Aşamalar: API Gateway'deki aşamalar, API'nizin farklı sürümlerini veya ortamlarını temsil eder; örneğin, geliştirme, test veya üretim. Aşamaları, API'nizin birden fazla sürümünü aynı anda yönetmek ve dağıtmak için kullanabilirsiniz; bu, yeni özellikleri veya hata düzeltmelerini üretim ortamını etkilemeden test etmenizi sağlar. Aşamalar ayrıca, mevcut aşamaya göre API'nizin davranışını yapılandırmak için kullanılabilecek anahtar-değer çiftleri olan aşama değişkenlerini de destekler. Örneğin, aşama değişkenlerini kullanarak API isteklerini aşamaya bağlı olarak farklı Lambda işlevlerine veya diğer arka uç hizmetlerine yönlendirebilirsiniz.
- Aşama, API Gateway uç noktasının URL'sinin başında belirtilir.
- Yetkilendiriciler: API Gateway'deki yetkilendiriciler, isteğin devam etmesine izin vermeden önce çağrının kimliğini doğrulayarak API'nize erişimi kontrol etmekten sorumludur. Kendi kimlik doğrulama ve yetkilendirme mantığınızı uygulamanıza olanak tanıyan özel yetkilendiriciler olarak AWS Lambda işlevlerini kullanabilirsiniz. Bir istek geldiğinde, API Gateway isteğin yetkilendirme jetonunu Lambda yetkilendiricisine iletir; bu, jetonu işler ve çağrının hangi eylemleri gerçekleştirmesine izin verildiğini belirleyen bir IAM politikası döner. API Gateway ayrıca, AWS Kimlik ve Erişim Yönetimi (IAM) ve Amazon Cognito gibi yerleşik yetkilendiricileri de destekler.
- Kaynak Politikası: API Gateway'deki bir kaynak politikası, API'nize erişim için izinleri tanımlayan bir JSON belgesidir. IAM politikasına benzer, ancak özellikle API Gateway için özelleştirilmiştir. Bir kaynak politikasını, API'nize kimin erişebileceğini, hangi yöntemleri çağırabileceğini ve hangi IP adreslerinden veya VPC'lerden bağlanabileceğini kontrol etmek için kullanabilirsiniz. Kaynak politikaları, API'niz için ince ayar erişim kontrolü sağlamak üzere yetkilendiricilerle birleştirilebilir.
- Değişikliklerin etkili olabilmesi için API'nin kaynak politikası değiştirildikten sonra tekrar dağıtılması gerekir.
Günlükleme
Varsayılan olarak, CloudWatch Logs kapalıdır, Erişim Günlüğü kapalıdır ve X-Ray izleme de kapalıdır.
Sayım
Tip
Hem
apigatewayhem deapigatewayv2AWS API'lerinde kaynakları saymak için tek ihtiyacınız olan izin ve verilebilecek tek okuma izniapigateway:GET'dir; bununla her şeyi sayabilirsiniz.
{{#tabs }} {{#tab name="apigateway" }}
# 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
{{#endtab }}
{{#tab name="apigatewayv2" }}
# Generic info
aws apigatewayv2 get-domain-names
aws apigatewayv2 get-domain-name --domain-name <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 <id>
## Get all the info from an api at once
aws apigatewayv2 export-api --api-id <id> --output-type YAML --specification OAS30 /tmp/api.yaml
## Get stages
aws apigatewayv2 get-stages --api-id <id>
## Get routes
aws apigatewayv2 get-routes --api-id <id>
aws apigatewayv2 get-route --api-id <id> --route-id <route-id>
## Get deployments
aws apigatewayv2 get-deployments --api-id <id>
aws apigatewayv2 get-deployment --api-id <id> --deployment-id <dep-id>
## Get integrations
aws apigatewayv2 get-integrations --api-id <id>
## Get authorizers
aws apigatewayv2 get-authorizers --api-id <id>
aws apigatewayv2 get-authorizer --api-id <id> --authorizer-id <uth-id>
## Get domain mappings
aws apigatewayv2 get-api-mappings --api-id <id> --domain-name <dom-name>
aws apigatewayv2 get-api-mapping --api-id <id> --api-mapping-id <map-id> --domain-name <dom-name>
## Get models
aws apigatewayv2 get-models --api-id <id>
## Call API
https://<api-id>.execute-api.<region>.amazonaws.com/<stage>/<resource>
{{#endtab }} {{#endtabs }}
API Gateway uç noktalarına erişim için Farklı Yetkilendirmeler
Kaynak Politikası
API uç noktalarını kimin çağırabileceğini tanımlamak için kaynak politikaları kullanmak mümkündür.
Aşağıdaki örnekte, belirtilen IP'nin /resource_policy uç noktasını GET ile çağırmasının mümkün olmadığı görülmektedir.

IAM Yetkilendirici
Bir yol (kaynak) içindeki bir metodun çağrılması için IAM kimlik doğrulaması gerektirecek şekilde ayarlanması mümkündür.
Bu ayar yapıldığında, herhangi bir yetkilendirme olmadan uç noktaya ulaşmaya çalıştığınızda {"message":"Missing Authentication Token"} hatasını alırsınız.
Uygulamanın beklediği token'ı oluşturmanın kolay bir yolu curl kullanmaktır.
$ 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"
Başka bir yol, Postman içinde Authorization türü AWS Signature kullanmaktır.

Kullanmak istediğiniz hesabın accessKey ve SecretKey'sini ayarlayın ve API uç noktasına karşı kimlik doğrulaması yapabilirsiniz.
Her iki yöntem de aşağıdaki gibi bir Authorization header oluşturacaktır:
AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2
Not edin ki diğer durumlarda Authorizer kötü kodlanmış olabilir ve Authorization header içine herhangi bir şey göndermek gizli içeriği görmeye izin verebilir.
Python Kullanarak İstek İmzalama
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)
Özel Lambda Yetkilendiricisi
Verilen bir token'a dayalı olarak bir lambdanın IAM politikası döndürmesi ve kullanıcının API uç noktasını çağırma yetkisine sahip olup olmadığını belirtmesi mümkündür.
Yetkilendiriciyi kullanacak her kaynak yöntemini ayarlayabilirsiniz.
Lambda Yetkilendirici Kod Örneği
```python import jsondef 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>
Bunu şöyle çağırabilirsiniz:
<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>
> [!WARNING]
> Lambda koduna bağlı olarak, bu yetkilendirme zayıf olabilir
Eğer bir **reddetme politikası oluşturulup dönerse**, API Gateway tarafından dönen hata şudur: `{"Message":"User is not authorized to access this resource with an explicit deny"}`
Bu şekilde **bu yetkilendirmenin** mevcut olduğunu belirleyebilirsiniz.
### Gerekli API Anahtarı
API ile iletişim kurmak için **geçerli bir API anahtarı** gerektiren API uç noktaları ayarlamak mümkündür.
<figure><img src="../../../images/image (88).png" alt=""><figcaption></figcaption></figure>
API Gateway portalında API anahtarları oluşturmak ve bunların ne kadar kullanılabileceğini (saniye başına istek ve ayda istek açısından) ayarlamak mümkündür.
Bir API anahtarının çalışması için, onu bir **Kullanım Planı**'na eklemeniz gerekir, bu kullanım planı **API Aşaması**'na eklenmeli ve ilişkili API aşamasının, API anahtarını gerektiren **uç noktaya** yapılandırılmış bir **metot sınırlaması** olması gerekir:
<figure><img src="../../../images/image (198).png" alt=""><figcaption></figcaption></figure>
## Kimlik Doğrulaması Olmayan Erişim
{{#ref}}
../aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md
{{#endref}}
## Privesc
{{#ref}}
../aws-privilege-escalation/aws-apigateway-privesc.md
{{#endref}}
## Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-api-gateway-post-exploitation.md
{{#endref}}
## Süreklilik
{{#ref}}
../aws-persistence/aws-api-gateway-persistence.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}