--- title: Занятие 17. Скрытые ICMP и DNS туннелирование tags: КНИТУ_модуль 2, 2-3 курсы description: Скрытые ICMP и DNS туннелирование --- # Скрытые ICMP и DNS туннели **Цель работы:** настроить ICMP-туннелирование так, чтобы можно было выходить в сеть интернет, даже если на файерволе заблокированы все правила, кроме ping. --------- ICMP, который расшифровывается как Internet Control Message Protocol это протокол третьего уровня модели OSI, который используется для диагностики проблем со связностью в сети. Говоря простым языком, ICMP помогает определить может ли достичь пакет адреса назначения в установленные временные рамки. Обычно, ICMP используют маршрутизаторы и устройства третьего уровня. Основная цель ICMP это отчетность об ошибках. При соединении двух девайсов в сети, если часть данных не доходит до адреса назначения, теряется или превышает допустимые таймауты - ICMP генерирует ошибки. Второе, и, пожалуй, одно из самых популярных применений ICMP это утилиты ping и traceroute. Термин “пинговать" как - раз связан с протоколом ICMP и “пинговать" хост - означает отправлять ICMP пакеты с целью понять, отвечает ли на них целевое устройство. На этом занятии мы познакомимся с "темной" стороной применения ICMP-протокола. **Скрытый канал поверх ICMP (ICMP-туннель)** устанавливает скрытое соединение между двумя компьютерами с помощью пакетов эхо-запроса и эхо-ответа протокола ICMP. Данная техника позволяет, например, полностью туннелировать TCP-трафик через эхо-запросы и ответы (ping). Технически туннелирование через скрытый канал ICMP происходит посредством внедрения любых нужных данных в эхо-пакет и его пересылки на удаленный компьютер. Удаленный компьютер отвечает подобным образом, внедряя ответ в другой ICMP-пакет и отсылая этот пакет назад. ### В ICMP нет портов Мы не можем пинговать порты. Когда кто-нибудь говорит о “пинге порта”, он на самом деле говорит об использовании протокола четвертого уровня (вроде TCP или UDP), чтобы выяснить, открыт ли порт. Если кто-либо пингует порт 80, это обычно значит, что он посылает на данную систему SYN-пакет по протоколу TCP. Настоящий ping работает через протокол ICMP, который не использует порты вовсе. ### ICMP работает на третьем уровне. Хотя ICMP находится “над” IP в стеке протоколов, он не является протоколом 4 уровня (считается еще одним протоколом третьего уровня). ![](https://i.imgur.com/G7Cjh8a.png) На сетевом уровне пакеты маршрутизируются на основании уникального сетевого адреса. Маршрутизатор работает как отделение почты, и сетевой уровень штампует письма (данные) для передачи в определенном направлении. На сетевом уровне работают следующие протоколы: IP, ICMP, ARP, RIP, OSI, IPX и OSPF, а также следующие устройства: маршрутизатор, мост-маршрутизатор, коммутаторы Frame Relay и ATM. ### Использование скрытого ICMP-канала ICMP-туннелирование можно использовать для обхода правил файрвола путем обфускации основного трафика. В зависимости от реализации ПО для ICMP-туннелирования этот тип соединения можно отнести и к категории зашифрованных соединений между двумя компьютерами. Без глубокого исследования пакетов или просмотра системных журналов сетевые администраторы не смогут обнаружить этот тип трафика в своей сети. Пример ICMP-пакета: ![](https://i.imgur.com/Fi68eFz.png) ### DNS туннелирование DNS-tunneling — техника, позволяющая передавать произвольный трафик (фактически, поднять туннель) поверх DNS-протокола. Может применяться, например, для того чтобы получить полноценный доступ к Интернет из точки, где разрешено преобразование DNS-имён. Для организации DNS-туннеля необходимо чтобы снаружи (то есть, в точке, куда направлен туннель) его кто-то принимал. Точка приёма является сервером имён для какой-то зоны. Изнутри сети делаются запросы имён по этой зоне. Так передаётся трафик изнутри <—. В качестве результата преобразования возвращаются ответные данные. Так передаётся трафик внутрь —>. DNS-туннелирование нельзя запретить простыми правилами брандмауэра, разрешив при этом остальной DNS-трафик. Это связано с тем, что трафик DNS-туннеля и легитимные DNS-запросы неразличимы. Обнаруживать DNS-туннелирование можно по интенсивности запросов (если трафик по туннелю велик), а также более сложными методами, используя системы обнаружения вторжений. ### Топология сети ![](https://i.imgur.com/XmxCxBV.png) ### Характеристики добавляемого оборудования: - ICMP-SRV: ``` Image: Debian: CPU - 2 RAM 2048 MB QEMU Nic - e1000 ``` ### Последовательность выполнения лабораторной работы #### Настройка ICMP-SRV ``` nano /etc/network/interfaces ``` Приводим настройки ens3 к виду: ``` auto ens3 allow-hotplug ens3 iface ens3 inet dhcp ``` Перезапускаем службу командой ``` service networking restart ``` Обновляем репозиторий пакетов, пакеты и системы: ``` apt update && apt upgrade ``` Теперь на машину ICMP-SRV требуется установить утилиту [**Hans**](https://github.com/friedrich/hans) для установки ICMP-сервера: ``` apt install git curl git clone https://github.com/friedrich/hans ``` Собираем репозиторий с помощью утилиты g++: ``` apt install make apt install g++ cd hans/ make ``` Такую же систему нужно собрать и на клиенте – в нашем случае это будет машина Kali-LAN. Прежде чем приступить к дальнейшим настройкам, попробуйте измерить скорость соединения на Kali-LAN до и после установления ICMP-туннеля. Обязательно отметьте в выводах работы разность скорости и объсните, почему она изменилась. На **ICMP-SRV** запускаем как сервер, для начала скачиваем необходимые сетевые инструменты: ``` apt install net-tools ``` Запускаем ``` ./hans -s 10.1.2.0 -p "пароль" ``` ![](https://i.imgur.com/KsPmd8R.png) Проверяем сетевые настройки: ``` ip a ``` ![](https://i.imgur.com/w4saKr3.png) Запускаем на Kali LAN: ``` ./hans -c 192.168.0.120 -p 123456 ``` ![](https://i.imgur.com/Yd1e1jX.png) Проверяем сетевые настройки ``` ip a ``` ![](https://i.imgur.com/7rECW4k.png) По внутренним IP адресам можем пропинговать их друг с другом: **ICMP-SRV** ![](https://i.imgur.com/tXITJkH.png) **Kali-LAN** ![](https://i.imgur.com/vJ6QO7x.png) Попробуем подключиться от сервера к клиенту через SSH, для этого меняем конфигурационный файл на Kali-LAN и запускаем ssh: ![](https://i.imgur.com/XYNPGki.png) Запускаем: ``` service ssh restart ``` Пробуем подключиться: ``` ssh root@10.1.2.100 ``` ![](https://i.imgur.com/I4BIeHr.png) Подключение успешно. Попытаемся разорвать ICMP тоннель, настроив **FW-1**: ![](https://i.imgur.com/phRHGCi.png) ``` Логин admin Пароль pfsense ``` Во вкладке **Firewall/Rules/DMZ** вводим новое правило, где разрешаем только ICMP: ![](https://i.imgur.com/aF1UHBW.png) Принимаем настройки: ![](https://i.imgur.com/k5a2bzL.png) Что изменилось? ping 8.8.8.8 проходит ![](https://i.imgur.com/AMu4l0y.png) А доступ в Интернет заблокирован ![](https://i.imgur.com/eRt54c1.png) Настроим **NAT** на **ICMP-SRV**: ``` iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o ens3 -j MASQUERADE ``` Раскоментируем строку, отвечающую за проброску пакетов в файле **/etc/sysctl.conf**: ``` net.ipv4.ip_forward=1 ``` Выходим с сохранением и проверяем командой: ``` sysctl -p ``` На этом настройки сервера завершены. Будем наблюдать за трафиком через WireShark ![](https://i.imgur.com/x7wAciC.png) #### Перенаправление всего трафика через ICMP Пока трассировка выглядит вот так: ![](https://i.imgur.com/A0yt3Yc.png) Прописываем маршруты: ``` ip route add 192.168.0.120/32 (IP ens3 у ICMP-SRV) via 192.168.100.254 ip route del default ip route add default via 10.1.2.1 ip route add 192.168.0.135/32 (IP WAN у FW-1) via 192.168.100.254 ``` ![](https://i.imgur.com/Rc32B5E.png) Разрешим DNS ``` nano /etc/resolv.conf ``` ![](https://i.imgur.com/ggj6URj.png) Пробуем загрузить страницу через браузер: ![](https://i.imgur.com/jaFAZ7p.png) #### DNS-туннелирование **1-ый способ (простой)**. Добавим в зону WAN **Win-DNS** ``` Image: winserver-2012 CPU - 2 RAM - 4096 MB QEMU Nic - e1000 ``` ![](https://i.imgur.com/ccBlvJR.png) Настроим домен контроллера на DC: ![](https://i.imgur.com/ci19VGl.png) Здесь **Prefered DNS Server** - это любой IP адрес в зоне WAN. Настроим также Win-DNS: ![](https://i.imgur.com/zT5yZI8.png) Создаем DNS-сервер: **Server Manager** --> **Manage** --> **Add Role and Features**. Нажимаем next, в Server Roles выбираем DNS и далее устанавливаем: ![](https://i.imgur.com/07jfu6e.png) ![](https://i.imgur.com/ftABQbL.png) Проверим настройки DNS: **Tools** --> **DNS Manager** ![](https://i.imgur.com/wjb7G5G.png) Во вкладке **Forwarders** добавим DNS-сервер: ![](https://i.imgur.com/EN1OVtS.png) И теперь перенастроим сетевые настройки так, чтобы DNS-server работал на себя же: ![](https://i.imgur.com/lJeDqQM.png) Видим, что все настройки верные, все работает: ![](https://i.imgur.com/4Wc30HO.png) Переходим к DC: ![](https://i.imgur.com/04na8Ya.png) Также устанавливаем DNS-server: ![](https://i.imgur.com/5IGUUiN.png) ![](https://i.imgur.com/h8h8eGd.png) (Здесь - указываем IP адрес Win-DNS) Но со стороны нашего **FW-1** запрещен трафик, поэтому настройки не удается довести до конца. Поэтому в **FW-1** в **Firewall/Rules/DMZ** активируем все правила ![](https://i.imgur.com/hBncqpe.png) И проверим ![](https://i.imgur.com/T8jnvVk.png) Пробуем ping: ![](https://i.imgur.com/YaFHBkF.png) Сейчас в настройках FW-1 уберем все разрешения и разрешим DNS запросы только от DC: **Firewall** --> **Rules** --> Add: ``` Interface: DMZ Address Family: Ipv4 Protocol: TCP/UDP Source: Single host or alias 192.168.100.1 Destination: any Destination Port Range: Form - DNS(53) To - DNS(53) Description: Allow from DMZ ``` ![](https://i.imgur.com/ffHmRJO.png) Вернемся к машине DC и проверим командой **nslookup**: ![](https://i.imgur.com/69of37N.png) #### 2-ой способ - посложнее Про DNS-туннелирование отдельно можно почитать [здесь](https://habr.com/ru/post/129097/) и [здесь](https://firstvds.ru/technology/%d0%9a%d0%b0%d0%ba_%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82_DNS?utm_source=firstwiki&from=firstwiki#:~:text=%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%D0%B5%D1%82%20%D0%B2%D0%B5%D0%B1%2D%D0%B1%D1%80%D0%B0%D1%83%D0%B7%D0%B5%D1%80,%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%BC%20%D0%BD%D0%B0%D1%85%D0%BE%D0%B4%D0%B8%D1%82%D1%81%D1%8F%20%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%20(1).&text=%D0%9A%D0%BE%D1%80%D0%BD%D0%B5%D0%B2%D0%BE%D0%B9%20DNS%2D%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%20%D0%B8%D1%89%D0%B5%D1%82%20%D0%B2,%D0%BD%D0%B0%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D1%85%20%D0%BF%D1%80%D0%B8%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D1%8D%D1%82%D0%BE%D1%82%20%D1%81%D0%B0%D0%B9%D1%82) Сбросим на Kali-LAN все настройки от ICMP, сбросив туннелирование через hans: ![](https://i.imgur.com/63PfG6y.png) Редактируем файл: ``` nano /etc/resolv.conf ``` ![](https://i.imgur.com/yanOE7S.png) Проверяем наличие пакета dig командой ``` dig ``` ![](https://i.imgur.com/OoIBVlb.png) Теперь проверим будет ли при этих правилах разрешен DNS 8.8.8.8 и наш DNS (192.168.100.1)? ![](https://i.imgur.com/f65KmFi.png) Настроим сервис и клиент DNS. Для этого переименуем ICMP-SRV в DNS-ICMP-SRV и запустим эту машину. Обновим и установим пакет для создания DNS туннеля: ``` apt update apt install iodine ``` Запустим сервер командой: ``` iodined -P <пароль> <ip> <название зоны> ``` ![](https://i.imgur.com/7bJBJmX.png) Теперь нужно сделать так, чтобы именно на этот сервер приходили запрос на **tun.kstu.hack**. Для этого на внешнем DNS сервере установим зону и назовем ее **tun.kstu.hack**. На машине Win-DNS настраиваем зону DNS: ![](https://i.imgur.com/aqnNtg8.png) Создаем зону ``` # primary zone # kstu.hack # kstu.hack.dns # Do not allow dynamic updates ``` ![](https://i.imgur.com/oPwA3OZ.png) Добавляем хост в созданной зоне: ![](https://i.imgur.com/wcfCVVu.png) Введем команду dig из Kali-Lan: ![](https://i.imgur.com/0tyDL08.png) Пробуем пропинговать изнутри сети – из Kali-LAN: ![](https://i.imgur.com/r9LBXIL.png) Команда ping не срабатывает, потому что в pfsense он запрещен. Добавим в Win-DNS новый хост с IP-адресом **DNS-ICMP-SRV** ![](https://i.imgur.com/jsTZ5xC.png) Делегирование домена: ![](https://i.imgur.com/4aAuaPF.png) ![](https://i.imgur.com/N8zUu6v.png) ![](https://i.imgur.com/Zjd9NDw.png) Посмотрим, как это работает изнутри командами ``` dig dns.kstu.hack ``` ![](https://i.imgur.com/5bbzLbY.png) ``` dig NS dns.kstu.hack ``` ![](https://i.imgur.com/ihuhS6I.png) (Указан другой скриншот с другим DNS - не обращайте внимания на название) ``` dig NS tun.kstu.hack ``` ![](https://i.imgur.com/KBUnQsL.png) Запускаем DNS-туннель на Kali-LAN ``` iodine -P 123456 tun.kstu.hack ``` Появился новый интерфейс: ![](https://i.imgur.com/SdbJGTe.png) Настраиваем NAT на **DNS-ICMP-SRV**: ``` iptables -t nat -A POSTROUTING -s 10.99.99.0/24 -o ens3 -j MASQUERADE ``` Настроим маршрутизацию на Kali-LAN ``` ip route add 192.168.0.102 via 192.168.100.254 dev eth0 ip route add default via 10.99.99.1 ``` Доступ к интернету появился: ![](https://i.imgur.com/hAqwobh.png) ### Задание для самостоятельной работы Воспроизведение стенда на своем стенде в EVE-NG. ### Условия сдачи лабораторной работы Работоспособный стенд с демонстрацией работы DNS-туннелирования. ### Контрольные вопросы 1. Что такое ICMP-туннель? 2. Что такое DNS? 3. Что такое зоны DNS? 4. По какому порту работает служба DNS? 5. Чем опасен проброс портов через ICMP? 6. Как осуществляется DNS-туннелирование? Опишите принцип установления такого туннеля с использованием материалов этого занятия. 7. Как в вышеописанной атаке взаимодействуют ICMP и DNS?