# Web.Практическая работа № 4
## 4.0 Схема стенда
Схема нашей сети.
Атаки будем проводить с Kali, для этого разместим еще один коммутатор в DMZ. Подлючим в него Internet, Kali, WAF. IP план такой:
- Kali - 192.168.225.111, gw 192.168.225.1, dns 8.8.8.8
- WAF - 192.168.225.254, 10.1.1.1, gw 192.168.225.1, dns 8.8.8.8
- WEB - 10.1.1.225, gw 10.1.1.1, dns 8.8.8.8

## 4.1 Установка и настройка машины с веб приложением
Данное веб приложение поднимали в практической работе №1, поэтому тут подробно описывать не будем.
Настроим сеть на машине




Проверим работу сети

---
Обновим машину


Установим необходимые пакеты




---
Добавим ключи от репозитория docker

---
Обновим информацию о пакетах. Установим docker



---
Включим, запустим и проверим состояние docker

Скачаем

И запустим наше веб приложение

## 4.2 Настройка WAF
### 4.2.1 Настройка машины для WAF
Разрешим пропускать через себя трафик
```bash=
sudo nano /etc/sysctl.conf
```

----
```bash=
net.ipv4.ip_forward=1
```

---
Посмотрим текущую адресацию
```bash=
ip address
```

---
Установим адресацию
```bash=
sudo ip address add 192.168.225.254/24 dev ens4
sudo ip link set up dev ens4
sudo ip route add default via 192.168.225.1
sudo ip addess add 10.1.1.1/24 dev ens3
ip address
sudo ip link set up dev ens3
ip address
```

---
Проверим работу сети
```bash=
ping 192.168.225.1
ping 8.8.8.8
```

---
Для сети 10.1.1.0/24 нужен NAT. Настроим его средствами iptables.
Посмотрим таблицы. Настроим NAT. Проверим результат.
```bash=
sudo iptables -t nat -L
sudo iptables -t nat -A POSTROUTING -o ens4 -s 10.1.1.1/24 -j MASQUERADE
sudo iptables -t nat -L
```

---
Настроим dns
```bash=
sudo nano /etc/resolv.conf
```

---
Возьмемь google
```bash=
nameserver 8.8.8.8
```

---
Проверим работу dns
```bash=
ping google.com
```

---
Обновим информацию о пакетах
```bash=
sudo apt update
```

---
Обновим сами пакеты
```bash=
sudo apt upgrade
```

---
Установим пакет поддержки сохранения правил iptables
```bash=
sudo apt install iptables-persistent
```


---
### 4.2.2 Настройка и конфигурирование WAF
Обновим пакеты
```bash=
sudo apt update -y && sudo apt upgrade -y
```

----
Установим необходимые пакеты
```bash=
sudo apt install dpkg-dev git 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 curl unzip
```


----
Добавим репозиторий NGINX
Нам необходим также и исходный код, однако, добавление репозитория через официальную установку, не работает, т.к. после изменения файла(add deb-scr) перестает проверяться подпись. Поэтому добавим репозиторий прямо в соурс лист и сделаем доверенным.

Обновим информацию о пакетах
```bash=
sudo apt update
```

Установим NGINX
```bash=
sudo apt install nginx-core nginx-common nginx nginx-full
```


----
Создадим каталог для исходного кода
```bash=
sudo mkdir /usr/local/src/nginx && cd /usr/local/src/nginx
```

----
Настроим права
```bash=
sudo chown user:user /usr/local/src/ -R
```

----
Скачаем исходники
```bash=
sudo apt source nginx
```

----
Посмотрим что в каталоге, проверим версию NGINX
```bash=
ls
sudo nginx -v
```

----
Склонируем репозиторий с ModSecurity
```bash=
git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/
cd /usr/local/src/ModSecurity
```

----
Инициализируем и обновим сабмодули
```bash=
git submodule init
git submodule update
```

----
Билд
```bash=
./build.sh
```

----
Конфигурация
```bash=
./configure
```



----
Компиляция ModSecurity
```bash=
make -j 4
```



----
Установим ModSecurity
```bash=
sudo make install
```


----
Посмотрим что в каталоге
```bash=
ls /usr/local/modsecurity
```

