# Макаров Дмитрий Владиславович - WEB basic. Web Application Firewall [toc] ## 1. Настройка инфраструктуры и установка nginx ### Сетевые конфигурации После установки nginx был настроен конфигурационный файл. **Машинка с WAF** настроена как прокси для **web server**. В файл добавлены следующие строки: ``` proxy_pass http://192.168.116.143:3000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; ``` --- ![](https://i.imgur.com/MdvJHnx.png) --- Сетевая конфигурация **WAF машины** --- ![](https://i.imgur.com/Z11P7fH.png) --- Сетевая конфигурация **web server** --- ![](https://i.imgur.com/yFYHWkc.png) --- ### Установка последней версии nginx Проведём обновления в операционной системе **WAF** `sudo apt update && sudo apt upgrade -y` --- ![](https://i.imgur.com/x3fGn4P.png) --- Добавим репозиторий с **MAINLINE** версией **nginx** и обновим индексы репозиториев `sudo add-apt-repository ppa:ondrej/nginx-mainline -y && sudo apt update` --- ![](https://i.imgur.com/rXTP4al.png) --- Проведём установку **nginx** `sudo apt install nginx-core nginx-common nginx nginx-full` --- ![](https://i.imgur.com/Ar3HeN8.png) --- #### Добавление исходного кода nginx в репозиторий По умолчанию исходный код не устанавливается при установке **PPA**. Нам нужно вручную включить это, чтобы загрузить исходный код **Nginx** для компиляции **Modsecurity** позже. Сначала откроем файл конфигурации в `/etc/apt/sources.list.d` с помощью nano, как показано ниже: `sudo nano /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list` --- ![](https://i.imgur.com/Vb4lA4s.png) --- Далее раскомментируем вторую строчку --- ![](https://i.imgur.com/Tp6Jxrt.png) --- Затем обновляем репозитории --- ![](https://i.imgur.com/syEr1V6.png) --- #### Загрузка Nginx Source Нам потребуется загрузить исходный код **Nginx**, чтобы скомпилировать **динамический модуль ModSecurity**. Для этого вам потребуется скачать исходный пакет и сохранить его в каталоге `/etc/local/src/nginx`. Создим местоположение следующим образом: `sudo mkdir /usr/local/src/nginx && cd /usr/local/src/nginx` --- ![](https://i.imgur.com/CUqysOB.png) --- Назначим разрешения для каталога `sudo chown username:username /usr/local/src/ -R` --- ![](https://i.imgur.com/CJe0Zun.png) --- Загрузим исходный пакет `sudo apt install dpkg-dev -y && sudo apt source nginx` --- ![](https://i.imgur.com/ywsTJtj.png) --- Ошибку в конце загрузки можно проигнорировать. Убеждимся, что файлы скачались. Для этого вводим команду `ls` --- ![](https://i.imgur.com/t3WMWEK.png) --- Затем проверяем версию приложения `nginx -v` --- ![](https://i.imgur.com/x7tFIYr.png) --- ## 2. Установка WAF (ModSecurity 3) ### Установка libmodsecurity3 для ModSecurity Пакет **libmodsecurity3** – это фактическая часть WAF, выполняющая **HTTP-фильтрацию** для ваших веб-приложений. В **Ubuntu 20.04** мы можем установить его из репозитория **Ubuntu 20.04** по умолчанию. Однако это не рекомендуется, как и в большинстве **LTS-версий**, и часто отстает. Вместо этого мы будем компилировать его из гораздо более современного источника следующим образом. Сперва клонируем с **Github**, так как у нас не установлен **git**, нам нужно будет выполнить следующую команду: `sudo apt install git -y` --- ![](https://i.imgur.com/vU3W0A2.png) --- Затем клонируем **GIT**-репозиторий **libmodsecurity3** следующим образом: `sudo git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/` --- ![](https://i.imgur.com/BFHqSj5.png) --- Теперь идём в следующую директорию `cd /usr/local/src/ModSecurity/` --- ![](https://i.imgur.com/mMh0KMm.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/vV94m8P.png) --- Теперь, чтобы закончить, установим следующие подмодули **GIT** следующим образом: `git submodule init` --- ![](https://i.imgur.com/E1V87u0.png) --- Затем обновим подмодули: `git submodule update` --- ![](https://i.imgur.com/gnJMiP6.png) --- ### Создание среды ModSecurity Следующим шагом теперь является создание среды. Используем следующую команду: `./build.sh` --- ![](https://i.imgur.com/X9tKZem.png) --- Затем запустим команду конфигурации: `./configure` --- ![](https://i.imgur.com/og9B8eE.png) --- Теперь, когда мы создали и настроили среду для **libmodsecurity3**, пришло время скомпилировать ее с помощью команды *make*. `make` --- ![](https://i.imgur.com/sXjfayL.png) --- После компиляции исходного кода запустим команду установки в своем терминале: `sudo make install` --- ![](https://i.imgur.com/Sx0cx7Y.png) --- ### Установка ModSecurity-nginx Connector Установим **ModSecurity-nginx Connector**. Это точка соединения между **nginx** и **libmodsecurity.** Это компонент, который взаимодействует между Nginx и ModSecurity **(libmodsecurity3)**. Как и в предыдущем шаге по клонированию репозитория **libmodsecurity3**, нам потребуется снова клонировать репозиторий коннектора с помощью следующей команды: `sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/` --- ![](https://i.imgur.com/0Xpm69Q.png) --- Затем переместися в исходный каталог **nginx** следующим образом: `cd /usr/local/src/nginx/nginx-1.23.1` --- ![](https://i.imgur.com/cXCbE9l.png) --- Теперь запустим команду в терминале Ubuntu, чтобы установить необходимые зависимости: `sudo apt build-dep nginx && sudo apt install uuid-dev -y` --- ![](https://i.imgur.com/wovEtCH.png) --- Далее мы скомпилируем модуль **ModSecurity-nginx Connector** только с флагом **--with-compat** следующим образом: `sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx` --- ![](https://i.imgur.com/Jf7V8oB.png) --- Теперь создадим динамические модули с помощью следующей команды: `sudo make modules` --- ![](https://i.imgur.com/O114HXe.png) --- Затем, находясь в исходном каталоге Nginx, используем следующую команду, чтобы переместить только что созданный динамический модуль, сохраненный в папке `objs/ngx_http_modsecurity_module.so`, и скопировать его в каталог `/usr/share/nginx/modules`. `sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/` --- ![](https://i.imgur.com/Iz2WsES.png) --- ### Загружаем и настраиваем ModSecurity-nginx Connector с помощью Nginx Теперь, когда мы скомпилировали динамический модуль и разместили его соответствующим образом, нам нужно отредактировать файл конфигурации `/etc/nginx/nginx.conf`, чтобы заставить **ModSecurity** работать с нашим веб-сервером **nginx**. Во-первых, нам нужно указать **load_module** и путь к нашему модулю безопасности. Откроем **nginx.conf** в nano: `sudo nano /etc/nginx/nginx.conf` --- ![](https://i.imgur.com/EkREhTl.png) --- Затем добавим следующую строку в файл вверху: `load_module modules/ngx_http_modsecurity_module.so;` --- ![](https://i.imgur.com/VXREXUA.png) --- Теперь добавим следующий код в раздел **HTTP {}** следующим образом: `modsecurity on; modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;` --- ![](https://i.imgur.com/m9YRCYQ.png) --- Нам нужно будет создать каталог для хранения файлов конфигурации и будущих правил, **OWASP CRS** для руководства. Используйте следующую команду, чтобы создать каталог `/etc/nginx/modsec` следующим образом: `sudo mkdir /etc/nginx/modsec/` Теперь нам нужно скопировать образец файла конфигурации **ModSecurity** обратно из нашего клонированного каталога **GIT**: `sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf` --- ![](https://i.imgur.com/VSv1U3U.png) --- Используя **nano** в **Ubuntu**, откроем файл `modsecurity.conf` следующим образом: `sudo nano /etc/nginx/modsec/modsecurity.conf` По умолчанию в конфигурации ModSecurity механизм правил указан как **(DetectionOnly)**, который, другими словами, запускает ModSecurity и обнаруживает все вредоносные действия, но не блокирует и не блокирует и не регистрирует все отмеченные им **HTTP-транзакции**. Это следует использовать только в том случае, если у нас много ложных срабатываний или мы увеличили настройки уровня безопасности до экстремального уровня и проверяете, не возникают ли какие-либо ложные срабатывания. Чтобы изменить это поведение на **(включено)**, найдём следующее: `SecRuleEngine DetectionOnly` Изменим строку на эту, чтобы включить ModSecurity: `SecRuleEngine On` --- ![](https://i.imgur.com/vY1tEMz.png) --- Теперь нам нужно найти следующее: ``` # Log everything we know about a transaction. SecAuditLogParts ABIJDEFHZ ``` Это неправильно, и это нужно изменить. Изменим строку на следующее: `SecAuditLogParts ABCEFHJKZ` --- ![](https://i.imgur.com/EJDknue.png) --- Сохраняем файл. Следующая часть — создать следующий файл **modsec-config.conf**. Используем следующую команду, чтобы создать файл и открыть его: `sudo nano /etc/nginx/modsec/modsec-config.conf` Оказавшись внутри файла, добавим следующую строку: `Include /etc/nginx/modsec/modsecurity.conf` --- ![](https://i.imgur.com/hhKJTRu.png) --- Наконец, скопируем файл ModSecurity **unicode.mapping** следующим образом: `sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/` --- ![](https://i.imgur.com/DMRP7vG.png) --- Теперь, прежде чем двигаться дальше, мы должны протестировать службу **Nginx** с помощью следующей команды терминала: `sudo nginx -t` Така как мы всё настроили правильно, мы получили следующий вывод: ``` nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful ``` Чтобы изменения вступили в силу, перезапустите службу **Nginx** с помощью команды **systemctl**: `sudo systemctl restart nginx` --- ![](https://i.imgur.com/qXSmmjA.png) --- ## 3. Настройка WAF c детектом OWASP top 10 **ModSecurity** сам по себе не защищает наш веб-сервер, и нам нужны правила. Одним из самых известных, уважаемых и хорошо известных набром правил является **OWASP CRS**. Эти правила наиболее широко используются среди веб-серверов и других **WAF**, и большинство других подобных систем основывают большинство своих правил на этой **CRS**. Установка этого набора правил автоматически предоставит нам отличный источник защиты от большинства новых угроз в Интернете, обнаруживая злоумышленников и блокируя их. Используя **команду wget**, загрузим архив **OWASP CRS 3.3.2** следующим образом: `wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip` --- ![](https://i.imgur.com/7AZwtuO.png) --- Проверим, установлен ли у нас пакет Unzip. `sudo dnf install unzip -y` --- ![](https://i.imgur.com/KNzjVDj.png) --- Теперь разархивируем архив **master.zip** следующим образом: `sudo unzip v3.3.2.zip -d /etc/nginx/modsec` --- ![](https://i.imgur.com/h8sqOVH.png) --- Как и прежде с конфигурацией ***modsecurity.conf***, **OWASP CRS** поставляется с образцом файла конфигурации, который необходимо переименовать. Лучше всего использовать **команду cp** и сохранить резервную копию. `sudo cp /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf` --- ![](https://i.imgur.com/V9SVelH.png) --- Чтобы включить правила, снова откроем `/etc/nginx/modsec/modsec-config.conf` в **nano**: `sudo nano /etc/nginx/modsec/modsec-config.conf` Добавим следующие две дополнительные строки: ``` Include /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf Include /etc/nginx/modsec/coreruleset-3.3.2/rules/*.conf ``` --- ![](https://i.imgur.com/V4N9TRs.png) --- Сохраним файл. Как и прежде, протестируем любые новые дополнения к вашему сервису **Nginx**, прежде чем запускать его: `sudo nginx -t` Убеждаемся, что всё в порядке и перезапускаем службу Nginx, чтобы изменения вступили в силу: `sudo systemctl restart nginx` --- ![](https://i.imgur.com/HF5AltH.png) --- **OWASP CRS** имеет довольно много опций, настройки по умолчанию, тем не менее, из коробки сразу защитят большинство серверов, ==не навредив== нашим реальным посетителям и хорошим **SEO-ботам**. Откроем файл **CRS-setup.conf** следующим образом: `sudo nano /etc/nginx/modsec/coreruset-3.4-dev/crs-setup.conf` Отсюда мы можем изменить большинство настроек OWASP CRS. --- ![](https://i.imgur.com/68ndct6.png) --- ![](https://i.imgur.com/kQJjhe0.png) --- ## 4. Три атаки из списка OWASP top 10 ### SQL Injection Пробуем обойти вход системы, как делали это в предыдущей практике. В окно логина пишем следующее `administrator'--` Пароль не имеет значения. Правила срабатывают --- ![](https://i.imgur.com/B2e0S1N.png) --- Проверяем логи --- ![](https://i.imgur.com/v0x129V.png) --- ### XSS В следущей атаки попытаемся оставить отзыва на сайте, вписав туда следующий **алерт-скрипт** `<script>alert(1)</script>` Правила срабатывают --- ![](https://i.imgur.com/VsPJTBI.png) --- Проверяем логи --- ![](https://i.imgur.com/omp6R1Z.png) --- ### Path traseval Пробуем изменить параметр пути, включив режим перехвата в Burp Suite добравшись до файла `passwd` следующим образом: `../../../etc/passwd` --- ![](https://i.imgur.com/z1olByx.png) --- В HTTP hispory видим ответ **403** на запрос Правила срабатывают --- ![](https://i.imgur.com/z2hswp5.png) --- Проверяем логи --- ![](https://i.imgur.com/yhscWZA.png) --- ### RCE (дополнительно) Выполним команду `whoami`, чтобы определить имя текущего пользователя, включив режим перехвата в **Burp Suite** --- ![](https://i.imgur.com/ErXhpnj.png) --- Проверяем логи Правила срабатывают (https://) --- ![](https://i.imgur.com/xcDqgN5.png) ---