Скрытый канал поверх ICMP

Скрытый канал поверх ICMP

Скрытый канал поверх ICMP (ICMP-туннель) устанавливает скрытое соединение между двумя компьютерами с помощью пакетов эхо-запроса и эхо-ответа протокола ICMP. Данная техника позволяет, например, полностью туннелировать TCP-трафик через эхо-запросы и ответы (ping).

  Автор: Debasish Mandal

Введение и обзор

Скрытый канал поверх ICMP (ICMP-туннель) устанавливает скрытое соединение между двумя компьютерами с помощью пакетов эхо-запроса и эхо-ответа протокола ICMP. Данная техника позволяет, например, полностью туннелировать TCP-трафик через эхо-запросы и ответы (ping). Технически туннелирование через скрытый канал ICMP происходит посредством внедрения любых нужных данных в эхо-пакет и его пересылки на удаленный компьютер. Удаленный компьютер отвечает подобным образом, внедряя ответ в другой ICMP-пакет и отсылая этот пакет назад.

Некоторые ключевые моменты, касающиеся ICMP

В ICMP нет портов

Мы не можем пинговать порты. Когда кто-нибудь говорит о “пинге порта”, он на самом деле говорит об использовании протокола четвертого уровня (вроде TCP или UDP), чтобы выяснить, открыт ли порт. Если кто-либо пингует порт 80, это обычно значит, что он посылает на данную систему SYN-пакет по протоколу TCP. Настоящий ping работает через протокол ICMP, который не использует порты вовсе.

ICMP работает на третьем уровне.

Хотя ICMP находится “над” IP в стеке протоколов, он не является протоколом 4 уровня (считается еще одним протоколом третьего уровня).

На сетевом уровне пакеты маршрутизируются на основании уникального сетевого адреса. Маршрутизатор работает как отделение почты, и сетевой уровень штампует письма (данные) для передачи в определенном направлении. На сетевом уровне работают следующие протоколы: IP, ICMP, ARP, RIP, OSI, IPX и OSPF, а также следующие устройства: маршрутизатор, мост-маршрутизатор, коммутаторы Frame Relay и ATM.

Некоторые ключевые моменты, касающиеся файрволов

Файрволы работают на разных уровнях, чтобы иметь возможность применять различные критерии для ограничения трафика. Самый низкий уровень работы файрвола – третий. В модели OSI он называется сетевым. В стеке TCP/IP это уровень протокола межсетевого взаимодействия (Internet Protocol). Данный уровень занимается маршрутизированием пакетов к месту их назначения. На третьем уровне файрвол может определить, пришел ли пакет из надежного источника, но не может сказать, что он содержит и с какими другими пакетами связан. Файрволы, которые оперируют на транспортном уровне, знают о пакете немного больше и могут разрешить или запретить доступ на основе более сложных критериев. На прикладном уровне файрволы владеют большим количеством информации о том, что происходит, и могут быть очень избирательны в предоставлении доступа.

Могло показаться, что файрволы, функционирующие на более высоких уровнях стека протоколов, должны быть лучше во всем. Это не обязательно так. Чем ниже в стеке перехватывается пакет, тем большую безопасность обеспечивает файрвол. Если атакующий не может пройти третий уровень, он не сможет захватить контроль над операционной системой.

Использование скрытого ICMP-канала

ICMP-туннелирование можно использовать для обхода правил файрвола путем обфускации основного трафика. В зависимости от реализации ПО для ICMP-туннелирования этот тип соединения можно отнести и к категории зашифрованных соединений между двумя компьютерами. Без глубокого исследования пакетов или просмотра системных журналов сетевые администраторы не смогут обнаружить этот тип трафика в своей сети.

Внутри ICMP-пакета

Чтобы увидеть содержимое ICMP-пакета, мы будем посылать запросы на удаленный хост и прослушивать сетевой трафик.

Давайте взглянем на обычный ping.

Здесь мы посылаем обычные эхо-запросы протокола ICMP на удаленный хост 192.168.157.1.

