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>