AWS - API Gateway Enum

htARTE (HackTricks AWS Red Team Expert) ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!

HackTricks'i desteklemenin diğer yolları:

API Gateway

Temel Bilgiler

AWS API Gateway, geliştiricilerin büyük ölçekte API'ler oluşturmasına, yayınlamasına ve denetlemesine olanak tanıyan Amazon Web Services (AWS) tarafından sunulan kapsamlı bir hizmettir. Bir uygulamanın giriş noktası olarak işlev görerek, geliştiricilere belirli verilere veya işlevselliklere dış kullanıcıların erişimini düzenlemelerine olanak tanır.

API Gateway, API'lerinize gelen isteklerin nasıl ele alınması gerektiğini tanımlamanıza olanak tanır ve belirli yöntemlere (örneğin, GET, POST, PUT, DELETE) ve kaynaklara özgü özel API uç noktaları oluşturabilir. Ayrıca, geliştiricilerin uygulamalarından API'lerinizi çağırmayı kolaylaştırmak için istemci SDK'ları (Yazılım Geliştirme Kiti) oluşturabilir.

API Gateway Türleri

  • HTTP API: Dahili özellikler (OIDC ve OAuth2 gibi) ve yerleşik CORS desteği gibi özelliklere sahip düşük gecikmeli ve maliyet etkin REST API'leri oluşturun. Aşağıdaki ile çalışır: Lambda, HTTP arka uçlar.

  • WebSocket API: Sohbet uygulamaları veya panolar gibi gerçek zamanlı kullanım durumları için kalıcı bağlantılar kullanarak bir WebSocket API'si oluşturun. Aşağıdaki ile çalışır: Lambda, HTTP, AWS Hizmetleri.

  • REST API: Talep ve yanıt üzerinde tam kontrol sağladığınız REST API'si geliştirin ve API yönetimi yeteneklerine sahip olun. Aşağıdaki ile çalışır: Lambda, HTTP, AWS Hizmetleri.

  • REST API Private: Yalnızca bir VPC içinden erişilebilen bir REST API oluşturun.

API Gateway Ana Bileşenleri

  1. Kaynaklar: API Gateway'de kaynaklar, API'nızın yapısını oluşturan bileşenlerdir. API'nızın farklı yollarını veya uç noktalarını temsil eder ve API'nızın desteklediği çeşitli işlemlere karşılık gelir. Bir kaynak, her yolun (/, veya /kullanıcılar, veya /kullanıcı/{id}) içindeki her yöntemdir (örneğin, GET, POST, PUT, DELETE).

  2. Aşamalar: API Gateway'deki aşamalar, geliştirme, aşama veya üretim gibi API'nızın farklı sürümlerini veya ortamlarını temsil eder. Aşamaları kullanarak API'nızın çoklu sürümlerini eş zamanlı olarak yönetebilir ve dağıtabilirsiniz, böylece yeni özellikleri veya hata düzeltmelerini test edebilir ve üretim ortamını etkilemeden deneyebilirsiniz. Aşamalar ayrıca, API'nızın mevcut aşamaya bağlı olarak davranışını yapılandırmak için kullanılabilecek anahtar-değer çiftleri olan aşama değişkenlerini destekler. Örneğin, aşama değişkenlerini kullanarak API isteklerini 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.

  1. Yetkilendiriciler: API Gateway'deki yetkilendiriciler, isteğin devam etmesine izin vermeden önce çağrıyı yapanın kimliğini doğrulayarak API'nıza erişimi kontrol eden bileşenlerdir. AWS Lambda işlevlerini özel yetkilendiriciler olarak kullanabilirsiniz, bu da kendi kimlik doğrulama ve yetkilendirme mantığınızı uygulamanıza olanak tanır. Bir istek geldiğinde, API Gateway isteğin yetkilendirme belirtecini Lambda yetkilendiriciye ileterek, belirteci işler ve arayanın hangi işlemleri gerçekleştirmesine izin verildiğini belirleyen bir IAM politikası döndürür. API Gateway ayrıca, AWS Kimlik ve Erişim Yönetimi (IAM) ve Amazon Cognito gibi yerleşik yetkilendiricileri destekler.

  2. Kaynak Politikası: API Gateway'deki bir kaynak politikası, API'nıza erişim izinlerini tanımlayan bir JSON belgesidir. Bir IAM politikası gibi ancak özel olarak API Gateway için uyarlanmıştır. Bir kaynak politikasını kullanarak API'nıza kimlerin erişebileceğini, hangi yöntemleri çağırabileceğini ve hangi IP adreslerinden veya VPC'lerden bağlanabileceğini kontrol edebilirsiniz. Kaynak politikaları, API'nıza ince ayrıntılı erişim kontrolü sağlamak için yetkilendiricilerle birlikte kullanılabilir.

  • Kaynak politikası değiştirildikten sonra etkili olması için API'nın yeniden dağıtılması gerekir.

Günlükleme

Varsayılan olarak, CloudWatch Günlükleri kapalı, Erişim Günlüğü kapalı ve X-Ray izleme de kapalıdır.

Numaralandırma

Her iki AWS API'sında (apigateway ve apigatewayv2) kaynakları numaralandırmak için ihtiyacınız olan tek izin ve verilebilecek tek okuma izni apigateway:GET ile, bununla her şeyi numaralandırabilirsiniz.

# 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

AWS API Gateway v2 Enumerations

Supported Protocols

  • HTTP

  • WEBSOCKET

Integration Types

  • AWS

  • HTTP

  • MOCK

  • HTTP_PROXY

  • AWS_PROXY

Payload Encoding

  • JSON

  • VTL

  • TEXT

Route Key Types

  • METHOD

  • PATH

  • CONNECTIVITY_ID

  • MESSAGE_HEADER

  • MULTI_VALUE_HEADER

  • QUERY_STRING

  • SOURCE_IP

  • USER_AGENT

  • REQUESTED_ROUTE

  • AUTHORIZATION

  • AUTHORIZATION_SCOPES

  • AUTHORIZATION_CLAIMS -json

  • CUSTOM

Security Types

  • NONE

  • AWS_IAM

  • CUSTOM

Connection Types

  • INTERNET

  • VPC_LINK

Route Selection Expressions

  • $request.method

  • $request.path

  • $request.querystring

  • $request.header -json

  • $request.body

  • $context.authorizer.claims

  • $context.authorizer.scopes

  • $context.authorizer.principalId

  • $context.identity.sourceIp

  • $context.identity.userAgent

  • $context.routeKey

  • $context.stage

  • $context.requestId

  • $context.apiId

  • $context.domainName

  • $context.domainPrefix

  • $context.connectionId

  • $context.messageDirection

  • $context.error.message

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

  • $context.error.responseType

  • $context.error.statusCode

  • $context.error.messageString

  • $context.error.messageString

# Generic info
aws apigatewayv2 get-account --
aws apigatewayv2 get-domain-names
aws apigatewayv2 get-domain-name --domain-name <name>
aws apigatewayv2 get-usage-plans --
aws apigatewayv2 get-vpc-links
aws apigatewayv2 get-client-certificates --

# 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>

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ını kullanmak mümkündür. Aşağıdaki örnekte, belirtilen IP'nin GET üzerinden /resource_policy uç noktasını arayamayacağını görebilirsiniz.

IAM Yetkilendirici

Bir yol içindeki (bir kaynak) yöntemlerin, onu çağırmak için IAM kimlik doğrulaması gerektirdiği şekilde ayarlamak mümkündür.

Bu ayarlandığında, yetkilendirme olmadan uç noktaya ulaşmaya çalıştığınızda {"message":"Missing Authentication Token"} hatasını alırsınız.

Beklenen belirteci uygulama tarafından oluşturmanın kolay bir yolu, Postman içinde AWS Signature türündeki Authorization'ı kullanmaktır.

Kullanmak istediğiniz hesabın accessKey ve SecretKey'ini ayarlayın ve API uç noktasına karşı kimlik doğrulaması yapabilirsiniz.

Aşağıdaki gibi bir Yetkilendirme başlığı oluşturacaktır:

AWS4-HMAC-SHA256 Credential=AKIAYY7XU6ECUDOTWB7W/20220726/us-east-1/execute-api/aws4_request, SignedHeaders=host;x-amz-date, Signature=9f35579fa85c0d089c5a939e3d711362e92641e8c14cc571df8c71b4bc62a5c2

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 Yetkilendirme

Verilen bir belirteçe dayalı olarak bir IAM politikası döndürecek bir lambda kullanmak mümkündür, böylece kullanıcının API uç noktasını çağırma yetkisine sahip olup olmadığını belirtebilirsiniz. Yetkilendirmeyi kullanacak her kaynak yöntemini ayarlayabilirsiniz.

Lambda Yetkilendirme Kod Örneği

```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

</details>

Bunu şu şekilde çağırın:

<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 koduna bağlı olarak, bu yetkilendirme zayıf olabilir

</div>

**Reddetme politikası oluşturulursa ve geri döndürülürse**, API Gateway tarafından döndürülen hata: `{"Message":"User is not authorized to access this resource with an explicit deny"}`

Bu şekilde bu yetkilendirmenin varlığını **belirleyebilirsiniz**.

### Gerekli API Anahtarı

Bir API uç noktasını **iletişim kurmak için geçerli bir API anahtarı gerektiren** şekilde ayarlamak mümkündür.

<figure><img src="../../../.gitbook/assets/image (92) (1).png" alt=""><figcaption></figcaption></figure>

API anahtarları API Gateway portalında oluşturulabilir ve hatta ne kadar kullanılabileceği (saniyede kaç istek ve aylık kaç istek) belirlenebilir.

Bir API anahtarını çalıştırmak için, bunu 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 bir **uç noktaya** yönelik olarak yapılandırılmış bir **yöntem throttling**'i olmalıdır:

<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>

## Kimlik Doğrulamasız Erişim

<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>

## Ayrıcalık Yükseltme

<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>

## Saldırı Sonrası

<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>

### Kalıcılık

<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>Sıfırdan kahraman olana kadar AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

HackTricks'i desteklemenin diğer yolları:

* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'da takip edin.**
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud** github depolarına PR göndererek **hacking püf noktalarınızı paylaşın.**

</details>

Last updated