Suricata: diferència entre les revisions

De Training B Wiki
Salta a la navegació Salta a la cerca
(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ó ==
== Introducción ==
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 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.


En aquest EAC, l’objectiu és poder fortificar a través de la monitorització la plataforma Docker. Wazuh, a través dels seus agents, és capaç de recollir els estats de Dockers, els seus esdeveniments, i generar l’alerta per tal que l’equip de Blue Team hi pugui treballar.
== El sistema ==


== Avaluació ==
Esta práctica consiste en dos máquinas
L’avaluació d’aquesta pràctica es realitza a través del qüestionari que teniu a l’aula, i només una pregunta, us demana recollir una evidència informàtica a través de .pcap o captures de pantalla.


Tot i així, durant el qüestionari i durant la pràctica, es requereix deixar evidències de la vostra realització en la màquina Parrot. Sense les evidències a la vostra màquina Parrot, no podrem fer efectiva la vostra avaluació.
* Un servidor Ubuntu con Docker y Suricata.
* Una Kali para realizar los ataques.


== El sistema de l'EAC 3 ==
== 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:


L’EAC 3 consta de tres màquines:
2 CPU
 
* Un servidor Ubuntu amb docker on instal·larem l’agent de Wazuh.
* El servidor Ubuntu amb on instal·larem Wazuh.
* Un client Parrot, que serà la única màquina desplegada pel professorat. (Comproveu que teniu visible M2 EAC3 Parrot st)
 
== El servidor Docker amb l'aplicació web ==
El primer que prepararem és el servidor Docker. Aquest servidor ja el teniu preparat com a plantilla:
 
Escriptori isard: M2 EAC3 Docker
 
Plantilla feta amb:M2 EAC3 Docker Web
 
4 CPU


8 <abbr>GB</abbr> de RAM
8 <abbr>GB</abbr> de RAM


Xarxes: Default [DHCPv4], Personal2 [172.20.120.200/24], personal2 [172.20.121.100/24], WireguardVPN [DHCPv4]
Configuración de redes: red NAT y red interna 172.20.120.254/24
 
  ubuntu@ubuntu:~$ sudo apt update
User - Password: isard - studentIOC
  ubuntu@ubuntu:~$ sudo apt upgrade
 
  ubuntu@ubuntu:~$ sudo nano /etc/netplat/00-installer-config.yaml
Una vegada hagueu creat la màquina, la podeu arrencar, i de moment no caldrà fer res més.
 
No arranqueu docker-compose
 
Tot i així, si voleu veure com s’ha fet la plantilla, aquí teniu les instruccions que s’han seguit:
 
En el nostre cas, instal·larem un Ubuntu Server 22.04, instal·larem també un servei Docker i aixecarem una aplicació web vulnerable que es va utilitzar en el Hacketon del 2016 a NY.
 
Creem el '''M2 EAC3 Vuln Server''':
 
# Anem a Escriptori nou
# NOM: M2 EAC3 Vuln Server
# Plantilla: IOC - Ubuntu Server
# Opcions avançades:
# CPU: 2
# <abbr>GB</abbr>: 5
# Xarxes en aquest ordre: Default, PersonalIOC2, Personal2, Wireguard VPN
# Crear la màquina
 
Configuració bàsica de la màquina:
  isard@ubuntu:~$ sudo passwd isard
> studentIOC
isard@ubuntu:~$ sudo apt update
  isard@ubuntu:~$ sudo apt upgrade
  isard@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.200/24]
       addreses: [172.20.120.254/24]
    enp3s0:
      addreses: [172.20.121.100/24]
    enp4s0:
      dhcp4: true
   version: 2
   version: 2
  -----------------------------------------------------
  -----------------------------------------------------
  isard@ubuntu:~$ sudo netplan apply
  isard@ubuntu:~$ sudo netplan apply
