
У цій статті ви відкриєте для себе інноваційний інструмент Pandora, який допомагає виявляти слабкі місця в популярних менеджерах паролів. Ви дізнаєтеся, як саме цей інструмент аналізує дані у пам’яті комп’ютера, які ризики можуть загрожувати вашим обліковим записам, і як використовувати Pandora для підвищення безпеки.
Це червоний командний інструмент, який допомагає збирати облікові дані від різних менеджерів паролів. Вони розділені на три категорії: настільні програми Windows 10, браузери та плагіни браузера. Це може працювати на інших ОС, наприклад Linux, але це ще не перевірено. У цьому випуску (версія 1.0) інструмент підтримує 14 менеджерів паролів із 18 різними реалізаціями (наприклад, інструмент може виводити облікові дані з програми для настільних комп’ютерів або плагіна браузера того самого продукту). Зокрема, у більшості випадків менеджери паролів мають бути запущені та розблоковані, щоб інструмент працював.
Інструмент може працювати в повному, швидкому та локальному режимах. Повний режим створює дамп і перевіряє всі процеси цього менеджера паролів. Швидкий режим перевіряє найпоширеніший процес, який зазвичай містить облікові дані. Локальний режим перевіряє файл дампа локально. Крім того, у локальному режимі є опція «злиття», яка може допомогти об’єднати кілька файлів дампа в один перед виконанням аналізу. Крім того, інструмент може перевірити, чи існує каталог менеджера паролів, щоб допомогти користувачеві визначити, який менеджер паролів можна використовувати на цьому хості. Інструменту знадобляться лише звичайні дозволи користувача , щоб отримати дамп процесу з менеджера паролів. Лише настільна програма 1Password вимагає високих привілеїв цілісності, щоб користувач міг зробити дамп процесу.
Таким чином, мета цього інструменту полягає в тому, щоб забезпечити додатковий вектор атаки в червоних командних залученнях, оскільки багато користувачів використовують менеджери паролів. Щоб зрозуміти, як працює цей інструмент, було завантажено три різні відео.
Щодо усунення цих проблем більшість постачальників відповіли, що такі проблеми виходять за межі їх компетенції, оскільки зловмиснику потрібен локальний доступ або AV/EDR має захистити користувача від таких атак. Хоча деякі продукти можуть надавати виправлення, їхні експлойти будуть випущені пізніше (вони ще розкриваються). Наразі два постачальники визнали цю проблему та надали виправлення з CVE-2023-23349 (Kaspersky) і CVE-2024-9203 (Enpass) .
Це не зовсім нова концепція. Деякий час було добре відомо, що де-факто не існує способу захисту настільних програм від таких атак. Однак, наскільки мені відомо, це перший раз, коли такий інструмент був представлений громадськості. Не соромтеся надавати будь-які відгуки та/або рекомендації/покращення. Інструмент обробляє лише відповідні версії. Оновлення менеджера паролів потенційно може змінити шаблон, який інструмент використовує для ідентифікації облікових даних. Побудований на “с++”
Просто клонуйте код і скомпілюйте його. Для етапу розробки використовувалася Visual Studio 2022.
1. Встановіть Visual Studio 2022 з усіма залежностями C++.
2. Клонуйте репо.
git clone https://github.com/efchatz/pandora.git
3. Відкрийте проект.
4. Створіть цей проект як випуск.
У разі проблеми з “DbgHelp.lib” виконайте такі дії:
У проекті->Властивості->Компонувальник->Введення виберіть у спадному списку «Конфігурація» «Усі конфігурації».
Додайте в «Додаткові залежності» «DbgHelp.lib».
На тій же вкладці в «Ігнорувати всі бібліотеки за замовчуванням» виберіть «Ні».
Натисніть «ОК».
Користувач вибирає режим (повний, швидкий, локальний). Повний режим скидає всі процеси з менеджера паролів, а швидкий скидає найпоширеніший, який у більшості випадків містить облікові дані. Локальний режим виконується локально під час надання файлу дампа.
Тоді користувач має можливість перевірити, який менеджер паролів встановлено для програми чи плагіна, вибравши так чи ні. Код перевіряє, чи існує шлях встановлення за замовчуванням кожного менеджера паролів, і надає вихідні дані. Зауважте, що під час встановлення більшість менеджерів паролів не дозволяють користувачеві змінювати шлях встановлення за замовчуванням. Наприклад, Keeper встановлюється безпосередньо з MS Store. Таким чином, цей метод може допомогти визначити, який менеджер паролів встановлено. Зауважте, що в повному режимі інструмент не перевірятиме фактичний розмір кожного файлу процесу, який буде створено. Отже, якщо на хості немає необхідного вільного місця, деякі процеси не буде створено, і повідомлення про помилку не буде показано.
Користувач вибирає відповідний менеджер паролів.
Якщо користувач вибере «локальний» режим, його запитають, чи хочуть вони об’єднати різні файли дампа. Якщо так, вони повинні вказати свої назви файлів, по одному на рядок, і ввести «done» в кінці. В іншому випадку їм потрібно буде лише вказати назву файлу дампа.
На основі відповідного менеджера паролів інструмент скидає процес у файл.
Потім файл дампа аналізується, щоб виявити в ньому будь-який відповідний шаблон, щоб отримати облікові дані.
У деяких випадках користувачеві будуть представлені небажані дані. Ці дані будуть помічені як нерозібрані символи. Тому їх легко впізнати.
Після цього користувач може ідентифікувати облікові дані (або у вихідних даних cmd, або у відповідному текстовому файлі).
Слід зазначити, що в деяких випадках менеджери паролів зберігають у відкритому вигляді інші типи даних, наприклад дані кредитної картки, адреси, паролі Wi-Fi тощо. Користувачам слід остерігатися таких атак і не запускати ненадійні файли, вмикати 2FA тощо.
Що стосується експлойтів, методологія проста, тобто мета полягає в тому, щоб ідентифікувати шаблон або ключове слово, яке б точно вказало відповідні облікові дані у файлі дампа. Кожен менеджер паролів відрізняється, тому кожен метод використання відрізняється. Однак концепція та сама, тобто пошук відповідного шаблону може точно визначити облікові дані в цьому файлі. У деяких випадках експлойт знаходить, коли починаються облікові дані, а потім збирає наступні байти, скажімо, 100. Ми провели багато тестів, щоб правильно визначити ці значення, але вони можуть відрізнятися в реальному випадку. Відкрийте проблему, якщо ви хочете запропонувати інший менеджер паролів для включення в цей інструмент, який містить облікові дані у відкритому текстовому форматі в рамках процесу.
Зауважте, що інструмент видалить відповідний файл app.dmp наприкінці виконання. Спробуйте закоментувати цей рядок у коді ‘remove(“app.dmp”);’, якщо ви хочете зберегти відповідний файл дампа. Як правило, рекомендується спочатку виконати код у обмеженому середовищі, у якому будуть відомі облікові дані головного/вхідного коду, спостерігати за відповідним виводом, а потім виконати його на іншому хості.
Будь-які додаткові відомості можна знайти в нашій дослідницькій роботі під назвою «Закривайте дамп пам’яті: Виявлення витоків даних у менеджерах паролів».
Щоб скористатися цим інструментом, просто запустіть скомпільований виконуваний файл на відповідному хості та введіть ім’я менеджера паролів. Залежно від менеджера паролів існують певні вимоги до інструмента, щоб він міг отримати облікові дані. Однак у більшості випадків ми зберігали менеджери паролів, яким потрібна була базова взаємодія, щоб зберегти свої облікові дані в пам’яті свого процесу. Після запуску інструмент автоматично створить дамп відповідного процесу на основі вибраного менеджера паролів, надрукує облікові дані в cmd і збереже їх у файлі (розташуванням файлу є поточна папка .exe).
Щоб зрозуміти, як працює цей інструмент, було завантажено три відео. На відео показано фазу, на якій зловмисник зможе отримати облікові дані від менеджера паролів. У випадку з Avira та подібними менеджерами паролів це можна зробити без будь-якої взаємодії з користувачем (перегляньте відповідне відео).
У наведеній нижче таблиці представлено загальне уявлення про можливості інструменту. Зауважте, що Firefox і відповідні плагіни менеджерів паролів Firefox можуть не працювати належним чином. Їм потрібні додаткові дослідження, щоб інструмент міг отримати облікові дані в кожному випадку. Це тому, що Firefox змінює свій шаблон із кожним виконанням.
Примітка. Стовпець «Користувачі» стосується кількості користувачів, згаданих у Веб-магазині Chrome для кожного плагіна веб-переглядача. Плагіни браузера перевірялися за допомогою Chrome v129.0.6668.89/.90. Пізніші версії Chrome можуть заважати та змінювати шаблон кожного плагіна веб-переглядача.
Що стосується вилучення облікових даних, деякі експлойти базуються на певній кількості байтів для вилучення облікових даних. Тому, можливо, у деяких випадках це число потрібно збільшити, щоб отримати цю інформацію правильно. Під час експериментів використовувалися загальні імена користувачів і паролі. Тому в більшості випадків цього буде достатньо.
Ще одна примітка стосується версії кожного менеджера паролів плагіна браузера. Якщо в код внесено зміни, які вплинуть на процес, інструмент може не визначити ці облікові дані. Отже, майте на увазі, що існує ймовірність неправильного поводження з деякими обліковими даними, якщо використовується старіша/новіша версія інструменту або запущена інша ОС (перевірено на Windows 10 Pro).
У більшості випадків для отримання облікових даних знадобиться:
Відповідна програма (браузер або настільна програма) запущена, розблокована та працює.
У деяких випадках, як-от у браузерах Chromium, потрібно здійснити взаємодію або з відповідним плагіном, або з вбудованим менеджером паролів браузера.
В інших випадках деякі менеджери паролів зберігають ці облікові дані відкритим текстом у пам’яті навіть після блокування. Така поведінка була помічена в Keeper.
У випадку 1Password потрібен високий рівень цілісності. Отже, виконайте .exe з високими привілеями або надайте файл дампа як вхідні дані.
Усі тести проводилися з налаштуваннями за замовчуванням кожного менеджера паролів.
Достатньо згадати, що оскільки поведінка користувача полягає в тому, щоб відкривати такі програми та залишати їх відкритими, це забезпечить додатковий вектор атаки для бічного руху. Іншим ключовим моментом є те, що більшість із цих інструментів автоматично блокуються, коли користувач повністю не працює. Це означає, що навіть якщо програма або плагін браузера неактивні, а користувач використовує свій хост для інших дій, ці програми не буде заблоковано. Також у деяких випадках можна повністю уникнути взаємодії з користувачем. Наприклад, деякі плагіни браузера деякий час залишаються розблокованими. Як наслідок, можна розпочати цей процес із cmd, не потребуючи користувача й витягувати облікові дані. Перегляньте відеоприклад Avira, щоб зрозуміти цей процес.
Слід зазначити, що в деяких випадках, як-от KeePass, StickyPassword і Opera, у пам’яті не було виявлено жодних облікових даних як відкритий текст.
Ми працюємо над випуском наукової статті, яка описуватиме експерименти та будь-які інші відповідні деталі.
Цей розділ присвячено будь-яким попереднім умовам, які знадобляться інструменту, щоб мати можливість скидати облікові дані з менеджера паролів.
Процесу 1Password потрібні високі привілеї цілісності, щоб інструмент міг створити дамп відповідного процесу та отримати облікові дані. Для отримання облікових даних було відкрито програму, введено головний пароль, а після очікування щонайменше 1 хвилини запущено інструмент для скидання облікових даних. Наступний знімок екрана ілюструє виконання інструменту, коли запущено відповідну програму. Приховані дані стосуються головного пароля. Зауважте, що вихідні дані можуть містити зайві символи в кінці повернутого рядка; на скріншоті лише останній символ не включений у головний пароль. Слід також зазначити, що інструмент не може отримати головний пароль, якщо користувач вставив його у відповідне поле. Чомусь 1password не зберігає в процесі головний пароль, якщо його вставив користувач. Щодо плагіна 1Password доступні головні облікові дані.
Відео було призупинено, щоб зменшити розмір. Спочатку Chrome відкривається з cmd, потім чекає принаймні 1 хв. Це означає, що зловмисник може запустити процес Chrome без будь-якої взаємодії з користувачем, оскільки Avira не вимагає від користувача введення головного пароля. Після цього було виконано запуск Pandora, після чого здійснено очікування для отримання облікових даних. Інструмент шукає відповідні записи. Як видно, кожен запис відображається в окремому рядку, тобто назва сайту, пароль і відповідне ім’я користувача. Зауважте, що безголовий режим не запускає плагіни браузера. Отже, щоб ця атака спрацювала, Chrome має бути видимим.
Bitdefender зберігає записи лише тоді, коли вони потрібні, наприклад, коли користувач відвідує URL-адресу, яка належить до запису. Однак головний пароль зберігається після його введення користувачем. У результаті виникає випадок, коли зловмисник може скинути головний пароль. Інструмент не перевіряє записи, лише головний пароль.
Bitwarden імпортує всі записи одразу після розблокування сховища. Деякі записи відображатимуться кілька разів, оскільки інструмент знайде їх і створить дамп із файлу дампа.
Для програми доступні лише головний пароль та ім’я користувача. Слід зазначити, що програма очищає головний пароль із пам’яті через деякий час (приблизно 10 хвилин). Наступні знімки екрана ілюструють отримання даних головного пароля (поверненого двічі) та імені користувача.
NordPass зберігає головне ім’я користувача та пароль. Таким чином, обидва вони можуть бути отримані з пам’яті відповідного процесу. Що стосується головного пароля, буде повернуто лише один шаблон. Для імені користувача наступний знімок екрана ілюструє результат.
Обидва браузери мають однакову поведінку, вони зберігають ім’я користувача та пароль форми входу, з якою вони взаємодіють, і вони зберегли облікові дані, але щоб отримати всі записи, користувач повинен відвідати функцію диспетчера паролів браузера або зловмисник, щоб відкрити браузер і відвідайте цю сторінку. Змініть ключове слово, щоб шукати певний веб-сайт або електронну адресу в процесі. Крім того, усі браузери Chromium можуть запускатися без взаємодії з користувачем. Наприклад, сценарій VBS (не OPSEC) можна використати для запуску браузера та відвідування “chrome://password-manager/passwords”. Потім інструмент може витягти всі записи, як показано на наступному знімку екрана:
Зауважте, що сторінку менеджера паролів потрібно відвідати один раз, тобто навіть якщо менеджер паролів закрито, а браузер не завершено та розпочато інший процес, облікові дані зберігатимуться в пам’яті. В іншому випадку користувач відвідає веб-сторінку, де менеджер паролів зберіг свої облікові дані, і тоді ці облікові дані будуть збережені в процесі.
MSEdge відрізняється, тобто відкритим має бути лише браузер. Не обов’язково, щоб хтось відвідував сторінку менеджера паролів. MSEdge, здається, попередньо завантажує менеджер паролів одразу після відкриття. У результаті інструмент може витягувати всі записи, маючи той самий вихід, що й у двох інших браузерах.
Коли Dashlane розблоковано та з ним будь-яким чином взаємодіють, протягом наступної 1 хвилини записи будуть доступні. Після цього в процесі залишається тільки головний пароль. Залежно від випадку інструмент збиратиме відповідні облікові дані, як показано на наступних знімках екрана. Перший знімок екрана ілюструє випадок, коли головний пароль доступний, а другий знімок екрана, коли записи доступні.
Що стосується Enpass, програма автоматично вибирає останній запис, який користувач натиснув перед закриттям програми. У результаті можна отримати цей запис із процесу за допомогою мінімальної взаємодії користувача (просто відкривши програму). Слід зазначити, що іноді програма не вибирає автоматично останній запис, коли користувач відкриває її. Отже, щоб прискорити процес запису, користувач вручну вибирає запис. Цю проблему вирішено у v6.11.3.
Firefox використовує інший шаблон кожного разу, коли він завантажує облікові дані або з вбудованого менеджера паролів, або з іншого плагіна браузера. З цієї причини пошук виконується на основі звичайних електронних адрес, які також використовуються як імена користувачів, як-от “@gmail.com”. Код шукатиме цей рядок і друкуватиме деякі відповідні дані до та після цього. Слід зазначити, що користувач може включити додаткові рядки (перевірте файл getCredsfirefox2.h), але вихід буде величезним (особливо, якщо користувач скидає всі процеси). Тому пропонується використовувати окремі рядки для кожного аналізу: спершу з «@gmail.com», щоб ідентифікувати будь-який набір облікових даних, а потім переходити до іншого рядка, наприклад «@yahoo.com», для визначення будь-якого можливого пароля в цьому процесі. Як правило, щоб отримати доступ до збережених облікових даних, користувач повинен відвідати сторінку менеджера паролів або відвідати збережену веб-сторінку, на якій менеджер паролів зберіг набір облікових даних. В останньому випадку процес міститиме лише облікові дані цього запису. Наприклад, якщо користувач зберіг облікові дані «Facebook» і відвідує цю веб-сторінку, процес міститиме лише облікові дані «Facebook». Нарешті, Firefox не має проблем із запуском із cmd за допомогою команди на кшталт «запустити firefox about:logins».
Для Ironvest має бути запущено відповідний веб-додаток. Оскільки цей менеджер паролів не вимагає введення головного пароля під час відкриття та забезпечує автоматичний вхід у систему, було запущено Chrome через cmd і відкрито “ironvest.com/app”. Після цього скористалися інструментом для вилучення всіх записів. Проблема ілюструється на наведеному нижче знімку екрана: записи зберігаються кілька разів, оскільки створюються щоразу, коли інструмент знаходить їх у файлі дампа. Зауважте, що якщо користувач або зловмисник не відвідує сторінку інформаційної панелі Ironvest, записи не завантажуються в процесі. Інший спосіб отримати запис – це відвідування користувачем URL-адреси збереженого запису. Функція автозаповнення отримає ці облікові дані під час процесу, але лише для цього запису. Слід зазначити, що Ironvest видаляє записи з процесу приблизно через 2-3 хвилини. Крім того, здається, що паролі містяться між конкретними трьома символами та закінчуються комою.
У Kaspersky експлойт працював лише для браузера Chrome. Коли користувач відкрив свій веб-переглядач і ввімкнув параметр автозаповнення, процес Native Messaging Server менеджера паролів зберігав кожен запис у відкритому текстовому форматі та не очищав процес. Отже, якщо зловмисник має доступ до цього хосту та чекає принаймні 1 хвилину, він може скористатися цією проблемою та отримати будь-який збережений запис із цього процесу.
Для Keeper було запущено програму, введено головний пароль і активовано інструмент. Відповідь інструменту була наступною:
Інструмент витягне всі записи та головне ім’я користувача та пароль користувача. Якщо запис порожній, це означає, що цей користувач не має інших записів у сховищі. Наприклад, якщо інструмент друкує 5 записів, 4 з яких містять дані, а 1 — без даних, тоді користувач зберіг 4 записи в менеджері паролів.
LastPass автоматично вводить користувача в сховище, коли відкривається браузер Chrome. Отже, щоб отримати головний пароль, користувач повинен вийти з системи та ввійти вручну (ввівши головний пароль), не закриваючи браузер. У кожному іншому випадку слід отримати всі записи та головне ім’я користувача. У відео показано, як LastPass було запущено через cmd. Інструмент скинув усі записи та головне ім’я користувача, а також деякі непотрібні дані, які відповідали заданому шаблону пошуку.Рекомендується перевірити файл .txt, оскільки в ньому легше ідентифікувати облікові дані, оскільки консоль міститиме кілька небажаних рядків.
Norton використовує ключові слова для зберігання облікових даних. Отже, наступний знімок екрана ілюструє облікові дані, які інструмент скинув. Важливим фактом було те, що менеджер паролів Norton автоматично зберігав ім’я користувача та пароль облікового запису користувача Norton у сховищі. Отже, оскільки всі відповідні записи доступні, якщо користувач не видалив запис зі своїм іменем користувача/паролем облікового запису Norton, інструмент також витягне їх. Це облікові дані, які було видалено з виведення консолі. Зачекайте 30 секунд після запуску браузера, щоб отримати облікові дані за допомогою інструмента. Ця відповідна версія просить користувача вводити головний пароль кожного разу, коли він відкриває браузер.
Потрібна була звичайна процедура. Як видно з наступного знімка екрана, усі дані позначаються різними ключовими словами:
У новій версії інструменту головне ім’я користувача також можна отримати з менеджера паролів. Майстер-пароль також існує у відкритому текстовому форматі в процесі, але поки що немає стабільного способу його вилучення.
Відео було призупинено для зменшення його розміру. На початку запускається програма Passwordboss, вводиться головний пароль, після чого програму згортають. Після цього виконується інструмент і здійснюється очікування протягом 3-4 хвилин. Як можна помітити, інструмент отримав усі відповідні записи. Деякі з них, як-от Amazon, були порожніми, але інші, як-от Facebook, Google і спеціальний під назвою aegean, були заповнені іменем користувача та паролем користувача. Зазвичай записи з даними містять символ “[]”.
Roboform автоматично розблоковує сховище, коли користувач відкриває браузер Chrome. Зокрема, Roboform потребує взаємодії з будь-якою збереженою URL-адресою запису або щоб користувач клацнув плагін, щоб завантажити записи. Таким чином, можна запустити процес Chrome з команди cmd або powershell, а потім запустити інструмент для вилучення облікових даних. Крім того, головний пароль доступний, просто відкривши браузер. На наступному знімку екрана зображено облікові дані, які інструмент скинув після запуску Chrome із cmd. Перший знімок екрана ілюструє вихід витягнутих записів, тоді як другий демонструє вилучення головного пароля.
З додатком Roboform все простіше. Якщо програма запущена, усі записи можна витягнути. Зокрема, записи будуть доступні як збережені в менеджері паролів. Це означає, що всі можливі записи будуть повернуті разом із тими, які користувач зберіг. Нижче наведено приклад вилучених паролів входу.
Що стосується повторюваності, поточні версії програми не потребують додаткових коригувань. Як наслідок, лише вилучення на основі шаблонів може допомогти в ідентифікації та вилученні необхідної інформації. Однак для повноти наведений нижче код демонструє використання Repetitiveness у програмі Roboform v9.5.2.0. По-перше, ми повинні підрахувати, скільки разів набір облікових даних відображається у форматі відкритого тексту в процесі програми. Потім ми можемо використовувати цю countOccurrences
функцію, щоб підрахувати, скільки разів певний набір даних зберігається в процесі. Після цього ми можемо використовувати getCredsroboformapp4
функцію, щоб відкрити файл із витягнутими даними та перевірити, скільки разів кожен рядок тексту існує в процесі. Якщо кількість разів з countOccurrences
дорівнює кількості разів, коли входження було показано в процесі, тоді ми можемо надрукувати цей рядок тексту. Мета тут полягає в тому, щоб скоротити вихід вилученого тексту та легко ідентифікувати набір облікових даних. У поточному прикладі вихідний текст вилучення шаблону становив 136 рядків. Після використання повторюваності зберігався лише головний пароль.
#pragma once #include <iostream> #include <fstream> #include <vector> #include <string> #include <algorithm> #include "../../core/saveFile.h" //Repetitiveness for Roboform // Helper function to find occurrences of a sequence in the file data int countOccurrences(const std::vector<unsigned char>& data, const std::vector<unsigned char>& sequence) { int count = 0; auto it = data.begin(); while (it != data.end()) { it = std::search(it, data.end(), sequence.begin(), sequence.end()); if (it != data.end()) { ++count; ++it; // Move iterator to continue search after this match } } return count; } int getCredsroboformapp4(std::string filename) { //Due to using saveFile2 in getCredsroboformapp2.h std::ifstream sequencesFile("credentials2.txt"); std::ifstream dataFile(filename, std::ios::binary); if (!sequencesFile.is_open()) { std::cerr << "Error opening the sequences file." << std::endl; return 1; } if (!dataFile.is_open()) { std::cerr << "Error opening the data file." << std::endl; return 1; } // Read the entire data file into memory std::vector<unsigned char> fileData((std::istreambuf_iterator<char>(dataFile)), std::istreambuf_iterator<char>()); dataFile.close(); std::string line; while (std::getline(sequencesFile, line)) { // Convert the line to a sequence of unsigned char std::vector<unsigned char> sequence(line.begin(), line.end()); // Count occurrences of the sequence in the file data int occurrences = countOccurrences(fileData, sequence); // Print and save the results only if found exactly once if (occurrences == 1) { std::cout << "Sequence: " << line << " found " << occurrences << " time." << std::endl; saveFile(line + "\n"); } } sequencesFile.close(); return 0; }
Цей інструмент надається як є для освітніх цілей та/або законного оцінювання.