En estas prácticas se empleará el software de virtualización VIRTUALBOX para simular los equipos GNU/Linux sobre los que se realizarán las pruebas.
alumno@pc: $ sh ejercicio-ids.sh
Powershell.exe -executionpolicy bypass -file ejercicio-ids.ps1
Notas:
$DIR_BASE especifica donde se descargarán las imágenes y se crearán las MVs.
Por defecto en GNU/Linux será en $HOME/SSI2223 y en Windows en C:/SSI2223.
Puede modificarse antes de lanzar los scripts para hacer la instalación en otro directorio más conveniente (disco externo, etc)
.vdi.zip de http://ccia.esei.uvigo.es/docencia/SSI/2223/practicas/ y copiarlos en el directorio anterior ($DIR_BASE) para que el script haga el resto.
VBoxManage startvm <nombre MV>_<id>
Contiene un sistema Parrot Security OS (basado en Debian) con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE].
| login | password |
|---|---|
| root | purple |
| usuario | usuario |
| (con privilegios sudo) |
root@base:~# startx
Dispositivos -> Portapapeles compartido -> bidireccional de la ventana de la máquina virtual.
Redes donde se realizarán los ejercicios:
ids:~/# ping 8.8.8.8 (en windows puede no funcionar ping, la wifi alumnos tambien lo bloquea) openvas:~/# ping 8.8.8.8 (si falla) ids:~/# ifconfig enp0s3 10.0.2.15/24 ids:~/# route add default gw 10.0.2.2 dev enp0s3 ids:~/# echo "nameserver 8.8.8.8" > /etc/resolv.conf openvas:~/# ifconfig enp0s3 10.0.2.15/24 openvas:~/# route add default gw 10.0.2.2 dev enp0s3 openvas:~/# echo "nameserver 8.8.8.8" > /etc/resolv.conf
openvas:~/# route add -net 192.168.100.0/24 dev enp0s8 victima:~/# route add -net 193.147.87.0/24 dev enp0s8Comprobar la conectividad entre ambas máquinas con ping
Nota: Esta configuración no tiene sentido en un escenario real.
suricata (ya hecho en la MV de prácticas)
ids:~/# apt-get update ids:~/# apt-get install suricata suricata-update # (ya hecho)
suricata e iniciar el servicio
ids:~/# systemctl enable suricata ids:~/# systemctl start suricata
suricata-update (manual en https://suricata.readthedocs.io/en/suricata-6.0.9/rule-management/suricata-update.html y https://suricata-update.readthedocs.io/en/latest/index.html)
ids:~# suricata-update list-sources ids:~# suricata-update -v
/var/lib/suricata/rules/suricata.rules (será necesario indicar esa ruta en el fichero de configuración /etc/suricata/suricata.yaml)
ids:~# cd /etc/suricata ids:/etc/suricata# nano suricata.yaml
192.168.100.0/24)
...
##
## Step 1: inform Suricata about your network
##
vars:
# more specifc is better for alert accuracy and performance
address-groups:
HOME_NET: "[192.168.100.0/24]" <----- CAMBIAR AQUI
...
EXTERNAL_NET: "!$HOME_NET"
...
...
##
## Step 2: select outputs to enable
##
default-log-dir: /var/log/suricata/
# global stats configuration
stats:
enabled: yes
interval: 8
# Configure the type of alert (and other) logging you would like.
outputs:
# a line based alerts log similar to Snort's fast.log
- fast:
enabled: yes
filename: fast.log
append: yes
# Extensible Event Format (nicknamed EVE) event log in JSON format
- eve-log:
enabled: yes
filetype: regular #regular|syslog|unix_dgram|unix_stream|redis
filename: eve.json
...
types:
- alert:
# payload: yes # enable dumping payload in Base64
...
- anomaly:
enabled: yes
...
- http:
extended: yes # enable this for extended logging information
...
- dns:
...
- tls:
extended: yes # enable this for extended logging information
...
...
Define el directorio donde se ubicará la salida del detector de intrusiones (/var/log/suricata)
La configuración por defecto define 3 tipos de salidas
suricata.log: log del demonio Suricata, con las acciones realizadas por el IDS y los errores que se hayan producido (útil en la depuración de las reglas)
eve.json: salida de Suricata con las alertas detectadas y detalles del tráfico capturado (en formato JSON, típicamente se usa como entrada a herramientas de visualización de logs)
fast.log: salida abreviada con información de las alertas generadas (campos msg y classtype de las reglas)
## Step 4: App Layer Protocol Configuration
enp0s8 en este caso)
... ## ## Step 3: configure common capture settings ## ## See "Advanced Capture Options" below for more options, including NETMAP ## and PF_RING. ## # Linux high speed capture support af-packet: - interface: enp0s8 <----- CAMBIAR AQUI ... ...
suricata-update
... ## ## Configure Suricata to load Suricata-Update managed rules. ## default-rule-path: /var/lib/suricata/rules <----- CAMBIAR AQUI rule-files: - suricata.rules ## ## Auxiliary configuration files. ## classification-file: /etc/suricata/classification.config reference-config-file: /etc/suricata/reference.config # threshold-file: /etc/suricata/threshold.config ...
ids:/etc/suricata# systemctl restart suricata
Se puede verificar la carga del IDS revisando /var/log/suricata/suricata.log
ids:/etc/suricata# tail /var/log/suricata/suricata.log 24/11/2022 -- 15:16:43 - <Notice> - This is Suricata version 6.0.1 RELEASE running in SYSTEM mode 24/11/2022 -- 15:16:43 - <Info> - CPUs/cores online: 2 24/11/2022 -- 15:16:43 - <Info> - Found an MTU of 1500 for 'enp0s8' 24/11/2022 -- 15:16:43 - <Info> - Found an MTU of 1500 for 'enp0s8' 24/11/2022 -- 15:16:43 - <Info> - fast output device (regular) initialized: fast.log 24/11/2022 -- 15:16:43 - <Info> - eve-log output device (regular) initialized: eve.json 24/11/2022 -- 15:16:43 - <Info> - stats output device (regular) initialized: stats.log 24/11/2022 -- 15:16:51 - <Info> - 1 rule files processed. 28866 rules successfully loaded, 0 rules failed 24/11/2022 -- 15:16:51 - <Info> - Threshold config parsed: 0 rule(s) found 24/11/2022 -- 15:16:52 - <Info> - 28869 signatures processed. 1140 are IP-only rules, 5143 are inspecting packet payload, 22388 inspect application layer, 104 are decoder event only
enp0s8
eve.json se usará la herramienta jq, un pretty printer para datos en formato JSON (ya hecho en MV de prácticas)
ids:~# apt-get install jq # (ya hecho)
En un terminal propio dejar en ejecución el comando jq sobre la salida del fichero de log /var/log/suricata/eve.log para ver la evolución de las alertas detectadas
ids:~# tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
openvas hacia la máquina victima
openvas~# ping victima.ssi.net
openvas hacia la máquina victima
openvas~# nmap -sV -O -T4 victima.ssi.net
ids
ids~# tail -f /var/log/suricata/fast.log ids~# tail -f /var/log/suricata/eve.json (MEJORA: alertas filtradas/visualizadas con jq) ids~# tail -f /var/log/suricata/eve.json | jq 'select(.event_type=="alert")'
Se usará la librería Pyhton Scapy para generar paquetes que fuercen la activación de las alertas definidas.
/etc/suricata/rules/local.rules una regla Snort para capturar un paquete UDP con un Payload concreto.
ids:/etc/suricatas# nano /etc/suricata/rules/local.rules alert udp $HOME_NET any -> $EXTERNAL_NET 3333 ( msg: "Prueba SSI con UDP"; content: "ho ho ho"; flow:to_server; nocase; sid:9000001;)
Importante: todos los elementos de la regla deben de ir en una única línea
Más detalles sobre formato de reglas SNORT/Suricata:
/etc/suricata/rules/local.rules con reglas propias
ids:/etc/suricatas# nano /etc/suricata/suricata.yaml ... ## ## Configure Suricata to load Suricata-Update managed rules. ## default-rule-path: /var/lib/suricata/rules rule-files: - suricata.rules - /etc/suricata/rules/local.rules <----- AÑADIR AQUI ...
ids:/etc/suricata# systemctl restart suricata
victima usar Scapy para generar un paquete UDP que encaje con la regla creada
victima:~# scapy >>> ip=IP() >>> ip.src="192.168.100.111" >>> ip.dst="193.147.87.47" >>> udp=UDP() >>> udp.dport=3333 >>> udp.sport=11111 >>> payload="ho ho ho los reyes magos son los padres" >>> paquete = ip/udp/payload >>> paquete.show() >>> send(paquete) >>> exit()
fast.log y eve.json de la máquina ids la captura del tráfico generado
Puede buscarse directamente en eve.json los registros para el "signature_id":9000001
ids:# grep "9000001" /var/log/suricata/eve.json| jq
Nota: En ocasiones la actualización de ambos ficheros no es inmediata.
systemctl restart suricata
Uso de nc (netcat) para simular servidores y clientes.
established en el parámetro flow requieren completar la negociación en 3 pasos de una conexión TCP.
netcat (comando nc)
local.rules (todo en la misma línea)
ids:/etc/suricatas# nano /etc/suricata/rules/local.rules
...
alert tcp $EXTERNAL_NET any -> $HOME_NET 4444 (
msg:"prueba SSI tcp";
content: "feliz navidad";
flow:to_server,established;
nocase;
sid:9000002;)
ids:/etc/suricata# systemctl restart suricataImportante: todos los elementos de la regla deben de ir en una única línea
victima y un cliente en openvas que genere tráfico para activar la regla anterior.
victima:~# nc -l -p 4444
openvas:~# nc victima.ssi.net 4444
(escribir en el terminal feliz navidad)
fast.log y eve.json de la máquina ids la captura del tráfico generado
ids:# grep "9000002" /var/log/suricata/eve.json| jq
Comprobación de las reglas opensource https://rules.emergingthreats.net/
UserAgent sospechosos.
/var/lib/suricata/rules/suricata.rules
ids:# grep "sid:2017067" /var/lib/suricata/rules/suricata.rules
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET USER_AGENTS Suspicious user agent (Google page)";
flow:to_server,established; content:"Google page"; depth:11; http_user_agent;
classtype:trojan-activity; sid:2017067; rev:5;
metadata:created_at 2011_05_31, updated_at 2011_05_31;)
ids:# grep "sid:2026520" /var/lib/suricata/rules/suricata.rules
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET USER_AGENTS Suspicious User-Agent (Windows 8)";
flow:to_server,established; content:"Windows 8"; depth:9; http_user_agent;
metadata: former_category USER_AGENTS; classtype:bad-unknown; sid:2026520; rev:1;
...
updated_at 2018_10_18;)
ids:# grep "sid:2025889" /var/lib/suricata/rules/suricata.rules
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET USER_AGENTS VPNFilter Related UA (Gemini/2.0)";
flow:established,to_server; content:"Gemini/2.0"; http_user_agent; depth:10;
fast_pattern; isdataat:!1,relative; metadata: former_category USER_AGENTS;
reference:url,twitter.com/m0rb/status/1021626709307805696;
classtype:trojan-activity; sid:2025889; rev:1; ...;)
ids:# grep "sid:2008603" /var/lib/suricata/rules/suricata.rules
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET USER_AGENTS Suspicious User-Agent Detected (RLMultySocket)";
flow:established,to_server; content:"RLMultySocket"; http_user_agent; depth:13;
isdataat:!1,relative; threshold:type limit,count 2,track by_src,seconds 300;
metadata: former_category TROJAN; reference:url,doc.emergingthreats.net/bin/view/Main/2008603;
classtype:trojan-activity; sid:2008603; rev:9; ...;)...
vicitima hacia openvas con los valores UserAgent sospechosos (parámetro -A).
openvas está en ejecución el servidor web Apache (y reniciarlo si es necesario)
openvas:~# systemctl status apache2
openvas:~# systemctl restart apache2 (si Apache estaba parado)
nc en modo escucha en el puerto 80
openvas:~# systemctl stop apache2
openvas:~# nc -l -p 80
victima:~# curl --user-agent "Google page" openvas.ssi.net victima:~# curl --user-agent "Windows 8" openvas.ssi.net victima:~# curl --user-agent "Gemini/2.0" openvas.ssi.net victima:~# curl --user-agent "RLMultySocket" openvas.ssi.net
fast.log y eve.json de la máquina ids la captura del tráfico generado
ids:# grep "2017067" /var/log/suricata/eve.json| jq ids:# grep "2026520" /var/log/suricata/eve.json| jq ids:# grep "2025889" /var/log/suricata/eve.json| jq ids:# grep "2008603" /var/log/suricata/eve.json| jq
ids:# grep "sid:2000488" /var/lib/suricata/rules/suricata.rules
alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 1433 (msg:"ET EXPLOIT MS-SQL SQL Injection closing string plus line comment";
flow: to_server,established;
content:"'|00|"; content:"-|00|-|00|";
reference:url,owasp.org/index.php/SQL_Injection; reference:url,doc.emergingthreats.net/bin/view/Main/2000488;
classtype:attempted-user; sid:2000488; rev:7;...;)
victima:~# nc -l -p 1433 (simula un servidor MS-SQL en el puerto 1433)
openvas:~# echo -e "'\x00 -\x00-\x00" | nc victima.ssi.net 1433 [control+C]
ids:# grep "sid:2101775" /var/lib/suricata/rules/suricata.rules
alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 3306 (msg:"GPL SQL MYSQL root login attempt";
flow:to_server,established;
content:"|0A 00 00 01 85 04 00 00 80|root|00|";
classtype:protocol-command-decode;
sid:2101775; rev:4; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
victima:~# systemctl stop mysqld
victima:~# nc -l -p 3306
openvas:~# echo -e "\x0A\x00\x00\x01\x85\x04\x00\x00\x80root\x00" | nc victima.ssi.net 3306
fast.log y eve.json de la máquina ids la captura del tráfico generado
sid=2012090) y generar tráfico
ids:# grep "sid:2012090" /var/lib/suricata/rules/suricata.rules
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"ET SHELLCODE Possible Call with No Offset TCP Shellcode";
flow:established;
content:"|E8 00 00 00 00 0F 1A|";
reference:url,www.networkforensics.com/2010/05/16/network-detection-of-x86-buffer-overflow-shellcode/;
classtype:shellcode-detect; sid:2012090; ...;)
victima:~# nc -l -p 9999
openvas:~# echo -e "\xE8\x00\x00\x00\x00\x0F\x1A" | nc victima.ssi.net 9999
Nota: En caso de que la regla con sid=2012090 no estuviera activada, descometarla y reiniciar Suricata.
fast.log y eve.json de la máquina ids la captura del tráfico generado
/var/log/suricata/eve.log con la información de la alerta registrada al detectar ese tráfico.
Documentación adicional:
Entrega (individual o en parejas):