Как отправлять данные с помощью ping
ping — это очень полезный инструмент, который позволяет проверять соединение между хостами и устранять такие неполадки, как задержка сети и потеря пакетов, но у него есть и другая, более «темная» сторона: каждый пакет ICMP имеет раздел данных, который можно легко настроить, добавив любые необходимые данные. Он довольно мал, и протокол ICMP по своей природе не поддерживает никаких механизмов TCP, таких как восстановление после ошибок и перестроение порядка пакетов, но все же это функция, которую можно использовать.
Протокол ICMP
Чтобы упростить задачу, давайте немного поговорим о пакете ICMP. Пакет ICMP состоит из двухбайтового заголовка и раздела данных. Тип пакета ICMP, с которым нам нужно работать, — это тип 8 или более известный как «Echo Request Message». Это пакеты ICMP, которые отправляются утилитой ping для проверки сетевого подключения или устранения неполадок, таких как задержка сети и потеря пакетов.
Как отправить данные с помощью ping
Для отправки данных с помощью ping нужно сначала преобразовать их в шестнадцатеричный формат, для этого мы используем команду xdd -p
$ payload=$(echo -n "Hello" | xxd -p) $ echo $payload 48656c6c6f
Затем нужно рассчитать длину данных и прибавить 2, так как общий пакет, который мы отправим, будет состоять из заголовков и части данных.
$ len=$(($(echo $payload | wc -c | tr -s " ") + 2)) $ echo $len 13
И теперь мы готовы отправлять данные с помощью ping!
- Параметр -s определяет общий размер, который принимает значение переменной $len
- Параметр -p определяет данные, которые мы хотим отправить, и принимает значение $payload
- Параметр -c определяет, сколько раз мы будем отправлять этот ICMP-пакет.
- 127.0.0.1 — адрес обратной связи, это IP-адрес, доступный только для компьютера.
$ ping -s$len -c4 -p$payload 127.0.0.1 PATTERN: 0x48656c6c6f PING 127.0.0.1 (127.0.0.1): 13 data bytes 21 bytes from 127.0.0.1: icmp_seq=0 ttl=64 21 bytes from 127.0.0.1: icmp_seq=1 ttl=64 21 bytes from 127.0.0.1: icmp_seq=2 ttl=64 21 bytes from 127.0.0.1: icmp_seq=3 ttl=64
Как читать данные пинга
Команда выше работает, но как проверить, что данные действительно передаются в пакетах ICMP?
- tshark — это версия Wireshark для командной строки, которая используется для чтения сетевых данных из файлов захвата пакетов или сетевых интерфейсов в режиме реального времени.
- -i говорит tshark читать данные с интерфейса «lo0»
- -Y фильтровать только пакеты ICMP
- -T fields -e data вывести только часть данных выбранных пакетов ICMP
- -l сбрасывает буферы данных в stdout, это полезно, так как мы передаем данные инструменту xxd
- xxd -r преобразует шестнадцатеричные данные обратно в двоичные данные
$ tshark -l -i lo0 -Y "icmp" -T fields -e data | xxd -r Capturing on 'Loopback: lo0'
Снова запустить пинг
Теперь у нас есть tshark, прослушивающий пакеты ICMP на интерфейсе «lo0». Давайте попробуем снова запустить ping. Если все прошло так, как ожидалось, вы должны увидеть следующее. Текст «Hello» под командой tshark может показаться не впечатляющим, но если вы задумаетесь, ping может быть дырой в безопасности.
Заключение
Как вы видели, ping может быть уязвимостью в системе безопасности, поскольку он может передавать данные на любой хост.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.