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/SSI1819 y en Windows en C:/SSI1819.
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/1819/practicas/ y copiarlos en el directorio anterior ($DIR_BASE) para que el script haga el resto.
VBoxManage startvm <nombre MV>_<id>
Contiene un sistema Debian 9 con herramientas gráficas y un entorno gráfico ligero LXDE (Lighweight X11 Desktop Environment) [LXDE].
| login | password |
|---|---|
| root | purple |
| usuario | usuario |
root@datos:~# startx
Dispositivos -> Portapapeles compartido -> bidireccional de la ventana de la máquina virtual.
Redes donde se realizarán los ejercicios:
ids:~/# ping www.esei.uvigo.es openvas:~/# ping www.esei.uvigo.es (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.
ids:~/# echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
suricata y
ids:~/# apt-get update ids:~/# apt-get install suricata suricata-oinkmaster -t stretch-backports
ids:~# suricata-oinkmaster-updater
/etc/suricata/suricata-oinkmaster.conf ]
/etc/suricata/rules y se registrarán 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 the rules to enable or disable ## default-rule-path: /etc/suricata/rules rule-files: - botcc.rules # - botcc.portgrouped.rules - ciarmy.rules - compromised.rules ... - smtp-events.rules # available in suricata sources under rules dir - dns-events.rules # available in suricata sources under rules dir - tls-events.rules # available in suricata sources under rules dir # - modbus-events.rules # available in suricata sources under rules dir # - app-layer-events.rules # available in suricata sources under rules dir # - dnp3-events.rules # available in suricata sources under rules dir # - ntp-events.rules # available in suricata sources under rules dir #classification-file: /etc/suricata/classification.config classification-file: /etc/suricata/rules/classification.config reference-config-file: /etc/suricata/reference.config # threshold-file: /etc/suricata/threshold.config ...
...
##
## Step 3: 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
...
metadata: yes # add L7/applayer fields, flowbit and ot$
...
- http:
extended: yes # enable this for extended logging information
...
- dns:
query: yes # enable logging of DNS queries
answer: yes # enable logging of DNS answers
- 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.josn: 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 5: App Layer Protocol Configuration
enp0s8)
... ## ## Step 4: 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 ... ...
ids:/etc/suricata# systemctl restart suricata.service
eve.json se usará la herramienta jq, un pretty printer para datos en formato JSON
ids:~# apt-get install jq
openvas hacia la máquina victima
openvas~# ping victima.ssi.net
openvas hacia la máquina victima
openvas~# nmap -sV -O victima.ssi.net
ids
ids~# tail -f /var/log/suricata/fast.log ids~# tail -f /var/log/suricata/eve.json (MEJORA: 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.
local.rules con reglas propias
ids:/etc/suricatas# nano /etc/suricata/suricata.yaml ... ## ## Step 2: select the rules to enable or disable ## default-rule-path: /etc/suricata/rules rule-files: - local.rules <----- AÑADIR AQUI - botcc.rules # - botcc.portgrouped.rules - ciarmy.rules - compromised.rules ...
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:
ids:/etc/suricata# systemctl restart suricata.service
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
Nota: La actualización de ambos ficheros no es inmediata.
systemctl restart suricata.service
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
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 suricata.serviceImportante: 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
Descarga de reglas: https://rules.emergingthreats.net/
UserAgent sospechosos.
/etc/suricata/rules/emerging-user_agents.rules
ids:~# leafpad /etc/suricata/rules/emerging-user_agents.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;)
...
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;)
...
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; ...;)
...
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).
victima:~# curl -A "Google page" openvas.ssi.net victima:~# curl -A "Windows 8" openvas.ssi.net victima:~# curl -A "Gemini/2.0" openvas.ssi.net victima:~# curl -A "RLMultySocket" openvas.ssi.net
Nota 1: Asegurar que en la máquina openvas está en ejecución el servidor web Apache (y reniciarlo si es necesario)
openvas:~# systemctl status apache2.service openvas:~# systemctl restart apache2.service (si Apache estaba parado)
Nota 2: También es posible detener el servidor web Apache poner el comando nc en modo escucha en el puerto 80
openvas:~# systemctl stop apache2.service openvas:~# nc -l -p 80
fast.log y eve.json de la máquina ids la captura del tráfico generado
ids:~# leafpad /etc/suricata/rules/emerging-exploit.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
openvas:~# echo -e "'\x00 -\x00-\x00" | nc victima.ssi.net 1433
ids:~# leafpad /etc/suricata/rules/emerging-sql.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.service
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
emerging-shellcode.rules en suricata.yaml y reiniciar IDS.
ids:~# leafpad /etc/suricata/suricata.yaml ... ## ## Step 2: select the rules to enable or disable ## default-rule-path: /etc/suricata/rules rule-files: - local.rules - botcc.rules ... - emerging-scan.rules - emerging-shellcode.rules <--- descomentar aqui - emerging-smtp.rules - emerging-snmp.rules - emerging-sql.rules ... ...
ids:/etc/suricata# systemctl restart suricata.service
ids:~# leafpad /etc/suricata/rules/emerging-shellcode.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
fast.log y eve.json de la máquina ids la captura del tráfico generado
nc o directamente con los servidores y clientes adecuados)
<pendiente>