Ubuntu Server instal·lem el Docker Engine (<nowiki>https://docs.docker.com/engine/install/ubuntu/</nowiki>):
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:
  isard@ubuntu:~$ sudo apt-get update
  ubuntu@ubuntu:~$ sudo apt-get update
  isard@ubuntu:~$ sudo apt-get install ca-certificates curl
  ubuntu@ubuntu:~$ sudo apt-get install ca-certificates curl
  isard@ubuntu:~$ sudo install -m 0755 -d /etc/apt/keyrings
  ubuntu@ubuntu:~$ sudo install -m 0755 -d /etc/apt/keyrings
  isard@ubuntu:~$ sudo curl -fsSL <nowiki>https://download.docker.com/linux/ubuntu/gpg</nowiki> -o /etc/apt/keyrings/docker.asc
  ubuntu@ubuntu:~$ sudo curl -fsSL <nowiki>https://download.docker.com/linux/ubuntu/gpg</nowiki> -o /etc/apt/keyrings/docker.asc
  isard@ubuntu:~$ sudo chmod a+r /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:
  isard@ubuntu:~$ echo \
  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
  isard@ubuntu:~$ sudo apt-get update
  ubuntu@ubuntu:~$ sudo apt-get update
  isard@ubuntu:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  ubuntu@ubuntu:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Ara ja tenim instal·lat Docker i podem començar a instal·lar l’aplicació vulnerable.
Ara podemos instalar la aplicación web vulnerable:
 
Podeu trobar més informació de l’aplicació que instal·larem en el repositori: <nowiki>https://github.com/bocajspear1/acme-web-app</nowiki>.
isard@ubuntu:~$ git clone <nowiki>https://github.com/bocajspear1/acme-web-app.git</nowiki>
isard@ubuntu:~$ cd acme-web-app
isard@ubuntu:~$ sudo docker build -t acme-webapp .
isard@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 moment se’ns atura el contenidor, o reinciem la màquina, per tornar-la a aixecar ja només caldrà fer el següent:
isard@ubuntu:~$ cd ~/acme-web-app
isard@ubuntu:~$ sudo docker run -p 1337:80 --rm -it --name acme-webapp-test -v`pwd`/app:/var/www/html acme-webapp
I ara instal·lem Suricata, però a diferència dels anteriors exercicis, aquesta vegada utilitzarem les alertes automàtiques que tenim preconfigurades.


Prepararem una instal·lació estàndard de Suricata, per fer-ho, seguirem la guia ‘quickstart’ <nowiki>https://docs.suricata.io/en/latest/quickstart.html</nowiki>
Podéis encontrar más información en el repositorio: https://github.com/bocajspear1/acme-web-app
  isard@suricata:~$ sudo apt-get install software-properties-common
ubuntu@ubuntu:~$ git clone <nowiki>https://github.com/bocajspear1/acme-web-app.git</nowiki>
  isard@suricata:~$ sudo add-apt-repository ppa:oisf/suricata-stable
ubuntu@ubuntu:~$ cd acme-web-app
  isard@suricata:~$ sudo apt update
ubuntu@ubuntu:~$ sudo docker build -t acme-webapp .
  isard@suricata:~$ sudo apt install suricata jq
ubuntu@ubuntu:~$ sudo docker run -p 1337:80 --rm -it --name acme-webapp-test -d -v`pwd`/app:/var/www/html acme-webapp
Ja tenim instal·lat Suricata, podem comprovar que s’ha instal·lat correctament:
Si en algun momento se para el servidor, podemos volver a arrancar el sistema con:
  isard@suricata:~$ sudo suricata --build-info
ubuntu@ubuntu:~$ cd ~/acme-web-app
  isard@suricata:~$ sudo systemctl status suricata
ubuntu@ubuntu:~$ sudo docker run -p 1337:80 --rm -it --name acme-webapp-test -v`pwd`/app:/var/www/html acme-webapp
Ara farem les configuracions bàsiques de Suricata amb l’idea que escolti per la interfície enp3s0 (default):
Y ahora instalaremos Suricata. Tenéis más información en su guía oficial https://docs.suricata.io/en/latest/quickstart.html
  isard@suricata:~$ ip a
  ubuntu@suricata:~$ sudo apt-get install software-properties-common
  #Segurament, sigui enp3s0
  ubuntu@suricata:~$ sudo add-apt-repository ppa:oisf/suricata-stable
  isard@suricata:~$ sudo nano /etc/suricata/suricata.yaml
  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/24]"
  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: enp3s0
     - 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;)
  --------------------------------------------
  --------------------------------------------
