Suricata

De Training B Wiki
La revisió el 03:27, 17 abr 2024 per Josepmariabella (discussió | contribucions)
(dif.) ← Versió més antiga | Versió actual (dif.) | Versió més nova → (dif.)
Salta a la navegació Salta a la cerca

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