AWS - Lambda Enum

Wspieraj HackTricks

Lambda

Amazon Web Services (AWS) Lambda jest opisywana jako usługa obliczeniowa, która umożliwia wykonywanie kodu bez konieczności zapewniania lub zarządzania serwerami. Charakteryzuje się zdolnością do automatycznego zarządzania alokacją zasobów potrzebnych do wykonania kodu, zapewniając funkcje takie jak wysoka dostępność, skalowalność i bezpieczeństwo. Istotnym aspektem Lambda jest model cenowy, w którym opłaty są naliczane wyłącznie za wykorzystany czas obliczeniowy, eliminując potrzebę początkowych inwestycji lub długoterminowych zobowiązań.

Aby wywołać lambdę, można ją wywoływać tak często, jak się chce (z Cloudwatch), udostępnić punkt końcowy URL i wywołać go, wywołać go za pomocą API Gateway lub nawet na podstawie zdarzeń takich jak zmiany danych w S3 lub aktualizacje tabeli DynamoDB.

Kod lambdy jest przechowywany w /var/task.

Lambda Aliases Weights

Lambda może mieć kilka wersji. I może mieć więcej niż 1 wersję udostępnioną za pomocą aliasów. Wagi każdej z wersji udostępnionych 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 podatny, możesz wysyłać żądania, aż podatna wersja otrzyma exploit.

Resource Policies

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 pozwalająca każdemu na dostęp do lambdy udostępnionej za pomocą URL:

Lub ta, aby pozwolić API Gateway na wywołanie jej:

Lambda Database Proxies

Kiedy jest setki równoczesnych żą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 funkcje Lambda współpracują z RDS Proxy zamiast z instancją bazy danych. Zarządza ona pulą połączeń niezbędną do skalowania wielu jednoczesnych połączeń tworzonych przez równoczesne funkcje Lambda. To pozwala aplikacjom Lambda na ponowne wykorzystanie istniejących połączeń, zamiast tworzenia nowych połączeń dla każdego wywołania funkcji.

Lambda EFS Filesystems

Aby zachować, a nawet udostępniać dane, Lambdy mogą uzyskiwać dostęp do EFS i montować je, dzięki czemu Lambda będzie mogła z nich czytać i zapisywać.

Lambda Layers

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ę. Kiedy 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 na upublicznienie warstwy. Jeśli twoje funkcje korzystają z warstwy opublikowanej przez inne konto, twoje funkcje mogą kontynuować korzystanie z wersji warstwy po jej usunięciu lub po cofnięciu twojego uprawnienia do dostępu do warstwy. Jednak nie możesz utworzyć nowej funkcji ani zaktualizować funkcji korzystających z usuniętej wersji warstwy.

Funkcje wdrażane jako obraz kontenera nie korzystają z warstw. Zamiast tego, pakujesz preferowane środowisko uruchomieniowe, biblioteki i inne zależności do obrazu kontenera podczas jego budowy.

Lambda Extensions

Rozszerzenia Lambda zwiększają funkcje poprzez integrację z różnymi narzędziami do monitorowania, obserwowalności, bezpieczeństwa i zarządzania. Te rozszerzenia, dodawane za pomocą archiwów .zip 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 środowiska uruchomieniowego, manipulując jego uruchomieniem za pomocą zmiennych środowiskowych specyficznych dla języka i skryptów wrapper. 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ść operacyjną 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.

Enumeration

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łanie lambda

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

import requests

url = "https://example.execute-api.us-east-1.amazonaws.com/default/my-function"
response = requests.get(url)
print(response.text)

Jeśli URL funkcji Lambda jest publicznie dostępny, możemy wysłać żądanie HTTP, aby uzyskać odpowiedź.

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

Wywołanie funkcji Lambda za pomocą URL

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

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

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

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

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

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

I w końcu wywołaj funkcję, uzyskując dostęp (zauważ, że ID, Name i function-name 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ą wyzwalać lambda

Privesc

Na poniższej stronie możesz sprawdzić, jak wykorzystać uprawnienia Lambda do eskalacji uprawnień:

AWS - Lambda Privesc

Nieautoryzowany Dostęp

AWS - Lambda Unauthenticated Access

Post Exploitation

AWS - Lambda Post Exploitation

Trwałość

AWS - Lambda Persistence

Referencje

Wspieraj HackTricks

Last updated