Suricata
Actividad Suricata
Introducción
En esta actividad vamos a comprovar el funcionamiento de Suricata a través de su instalación y luego comprovaremos i es capaz de evitar ataques de nmap.
El sistema
Esta práctica consiste en dos máquinas
- Un servidor Ubuntu con Docker y Suricata.
- Una Kali para realizar los ataques.
El servidor Docker de la aplicación web
Lo primero que vamos a preparar del servidor Ubuntu es Docker para poder instalar nuestra aplicación web.
Para ello, se recomienda crear una máquina virtual Ubuntu Server con:
2 CPU
8 GB de RAM
Configuración de redes: red NAT y red interna 172.20.120.254/24
ubuntu@ubuntu:~$ sudo apt update
ubuntu@ubuntu:~$ sudo apt upgrade
ubuntu@ubuntu:~$ sudo nano /etc/netplat/00-installer-config.yaml
------ /etc/netplan/00-installer-config.yaml-------
# This is the network config written by 'subiquity'
network:
ethernets:
enp1s0:
dhcp4: true
enp2s0:
addreses: [172.20.120.254/24]
version: 2
-----------------------------------------------------
isard@ubuntu:~$ sudo netplan apply
Ubuntu Server instalamos el Docker Engine (https://docs.docker.com/engine/install/ubuntu/):
# Add Docker's official GPG key: ubuntu@ubuntu:~$ sudo apt-get update ubuntu@ubuntu:~$ sudo apt-get install ca-certificates curl ubuntu@ubuntu:~$ sudo install -m 0755 -d /etc/apt/keyrings ubuntu@ubuntu:~$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc ubuntu@ubuntu:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: ubuntu@ubuntu:~$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null ubuntu@ubuntu:~$ sudo apt-get update ubuntu@ubuntu:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ara podemos instalar la aplicación web vulnerable:
Podéis encontrar más información en el repositorio: https://github.com/bocajspear1/acme-web-app
ubuntu@ubuntu:~$ git clone https://github.com/bocajspear1/acme-web-app.git ubuntu@ubuntu:~$ cd acme-web-app ubuntu@ubuntu:~$ sudo docker build -t acme-webapp . ubuntu@ubuntu:~$ sudo docker run -p 1337:80 --rm -it --name acme-webapp-test -d -v`pwd`/app:/var/www/html acme-webapp
Si en algun momento se para el servidor, podemos volver a arrancar el sistema con:
ubuntu@ubuntu:~$ cd ~/acme-web-app ubuntu@ubuntu:~$ sudo docker run -p 1337:80 --rm -it --name acme-webapp-test -v`pwd`/app:/var/www/html acme-webapp
Y ahora instalaremos Suricata. Tenéis más información en su guía oficial https://docs.suricata.io/en/latest/quickstart.html
ubuntu@suricata:~$ sudo apt-get install software-properties-common ubuntu@suricata:~$ sudo add-apt-repository ppa:oisf/suricata-stable ubuntu@suricata:~$ sudo apt update ubuntu@suricata:~$ sudo apt install suricata jq
Comprovamos que todo esté correcto:
ubuntu@suricata:~$ sudo suricata --build-info ubuntu@suricata:~$ sudo systemctl status suricata
Ara farem les configuracions bàsiques de Suricata amb l’idea que escolti per la interfície enp3s0 (default):
ubuntu@suricata:~$ ip a
#Seguramente, sea enp0s8
ubuntu@suricata:~$ sudo nano /etc/suricata/suricata.yaml
------/etc/suricata/suricata.yaml-----------
HOME_NET: ["172.20.120.0/32]" #172.20.120.0/24
ports-groups:
HTTP_DOCKER: "1337"
af-packet:
- interface: enp0s8
cluster-id: 99
cluster-type: cluster_flow
defrag: yes
use-mmap: yes
tpacket-v3: yes
--------------------------------------------
Buscar arxiu /etc/suricata/rules/emerging-threats.rules i comentar.
touch /etc/suricata/empty.rules
suricata-update add-source empty file:///etc/suricata/empty.rules
En esta práctica no utilizaremos las alertas de ET Emerging Threats https://community.emergingthreats.net/, pero si quisieramos...
ubuntu@suricata:~$ sudo suricata-update ubuntu@suricata:~$ sudo systemctl restart suricata ubuntu@suricata:~$ sudo systemctl status suricata
Escaneos y defensas:
Primer escaneo básico:
ubuntu@hack-ubuntu:~$ mkdir arxius ubuntu@hack-ubuntu:~$ cd arxius ubuntu@hack-ubuntu:~$ sudo nmap -sS -p1-10000 172.20.120.1 > first_scan.txt #La ruta del arxiu hauria de ser: /home/isard/arxius/first_scan.txt #Tingueu present que els escanejos poden trigar una mica.
Primeras Rules:
alert tcp any any -> any 1337 (msg:"Un paquest vol entrar al port 8080"; sid:2000001; rev:2)
Para descartar un paquete
drop tcp any any -> any 1337 (msg:"Un paquest vol entrar al port 8080"; sid:2000001; rev:2)
ubuntu@suricata:~$ sudo sid2rulename -r /etc/suricata/rules/suricata.rules
Segundo escaneo básico:
ubuntu@hack-ubuntu:~$ mkdir arxius ubuntu@hack-ubuntu:~$ cd arxius ubuntu@hack-ubuntu:~$ sudo nmap -sS -p1-10000 172.20.120.1 > first_scan.txt #La ruta del arxiu hauria de ser: /home/isard/arxius/first_scan.txt #Tingueu present que els escanejos poden trigar una mica.
https://github.com/aleksibovellan/opnsense-suricata-nmaps/blob/main/local.rules
ubuntu@suricata:~# nano /usr/local/etc/suricata/suricata.yaml
Cerqueu les línies: (En el meu servidor, línia 430/1813)
- drop:
enabled: no
I poseu 'yes': us quedarà així:
- drop:
enabled: yes
Reglas encadenadas
alert http any any -> 172.20.120.1 9337 (msg: "RST is activated"; flags:R; flowbits:set, areR; sid:500; flowbits:noalert;)
alert http any any -> 172.20.120.1 8443 (msg: "SYN with RST is activated"; flags:R; flowbits:isset, areR; sid:501;)
root@opnsense:~/nano /usr/local/bin/badips.sh
---------/usr/local/bin/badips.sh-----------
#!/usr/bin/env bash
#agafa la ultima ip
BAD_IP=$(tail -1 /var/log/suricata/latest.log | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | tail -n2 | head -1)
#Compte quantes vegades trobem una ip
if grep $BAD_IP /usr/local/etc/suricata/iprep/reputation.list
then
echo "a"
else
COUNT=$(cat /var/log/suricata/latest.log | grep $BAD_IP | wc -l)
if [ $COUNT -gt 100 ]
then
echo "$BAD_IP,1,100" >>/usr/local/etc/suricata/iprep/reputation.list
sleep 1
service suricata restart
fi
fi
--------------------------------------------
root@opnsense:~/chmod +x /usr/local/bin/badips.sh
root@opnsense:/pkg install bash
root@opnsense:~/nano /etc/crontab
---------/etc/crontab-----------
#minute hour mday month wday who command
#
#Comprova si hi ha un BAD_IP
* * * * * root badips.sh
--------------------------------------------
# I reiniciem el crontab
root@opnsense:/etc/rc.d/cron restart
root@opnsense:~/nano /usr/local/etc/suricata/rules/local.rules
-----/usr/local/etc/suricata/rules/local.rules-----
drop tcp any any -> any any (msg:"Fora per IPREPUTATION"; flow:stateless; classtype:attempted-recon; iprep:src,BadHosts,>,50; sid:900001; priority:2; rev:2;)
---------------------------------------------------
root@opnsense:~/nano /usr/local/etc/suricata/suricata.yaml
#Fixeu-vos, que només cal desmarcar
-----/usr/local/etc/suricata/suricata.yaml-----
# IP Reputation
reputation-categories-file: /usr/local/etc/suricata/iprep/categories.txt
default-reputation-path: /usr/local/etc/suricata/iprep
reputation-files:
- reputation.list
# deprecated a line based information for dropped packets in IPS mode
- drop:
enabled: yes
---------------------------------------------------
root@opnsense:~/mkdir /usr/local/etc/suricata/iprep
root@opnsense:~/nano /usr/local/etc/suricata/iprep/categories.txt
-----/usr/local/etc/suricata/categories.txt-----
1,BadHosts,Known bad hosts
---------------------------------------------------
root@opnsense:~/touch /usr/local/etc/suricata/iprep/reputation.list