Wireshark — основні можливості та як ним користуватись. Частина 1

Всім привіт! Я Олександр, QA Engineer і хочу розповісти про популярний аналізатор трафіку, який особисто мені допомогає в роботі для локалізації помилок програмного забезпечення, пов’язаних з обміном даними, в embedded-системах, а також desktop-застосунках.

Доволі часто під час роботи інженери, розробники, тестувальники зіштовхуються з проблемами, для швидкого аналізу яких корисно переглянути трафік між клієнтом і сервером. Наприклад, чи робить взагалі клієнт TCP-з’єднання, чому не встановлюється TLS handshake, чи правильно відправляємо запит/відповідь (по протоколу), хто клієнт або сервер передчасно закриває з’єднання і т.д.? Якщо у Вас теж виникала необхідність вирішити такі питання, то, можливо, дана стаття буде цікавою читачу.

Для цього корисними інструментами є сніфери (sniffer). Популярними інструментами є Wireshark (Windows, Linux, macOS), tcpdump (Linux). В цій статті розглянемо Wireshark. Якщо буде цікаво (бо це моя перша публікація на DOU), то в наступних частинах розглянемо, як зняти трафік з embedded пристрою (пропустити через PC), як вирішити проблему TLS.

В основному даний інструмент, як правило, корисний для не-HTTP-трафіку. Для HTTP є вже дуже багато програм і проксі-серверів, які гарно і все по поличках розкладають (Charles, Fiddler тощо). Хоча я часто і для HTTP-протоколу користуюсь Wireshark.

Власне Wireshark дозволяє захоплювати і аналізувати трафік на всіх рівнях Інтернет-моделі TCP/IP (канальний, мережевий, транспортний і прикладний) для великої кількості протоколів (мультимедіа, мобільні мережі і т.д.). Це дозволяє локалізувати проблему: проблема з мережею, конфігурацією ПЗ чи помилка ПЗ.

Захоплення трафіку з мережевого інтерфейсу

Після запуску Wireshark в головному вікні програми буде список мережевих інтерфейсів (Ethernet, Wi-Fi, VPN мають теж окремий інтерфейс). Необхідно обрати потрібний інтерфейс, через який проходить ваш трафік. Можна користуватись графіком активності, який є поблизу.

Окремо хочу звернути увагу на Adapter for loopback traffic capture. Цей інтерфейс дозволяє зняти трафік між клієнтом і сервером, які розміщені на одному ПК та зв’язані через localhost (127.0.0.1).

Фільтрація трафіку

Є два види фільтрів. Фільтри захоплення (Сapture filter) та фільтри відображення (Display filter). Фільтр відображення захоплює весь трафік з мережевої карти і вже потім відображає/ фільтрує, що потрібно. Це означає, що буде використовуватись багато пам’яті і якщо зберегти дані у файл, то туди потрапить весь трафік, що пройшов через інтерфейс.
Фільтр захоплення захоплює і зберігає лише той трафік, який прописаний у фільтрі.
Фільтр захоплення можна прописати відразу при виборі інтерфейсу (див. вище на малюнку Сapture ...using this filter).
Найпопулярніші фільтри:

  1. host www.nbuv.gov.ua;
  2. tcp port 35170.

Список всіх фільтрів можна переглянути тут CaptureFilters.

Фільтри відображення можна змінювати по ходу захоплення трафіку:

  • список фільтрів DisplayFilters;
  • можливі оператори: ==, !=, <, >, <=, >=, contains, matches;
  • приклади основних фільтрів: ip.addr == 10.20.8.9 або tcp.port == 7100;
  • також можна об’єднувати фільтри за допомогою логічних операцій: && , ||. Наприклад, ip.addr == 10.20.8.194 && tcp.port == 1250.

Протокол TCP

Далі для детального аналізу та розуміння необхідно трошки згадати основні властивості протоколу TCP:

  • необхідно встановити і завершувати з’єднання;
  • отримувач повинен підтверджувати, що він отримав пакет (ACK — Acknowledgement), інакше відправник буде повторно відправляти пакет по таймауту;
  • є керування потоком даних (коли отримувач не встигає обробити інформацію від відправника).

Встановлення TCP-з’єднання

Вище наведений приклад встановлення TCP-з’єднання. При коректному встановленні має пройти 3 пакети з характерним прапорцем SYN.

  • встановлення відбувається в три етапи, тому що обидві сторони мають впевнитись, що існує канал в обидва боки;
  • ініціалізуються початкові номери пакетів. В майбутньому вони використовуються для підтвердження отримання даних;
  • ініціалізуються також додаткові параметри (розмір вікна — кількість пакетів, які можна передавати без підтвердження і т.д.).

