![Захоплення SSL рукостискання за допомогою tcpdump](/image/original/e3210520-0d7d-11ef-9433-002590e76e7d.png)
Захоплення SSL рукостискання за допомогою tcpdump
SSL на сьогоднішній день є найпоширенішим протоколом, який використовується для передачі зашифрованих даних через TCP-з'єднання. Під час цієї процедури обидві сторони повинні обмінюватися різною інформацією, включаючи відкриті ключі, алгоритми шифрування, версії протоколів і багато іншого.
Іноді, однак, обмін відбувається не так, як передбачалося, і виникає необхідність виявити проблеми та виправити їх. Найпоширеніший спосіб зробити це - перехопити SSL-рукостискання за допомогою tchpdump. Таким чином, ви зможете детально проаналізувати, що відбувається з передачею даних, і вжити заходів для вирішення проблем.
Огляд команди tcpdump
tcpdump - це потужний інструмент мережевого аналізу командного рядка, який використовується для перехоплення і відображення пакетів, переданих і отриманих через мережевий інтерфейс, доступний на більшості Unix-подібних операційних систем, включаючи Linux і macOS. Якщо вам потрібно перехопити SSL-рукостискання, ви повинні знати, що інструмент сам по собі може перехопити величезні обсяги даних, які ви не зможете продуктивно проаналізувати. З огляду на це, вам доведеться застосувати ряд фільтрів, які виокремлять пакети, що мають безпосереднє відношення до вашого завдання. Критерії фільтрації включають IP-адреси джерела і призначення, номери портів і протоколи.
Про SSL рукостискання
Рукостискання SSL (протокол захищених сокетів) є невід'ємною частиною протоколу SSL/TLS (протокол безпеки транспортного рівня), який широко використовується для захисту зв'язку через комп'ютерні мережі. Хоча протокол SSL був значною мірою витіснений протоколом TLS, термін "рукостискання SSL" все ще широко використовується для опису початкового етапу узгодження TLS-з'єднання.
Рукостискання SSL складається з серії повідомлень, якими обмінюються клієнт і сервер, і ці повідомлення є етапами встановлення безпечного і зашифрованого каналу зв'язку. Давайте подивимося на них.
- ClientHello: Рукостискання починається з того, що клієнт надсилає серверу повідомлення ClientHello. Це повідомлення складається з номера версії SSL/TLS клієнта, списку підтримуваних наборів шифрів (алгоритмів шифрування, обміну ключами та автентифікації повідомлень), списку підтримуваних методів стиснення і, можливо, списку підтримуваних розширень.
- ServerHello: Щоб відповісти на попереднє повідомлення, сервер надсилає клієнту повідомлення ServerHello, яке містить номер версії SSL/TLS сервера, набір шифрів і метод стиснення, вибраний зі списку клієнта, і, можливо, розширення, вибрані сервером.
- Сертифікат сервера: Для автентифікації сервер надсилає клієнту свій сертифікат, який містить відкритий ключ сервера, що пізніше використовується клієнтом для обміну ключами.
- Запит на сертифікат (необов'язково): Якщо серверу потрібна автентифікація з боку клієнта, як у випадку з двостороннім SSL, сервер надсилає відповідне повідомлення клієнту.
- Обмін ключами: Клієнт і сервер обмінюються ключовою інформацією. Це може відбуватися різними способами. Наприклад, клієнт може надіслати попередній майстер-секрет, зашифрований відкритим ключем сервера (як у випадку обміну ключами RSA). Або ж клієнт і сервер можуть генерувати ключі разом (як у випадку обміну ключами Діффі-Хеллмана). Залежно від обраного набору шифрів, цей крок може відрізнятися.
- Server Hello Done: Після того, як сервер завершив надсилання повідомлень для підтримки обміну ключами та автентифікації сервера, він надсилає повідомлення ServerHelloDone, щоб повідомити про це.
- Обмін ключами з клієнтом: У відповідь на попереднє повідомлення клієнт надсилає повідомлення про обмін ключами, включаючи попередній головний секрет, який залежить від методу обміну ключами.
- Перевірка сертифікату (необов'язково): У разі необхідності автентифікації клієнта, клієнт може надіслати повідомлення з цифровим підписом для перевірки сертифіката, що дозволить серверу перевірити сертифікат клієнта.
- Готово: Нарешті, клієнт і сервер обмінюються зашифрованими повідомленнями Finished, які підтверджують, що процеси обміну ключами та автентифікації пройшли успішно.
Фільтрація повідомлень SSL-Рукостискань у tcpdump
Оскільки tcpdump фільтрує інформацію на рівні пакетів і не може безпосередньо працювати з такими конструкціями, як протоколи SSL/TLS, вам доведеться застосувати фільтри, що базуються на загальних характеристиках пакетів handshake, таких як номери портів і розміри пакувальників, щоб зафіксувати лише процес handshake. Давайте розглянемо підходи, які ви можете використовувати для цього завдання.
- Фільтрація за портом:
Рукостискання SSL/TLS зазвичай відбуваються через порт 443 для HTTPS, хоча інші порти, що використовуються для захищених протоколів, також можуть бути задіяні. Зокрема, щоб перехопити весь трафік на стандартному HTTPS-порті 443, використовуйте:
tcpdump -i any 'port 443'
Майте на увазі, що при цьому буде перехоплено весь трафік на порту, а не тільки повідомлення рукостискання.
- Захоплення початку з'єднання:
Оскільки рукостискання відбувається на початку SSL/TLS з'єднання, перехоплення початкових обмінів пакетами може допомогти виділити повідомлення рукостискання. Наприклад, ви можете захопити пакети SYN і SYN-ACK, щоб побачити початок TCP-з'єднань, які відбуваються до рукостискання SSL/TLS.
tcpdump -i any 'port 443 and (tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn)'
- Фільтри довжини:
Оскільки повідомлення рукостискання, зокрема ClientHello і ServerHello, мають тенденцію до відмінностей у розмірах, цей факт теоретично можна використати для фільтрації пакетів на основі розміру їхнього TCP-вантажу. Проте, оскільки існує великий ступінь випадковості таких змінних, як розмір, цей метод є досить неточним і ненадійним.
- Захоплення та аналіз за допомогою Wireshark:
Wireshark - це спеціальний інструмент, який може надати вам більш детальний аналіз трафіку, який ви захопили раніше за допомогою tcpdump, відфільтрувавши певні повідомлення handshake. Спочатку захопіть трафік з певного порту, записавши його у файл:
tcpdump -i any 'port 443' -w capture_file.pcap
Відкрийте файл capture_file.pcap за допомогою Wireshark і скористайтеся його фільтрами SSL/TLS, наприклад, ssl.handshake.type для подальшого аналізу.
Захоплення пакетів TLS залежно від версії
Хоча більшість сучасних програм використовують для обміну повідомленнями протокол TLSv1.3. Тим не менш, для збереження сумісності зі старими версіями підтримуються TLSv1.0, TLSv1.1 і TLSv1.2. Кожній версії присвоєно числовий код:
SSLv3 - 0x300
TLSv1.0 - 0x0301
TLSv1.1 - 0x0302
TLSv1.2 - 0x0303
TLSv1.3 - 0x0304
Враховуючи, що ця інформація міститься в 10-му і 11-му байтах даних в повідомленні рукостискання SSL, можна використовувати наступний фільтр:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x16) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+9] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+10] = 0x03)"
Захоплення пакетів даних програми через TLS
За повідомленнями рукостискання слідують дані програми, які також містять версію TLS у 2-му та 3-му байтах даних. Щоб перехопити її:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x17) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+1] = 0x03) \\
&& (tcp[((tcp[12] & 0xf0) >>2)+2] = 0x03)" -w appdata.pcap
Таким чином ми можемо перехоплювати пакети, що містять 17 у 1-му та 03 у 2-му і 3-му байтах.
Відстеження помилок SSL-з'єднання
Для фільтрації помилок слід перевіряти 1-й байт, що містить 15 або 21 - числа, що відповідають певним помилкам:
tcpdump "tcp port 8081 and (tcp[((tcp[12] & 0xf0) >>2)] = 0x15) || (tcp[((tcp[12] & 0xf0) >>2)] = 0x21)" -w error.pcap
Заключення
Використання tcpdump для перехоплення SSL-рукостискання є ефективним способом аналізу трафіку і виявлення помилок і збоїв, якщо щось піде не так. У цій статті ми розглянули деякі підходи, які можуть допомогти вам відфільтрувати перехоплений трафік належним чином, щоб мати можливість виявити будь-які проблеми. Сподіваємося, що цей посібник був корисним!