# Web Basic Модуль Занятие 4
## WAF (Web Application Firewall)
В этой работе создадим топологию, в которую включен веб сервер, WAF и атакующая машина. Настроим WAF для блокировки атак из OWASP TOP-10 и проверим работу некоторых атак.
Топология

### Настройка сети
Для начала понадобится настроить сеть на всех машинах.
Kali-Linux и WAF (порт e0) будут получать IP-адрес по DHCP от внешнего адаптера, для Web-Server и WAF (порт e1) понадобится объявить статические адреса, а также сделать проброс трафика через WAF на сервер.
Сначала установим адресацию для интерфейса Web-Server

И перезагрузим менеджер сетей

Далее настроим подключения на WAF (объявим IP-адрес для ens4 и попросим выдачи IP-адреса на ens3)

Включим ip-форвардинг для работы маршрутизации пакетов

Также воспользуемся iptables и произведем проброс трафика
```
sudo iptables -t nat -a POSTROUTING -j MASQUERADE
```

Проверим наличие сети на хостах


### Настройка Web-Server
Для настройки сервера нам только понадобится установить web-приложение в контейнере Docker и включить его на 80 порт сервера. Для этого:
Обновим пакеты системы

Установим модули для инсталляции Docker
```
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```


Скачаем ключ для репозитория Docker
```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

Далее добавим репозиторий Docker в список репозиториев для обновления
```
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```

После чего обновим менеджер пакетов

Теперь при проверке доступных версий с помощью `apt-cache policy docker-ce` будем получать ссылки на пакеты с официального репозитория

Тогда установим Docker

Проверим, что после установки Docker запустился

Теперь скачаем web-приложение для сервера (ссылка: https://hub.docker.com/r/bkimminich/juice-shop, на веб-странице будет команда, которую нужно использовать для установки приложения)

После чего можно будет запустить приложение на 80 порту сервера и 3000 порту Docker, оно будет доступно в сети Web-сервера при обращении к IP-адресу сервера в браузере

### Настройка WAF
Для WAF используется Ubuntu 20.04

Обновим все пакеты

Теперь проверим, что на сервере нет nginx

Теперь добавим репозиторий для nginx и обновим данные менджера пакетов
```
sudo add-apt-repository ppa:ondrej/nginx-stable -y && sudo apt update
```

Теперь можно установить пакеты nginx

Теперь нам понадобится докачать исходные файлы nginx. Для этого раскоментируем ссылку на исходные файлы в список sources.list менеджера пакетов

После добавления обновим данные менеджера пакетов

Теперь создадим папку, в котой будут находиться исходники nginx (этой папке потребуется изменить права на права пользователя) и переместимся в нее

После скачаем пакет для создания пакетов и исходный код nginx

Теперь проверим, что все версии совпадают (для этого нужно посмотреть на названия пакетов в папке и на версию установленного nginx)

Теперь установим Git

После чего скопируем к себе исходные файлы для ModSecurity в папку рядом с папкой исходных кодов nginx
```
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/
```

Теперь можем переместиться в эту папку и поставить еще пакеты, которые используются для сборки программы
```
sudo apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libpcre3 libpcre3-dev libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen -y
```


Теперь используем git для создания собственных файлов сабмодулей и обновим данные из репозитория ModSecurity


Создадим собственное окружение и сконфигурируем его


После чего запустим сборку файлов. Этот процесс может занять время, для ускорения работы можно поставить `-j <количество потоков обработки>`

После успешной сборки инсталлируем ModSecurity

Теперь нужно скачать коннектор nginx и Modprobe (также находися в GitHub)
```
sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
```

Теперь перейдем в папку с исходными пакетами nginx

Настроим зависимости, которые используем nginx и скачаем uuid-dev

Теперь сконфигурируем коннектор
```
sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
```

Также соберем модули в папке

Скопируем собранные модули к nginx

Теперь понадобится показать nginx собранный модуль. Для этого открываем конфигурационный файл nginx и добавляем строчку


Также потребуется включить ModSecurity и прописать путь к файлу с правилами файервола

Теперь создадим папку для конфигов ModSecurity

Переместим туда собранный конфиг

И открыть его на изменение

И настроим правила для ModSecurity (в начале файла нужно изменить `SecRuleEngine` на On)

Также дальше в файле нужно найти строчку с правилами аудита. `SecAuditLogParts` нужно изменить на новое значение

Теперь нужно подключить ModSecurity к nginx. Для этого откроем конфигурационный файл для ModSecurity

И пропишем туда ссылку на рекомендуемые конфигурации

Скопируем файл unicode.mapping

После чего можно проверить, что в конфигурациях nginx нет ошибок

Перезапустим nginx и проверим его состояние

Теперь потребуется скачать правила для ModSecurity
```
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip
```

Распаковать их из архива

Скопировать файл конфигурации правил

А также прописать пути до файлов с правилами


Проверим правильность настроек nginx, перезапустим его и проверим состояние после перезапуска

Теперь остается открыть конфигурации сервера и прописать правило для пересылки обращений с WAF на Web-Server


После этого еще раз перезапустим nginx

Теперь можем зайти на Kali-Linux и проверить доступность веб-приложения с Web-Server через адрес WAF

### Осуществление атак на сервер
Атака SQL-injection (перехватим запрос на авторизацию и изменим данные для входа в качетсве администратора)

Получим ошибку 403. Блокировка сработала

Также информация о возникновении ошибки появилась в логах на сервере (/var/log/nginx/error.log)

Попробуем использовать команды внутри оставляемых сообщений для отзывов о товарах (также перехватим запрос и изменим данные в запросе с добавлением какой-то команды)

Также получим ошибку 403 о запрете доступа

А информация о возникшей ошибке появилась в логах

И попробуем использовать атаку через подмену путей (к примеру, запрос на скачивание изображения, изменим путь в нем для доступа до /etc/passwd)

Также получена ошибка об отказе в доступе

А информация о неправомерном доступе отобразилась в логах
