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