# Практическая работа №7 "Скрытое туннелирование ICMP, DNS"
Выполнил студент группы БСБО-04-20: Люцько С.А.
Проверил преподаватель: Садыков Ильдар Венерович
**Москва 2023г.**
---
## ICMP-туннелирование
**Построим следующую топологию:**

**Начнём с Kali-2022.**
Подключимся к Kali-2022 по SSH:
```
ssh user@192.168.10.129
```

Создадим папку icmp и перейдём в неё:
```
mkdir icmp
cd icmp
```

Клонируем в неё friedrich/hans c GitHub:
```
git clone https://github.com/friedrich/hans
```

Компилируем файл:
```
make
```

Запустим сервер Hans:
```
sudo ./hans -s 10.1.2.0 -p eve@123
```

Видим, что появился виртуальный интерфейс tun0:

**Перейдём к Linux-Debian.**
Установим Git:
```
apt update -y && apt install git -y
```
Клонируем friedrich/hans c GitHub:
```
git clone https://github.com/friedrich/hans
```

Компилируем файл:
```
cd hans/
apt install make net-tools g++ -y
make
```

Запускаем hans с сслыкой по IP-адресу на внешний сервер (Kali-2022):
```
./hans -c 192.168.10.129 -p eve@123
```

Появился виртуальный интерфейс tun0 с IP-адресом 10.1.2.100:

C Kali-2022 этот адрес пингуется:

Также можно подключиться по SSH:

**Анализ ICMP-трафика.**
Пингуя внешние ресурсы, например, 8.8.8.8, на LAN интерфейсе pfSense мы увидим пакеты следующего вида:

В то время как ICMP-трафик туннеля в результате работы ICMP-инкапсулирования выглядит так:

---
## Простое DNS-туннелирование
**Начнём с Kali-2022.**
Запустим сервер iodined:
```
sudo iodined -P eve@123 10.99.99.1/24 -c i.example.com
```
Появился виртуальный интерфейс dns0:

**Перейдём к Linux-Debian.**
Установим iodine:
```
sudo apt install iodine
```

Изменим DNS-записи:
```
nano /etc/resolv.conf
```
Установим следующие параметры:

Теперь же запустим iodine-клиент с подключением по домену:
```
iodine -P eve@123 i.example.com
```

Появился виртуальный интерфейс dns0 c IP-адресом 10.99.99.2/24:

C Kali-2022 этот адрес пингуется:

Также можно подключиться по SSH:

**Анализ DNS-трафика.**
Нормальный трафик:

Туннельный трафик, операции не распознаны:

Данный способ имеет минус, меняя DNS-сервер, мы теряем доступ к внутренним DNS-серверам инфраструктуры.
---
## Сложное DNS-туннелирование
Дополним топологию следующим образом:

**Начнём с DNS-server-external.**
Установим статический IP-адрес:
*ПКМ по интернет подключению -> Open Network and Internet settings -> Network and Sharing Center -> Ethernet -> Properties -> Internet Protocol Version 4 (TCP/IPv4) -> Properties*
Устанавливаем следующие параметры:

Сменим название хоста. Открываем Server Manager:
*Local Server -> {Computer name} -> Change*
Устанавливаем следующие параметры:

Установим верный часовой пояс:
*Local Server -> {Time zone} -> Change time zone...*
Устанавливаемм следующие параметры:

Перезагружаем устройство DNS-server-external.
После перезагрузки открываем Server Manager:
*Manage -> Add Roles and Features*
* Первые три окошка прокликиваем *'Next >'*
* В четвёртом окошке выбираем *'DNS-Server'*, во всплывшем жмём *'Add Features'*, в следующем - *'Continue'*
* Снова трижды прокликиваем *'Next >'*
* Жмём *'Install'*
После завершения установки идём в Server Manager:
*Tools -> DNS -> ПКМ по названию хоста -> Properties -> Forwardes -> Edit*
Добавляем DNS Яндекса (77.88.8.8):

**Переходим к DNS-server-internal.**
Установим статический IP-адрес:
*ПКМ по интернет подключению -> Open Network and Internet settings -> Network and Sharing Center -> Ethernet -> Properties -> Internet Protocol Version 4 (TCP/IPv4) -> Properties*
Устанавливаем следующие параметры:

Сменим название хоста. Открываем Server Manager:
*Local Server -> {Computer name} -> Change*
Устанавливаем следующие параметры:

