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
.
Lambdę można 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 vulnerable, 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, oto polityka, która pozwala każdemu na dostęp do lambdy eksponowanej za pomocą URL:
Lub to, aby pozwolić API Gateway na wywołanie:
Gdy jest 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 pulowanie połączeń niezbędne 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, aby Lambda 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.
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, 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 wzbogacają funkcje, integrując się z różnymi narzędziami do monitorowania, obserwowalności, 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:
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)