AWS - Lambda Enum
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)
Amazon Web Services (AWS) Lambda jest opisana jako usługa obliczeniowa, która umożliwia wykonywanie kodu bez konieczności provisionowania lub zarządzania serwerami. Charakteryzuje się zdolnością do automatycznego zarządzania alokacją zasobów potrzebnych do wykonania kodu, zapewniając takie funkcje jak wysoka dostępność, skalowalność i bezpieczeństwo. Istotnym aspektem Lambda jest jej model cenowy, w którym opłaty są oparte wyłącznie na czasie obliczeniowym, eliminując potrzebę początkowych inwestycji lub długoterminowych zobowiązań.
Aby wywołać lambdę, można ją wywoływać tak często, jak chcesz (z Cloudwatch), ekspozycja punktu końcowego URL i wywołanie go, wywołanie go za pomocą API Gateway lub nawet na podstawie zdarzeń, takich jak zmiany w danych w S3 lub aktualizacje w tabeli DynamoDB.
Kod lambdy jest przechowywany w /var/task
.
Lambda może mieć kilka wersji. Może mieć więcej niż 1 wersję eksponowaną za pomocą aliasów. Wagi każdej z wersji eksponowanych w aliasie zdecydują, który alias otrzyma wywołanie (może to być na przykład 90%-10%). Jeśli kod jednego z aliasów jest wrażliwy, możesz wysyłać żądania, aż wrażliwa wersja otrzyma exploit.
Polityki zasobów Lambda pozwalają na udzielenie dostępu innym usługom/kontom do wywoływania lambdy na przykład. Na przykład, oto polityka, aby zezwolić komuś na dostęp do lambdy eksponowanej za pomocą URL:
Lub to, aby zezwolić API Gateway na wywołanie:
Gdy występuje setki równoległych żądań lambdy, jeśli każde z nich musi połączyć się i zamknąć połączenie z bazą danych, to po prostu nie zadziała (lambdy są bezstanowe, nie mogą utrzymywać otwartych połączeń). Wtedy, jeśli Twoje funkcje Lambda współdziałają z RDS Proxy zamiast z instancją bazy danych. Obsługuje pooling połączeń niezbędny do skalowania wielu równoległych połączeń tworzonych przez równoległe funkcje Lambda. To pozwala Twoim aplikacjom Lambda na ponowne wykorzystanie istniejących połączeń, zamiast tworzenia nowych połączeń dla każdego wywołania funkcji.
Aby zachować i nawet dzielić dane, Lambdy mogą uzyskiwać dostęp do EFS i montować je, dzięki czemu Lambda będzie mogła z nich czytać i pisać.
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żna dołączyć do pięciu warstw na funkcję. Gdy dołączasz warstwę do funkcji, zawartość jest wyodrębniana do katalogu /opt
w środowisku wykonawczym.
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, którą opublikowało 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.
Rozszerzenia Lambda wzmacniają funkcje, integrując się z różnymi narzędziami monitorującymi, obserwacyjnymi, bezpieczeństwa i zarządzania. Te rozszerzenia, dodawane za pomocą .zip archiwów przy użyciu warstw Lambda lub zawarte w wdrożeniach obrazów kontenerów, działają w dwóch trybach: wewnętrznym i zewnętrznym.
Wewnętrzne rozszerzenia łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą zmiennych środowiskowych specyficznych dla języka i skryptów opakowujących. Ta personalizacja dotyczy różnych środowisk uruchomieniowych, w tym Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1.
Zewnętrzne rozszerzenia działają jako oddzielne procesy, utrzymując zgodność z cyklem życia funkcji Lambda. Są kompatybilne z różnymi środowiskami uruchomieniowymi, takimi jak Node.js 10 i 12, Python 3.7 i 3.8, Ruby 2.5 i 2.7, Java Corretto 8 i 11, .NET Core 3.1 oraz niestandardowe środowiska uruchomieniowe.
Teraz czas, aby znaleźć możliwe funkcje lambda do wykonania:
Funkcja lambda o nazwie "Level6" jest dostępna. Sprawdźmy, jak ją wywołać:
Teraz, gdy znasz nazwę i identyfikator, możesz uzyskać nazwę:
A na koniec wywołaj funkcję, uzyskując dostęp (zauważ, że ID, Nazwa i nazwa-funkcji pojawiają się w URL): https://s33ppypa75.execute-api.us-west-2.amazonaws.com/Prod/level6
URL:
https://<rest-api-id>.execute-api.<region>.amazonaws.com/<stageName>/<funcName>
Istnieje wiele innych źródeł, które mogą wyzwolić lambdę
Na następnej stronie możesz sprawdzić, jak nadużywać uprawnień Lambda, aby eskalować uprawnienia:
AWS - Lambda PrivescUcz 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)