Продовжуємо знайомити вас з можливостями практичного застосування інструменту Frida. Сьогодні ми детально розглянемо як його можна використовувати для перехоплення трафіку, включаючи шифрований. Іноді перегляд трафіку стає складною задачею, зокрема в ситуаціях, коли встановити сертифікат неможливо через застосування SSL pinning. Проте, завдяки методам динамічного аналізу, це можна робити прямо в пам'яті без особливих проблем.
Практичне застосування Frida будемо пояснювати на ось цьому прикладі.
Варто зазначити, що найпростіший метод зібрати curllib під Visual Studio - Vcpkg.
Однією з основних проблем є визначення адреси "writeFunction". Як це можна зробити? Перш за все, спробуйте перехопити curl_easy_setopt, фільтруючи його за другим параметром, щоб відсіяти непотрібні дані на даному етапі. Для цього спробуйте знайти curl_easy_setopt, використовуючи наступний код:
Module.findExportByName("libcurl.dll", "curl_easy_setopt").
Проте, libcurl може не завжди бути окремою бібліотекою. Нерідко він "прилінкований" в середину виконуваного файлу. Щоб вирішити цю проблему, спробуйте знайти функцію в декомпілері або скомпілюйте у себе бібліотеку з тими самими параметрами компілятора, які використовуються у виконуваному файлі. Тут основним параметром, який нас цікавить, є рівень оптимізації. Крім того, потрібно знайти відповідну версію компілятора. Як варіант, можна використовувати Detect Is Easy(with Nauz file detector).
Для досягнення цієї мети у певних ситуаціях зручно користуватися таким інструментом, як Godbolt. Після компіляції відкрите будь-який дизасемблер та перегляньте експорти у пошуках потрібної функції.
Наступний крок. Використовуючи дизасемблер, відкрийте експорти у пошуках потрібної функції. Спочатку спробуйте підібрати байт-паттерн під виразні елементи функції (зазвичай початок функції добре підходить для цього).
Якщо цей підхід не дає результатів, перевірте, чи функція не використовує якісь виразні константи, наприклад, дебаг-стрінги на початку функції. Якщо і цей варіант не проходить - пробуємо йти у вкладені функції, а потім підніматись по ланцюжку викликів вверх, наприклад наступна функція буде дуже явно виражена в коді:
Якщо і цей підхід не спрацював, перевірте вкладені функції та спробуйте прослідкувати ланцюжок викликів вгору, де наступна функція може бути більш явно виражена в коді. Цей метод також добре працює (а іноді навіть простіше) з бібліотечними викликами, що дозволяє легко знайти потрібну функцію. Зазвичай на одному з цих етапів ми виявляємо необхідну функцію.
У рідкісних випадках, коли жоден з цих методів не допомагає, спробуйте знайти функції "очима", що вимагає деяких навичок швидкого аналізу вихлопу декомпілятора та порівняння його з оригінальним кодом. Такі навички можна опанувати без особливих складнощів, приділивши цьому трохи часу.
Працюємо далі. Ми продовжимо використовувати набір скриптів з попередньої статті, змінюючи лише script.js. Frida: основні переваги та приклади практичного застосування.
У нас є два варіанти: або задати зсув від початку модуля та перераховувати адресу кожного разу, або використовувати Memory.scan:
Особисто мені більше подобається другий метод, оскільки зазвичай він працює навіть при незначних змінах версії файлу в процесі дослідження. Варто зазначити, що правильно підібрані шаблони можуть витримати і серйозні зміни, але це вже тема окремих статей.
Так, давайте продовжимо з варіантом, коли функція просто експортується з бібліотеки під конкретним ім'ям, та спробуємо отримати лише адресу функції writeFunction:
де CURLOPT_WRITEFUNCTION (яка класна штука ці всі сучасні IDE, Notepad++ не витягує):
Отже, ми знайшли функцію, яку потрібно перехопити. Тепер пропоную задати цю функцію новим способом, використовуючи NativeCallback (в цьому випадку це використано для зручності, але в подальшому використання NativeFunction дозволить за необхідності викликати ці функції):
В результаті ми отримаємо:
Як ви бачите, все виглядає дещо заплутано, але при необхідності це все можна легко розібрати. Так само можна отримати не лише відповідь, але й сам запит, URL, POST-дані. Залишаю вам це для експериментів.
Таким чином, використання інструменту Frida для перехоплення трафіку може стати ефективним методом для аналізу мережевих взаємодій, особливо коли традиційні методи, такі як встановлення сертифікатів, не є доступними. Хоча пошук та ідентифікація потрібних функцій може вимагати значних зусиль та навичок, дотримання описаних тут методів може значно полегшити процес.
Використання Frida для динамічного аналізу в пам'яті дозволяє технічним спеціалістам отримувати доступ до важливої інформації про роботу додатків та їх мережеві взаємодії, що, в свою чергу, може допомогти виявляти та виправляти потенційні проблеми безпеки.
Робочі матеріали доступні за лінком https://github.com/bilka00/frida_series_of_notes
Хочете дізнатися більше про ефективні інструменти reverse engineering? Ознайомтеся з нашою статтею Reverse Engineering with Ghidra.
Якщо у вас виникли питання, або ж ви хотіли б отримати консультацію експертів ISSP, будь ласка, напишіть нам на info@issp.com
Comments