Фильтр по процессу / PID в Wireshark

117

Есть ли способ фильтровать / отслеживать поток TCP / SSL на основе определенного идентификатора процесса с помощью Wireshark ?

Райан Фернандес
источник
7
На момент написания этой статьи Wireshark все еще не поддерживает эту функцию; однако вы можете отслеживать его прогресс (если он есть) в [bug 1184] [1]. [1]: bugs.wireshark.org/bugzilla/show_bug.cgi?id=1184
Кристофер Мейнард,

Ответы:

58

Не понимаю как. PID не попадает в провод (вообще говоря), плюс Wireshark позволяет вам смотреть на то, что находится в проводе - потенциально на все машины, которые обмениваются данными по проводам. В любом случае идентификаторы процессов не уникальны на разных машинах.

Винай Саджип
источник
7
хороший момент ... это то, что я тоже подумал ... позвольте мне подождать день, прежде чем закрыть это, на случай, если есть ниндзя Wirehark, которому удастся это сделать ...
Райан Фернандес
30
Wireshark знает, какой порт используется, а ОС знает PID процесса, использующего порт. С изменениями кода Wireshark должен иметь возможность сопоставить порт с PID. В некоторых случаях это не сработает, например, когда ОС перераспределяет порт другому приложению непосредственно перед тем, как Wireshark запрашивает у ОС PID для порта. Таким образом, это не будет защитой от дурака и сбоев, но если пользователь узнает об этих ограничениях, это все равно будет полезной функцией.
Додзё
Я говорю просто добавьте модуль в wirehark, который прослушивает открытие / закрытие порта и сопоставляет PID с портом. Синхронизируйте это с основным процессом, и вы получите идеальный преобразователь портов в процесс. Однако, прочитав ошибку из комментария к вопросу, создать модуль не так просто.
Vesper
Я помню, как в первый раз загрузил wirehark, он показывал дерево процессов, и вы могли выбрать процесс для мониторинга. Незнаю, когда эта опция исчезла, но она была.
Томаш Зато - Восстановите Монику
90

На всякий случай, если вы ищете альтернативный способ, и вы используете среду Windows, Microsoft Network Monitor 3.3 - хороший выбор. В нем есть столбец с именем процесса. Вы легко добавляете его в фильтр с помощью контекстного меню и применяете фильтр. Как обычно, графический интерфейс очень интуитивно понятен ...

Сриджит Менон
источник
10
Microsoft Network Monitor 3.4 находится по адресу microsoft.com/en-us/download/details.aspx?id=4865
gt
39
Также есть Microsoft Message Analyzer, который по сути является версией Microsoft Wireshark (и, насколько я понимаю, преемником Network Monitor), но с большей интеграцией. В окне выбора столбца в разделе «Etw» -> «EtwProviderMsg» есть столбец для «PID». Это работает хорошо!
Кэмерон
3
Точный путь: EtwProviderMsg -> EventRecord -> Header ->
ProcessId
Я только что попробовал, и выяснил, что Microsoft Message Analyzer - такая унылая программа! Почти довел мою систему до ползания. Очень нелогичный интерфейс. Кто-нибудь нашел способ очистить список собранными данными? Я сдался и удалил этот мусор. (PS. Жаль, что разработчики Wireshark не добавили функцию для подключения имени PID / процесса к порту в фильтре. Это очень легко сделать. Это может быть критично, чтобы увидеть, что происходит в процессе во время его запуска. Как обходной путь я мог получить общее представление, используя ProcMon от SysInternals.)
c00000fd
1
Я недавно обнаружил Microsoft Message Analyzer, и это такой полезный инструмент! Как такое возможно, что я никогда об этом не слышал. Так недооценено. Он имеет отличные возможности фильтрации благодаря гораздо лучшей интеграции с Windows, чем Wireshark. Я переключился на него на всех хостах моей компании в течение ~ 3 месяцев ежедневной работы. Огромная благодарность @Cameron за его / ее комментарий под этим ответом! :-)
Skipper
16

Вы можете сопоставить номера портов от wirehark до номеров портов, скажем, из netstat, который сообщит вам PID процесса, прослушивающего этот порт.

tw39124
источник
12
ну, это может не сработать .. программа открывает и закрывает множество локальных и удаленных портов
Райан Фернандес,
11

Используйте Microsoft Message Analyzer v1.4

Перейдите к ProcessId из средства выбора поля.

Etw
-> EtwProviderMsg
--> EventRecord
---> Header
----> ProcessId

Щелкните правой кнопкой мыши и добавьте как столбец

Энки
источник
1
Спасибо, что указали мне направление, это именно то, что мне было нужно. FWIW, группа верхнего уровня "ProcMon", похоже, содержит тот же ProcessId, а также другую информацию, такую ​​как имя процесса, ParentId и т. Д.
Tobias J
3

