Pentesting APIs & Lambdas

AWS - API Gateway Unauthenticated Enum - HackTricks Cloud

Mientras que los EC2 obtienen sus credenciales de los roles IAM del servicio en 169.254.169.254, las lambdas recurren a variables de entorno.
Algunos desarrolladores dumpearan las variables de entorno cuando algún error ocurre, provocando que las credenciales del IAM asociadas a esa lambda puedan ser likeadas.


Listar lambdas

aws lambda list-functions --endpoint-url http://cloud.amzcorp.local

Listar una en específico

aws lambda get-function --function-name tracking_api --endpoint-url http://cloud.amzcorp.local

Para descargarse el código de una lambda

Opción 1 (hay que tener alcance al servidor):

wget -O lambda-function.zip URL

Opción 2:

awscurl --service lambda \
        --region us-east-1 \
        http://cloud.amzcorp.local/2015-03-31/functions/tracking_api/code --no-verify-ssl

Opción 3:

aws configure --profile user
import requests
import boto3
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest

url = "http://cloud.amzcorp.local/2015-03-31/functions/tracking_api/code"
region = "us-east-2"
profile = "user"

session = boto3.Session(profile_name=profile, region_name=region)
creds = session.get_credentials()

request = AWSRequest(method='GET', url=url)
SigV4Auth(creds, 'lambda', region).add_auth(request)
headers = dict(request.headers)

r = requests.get(url, headers=headers, stream=True)
filename = "flag_code.zip"
with open(filename, 'wb') as f:
        for chunk in r.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

Para ver que API gateway llama a la lambda

aws lambda get-policy \                        
    --function-name tracking_api \
    --region us-east-2 \
    --endpoint-url http://cloud.amzcorp.local
aws apigateway get-rest-apis \
    --region us-east-2 \
    --endpoint-url http://cloud.amzcorp.local

Invocar una lambda

aws lambda invoke \
    --function-name function_name \
    --payload '{"queryStringParameters": {"parameter1": "' \
    --cli-binary-format raw-in-base64-out \
    --endpoint-url http://cloud.amzcorp.local \
    respuesta.txt