Wireshark – це потужний інструмент аналізу мережевих пакетів, який працює на різних платформах, включаючи Linux, Windows та macOS. Він пропонує гнучкі та розширені можливості фільтрації, хоча іноді їх застосування може бути неочевидним. Розглянемо ключові аспекти, на які варто звернути увагу при роботі з цим інструментом.
Аналіз мережевих пакетів з Wireshark
Wireshark є одним з найвідоміших проектів з відкритим кодом. Цей програмний продукт професійного рівня використовується як експертами, так і аматорами для дослідження та вирішення проблем у мережі. Розробники програмного забезпечення використовують Wireshark для виявлення та аналізу помилок у комунікаційних підпрограмах. Фахівці з кібербезпеки використовують його для перехоплення та аналізу шкідливих дій у мережі.
Стандартний робочий процес передбачає запуск Wireshark в режимі захоплення (Capture), щоб він міг записувати мережевий трафік через обраний мережевий інтерфейс комп’ютера. Мережеві пакети відображаються в реальному часі в процесі їхнього перехоплення. Однак, саме детальний аналіз після завершення захоплення розкриває повну картину того, що відбувається в мережі.
Перехоплені пакети утворюють так зване “трасування”. Після завершення захоплення можна послідовно переглядати трасування, пакет за пакетом. Кожен пакет може бути детально вивчений, що дозволяє відстежувати “розмови” між пристроями в мережі. Фільтри дозволяють включати або виключати певні пакети з аналізу.
Можливості фільтрації Wireshark є винятковими, з високою гнучкістю та точністю. Проте, синтаксис фільтрів має свої особливості, і неправильне використання може призвести до неочікуваних результатів.
Недостатнє розуміння принципів роботи фільтрів Wireshark може суттєво обмежити потенціал використання цього потужного інструменту.
Інсталяція Wireshark
Під час встановлення Wireshark програма запитує, чи дозволити користувачам без прав root захоплювати мережевий трафік. Відмова може здатися привабливою з метою безпеки. Проте, надання Wireshark доступу лише користувачам з правами root означає, що всі компоненти програми будуть працювати з підвищеними правами.
Wireshark складається з понад 2 мільйонів рядків складного коду та взаємодіє з комп’ютером на дуже низькому рівні. Згідно з найкращими практиками безпеки, слід уникати виконання коду з підвищеними правами, особливо якщо він працює на такому низькому рівні.
Безпечніше запускати Wireshark звичайним обліковим записом користувача. Можна обмежити коло користувачів, яким дозволено запускати Wireshark. Хоча це вимагає додаткових кроків налаштування, це найбезпечніший підхід. Компоненти збору даних Wireshark працюватимуть з підвищеними правами, але решта програми буде працювати як звичайний процес.
Для інсталяції в Ubuntu введіть наступну команду:
sudo apt-get install wireshark
У Fedora скористайтеся командою:
sudo dnf install wireshark
Для Manjaro використовуйте цю команду:
sudo pacman -Syu wireshark-qt
Під час інсталяції з’явиться екран, який пропонує не запускати Wireshark з правами root. Натисніть клавішу Tab, щоб перемістити виділення на “<Ok>
” і натисніть пробіл.
На наступному екрані натисніть Tab, щоб перемістити виділення на “<Yes>
” і натисніть пробіл.
Для запуску Wireshark потрібно бути членом групи “wireshark”, яка створюється під час встановлення. Це дозволяє контролювати, хто може запускати Wireshark. Користувачі, які не входять до групи “wireshark”, не зможуть запустити програму.
Щоб додати себе до групи wireshark, скористайтеся цією командою:
sudo usermod -a -G wireshark $USER
Щоб зміни вступили в силу, потрібно вийти з системи та знову увійти або скористатися командою:
newgrp wireshark
Для перевірки членства у новій групі, скористайтеся командою groups:
groups
У виведеному списку груп має бути присутня “wireshark”.
Запуск Wireshark
Запустити Wireshark можна за допомогою команди нижче. Амперсанд (&) запускає Wireshark у фоновому режимі, що дозволяє продовжувати використовувати термінал. Можна навіть закрити термінал, і Wireshark продовжить роботу.
Введіть наступну команду:
wireshark &
Відкриється інтерфейс Wireshark. Він показує список мережевих інтерфейсів вашого комп’ютера, а також деякі вбудовані псевдоінтерфейси.
Хвиляста лінія біля інтерфейсу означає, що він активний, і мережевий трафік проходить через нього. Пряма лінія вказує на відсутність активності. У цьому списку “enp0s3” – це дротове з’єднання, і воно відображає активність.
Щоб почати захоплення пакетів, клацніть правою кнопкою миші на “enp0s3” і виберіть “Почати захоплення” з контекстного меню.
Можна встановити фільтри для обмеження обсягу трафіку, який Wireshark буде захоплювати. Рекомендується захоплювати весь трафік, а потім фільтрувати його при аналізі. Це гарантує, що жодна мережева подія не буде пропущена через фільтр захоплення.
Звісно, в мережах з великим трафіком трасування може швидко стати дуже великим, і фільтрація під час захоплення має сенс.
Слід зазначити, що синтаксис фільтрів захоплення дещо відрізняється від фільтрів відображення.
Виділені іконки на зображенні вище означають наступне (зліва направо):
Акулячий плавець: Синій колір вказує на готовність до початку захоплення пакетів. Сірий колір означає, що Wireshark вже захоплює пакети.
Квадрат: Червоний колір вказує на можливість зупинки захоплення. Сірий колір означає, що Wireshark не захоплює пакети.
Акулячий плавець з круговою стрілкою: Зелений колір вказує на можливість зупинки поточного трасування. Це дає можливість зберегти або відхилити захоплені пакети та перезапустити трасування. Сірий колір означає, що Wireshark не захоплює пакети.
Аналіз Трасування
Натискання червоного квадрата зупинить захоплення даних для аналізу. Пакети представлені в хронологічному порядку і кодуються кольором в залежності від їхнього протоколу. Деталі обраного пакету відображаються в нижніх панелях інтерфейсу Wireshark.
Для зручності читання трасування, рекомендується надати Wireshark значущі імена IP-адресам джерела та призначення. Для цього перейдіть в “Перегляд” > “Роздільна здатність імен” і виберіть “Вирішувати мережеві адреси”.
Wireshark спробує визначити імена пристроїв, які надсилали та отримували кожен пакет. Хоча він не зможе ідентифікувати кожен пристрій, визначення тих, які можна, допоможе вам краще зрозуміти трасування.
Прокручування дисплея ліворуч відкриває додаткові стовпці. У стовпці “Інформація” відображається будь-яка інформація, яку Wireshark може отримати з пакету. У прикладі нижче видно деякі запити та відповіді ping.
За замовчуванням Wireshark показує всі пакети в порядку їхнього перехоплення. Одночасно багато пристроїв відправляють пакети туди-сюди. Це означає, що в одному потоці “розмови” між двома пристроями можуть бути переплетені пакети від інших.
Для аналізу однієї конкретної “розмови” можна ізолювати її за протоколом. Протокол кожного пакета вказаний у стовпці “Протокол”. Більшість протоколів, які ви побачите, належать до сімейства TCP/IP. Можна вказати конкретний протокол або використовувати Ethernet як загальний термін.
Клацніть правою кнопкою миші на будь-якому пакеті в послідовності, яку потрібно переглянути, і виберіть “Фільтр розмови” > “Ethernet”. У прикладі нижче вибрано пакет запиту ping.
Послідовність пакетів показана без інших між ними, оскільки Wireshark автоматично створив фільтр. Він відображається на панелі фільтрів і виділений зеленим кольором, що вказує на правильний синтаксис фільтра.
Щоб очистити фільтр, натисніть “X” на панелі фільтрів.
Створення Власних Фільтрів
Введіть простий фільтр на панелі фільтрів:
ip.addr == 192.168.4.20
Цей фільтр обирає усі пакети, які були відправлені або отримані пристроєм з IP-адресою 192.168.4.20. Зверніть увагу на подвійний знак рівності (==) без пробілів.
Щоб відобразити пакети, відправлені пристроєм (джерелом), використовуйте ip.src. Для пакетів, отриманих пристроєм (пунктом призначення), використовуйте ip.dst, як показано нижче:
ip.dst == 192.168.4.20 && ip.src == 192.168.4.28
Зверніть увагу на використання подвійного амперсанда (&&), що позначає логічне “І”. Цей фільтр шукає пакети, які надійшли на 192.168.4.20 з 192.168.4.28.
Користувачі, які не знайомі з фільтрами Wireshark, часто вважають, що цей фільтр покаже всі пакети між двома IP-адресами, але це не так.
Фактично, він фільтрує усі пакети з IP-адреси 192.168.4.20 незалежно від їх джерела чи призначення. Те саме виконується з усіма пакетами з IP-адреси 192.168.4.28. Іншими словами, фільтр обирає весь трафік з або на ці IP-адреси.
Можна шукати активність за іншими протоколами. Наприклад, цей фільтр шукає HTTP-запити:
http.request
Для виключення пакетів, які надійшли або були відправлені на певний пристрій, використовуйте знак оклику (!) та фільтр у дужках [()]:
!(ip.addr == 192.168.4.14)
Цей фільтр виключає усі пакети, відправлені на або з 192.168.4.14.
Не можна використовувати такий фільтр:
ip.addr !=192.168.4.14
Він не спрацює.
Також можна шукати рядки в пакетах за протоколом. Наприклад, цей фільтр шукає TCP-пакети, що містять рядок “youtube”:
tcp contains youtube
Фільтр для пошуку повторних передач корисний для перевірки проблем з підключенням. Повторні передачі – це пакети, що відправляються знову через їхнє пошкодження чи втрату під час першої передачі. Велика кількість повторних передач вказує на повільне з’єднання або повільну відповідь пристрою.
Введіть наступну команду:
tcp.analysis.retransmission
Народження, Життя, Смерть та Шифрування
Мережеве з’єднання між двома пристроями починається, коли один з них надсилає пакет SYN (синхронізація). Пристрій-отримувач, своєю чергою, надсилає пакет ACK (підтвердження) разом з пакетом SYN, якщо він приймає з’єднання.
SYN та ACK є двома прапорами в одному пакеті. Перший пристрій підтверджує SYN, надсилаючи ACK, і після цього з’єднання встановлюється.
Цей процес називається тристороннім рукостисканням:
A -> SYN -> B A ACK -> B
На зображенні нижче комп’ютер “nostromo.local” виконує Secure Shell (SSH) з’єднання з комп’ютером “ubuntu20-04.local”. Тристороннє рукостискання є початком зв’язку між двома комп’ютерами. Зверніть увагу, що рядки з пакетами SYN виділені темно-сірим кольором.
Прокручування дисплея вправо відобразить стовпці з пакетами рукостискання SYN, SYN/ACK та ACK.
Можна побачити, що обмін пакетами між двома комп’ютерами відбувається по черзі між протоколами TCP та SSH. Пакети даних передаються через зашифроване з’єднання SSH, а пакети повідомлень (наприклад, ACK) через TCP.
Коли мережеве з’єднання більше не потрібне, воно розривається. Послідовність пакетів для розриву з’єднання називається чотиристороннім рукостисканням.
Одна сторона надсилає пакет FIN (finish). Другий кінець відправляє ACK, щоб підтвердити FIN, а потім також надсилає FIN, повідомляючи про згоду на розрив. Перша сторона надсилає ACK на щойно отриманий FIN, і після цього з’єднання роз’єднується.
Ось як виглядає чотиристороннє рукостискання:
A -> FIN -> B A ACK -> B
Інколи, оригінальний FIN поєднується з пакетом ACK, який все одно мав бути відправлений, як показано нижче:
A -> FIN, ACK -> B A ACK -> B
У цьому прикладі саме так і відбувається.
Щоб побачити лише SSH трафік для цієї “розмови”, можна скористатися фільтром, що ідентифікує цей протокол. Введіть наступне, щоб побачити весь трафік за протоколом SSH з та на віддалений комп’ютер:
ip.addr == 192.168.4.25 && ssh
Це відфільтрує увесь трафік, крім SSH, що надходить з та на 192.168.4.25.
Інші Корисні Шаблони Фільтрів
Під час введення фільтра в панель фільтрів, він залишатиметься червоним доки синтаксис не стане правильним. Коли фільтр є вірним та завершеним, він стає зеленим.
Якщо ввести протокол, наприклад tcp, ip, udp або ssh, а потім поставити крапку (.), з’явиться меню. Воно міститиме останні фільтри, що включали цей протокол, а також усі поля, які можна використовувати для фільтрації цього протоколу.
Наприклад, для ip можна використовувати ip.addr, ip.checksum, ip.src, ip.dst, ip.id, ip.host та інші.
Використовуйте наступні шаблони фільтрів як основу:
Щоб показати лише пакети HTTP: http
Щоб показати лише пакети DNS: dns
Щоб показати лише TCP пакети з 4000 як портом джерела або призначення: tcp.port==4000
Щоб відобразити всі TCP пакети зі скиданням: http.request
Щоб відфільтрувати пакети ARP, ICMP та DNS: !(arp or icmp or dns)
Щоб відобразити всі повторні передачі в трасуванні: tcp.analysis.retransmission
Щоб відфільтрувати прапори (наприклад, SYN чи FIN): Необхідно встановити значення для порівняння. 1 означає встановлений прапор, 0 – не встановлений. Приклад: tcp.flags.syn == 1.
У статті розглянуто основні принципи використання фільтрів відображення, але можливостей набагато більше.
Для глибшого вивчення можливостей та потужності фільтрів Wireshark, зверніться до онлайн-довідника.