Bypass FS protections: read-only / no-exec / Distroless
Ako ste zainteresovani za hakersku karijeru i hakovanje neuhvatljivog - mi zapošljavamo! (potrebno je tečno poznavanje pisanog i govornog poljskog jezika).
Video snimci
U sledećim video snimcima možete pronaći tehnike pomenute na ovoj stranici objašnjene detaljnije:
Scenario samo za čitanje / bez izvršavanja
Sve je češće naići na Linux mašine montirane sa zaštitom fajl sistema samo za čitanje (ro), posebno u kontejnerima. To je zato što je pokretanje kontejnera sa fajl sistemom samo za čitanje jednostavno postavljanjem readOnlyRootFilesystem: true
u securitycontext
:
Međutim, čak i ako je fajl sistem montiran kao samo za čitanje, /dev/shm
će i dalje biti upisiv, tako da nije tačno da ne možemo ništa zapisati na disk. Međutim, ovaj folder će biti montiran sa zaštitom bez izvršavanja, pa ako ovde preuzmete binarni fajl, nećete moći da ga izvršite.
Sa perspektive crvenog tima, ovo otežava preuzimanje i izvršavanje binarnih fajlova koji nisu već prisutni u sistemu (kao što su backdoor-ovi ili enumeratori poput kubectl
).
Najlakši način zaobilaženja: Skripte
Imajte na umu da sam spomenuo binarne fajlove, možete izvršiti bilo koju skriptu sve dok je interpretator unutar mašine, poput shell skripte ako je sh
prisutan ili python skripte ako je instaliran python
.
Međutim, ovo nije dovoljno samo za izvršavanje vašeg binarnog backdoor-a ili drugih binarnih alata koje možda treba pokrenuti.
Bypassovi memorije
Ako želite da izvršite binarni fajl, ali fajl sistem to ne dozvoljava, najbolji način za to je izvršavanje iz memorije, jer se zaštite ne primenjuju tamo.
Bypass FD + exec syscall
Ako imate moćne skriptne motore unutar mašine, poput Python-a, Perla ili Ruby-ja, možete preuzeti binarni fajl za izvršavanje iz memorije, sačuvati ga u deskriptoru fajla u memoriji (create_memfd
syscall), što neće biti zaštićeno tim zaštitama, a zatim pozvati exec
syscall navodeć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 skriptu na naznačenom jeziku sa binarnim fajlom kompresovanim i b64 enkodiranim sa instrukcijama za dekodiranje i dekompresovanje u fd kreiran pozivom create_memfd
syscall i poziv exec syscall-a za pokretanje.
Ovo ne funkcioniše u drugim skriptnim jezicima poput PHP-a ili Node-a jer nemaju podrazumevan način pozivanja sirovih syscalls iz skripte, tako da nije moguće pozvati create_memfd
da kreirate memorijski fd za čuvanje binarnog fajla.
Osim toga, kreiranje regularnog fd sa fajlom u /dev/shm
neće raditi, jer vam neće biti dozvoljeno da ga pokrenete zbog primene zaštite bez izvršavanja.
DDexec / EverythingExec
DDexec / EverythingExec je tehnika koja vam omogućava da modifikujete memoriju vašeg sopstvenog procesa tako što ćete prepisati njegov /proc/self/mem
.
Stoga, kontrolišući asemblerski 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 shellcode ili bilo koji binarni fajl iz memorije.
MemExec
Memexec je prirodni sledeći korak nakon DDexec-a. To je DDexec shellcode demonizovan, tako da svaki put kada želite pokrenuti drugi binarni fajl ne morate ponovo pokretati DDexec, već možete jednostavno pokrenuti memexec shellcode putem DDexec tehnike i zatim komunicirati sa ovim demonom kako biste prosledili nove binarne fajlove za učitavanje i pokretanje.
Možete pronaći primer kako koristiti memexec za izvršavanje binarnih fajlova iz PHP reverse shell-a na https://github.com/arget13/memexec/blob/main/a.php.
Memdlopen
Sa sličnim ciljem kao DDexec, tehnika memdlopen omogućava jednostavniji način učitavanja binarnih fajlova u memoriju kako bi ih kasnije izvršili. Može čak omogućiti učitavanje binarnih fajlova sa zavisnostima.
Bypass Distroless
Šta je distroless
Distroless kontejneri sadrže samo apsolutno neophodne komponente za pokretanje određene aplikacije ili servisa, poput biblioteka i zavisnosti za izvršavanje, ali isključuju veće komponente poput upravljača paketima, ljuske ili sistemskih alatki.
Cilj distroless kontejnera je smanjenje površine napada kontejnera eliminisanjem nepotrebnih komponenti i minimiziranje broja ranjivosti koje mogu biti iskorišćene.
Reverse Shell
U distroless kontejneru možda nećete pronaći sh
ili bash
da biste dobili običnu ljusku. Takođe nećete pronaći binarne fajlove poput ls
, whoami
, id
... sve što obično pokrećete na sistemu.
Stoga, nećete moći dobiti reverse shell ili enumerisati sistem kao što obično radite.
Međutim, ako je kompromitovani kontejner na primer pokrenut kao flask veb, tada je instaliran python, i stoga možete dobiti Python reverse shell. Ako se pokreće node, možete dobiti Node rev shell, i isto važi za većinu skriptnih jezika.
Korišćenjem skriptnog jezika možete enumerisati sistem koristeći mogućnosti jezika.
Ako ne postoje zaštite read-only/no-exec
možete zloupotrebiti svoj reverse 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 možete koristiti prethodne tehnike izvršavanja u memoriji da ih zaobiđete.
Možete pronaći primere kako iskoristiti neke RCE ranjivosti da biste dobili reverse shell-ove skriptnih jezika i izvršili binarne fajlove iz memorije na https://github.com/carlospolop/DistrolessRCE.
Ako ste zainteresovani za hakersku karijeru i hakovanje neuhvatljivog - zapošljavamo! (potrebno je tečno poznavanje pisanog i govornog poljskog jezika).
Last updated