Передача даних

  • після встановлення з’єднання сторони можуть обмінюватись даними;
  • пакети повинні підтверджуватись звітами про доставку (АСК);
  • якщо пакет має ознаку PSH (PUSH), то це команда для отримувача проштовхнути дані з буфера мережевої карти чи ОС в застосунок;
  • для оптимізації каналу зв’язку не всі пакети можуть підтверджуватись АСК. Розмір такого вікна (кількість пакетів без підтвердження) встановлюється на початку та може змінюватись в залежності від якості каналу зв’язку.

Перегляд даних в пакеті

Детальну інформацію про дані та заголовки кожного рівня (не лише прикладного) можна переглянути внизу, а також скопіювати для подальшого аналізу при необхідності.

Завершення TCP-з’єднання

З’єднання закривається теж з обох боків. Якщо сторона хоче закрити з’єднання, то вона відправляє пакет FIN. По Source IP можна визначити, хто є ініціатором закриття TCP-з’єднання (інколи через помилку ПЗ розриває передчасно з’єднання).

Пара додаткових прикладів

Приклад перенадсилання пакета. Я таке дуже часто зустрічаю на мобільних мережах. Хост відправив пакет, але довго не отримував підтвердження (АСК), а тому по таймауту відбулось перенадсилання пакету.

Мінімальна довжина навантаження (payload) для Ethernet-фрейму (пакет канального рівня) дорівнює 46 байтам. Тому, якщо ми передаємо мало байтів (на картинці вище всього 1 байт 0×04) і в сумі з заголовками транспортного і мережевого рівня довжина менше 46 байтів, то необхідно доповнити фрейм байтами (padding 5 байт в кінці 0×00).
На малюнку пунктиром виділені дані канального рівня.
Для інших мереж мінімальна довжина пакета може мати інше значення. В прикладі Ethernet.

В даному прикладі можна спостерігати передачу декількох пакетів (8, 9, 10, 11, 12, 13) від сервера (192.168.3.5) клієнту без очікування підтвердження (АСК) на кожен пакет. Підтвердження приходять пізніше (14,15,16,17). Також в даному пакеті є перепосилка FIN-сегмента через таймаут (пакет було втрачено в мережі).

Що далі

В наступній частині планую детальніше розібрати практичні приклади вирішення проблем за допомогою Wireshark. Також, яким чином пропустити трафік від стороннього пристрою через комп’ютер. Якщо буде час, то розгляну TLS і як переглянути шифрований трафік. Якщо цікавлять якісь конкретні приклади — пишіть. Це моя перша стаття і я не певен, що вийде нормально :)

UPD: Wireshark — перехоплення TLS/SSL-трафіку. Частина 2

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось29
До обраногоВ обраному21
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Яку версію WS Ви використовували? Яка краще для первинного ознайомлення?

Я користуюсь завжди останньою версією. Інтерфейс там дуже рідко змінюється.

Скажіть, яку версію WS краще для ознайомлення студентів? Чи є портативні варіанти сніффера? Дякую

Портативні версії сніфера якісь є, але я ними не користувався.

portapps.io/app/wireshark-portable

wiki.wireshark.org/WiresharkPortable

Якщо говорити саме про тестування, то у Wireshark є консольний братик tshark, у зв’язці з експортом у json і написанням парсерів на jq або Python можна робити прямо-таки готові тести у кілька рядків.

Але все це має недолік — не тримає великих навантажень, типова автомобільна AVB система стрімінгу звуку, наприклад, легко може оперувати одиницями-десятками тисяч пакетів на секунду, wireshark не встигає парсити такий потік у реальному часі (внутрішня імплементація — однопоточна) і швидко переповнює свій буфер, тому для низькорівневих, наперед чітко відомих протоколів буває простіше тупо написати парсер на С на raw socket, і аналізувати пакети у реальному часі.

Є tcpdump консольний

Парсити його хексдамповий вихлоп для нестандартних протоколів буде важче, ніж скористатись вищезгаданими способами. По езернету далеко не тільки IP протокол використовується.

Що це за QA такі, що можуть самі написати multithread утіліту на C, з використанням raw sockets ?

Не згадана одна з фіч wireshark — це аналіз і візуалізація вже записаного трафіку. Згаданий tcpdump дозволяє записати трафік використовуючи таку ж саму систему фільтрації (обидві програми використовують libpcap під капотом).
Тобто це дозволяє робити запис трафіку десь в клауді використовуючи CI/CD і вже потім, при потребі, переглядати трафік.

