# Web Basic Модуль Занятие 4 ## WAF (Web Application Firewall) В этой работе создадим топологию, в которую включен веб сервер, WAF и атакующая машина. Настроим WAF для блокировки атак из OWASP TOP-10 и проверим работу некоторых атак. Топология ![](https://i.imgur.com/3y7njAf.png) ### Настройка сети Для начала понадобится настроить сеть на всех машинах. Kali-Linux и WAF (порт e0) будут получать IP-адрес по DHCP от внешнего адаптера, для Web-Server и WAF (порт e1) понадобится объявить статические адреса, а также сделать проброс трафика через WAF на сервер. Сначала установим адресацию для интерфейса Web-Server ![](https://i.imgur.com/UlhqSRO.png) И перезагрузим менеджер сетей ![](https://i.imgur.com/SjTj068.png) Далее настроим подключения на WAF (объявим IP-адрес для ens4 и попросим выдачи IP-адреса на ens3) ![](https://i.imgur.com/3x7CnUC.png) Включим ip-форвардинг для работы маршрутизации пакетов ![](https://i.imgur.com/pgzQUij.png) Также воспользуемся iptables и произведем проброс трафика ``` sudo iptables -t nat -a POSTROUTING -j MASQUERADE ``` ![](https://i.imgur.com/sYSgLFV.png) Проверим наличие сети на хостах ![](https://i.imgur.com/O6D7JdF.png) ![](https://i.imgur.com/yJkF0RV.png) ### Настройка Web-Server Для настройки сервера нам только понадобится установить web-приложение в контейнере Docker и включить его на 80 порт сервера. Для этого: Обновим пакеты системы ![](https://i.imgur.com/2UbXGk0.png) Установим модули для инсталляции Docker ``` sudo apt install apt-transport-https ca-certificates curl software-properties-common ``` ![](https://i.imgur.com/JiRKFBO.png) ![](https://i.imgur.com/o0I7F1C.png) Скачаем ключ для репозитория Docker ``` curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - ``` ![](https://i.imgur.com/THT9a47.png) Далее добавим репозиторий Docker в список репозиториев для обновления ``` sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable" ``` ![](https://i.imgur.com/RxTvsLR.png) После чего обновим менеджер пакетов ![](https://i.imgur.com/tNuVvvv.png) Теперь при проверке доступных версий с помощью `apt-cache policy docker-ce` будем получать ссылки на пакеты с официального репозитория ![](https://i.imgur.com/O8a9ECW.png) Тогда установим Docker ![](https://i.imgur.com/szuHb4V.png) Проверим, что после установки Docker запустился ![](https://i.imgur.com/VHV1wj2.png) Теперь скачаем web-приложение для сервера (ссылка: https://hub.docker.com/r/bkimminich/juice-shop, на веб-странице будет команда, которую нужно использовать для установки приложения) ![](https://i.imgur.com/iJLOBNT.png) После чего можно будет запустить приложение на 80 порту сервера и 3000 порту Docker, оно будет доступно в сети Web-сервера при обращении к IP-адресу сервера в браузере ![](https://i.imgur.com/27Jr9Xn.png) ### Настройка WAF Для WAF используется Ubuntu 20.04 ![](https://i.imgur.com/4CQeZxo.png) Обновим все пакеты ![](https://i.imgur.com/Nsf0JmD.png) Теперь проверим, что на сервере нет nginx ![](https://i.imgur.com/o5C3TLa.png) Теперь добавим репозиторий для nginx и обновим данные менджера пакетов ``` sudo add-apt-repository ppa:ondrej/nginx-stable -y && sudo apt update ``` ![](https://i.imgur.com/43Y0FS2.png) Теперь можно установить пакеты nginx ![](https://i.imgur.com/6wwrUHM.png) Теперь нам понадобится докачать исходные файлы nginx. Для этого раскоментируем ссылку на исходные файлы в список sources.list менеджера пакетов ![](https://i.imgur.com/nw1TZ79.png) После добавления обновим данные менеджера пакетов ![](https://i.imgur.com/YMbriV9.png) Теперь создадим папку, в котой будут находиться исходники nginx (этой папке потребуется изменить права на права пользователя) и переместимся в нее ![](https://i.imgur.com/iS2X9Qm.png) После скачаем пакет для создания пакетов и исходный код nginx ![](https://i.imgur.com/X0FalL2.png) Теперь проверим, что все версии совпадают (для этого нужно посмотреть на названия пакетов в папке и на версию установленного nginx) ![](https://i.imgur.com/g5dhhS8.png) Теперь установим Git ![](https://i.imgur.com/fXwX7Ds.png) После чего скопируем к себе исходные файлы для ModSecurity в папку рядом с папкой исходных кодов nginx ``` git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/ ``` ![](https://i.imgur.com/ALy9TmL.png) Теперь можем переместиться в эту папку и поставить еще пакеты, которые используются для сборки программы ``` 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 ``` ![](https://i.imgur.com/guPlJiV.png) ![](https://i.imgur.com/QJNhzks.png) Теперь используем git для создания собственных файлов сабмодулей и обновим данные из репозитория ModSecurity ![](https://i.imgur.com/63SmgRe.png) ![](https://i.imgur.com/naZpSe6.png) Создадим собственное окружение и сконфигурируем его ![](https://i.imgur.com/fONcjPk.png) ![](https://i.imgur.com/kO5aJzy.png) После чего запустим сборку файлов. Этот процесс может занять время, для ускорения работы можно поставить `-j <количество потоков обработки>` ![](https://i.imgur.com/PHixD8Q.png) После успешной сборки инсталлируем ModSecurity ![](https://i.imgur.com/rTGzV2U.png) Теперь нужно скачать коннектор nginx и Modprobe (также находися в GitHub) ``` sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/ ``` ![](https://i.imgur.com/lIyVGUP.png) Теперь перейдем в папку с исходными пакетами nginx ![](https://i.imgur.com/pFVV3Ec.png) Настроим зависимости, которые используем nginx и скачаем uuid-dev ![](https://i.imgur.com/wgIzoWm.png) Теперь сконфигурируем коннектор ``` sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx ``` ![](https://i.imgur.com/DOwdU28.png) Также соберем модули в папке ![](https://i.imgur.com/uFYdB5Q.png) Скопируем собранные модули к nginx ![](https://i.imgur.com/vfEJn5u.png) Теперь понадобится показать nginx собранный модуль. Для этого открываем конфигурационный файл nginx и добавляем строчку ![](https://i.imgur.com/RA6MGbB.png) ![](https://i.imgur.com/RyvE9Eu.png) Также потребуется включить ModSecurity и прописать путь к файлу с правилами файервола ![](https://i.imgur.com/NoM3faX.png) Теперь создадим папку для конфигов ModSecurity ![](https://i.imgur.com/LeGO9jd.png) Переместим туда собранный конфиг ![](https://i.imgur.com/7dAawtN.png) И открыть его на изменение ![](https://i.imgur.com/h4c6osW.png) И настроим правила для ModSecurity (в начале файла нужно изменить `SecRuleEngine` на On) ![](https://i.imgur.com/jBvqfMm.png) Также дальше в файле нужно найти строчку с правилами аудита. `SecAuditLogParts` нужно изменить на новое значение ![](https://i.imgur.com/mwWbbMv.png) Теперь нужно подключить ModSecurity к nginx. Для этого откроем конфигурационный файл для ModSecurity ![](https://i.imgur.com/oiScHlF.png) И пропишем туда ссылку на рекомендуемые конфигурации ![](https://i.imgur.com/0YjCwpY.png) Скопируем файл unicode.mapping ![](https://i.imgur.com/d5VcnsE.png) После чего можно проверить, что в конфигурациях nginx нет ошибок ![](https://i.imgur.com/fRVwnOv.png) Перезапустим nginx и проверим его состояние ![](https://i.imgur.com/G2fnFNH.png) Теперь потребуется скачать правила для ModSecurity ``` wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip ``` ![](https://i.imgur.com/cD7AEj5.png) Распаковать их из архива ![](https://i.imgur.com/lJVxI9w.png) Скопировать файл конфигурации правил ![](https://i.imgur.com/Vzs9ghe.png) А также прописать пути до файлов с правилами ![](https://i.imgur.com/uMRZxd9.png) ![](https://i.imgur.com/IjAJyAZ.png) Проверим правильность настроек nginx, перезапустим его и проверим состояние после перезапуска ![](https://i.imgur.com/dEuaIkD.png) Теперь остается открыть конфигурации сервера и прописать правило для пересылки обращений с WAF на Web-Server ![](https://i.imgur.com/WI4BYh9.png) ![](https://i.imgur.com/nsG77sh.png) После этого еще раз перезапустим nginx ![](https://i.imgur.com/vZ5Q2tB.png) Теперь можем зайти на Kali-Linux и проверить доступность веб-приложения с Web-Server через адрес WAF ![](https://i.imgur.com/HHdur5x.png) ### Осуществление атак на сервер Атака SQL-injection (перехватим запрос на авторизацию и изменим данные для входа в качетсве администратора) ![](https://i.imgur.com/14Gjvjb.png) Получим ошибку 403. Блокировка сработала ![](https://i.imgur.com/Opob2F9.png) Также информация о возникновении ошибки появилась в логах на сервере (/var/log/nginx/error.log) ![](https://i.imgur.com/CzxzkpP.png) Попробуем использовать команды внутри оставляемых сообщений для отзывов о товарах (также перехватим запрос и изменим данные в запросе с добавлением какой-то команды) ![](https://i.imgur.com/i2NtOJU.png) Также получим ошибку 403 о запрете доступа ![](https://i.imgur.com/ndw94xA.png) А информация о возникшей ошибке появилась в логах ![](https://i.imgur.com/6pUmAj2.png) И попробуем использовать атаку через подмену путей (к примеру, запрос на скачивание изображения, изменим путь в нем для доступа до /etc/passwd) ![](https://i.imgur.com/GlXsEPk.png) Также получена ошибка об отказе в доступе ![](https://i.imgur.com/q9mjcls.png) А информация о неправомерном доступе отобразилась в логах ![](https://i.imgur.com/iOxkCl5.png)