Продолжим изучать методы эксфильтрации данных и средствах борьбы с ними. Сегодня поговорим об ICMP-туннелировании при пентесте.
Еще по теме: Как создать VPN-туннель на Windows и Linux
ICMP-туннелирование при пентесте
ICMP (Internet Control Message Protocol) — протокол сетевого уровня, используемый для диагностики сети.
Утилиты ping и tracert — два основных инструмента администратора для диагностики неисправностей в сети. Без них диагностика сети превращается для инженера в ад. Поэтому трафик ICMP практически никогда не ограничивается. Согласно RFC 792, пакеты ICMP включают в себя поле Data, содержимое и формат которого строго не определены, что открывает возможность для инкапсуляции любых данных.
Для ICMP-туннелирования существуют разные инструменты, такие как icmpsh, ptunnel и icmptunnel. Важный момент: для отправки модифицированных пакетов ICMP в Linux требуются права администратора системы.
В Windows таких ограничений нет. С определенного момента платформа .NET стала содержать все необходимые инструменты, которые позволяют при помощи обертки в PowerShell собрать свой ICMP-туннель для вывода данных без применения сторонних утилит.
На GitHub вы можете найти код клиента и сервера, которые переправляют данные через запросы echo, используя встроенные методы класса Ping из системной сборки.
Как детектировать ICMP-туннелирование?
Детектирование и блокировка ICMP-туннелей — задача нетривиальная, хотя и не очень сложная. Главная проблема заключается в том, что трафик ICMP нельзя блокировать полностью — это может парализовать инфраструктуру сети. Однако, например, белые списки исходящих ICMP-соединений могут сильно осложнить задачу построения канала наружу. В списке можно оставить лишь известные хосты, необходимые для диагностики соединения.
Сигнатурами при детектировании туннелей могут служить такие параметры, как сильное отклонение размера пакетов от нормы и слишком плотный и продолжительный поток трафика ICMP от какого‑то одного хоста. Но главный маркер — это, конечно, поле Data.
Впрочем, необходимо помнить, что поле Data используют и вполне легитимные утилиты. Например, такая привычная вещь, как утилита ping, в каждом пакете запроса echo заполняет в том числе и поле Data. И в зависимости от ОС поле будет заполнено по‑разному. Так, для Windows это будет строка:
1 |
abcdefghijklmnopqrstuvwabcdefghi |
В Linux у ping первые два байта Data отличаются от пакета к пакету, но остальное содержимое не меняется. В сыром HEX оно выглядит так:
1 |
3030000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 |
В дампе будет сразу заметно окончание ASCII-строки:
1 |
**!"#$%&'()+,-./01234567 |
Это еще один параметр для фингерпринтинга ОС, такого как TTL.
Как обойти ICMP-туннелирование?
Как и с другими способами, тут многое зависит от правил детектирования. Подстановка в начале последовательности abcdef позволит придать нашим пакетам вид легитимных. Для борьбы с туннелями ICMP обычно блокируют запросы echo, однако часто не блокируют другие типы ICMP. Например, destination unreachable.
Кроме того, если наша задача — только вывод данных, без обратной связи от сервера, то достаточно одностороннего туннеля, а значит, мы можем генерировать случайные IP-адреса источника (например, с использованием scapy). Это позволит обойти фильтрацию и детект большого потока пакетов от одного IP. Кроме того, этот прием позволит замаскировать реальный адрес машины, служащей источником утечки.