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 9999Nota: 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):