top of page
  • ISSP

Frida: Ефективне перехоплення захищеного трафіку для аналізу мережевих взаємодій

Продовжуємо знайомити вас з можливостями практичного застосування інструменту Frida. Сьогодні ми детально розглянемо як його можна використовувати для перехоплення трафіку, включаючи шифрований. Іноді перегляд трафіку стає складною задачею, зокрема в ситуаціях, коли встановити сертифікат неможливо через застосування SSL pinning. Проте, завдяки методам динамічного аналізу, це можна робити прямо в пам'яті без особливих проблем.


Практичне застосування Frida будемо пояснювати на ось цьому прикладі.

Frida's traffic interception capabilities

Варто зазначити, що найпростіший метод зібрати 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).

Frida's traffic interception capabilities

Для досягнення цієї мети у певних ситуаціях зручно користуватися таким інструментом, як Godbolt. Після компіляції відкрите будь-який дизасемблер та перегляньте експорти у пошуках потрібної функції.

Frida's traffic interception capabilities

Наступний крок. Використовуючи дизасемблер, відкрийте експорти у пошуках потрібної функції. Спочатку спробуйте підібрати байт-паттерн під виразні елементи функції (зазвичай початок функції добре підходить для цього).


Якщо цей підхід не дає результатів, перевірте, чи функція не використовує якісь виразні константи, наприклад, дебаг-стрінги на початку функції. Якщо і цей варіант не проходить - пробуємо йти у вкладені функції, а потім підніматись по ланцюжку викликів вверх, наприклад наступна функція буде дуже явно виражена в коді:

Frida's traffic interception capabilities

Якщо і цей підхід не спрацював, перевірте вкладені функції та спробуйте прослідкувати ланцюжок викликів вгору, де наступна функція може бути більш явно виражена в коді. Цей метод також добре працює (а іноді навіть простіше) з бібліотечними викликами, що дозволяє легко знайти потрібну функцію. Зазвичай на одному з цих етапів ми виявляємо необхідну функцію.


У рідкісних випадках, коли жоден з цих методів не допомагає, спробуйте знайти функції "очима", що вимагає деяких навичок швидкого аналізу вихлопу декомпілятора та порівняння його з оригінальним кодом. Такі навички можна опанувати без особливих складнощів, приділивши цьому трохи часу.


Працюємо далі. Ми продовжимо використовувати набір скриптів з попередньої статті, змінюючи лише script.js. Frida: основні переваги та приклади практичного застосування.


У нас є два варіанти: або задати зсув від початку модуля та перераховувати адресу кожного разу, або використовувати Memory.scan:

Frida's traffic interception capabilities

Особисто мені більше подобається другий метод, оскільки зазвичай він працює навіть при незначних змінах версії файлу в процесі дослідження. Варто зазначити, що правильно підібрані шаблони можуть витримати і серйозні зміни, але це вже тема окремих статей.


Так, давайте продовжимо з варіантом, коли функція просто експортується з бібліотеки під конкретним ім'ям, та спробуємо отримати лише адресу функції writeFunction:

Frida's traffic interception capabilities

де CURLOPT_WRITEFUNCTION (яка класна штука ці всі сучасні IDE, Notepad++ не витягує):

Frida's traffic interception capabilities

Отже, ми знайшли функцію, яку потрібно перехопити. Тепер пропоную задати цю функцію новим способом, використовуючи NativeCallback (в цьому випадку це використано для зручності, але в подальшому використання NativeFunction дозволить за необхідності викликати ці функції):

Frida's traffic interception capabilities

В результаті ми отримаємо:

Frida's traffic interception capabilities

Як ви бачите, все виглядає дещо заплутано, але при необхідності це все можна легко розібрати. Так само можна отримати не лише відповідь, але й сам запит, URL, POST-дані. Залишаю вам це для експериментів.


Таким чином, використання інструменту Frida для перехоплення трафіку може стати ефективним методом для аналізу мережевих взаємодій, особливо коли традиційні методи, такі як встановлення сертифікатів, не є доступними. Хоча пошук та ідентифікація потрібних функцій може вимагати значних зусиль та навичок, дотримання описаних тут методів може значно полегшити процес.


Використання Frida для динамічного аналізу в пам'яті дозволяє технічним спеціалістам отримувати доступ до важливої інформації про роботу додатків та їх мережеві взаємодії, що, в свою чергу, може допомогти виявляти та виправляти потенційні проблеми безпеки.


Робочі матеріали доступні за лінком https://github.com/bilka00/frida_series_of_notes


Хочете дізнатися більше про ефективні інструменти reverse engineering? Ознайомтеся з нашою статтею Reverse Engineering with Ghidra.


Якщо у вас виникли питання, або ж ви хотіли б отримати консультацію експертів ISSP, будь ласка, напишіть нам на info@issp.com

bottom of page