macOS Electron Applications Injection
Основна інформація
Якщо ви не знаєте, що таке Electron, ви можете знайти багато інформації тут. Але наразі просто знайте, що Electron запускає node. І у node є деякі параметри та змінні середовища, які можна використовувати для виконання іншого коду, крім вказаного файлу.
Електронні плавки
Ці техніки будуть обговорені далі, але останнім часом Electron додав кілька прапорців безпеки для їх запобігання. Це Електронні плавки, які використовуються для запобігання додаткам 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: Якщо ввімкнено, сховище файлів cookie на диску шифрується за допомогою ключів криптографії рівня ОС.
Перевірка Електронних Плавок
Ви можете перевірити ці прапорці з додатка за допомогою:
Зміна Електронних Плавок
Як зазначено в документації, конфігурація Електронних Плавок налаштовується всередині бінарного файлу Електрона, який містить десь рядок dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
.
У додатках для macOS це зазвичай знаходиться в application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
Ви можете завантажити цей файл на https://hexed.it/ та знайти попередній рядок. Після цього рядка ви можете побачити у коду ASCII число "0" або "1", що вказує, чи вимкнені або увімкнені кожен плавник. Просто змініть шістнадцятковий код (0x30
- це 0
, а 0x31
- це 1
) для зміни значень плавників.
Зверніть увагу, що якщо ви спробуєте перезаписати бінарний файл Electron Framework всередині додатка зі зміненими байтами, додаток не запуститься.
RCE додавання коду до додатків Electron
Можуть бути зовнішні файли JS/HTML, які використовує додаток Electron, тому зловмисник може впровадити код у ці файли, підпис яких не буде перевірений, та виконати довільний код в контексті додатка.
Однак на даний момент є 2 обмеження:
Для модифікації додатка потрібно дозвіл
kTCCServiceSystemPolicyAppBundles
, тому за замовчуванням це більше не можливо.Скомпільований файл
asap
зазвичай має плавникиembeddedAsarIntegrityValidation
таonlyLoadAppFromAsar
, які увімкнені
Це ускладнює (або робить неможливим) цей шлях атаки.
Зверніть увагу, що можливо обійти вимогу kTCCServiceSystemPolicyAppBundles
, скопіювавши додаток в інший каталог (наприклад, /tmp
), перейменувавши папку app.app/Contents
на app.app/NotCon
, змінивши файл asar за вашим зловмисним кодом, знову перейменувавши його на app.app/Contents
та виконавши його.
Ви можете розпакувати код з файлу asar за допомогою:
І запакуйте його назад після внесення змін за допомогою:
Виконання коду з ELECTRON_RUN_AS_NODE
ELECTRON_RUN_AS_NODE
Згідно з документацією, якщо ця змінна середовища встановлена, вона запустить процес як звичайний процес Node.js.
Якщо функція RunAsNode
вимкнена, змінна середовища ELECTRON_RUN_AS_NODE
буде ігноруватися, і це не спрацює.
Впровадження з файлу Plist додатка
Як було запропоновано тут, ви можете зловживати цією змінною середовища в plist для збереження постійності:
RCE з NODE_OPTIONS
NODE_OPTIONS
Ви можете зберегти вразливість у різному файлі та виконати її:
Якщо плавка EnableNodeOptionsEnvironmentVariable
вимкнена, додаток ігноруватиме змінну середовища NODE_OPTIONS при запуску, якщо змінна середовища ELECTRON_RUN_AS_NODE
не встановлена, що також буде ігноруватися, якщо плавка RunAsNode
вимкнена.
Якщо ви не встановите ELECTRON_RUN_AS_NODE
, ви отримаєте помилку: Більшість NODE_OPTIONs не підтримуються в упакованих додатках. Див. документацію для отримання додаткової інформації.
Впровадження з файлу Plist додатка
Ви можете зловживати цією змінною середовища в файлі Plist для збереження постійності, додавши ці ключі:
ВПК з інспектуванням
Згідно з цим, якщо ви запускаєте додаток Electron з прапорцями, такими як --inspect
, --inspect-brk
та --remote-debugging-port
, буде відкритий порт для налагодження, до якого ви зможете підключитися (наприклад, з Chrome за адресою chrome://inspect
) і ви зможете впроваджувати код в нього або навіть запускати нові процеси.
Наприклад:
Якщо плавник EnableNodeCliInspectArguments
вимкнено, додаток ігноруватиме параметри вузла (такі як --inspect
) при запуску, якщо змінна середовища ELECTRON_RUN_AS_NODE
не встановлена, яка також буде ігноруватися, якщо плавник RunAsNode
вимкнено.
Однак ви все ще можете використовувати параметр електрону --remote-debugging-port=9229
, але попередній вантаж не буде працювати для виконання інших процесів.
Використовуючи параметр --remote-debugging-port=9222
, можна вкрасти деяку інформацію з додатка Electron, таку як історію (з командами GET) або куки браузера (оскільки вони розшифровуються всередині браузера, і є кінцева точка json, яка їх надасть).
Ви можете дізнатися, як це зробити тут і тут та використовувати автоматичний інструмент WhiteChocolateMacademiaNut або простий скрипт, подібний до:
У цьому блозі, це використовується для виклику налагодження, щоб зробити headless chrome завантаження довільних файлів у довільні місця.
Впровадження з файлу Plist додатка
Ви можете використовувати цю змінну середовища в файлі plist для збереження постійності, додаючи ці ключі:
Обхід TCC за допомогою старих версій
Демон TCC з macOS не перевіряє виконувану версію додатка. Тому, якщо ви не можете впровадити код в електронний додаток жодним із попередніх методів, ви можете завантажити попередню версію ДОДАТКА та впровадити код в нього, оскільки він все ще отримає привілеї TCC (якщо кеш довіри не запобігає цьому).
Запуск не JS-коду
Попередні методи дозволять вам виконувати JS-код у процесі електронного додатка. Однак пам'ятайте, що дочірні процеси працюють під тим самим профілем пісочниці, що і батьківський додаток, та успадковують їх дозволи TCC. Отже, якщо ви хочете зловживати дозволами для доступу до камери або мікрофона, наприклад, ви можете просто запустити інший виконуваний файл з процесу.
Автоматичне впровадження
Інструмент electroniz3r може бути легко використаний для пошуку вразливих електронних додатків, встановлених на комп'ютері, та впровадження коду в них. Цей інструмент спробує використати техніку --inspect
:
Вам потрібно скомпілювати його самостійно та використовувати його таким чином:
Посилання
Last updated