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
Comprobamos que todo esté correcto:
ubuntu@suricata:~$ sudo suricata --build-info ubuntu@suricata:~$ sudo systemctl status suricata
Ahora lo que nos toca es configurar el archivo principal de Suricata para poder asignar la interfaz correcta::
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
# En la parte final del archivo:
##
## Configure Suricata to load Suricata-Update managed rules.
##
default-rule-path: /var/lib/suricata/rules
rule-files:
# - suricata.rules
- local.rules
--------------------------------------------
De esta forma le informamos que solo usaremos nuestras propias reglas. Una vez creado, tenemos que crear los directorios necesarios e editar el archivo rules:
ubuntu@suricata:~$ sudo nano /var/lib/suricata/rules/local.rules ------/var/lib/suricata/rules/local.rules----------- alert tcp any any -> any 9337 (msg:"Un paquest vol entrar al port 9337"; sid:2000001; rev:2;) alert icmp any any -> any any (msg:"Un paquest vol entrar al port 9337"; sid:2000002; rev:2;) --------------------------------------------
Hemos creado dos reglas, una que nos alerte cuando alguien entre a nuestra web y otra cuando alguien nos haga ping. Para acabar podemos comprobar que ambas reglas se han subido correctamente:
ubuntu@suricata:~$ sudo systemctl restart suricata
ubuntu@suricata:~$ sudo systemctl status suricata
ubuntu@suricata:~$ sudo suricatasc
>>>ruleset-stats
#### Os tendría que salir algo parecido a:
[
{
"id": 0,
"rules_failed": 0,
"rules_loaded": 2,
"rules_skipped": 0
}
]
Ahora podemos usar nuestra Kali para comprovar que las reglas se levantant:
ubuntu@suricata:~$ sudo tail -f /var/log/suricata/fast.log
Si todo esto os ha funcionado podemos empezar a intentar bloquear el tráfico. Para ello, empezaremos comprobando que el bloqueo en Suricata nos funciona. Iremos al archivo de configuración y descartaremos los paquetes icmp:
ubuntu@suricata:~$ sudo nano /var/lib/suricata/rules/local.rules ------/var/lib/suricata/rules/local.rules----------- drop icmp any any -> any any (msg:"Un paquest vol entrar al port 9337"; sid:2000002; rev:2;) --------------------------------------------
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