Захватив трафик с помощью Wireshark, мы увидим следующее:

Поскольку мы использовали стандартную утилиту ping без опций, мы послали несколько последовательных ICMP-запросов к хосту. Это несколько затруднит нам анализ трафика. Поэтому давайте пошлем одиночный ICMP-пакет без нагрузки.

Для этой цели можно использовать следующую команду.

ping –c 1 –s 0

Теперь анализировать трафик будет проще.

В сниффере на удаленном хосте мы можем видеть, что получено 42 байта данных.

Типичная структура ICMP-пакета представлена на рисунке ниже.

Рисунок 1

Типичная структура ICMP-заголовка:

Анализируя те 42 байта данных, мы можем заключить, что первые 14 байтов представляют собой Ethernet-заголовок.

Вы можете увидеть, что первые 12 байт Ethernet-заголовка представляют собой ничто иное, как MAC-адреса источника и назначения.

Следующие 20 байт полученной датаграммы – IP-заголовок (см. рисунок 1).

Структура IP-заголовка, представленная более подробно.

Далее следуют 8 байт ICMP-заголовка:

Структура ICMP-заголовка, представленная более подробно.

См. также рисунок 2.

Утилита ping, присутствующая в обычных Linux-системах, позволяет нам контролировать количество пакетов, их размер, но не позволяет сформировать эхо-запрос специального вида. Поскольку главной нашей целью является манипулирование данными в содержимом ICMP-пакета, использование стандартной утилиты ping – не лучший вариант.

HPING2

Hping – свободный генератор и анализатор пакетов для TCP/IP протоколов, распространяемый Salvatore Sanfilippo (также известным как Antirez). С помощью hping мы также можем манипулировать порцией данных одиночного ICMP-пакета. Используя hping, мы снова пошлем одиночный ICMP-пакет, но на этот раз добавим в него немного мусора.

На скриншоте можно заметить, что мы добавили в пакет 4 символа “A” и послали его на адрес 192.168.157.1.

Давайте прослушаем и проанализируем трафик.

Теперь вы можете видеть, что мы захватили 46(42+4) байтов данных. На скриншоте легко различить нашу нагрузку, состоящую из подсвеченных "41". Это hex-представление символа “A”.

PING своими руками: жизнь коротка, поэтому я предпочитаю Питон.

В вышеприведенных примерах мы использовали для посылки ICMP эхо-запросов на любой хост стандартную утилиту ping и утилиту hping. Теперь мы используем Питон для отсылки самодельного ICMP-пакета.

В данном случае мы формируем не только заголовок ICMP и начинку пакета, но и заголовки протоколов Ethernet и IP.

Переменная “dump” в вышеприведенном скрипте содержит всю датаграмму целиком, включая Ethernet-заголовок, IP-заголовок, ICMP-заголовок и начинку. Здесь в качестве начинки выступают четыре символа “A” (\x41\x 41\x 41\x 41).

Из сказанного выше ясно, что мы можем легко послать произвольные данные на произвольный хост путем внедрения данных в эхо-пакет. Теперь осталось запустить на удаленном хосте демон, который умеет отвечать подобным образом, внедряя ответ в другой ICMP-пакет и посылая пакет назад.

Собираем все вместе

Чтобы осуществить это, нам нужно программно реализовать следующие действия:

  1. Демон просматривает ICMP-пакеты
  2. После получения пакета производится извлечение его начинки (корректного запроса со стороны атакующего)
  3. На основании начинки делаются необходимые действия
  4. Отсылается обратный ICMP-пакет с ответом

Я написал на Питоне простой сервер и клиент для ICMP-туннелирования, которые позволяют устанавливать скрытый канал между двумя хостами.

Код сервера:

http://pastebin.com/JLD6grb2

Код клиента:

http://pastebin.com/gH3zzHdQ