Wireshark — корисна утиліта, але в ній (наскільки мені відомо) немає можливості моніторити трафік СОМ (Serial) порта. Існує лише один сніфер ком порта — Serial Port Monitor. Але він платний і не дешевий. Може комусь відомі інші сніфери ком порта?

Wireshark вміє показувати дані з USB. Правда, не в дуже зручному вигляді.
Ось стаття як налаштувати.
desowin.org/usbpcap/tour.html

Це у випадку якщо у вас до ноутбука підключається конвертор USB-COM або віртуальний COM-порт
Правда, буде багато ще керуючого трафіку (нижніх рівнів). Але, при бажанні, можна розібратись.

Ось тільки що зняв приклад (відправив в порт 000412345678 в HEX):

imgur.com/QPwNuqz

Я знімав трафік з фізичного (не USB) COM-порта цим тулом: www.hhdsoftware.com/device-monitoring-studio
Він платний, але є тріальна версія з обмеженням 10 сесій в день по 20 хв.
Є дешевший варіант: www.hhdsoftware.com/serial-port-monitor

Якщо хочеться саме безкоштовний, то можна недорого придбати конвертор USB-COM.

Провів налаштування Wireshark відповідно до статті. Якось дивно відображаються пакети:
imgur.com/a/VqLFa7w
Зліва відображаються пакети з програми Serial Port Monitor (в мене ще є пару днів тріалу) протоколу Modbus — все норм. Зправа — той ж пакет (мав би бути), але в Wireshark. Serial Port Monitor і Wireshark працювали паралельно. Ніде не відображається число 7 — адреса підлеглого пристрою. Апаратно до USB порту компа було підключено FTDI USB/RS485 Converter. Але на другому кінці лінії підлеглого пристрою з адресою 7 не було (тому немає відповіді у вікні Serial Port Monitor).

Так, воно моніторить ще службовий трафік нижніх рівнів.

1) Ви вірно обрали номер COM-порту ось тут?
imgur.com/EOcJprP
2) Підключив свій конвертор. Так, багато службового трафіку, але є дані, які я відправив і їх можна відфільтрувати.
Я відправив 00 20 01 02
Ось моя траса: fex.net/uk/s/0ypszvl
Якщо ввести display-фільтр usb.dst == «1.21.2»

То покаже дані:
imgur.com/RXX3BI7

P.S Так згоден, платні сніфери для COM-портів краще виглядають. Якщо хочете, пришліть вашу трасу (файлик), спробую знайти.

В канал надсилаються однакові пакети:
imgur.com/a/LPVeqAa
Паралельно працював Wireshark. Ось траса:
fex.net/uk/s/tlekfyx
Використовується FTDI USB/RS485 Converter — в стовпці Protocol відображається FTDI TI.
Тому можна зробити припущення що СОМ порт вибрано правильно (коли відправка пакетів була на паузі — у вікні Wireshark нових повідомлень не відображалось).

Ось мабуть воно:

imgur.com/vdPvoM2

Я помітив, що всяке сміття йде по 3.2.1 у вас, а у мене по 1.21.1
Треба поставити 3.2.2 у вас, а у мене 1.21.2

Фільтр usb.dst == «3.2.2»
Думаю, щоб отримувати дані, які приходять у відповідь, треба теж відшукати правильний USB-ідентифікатор і прописати через оператор || в фільтрі. Я помітив, що у Вашому випадку, коли йдуть дані, то в колонці інфо є INTERFACE A TX 8 bytes

Так, є таке. Дякую за допомогу. Відповідей від підлеглого пристрою з адресою 7 там немає тому що він не підключений.

Дякую за статтю, таке питання. Маємо Meta quest pro, апку на ньому яка спілкується з сервером. Потрібно дивитися HTTPS requests and responses для дебагу. Чи вміє в таке Wireshark? Швидке гугління не допомогло.

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

Задача може вирішуватись кількома способами в залежності від ваших можливостей i доступів:
1) Якщо у вас є можливість відключити TLS на додатку і не сервері, і є доступ до серверу, то встановлюєте на сервері Wireshark, налаштовуєте фільтр і дивитесь трафік;
2) Якщо немає доступу до серверу, а потрібен розшифрований трафік і є можливість встановити свої сертифікати в додаток, то краще використати проксі-сервер (Wireshark не знадобиться). Наприклад, безкоштовний mitmproxy. Схема така: ви додаєте свої сертифікати, згенеровані власноруч в додаток, налаштовуєте додаток на свій комп’ютер, а проксі на хост. Додаток йде на проксі, оскільки Ви використовуєте свої сертифікати, то він може розшифрувати Ваш трафік і показати чисту трасу, а потім він зашифровує трафік і йде вже на реальний хост (перед цим проксі створює своє TLS-з’єднання).

