AWS - Lambda Privesc
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)
Więcej informacji o lambda w:
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Użytkownicy z uprawnieniami iam:PassRole
, lambda:CreateFunction
i lambda:InvokeFunction
mogą podnieść swoje uprawnienia.
Mogą utworzyć nową funkcję Lambda i przypisać jej istniejącą rolę IAM, przyznając funkcji uprawnienia związane z tą rolą. Użytkownik może następnie napisać i przesłać kod do tej funkcji Lambda (na przykład z rev shellem).
Gdy funkcja jest skonfigurowana, użytkownik może wywołać jej wykonanie i zamierzone działania, wywołując funkcję Lambda za pośrednictwem API AWS. To podejście skutecznie pozwala użytkownikowi na wykonywanie zadań pośrednio przez funkcję Lambda, działając na poziomie dostępu przyznanym do roli IAM z nią związanej.\
Atakujący mógłby to wykorzystać, aby uzyskać rev shell i ukraść token:
Możesz również nadużyć uprawnień roli lambda z samej funkcji lambda. Jeśli rola lambda miała wystarczające uprawnienia, mogłeś użyć jej do przyznania sobie praw administratora:
Możliwe jest również wycieknięcie poświadczeń roli lambdy bez potrzeby nawiązywania zewnętrznego połączenia. Będzie to przydatne dla Lambd izolowanych sieciowo używanych do zadań wewnętrznych. Jeśli istnieją nieznane grupy zabezpieczeń filtrujące twoje odwrotne powłoki, ten fragment kodu pozwoli ci bezpośrednio wycieknięcie poświadczeń jako wynik lambdy.
Potencjalny wpływ: Bezpośrednie privesc do dowolnej roli usługi lambda określonej.
Zauważ, że nawet jeśli może to wyglądać interesująco, lambda:InvokeAsync
nie pozwala samodzielnie na wykonanie aws lambda invoke-async
, potrzebujesz również lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Podobnie jak w poprzednim scenariuszu, możesz przyznać sobie uprawnienie lambda:InvokeFunction
, jeśli masz uprawnienie lambda:AddPermission
Potencjalny wpływ: Bezpośrednie privesc do dowolnej roli usługi lambda określonej.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Użytkownicy z uprawnieniami iam:PassRole
, lambda:CreateFunction
i lambda:CreateEventSourceMapping
(a potencjalnie także dynamodb:PutItem
i dynamodb:CreateTable
) mogą pośrednio eskalować uprawnienia nawet bez lambda:InvokeFunction
.
Mogą stworzyć funkcję Lambda z złośliwym kodem i przypisać jej istniejącą rolę IAM.
Zamiast bezpośrednio wywoływać Lambdę, użytkownik konfiguruje lub wykorzystuje istniejącą tabelę DynamoDB, łącząc ją z Lambdą poprzez mapowanie źródła zdarzeń. Ta konfiguracja zapewnia, że funkcja Lambda jest automatycznie wyzwalana po dodaniu nowego elementu do tabeli, zarówno przez działanie użytkownika, jak i inny proces, co pośrednio wywołuje funkcję Lambda i wykonuje kod z uprawnieniami przekazanej roli IAM.
Jeśli DynamoDB jest już aktywne w środowisku AWS, użytkownik musi tylko ustanowić mapowanie źródła zdarzeń dla funkcji Lambda. Jednak jeśli DynamoDB nie jest używane, użytkownik musi utworzyć nową tabelę z włączonym strumieniowaniem:
Teraz możliwe jest połączenie funkcji Lambda z tabelą DynamoDB poprzez utworzenie mapowania źródła zdarzeń:
Z funkcją Lambda powiązaną z strumieniem DynamoDB, atakujący może pośrednio uruchomić Lambdę, aktywując strumień DynamoDB. Można to osiągnąć poprzez wstawienie elementu do tabeli DynamoDB:
Potencjalny wpływ: Bezpośrednie podniesienie uprawnień do roli usługi lambda określonej.
lambda:AddPermission
Napastnik z tym uprawnieniem może przyznać sobie (lub innym) dowolne uprawnienia (to generuje polityki oparte na zasobach, aby przyznać dostęp do zasobu):
Potencjalny wpływ: Bezpośrednie privesc do roli usługi lambda używanej przez przyznanie uprawnienia do modyfikacji kodu i jego uruchomienia.
lambda:AddLayerVersionPermission
Napastnik z tym uprawnieniem może przyznać sobie (lub innym) uprawnienie lambda:GetLayerVersion
. Może uzyskać dostęp do warstwy i szukać luk lub wrażliwych informacji.
Potencjalny wpływ: Potencjalny dostęp do wrażliwych informacji.
lambda:UpdateFunctionCode
Użytkownicy posiadający uprawnienie lambda:UpdateFunctionCode
mają potencjał do modyfikacji kodu istniejącej funkcji Lambda, która jest powiązana z rolą IAM.
Napastnik może zmodyfikować kod lambdy, aby wyeksportować poświadczenia IAM.
Chociaż napastnik może nie mieć bezpośredniej możliwości wywołania funkcji, jeśli funkcja Lambda jest już istniejąca i operacyjna, prawdopodobne jest, że zostanie uruchomiona przez istniejące przepływy pracy lub zdarzenia, co pośrednio ułatwi wykonanie zmodyfikowanego kodu.
Potencjalny wpływ: Bezpośrednie podniesienie uprawnień do roli usługi lambda.
lambda:UpdateFunctionConfiguration
Dzięki tym uprawnieniom możliwe jest dodanie zmiennych środowiskowych, które spowodują, że Lambda wykona dowolny kod. Na przykład w Pythonie można wykorzystać zmienne środowiskowe PYTHONWARNING
i BROWSER
, aby proces Pythona wykonał dowolne polecenia:
Dla innych języków skryptowych istnieją inne zmienne środowiskowe, których możesz użyć. Aby uzyskać więcej informacji, sprawdź podsekcje języków skryptowych w:
Lambda Layers pozwala na dołączenie kod do twojej funkcji lamdba, ale przechowując go osobno, dzięki czemu kod funkcji może pozostać mały, a kilka funkcji może dzielić kod.
Wewnątrz lamdba możesz sprawdzić ścieżki, z których ładowany jest kod python za pomocą funkcji takiej jak poniższa:
To są miejsca:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Na przykład, biblioteka boto3 jest ładowana z /var/runtime/boto3
(4. pozycja).
Możliwe jest nadużycie uprawnienia lambda:UpdateFunctionConfiguration
, aby dodać nową warstwę do funkcji lambda. Aby wykonać dowolny kod, ta warstwa musi zawierać jakąś bibliotekę, którą lambda zamierza zaimportować. Jeśli możesz przeczytać kod lambdy, możesz to łatwo znaleźć, również zauważ, że może być możliwe, że lambda już używa warstwy i możesz pobrać tę warstwę i dodać swój kod tam.
Na przykład, załóżmy, że lambda używa biblioteki boto3, to stworzy lokalną warstwę z najnowszą wersją biblioteki:
Możesz otworzyć ./lambda_layer/boto3/__init__.py
i dodać backdoora w globalnym kodzie (funkcję do eksfiltracji poświadczeń lub uzyskania odwrotnego powłoki na przykład).
Następnie spakuj ten katalog ./lambda_layer
i prześlij nową warstwę lambda na swoje konto (lub na konto ofiary, ale możesz nie mieć do tego uprawnień).
Zauważ, że musisz utworzyć folder python i umieścić w nim biblioteki, aby nadpisać /opt/python/boto3. Ponadto warstwa musi być kompatybilna z wersją pythona używaną przez lambdę, a jeśli przesyłasz ją na swoje konto, musi być w tej samej regionie:
Teraz spraw, aby przesłana warstwa lambda była dostępna dla każdego konta:
I dołącz warstwę lambda do funkcji lambda ofiary:
Następnym krokiem byłoby albo wywołanie funkcji samodzielnie, jeśli możemy, albo czekanie, aż zostanie wywołana w normalny sposób – co jest bezpieczniejszą metodą.
Bardziej dyskretny sposób na wykorzystanie tej luki można znaleźć w:
Potencjalny wpływ: Bezpośrednie privesc do roli usługi lambda.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Może z tymi uprawnieniami jesteś w stanie stworzyć funkcję i wykonać ją, wywołując URL... ale nie mogłem znaleźć sposobu, aby to przetestować, więc daj mi znać, jeśli to zrobisz!
Niektóre lambdy będą otrzymywać wrażliwe informacje od użytkowników w parametrach. Jeśli uzyskasz RCE w jednej z nich, możesz wyeksfiltrować informacje, które inni użytkownicy do niej wysyłają, sprawdź to w:
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)