Utilitzarem directament les configuracions per defecte del repositori que manté Emerging Threats <nowiki>https://community.emergingthreats.net/</nowiki>, només cal fer ‘sudo suricata-update’ i totes les regles s’activaran.
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:
isard@suricata:~$ sudo suricata-update
  ubuntu@suricata:~$ sudo systemctl restart suricata
  isard@suricata:~$ sudo systemctl restart suricata
  ubuntu@suricata:~$ sudo systemctl status suricata
  isard@suricata:~$ sudo systemctl status suricata
  ubuntu@suricata:~$ sudo suricatasc
Per acabar, s’ha deixat preparat un docker compose:
  >>>ruleset-stats
  isard@web:~$cd acme-web-app
  #### Os tendría que salir algo parecido a:
  isard@web:~/acme-web-app$ nano docker-compose.yaml
  [
  -------docker-compose.yaml--------------
     {
version: '3.8'
        "id": 0,
   
        "rules_failed": 0,
services:
        "rules_loaded": 2,
  app:
        "rules_skipped": 0
     image: acme-webapp
    }
    container_name: acme-webapp-test
  ]
    restart: always
 
    stdin_open: true
    tty: true
    ports:
      - '1337:80'
    volumes:
      - "./app:/var/www/html"
    healthcheck:
      test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider <nowiki>http://localhost:80/</nowiki> || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 1
  ---------------------------------------
# En cas de voler arrencar la màquina faríem (Ara no s'ha de fer): isard@web:~/acme-web-app$ sudo docker compose up
Ja tenim el servidor Docker preparat.


== Configuració Wazuh Server ==
Ahora podemos usar nuestra Kali para comprovar que las reglas se levantant:
D’entrada, crearem un Ubuntu Server 22.04, amb tres interfícies de xarxa i la preparem per poder treballar amb ella a través de VPN. Inicieu sessió a l’Isard i genereu la següent màquina:
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:


M2 EAC3 Ubuntu Wazuh
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;)
--------------------------------------------


Ubuntu Server 22.04


Template: IOC - Ubuntu Server


Xarxes: Default [DHCPv4], PersonalIOC2 [172.20.120.210/24], Wireguard VPN [DHCPv4]


vCPUS: 4
Escaneos y defensas:


Memoria: 8Gb


Usuari - Contrasenya: isard - studentIOC
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.


En entorns de producció, Wazuh separa les seves funcions en tres nodes: Index, Nodes i Dashboard, i es recomana, que cadascun estiguin aïllats. Tot i així, en entorns de proves, podem fer la instal·lació senzilla i crear-ho tot a través d’un sol node. Teniu més informació a <nowiki>https://documentation.wazuh.com/current/quickstart.html</nowiki>.


A més a més, l’indexer fa funcions molt similars a l’elasticsearch, i hi ha tutorials explicant la manera d’integrar elastic com indexer. <nowiki>https://documentation.wazuh.com/current/integrations-guide/elastic-stack/index.html</nowiki> Però nosaltres, seguirem la instal·lació estàndard:
Primeras Rules:
  isard@wazuh:~$ curl -sO <nowiki>https://packages.wazuh.com/4.7/wazuh-install.sh</nowiki> && sudo bash ./wazuh-install.sh -a
  alert tcp any any -> any 1337 (msg:"Un paquest vol entrar al port 8080"; sid:2000001; rev:2;)
I obtindrem el password d’administrador una vegada estigui tot instal·lat. Es recomana guardar-lo en algun arxiu per poder treballar durant la pràctica:
Para descartar un paquete
INFO: --- Summary ---
  drop tcp any any -> any 1337 (msg:"Un paquest vol entrar al port 8080"; sid:2000001; rev:2;)
  INFO: You can access the web interface https://<wazuh-dashboard-ip>
    User: admin
    Password: <ADMIN_PASSWORD>
INFO: Installation finished.
Però si voleu obtenir el password més endavant, es pot accedir a través de:
isard@wazuh:~$ sudo tar -O -xvf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt
I ara ja podem veure la seva interfície gràfica a través del navegador: <nowiki>https://wazuh-dashboard-ip</nowiki>


=== Configuració alertes Suricata ===
ubuntu@suricata:~$ sudo sid2rulename -r /etc/suricata/rules/suricata.rules
Després, el que farem serà preparar la configuració del servidor per tal que el nostre client Suricata pugui fer arribar la informació a Wazuh.