Генерація сертифікатів описана тут: docs.mitmproxy.org/...​le/concepts-certificates
Проксі потрібно налаштувати в режимі реверс-проксі:docs.mitmproxy.org/...​epts-modes/#reverse-proxy

Аналогічно можна зробити і з платними інструментами Charles і Fiddler.

Для веб-трафіку краще використовувати відомі проксі сервери (другий варіант). Вони зручно показують всі запити.

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

P.S Є ще варіант, яким я не користувався (мені інші підходили), але чув, що декому він підходить. Можливо Вам підійде теж.
Це викорситання файлу SSLKEYLOGFILE для розшифровки трафіку.
Про це можна прочитати тут:

www.packetsafari.com/...​/07/wireshark-decryption

А так же если есть SSL pinning то всякие прокси не помогут

Все залежить від можливостей доступу до додатку і серверів. Поки що це оглядова стаття.
Можливо, в наступних частинах додам інформацію про TLS. Також бачу, що є запит про моніторинг COM-портів.

Ось приклади, як пропатчити SSL pinning.
docs.mitmproxy.org/...​ates/#certificate-pinning

В тестових цілях збирають спеціальні збірки або є доступ на сервері після nginx, stunnel, де вже трафік розшифрований.
Як я вище писав, «це можливо за певних умов». І кожна ситуація індивідуальна.
Я працюю з банківським обладнанням, де рівень захисту дуже високий.
Але при певних умовах, в дебажних цілях, можливо, розшифрувати трафік.
В проді так не вийде.

Якщо є просто додаток без можливості змінити конфігурацію і без можливостей впливати на сервер, то, звісно, що нічого ви не зробите.
Навіщо тоді взагалі потрібен TLS, якщо дуже просто промоніторити трафік?

Дякую за статтю!
Було б цікаво про розшифровку TLS трафіка почитати. Не http трафіка (це, здається, Fiddler вміє без якихось додаткових зусиль), а сирого tcp, коли комунікація проходить по протоколу, відмінному від http.

Написали сразу бы про SSLKEYLOGFILE и nss key log format, столько прелюдии)

Дякую за статтю, додав у закладки.
Сподіваюсь що не знадобиться))

Гарна стаття. Підкажіть як вирішити проблему, коли в Charles не видно рекламних запитів через обмеження по геолокації(умовно запити мають працювати тільки в Німеччині)? VPN не допомагає.

Не дуже зрозумів звідки і куди запити відправляються. Будемо вважати, що між браузером і веб-сервером. В даному випадку можна переглянути в інструментах розробника браузера чи виконуються взагалі запити на сервер. Якщо використовувати Wireshark, то можна перевірити чи робить браузер запит на сервер за допомогою фільтрів:
host advertisedomen.com (capture filter)
http.host==advertisedomen.com (display filter)

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

Користуємося WireShark для дебагу взаємодії по медичному протоколу DICOM. Для цього вередливого протоколу кращого і не треба, коли щось не так, вся інформація як на долоні досить швидко.

Чому не використовувати якісь проксі замість сніфера?

Якщо Ви про Charles чи Fiddler, то вони добре підходять для HTTP(S), ну і є не зовсім безкоштовними.
Якщо Вам потрібно діагностувати проблему в якихось інших протоколах прикладного рівня (фінансові протоколи, кастомні протоколи і т.д.), то краще підходить сніфер.
Відразу видно проблему чи робить з’єднання на сервер ПЗ, хто закриває з’єднання, сирий дамп.
Для веб-трафіку, звісно, краще використовувати інші інструменти, бо його, як правило, багато і сніфером аналізувати складно.

Один із прикладів, чому проксі не факт що допоможе. Клієнт робить TLS-handshake на сервер, але невдало. Доволі часто таке трапляється, наприклад, коли набір шифрів на клієнті не підходить серверу. І от сніфер зразу може показати, які шифри пропонує серверу клієнт. І тоді вирішити питання чи додати цей шифр на сервері, чи змінити ПЗ на клієнті.

Я честно не пам’ятаю що за прокcі я використовував, це було щось хедлес під лінукс. Сніфер же мені знадобився одного разу коли треба було перехопити трафік sip протоколу.

Підписатись на коментарі