AWS - Steal Lambda Requests
Przepływ Lambda
Slicer to proces poza kontenerem, który wysyła wywołania do procesu init.
Proces init nasłuchuje na porcie 9001, ujawniają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ź obsługiwarza dla wywołania/2018-06-01/runtime/invocation/{invoke-id}/error
– zwróć błąd wykonania
bootstrap.py ma pętlę pobierającą wywołania od procesu init i wywołuje kod użytkownika do ich obsługi (
/next
).W końcu bootstrap.py wysyła do init odpowiedź.
Zauważ, że bootstrap ładuje kod użytkownika jako moduł, więc wszelkie wykonanie kodu wykonywane przez kod użytkownika faktycznie dzieje się w tym procesie.
Kradzież żądań Lambda
Celem tego ataku jest spowodowanie wykonania przez kod użytkownika 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 rozpocznie komunikację z procesem init w celu obsługi żądań, podczas gdy uczciwy bootstrap jest uwięziony uruchamiając złośliwy, więc nie będzie prosił o żądania do procesu init.
Jest to proste zadanie do osiągnięcia, ponieważ kod użytkownika jest wykonywany przez uczciwy proces bootstrap.py
. W związku z tym 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 zostać wysłane do
/${invoke-id}/response
Identyfikator wywołania można uzyskać z stosu uczciwego
bootstrap.py
procesu, korzystając z modułu pythona inspect (jak zaproponowano tutaj) lub po prostu ponownie żądając go do/2018-06-01/runtime/invocation/next
(jak zaproponowano tutaj).Wykonaj złośliwy
boostrap.py
, który będzie obsługiwał kolejne wywołaniaW celu zachowania dyskrecji można przesłać parametry wywołań lambda do kontrolowanego przez atakującego C2, a następnie obsłużyć żądania jak zwykle.
Dla tego ataku wystarczy uzyskać oryginalny kod
bootstrap.py
z systemu lub githuba, dodać złośliwy kod i uruchomić go z bieżącego wywołania lambdy.
Kroki ataku
Znajdź podatność na RCE.
Wygeneruj złośliwy bootstrap (np. https://raw.githubusercontent.com/carlospolop/lambda_bootstrap_switcher/main/backdoored_bootstrap.py)
Wykonaj złośliwy bootstrap.
Możesz łatwo wykonać te czynności, uruchamiając:
Dla dalszych informacji sprawdź https://github.com/carlospolop/lambda_bootstrap_switcher
Referencje
Last updated