Per fer-ho, comencem creant un grup anomenat Suricata:


El nom del vostre grup, és el vostre nom d’usuari, en el meu cas, jobellaga
Segundo escaneo básico:
  isard@wazuh:~$ sudo /var/ossec/bin/agent_groups -a -g jobellaga -q
  ubuntu@hack-ubuntu:~$ mkdir arxius
Afegim la següent configuració pels agents del grup ‘jobellaga’ ('''cadascú el seu nom d’usuari'''), on s’exposa que l’arxiu eve.json serà per on es llegiran les alertes:
  ubuntu@hack-ubuntu:~$ cd arxius
  isard@wazuh:~$ sudo nano /var/ossec/etc/shared/jobellaga/agent.conf
  ubuntu@hack-ubuntu:~$ sudo nmap -sS -p1-10000 172.20.120.1 > first_scan.txt
  ---------/var/ossec/etc/shared/jobellaga/agent.conf-----------
  #La ruta del arxiu hauria de ser: /home/isard/arxius/first_scan.txt
<agent_config>
  #Tingueu present que els escanejos poden trigar una mica.
  <localfile>
    <log_format>json</log_format>
    <location>/var/log/suricata/eve.json</location>
  </localfile>
</agent_config>
-------------------------------------------------------------
Però no només hem de configurar la sortida dels agents, sinó que també caldrà configurar la descodificació del json, ja que cal fer algunes modificacions:
isard@wazuh:~$ sudo nano /var/ossec/etc/decoders/local_decoder.xml
---------/var/ossec/etc/decoders/local_decoder.xml-----------
<decoder name="json">
  <prematch>^{\s*"</prematch>
  </decoder>
<decoder name="json_child">
  <parent>json</parent>
  <regex type="pcre2">"src_ip":"([^"]+)"</regex>
  <order>srcip</order>
</decoder>
<decoder name="json_child">
  <parent>json</parent>
  <plugin_decoder>JSON_Decoder</plugin_decoder>
  </decoder>
-------------------------------------------------------------
isard@wazuh:~$ sudo systemctl restart wazuh-manager.service
Una vegada tenim configurat el servidor, ens toca instal·lar el client de wazuh a l’ubuntu del servidor amb Docker.


== Configuracions alertes Docker ==
Quan parlem de monitoritzar docker, ens referim tant a la monitorització del propi servei docker, com el funcionament dels microserveis que hi tenim instal·lats.


Aquesta vegada, nosaltres treballarem amb la monitorització del servei Docker com a tal, es tracta de recollir els principals esdeveniments com start, stop, pull… Però a l’hora, també generarem alertes en relació al monitoratge dels contenidaors, com l’ús de la CPU, la memòria o el tràfic de xarxa. A més, utilitzarem el mecanisme de healthcheck, que podem configurar per tal que el propi docker es monitoritzi a ell mateix <nowiki>https://docs.docker.com/reference/dockerfile/</nowiki>.


=== Instal·lació agent Wazuh al servidor Web ===
El primer que farem serà instal·lar l’agent wazuh del nostre servidor. Seguirem les mateixes passes que havíem fet en altres EACS de M1:


La instal·lació d’agents (clients) de wazuh és molt fàcil. Anem a l’apartat d’agents (Potser cal clicar sobre el número dels agents, o us sortirà un missatge dient que no n’hi han). Després es prem ‘Deplow new agent’.
https://github.com/aleksibovellan/opnsense-suricata-nmaps/blob/main/local.rules


En el nostre cas, les opcions seran:


# DEB amd64
# 172.20.120.210 (Servidor Wazuh)
# Agent name: WebServer
# groups: jobellaga


I us apareixerà una comanda similar a (Atenció que potser no és igual!):
  ubuntu@suricata:~# nano /usr/local/etc/suricata/suricata.yaml
  wget <nowiki>https://packages.wazuh.com/4.x/apt/pool/main/w/wazuh-agent/wazuh-agent_4.7.3-1_amd64.deb</nowiki> && sudo WAZUH_MANAGER='172.20.120.210' WAZUH_AGENT_GROUP='jobellaga' WAZUH_AGENT_NAME='WebServer' dpkg -i ./wazuh-agent_4.7.3-1_amd64.deb
Cerqueu les línies: (En el meu servidor, línia 430/1813)
La copiem al nostre servidor Suricata i la fem córrer. Després habilitem i iniciem el servei:
  - drop:
  isard@web:~$ <- La comanda copiada de la GUI de Wazuh.
    enabled: no
isard@web:~$ sudo systemctl daemon-reload
  I poseu 'yes': us quedarà així:
isard@web:~$ sudo systemctl enable wazuh-agent
  - drop:
isard@web:~$ sudo systemctl start wazuh-agent
    enabled: yes
Al cap d’un o dos minuts, ja hauríem de tenir el nostre agent operatiu.


=== Configurem Docker Listener ===
Reglas encadenadas
En el servidor web fem les següents configuracions:
  alert http any any -> 172.20.120.1 9337 (msg: "RST is activated"; flags:R; flowbits:set, areR; sid:500; flowbits:noalert;)
isard@web:~$ sudo apt update
  isard@web:~$ sudo apt install python3 python3-pip
isard@web:~$ sudo pip3 install docker==4.2.0 urllib3==1.26.18
isard@web:~$ sudo nano /var/ossec/etc/local_internal_options.conf
------------/var/ossec/etc/local_internal_options.conf --------
logcollector.remote_commands=1
---------------
isard@web:~$ sudo systemctl restart wazuh-agent
En el servidor wazuh:
isard@wazuh:~$ sudo nano /var/ossec/etc/shared/jobellaga/agent.conf
<nowiki>#</nowiki>Afegim a continuació de la configuració de Suricata
<nowiki>------</nowiki>/var/ossec/etc/shared/jobellaga/agent.conf--------
<agent_config>
   
   
  <wodle name="docker-listener">
alert http any any -> 172.20.120.1 8443 (msg: "SYN with RST is activated"; flags:R; flowbits:isset, areR; sid:501;)
  <nowiki> </nowiki>   <interval>10m</interval>
root@opnsense:~/nano /usr/local/bin/badips.sh
  <nowiki> </nowiki>  <attempts>5</attempts>
---------/usr/local/bin/badips.sh-----------
  <nowiki> </nowiki>  <run_on_start>yes</run_on_start>
#!/usr/bin/env bash
  <nowiki> </nowiki>  <disabled>no</disabled>
#agafa la ultima ip
  <nowiki> </nowiki> </wodle>  
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
  --------------------------------------------
   
   
  <localfile>
# I reiniciem el crontab
  <nowiki> </nowiki>  <log_format>command</log_format>
  root@opnsense:/etc/rc.d/cron restart
  <nowiki> </nowiki>  <command>docker stats --format "<nowiki>{{.Container}}</nowiki> <nowiki>{{.Name}}</nowiki> <nowiki>{{.CPUPerc}}</nowiki> <nowiki>{{.MemUsage}}</nowiki> <nowiki>{{.MemPerc}}</nowiki> <nowiki>{{.NetIO}}</nowiki>" --no-stream</command>
  root@opnsense:~/nano /usr/local/etc/suricata/rules/local.rules
<nowiki> </nowiki>  <alias>docker container stats</alias>
-----/usr/local/etc/suricata/rules/local.rules-----
<nowiki> </nowiki>  <frequency>120</frequency>
  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;)
<nowiki> </nowiki>  <out_format>$(timestamp) $(hostname) docker-container-resource: $(log)</out_format>
  ---------------------------------------------------
<nowiki> </nowiki> </localfile>
  root@opnsense:~/nano /usr/local/etc/suricata/suricata.yaml
 
  #Fixeu-vos, que només cal desmarcar
  <localfile>
-----/usr/local/etc/suricata/suricata.yaml-----
<nowiki> </nowiki>  <log_format>command</log_format>
  # IP Reputation
<nowiki> </nowiki>  <command>docker ps --format "<nowiki>{{.Image}}</nowiki> <nowiki>{{.Names}}</nowiki> <nowiki>{{.Status}}</nowiki>"</command>
  reputation-categories-file: /usr/local/etc/suricata/iprep/categories.txt
  <nowiki> </nowiki>  <alias>docker container ps</alias>
  default-reputation-path: /usr/local/etc/suricata/iprep
<nowiki> </nowiki>  <frequency>120</frequency>
  reputation-files:
