AWS - Lambda Enum
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
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 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ę 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 vulnerable, możesz wysyłać żądania, aż podatna wersja otrzyma exploit.
.png)
Polityki zasobów
Polityki zasobów Lambda pozwalają na udzielanie dostępu innym usługom/kontom do wywoływania lambdy na przykład.
Na przykład to jest polityka, aby zezwolić komukolwiek na dostęp do lambdy udostępnionej za pomocą URL:
Lub to, aby zezwolić API Gateway na wywołanie:
Proxies bazy 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 wykorzystanie 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 nich 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.
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
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
Wywołaj funkcję Lambda za pomocą URL
Teraz czas, aby znaleźć możliwe funkcje lambda do wykonania:
aws --region us-west-2 --profile level6 lambda list-functions
.png)
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
.png)
Teraz, gdy znasz nazwę i ID, możesz uzyskać nazwę:
aws --profile level6 --region us-west-2 apigateway get-stages --rest-api-id "s33ppypa75"
.png)
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ę
.png)
Privesc
Na następnej stronie możesz sprawdzić, jak nadużywać uprawnień Lambda, aby eskalować uprawnienia:
Dostęp bez uwierzytelnienia
AWS - Lambda Unauthenticated Access
Po eksploatacji
AWS - Lambda Post Exploitation
Utrzymywanie
Odniesienia
- https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-layer
- https://aws.amazon.com/blogs/compute/building-extensions-for-aws-lambda-in-preview/
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

