Bypass FS protections: read-only / no-exec / Distroless
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
:
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.
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).
Last updated