<nowiki> </nowiki>  <out_format>$(timestamp) $(hostname) docker-container-health: $(log)</out_format>
  - reputation.list
<nowiki> </nowiki> </localfile>
  # deprecated a line based information for dropped packets in IPS mode
  </agent_config>
  - drop:
<nowiki>-------------------------------------------------------</nowiki>
  enabled: yes
Ara ens toca preparar els decoders:
  ---------------------------------------------------
  isard@wazuh:~$ sudo nano /var/ossec/etc/decoders/docker_decoders.xml
  root@opnsense:~/mkdir /usr/local/etc/suricata/iprep
  <nowiki>---------</nowiki>/var/ossec/etc/decoders/docker_decoders.xml---------------
  root@opnsense:~/nano /usr/local/etc/suricata/iprep/categories.txt
  <decoder name="docker-container-resource">
-----/usr/local/etc/suricata/categories.txt-----
  <nowiki> </nowiki> <program_name>^docker-container-resource</program_name>
  1,BadHosts,Known bad hosts
</decoder>
  ---------------------------------------------------
 
  root@opnsense:~/touch /usr/local/etc/suricata/iprep/reputation.list
<decoder name="docker-container-resource-child">
<nowiki> </nowiki> <parent>docker-container-resource</parent>
<nowiki> </nowiki> <prematch>ossec: output: 'docker container stats':</prematch>
  <nowiki> </nowiki> <regex>(\S+) (\S+) (\S+) (\S+) / (\S+) (\S+) (\S+) / (\S+)</regex>
<nowiki> </nowiki> <order>container_id, container_name, container_cpu_usage, container_memory_usage, container_memory_limit, container_memory_perc, container_network_rx, container_network_tx</order>
</decoder>
 
  <decoder name="docker-container-health">
<nowiki> </nowiki> <program_name>^docker-container-health</program_name>
  </decoder>
 
<decoder name="docker-container-health-child">
<nowiki> </nowiki> <parent>docker-container-health</parent>
<nowiki> </nowiki> <prematch>ossec: output: 'docker container ps':</prematch>
  <nowiki> </nowiki> <regex offset="after_prematch" type="pcre2">(\S+) (\S+) (.*?) \((.*?)\)</regex>
<nowiki> </nowiki> <order>container_image, container_name, container_uptime, container_health_status</order>
</decoder>
<nowiki>---------------------------------------------------------</nowiki>
I creem les nostres regles:
  isard@wazuh:~$ sudo nano /var/ossec/etc/rules/docker_rules.xml
  <nowiki>----------</nowiki>/var/ossec/etc/rules/docker_rules.xml----------
<group name="container,">
  <rule id="100100" level="5">
<nowiki> </nowiki>  <decoded_as>docker-container-resource</decoded_as>
<nowiki> </nowiki>  <description>Docker: Container $(container_name) Resources</description>
<nowiki> </nowiki>  <group>container_resource,</group>
<nowiki> </nowiki> </rule>
 
  <rule id="100101" level="12">
<nowiki> </nowiki>  <if_sid>100100</if_sid>
<nowiki> </nowiki>  <field name="container_cpu_usage" type="pcre2">^(0*[8-9]\d|0*[1-9]\d{2,})</field>
<nowiki> </nowiki>  <field name="container_memory_perc" type="pcre2">^(0*[8-9]\d|0*[1-9]\d{2,})</field>
<nowiki> </nowiki>  <description>Docker: Container $(container_name) CPU usage ($(container_cpu_usage)) and memory usage ($(container_memory_perc)) is over 80%</description>
<nowiki> </nowiki>  <group>container_resource,</group>
<nowiki> </nowiki> </rule>
 
  <rule id="100102" level="12">
<nowiki> </nowiki>  <if_sid>100100</if_sid>
<nowiki> </nowiki>  <field name="container_cpu_usage" type="pcre2">^(0*[8-9]\d|0*[1-9]\d{2,})</field>
  <nowiki> </nowiki>  <description>Docker: Container $(container_name) CPU usage ($(container_cpu_usage)) is over 80%</description>
<nowiki> </nowiki>  <group>container_resource,</group>
<nowiki> </nowiki> </rule> 
 
  <rule id="100103" level="12">
<nowiki> </nowiki>  <if_sid>100100</if_sid>
<nowiki> </nowiki>  <field name="container_memory_perc" type="pcre2">^(0*[8-9]\d|0*[1-9]\d{2,})</field>
<nowiki> </nowiki>  <description>Docker: Container $(container_name) memory usage ($(container_memory_perc)) is over 80%</description>
<nowiki> </nowiki>  <group>container_resource,</group>
<nowiki> </nowiki> </rule>
   
  <rule id="100105" level="5">
<nowiki> </nowiki>  <decoded_as>docker-container-health</decoded_as>
<nowiki> </nowiki>  <description>Docker: Container $(container_name) is $(container_health_status)</description>
<nowiki> </nowiki>  <group>container_health,</group>
<nowiki> </nowiki> </rule>
 
  <rule id="100106" level="12">
<nowiki> </nowiki>  <if_sid>100105</if_sid>
<nowiki> </nowiki>  <field name="container_health_status">^unhealthy$</field>
<nowiki> </nowiki>  <description>Docker: Container $(container_name) is $(container_health_status)</description>
<nowiki> </nowiki>  <group>container_health,</group>
<nowiki> </nowiki> </rule>
</group>
<nowiki>---------------------------------------</nowiki>
isard@wazuh:~$ sudo systemctl restart wazuh-manager
Per acabar, ja només ens falta habilitar l’escolta del Docker Listener al servidor Wazuh. Per això anem a la interfície gràfica web de Wazuh:
 
# Fixeu-vos en la part superior, al costat d’on posa ‘WAZUH’ veureu un desplegable, aneu a Settings>Modules
# Habiliteu ‘Docker Listener’
 
=== Comprovem el funcionament de Docker Listener ===
Ara comprovem que el nostre servidor web és capaç de llençar el ‘Docker Listener’:
#Podem comprovar si el DockerListener funciona
isard@web:~$  sudo /var/ossec/wodles/docker/DockerListener
<nowiki>#</nowiki>Hauria de sortir alguna cosa similar a:
{"integration": "docker", "docker": {"Wodle event": "Started"}}
Docker service was started.
Ara mateix ja tenim operatiu tot el nostre sistema d’alertes, anem a comprovar-ho. Anem a la interfície del nostre agent a ‘Security Events > Dashboard’.
 
Per acabar, reiniciem el wazuh-agent per si cal reiniciar alguna configuració i aixequem el servidor web i comprovem que es generen les alertes a Wazuh:
isard@web:~/sudo systemctl restart wazuh-agent
isard@web:~/ cd acme-web-app
isard@web:~/acme-web-app$ sudo docker compose up -d
Si tot us ha anat correctament, us començaran a aparèixer les alertes que genera Docker.
 
== Qüestionari final i arxius finals al Parrot ==
Per poder realitzar el qüestionari final necessitareu fer servir la màquina de desplegament de Parrot. És una màquina amb les següents característiques:
 
Plantilla: M2 EAC3 Parrot T
 
Desplegament: M2 EAC3 Parrot st
 
CPU: 4
 
RAM: 8
 
Xarxes: Default [DHCPv4], Personal2 [172.20.121.10/24], Wireguard VPN [DHCPv4], ioc-grup4 [DHCPv4]
 
Una vegada la tingueu oberta, '''és important que canvieu el nom del hostname''' i que feu un reinici de la màquina per tal que el servidor DHCP pugui recullir el vostre nom:
  #Cadascú el seu nom d'usuari
isard@parrot: sudo hostnamectl hostname jobellaga
isard@parrot: sudo reboot now
En aquest punt, ja esteu preparats per respondre el qüestionari. El qüestionari us demanarà que aneu fent certes accions amb les màquines.
 
'''Una vegada ja heu acabat tot el qüestionari, cal que envieu al Parrot els següents logs'''. Sense els arxius, no es podrà acceptar les respostes del qüestionari:
 
Del servidor Wazuh:
 
/var/ossec/logs/alerts/alerts.log → Guardeu a Parrot com /home/isard/alerts.log
 
Del servidor Docker web:
 
/var/log/suricata/eve.json → Guardeu a Parrot com /home/isard/eve.json
 
/var/ossec/logs/ossec.log → Guardeu a Parrot com /home/isard/ossec.log

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