# Практика №7. Скрытое туннелирование ICMP, DNS
## Инфраструктура
- Kali-2022 - Linux Kali 2022 (2CPU, 2GB RAM)
- Kali-2-2022 - Linux Kali 2022 (2CPU, 2GB RAM)
- FW-pfsense - PfSense Firewall 2.5.2, default config (Qemu version 4.1.0, 2CPU, 2GB RAM)
- Switch - Cisco IOL-L2 (2 port-groups)
- Debian-RPi4 - Linux Debian 10 (1CPU, 1GB RAM)
- Debian(OClient) - Linux Debian 10 (1CPU, 1GB RAM)
- Win-10 - Windows 10 (full) (2CPU, 2GB RAM)
- Win-7 - Windows 7 (full) (QEMU 2.12, 4CPU, 4GB RAM)

## IP конфигурация устройств
pfSense

Kali22

Kali22-2

Debian(OClient)

## ICMP туннелирование
### **Kali22:**
Для начала создадим папку icmp в которую скачаем проект hans для упакования IP пакетов во внутрь ICMP:
```
mkdir icmp
cd icmp
git clone https://github.com/friedrich/hans
make
```

Далее устанавливаем утилиту для проекта hans, так как на новых новых Linux используется другая утилита:
```
sudo apt update
sudo apt install net-tools
```

Запускаем сервер от имени администратора:
`sudo ./hans -s 10.1.2.0 -p 123456`

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

### **Debian(OClient):**
Так же как и на Kali22 устанавливаем hans.
После установки запускаем hans только с флагом -c и указываем адрес нашего сервера(Kali22):
`./hans -c 172.68.25.137 -p 123456`


Как видно, виртуальный интерфейс tun0 получил IP 10.1.2.100
### **Kali22:**
Проверим наше соединение пропинговав IP виртуального интерфейса на Debian:
`ping 10.1.2.100`

Теперь подключимся к Debian по SSH:
`ssh root@10.1.2.100`

Теперь можно просмотреть трафик icmp пакетов на e1 интерфейсе у pfSense и увидеть разницу между hans трафиком и обычным(при пинге с Debian)


## Простое DNS-Туннелирование
### **Kali22:**
**iodine** - Это программа, позволяющая туннелировать данные IPv4 через DNS-сервер. Это можно использовать в различных ситуациях, когда доступ в Интернет защищен брандмауэром, но разрешены DNS-запросы.
Для начала установим утилиту iodine:
`sudo apt install iodine`

### **Debian(OClient):**
Также устанавливаем iodine:

### **Kali22:**
Запускаем наш DNS сервер:
`iodined -P 123456 10.99.99.1/24 -c i.example.com`

У нас создается интерфейс который слушает трафик:

### **Debian(OClient)**:
Сначала изменим конфигурацию DNS маршрутизации и укажем DNS сервер(IP Kali22):
`nano /etc/resolv.conf`

После подмены DNS сервера запускаем iodine:
```
iodine -P 123456 i.example.com
```

Видим, что создался интерфейс dns0(10.99.99.2):

Теперь мы можем пропинговать этот интерфейс с Kali22 и подключиться к Debian(OClient) по SSH:


С помощью Wireshark можно увидеть фейковые DNS запросы(Melformed Packet):

Если пропинговать 8.8.8.8 через SSH подключение, пакеты немного видоизменятся:

## Сложное DNS-Туннелирование
Для начала видоизменим нашу инфраструктуру добавив 2 Windows Server:

### **DNS-Server-Internal**
Для начала настроим статический IP:

Устанавливаем DNS:

Добавляем адрес DNS-Server-External для того чтобы сервер перенапрявлял туда запросы.

Теперь сделаем так, чтобы сервер запрашивал DNS сам у себя:

Убедимся что нас сервер работает, и умеет пинговать неизвестные ему DNS имена:

### **DNS-Server-External**
Так же устанавливаем DNS и ставим перенаправление запросов DNS на yandex:


### **DNS-Server-Internal**
После чего можно проверить, отрабатывают ли наши DNS запросы на DNS-Server-Internal:

Все работает.
**Теперь необходимо запретить на фаерволе все, кроме DNS запросов с нашего DNS-Server-Internal**
### **Kali22-2**
Поменяем адрес DNS сервера по умолчанию на наш адрес DNS-Server-Internal:
`nano /etc/resolv.conf`

Проверим что все работает:
`dig ok.ru`

Теперь зайдем на наш фаервол и создадим правило, чтобы он принимал только DNS трафик с хоста 192.168.1.200(DNS-Server-Internal):

Так же отключим выход в интернет:

Как видим выхода в интернет нет:

Но через нас дефолтный сервер мы получим ответ:

### **DNS-Server-External**
Теперь создадим зону, которую булет обслуживать наш сервер, и сделаем так, чтобы он делегировал DNS запросы на нашу внешнюю Kali22.

Добавим запись, которая делает так, что при обращении к mirea.tech, запрос будет идти именно на наш сервер:

Также добавим запись, которая будет делегировать запросы на наш внешний Kali22:

Добавляем делегирование на наш Kali22:

Теперь проверим как это работает, зайдя на внутренний Kali22-2 и запросив NS запись у домена tunnel.mirea.tech:

Как видно, запрашивая DNS запись у tunnel.mirea.tech, запрос сначала идет на внутренний DNS-Server-Internal, после чего на DNS-Server-External который делегирует запрос на наш внешний Kali22(172.68.25.141).
Далее необходимо сделать на внешнем Kali22 кастомный DNS сервер.
### **Kali22**
С помощью утилиты iodine(iodined серверная часть) запустим DNS сервер обслуживающий зону tunnel.mirea.tech:
```
iodined -P 12345 10.99.99.1/24 -c tunnel.mirea.tech
```

### **Kali22-2**
На внутреннем Kali запустим клиент iodine подключаясь на нашему tunnel.mirea.tech:
```
iodine -P 12345 tunnel.mirea.tech
```

После создания тоннеля можем убелиться что он работает, и мы можем выходить наружу(пропингуем внешний адрес фейк DNS сервера на Kali22):

### **Kali22**
Включим маршрутизацию трафика(раскомментируем строчку):
`nano /etc/sysctl.conf`

Удаляем правила перенаправления NAT:
iptables -t nat -F

Перенаправляем трафик на eth0:
`iptables -t nat -A POSTROUTING -0 eth0 -j MASQUERADE`

### **Kali22-2**
Изменим дефолтный маршрут на внутреннем Kali22-2:
```
ip route delete default
ip route add default via 10.99.99.1
```

Теперь мы можем выходить в сеть через внутреннюю Kali22-2:

Можем открыть яндекс в браузере:

Можно посмотреть какой трафик фиксирует Wireshark через Debian:
