Bypass FS protections: read-only / no-exec / Distroless
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (fluent polish written and spoken required).
In the following videos you can find the techniques mentioned in this page explained more in depth:
Sve je češće pronaći linux mašine montirane sa read-only (ro) zaštitom fajl sistema, posebno u kontejnerima. To je zato što je pokretanje kontejnera sa ro fajl sistemom jednako lako kao postavljanje readOnlyRootFilesystem: true
u securitycontext
:
Međutim, čak i ako je fajl sistem montiran kao ro, /dev/shm
će i dalje biti zapisiv, tako da je lažno da ne možemo ništa napisati na disk. Međutim, ova fascikla će biti montirana sa no-exec zaštitom, tako da ako preuzmete binarni fajl ovde, nećete moći da ga izvršite.
Iz perspektive crvenog tima, ovo otežava preuzimanje i izvršavanje binarnih fajlova koji već nisu u sistemu (kao što su backdoor-i ili enumeratori poput kubectl
).
Napomena da sam pomenuo binarne fajlove, možete izvršiti bilo koji skript sve dok je interpreter unutar mašine, kao što je shell skript ako je sh
prisutan ili python skript ako je python
instaliran.
Međutim, ovo nije dovoljno samo za izvršavanje vašeg binarnog backdoora ili drugih binarnih alata koje možda trebate pokrenuti.
Ako želite da izvršite binarni fajl, ali fajl sistem to ne dozvoljava, najbolji način da to uradite je izvršavanje iz memorije, jer zaštite se ne primenjuju tamo.
Ako imate neke moćne skriptne engine unutar mašine, kao što su Python, Perl, ili Ruby, mogli biste preuzeti binarni fajl da ga izvršite iz memorije, sačuvati ga u memorijskom fajl deskriptoru (create_memfd
syscall), koji neće biti zaštićen tim zaštitama, a zatim pozvati exec
syscall označavajući fd kao fajl za izvršavanje.
Za ovo možete lako koristiti projekat fileless-elf-exec. Možete mu proslediti binarni fajl i on će generisati skript u naznačenom jeziku sa binarno kompresovanim i b64 kodiranim instrukcijama za dekodiranje i dekompresiju u fd kreiranom pozivom create_memfd
syscall i pozivom na exec syscall da ga pokrene.
Ovo ne funkcioniše u drugim skriptim jezicima poput PHP ili Node jer nemaju nikakav default način da pozovu sirove syscalls iz skripte, tako da nije moguće pozvati create_memfd
da kreira memorijski fd za skladištenje binarnog fajla.
Štaviše, kreiranje običnog fd sa fajlom u /dev/shm
neće raditi, jer nećete moći da ga pokrenete zbog primene no-exec zaštite.
DDexec / EverythingExec je tehnika koja vam omogućava da modifikujete memoriju vašeg vlastitog procesa prepisivanjem njegovog /proc/self/mem
.
Stoga, kontrolišući asemblažni kod koji se izvršava od strane procesa, možete napisati shellcode i "mutirati" proces da izvrši bilo koji proizvoljni kod.
DDexec / EverythingExec će vam omogućiti da učitate i izvršite svoj vlastiti shellcode ili bilo koji binarni fajl iz memorije.
Za više informacija o ovoj tehnici proverite Github ili:
DDexec / EverythingExecMemexec je prirodan sledeći korak DDexec-a. To je DDexec shellcode demonizovan, tako da svaki put kada želite da pokrenete drugi binarni fajl ne morate ponovo pokretati DDexec, možete jednostavno pokrenuti memexec shellcode putem DDexec tehnike i zatim komunicirati sa ovim demonima da prenesete nove binarne fajlove za učitavanje i izvršavanje.
Možete pronaći primer kako koristiti memexec za izvršavanje binarnih fajlova iz PHP reverz shell-a na https://github.com/arget13/memexec/blob/main/a.php.
Sa sličnom svrhom kao DDexec, tehnika memdlopen omogućava lakši način učitavanja binarnih fajlova u memoriju za kasnije izvršavanje. Može čak omogućiti i učitavanje binarnih fajlova sa zavisnostima.
Distroless kontejneri sadrže samo najosnovnije komponente potrebne za pokretanje specifične aplikacije ili servisa, kao što su biblioteke i zavisnosti u vreme izvršavanja, ali isključuju veće komponente poput menadžera paketa, shell-a ili sistemskih alata.
Cilj distroless kontejnera je da smanji površinu napada kontejnera eliminisanjem nepotrebnih komponenti i minimiziranjem broja ranjivosti koje se mogu iskoristiti.
U distroless kontejneru možda nećete ni pronaći sh
ili bash
da dobijete regularni shell. Takođe nećete pronaći binarne fajlove kao što su ls
, whoami
, id
... sve što obično pokrećete u sistemu.
Stoga, nećete moći da dobijete reverz shell ili enumerišete sistem kao što obično radite.
Međutim, ako kompromitovani kontejner pokreće, na primer, flask web, tada je python instaliran, i stoga možete dobiti Python reverz shell. Ako pokreće node, možete dobiti Node rev shell, i isto važi za većinu scripting jezika.
Korišćenjem scripting jezika mogli biste enumerisati sistem koristeći mogućnosti jezika.
Ako nema read-only/no-exec
zaštita mogli biste iskoristiti svoj reverz shell da pišete u fajl sistem vaše binarne fajlove i izvršite ih.
Međutim, u ovakvim kontejnerima ove zaštite obično postoje, ali mogli biste koristiti prethodne tehnike izvršavanja u memoriji da ih zaobiđete.
Možete pronaći primere kako da iskoristite neke RCE ranjivosti da dobijete scripting jezike reverz shell-ove i izvršite binarne fajlove iz memorije na https://github.com/carlospolop/DistrolessRCE.
Ako ste zainteresovani za hakersku karijeru i hakovanje nehakovanog - zapošljavamo! (potrebno je tečno pisano i govorno poljski).
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)