Как мне создать пакет UDP?

15

Когда я выполняю следующую команду Netcat и просматриваю пакеты с помощью Wireshark , он говорит, что UDP-пакет искажен.

$ echo "this is a test" | nc -u 127.0.0.1 53

Аналогично, использование таких команд, как, $ echo "this is a test" > /dev/udp/127.0.0.1/53приводит к появлению ошибок в «сформированном пакете» в Wireshark.

Введите описание изображения здесь

Команда echo отправляется / доставляется на сервер Netcat без ошибок. Но это заставило меня задуматься: возможно ли вручную создать правильный пакет UDP с помощью echo или какого-либо другого собственного инструмента Unix?

Я использую Debian и MacOS.

user322500
источник
10
Согласно вашему скриншоту, это не сам пакет udp, который искажен, а его содержимое, так как порт 53 используется для DNS, а ваш пакет не содержит действительный запрос DNS.
tkausl
@tkausl ты абсолютно прав. При использовании портов, отличных от 53, нет «искаженных» ошибок. Спасибо, что указали на это.
user322500
1
Если вы не используете стандартные протоколы, вы должны использовать порты в диапазоне от 49152 до 65535. Поскольку Linux по умолчанию использует диапазон от 32768 до 60999 в качестве эфемерных портов, я рекомендую не выбирать их для нестандартных протоколов. Однако от 61000 до 65535 являются честной игрой для нестандартных протоколов. Я обычно использую, echo $[61002+RANDOM%4532]чтобы выбрать случайный номер порта в этом диапазоне.
Касперд
1
Не входите в систему как root. Вы должны выполнять большую часть своей деятельности как пользователь без полномочий root. Если вы делаете что-то от имени пользователя root, вы вернетесь сюда с вопросом, как починить вашу машину, и мы не сможем помочь (кроме как рекомендовать переустановку).
Ctrl-Alt-Delor
1
@tkausl Посмотри, что ты потерял за то, что не оставил свой комментарий в качестве ответа ....
Джордж Василиу

Ответы:

41

Ваш пакет полностью действителен с точки зрения IP и UDP. Если вы развернете подробности протокола для Ethernet / IP / UDP в нижней панели Wireshark, вы увидите, что пакет успешно проанализирован.

Однако, поскольку он предназначен для порта 53, Wireshark пытается проанализировать его как пакет DNS, что не может сделать (поскольку строка «это тест» не является допустимым запросом DNS согласно спецификации RFC 1035 ).

Если вы будете следовать спецификации по этой ссылке, вы сможете создать пакет, который действителен при анализе в виде запроса DNS. Если вы отправите пакет на другой порт, вы заметите, что Wireshark больше не будет анализировать его как запрос DNS и, следовательно, не будет отображать это предупреждение.

Восстановить Монику - ζ--
источник
15

Вы можете отправить их в Bash специальные псевдонимы с перенаправлением.

Из страниц Bash:

/ dev / tcp / host / port Если host является действительным именем хоста или интернет-адресом, а port является целочисленным номером порта или именем службы, bash пытается открыть соответствующий сокет TCP.

/ dev / udp / host / port Если host является действительным именем хоста или интернет-адресом, а port является целым номером порта или именем службы, bash пытается открыть соответствующий сокет UDP.

Это отправит пакет UDP на 192.168.2.11 на порт 8080:

echo "This is a test" > /dev/udp/192.168.2.11/8080
rAlen
источник
Спасибо за этот ответ. Я обновил свой вопрос. Использование вашего метода также, к сожалению, приводит к сообщению об ошибке «неправильно сформированный пакет».
user322500
-1

Здесь есть несколько вопросов; утверждение о «неверно сформированном пакете» может быть связано с разгрузкой контрольной суммы и, если это так, является ложной ошибкой, поскольку отражает захват пакета, не имеющий полного представления, - вместо этого часть работы была выполнена на сетевом оборудовании. WireShark должен иметь документацию по этому вопросу.

В противном случае различные инструменты (например socat, ncили netcat, или с помощью чрезвычайно похожих функций в оболочках, таких как ksh93или bash) могут брать байты из стандартного ввода и выгружать их в пакет UDP. Является ли это «правильным», зависит от протокола; теоретически можно построить и отправить пакет DNS или DHCP таким образом, хотя чаще люди используют библиотеку или специальное программное обеспечение, которое (надеюсь) правильно реализует рассматриваемый протокол, поскольку обычно требуется гораздо больше, чем установка нескольких битов в тело пакета и его отправка по сети, в частности, обработка ответов, повторная попытка после тайм-аута или ошибки, поля заголовка пакета и т. д. Протоколы обычно очень хорошо документированы в RFC или см. серию книг «Иллюстрированный TCP / IP». Стивенсом для еще большей документации.

Конкретные инструменты, такие как nmapочень нестандартные вещи при создании пакетов. В противном случае для ручного создания пакетов обычно используется язык программирования, хотя, опять же, большинство программного обеспечения будет использовать существующие библиотеки или системные службы для отправки DNS, DHCP или других UDP-пакетов, поскольку они гораздо менее трудоемки и гораздо менее подвержены ошибкам, чем ручное создание необработанного пакет с нуля.

thrig
источник