Аналіз трафіку Android-додатків: обхід certificate pinning без реверс-інжинірингу

Іноді потрібно досліджувати роботу бекенду мобільного додатку. Добре, якщо творці програми не морочилися і всі запити йдуть на «голому» HTTP. А що, якщо додаток для запитів використовує HTTPS, і відмовляється приймати сертифікат вашого кореневого засвідчувального центру, який ви дбайливо впровадили в сховище операційної системи? Звичайно, можна пошукати запити в декомпилированом додатку або за допомогою реверс-інжинірингу взагалі відключити застосування шифрування, але хотілося б спосіб простіший.

image
Що таке certificate pinning?
Навіть при використанні HTTPS користувач не захищений від атак «Людина посередині», тому що при ініціалізації з'єднання зловмисник може підмінити сертифікат сервера на свій. Трафік при цьому буде доступний зловмисникові.

Впоратися з такою атакою допоможе certificate pinning. Ця захисна міра полягає в тому, що розробник «зшиває» в додаток довірений сертифікат. Встановлення безпечного з'єднання додаток перевіряє, що сертифікат, посланий сервером, збігається з (або підписано) сертифікатом з сховища програми.

Обхід certificate pinning
В якості піддослідного виберемо додаток Über. Для аналізу HTTP-трафіку будемо використовувати Burp Suite. Також нам знадобиться JDK та Android SDK (я використовую всі останньої версії). З Android SDK нам знадобиться тільки утиліта zipalign, так що при бажанні можна не викачувати весь SDK, а знайти її на просторах інтернету.
Заздалегідь полегшимо собі життя, додавши наступні шляху до потрібних утиліт в змінну оточення PATH:

C:\path\to\jdk\bin
%USERPROFILE%\AppData\Local\Android\sdk\build-tools\23.0.2

Відкриваємо Burp, заходимо в Proxy – Options – Add і додаємо Proxy Listener на інтерфейсі, який буде доступний піддослідному Android-пристрою (або емулятор). На пристрої в свою чергу налаштовуємо використовується Wi-Fi мережу на використання тільки що включеного проксі.

Завантажити apk-файл через apkpure.com, встановимо додаток на пристрій і спробуємо увійти в свій аккаунт – додаток зависне на етапі аутентифікації.

image
В логах Burp Suite (вкладка Alerts) при цьому ми побачимо множинні звіти про невдалих SSL-рукостисканнях. Зверніть увагу на першу сходинку – саме через сервер cn-geo1.uber.com в моєму випадку здійснюється аутентифікація, тому й не вдається увійти в додаток.

image
Справа в тому, що Burp Suite при перехопленні HTTPS-з'єднання (а ми пам'ятаємо, що всі з'єднання пристрою проксируются через нього) підміняє сертифікат веб-сервера на свій, який, природно, не входить в список довірених. Щоб пристрій довіряло сертифікату, виконуємо наступні дії. У Burp заходимо в Proxy – Options і натискаємо Import/export CA certificate. Далі в діалозі вибираємо Certificate Export. Копіюємо сертифікат на пристрій, переходимо в Налаштування – Безпека – Встановити сертифікати і встановлюємо наш сертифікат в якості сертифіката для VPN і додатків.

image
Знову намагаємося увійти в свій аккаунт. Зараз додаток Über повідомить нам тільки про невдалу спробу аутентифікації – значить прогрес є, залишилося лише вирішити certificate pinning.

Відкриємо додаток у вашому улюбленому архіваторі як zip-архів. У папці res/raw можна помітити файл з промовистою назвою ssl_pinning_certs_bk146.bks.

image
По його розширенню можна зрозуміти, що Über використовує сховище ключів у форматі BouncyCastle (BKS). З-за цього не можна просто замінити сертифікат в додатку. Спочатку потрібно згенерувати BKS-сховище. Для цього качаємо jar для роботи з BKS.

Тепер генеруємо BKS-сховище, яке буде містити наш сертифікат:

keytool -import -v -trustcacerts -alias mybks -file c:/path/to/burp.crt -keystore ssl_pinning_certs_bk146.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath c:/path/to/bcprov-jdk15on-154.jar -storepass spassword

На питання про довіру сертифікату відповідаємо «yes». Знову відкриваємо апк в архіваторі і замінюємо оригінальний сховище на наше (зберігаємо при цьому оригінальна назва).

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

Видаляємо з apk папку META-INF зі старої підписом програми і приступаємо до нової генерації.
Створюємо сховище ключів і генеруємо в ньому ключ для підпису апк:

keytool -genkey -keystore mykeys.keystore -storepass spassword -alias mykey1 -keypass kpassword1 -dname "CN=ololo O=HackAndroid C=RU" -validity 10000 -sigalg MD5withRSA -keyalg RSA -keysize 1024

Підписуємо тільки що згенерованим ключем наш АПК:

jarsigner -sigalg MD5withRSA -digestalg SHA1 -keystore mykeys.keystore -storepass spassword -keypass kpassword1 Über.apk mykey1

Тепер залишилося вирівняти дані в архіві за четырехбайтной кордоні:

zipalign -f 4 Über.apk Über.apk_zipal.apk

Готово, видаляємо з пристрою старе додаток, встановлюємо нове і намагаємося увійти в свій аккаунт. Якщо раніше спроба зв'язатися з додатка cn-geo1.uber.com переривалося на рукостисканні, зараз можна переглядати і, при бажанні, модифікувати трафік.

image
Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.