В Windows существует экспериментальная сборка, которая делает это, как описано в списке рассылки, Фильтр по имени локального процесса.

patraulea
источник
Это означает, что в Wireshark «вы можете сопоставить номера портов от wirehark до номеров портов, скажем, из netstat, который сообщит вам PID процесса, прослушивающего этот порт». материал из комментария Тома Вулфри, так что он (как отмечается в сообщении) подчиняется ограничениям этого механизма.
3

Это важная вещь, которую нужно сделать для отслеживания того, где определенные процессы пытаются подключиться, и кажется, что в Linux нет удобного способа сделать это. Однако возможны несколько обходных путей, поэтому я считаю, что о них стоит упомянуть.

Существует программа под названием nonet, которая позволяет запускать программы без доступа к Интернету (у меня в моей системе установлено большинство средств запуска программ). Он использует setguid для запуска процесса в группе nonet и устанавливает правило iptables, чтобы отклонять все соединения из этой группы.

Обновление: к настоящему времени я использую еще более простую систему, вы можете легко получить читаемую конфигурацию iptables с помощью ferm и просто использовать программу sgдля запуска программы с определенной группой. Iptables также позволяет перенаправить трафик, чтобы вы могли даже направить его на отдельный интерфейс или локальный прокси-сервер на порту, который позволяет фильтровать в wirehark или ЗАПИСЫВАТЬ пакеты непосредственно из iptables, если вы не хотите отключать весь Интернет, пока вы проверяют трафик.

Не очень сложно адаптировать его для запуска программы в группе и вырезать весь другой трафик с помощью iptables на время выполнения, и тогда вы сможете захватывать трафик только из этого процесса.

Если я когда-нибудь решусь написать это, я выложу ссылку здесь.

С другой стороны, вы всегда можете запустить процесс на виртуальной машине и обнюхать правильный интерфейс, чтобы изолировать создаваемые им соединения, но это было бы довольно плохим решением ...


источник
3

Если вы хотите подписаться на приложение, которое еще нужно запустить, это, безусловно, возможно:

  1. Установите докер (см. Https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ )
  2. Откройте терминал и запустите крошечный контейнер: docker run -t -i ubuntu /bin/bash(замените «ubuntu» на свой любимый дистрибутив, он не должен быть таким же, как в вашей реальной системе)
  3. Установите свое приложение в контейнер так же, как и в реальной системе.
  4. Запустите wirehark в своей реальной системе, перейдите в раздел «захват»> «Параметры». В открывшемся окне вы увидите все свои интерфейсы. Вместо того чтобы выбрать any, wlan0, eth0, ... выбрать новый виртуальный интерфейс docker0вместо.
  5. Начать захват
  6. Запустите ваше приложение в контейнере

У вас могут возникнуть сомнения по поводу запуска вашего программного обеспечения в контейнере, поэтому вот ответы на вопросы, которые вы, вероятно, захотите задать:

  • Будет ли мое приложение работать внутри контейнера? Почти наверняка да, но вам может потребоваться немного узнать о докере, чтобы он заработал.
  • Мое приложение не будет работать медленно? Незначительно. Если ваша программа выполняет тяжелые вычисления в течение недели, то теперь это может занять неделю и 3 секунды.
  • Что делать, если в контейнере сломается моя программа или что-то еще? Это хорошая вещь в контейнерах. Все, что работает внутри, может только сломать текущий контейнер и не может повредить остальную систему.
Гаро
источник
0

В некоторых случаях фильтрация по идентификатору процесса невозможна. Например, в моем случае мне нужно было прослушивать трафик от одного процесса. Но я нашел в его конфиге IP-адрес целевой машины, добавил фильтр ip.dst==someipи вуаля. Это ни в коем случае не сработает, но кому-то пригодится.

Алексей Жуковский
источник
0

Получите номер порта, используя netstat:

netstat -b

А затем используйте фильтр Wireshark:

tcp.port == portnumber
Сахил Лахвани
источник
Я не уверен, что это надежный способ. Если у вас есть TCP-сервер, который прослушивает порт, но не заблокировал обработку TCP ядром, либо ядро, либо ваше приложение, или оба, могут отвечать на порт.
aeb0
0

Использование straceбольше подходит для этой ситуации.

strace -f -e trace=network -s 10000 -p <PID>;

возможность -fтакже отслеживать все разветвленные процессы, -e trace=netwrokфильтровать только системные вызовы сети и -sотображать длину строки до 10000 символов.

Вы также можете отслеживать только определенные вызовы, такие как операции отправки, получения и чтения.

strace -f -e trace=send,recv,read -s 10000 -p <PID>;
Shaboti
источник
-16

Вы можете проверить номера портов с помощью этих примеров команд на wirehark: -

tcp.port == 80

tcp.port == 14220

Раджив Дас
источник