AWS - Lambda Enum

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Lambda

Amazon Web Services (AWS) Lambda jest opisana jako usługa obliczeniowa, która umożliwia wykonywanie kodu bez konieczności zapewniania lub zarządzania serwerem. 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 Lambdy jest jej model cenowy, gdzie opłaty są naliczane wyłącznie na podstawie wykorzystanego czasu obliczeniowego, eliminując konieczność inwestycji początkowych lub zobowiązań długoterminowych.

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

Kod lambdy jest przechowywany w /var/task.

Wagi aliasów Lambdy

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 wewnątrz aliasu decydują, który alias otrzymuje wywołanie (może to być na przykład 90%-10%). Jeśli kod jednego z aliasów jest podatny, można wysyłać żądania, aż podatna wersja otrzyma exploit.

Polityki zasobów Lambdy

Polityki zasobów Lambdy pozwalają na udzielenie dostępu innym usługom/kontom do wywołania lambdy, na przykład. Na przykład oto polityka umożliwiająca dostęp każdemu do lambdy udostępnionej za pomocą URL:

A lub to, aby umożliwić bramie API jej wywołanie:

Proksy bazy danych Lambdy

Gdy występuje setki równoczesnych żądań lambdy, jeśli każde z nich musi nawiązać i zamknąć połączenie z bazą danych, to po prostu nie zadziała (lambdy są bezstanowe, nie mogą utrzymywać otwartych połączeń). W takim przypadku, jeśli twoje funkcje Lambdy współdziałają z RDS Proxy zamiast z instancją bazy danych. Zarządza on pulowaniem połączeń niezbędnym do skalowania wielu jednoczesnych połączeń tworzonych przez równoczesne funkcje Lambdy. Pozwala to aplikacjom Lambda ponownie wykorzystywać istniejące połączenia, zamiast tworzyć nowe połączenia dla każdego wywołania funkcji.

Systemy plików EFS Lambdy

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

Warstwy Lambdy

Warstwa Lambdy to archiwum plików .zip, które może zawierać dodatkowy kod lub inne treści. Warstwa może zawierać biblioteki, niestandardowy runtime, dane lub pliki konfiguracyjne.

Można dołączyć do pięciu warstw na funkcję. Gdy dołączysz warstwę do funkcji, zawartość jest wypakowywana do katalogu /opt w środowisku wykonawczym.

Domyślnie warstwy, które tworzysz, są prywatne dla twojego konta AWS. Możesz wybrać, aby udostępnić warstwę innym kontom lub udostępnić warstwę publicznie. Jeśli twoje funkcje korzystają z warstwy opublikowanej przez inne konto, twoje funkcje mogą nadal korzystać z wersji warstwy po jej usunięciu lub po cofnięciu uprawnienia do dostępu do warstwy. Nie możesz jednak tworzyć nowej funkcji ani aktualizować funkcji za pomocą usuniętej wersji warstwy.

Funkcje wdrożone jako obraz kontenerowy nie korzystają z warstw. Zamiast tego pakujesz preferowany runtime, biblioteki i inne zależności do obrazu kontenerowego podczas budowania obrazu.

Rozszerzenia Lambdy

Rozszerzenia Lambdy ulepszają funkcje, integrując się z różnymi narzędziami monitoringu, obserwacji, bezpieczeństwa i zarządzania. Te rozszerzenia, dodawane za pomocą .zip archiwów przy użyciu warstw Lambdy lub dołączone do wdrożeń obrazów kontenerowych, działają w dwóch trybach: wewnętrznym i zewnętrznym.

  • Rozszerzenia wewnętrzne łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą zmiennych środowiskowych specyficznych dla języka i skryptów opakowujących. Ta dostosowanie dotyczy różnych uruchomień, w tym Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1.

  • Rozszerzenia zewnętrzne działają jako osobne procesy, utrzymując zgodność z cyklem życia funkcji Lambdy. Są one kompatybilne z różnymi uruchomieniami, 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 niestandardowymi uruchomieniami.

Wyliczanie

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 funkcję 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

Za pomocą ujawnionego adresu 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łanie funkcji Lambda za pomocą adresu URL

Nadszedł czas, aby dowiedzieć się, jakie funkcje Lambda można wykonać:

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, kiedy znasz nazwę i identyfikator, możesz uzyskać nazwę:

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

I wreszcie wywołaj funkcję, uzyskując dostęp (zauważ, że ID, Nazwa i nazwa funkcji pojawiają się w adresie 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ć funkcję lambda

Privesc

Na następnej stronie możesz sprawdzić, jak wykorzystać uprawnienia Lambda do eskalacji uprawnień:

pageAWS - Lambda Privesc

Nieuwierzytelniony dostęp

pageAWS - Lambda Unauthenticated Access

Po wykorzystaniu

pageAWS - Lambda Post Exploitation

Trwałość

pageAWS - Lambda Persistence

Odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated