AWS - Lambda Enum

Support HackTricks

Lambda

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.

Wagi aliasów Lambda

Lambdę można mieć wiele 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

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:

Proxysy baz danych Lambda

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 użycie istniejących połączeń, zamiast tworzenia nowych połączeń dla każdego wywołania funkcji.

Systemy plików EFS Lambda

Aby zachować i nawet dzielić dane, Lambdy mogą uzyskiwać dostęp do EFS i montować je, aby Lambda mogła z niego czytać i pisać.

Warstwy Lambda

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 korzystają z warstw. Zamiast tego pakujesz swoje preferowane środowisko uruchomieniowe, biblioteki i inne zależności do obrazu kontenera podczas budowania obrazu.

Rozszerzenia Lambda

Rozszerzenia Lambda wzbogacają 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.

Enumeracja

aws lambda get-account-settings

# List functions and get extra config info
aws lambda list-functions
aws lambda get-function --function-name <function_name>
aws lambda get-function-configuration --function-name <function_name>
aws lambda list-function-event-invoke-configs --function-name <function_name>
## Check for creds in env vars
aws lambda list-functions | jq '.Functions[].Environment'
## Download & check the source code
aws lambda get-function --function-name "<func_name>" --query 'Code.Location'
wget -O lambda-function.zip <url-from-previous-query>

# Get Lambda URL (if any)
aws lambda list-function-url-configs --function-name <function_name>
aws lambda get-function-url-config --function-name <function_name>

# Get who has permissions to invoke the Lambda
aws lambda get-policy --function-name <function_name>

# Versions and Aliases
aws lambda list-versions-by-function --function-name <func_name>
aws lambda list-aliases --function-name <func_name>

# List layers
aws lambda list-layers
aws lambda list-layer-versions --layer-name <name>
aws lambda get-layer-version --layer-name <name> --version-number <ver>
aws lambda get-layer-version-by-arn --arn <name> #Get external ARNs

# List other metadata
aws lambda list-event-source-mappings
aws lambda list-code-signing-configs
aws lambda list-functions-by-code-signing-config --code-signing-config-arn <arn>

Wywołaj lambdę

Ręcznie

# Invoke function
aws lambda invoke --function-name FUNCTION_NAME /tmp/out
## Some functions will expect parameters, they will access them with something like:
## target_policys = event['policy_names']
## user_name = event['user_name']
aws lambda invoke --function-name <name> --cli-binary-format raw-in-base64-out --payload '{"policy_names": ["AdministratorAccess], "user_name": "sdf"}' out.txt

Poprzez ujawniony URL

aws lambda list-function-url-configs --function-name <function_name> #Get lambda URL
aws lambda get-function-url-config   --function-name <function_name> #Get lambda URL

Call Lambda function via URL

Teraz czas, aby znaleźć możliwe funkcje lambda do wykonania:

aws --region us-west-2 --profile level6 lambda list-functions

Funkcja lambda o nazwie "Level6" jest dostępna. Sprawdźmy, jak ją wywołać:

aws --region us-west-2 --profile level6 lambda get-policy --function-name Level6

Teraz, gdy znasz nazwę i identyfikator, możesz uzyskać nazwę:

aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"

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>

Inne wyzwalacze

Istnieje wiele innych źródeł, które mogą wyzwolić lambdę

Privesc

Na następnej stronie możesz sprawdzić, jak nadużywać uprawnień Lambda, aby eskalować uprawnienia:

AWS - Lambda Privesc

Dostęp bez uwierzytelnienia

AWS - Lambda Unauthenticated Access

Po eksploatacji

AWS - Lambda Post Exploitation

Utrzymywanie

AWS - Lambda Persistence

Odniesienia

Wsparcie dla HackTricks

Last updated