---
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 уровня (считается еще одним протоколом третьего уровня).

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

### DNS туннелирование
DNS-tunneling — техника, позволяющая передавать произвольный трафик (фактически, поднять туннель) поверх DNS-протокола. Может применяться, например, для того чтобы получить полноценный доступ к Интернет из точки, где разрешено преобразование DNS-имён.
Для организации DNS-туннеля необходимо чтобы снаружи (то есть, в точке, куда направлен туннель) его кто-то принимал. Точка приёма является сервером имён для какой-то зоны. Изнутри сети делаются запросы имён по этой зоне. Так передаётся трафик изнутри <—. В качестве результата преобразования возвращаются ответные данные. Так передаётся трафик внутрь —>.
DNS-туннелирование нельзя запретить простыми правилами брандмауэра, разрешив при этом остальной DNS-трафик. Это связано с тем, что трафик DNS-туннеля и легитимные DNS-запросы неразличимы. Обнаруживать DNS-туннелирование можно по интенсивности запросов (если трафик по туннелю велик), а также более сложными методами, используя системы обнаружения вторжений.
### Топология сети

### Характеристики добавляемого оборудования:
- 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 "пароль"
```

Проверяем сетевые настройки:
```
ip a
```

Запускаем на Kali LAN:
```
./hans -c 192.168.0.120 -p 123456
```

Проверяем сетевые настройки
```
ip a
```

По внутренним IP адресам можем пропинговать их друг с другом:
**ICMP-SRV**

**Kali-LAN**

Попробуем подключиться от сервера к клиенту через SSH, для этого меняем конфигурационный файл на Kali-LAN и запускаем ssh:

Запускаем:
```
service ssh restart
```
Пробуем подключиться:
```
ssh root@10.1.2.100
```

Подключение успешно.
Попытаемся разорвать ICMP тоннель, настроив **FW-1**:

```
Логин admin
Пароль pfsense
```
Во вкладке **Firewall/Rules/DMZ** вводим новое правило, где разрешаем только ICMP:

Принимаем настройки:

Что изменилось? ping 8.8.8.8 проходит

А доступ в Интернет заблокирован

Настроим **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

#### Перенаправление всего трафика через ICMP
Пока трассировка выглядит вот так:

Прописываем маршруты:
```
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
```

Разрешим DNS
```
nano /etc/resolv.conf
```

Пробуем загрузить страницу через браузер:

#### DNS-туннелирование
**1-ый способ (простой)**. Добавим в зону WAN **Win-DNS**
```
Image: winserver-2012
CPU - 2
RAM - 4096 MB
QEMU Nic - e1000
```

Настроим домен контроллера на DC:

Здесь **Prefered DNS Server** - это любой IP адрес в зоне WAN.
Настроим также Win-DNS:

Создаем DNS-сервер:
**Server Manager** --> **Manage** --> **Add Role and Features**.
Нажимаем next, в Server Roles выбираем DNS и далее устанавливаем:


Проверим настройки DNS: **Tools** --> **DNS Manager**

Во вкладке **Forwarders** добавим DNS-сервер:

И теперь перенастроим сетевые настройки так, чтобы DNS-server работал на себя же:

Видим, что все настройки верные, все работает:

Переходим к DC:

Также устанавливаем DNS-server:


(Здесь - указываем IP адрес Win-DNS)
Но со стороны нашего **FW-1** запрещен трафик, поэтому настройки не удается довести до конца. Поэтому в **FW-1** в **Firewall/Rules/DMZ** активируем все правила

И проверим

Пробуем ping:

Сейчас в настройках 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
```

Вернемся к машине DC и проверим командой **nslookup**:

#### 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:

Редактируем файл:
```
nano /etc/resolv.conf
```

Проверяем наличие пакета dig командой
```
dig
```

Теперь проверим будет ли при этих правилах разрешен DNS 8.8.8.8 и наш DNS (192.168.100.1)?

Настроим сервис и клиент DNS. Для этого переименуем ICMP-SRV в DNS-ICMP-SRV и запустим эту машину. Обновим и установим пакет для создания DNS туннеля:
```
apt update
apt install iodine
```
Запустим сервер командой:
```
iodined -P <пароль> <ip> <название зоны>
```

Теперь нужно сделать так, чтобы именно на этот сервер приходили запрос на **tun.kstu.hack**. Для этого на внешнем DNS сервере установим зону и назовем ее **tun.kstu.hack**.
На машине Win-DNS настраиваем зону DNS:

Создаем зону
```
# primary zone
# kstu.hack
# kstu.hack.dns
# Do not allow dynamic updates
```

Добавляем хост в созданной зоне:

Введем команду dig из Kali-Lan:

Пробуем пропинговать изнутри сети – из Kali-LAN:

Команда ping не срабатывает, потому что в pfsense он запрещен. Добавим в Win-DNS новый хост с IP-адресом **DNS-ICMP-SRV**

Делегирование домена:



Посмотрим, как это работает изнутри командами
```
dig dns.kstu.hack
```

```
dig NS dns.kstu.hack
```

(Указан другой скриншот с другим DNS - не обращайте внимания на название)
```
dig NS tun.kstu.hack
```

Запускаем DNS-туннель на Kali-LAN
```
iodine -P 123456 tun.kstu.hack
```
Появился новый интерфейс:

Настраиваем 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
```
Доступ к интернету появился:

### Задание для самостоятельной работы
Воспроизведение стенда на своем стенде в EVE-NG.
### Условия сдачи лабораторной работы
Работоспособный стенд с демонстрацией работы DNS-туннелирования.
### Контрольные вопросы
1. Что такое ICMP-туннель?
2. Что такое DNS?
3. Что такое зоны DNS?
4. По какому порту работает служба DNS?
5. Чем опасен проброс портов через ICMP?
6. Как осуществляется DNS-туннелирование? Опишите принцип установления такого туннеля с использованием материалов этого занятия.
7. Как в вышеописанной атаке взаимодействуют ICMP и DNS?