macOS Electron Applications Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Якщо ви не знаєте, що таке Electron, ви можете знайти багато інформації тут. Але поки просто знайте, що Electron працює на node. А node має деякі параметри та змінні середовища, які можна використовувати для виконання іншого коду окрім вказаного файлу.
Ці техніки будуть обговорені далі, але в останні часи Electron додав кілька параметрів безпеки для їх запобігання. Це Electron Fuses і це ті, що використовуються для запобігання завантаженню Electron додатків в macOS произвольного коду:
RunAsNode
: Якщо вимкнено, заважає використанню змінної середовища ELECTRON_RUN_AS_NODE
для ін'єкції коду.
EnableNodeCliInspectArguments
: Якщо вимкнено, параметри, такі як --inspect
, --inspect-brk
, не будуть враховані. Уникаючи таким чином ін'єкції коду.
EnableEmbeddedAsarIntegrityValidation
: Якщо увімкнено, завантажений asar
файл буде перевірений macOS. Запобігаючи таким чином ін'єкції коду шляхом модифікації вмісту цього файлу.
OnlyLoadAppFromAsar
: Якщо це увімкнено, замість пошуку завантаження в наступному порядку: app.asar
, app
і нарешті default_app.asar
. Він перевірятиме та використовуватиме лише app.asar, таким чином забезпечуючи, що при поєднанні з параметром embeddedAsarIntegrityValidation
неможливо завантажити неперевірений код.
LoadBrowserProcessSpecificV8Snapshot
: Якщо увімкнено, процес браузера використовує файл під назвою browser_v8_context_snapshot.bin
для свого V8 знімка.
Ще один цікавий параметр, який не запобігатиме ін'єкції коду:
EnableCookieEncryption: Якщо увімкнено, сховище куків на диску шифрується за допомогою криптографічних ключів на рівні ОС.
Ви можете перевірити ці параметри з програми за допомогою:
Як згадують документи, конфігурація Electron Fuses налаштовується всередині бінарного файлу Electron, який містить десь рядок dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
.
У macOS додатках це зазвичай знаходиться в application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
Ви можете завантажити цей файл у https://hexed.it/ і знайти попередній рядок. Після цього рядка ви можете побачити в ASCII число "0" або "1", що вказує, чи кожен запобіжник вимкнений або увімкнений. Просто змініть шістнадцятковий код (0x30
- це 0
, а 0x31
- це 1
), щоб змінити значення запобіжників.
Зверніть увагу, що якщо ви спробуєте перезаписати бінарний файл Electron Framework
всередині програми з цими зміненими байтами, програма не запуститься.
Можуть бути зовнішні JS/HTML файли, які використовує Electron App, тому зловмисник може впровадити код у ці файли, підпис яких не буде перевірятися, і виконати довільний код в контексті програми.
Однак на даний момент є 2 обмеження:
Дозвіл kTCCServiceSystemPolicyAppBundles
є необхідним для зміни програми, тому за замовчуванням це більше не можливо.
Скомпільований файл asap
зазвичай має запобіжники embeddedAsarIntegrityValidation
та
onlyLoadAppFromAsar
увімкненими
Це ускладнює (або робить неможливим) цей шлях атаки.
Зверніть увагу, що можна обійти вимогу kTCCServiceSystemPolicyAppBundles
, скопіювавши програму в інший каталог (наприклад, /tmp
), перейменувавши папку app.app/Contents
на app.app/NotCon
, змінивши файл asar з вашим зловмисним кодом, перейменувавши його назад на app.app/Contents
і виконавши його.
Ви можете розпакувати код з файлу asar за допомогою:
І запакуйте його назад після внесення змін за допомогою:
ELECTRON_RUN_AS_NODE
Згідно з документацією, якщо ця змінна середовища встановлена, вона запустить процес як звичайний процес Node.js.
Якщо запобіжник RunAsNode
вимкнено, змінна середовища ELECTRON_RUN_AS_NODE
буде проігнорована, і це не спрацює.
Як пропонується тут, ви можете зловживати цією змінною середовища в plist для підтримки постійності:
NODE_OPTIONS
Ви можете зберегти корисне навантаження в іншому файлі та виконати його:
Якщо запобіжник EnableNodeOptionsEnvironmentVariable
є вимкненим, додаток буде ігнорувати змінну середовища NODE_OPTIONS під час запуску, якщо змінна середовища ELECTRON_RUN_AS_NODE
не встановлена, яка також буде ігноруватися, якщо запобіжник RunAsNode
вимкнений.
Якщо ви не встановите ELECTRON_RUN_AS_NODE
, ви отримаєте помилку: Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
Ви можете зловживати цією змінною середовища в plist для підтримки постійності, додавши ці ключі:
Згідно з цією інформацією, якщо ви виконаєте додаток Electron з такими прапорами, як --inspect
, --inspect-brk
та --remote-debugging-port
, порт для налагодження буде відкритий, тому ви зможете підключитися до нього (наприклад, з Chrome у chrome://inspect
) і ви зможете впровадити код у нього або навіть запустити нові процеси.
Наприклад:
Якщо запобіжник EnableNodeCliInspectArguments
вимкнено, додаток ігноруватиме параметри node (такі як --inspect
) під час запуску, якщо змінна середовища ELECTRON_RUN_AS_NODE
не встановлена, яка також буде ігноруватися, якщо запобіжник RunAsNode
вимкнено.
Однак, ви все ще можете використовувати параметр electron --remote-debugging-port=9229
, але попереднє навантаження не спрацює для виконання інших процесів.
Використовуючи параметр --remote-debugging-port=9222
, можливо вкрасти деяку інформацію з Electron App, таку як історія (з командами GET) або куки браузера (оскільки вони дешифруються всередині браузера і є json-інтерфейс, який їх надає).
Ви можете дізнатися, як це зробити тут і тут та використовувати автоматичний інструмент WhiteChocolateMacademiaNut або простий скрипт, як:
В цьому блозі це налагодження зловживається для того, щоб безголовий chrome завантажував довільні файли в довільні місця.
Ви можете зловживати цією змінною середовища в plist для підтримки постійності, додавши ці ключі:
Демон TCC з macOS не перевіряє виконувану версію програми. Тому, якщо ви не можете інжектувати код в Electron додаток за допомогою будь-якої з попередніх технік, ви можете завантажити попередню версію APP і інжектувати код в неї, оскільки вона все ще отримає привілеї TCC (якщо тільки Trust Cache не завадить цьому).
Попередні техніки дозволять вам виконувати JS код всередині процесу електронного додатку. Однак пам'ятайте, що дочірні процеси працюють під тим же профілем пісочниці, що й батьківський додаток, і успадковують їхні TCC дозволи. Отже, якщо ви хочете зловживати правами доступу до камери або мікрофона, наприклад, ви можете просто виконати інший бінарний файл з процесу.
Інструмент electroniz3r можна легко використовувати для пошуку вразливих електронних додатків, які встановлені, і інжектування коду в них. Цей інструмент спробує використати техніку --inspect
:
Вам потрібно скомпілювати його самостійно і ви можете використовувати його так:
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)