AWS - Lambda Layers Persistence
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Warstwa Lambda to archiwum .zip, które może zawierać dodatkowy kod lub inne treści. Warstwa może zawierać biblioteki, niestandardowe środowisko uruchomieniowe, dane lub pliki konfiguracyjne.
Możliwe jest dołączenie do pięciu warstw na funkcję. Gdy dołączasz warstwę do funkcji, zawartość jest wypakowywana do katalogu /opt
w środowisku wykonawczym.
Z domyślnie, warstwy, które tworzysz, są prywatne dla twojego konta AWS. Możesz zdecydować się na udostępnienie warstwy innym kontom lub uczynić warstwę publiczną. Jeśli twoje funkcje korzystają z warstwy opublikowanej przez inne konto, twoje funkcje mogą nadal korzystać z wersji warstwy po jej usunięciu lub po cofnięciu twojego dostępu do warstwy. Jednak nie możesz utworzyć nowej funkcji ani zaktualizować funkcji korzystających z usuniętej wersji warstwy.
Funkcje wdrożone jako obraz kontenera nie używają warstw. Zamiast tego pakujesz swoje preferowane środowisko uruchomieniowe, biblioteki i inne zależności do obrazu kontenera podczas budowania obrazu.
Ścieżka ładowania, której Python użyje w lambdzie, jest następująca:
Sprawdź, jak drugie i trzecie pozycje są zajmowane przez katalogi, w których lambda layers dekompresują swoje pliki: /opt/python/lib/python3.9/site-packages
i /opt/python
Jeśli atakujący zdołałby wprowadzić tylną furtkę do używanej warstwy lambda lub dodać jedną, która będzie wykonywać dowolny kod, gdy załadowana zostanie wspólna biblioteka, będzie mógł wykonywać złośliwy kod przy każdym wywołaniu lambda.
Dlatego wymagania są następujące:
Sprawdź biblioteki, które są ładowane przez kod ofiary
Stwórz bibliotekę proxy z warstwami lambda, która będzie wykonywać niestandardowy kod i ładować oryginalną bibliotekę.
Podczas nadużywania tej techniki napotkałem trudność: Niektóre biblioteki są już załadowane w czasie działania Pythona, gdy twój kod jest wykonywany. Spodziewałem się znaleźć takie rzeczy jak os
czy sys
, ale nawet biblioteka json
była załadowana.
Aby nadużyć tej techniki utrzymywania, kod musi załadować nową bibliotekę, która nie jest załadowana, gdy kod jest wykonywany.
Dzięki kodowi Pythona takiemu jak ten, możliwe jest uzyskanie listy bibliotek, które są wstępnie załadowane w czasie działania Pythona w lambda:
A oto lista (sprawdź, czy takie biblioteki jak os
lub json
są już dostępne)
I oto lista bibliotek, które lambda instaluje domyślnie: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
W tym przykładzie załóżmy, że kod docelowy importuje csv
. Będziemy wprowadzać backdoora do importu biblioteki csv
.
Aby to zrobić, stworzymy katalog csv z plikiem __init__.py
w ścieżce, która jest ładowana przez lambda: /opt/python/lib/python3.9/site-packages
Następnie, gdy lambda zostanie wykonana i spróbuje załadować csv, nasz plik __init__.py
zostanie załadowany i wykonany.
Ten plik musi:
Wykonać nasz ładunek
Załadować oryginalną bibliotekę csv
Możemy zrobić to obie rzeczy za pomocą:
Następnie utwórz zip z tym kodem w ścieżce python/lib/python3.9/site-packages/__init__.py
i dodaj go jako warstwę lambda.
Możesz znaleźć ten kod w https://github.com/carlospolop/LambdaLayerBackdoor
Zintegrowany payload wyśle dane uwierzytelniające IAM na serwer PIERWSZY RAZ, gdy zostanie wywołany lub PO zresetowaniu kontenera lambda (zmiana kodu lub zimna lambda), ale inne techniki takie jak poniższe mogą być również zintegrowane:
Zauważ, że możliwe jest użycie warstw lambda z zewnętrznych kont. Co więcej, lambda może używać warstwy z zewnętrznego konta, nawet jeśli nie ma uprawnień. Zauważ również, że maksymalna liczba warstw, które może mieć lambda, wynosi 5.
Dlatego, aby poprawić wszechstronność tej techniki, atakujący mógłby:
Wprowadzić backdoora do istniejącej warstwy użytkownika (nic nie jest zewnętrzne)
Utworzyć warstwę w swoim koncie, dać koncie ofiary dostęp do używania warstwy, skonfigurować warstwę w Lambdzie ofiary i usunąć uprawnienia.
Lambda nadal będzie mogła używać warstwy, a ofiara nie będzie miała łatwego sposobu na pobranie kodu warstwy (oprócz uzyskania powłoki rev wewnątrz lambdy)
Ofiara nie zobaczy zewnętrznych warstw używanych z aws lambda list-layers
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)