# AWS - API Gateway Unauthenticated Enum {{#include ../../../../banners/hacktricks-training.md}} ### API Invoke bypass De acordo com a palestra [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers podem ser configurados **usando sintaxe IAM** para conceder permissões para invocar API endpoints. Isso foi retirado [**from the docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): ```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Permission", "Action": ["execute-api:Execution-operation"], "Resource": [ "arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" ] } ] } ``` O problema com essa forma de conceder permissões para invocar endpoints é que o **"\*" implica "qualquer coisa"** e não há **mais sintaxe de regex suportada**. Alguns exemplos: - Uma regra como `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*` para dar a cada usuário acesso a `/dashboard/user/{username}` dará a eles acesso a outras rotas como `/admin/dashboard/createAdmin`, por exemplo. > [!WARNING] > Observe que **"\*" não para de se expandir com barras**, portanto, se você usar "\*" em api-id por exemplo, isso também pode indicar "qualquer etapa" ou "qualquer método" desde que o regex final ainda seja válido.\ > So `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ > Pode validar uma requisição POST para o stage test no caminho `/prod/GET/dashboard/admin`, por exemplo. Você deve sempre ter claro o que quer permitir acessar e então verificar se outros cenários são possíveis com as permissões concedidas. Para mais informações, além da [**docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), você pode encontrar código para implementar authorizers em [**this official aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). ### IAM Policy Injection No mesmo [**talk** ](https://www.youtube.com/watch?v=bsPKk7WDOnE) é mostrado que se o código estiver usando **entrada do usuário** para **gerar as políticas IAM**, curingas (e outros como "." ou strings específicas) podem ser incluídos ali com o objetivo de **contornar restrições**. ### Modelo de URL pública ``` https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} ``` ### Obter o ID da conta a partir de uma URL pública do API Gateway Assim como com S3 buckets, Data Exchange e Lambda URLs, é possível descobrir o ID da conta abusando da **`aws:ResourceAccount`** **Policy Condition Key** a partir de uma URL pública do API Gateway. Isto é feito encontrando o ID da conta caractere por caractere, abusando de wildcards na seção **`aws:ResourceAccount`** da policy.\ Esta técnica também permite obter **valores das tags** se você souber a tag key (há algumas padrão interessantes). Você pode encontrar mais informações na [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) e na ferramenta [**conditional-love**](https://github.com/plerionhq/conditional-love/) para automatizar essa exploração. {{#include ../../../../banners/hacktricks-training.md}}