Полное решение
Решение похоже на «хакерское» с той разницей, что пакет UDP Discover будет сгенерирован вручную в оболочке.
Код предназначен только для замены данного MA C сетевой карты на форму пробелов вместо двоеточий и присвоения переменной (введите Bash):
# manualy:
MAC=ab:ab:ab:ab:ab:ab; MAC=`printf "$(echo $MAC | sed 's/:/ /g')%.0s"`
# or automaticaly:
MAC=`printf "$(echo $(ifconfig -a |awk -v RS= '/eth0/' |awk '/ether/ {print($2)}') | sed 's/:/ /g')%.0s"`
# or simply type (spaces instead of colons!):
MAC="a6 a6 a6 a6 a6 a6"
Используя xxd, сгенерируйте файл, содержащий пакет DHCPDISCOVER готов к отправке. Я использую тот факт, что на практике контрольная сумма не проверяется всеми DHCP серверами . Это позволяет избежать значительных сложностей с вычислением контрольной суммы и ее записью. Единственный элемент, который нужно изменить, это MA C сетевой карты.
Сайт очень помог: DHCP (на русском)
echo -e $(echo -n -e "01 01 06 00 62 48 94 CA 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $MAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 FF") |xxd -r -p >blobfile
Чтобы пакет DHCPDISCOVER без искажений достиг DHCP-сервера, он должен быть отправлен в виде двоичных данных . К сожалению, Bash принимает некоторые двоичные последовательности в качестве управляющих команд.
HEX-коды от 00 до 1F - это диапазон управляющих символов, который зависит от системы. Многие из них будут интерпретироваться как BASH, например 1F, 0d et c. К этому добавляются управляющие последовательности, например 082008 или 610860. Адреса
MA C теоретически равны 16777216, обычно они содержат части, идентифицирующие производителя и оборудование. Производителей становится все больше, в том числе компьютеров, также существует практика назначения воображаемых или генерации случайных MA C адресов. Таким образом, вероятность использования управляющих символов высока.
Это исключает использование echo Bash*. Мы будем использовать cat.
cat blobfile | nc -w1 -u -b 255.255.255.255 67
Фрагмент результата Wireshark:
Client MAC address: ab:ab:ab:ab:ab:ab (ab:ab:ab:ab:ab:ab)
Option: (53) DHCP Message Type (Discover)
Решение сводится к 2 строкам кода, используя только cat и xxd и netcat при условии ручного ввода адреса MA C в оболочке.
Я не нашел способа сделать Bash невосприимчив к двоичным данным, не нарушая их. Вот почему я предлагаю исключить его из фазы отправки пакета Возможно, имеет смысл написать генератор в C, который избавится от перенаправления в файл и программу cat и упакует все в одну строку. Однако это не является предметом вопроса.
РЕДАКТИРОВАТЬ:
Решение проблемы Bash - установить оболочку r c из Plan 9. Она очень мала. (96 КБ), быстро и, что наиболее важно, не интерпретирует двоичные символы как управляющие . Я проверил на стандартной версии r c 1.7.4-1 Debian Linux, доступной через apt. Теперь просто следуйте инструкциям ниже, чтобы отправить правильный пакет DHCP Discover без использования cat и файла-заглушки, только оболочки и xxd и n c.
MAC='08 20 08 1f 0d ff'
echo -n -e "01 01 06 00 62 48 94 CA 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 $MAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 63 82 53 63 35 01 01 FF" |xxd -r -p | nc -w1 -u -b 255.255.255.255 67