Wireshark — перехоплення TLS/SSL-трафіку. Частина 2
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
Всім привіт. Це продовження статті Wireshark — основні можливості та як ним користуватись. За коментарями до першої частини стало зрозуміло: у спільноти є запит на пояснення, яким чином можна перехопити TLS-трафік і за певних умов розшифрувати його. У цій статті я розгляну, як зняти TLS-трафік з embedded-пристрою. Якщо обмін даними відбувається між ноутбуком чи є доступ до сервера, куди підключається пристрій, і туди можливо поставити Wireshark, перехопити трафік можливо стандартно. Це описано в першій частині.
Не розповідатиму, як атакувати протокол TLS. Натомість розгляну проблеми, які можна вирішити, якщо не вдається встановити TLS-з’єднання (handshake). А також як розшифрувати трафік в тестовому середовищі, якщо є доступ до приватного ключа сервера. Протоколи, які розглядатиму в матеріалі, не є HTTPS. Якщо ваш девайс обмінюється даними за протоколом HTTPS, є багато ПЗ, які дозволяють перехопити трафік. Наприклад, платні Charles чи Fiddler. А також безплатний mitmproxy.
Для перехоплення трафіку буду використовувати ноутбук з системою Windows 10, у якого є два інтерфейси: Ethernet та Wi-Fi. Мій embedded-пристрій використовує Ethernet. Тому я Ethernet-кабелем (патчкорд) приєдную пристрій до ноутбука і підключаю його до інтернету через Wi-Fi. Якщо у вас Wi-Fi embedded-пристрій, можна зробити навпаки.
Коротко про TLS
TLS (Transport Layer Security) — це протокол, який дозволяє безпечно обмінюватись даними в інтернеті. Складається з 2 основних фаз. Під час першої фази (handshake) клієнт і сервер можуть перевірити один одного за допомогою сертифікатів, визначити алгоритми шифрування і обміну ключів, обмінятися ключами для шифрування даних у другій фазі. Під час другої фази відбувається передача даних на основі ключів для шифрування, узгоджених в першій. Як правило, основні помилки виникають під час handshake.
Для того, щоб клієнт і сервер могли перевірити один одного, вони генерують пари з публічних і приватних ключів. Публічний ключ відправляють на підпис в довірений центр сертифікації (CA) і отримують підписаний сертифікат. Коли клієнт хоче встановити з’єднання, він відправляє серверу початкове повідомлення (Client Hello), де вказує, які шифри для обміну/генерації ключів для нього прийнятні. Сервер своєю чергою відповідає, які шифри прийнятні для нього та надсилає свій підписаний серверний сертифікат.
За допомогою публічного ключа від СА клієнт перевіряє підпис серверного сертифіката, строк дії, домен тощо. Сервер може запитати клієнтський сертифікат, якщо необхідно. Після цього клієнт з сервером узгоджують ключі для шифрування і можна переходити до другої фази шифрування даних.
Налаштування середовища для перехоплення трафіку
Отже, для перехоплення трафіку я під’єднав кабелем Ethernet свій пристрій до ноутбука. Сам ноутбук виходить в мережу Інтернет через Wi-Fi. Нам потрібно розшарити Wi-Fi з’єднання для Ethernet. Для цього в мережевих налаштуваннях (Network connections) обираємо Wi-Fi та заходимо у вкладку Sharing. Потрібно дозволити іншим мережам підключення через Wi-Fi. А також обрати мережу Ethernet у списку.
Операційна система запропонує включити на пристрої DHCP, щоб він зміг отримати відповідну IP-адресу і шлюз.
На цьому все. Потрібно перезапустити девайс, щоб він гарантовано отримав мережеві налаштування. Після цього можна перевірити, чи на пристрої є інтернет.
Перехоплення трафіку
Тепер можна запустити Wireshark і за допомогою фільтрів перехопити трафік. Приклад наведено нижче (src і dst IP-адреси не відображені на рисунку).
Тут можна ретельно проаналізувати TLS-handshake. Деталі кожного повідомлення можна переглянути в нижньому вікні Wireshark.
Client Hello — повідомлення від клієнта на запит отримання серверного сертифіката і передача клієнтських параметрів для встановлення з’єднання.
Server Hello/Certificate — повідомлення від сервера з серверними параметрами для встановлення з’єднання і відправка серверного сертифікату клієнту для перевірки.
Certificate Request/Certificate — запит сервером клієнтського сертифіката.
Finished — повідомлення про завершення TLS-handshake з боку клієнта чи сервера.
Application data — передача зашифрованих даних між клієнтом і сервером.
Close notify — повідомлення про бажання закрити з’єднання.
Аналіз помилок TLS-handshake за допомогою Wireshark
Розглянемо кілька прикладів, які допомагають визначити проблеми в TLS-з’єднанні.
Від сервера приходить невалідний (непідписаний) сертифікат. Якщо сервер віддає клієнту такий сертифікат, клієнт розриває з’єднання. Причину можна визначити за допомогою Wireshark.
Прострочений сертифікат. Дуже часто в моїй практиці були випадки, коли TLS-з’єднання не відбувалось через те, що клієнт і сервер не могли знайти спільного шифру, які вони підтримують.
Якщо коротко, клієнт в повідомленні Client Hello передає список шифрів, які він підтримує. А сервер має обрати один із них. Якщо серверу не подобається жоден з запропонованих шифрів (наприклад, вони слабкі або просто не підтримуються сервером), сервер закриє з’єднання. Нижче наведу приклад нормального узгодження шифру.
В Client Hello клієнт відправляє свій список: В Server Hello сервер відправляє шифр, який йому найбільше підійшов: Нижче наведено приклад, коли сервер відразу завершує з’єднання після отримання повідомлення Сlient Hello, якщо йому не підходить жоден Сhiper Suite. Тоді необхідно додати якийсь спільний шифр для сервера або для клієнта. Аналогічно можна визначити й інші проблеми в TLS-handshake (наприклад, проблеми з клієнтським сертифікатом, стара версія TLS-протоколу тощо.)
Отримання даних додатку у відкритому вигляді, якщо є доступ до серверного приватного ключа
Якщо у вас є серверний приватний ключ, Wireshark може розшифрувати трасу. Для цього необхідно зайти в Edit -> Preferences -> Protocols -> TLS.
В RSA keys list задаємо IP-адресу TLS-сервера, порт, шлях до серверного сертифікату (я використовував формат PEM) та пароль, якщо є. Якщо Wireshark підтримує ваш протокол, він зможе його розпарсити, якщо ні — слід задати якийсь інший протокол (iso8583, наприклад, але бажано не http).
Після цього замість Application Data у вікні Wireshark ви побачите просто кількість байтів, якщо Wireshark не зміг розпарсити ваш протокол.
В нижньому вікні можна побачити зашифрований пакет Application Data, а також розшифрований пакет TLS segment data.
11 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів