AWS - Lambda Enum

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Lambda

Amazon Web Services (AWS) Lambda word beskryf as ’n rekenaar diens wat die uitvoering van kode moontlik maak sonder die noodsaaklikheid van bediener voorsiening of bestuur. Dit word gekenmerk deur sy vermoë om outomaties hulpbron toewysing te hanteer wat nodig is vir kode uitvoering, wat funksies soos hoë beskikbaarheid, skaalbaarheid en sekuriteit verseker. ’n Belangrike aspek van Lambda is sy prysmodel, waar heffings slegs gebaseer is op die rekenaartyd wat gebruik word, wat die behoefte aan aanvanklike belegging of langtermyn verpligtinge uitskakel.

Om ’n lambda aan te roep, is dit moontlik om dit so gereeld soos jy wil aan te roep (met Cloudwatch), ’n URL eindpunt bloot te stel en dit aan te roep, dit via API Gateway aan te roep of selfs gebaseer op gebeurtenisse soos veranderings aan data in ’n S3 emmer of opdaterings aan ’n DynamoDB tabel.

Die kode van ’n lambda word gestoor in /var/task.

Lambda Aliases Weights

’n Lambda kan verskeie weergawes hê.
En dit kan meer as 1 weergawe hê wat blootgestel word via aliases. Die gewigte van elke van die weergawes wat binne ’n alias blootgestel word, sal besluit watter alias die oproep ontvang (dit kan 90%-10% wees byvoorbeeld).
As die kode van een van die aliases kwetsbaar is, kan jy versoeke stuur totdat die kwesbare weergawe die ontploffing ontvang.

Resource Policies

Lambda hulpbronbeleide laat toe om toegang aan ander dienste/rekeninge te gee om die lambda aan te roep byvoorbeeld.
Byvoorbeeld, dit is die beleid om enigeen toe te laat om ’n lambda wat via URL blootgestel is, te benader:

Of dit om ’n API Gateway toe te laat om dit aan te roep:

Lambda Database Proxies

Wanneer daar honderde gelyktydige lambda versoeke is, as elkeen daarvan moet verbinding maak en ’n verbinding met ’n databasis sluit, gaan dit eenvoudig nie werk nie (lambdas is staatloos, kan nie verbindings oop hou nie).
Dan, as jou Lambda funksies met RDS Proxy in plaas van jou databasis instansie interaksie het. Dit hanteer die verbinding pooling wat nodig is om baie gelyktydige verbindings wat deur gelyktydige Lambda funksies geskep word, te skaal. Dit laat jou Lambda toepassings toe om bestaande verbindings te hergebruik, eerder as om nuwe verbindings vir elke funksie oproep te skep.

Lambda EFS Filesystems

Om data te bewaar en selfs te deel, kan Lambdas EFS benader en dit monteer, sodat Lambda in staat sal wees om daarvan te lees en te skryf.

Lambda Layers

’n Lambda laag is ’n .zip lêer argief wat addisionele kode of ander inhoud kan bevat. ’n Laag kan biblioteke, ’n aangepaste runtime, data, of konfigurasielêers bevat.

Dit is moontlik om tot vyf lae per funksie in te sluit. Wanneer jy ’n laag in ’n funksie insluit, word die inhoud na die /opt gids in die uitvoeringsomgewing onttrek.

Deur standaard, is die lae wat jy skep privaat vir jou AWS rekening. Jy kan kies om ’n laag met ander rekeninge te deel of om die laag publiek te maak. As jou funksies ’n laag gebruik wat ’n ander rekening gepubliseer het, kan jou funksies voortgaan om die laag weergawe te gebruik nadat dit verwyder is, of nadat jou toestemming om toegang tot die laag herroep is. Dit is egter nie moontlik om ’n nuwe funksie te skep of funksies te werk met ’n verwyderde laag weergawe nie.

Funksies wat as ’n houer beeld ontplooi word, gebruik nie lae nie. In plaas daarvan, pak jy jou verkiesde runtime, biblioteke, en ander afhanklikhede in die houer beeld wanneer jy die beeld bou.

Lambda Extensions

Lambda uitbreidings verbeter funksies deur te integreer met verskeie monitering, waaksaamheid, sekuriteit, en bestuur gereedskap. Hierdie uitbreidings, bygevoeg via .zip argiewe met behulp van Lambda lae of ingesluit in houer beeld ontplooiings, werk in twee modi: intern en ekstern.

  • Interne uitbreidings meng met die runtime proses, wat die opstart manipuleer met behulp van taalspesifieke omgewing veranderlikes en wrapper skripte. Hierdie aanpassing geld vir ’n reeks runtimes, insluitend Java Correto 8 en 11, Node.js 10 en 12, en .NET Core 3.1.
  • Eksterne uitbreidings loop as aparte prosesse, wat operasionele belyning met die Lambda funksie se lewensiklus handhaaf. Hulle is versoenbaar met verskeie runtimes soos Node.js 10 en 12, Python 3.7 en 3.8, Ruby 2.5 en 2.7, Java Corretto 8 en 11, .NET Core 3.1, en aangepaste runtimes.

Enumeration

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Roep ’n lambda aan

Handmatig

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Deur blootgestelde URL

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Roep Lambda-funksie aan via URL

Nou is dit tyd om moontlike lambda-funksies te vind om uit te voer:

aws --region us-west-2 --profile level6 lambda list-functions

’n Lambda-funksie genaamd “Level6” is beskikbaar. Kom ons vind uit hoe om dit aan te roep:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Nou, dat jy die naam en die ID ken, kan jy die Naam kry:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

En uiteindelik bel die funksie wat toegang verkry (let op dat die ID, Naam en funksie-naam in die URL verskyn): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6

URL:https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>

Ander Triggers

Daar is baie ander bronne wat ’n lambda kan aktiveer

Privesc

Op die volgende bladsy kan jy kyk hoe om Lambda-toestemmings te misbruik om voorregte te verhoog:

AWS - Lambda Privesc

Ongeauthentiseerde Toegang

AWS - Lambda Unauthenticated Access

Post Exploitatie

AWS - Lambda Post Exploitation

Volharding

AWS - Lambda Persistence

Verwysings

Tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks