Снифинг Ethernet-трафика с платой Throwing Star

22 октября 2018

Благодаря заметке Изучаем Ethernet-фреймы с помощью осциллографа теперь мы знаем, как физически осуществляется передача данных по Ethernet-кабелю. Однако описанный в посте подход не слишком удобен для полноценной отладки какого-то устройства, работающего с Ethernet. Есть несколько решений этой проблемы. Например, можно воспользоваться старым Ethernet-хабом (но нынче их не так-то просто найти) или настроить зеркалирование портов на Ethernet-свиче. Но в рамках этого поста мы рассмотрим альтернативное решение, которое заключается в использовании платы Throwing Star LAN Tap.

Плата была разработана Michael Ossmann (который также является создателем HackRF и других прекрасных проектов) в 2011 году. Как нам известно, в Ethernet-кабеле есть пара проводов для передачи данных в одну сторону, и еще пара для передачи в другую. Throwing Star имеет два Ethernet-разъема (J1 и J2), между которыми данные просто передаются как есть. Еще на два разъема (J3 и J4) дублируют данные, передаваемый от порта J1 к порту J2 и от порта J2 к порту J1 соответственно.

Вот как это выглядит:

Плата Throwing Star LAN Tap

Кабель от верхнего порта (J2) идет к роутеру с выходом в интернет, а кабель от нижнего порта (J1) — к ноутбуку. На левый порт (J4) приходят данные, идущие с ноутбука на роутер, а на правый (J3) дублируются фреймы от роутера к ноутбуку.

Помимо прочего, Throwing Star интересен своей компактностью, а также тем, что для работы ему не нужно никакого питания. Кроме того, плата практически не оказывает влияния на передаваемые данные. Нет никаких лишних задержек, как при использовании свича, потому что данным негде задерживаться. Если же мы случайно пошлем что-то на левый или правый порт, ничего страшного — передающие контакты у этих портов все равно ни с чем не соединены.

Из минусов — плата работает только для скоростей 10 Мбит/сек и 100 Мбит/сек. Связано это с тем, что в гигабитном Ethernet’е данные передаются одновременно в обе стороны по каждой паре проводов. По этой причине в Throwing Star предусмотрено два конденсатора на 220 пФ. Они работают, как фильтры нижних частот и не позволяют передавать данные со скоростью больше 100 Мбит/сек. Таким образом, два устройства, соединенных через Throwing Star, будут вынуждены работать на 10 Мбит/сек или 100 Мбит/сек.

Fun fact! Вы можете помнить, что стандарты 10baseT и 100baseT используют только две пары проводов, когда 1000baseT нужны все четыре. Тогда зачем использовать конденсаторы, если можно просто не соединять лишние провода? Дело в том, что по витой паре может передаваться и что-то отличное от Ethernet, например RS-232, и использовать при этом все провода. Плата позволяет снифать и такие протоколы тоже.

Есть и другая проблема. Чтобы увидеть весь передаваемый трафик, нужно две сетевые карты, по одной на каждых из боковых портов. Большинство же компьютеров имеют только одну сетевую карту. К счастью, в наше время есть великое множество внешних сетевых карт, подключаемых по USB. Я использовал недорогую сетевую карту на базе чипа AX88772B, производимую Olimex:

USB сетевая карта на базе AX88772B от Olimex

AX88772B широко распространен и прекрасно работает с Linux. На eBay вы найдете множество сетевых карт других производителей на базе того же чипа.

Итак, давайте уже попробуем что-нибудь поснифать. Для этого обе сетевые карты следует перевести в promiscuous mode. В это режиме карта принимает любые пакеты, независимо от того, направлены ли они на ее адрес, или не на ее.

Соответствующие команды:

sudo ip link set enp0s25 promisc on
sudo ip link set enp0s20u3 promisc on

Теперь можно воспользоваться каким-нибудь tcpdump или Wireshark, как обычно. Я лично использовал самопальный снифер на базе libpcap:

sudo ./eaxsniff enp0s25 tcp
# в другом терминале:
sudo ./eaxsniff enp0s20u3 tcp

На ноутбуке, подключенном к нижнему разъему Throwing Star, говорим:

curl -D - -o /dev/null http://eax.me/

Возвращаемся к окнам терминала со снифером. В первом терминале видим:

192.168.8.125:40222 -> 185.14.186.115:80, 70 (0x46) bytes

      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

0000  47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A GET / HTTP/1.1..
0010  48 6F 73 74 3A 20 65 61 78 2E 6D 65 0D 0A 55 73 Host: eax.me..Us
0020  65 72 2D 41 67 65 6E 74 3A 20 63 75 72 6C 2F 37 er-Agent: curl/7
0030  2E 34 37 2E 30 0D 0A 41 63 63 65 70 74 3A 20 2A .47.0..Accept: *
0040  2F 2A 0D 0A 0D 0A                               /*....

Во втором:

185.14.186.115:80 -> 192.168.8.125:40222, 361 (0x169) bytes

      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

0000  48 54 54 50 2F 31 2E 31 20 33 30 31 20 4D 6F 76 HTTP/1.1 301 Mov
0010  65 64 20 50 65 72 6D 61 6E 65 6E 74 6C 79 0D 0A ed Permanently..
0020  53 65 72 76 65 72 3A 20 6E 67 69 6E 78 0D 0A 44 Server: nginx..D
0030  61 74 65 3A 20 4D 6F 6E 2C 20 32 32 20 4F 63 74 ate: Mon, 22 Oct
0040  20 32 30 31 38 20 30 39 3A 31 30 3A 30 39 20 47  2018 09:10:09 G
0050  4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D 54 79 70 65 MT..Content-Type
0060  3A 20 74 65 78 74 2F 68 74 6D 6C 0D 0A 43 6F 6E : text/html..Con
0070  74 65 6E 74 2D 4C 65 6E 67 74 68 3A 20 31 37 38 tent-Length: 178
0080  0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 6B 65 ..Connection: ke
0090  65 70 2D 61 6C 69 76 65 0D 0A 4C 6F 63 61 74 69 ep-alive..Locati
00A0  6F 6E 3A 20 68 74 74 70 73 3A 2F 2F 65 61 78 2E on: https://eax.
00B0  6D 65 2F 0D 0A 0D 0A 3C 68 74 6D 6C 3E 0D 0A 3C me/....<html>..<
00C0  68 65 61 64 3E 3C 74 69 74 6C 65 3E 33 30 31 20 head><title>301
00D0  4D 6F 76 65 64 20 50 65 72 6D 61 6E 65 6E 74 6C Moved Permanentl
00E0  79 3C 2F 74 69 74 6C 65 3E 3C 2F 68 65 61 64 3E y</title></head>
... пропущено ...

Как видите, все получилось! По завершении работы не забудьте выключить promiscuous mode.

На сайте greatscottgadgets.com перечислено множество магазинов, продающих Throwing Star. Поскольку проект является открытым, на eBay вы без труда найдете множество его клонов. Ну и в крайнем случае устройство всегда можно просто спаять из двух Ethernet-кабелей.

А доводилось ли вам снифать Ethernet, и если да, то что вы для этого использовали?

Метки: , , , .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, Facebook, ВКонтакте, Twitter или Telegram.