Данный демон скрытого канала по сути получает команды ОС из ICMP-пакетов и запускает эти команды на удаленном хосте, посылая ответные ICMP-пакеты с результатами выполнения команд. Как только демон запускается на хосте, он начинает прослушивать ICMP-пакеты. После получения команд с клиента он извлекает начинку из пакетов и запускает команду на своем хосте, посылая назад ICMP-пакет с результатом. Если вывод команды слишком длинный, демон пошлет его в нескольких пакетах.

Сниффер клиентской части получает ответные пакеты и извлекает вывод команды из начинки. После разбора он отображает вывод. Утилита Hping также может быть использована как клиент для данного демона. В этом случае начинку следует формировать по определенному шаблону так, чтобы демон смог распознать запрос. Тогда для разбора ответа следует использовать клиентский скрипт, либо Wireshark.

Видеодемонстрация данного скрытого канала:

http://www.youtube.com/watch?v=ADHtjwwkErI

Несколько других хорошо известных утилит для создания скрытых каналов:

LOKI

LOKI – программа для туннелирования информации. В качестве носителей полезной нагрузки она использует пакеты эхо-ответа.

NCovert

Производит скрытую передачу файлов за счет сокрытия передаваемых файлов в безвредных на вид данных с помощью подделки пакетов. В некоторых случаях позволяет спрятать реальный IP-адрес пользователей.

007 Shell

007 Shell – простая клиент-серверная программа, написанная на C, для удаленного администрирования системы по сети с помощью техник, схожих с теми, что использует Loki. Команды и ответные сообщения инкапсулируются в полезную нагрузку пакетов ICMP ECHO_REPLY (пакеты эхо-ответа).

ICMPTX (IP-over-ICMP):

ICMPTX – программа, позволяющая пользователю с правами root создавать виртуальное сетевое соединение между двумя компьютерами, скрывая данные внутри ICMP-пакетов.

Способы борьбы

Попытка предотвращения скрытых каналов напоминает преследование кошки собакой. Вы можете предотвратить определенные каналы, только если осведомлены о них, можете анализировать генерируемый ими трафик и затем соответствующим образом настраивать вашу IDS (например, прописать правила Snort). Тем не менее, когда скрытые каналы генерируют разный трафик с каждым пакетом (например, с помощью bit-flipping) или используют продвинутые техники тайминга, предотвратить их становится невозможно.

Хотя единственным способом предотвращения туннелирования такого типа является полное блокирование ICMP-трафика, это неосуществимо для производственных сред из реального мира. Один из методов борьбы с данным видом атак заключается в пропускании через файрвол ICMP-пакетов лишь фиксированного размера, чтобы практически исключить данный тип поведения. IDS может считать большие ICMP-пакеты подозрительными и поднимать тревогу. Тем не менее, поскольку существуют легальные способы использования больших ICMP-пакетов, сложно определить, является ли большой ICMP-пакет вредоносным на самом деле. Например, большие ICMP-пакеты используются для проверки возможности передачи больших пакетов по сети. Отличить легальные пакеты от негальных еще сложнее, если скрытый канал шифруется. IDS должна уметь определять, зашифрован ли пакет. Различение зашифрованных от незашифрованных пакетов все еще остается открытой для иследований проблемой.

Snort предоставляет одно или два правила, которые могут помочь в обнаружении скрытых ICMP-каналов. Другая возможность – обнаруживать бит "Dont Fragment" в скрытом канале и так далее. Это простые примеры. Тем не менее, snort не предоставляет таких правил непосредственно, и кому-то нужно подстраивать их под себя. Кроме того, существуют некоторые умные скрытые каналы, которые очень сложно обнаружить (например, скрытый канал ISN или скрытый канал на основе временных задержек).

Источники:

http://danielmiessler.com/study/icmp/
http://en.wikipedia.org/wiki/Covert_channel
http://en.wikipedia.org/wiki/Firewall_(computing)
http://www.2factor.us/icmp.pdf

Не ждите, пока хакеры вас взломают - подпишитесь на наш канал и станьте неприступной крепостью!

Подписаться