----
Склонируем репозиторий коннектора ModSecurity к NGINX. Перейдем в каталог NGINX.
```bash=
sudo git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/
cd /usr/local/src/nginx/nginx-1.23.1
```

----
```bash=
Установим необходимые зависимости
sudo apt build-dep nginx && sudo apt install uuid-dev
```


----
Сконфигурируем
```bash=
sudo ./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
```


----
И соберем
```bash=
sudo make modules
```

----
Скопируем собранный модуль в NGINX. Создадим необходимые каталоги. Скопируем конфигурацию и маппинг.
```bash=
sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
sudo mkdir /etc/nginx/modsec/
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/
```

----
Настроим NGINX
```bash=
sudo nano /etc/nginx/nginx.conf
```

----
Подгрузим модуль, включим ModSecurity, укажем конфигурацию.
```bash=
load_module modules/ngx_http_modsecurity_module.so;
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsec-config.conf;
```

----
Настроим ModSecurity.
```bash=
sudo nano /etc/nginx/modsec/modsecurity.conf
```

----
Переключим ModSecurity с Only Detect на активную защиту.
Приведем описание ключей:
- A Audit log header (mandatory)
- B Request headers
- C Request body
- D Reserved
- E Response body
- F Response headers
- G Reserved
- H Audit log trailer, which contains additional data
- I Compact request body alternative (to part C), which excludes files
- J Information on uploaded files
- K Contains a list of all rules that matched for the transaction
- Z Final boundary (mandatory)
```bash=
SecRuleEngine On
SecAuditLogParts ABCEFHJKZ
```


----
Создадим конфиг файл.
```bash=
sudo nano /etc/nginx/modsec/modsec-config.conf
```

----
Будем включать в него конфигурации
```bash=
Include /etc/nginx/modsec/modsecurity.conf
```

----
Протестируем настройки NGINX
```bash=
sudo nginx -t
```

----
Перезапустим NGINX, проверим результат
```bash=
sudo systemctl restart nginx
sudo systemctl status nginx
```

----
Теперь добавим в ModSecurity набор правил OWASP core.
Скачаем набор правил
```bash=
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip
```

----
Распакуем набор правил в каталог modsec
```bash=
sudo unzip v3.3.2.zip -d /etc/nginx/modsec/
```


----
Скопируем конфигурацию правил
```bash=
sudo cp /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf
```

----
Откроем наш конфиг
```bash=
sudo nano /etc/nginx/modsec/modsec-config.conf
```

----
Добавим в него конфиги правил
```bash=
Include /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.2/rules/*.conf
```

----
Протестируем изменнения
```bash=
sudo nginx -t
```

----
Перезапустим и проверим NGINX
```bash=
sudo systemctl restart nginx
sudo systemctl status nginx
```

----
Посмотрим конфиг набора
```bash=
sudo nano /etc/nginx/modsec/coreruleset-3.3.2/crs-setup.conf
```



----
Создадим файл для ротации логов
```bash=
sudo nano /etc/logrotate.d/modsec
```

----
Настроим ротацию логов
```bash=
/var/log/modsec_audit.log
{
rotate 31
daily
missingok
compress
delaycompress
notifempty
}
```

----
Настроим проксирование нашего сайта через NGINX. Проксировать будем по пути ./juice
Отредактируюем конфиг
```bash=
sudo nano /etc/nginx/sites-available/default
```

Перезапустим NGINX

Проверим проксирование на Kali указав адрес NGINX.

Проверим что WAF работает

----
## 4.3 Проведение атак из OWASP TOP 10
### 4.3.0
Для демонстации работы WAF выполним три атаки:
- SSRF RCE
- SQL Ijection
- XSS
С целью простоты демонстации, атаки будем выполнять вручную. Будем использовать форму логона.
---
### 4.3.1 Server-Side Request Forgery (SSRF) RCE
Попробуем получить доступ к локльному файлу.
```bash=
<span file://etc/passwd</span>
```
Рузультат в браузере

Рузультат в логах modsecurity

---
### 4.3.2 SQL injection
Попробуем простейшую SQL иньекцию
```bash=
'or '1'='1
```
Результат в браузере

Лог WAF

---
### 4.3.3 XSS
Создадим простейший XSS
```bash=
<script>alert(document.domain)</scrit>
```
Результат в браузере

Результат в логах

---
На этом данная работа завершена. WAF с правилами OWASP работает.