Suricata: diferència entre les revisions
(Es crea la pàgina amb « = Actividad Suricata = == Introducció == En l’últim EAC vam estar treballant amb Suricata, com una de les eines que tenim al nostre abast per la implantació de mesures de protecció a nivell de capa 3 i 4 en la xarxa perimetral. Tanmateix, ja hem vist a M1 com podem capturar aquestes alertes de Suricata i enviar-les a un SIEM tipus Wazuh pel seu tractament com incidència. En aquest EAC, l’objectiu és poder fortificar a través de la monitorització la...».) |
Cap resum de modificació |
||
| (Hi ha 3 revisions intermèdies del mateix usuari que no es mostren) | |||
| Línia 2: | Línia 2: | ||
= Actividad Suricata = | = Actividad Suricata = | ||
== | == Introducción == | ||
En | 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 | == 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 <abbr>GB</abbr> de RAM | 8 <abbr>GB</abbr> 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------- | ------ /etc/netplan/00-installer-config.yaml------- | ||
# This is the network config written by 'subiquity' | # This is the network config written by 'subiquity' | ||
| Línia 69: | Línia 32: | ||
dhcp4: true | dhcp4: true | ||
enp2s0: | enp2s0: | ||
addreses: [172.20.120. | addreses: [172.20.120.254/24] | ||
version: 2 | version: 2 | ||
----------------------------------------------------- | ----------------------------------------------------- | ||
isard@ubuntu:~$ sudo netplan apply | isard@ubuntu:~$ sudo netplan apply | ||
Ubuntu Server | Ubuntu Server instalamos el Docker Engine (<nowiki>https://docs.docker.com/engine/install/ubuntu/</nowiki>): | ||
# Add Docker's official GPG key: | # 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 <nowiki>https://download.docker.com/linux/ubuntu/gpg</nowiki> -o /etc/apt/keyrings/docker.asc | |||
ubuntu@ubuntu:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc | |||
# Add the repository to Apt sources: | # Add the repository to Apt sources: | ||
ubuntu@ubuntu:~$ echo \ | |||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] <nowiki>https://download.docker.com/linux/ubuntu</nowiki> \ | "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] <nowiki>https://download.docker.com/linux/ubuntu</nowiki> \ | ||
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ | $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ | ||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null | 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 | 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 <nowiki>https://github.com/bocajspear1/acme-web-app.git</nowiki> | |||
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----------- | ------/etc/suricata/suricata.yaml----------- | ||
HOME_NET: ["172.20.120.0/ | HOME_NET: ["172.20.120.0/32]" #172.20.120.0/24 | ||
ports-groups: | ports-groups: | ||
HTTP_DOCKER: "1337" | HTTP_DOCKER: "1337" | ||
af-packet: | af-packet: | ||
- interface: | - interface: enp0s8 | ||
cluster-id: 99 | cluster-id: 99 | ||
cluster-type: cluster_flow | cluster-type: cluster_flow | ||
| Línia 127: | Línia 84: | ||
use-mmap: yes | use-mmap: yes | ||
tpacket-v3: 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 | |||
/ | |||
Revisió de 03:27, 17 abr 2024
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