Установим верный часовой пояс:
*Local Server -> {Time zone} -> Change time zone...*
Устанавливаемм следующие параметры:

Перезагружаем устройство DNS-server-internal.
После перезагрузки открываем Server Manager:
*Manage -> Add Roles and Features*
* Первые три окошка прокликиваем *'Next >'*
* В четвёртом окошке выбираем *'DNS-Server'*, во всплывшем жмём *'Add Features'*, в следующем - *'Continue'*
* Снова трижды прокликиваем *'Next >'*
* Жмём *'Install'*
После завершения установки идём в Server Manager:
*Tools -> DNS -> ПКМ по названию хоста -> Properties -> Edit*
Добавляем DNS-External (192.168.10.201):

Установим локальный адрес как предпочитительный для DNS, чтобы форвардиться до DNS-External:
*ПКМ по интернет подключению -> Open Network and Internet settings -> Network and Sharing Center -> Ethernet -> Properties -> Internet Protocol Version 4 (TCP/IPv4) -> Properties*
Устанавливаем следующие параметры:

Проверяем работу DNS-сервера:

Всё работает!
**Переходим к Kali-2022-1.**
Укажем DNS-Internal в качестве DNS-сервера:
```
sudo -i
nano /etc/resolv.conf
```
Устанавливаем следующие параметры:

Попробуем сделать DNS-запрос:
```
dig ok.ru
```

Успешно! Ответ получен, а значит, DNS работает.
C 8.8.8.8 также получаем ответ:

**Настроим pfSense на блокировку всех DNS, кроме нашего DNS-сервера**
В настройках фаервола:
*'Firewall' -> 'Rules' -> 'Add^'*
Добавляем следующее правило:



Отключаем правила на выход в Интернет:

Теперь пробуем получить ответ от 8.8.8.8:

Не выходит.
Однако если попробовать обратиться к DNS-серверу по умолчанию (DNS-Internal):

Мы получаем ответ!
**Проверим IP-адрес Kali-2022-2.**

IP-адрес Kali-2022-2: *192.168.10.129*
**Переходим к DNS-server-external.**
После завершения установки идём в Server Manager:
*Tools -> DNS -> ПКМ по названию хоста -> New zone...*
* Первые три окошка прокликиваем *'Next >'*
* В четвёртом указываем зону "mirea.tech"

* Далее трижды проклтикиваем *'Next >'*
* Жмём *'Finish'*
В списке появилась необходимая зона:

Далее ПКМ по пустой области справа:
*New Host (A or AAAA)...*
Добавляем следующий хост (DNS-External):

Аналогичным образом добавляем delegate хост (Kali-2022-2):

Теперь вновь ПКМ по пустой области справа:
*New Delegation...*
* Прокликиваем *'Next'*
* Устанавливаем следующие параметры во втором окошке:

* В третьем жмём *'Add'*
* Добавляем следующую запись:

* Прокликиваем *'Next'* и *'Finish'*
**Переходим к Kali-2022-1.**
Попробуем пропинговать mirea.tech:

IP-адрес определяется!
Попробуем при помощи утилиты dig раскопать доменную запись с tunnel.mirea.tech:
```
dig NS tunnel.mirea.tech
```

Успех!
**Переходим к Kali-2022-2.**
Поднимем кастомный DNS-сервер:
```
sudo -i
iodined -P eve@123 10.99.99.1/24 -c tunnel.mirea.tech
```

Появился виртуальный интерфейс dns0:

**Вернёмся к Kali-2022-1.**
Поднимем клиент:
```
iodine -P eve@123 tunnel.mirea.tech
```

Туннель установлен! Появился виртуальный интерфейс dns0 со своим IP-адресом:

Теперь внешняя машинка на другом конце туннеля пингуется:

**Вернёмся к Kali-2022-2.**
Настроим выход "наружу" в Интернет:
```
nano /etc/sysctl.conf
```
Раскомментируем следующий параметр, чтобы разрешить маршрутищировать трафик:

```
sysctl -p
```

Пропишем NAT для выхода с eth0 наружу, предварительно очистив все существовавшие ранее правила:
```
iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

**Вернёмся к Kali-2022-1.**
Заменим маршрут по умолчанию:
```
ip route delete default
ip route add default via 10.99.99.1
```

Пробуем пропинговать восьмёрки:

Успех! Мы вышли из инфраструктуры наружу.
Мы можем даже выйти в интернет и замерить скорость соединения:

Она же оставляет желать лучшего...