mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 06:00:40 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
fc2bb3ebe7
commit
7a1d5d5926
2 changed files with 226 additions and 73 deletions
|
@ -1,8 +1,8 @@
|
|||
# macOS Sandbox
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -19,18 +19,20 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
|
||||
MacOS Sandbox (спочатку називався Seatbelt) **обмежує програми**, що працюють всередині пісочниці, до **дозволених дій, зазначених у профілі пісочниці**, з яким працює програма. Це допомагає забезпечити, що **програма буде отримувати доступ лише до очікуваних ресурсів**.
|
||||
|
||||
Будь-яка програма з **правом** **`com.apple.security.app-sandbox`** буде виконуватися всередині пісочниці. **Бінарні файли Apple** зазвичай виконуються всередині пісочниці, і для публікації в **App Store** **це право є обов'язковим**. Тому більшість програм буде виконуватися всередині пісочниці.
|
||||
Будь-яка програма з **правом** **`com.apple.security.app-sandbox`** буде виконуватися всередині пісочниці. **Бінарні файли Apple** зазвичай виконуються всередині пісочниці, і всі програми з **App Store мають це право**. Тому кілька програм будуть виконуватися всередині пісочниці.
|
||||
|
||||
Щоб контролювати, що процес може або не може робити, **пісочниця має хуки** у всіх **системних викликах** по всьому ядру. **Залежно** від **прав** програми пісочниця **дозволить** певні дії.
|
||||
Щоб контролювати, що процес може або не може робити, **пісочниця має хуки** практично в будь-якій операції, яку процес може спробувати (включаючи більшість системних викликів) за допомогою **MACF**. Однак, в залежності від **прав** програми, пісочниця може бути більш поблажливою до процесу.
|
||||
|
||||
Деякі важливі компоненти пісочниці:
|
||||
|
||||
* **Розширення ядра** `/System/Library/Extensions/Sandbox.kext`
|
||||
* **Приватна бібліотека** `/System/Library/PrivateFrameworks/AppSandbox.framework`
|
||||
* **Приватна рамка** `/System/Library/PrivateFrameworks/AppSandbox.framework`
|
||||
* **Демон**, що працює в користувацькому просторі `/usr/libexec/sandboxd`
|
||||
* **Контейнери** `~/Library/Containers`
|
||||
|
||||
Всередині папки контейнерів ви можете знайти **папку для кожної програми, виконуваної в пісочниці**, з назвою ідентифікатора пакета:
|
||||
### Containers
|
||||
|
||||
Кожна програма в пісочниці матиме свій власний контейнер у `~/Library/Containers/{CFBundleIdentifier}` :
|
||||
```bash
|
||||
ls -l ~/Library/Containers
|
||||
total 0
|
||||
|
@ -41,7 +43,7 @@ drwx------@ 4 username staff 128 Mar 25 14:14 com.apple.Accessibility-Settings
|
|||
drwx------@ 4 username staff 128 Mar 25 14:10 com.apple.ActionKit.BundledIntentHandler
|
||||
[...]
|
||||
```
|
||||
Всередині кожної папки з ідентифікатором пакету ви можете знайти **plist** та **каталог даних** програми:
|
||||
Всередині кожної папки з ідентифікатором пакета ви можете знайти **plist** та **каталог даних** програми зі структурою, яка імітує папку Home:
|
||||
```bash
|
||||
cd /Users/username/Library/Containers/com.apple.Safari
|
||||
ls -la
|
||||
|
@ -65,10 +67,13 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
|
|||
drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Зверніть увагу, що навіть якщо символічні посилання існують для "втечі" з пісочниці та доступу до інших папок, додаток все ще повинен **мати дозволи** для їх доступу. Ці дозволи знаходяться всередині **`.plist`**.
|
||||
Зверніть увагу, що навіть якщо символічні посилання існують для "втечі" з пісочниці та доступу до інших папок, додаток все ще повинен **мати дозволи** для їх доступу. Ці дозволи знаходяться всередині **`.plist`** в `RedirectablePaths`.
|
||||
{% endhint %}
|
||||
|
||||
**`SandboxProfileData`** - це скомпільовані дані профілю пісочниці CFData, закодовані в B64.
|
||||
```bash
|
||||
# Get permissions
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
plutil -convert xml1 .com.apple.containermanagerd.metadata.plist -o -
|
||||
|
||||
# Binary sandbox profile
|
||||
|
@ -118,7 +123,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
|||
Все, що створюється/модифікується пісочницею, отримає **атрибут карантину**. Це запобігатиме простору пісочниці, активуючи Gatekeeper, якщо пісочна програма намагатиметься виконати щось за допомогою **`open`**.
|
||||
{% endhint %}
|
||||
|
||||
### Профілі пісочниці
|
||||
## Профілі пісочниці
|
||||
|
||||
Профілі пісочниці - це конфігураційні файли, які вказують, що буде **дозволено/заборонено** в цій **пісочниці**. Вони використовують **Мову профілів пісочниці (SBPL)**, яка базується на [**Scheme**](https://en.wikipedia.org/wiki/Scheme\_\(programming\_language\)) мові програмування.
|
||||
|
||||
|
@ -142,17 +147,19 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
|
|||
```
|
||||
{% hint style="success" %}
|
||||
Перевірте це [**дослідження**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **щоб дізнатися більше про дії, які можуть бути дозволені або заборонені.**
|
||||
|
||||
Зверніть увагу, що в скомпільованій версії профілю назви операцій замінюються їхніми записами в масиві, відомому dylib та kext, що робить скомпільовану версію коротшою і важчою для читання.
|
||||
{% endhint %}
|
||||
|
||||
Важливі **системні служби** також працюють у своїх власних кастомних **пісочницях**, таких як служба `mdnsresponder`. Ви можете переглянути ці кастомні **профілі пісочниці** у:
|
||||
|
||||
* **`/usr/share/sandbox`**
|
||||
* **`/System/Library/Sandbox/Profiles`** 
|
||||
* Інші профілі пісочниці можна перевірити на [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles).
|
||||
* **`/System/Library/Sandbox/Profiles`**
|
||||
* Інші профілі пісочниці можна перевірити за адресою [https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles](https://github.com/s7ephen/OSX-Sandbox--Seatbelt--Profiles).
|
||||
|
||||
Додатки з **App Store** використовують **профіль** **`/System/Library/Sandbox/Profiles/application.sb`**. Ви можете перевірити в цьому профілі, як права, такі як **`com.apple.security.network.server`**, дозволяють процесу використовувати мережу.
|
||||
|
||||
SIP - це профіль пісочниці, названий platform\_profile у /System/Library/Sandbox/rootless.conf
|
||||
SIP - це профіль пісочниці, званий platform\_profile у /System/Library/Sandbox/rootless.conf
|
||||
|
||||
### Приклади профілів пісочниці
|
||||
|
||||
|
@ -219,40 +226,47 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
|
|||
* [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
|
||||
* [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (вони можуть записувати файли за межами пісочниці, назва яких починається з `~$`).
|
||||
|
||||
### Профілі пісочниці MacOS
|
||||
### Відстеження пісочниці
|
||||
|
||||
macOS зберігає профілі системної пісочниці у двох місцях: **/usr/share/sandbox/** та **/System/Library/Sandbox/Profiles**.
|
||||
#### Через профіль
|
||||
|
||||
Можливо відстежувати всі перевірки, які пісочниця виконує щоразу, коли перевіряється дія. Для цього просто створіть наступний профіль:
|
||||
|
||||
{% code title="trace.sb" %}
|
||||
```scheme
|
||||
(version 1)
|
||||
(trace /tmp/trace.out)
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
А потім просто виконайте щось, використовуючи цей профіль:
|
||||
```bash
|
||||
sandbox-exec -f /tmp/trace.sb /bin/ls
|
||||
```
|
||||
In `/tmp/trace.out` ви зможете побачити кожну перевірку пісочниці, що виконувалася щоразу, коли вона викликалася (тобто, багато дублікатів).
|
||||
|
||||
Також можливо відстежувати пісочницю, використовуючи параметр **`-t`**: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
|
||||
|
||||
#### Через API
|
||||
|
||||
Функція `sandbox_set_trace_path`, експортована з `libsystem_sandbox.dylib`, дозволяє вказати ім'я файлу трасування, куди будуть записані перевірки пісочниці.\
|
||||
Також можливо зробити щось подібне, викликавши `sandbox_vtrace_enable()` і отримавши журнали помилок з буфера, викликавши `sandbox_vtrace_report()`.
|
||||
|
||||
### Інспекція пісочниці
|
||||
|
||||
`libsandbox.dylib` експортує функцію під назвою sandbox\_inspect\_pid, яка надає список стану пісочниці процесу (включаючи розширення). Однак лише платформи бінарних файлів можуть використовувати цю функцію.
|
||||
|
||||
### Профілі пісочниці MacOS та iOS
|
||||
|
||||
MacOS зберігає системні профілі пісочниці у двох місцях: **/usr/share/sandbox/** та **/System/Library/Sandbox/Profiles**.
|
||||
|
||||
І якщо сторонній додаток має право _**com.apple.security.app-sandbox**_, система застосовує профіль **/System/Library/Sandbox/Profiles/application.sb** до цього процесу.
|
||||
|
||||
### **Профіль пісочниці iOS**
|
||||
В iOS за замовчуванням профіль називається **container** і ми не маємо текстового представлення SBPL. У пам'яті ця пісочниця представлена як бінарне дерево Allow/Deny для кожного дозволу з пісочниці.
|
||||
|
||||
За замовчуванням профіль називається **container**, і у нас немає текстового представлення SBPL. У пам'яті ця пісочниця представлена як бінарне дерево Allow/Deny для кожного дозволу з пісочниці.
|
||||
### Користувацький SBPL у додатках App Store
|
||||
|
||||
### Налагодження та обход пісочниці
|
||||
|
||||
На macOS, на відміну від iOS, де процеси з самого початку ізольовані ядром, **процеси повинні самостійно вибрати пісочницю**. Це означає, що на macOS процес не обмежений пісочницею, поки він активно не вирішить увійти в неї.
|
||||
|
||||
Процеси автоматично потрапляють у пісочницю з користувацького простору, коли вони запускаються, якщо у них є право: `com.apple.security.app-sandbox`. Для детального пояснення цього процесу дивіться:
|
||||
|
||||
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
|
||||
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Перевірка привілеїв PID**
|
||||
|
||||
[**Згідно з цим**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), **`sandbox_check`** (це `__mac_syscall`), може перевірити, **чи дозволена операція чи ні** пісочницею для певного PID.
|
||||
|
||||
[**Інструмент sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) може перевірити, чи може PID виконати певну дію:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
sbtool <pid> inspect #Gives you an explaination of the sandbox profile
|
||||
sbtool <pid> all
|
||||
```
|
||||
### Custom SBPL in App Store apps
|
||||
|
||||
Можливо, що компанії можуть змусити свої додатки працювати **з кастомними профілями пісочниці** (замість за замовчуванням). Вони повинні використовувати право **`com.apple.security.temporary-exception.sbpl`**, яке потрібно авторизувати Apple.
|
||||
Можливо, що компанії можуть змусити свої додатки працювати **з користувацькими профілями пісочниці** (замість за замовчуванням). Вони повинні використовувати право **`com.apple.security.temporary-exception.sbpl`**, яке потрібно авторизувати в Apple.
|
||||
|
||||
Можна перевірити визначення цього права в **`/System/Library/Sandbox/Profiles/application.sb:`**
|
||||
```scheme
|
||||
|
@ -264,17 +278,140 @@ sbtool <pid> all
|
|||
```
|
||||
Це **оцінить рядок після цього права** як профіль Sandbox.
|
||||
|
||||
### Компіляція та декомпіляція профілю Sandbox
|
||||
|
||||
Інструмент **`sandbox-exec`** використовує функції `sandbox_compile_*` з `libsandbox.dylib`. Основні експортовані функції: `sandbox_compile_file` (очікує шлях до файлу, параметр `-f`), `sandbox_compile_string` (очікує рядок, параметр `-p`), `sandbox_compile_name` (очікує назву контейнера, параметр `-n`), `sandbox_compile_entitlements` (очікує plist прав).
|
||||
|
||||
Ця реверсована та [**відкрита версія інструменту sandbox-exec**](https://newosxbook.com/src.jl?tree=listings\&file=/sandbox\_exec.c) дозволяє **`sandbox-exec`** записувати скомпільований профіль sandbox у файл.
|
||||
|
||||
Більше того, щоб обмежити процес всередині контейнера, він може викликати `sandbox_spawnattrs_set[container/profilename]` і передати контейнер або вже існуючий профіль.
|
||||
|
||||
## Налагодження та обхід Sandbox
|
||||
|
||||
На macOS, на відміну від iOS, де процеси з самого початку ізольовані ядром, **процеси повинні самостійно вибрати участь у sandbox**. Це означає, що на macOS процес не обмежується sandbox, поки він активно не вирішить увійти в нього, хоча програми з App Store завжди ізольовані.
|
||||
|
||||
Процеси автоматично ізолюються з userland, коли вони запускаються, якщо у них є право: `com.apple.security.app-sandbox`. Для детального пояснення цього процесу дивіться:
|
||||
|
||||
{% content-ref url="macos-sandbox-debug-and-bypass/" %}
|
||||
[macos-sandbox-debug-and-bypass](macos-sandbox-debug-and-bypass/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Розширення Sandbox**
|
||||
|
||||
Розширення дозволяють надати додаткові привілеї об'єкту і викликають одну з функцій:
|
||||
|
||||
* `sandbox_issue_extension`
|
||||
* `sandbox_extension_issue_file[_with_new_type]`
|
||||
* `sandbox_extension_issue_mach`
|
||||
* `sandbox_extension_issue_iokit_user_client_class`
|
||||
* `sandbox_extension_issue_iokit_registry_rentry_class`
|
||||
* `sandbox_extension_issue_generic`
|
||||
* `sandbox_extension_issue_posix_ipc`
|
||||
|
||||
Розширення зберігаються в другому слоті мітки MACF, доступному з облікових даних процесу. Наступний **`sbtool`** може отримати доступ до цієї інформації.
|
||||
|
||||
Зверніть увагу, що розширення зазвичай надаються дозволеними процесами, наприклад, `tccd` надасть токен розширення `com.apple.tcc.kTCCServicePhotos`, коли процес намагався отримати доступ до фотографій і був дозволений у повідомленні XPC. Тоді процесу потрібно буде спожити токен розширення, щоб він був доданий до нього.\
|
||||
Зверніть увагу, що токени розширення є довгими шістнадцятковими числами, які кодують надані дозволи. Однак у них немає жорстко закодованого дозволеного PID, що означає, що будь-який процес з доступом до токена може бути **спожитий кількома процесами**.
|
||||
|
||||
Зверніть увагу, що розширення дуже пов'язані з правами, тому наявність певних прав може автоматично надавати певні розширення.
|
||||
|
||||
### **Перевірка привілеїв PID**
|
||||
|
||||
[**Згідно з цим**](https://www.youtube.com/watch?v=mG715HcDgO8\&t=3011s), функції **`sandbox_check`** (це `__mac_syscall`), можуть перевірити **чи дозволена операція чи ні** sandbox у певному PID, токені аудиту або унікальному ID.
|
||||
|
||||
[**Інструмент sbtool**](http://newosxbook.com/src.jl?tree=listings\&file=sbtool.c) (знайдіть його [скомпільованим тут](https://newosxbook.com/articles/hitsb.html)) може перевірити, чи може PID виконати певні дії:
|
||||
```bash
|
||||
sbtool <pid> mach #Check mac-ports (got from launchd with an api)
|
||||
sbtool <pid> file /tmp #Check file access
|
||||
sbtool <pid> inspect #Gives you an explanation of the sandbox profile and extensions
|
||||
sbtool <pid> all
|
||||
```
|
||||
### \[un]suspend
|
||||
|
||||
Також можливо призупинити та відновити пісочницю, використовуючи функції `sandbox_suspend` та `sandbox_unsuspend` з `libsystem_sandbox.dylib`.
|
||||
|
||||
Зверніть увагу, що для виклику функції призупинення перевіряються деякі права для авторизації виклику, такі як:
|
||||
|
||||
* com.apple.private.security.sandbox-manager
|
||||
* com.apple.security.print
|
||||
* com.apple.security.temporary-exception.audio-unit-host
|
||||
|
||||
## mac\_syscall
|
||||
|
||||
Цей системний виклик (#381) очікує один рядок як перший аргумент, який вказуватиме модуль для виконання, а потім код у другому аргументі, який вказуватиме функцію для виконання. Третій аргумент залежатиме від виконуваної функції.
|
||||
|
||||
Виклик функції `___sandbox_ms` обгортає `mac_syscall`, вказуючи в першому аргументі `"Sandbox"`, так само як `___sandbox_msp` є обгорткою для `mac_set_proc` (#387). Деякі з підтримуваних кодів `___sandbox_ms` можна знайти в цій таблиці:
|
||||
|
||||
* **set\_profile (#0)**: Застосувати скомпільований або названий профіль до процесу.
|
||||
* **platform\_policy (#1)**: Застосувати перевірки політики, специфічні для платформи (варіюється між macOS та iOS).
|
||||
* **check\_sandbox (#2)**: Виконати ручну перевірку конкретної операції пісочниці.
|
||||
* **note (#3)**: Додати анотацію до пісочниці.
|
||||
* **container (#4)**: Прикріпити анотацію до пісочниці, зазвичай для налагодження або ідентифікації.
|
||||
* **extension\_issue (#5)**: Створити нове розширення для процесу.
|
||||
* **extension\_consume (#6)**: Використати дане розширення.
|
||||
* **extension\_release (#7)**: Вивільнити пам'ять, пов'язану з використаним розширенням.
|
||||
* **extension\_update\_file (#8)**: Змінити параметри існуючого розширення файлу в межах пісочниці.
|
||||
* **extension\_twiddle (#9)**: Налаштувати або змінити існуюче розширення файлу (наприклад, TextEdit, rtf, rtfd).
|
||||
* **suspend (#10)**: Тимчасово призупинити всі перевірки пісочниці (вимагає відповідних прав).
|
||||
* **unsuspend (#11)**: Відновити всі раніше призупинені перевірки пісочниці.
|
||||
* **passthrough\_access (#12)**: Дозволити прямий доступ до ресурсу, обходячи перевірки пісочниці.
|
||||
* **set\_container\_path (#13)**: (тільки iOS) Встановити шлях контейнера для групи додатків або ID підпису.
|
||||
* **container\_map (#14)**: (тільки iOS) Отримати шлях контейнера з `containermanagerd`.
|
||||
* **sandbox\_user\_state\_item\_buffer\_send (#15)**: (iOS 10+) Встановити метадані режиму користувача в пісочниці.
|
||||
* **inspect (#16)**: Надати інформацію для налагодження про процес, що працює в пісочниці.
|
||||
* **dump (#18)**: (macOS 11) Вивантажити поточний профіль пісочниці для аналізу.
|
||||
* **vtrace (#19)**: Відстежувати операції пісочниці для моніторингу або налагодження.
|
||||
* **builtin\_profile\_deactivate (#20)**: (macOS < 11) Деактивувати названі профілі (наприклад, `pe_i_can_has_debugger`).
|
||||
* **check\_bulk (#21)**: Виконати кілька операцій `sandbox_check` в одному виклику.
|
||||
* **reference\_retain\_by\_audit\_token (#28)**: Створити посилання для аудиторського токена для використання в перевірках пісочниці.
|
||||
* **reference\_release (#29)**: Вивільнити раніше збережене посилання на аудиторський токен.
|
||||
* **rootless\_allows\_task\_for\_pid (#30)**: Перевірити, чи дозволено `task_for_pid` (схоже на перевірки `csr`).
|
||||
* **rootless\_whitelist\_push (#31)**: (macOS) Застосувати файл маніфесту системної цілісності (SIP).
|
||||
* **rootless\_whitelist\_check (preflight) (#32)**: Перевірити файл маніфесту SIP перед виконанням.
|
||||
* **rootless\_protected\_volume (#33)**: (macOS) Застосувати SIP захисти до диска або розділу.
|
||||
* **rootless\_mkdir\_protected (#34)**: Застосувати SIP/DataVault захист до процесу створення каталогу.
|
||||
|
||||
## Sandbox.kext
|
||||
|
||||
Зверніть увагу, що в iOS розширення ядра містить **жорстко закодовані всі профілі** всередині сегмента `__TEXT.__const`, щоб уникнути їх модифікації. Наступні функції з розширення ядра є цікавими:
|
||||
|
||||
* **`hook_policy_init`**: Він підключає `mpo_policy_init` і викликається після `mac_policy_register`. Він виконує більшість ініціалізацій пісочниці. Він також ініціалізує SIP.
|
||||
* **`hook_policy_initbsd`**: Налаштовує інтерфейс sysctl, реєструючи `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` та `security.mac.sandbox.debug_mode` (якщо завантажено з `PE_i_can_has_debugger`).
|
||||
* **`hook_policy_syscall`**: Викликається `mac_syscall` з "Sandbox" як першим аргументом і кодом, що вказує на операцію, у другому. Використовується оператор switch для знаходження коду для виконання відповідно до запитуваного коду.
|
||||
|
||||
### MACF Hooks
|
||||
|
||||
**`Sandbox.kext`** використовує більше ста хуків через MACF. Більшість хуків просто перевіряють деякі тривіальні випадки, які дозволяють виконати дію, якщо ні, вони викликають **`cred_sb_evalutate`** з **обліковими даними** з MACF та номером, що відповідає **операції**, яку потрібно виконати, і **буфером** для виходу.
|
||||
|
||||
Хорошим прикладом цього є функція **`_mpo_file_check_mmap`**, яка підключає **`mmap`** і яка почне перевіряти, чи буде нова пам'ять записуваною (і якщо ні, дозволить виконання), потім перевірить, чи використовується вона для спільного кешу dyld, і якщо так, дозволить виконання, а в кінці викличе **`cred_sb_evalutate`** для виконання подальших перевірок дозволу.
|
||||
|
||||
Більше того, з сотень хуків, які використовує пісочниця, є 3, які особливо цікаві:
|
||||
|
||||
* `mpo_proc_check_for`: Застосовує профіль, якщо це необхідно, і якщо він не був раніше застосований.
|
||||
* `mpo_vnode_check_exec`: Викликається, коли процес завантажує відповідний бінарний файл, потім виконується перевірка профілю, а також перевірка, що забороняє виконання SUID/SGID.
|
||||
* `mpo_cred_label_update_execve`: Це викликається, коли призначається мітка. Це найдовший, оскільки викликається, коли бінарний файл повністю завантажений, але ще не виконаний. Він виконає дії, такі як створення об'єкта пісочниці, прикріплення структури пісочниці до облікових даних kauth, видалення доступу до mach портів...
|
||||
|
||||
Зверніть увагу, що **`cred_sb_evalutate`** є обгорткою над **`sb_evaluate`**, і ця функція отримує передані облікові дані, а потім виконує оцінку, використовуючи функцію **`eval`**, яка зазвичай оцінює **профіль платформи**, який за замовчуванням застосовується до всіх процесів, а потім **специфічний профіль процесу**. Зверніть увагу, що профіль платформи є одним з основних компонентів **SIP** в macOS.
|
||||
|
||||
## Sandboxd
|
||||
|
||||
Пісочниця також має демон користувача, який працює, відкриваючи XPC Mach сервіс `com.apple.sandboxd` і прив'язуючи спеціальний порт 14 (`HOST_SEATBELT_PORT`), який розширення ядра використовує для зв'язку з ним. Він відкриває деякі функції, використовуючи MIG.
|
||||
|
||||
## References
|
||||
|
||||
* [**\*OS Internals Volume III**](https://newosxbook.com/home.html)
|
||||
|
||||
{% hint style="success" %}
|
||||
Вивчайте та практикуйте AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
<summary>Support HackTricks</summary>
|
||||
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# macOS SIP
|
||||
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Learn & practice AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -15,7 +15,6 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
|
|||
</details>
|
||||
{% endhint %}
|
||||
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
**Захист цілісності системи (SIP)** в macOS є механізмом, призначеним для запобігання навіть найбільш привілейованим користувачам вносити несанкціоновані зміни до ключових системних папок. Ця функція відіграє важливу роль у підтримці цілісності системи, обмежуючи дії, такі як додавання, модифікація або видалення файлів у захищених зонах. Основні папки, захищені SIP, включають:
|
||||
|
@ -52,12 +51,16 @@ drwxr-xr-x 338 root wheel restricted 10816 May 13 00:29 /usr/libexec
|
|||
|
||||
Більше того, якщо файл містить атрибут **`com.apple.rootless`** розширений **атрибут**, цей файл також буде **захищений SIP**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Зверніть увагу, що **Sandbox** хук **`hook_vnode_check_setextattr`** запобігає будь-яким спробам змінити розширений атрибут **`com.apple.rootless`.**
|
||||
{% endhint %}
|
||||
|
||||
**SIP також обмежує інші дії root**, такі як:
|
||||
|
||||
* Завантаження ненадійних розширень ядра
|
||||
* Отримання task-ports для процесів, підписаних Apple
|
||||
* Модифікація змінних NVRAM
|
||||
* Дозвіл на налагодження ядра
|
||||
* Зміна змінних NVRAM
|
||||
* Дозвіл налагодження ядра
|
||||
|
||||
Опції зберігаються у змінній nvram як бітовий прапорець (`csr-active-config` на Intel і `lp-sip0` читається з завантаженого Device Tree для ARM). Ви можете знайти прапорці в вихідному коді XNU у `csr.sh`:
|
||||
|
||||
|
@ -73,30 +76,44 @@ csrutil status
|
|||
```bash
|
||||
csrutil disable
|
||||
```
|
||||
Якщо ви хочете зберегти SIP увімкненим, але видалити захисти від налагодження, ви можете зробити це за допомогою:
|
||||
Якщо ви хочете зберегти SIP увімкненим, але видалити захист від налагодження, ви можете зробити це за допомогою:
|
||||
```bash
|
||||
csrutil enable --without debug
|
||||
```
|
||||
### Інші обмеження
|
||||
|
||||
* **Забороняє завантаження непідписаних розширень ядра** (kexts), забезпечуючи, щоб лише перевірені розширення взаємодіяли з ядром системи.
|
||||
* **Забороняє завантаження непідписаних розширень ядра** (kexts), забезпечуючи, що лише перевірені розширення взаємодіють з ядром системи.
|
||||
* **Запобігає налагодженню** процесів системи macOS, захищаючи основні компоненти системи від несанкціонованого доступу та модифікації.
|
||||
* **Гальмує інструменти** на кшталт dtrace від перевірки системних процесів, ще більше захищаючи цілісність роботи системи.
|
||||
|
||||
[**Дізнайтеся більше про інформацію SIP у цій доповіді**](https://www.slideshare.net/i0n1c/syscan360-stefan-esser-os-x-el-capitan-sinking-the-ship)**.**
|
||||
|
||||
### **Права, пов'язані з SIP**
|
||||
|
||||
* `com.apple.rootless.xpc.bootstrap`: Контроль launchd
|
||||
* `com.apple.rootless.install[.heritable]`: Доступ до файлової системи
|
||||
* `com.apple.rootless.kext-management`: `kext_request`
|
||||
* `com.apple.rootless.datavault.controller`: Керування UF\_DATAVAULT
|
||||
* `com.apple.rootless.xpc.bootstrap`: Можливості налаштування XPC
|
||||
* `com.apple.rootless.xpc.effective-root`: Root через launchd XPC
|
||||
* `com.apple.rootless.restricted-block-devices`: Доступ до сирих блочних пристроїв
|
||||
* `com.apple.rootless.internal.installer-equivalent`: Безперешкодний доступ до файлової системи
|
||||
* `com.apple.rootless.restricted-nvram-variables[.heritable]`: Повний доступ до NVRAM
|
||||
* `com.apple.rootless.storage.label`: Модифікувати файли, обмежені com.apple.rootless xattr з відповідною міткою
|
||||
* `com.apple.rootless.volume.VM.label`: Підтримувати обмін VM на томі
|
||||
|
||||
## Обхід SIP
|
||||
|
||||
Обхід SIP дозволяє зловмиснику:
|
||||
|
||||
* **Отримати доступ до даних користувача**: Читати чутливі дані користувача, такі як електронна пошта, повідомлення та історія Safari з усіх облікових записів користувачів.
|
||||
* **Доступ до даних користувача**: Читати чутливі дані користувача, такі як електронна пошта, повідомлення та історія Safari з усіх облікових записів користувачів.
|
||||
* **Обхід TCC**: Прямо маніпулювати базою даних TCC (Прозорість, Згода та Контроль), щоб надати несанкціонований доступ до веб-камери, мікрофона та інших ресурсів.
|
||||
* **Встановити постійність**: Розмістити шкідливе ПЗ в захищених SIP місцях, роблячи його стійким до видалення, навіть з правами root. Це також включає можливість підробки Інструменту видалення шкідливого ПЗ (MRT).
|
||||
* **Встановити постійність**: Розмістити шкідливе ПЗ в захищених SIP місцях, роблячи його стійким до видалення, навіть з правами root. Це також включає потенціал для підробки Інструменту видалення шкідливого ПЗ (MRT).
|
||||
* **Завантажувати розширення ядра**: Хоча є додаткові запобіжники, обхід SIP спрощує процес завантаження непідписаних розширень ядра.
|
||||
|
||||
### Пакети установників
|
||||
### Пакети установника
|
||||
|
||||
**Пакети установників, підписані сертифікатом Apple**, можуть обійти його захист. Це означає, що навіть пакети, підписані стандартними розробниками, будуть заблоковані, якщо вони намагатимуться змінити каталоги, захищені SIP.
|
||||
**Пакети установника, підписані сертифікатом Apple**, можуть обійти його захист. Це означає, що навіть пакети, підписані стандартними розробниками, будуть заблоковані, якщо вони намагатимуться змінити каталоги, захищені SIP.
|
||||
|
||||
### Невідомий файл SIP
|
||||
|
||||
|
@ -105,24 +122,24 @@ csrutil enable --without debug
|
|||
### com.apple.rootless.install.heritable
|
||||
|
||||
{% hint style="danger" %}
|
||||
Право **`com.apple.rootless.install.heritable`** дозволяє обійти SIP
|
||||
Права **`com.apple.rootless.install.heritable`** дозволяють обійти SIP
|
||||
{% endhint %}
|
||||
|
||||
#### [CVE-2019-8561](https://objective-see.org/blog/blog\_0x42.html) <a href="#cve" id="cve"></a>
|
||||
|
||||
Було виявлено, що можливо **поміняти пакет установника після того, як система перевірила його код** підпису, і тоді система встановлювала б шкідливий пакет замість оригінального. Оскільки ці дії виконувалися **`system_installd`**, це дозволяло обійти SIP.
|
||||
Було виявлено, що можливо **поміняти пакет установника після того, як система перевірила його код** підпису, і тоді система встановить шкідливий пакет замість оригінального. Оскільки ці дії виконувалися **`system_installd`**, це дозволяло обійти SIP.
|
||||
|
||||
#### [CVE-2020–9854](https://objective-see.org/blog/blog\_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
|
||||
|
||||
Якщо пакет було встановлено з змонтованого образу або зовнішнього диска, **установник** **виконував** двійковий файл з **цього файлового системи** (замість захищеного місця SIP), змушуючи **`system_installd`** виконувати довільний двійковий файл.
|
||||
Якщо пакет було встановлено з змонтованого образу або зовнішнього диска, **установник** **виконував** двійковий файл з **цієї файлової системи** (замість SIP-захищеного місця), змушуючи **`system_installd`** виконувати довільний двійковий файл.
|
||||
|
||||
#### CVE-2021-30892 - Shrootless
|
||||
|
||||
[**Дослідники з цього блогу**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) виявили вразливість у механізмі захисту цілісності системи (SIP) macOS, названу вразливістю 'Shrootless'. Ця вразливість зосереджена навколо демона **`system_installd`**, який має право **`com.apple.rootless.install.heritable`**, що дозволяє будь-якому з його дочірніх процесів обійти обмеження файлової системи SIP.
|
||||
[**Дослідники з цього блогу**](https://www.microsoft.com/en-us/security/blog/2021/10/28/microsoft-finds-new-macos-vulnerability-shrootless-that-could-bypass-system-integrity-protection/) виявили вразливість у механізмі захисту цілісності системи (SIP) macOS, відому як вразливість 'Shrootless'. Ця вразливість зосереджена навколо демона **`system_installd`**, який має право **`com.apple.rootless.install.heritable`**, що дозволяє будь-якому з його дочірніх процесів обходити обмеження файлової системи SIP.
|
||||
|
||||
Демон **`system_installd`** буде встановлювати пакети, які були підписані **Apple**.
|
||||
|
||||
Дослідники виявили, що під час установки пакета, підписаного Apple (.pkg файл), **`system_installd`** **виконує** будь-які **скрипти після установки**, включені в пакет. Ці скрипти виконуються за допомогою стандартної оболонки, **`zsh`**, яка автоматично **виконує** команди з файлу **`/etc/zshenv`**, якщо він існує, навіть у неінтерактивному режимі. Цю поведінку можуть використовувати зловмисники: створивши шкідливий файл `/etc/zshenv` і чекаючи, поки **`system_installd` викличе `zsh`**, вони можуть виконувати довільні операції на пристрої.
|
||||
Дослідники виявили, що під час встановлення пакета, підписаного Apple (.pkg файл), **`system_installd`** **виконує** будь-які **скрипти після установки**, включені в пакет. Ці скрипти виконуються за допомогою стандартної оболонки, **`zsh`**, яка автоматично **виконує** команди з файлу **`/etc/zshenv`**, якщо він існує, навіть у неінтерактивному режимі. Цю поведінку можна використовувати зловмисниками: створивши шкідливий файл `/etc/zshenv` і чекаючи, поки **`system_installd` викличе `zsh`**, вони можуть виконувати довільні операції на пристрої.
|
||||
|
||||
Більше того, було виявлено, що **`/etc/zshenv` може використовуватися як загальна техніка атаки**, не лише для обходу SIP. Кожен профіль користувача має файл `~/.zshenv`, який поводиться так само, як `/etc/zshenv`, але не вимагає прав root. Цей файл може використовуватися як механізм постійності, спрацьовуючи щоразу, коли запускається `zsh`, або як механізм підвищення привілеїв. Якщо адміністратор підвищує привілеї до root, використовуючи `sudo -s` або `sudo <command>`, файл `~/.zshenv` буде спрацьовувати, ефективно підвищуючи привілеї до root.
|
||||
|
||||
|
@ -132,7 +149,7 @@ csrutil enable --without debug
|
|||
|
||||
#### [fsck\_cs utility](https://www.theregister.com/2016/03/30/apple\_os\_x\_rootless/)
|
||||
|
||||
Виявлено вразливість, при якій **`fsck_cs`** був введений в оману, що призвело до пошкодження важливого файлу, через його здатність слідувати **символічним посиланням**. Зокрема, зловмисники створили посилання з _`/dev/diskX`_ на файл `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`. Виконання **`fsck_cs`** на _`/dev/diskX`_ призвело до пошкодження `Info.plist`. Цілісність цього файлу є важливою для SIP (Захист цілісності системи) операційної системи, яка контролює завантаження розширень ядра. Після пошкодження здатність SIP управляти виключеннями ядра порушується.
|
||||
Виявлено вразливість, при якій **`fsck_cs`** був введений в оману, що призвело до пошкодження важливого файлу, через його здатність слідувати **символічним посиланням**. Зокрема, зловмисники створили посилання з _`/dev/diskX`_ на файл `/System/Library/Extensions/AppleKextExcludeList.kext/Contents/Info.plist`. Виконання **`fsck_cs`** на _`/dev/diskX`_ призвело до пошкодження `Info.plist`. Цілісність цього файлу є важливою для SIP (Захист цілісності системи) операційної системи, яка контролює завантаження розширень ядра. Після пошкодження здатність SIP керувати виключеннями ядра порушується.
|
||||
|
||||
Команди для використання цієї вразливості:
|
||||
```bash
|
||||
|
@ -193,8 +210,8 @@ Sealed System Snapshots are a feature introduced by Apple in **macOS Big Sur (ma
|
|||
Here's a more detailed look:
|
||||
|
||||
1. **Незмінна система**: Sealed System Snapshots роблять об'єм системи macOS "незмінним", що означає, що його не можна змінювати. Це запобігає будь-яким несанкціонованим або випадковим змінам системи, які можуть загрожувати безпеці або стабільності системи.
|
||||
2. **Оновлення системного програмного забезпечення**: Коли ви встановлюєте оновлення або апгрейди macOS, macOS створює новий знімок системи. Об'єм завантаження macOS потім використовує **APFS (Apple File System)** для переходу на цей новий знімок. Увесь процес застосування оновлень стає безпечнішим і надійнішим, оскільки система завжди може повернутися до попереднього знімка, якщо щось піде не так під час оновлення.
|
||||
3. **Розділення даних**: У поєднанні з концепцією розділення об'ємів даних і системи, введеною в macOS Catalina, функція Sealed System Snapshot забезпечує зберігання всіх ваших даних і налаштувань на окремому об'ємі "**Дані**". Це розділення робить ваші дані незалежними від системи, що спрощує процес оновлення системи та підвищує безпеку системи.
|
||||
2. **Оновлення системного програмного забезпечення**: Коли ви встановлюєте оновлення або апгрейди macOS, macOS створює новий знімок системи. Об'єм завантаження macOS потім використовує **APFS (Apple File System)** для переходу на цей новий знімок. Весь процес застосування оновлень стає безпечнішим і надійнішим, оскільки система завжди може повернутися до попереднього знімка, якщо щось піде не так під час оновлення.
|
||||
3. **Розділення даних**: У поєднанні з концепцією розділення об'ємів даних і системи, введеною в macOS Catalina, функція Sealed System Snapshot забезпечує, що всі ваші дані та налаштування зберігаються на окремому об'ємі "**Data**". Це розділення робить ваші дані незалежними від системи, що спрощує процес оновлення системи та підвищує безпеку системи.
|
||||
|
||||
Пам'ятайте, що ці знімки автоматично керуються macOS і не займають додаткового місця на вашому диску завдяки можливостям спільного використання простору APFS. Також важливо зазначити, що ці знімки відрізняються від **знімків Time Machine**, які є резервними копіями всієї системи, доступними для користувача.
|
||||
|
||||
|
@ -254,17 +271,16 @@ mount
|
|||
/dev/disk3s1s1 on / (apfs, sealed, local, read-only, journaled)
|
||||
```
|
||||
{% hint style="success" %}
|
||||
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
Вивчайте та практикуйте AWS Hacking:<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../.gitbook/assets/arte.png" alt="" data-size="line">\
|
||||
Вивчайте та практикуйте GCP Hacking: <img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Support HackTricks</summary>
|
||||
<summary>Підтримайте HackTricks</summary>
|
||||
|
||||
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||
|
||||
</details>
|
||||
{% endhint %}
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue