Javier Marcos - Detección de amenazas a escala con osquery [rooted2019]

1,133 views 61 slides Apr 03, 2019
Slide 1
Slide 1 of 61
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61

About This Presentation

Javier Marcos - Detección de amenazas a escala con osquery [rooted2019]


Slide Content

Detección de
amenazas a escala
con osquery
Javier Marcos
@javutin

▪Detección / IR / Ingeniería de Seguridad

▪Open source contributor (github.com/javuto)

▪(ex)

▪(ahora)


$ whoami

Parte 1: Desmitificando osquery
▪¿Qué es osquery?
▪Introducción al CLI: osqueryi
▪Tablas en osquery
▪Ejemplos
Agenda

Agenda
Parte 2: Uso de osquery a escala
▪¿Necesitas un demonio? osqueryd!
▪Configuración y flags
▪Scheduled queries y packs
▪Rendimiento

Agenda
Parte 3: Usando la API remota
▪¿Que es un endpoint TLS?
▪Configuración y flags
▪On-demand queries
▪File carving
▪Usando un TLS endpoint

¿Qué es osquery?
▪Exploración de tu sistema operativo usando SQL

▪Monitorización basada en sistemas HIDS

?????? 100% uso de OS API, sin forks de execve ??????
●https://osquery.io
●https://github.com/facebook/osquery

¿Quien usa osquery?

¿Por qué osquery?
▪¿Qué hosts corporativos tienen instalada la
extensión de navegador abc123?

▪¿Cuántos descriptores de archivos se abrieron
ayer por hora en los sistemas de producción?

▪¿Hay alguna máquina enrutando VPN a LAN?

¿Por qué usar SQL?
▪Los conceptos básicos de SQL son universales

▪El lenguaje SQL es muy popular entre devs y
administradores de sistema
SELECT pid,name,uid FROM processes

¿Por qué usar SQL?
SELECT pid,name,uid FROM processes
[concepto]

¿Por qué usar SQL?
SELECT pid,name,uid FROM processes
[atributos] [concepto]

¿Por qué usar SQL?
SELECT pid,name,uid FROM processes
WHERE uid != 0
[restricciones]
[concepto][atributos]

¿Por qué usar SQL?
WHERE uid != 0
[join]
JOIN users ON processes.uid=users.uid
SELECT pid,name,uid FROM processes
[concepto][atributos]
[restricciones]

osqueryi
▪CLI y shell interactiva para lanzar consultas y
ver resultados

▪Para explorar un host local y manualmente

▪Una vez definidas las consultas, se pasa a la
automatización
https://osquery.readthedocs.io/en/stable/introduction/using-osqueryi/

osquery> .help
Welcome to the osquery shell. Please explore your OS!
You are connected to a transient 'in-memory' virtual database.

.all [TABLE] Select all from a table
.bail ON|OFF Stop after hitting an error
.echo ON|OFF Turn command echo on or off
.exit Exit this program
.features List osquery's features and their statuses
.headers ON|OFF Turn display of headers on or off
.help Show this message


osqueryi basics

=> crontab
=> curl
=> curl_certificate
=> deb_packages
=> device_file
=> device_hash
=> device_partitions
=> disk_encryption
=> dns_resolvers
=> docker_container_labels
=> docker_container_mounts
=> docker_container_networks
=> docker_container_ports

...
osquery> .tables
=> acpi_tables
=> apt_sources
=> arp_cache
=> augeas
=> authorized_keys
=> block_devices
=> carbon_black_info
=> carves
=> chrome_extensions
=> cpu_time
=> cpuid
osqueryi basics

osqueryi basics
osquery> pragma table_info(‘system_info’);
+-----+--------------------+---------+---------+------------+----+
| cid | name | type | notnull | dflt_value | pk |
+-----+--------------------+---------+---------+------------+----+
| 0 | hostname | TEXT | 0 | | 0 |
| 1 | uuid | TEXT | 0 | | 0 |
| 2 | cpu_type | TEXT | 0 | | 0 |
| 3 | cpu_subtype | TEXT | 0 | | 0 |
| 4 | cpu_brand | TEXT | 0 | | 0 |
| 5 | cpu_physical_cores | INTEGER | 0 | | 0 |
| 6 | cpu_logical_cores | INTEGER | 0 | | 0 |
| 7 | cpu_microcode | TEXT | 0 | | 0 |

Tablas de osquery
▪229 tablas en la versión 3.3.2

▪4 plataformas diferentes
▫Mac, windows, linux y freebsd

▪Datos fáciles de recoger y correlar
https://osquery.io/schema/3.3.2

https://osquery.io/schema/3.3.2
▪acpi_tables
▪arp_cache
▪apps
▪authorized_keys
▪autoexec
▪battery
▪block_devices
▪browser_plugins
▪certificates
▪cpu_time
...
▪cpu_info
▪crontab
▪cups_jobs
▪deb_packages
▪disk_info
▪dns_resolvers
▪docker_info
▪drivers
▪etc_hosts
▪elf_info
...
▪etc_services
▪event_taps
▪file
▪iptables
▪kernel_info
▪known_hosts
▪launchd
▪mounts
▪preferences
...
¡Y muchas más!
Tablas de osquery

Ejecución de tablas al invocar
osquery> SELECT datetime FROM time;
+----------------------+
| datetime |
+----------------------+
| 2019-03-01T04:16:07Z |
+----------------------+
...

Ejecución de tablas al invocar
osquery> SELECT datetime FROM time;
+----------------------+
| datetime |
+----------------------+
| 2019-03-01T04:20:18Z |
+----------------------+
...

Ejecución de tablas al invocar

SELECT datetime FROM time;
2019-03-01T04:16:07Z
...
SELECT datetime FROM time;
2019-03-01T04:20:18Z

Tablas con parámetros
osquery> SELECT directory FROM file WHERE path =
‘/etc/issue’;

+-----------+
| directory |
+-----------+
| /etc |
+-----------+

Tablas con parámetros
osquery> SELECT md5 FROM file JOIN hash USING
(path) WHERE path = ‘/etc/issue’;

+----------------------------------+
| md5 |
+----------------------------------+
| b954418e6a50d4d4cb8f02776d867550 |
+----------------------------------+

Ejemplos de tablas básicas
osquery> SELECT * FROM rpm_packages;

osquery> SELECT * FROM users;

osquery> SELECT * FROM kernel_modules;

osquery> SELECT * FROM startup_items;

¡Ejemplos!
▪¿Cuál es el hostname del sistema?

▪¿Qué usuarios hay en el sistema?

▪¿Qué procesos están corriendo?

¡Ejemplos!
▪¿Cuál es el hostname del sistema?

▪¿Qué usuarios hay en el sistema?

▪¿Qué procesos están corriendo?
SELECT hostname FROM system_info;

¡Ejemplos!
▪¿Cuál es el hostname del sistema?

▪¿Qué usuarios hay en el sistema?

▪¿Qué procesos están corriendo?
SELECT hostname FROM system_info;
SELECT uid, username FROM users;

¡Ejemplos!
▪¿Cuál es el hostname del sistema?

▪¿Qué usuarios hay en el sistema?

▪¿Qué procesos están corriendo?
SELECT hostname FROM system_info;
SELECT uid, username FROM users;
SELECT pid, name, path FROM processes;

¡Ejemplos!
▪¿Cuál es el usuario y la shell de los procesos
que están corriendo?

¡Ejemplos!
▪¿Cuál es el usuario y la shell de los procesos
que están corriendo?
SELECT p.pid, p.name, p.path, u.username,
u.shell FROM processes AS p JOIN users AS u ON
p.uid = u.uid;

El demonio osqueryd
▪Init, systemd, launchd, servicio windows

▪Ejecución de queries programadas

▪Logs de estado y resultados

▪Muchísimas opciones de configuración
https://osquery.readthedocs.io/en/stable/introduction/using-osqueryd/

El demonio osqueryd
casos de uso para respuesta a incidentes
gestión centralizada (backend)
sistema operativo, usuarios, servicios
configuración logging
osqueryd

osquery.flags
▪Flag para inicializar la configuración

$ osqueryd --flagfile /etc/osquery/osquery.flags

▪Muy común usar chef/puppet para flags

$ osqueryd/osqueryi --help

osquery.conf - options
$ osquery[d-i] --config_path /path/to/osquery.conf
"options": {
"config_plugin": "filesystem",
"logger_plugin": "filesystem",
"schedule_splay_percent": "10",
"utc": "true"
...
}

osquery.conf - decorators
"decorators": {
"load": [
"SELECT uuid FROM system_info;"
],
"always": [
"SELECT pid FROM osquery_info;"
]
}

Scheduled queries
query: La consulta que se va a ejecutar

interval: Frecuencia de ejecución en segundos

platform: Limita la consulta a ésta plataforma

shard: Ejecuta la consulta en éste % de hosts

snapshot: Devuelve todos los resultados siempre

osquery.conf - schedule
"schedule": {
"example_query1": {
"query": "SELECT * FROM users;",
"interval": 60
},
"example_query2": {
"query": "SELECT * FROM processes;",
"interval": 3600
},
}

Query packs
query: La consulta que se va a ejecutar

interval: Frecuencia de ejecución en segundos

version: Versión de osquery para ejecutar

description: Descripción de la consulta

value: Detalles de por qué ésta consulta

osquery.conf - packs
"packs": {
"osquery-monitoring": "osquery-monitoring.conf",
"incident-response": "incident-response.conf",
"it-compliance": "it-compliance.conf",
"osx-attacks": "osx-attacks.conf",
"vuln-management": "vuln-management.conf"
"hardware-monitoring": "hardware-monitoring.conf",
"ossec-rootkit": "ossec-rootkit.conf",
"windows-hardening": "windows-hardening.conf",
"windows-attacks": "windows-attacks.conf"
},

osquery.conf - packs
// incident-response.conf
"queries": {
"launchd": {
"query" : "select * from launchd;",
"interval" : "3600",
"platform" : "darwin",
"version" : "1.4.5",
},
...

osqueryd watchdog
▪Por defecto osqueryd corre en un único hilo

▪Periódicamente se analiza el uso de CPU/memoria

▪reiniciar si: > 60% uso de CPU durante 9 s

▪reiniciar si: > 200M memoria asignada

API remota de osqueryd
▪Algunas opciones de endpoint TLS disponibles

➔Uptycs
➔Kolide
➔CB LiveOps
➔AlienVault
➔Zentral
➔Doorman
➔SGT
➔Zentral
➔Windmill
➔Kolide

API remota de osqueryd
▪Plugin TLS permite la gestión centralizada de osquery

--tls_client_cert Optional path to a TLS client-auth PEM certificate

--tls_client_key Optional path to a TLS client-auth PEM private key

--tls_hostname TLS/HTTPS hostname for Config, Logger, and Enroll

--tls_server_certs Optional path to a TLS server PEM certificate(s)
bundle

Endpoint TLS para osquery
...
Resultados
Logs
Configuración
TLS endpoint

Endpoint TLS básico
▪Enroll

POST /path/to/enroll

▪Configuración

POST /path/to/config
https://osquery.readthedocs.io/en/stable/deployment/remote/
▪Logs

POST /path/to/log

▪Extras
(On-demand queries)
(File carving)
...

▪Consultas de osquery en tiempo (casi) real

➔Los resultados se reciben inmediatamente

➔Muy útil en investigaciones


TLS endpoint: On-demand queries

// on-demand queries osquery flags

--disable_distributed=false
--distributed_interval=10
--distributed_plugin=tls
--distributed_tls_max_attempts=3
--distributed_tls_read_endpoint=/path/to/read
--distributed_tls_write_endpoint=/path/to/write
TLS endpoint: On-demand queries

TLS Endpoint: File carving
▪Extracción de ficheros a través de osquery

➔Recibidos inmediatamente

➔Ficheros o directorios completos


SELECT * FROM carves WHERE carve=1 AND path LIKE
'/home/user/%%';

TLS Endpoint: File carving
// file carving osquery flags

--disable_carver=false
--carver_disable_function=false
--carver_start_endpoint=/path/to/start
--carver_continue_endpoint=/path/to/continue

osctrl: Arquitectura de servicios
Resultados
Logs
Configuración
osctrl-tls
osctrl-admin
operator

▪Servicio TLS endpoint para nodos de osquery

▪En internet sin autenticación

▪Pensado para escalar proporcionalmente
osctrl-tls
Logs / Resultados
Configuración

osctrl-admin
▪Servicio de administración del TLS endpoint

▪Comunicación con osctrl-tls mediante DB

▪Puede estar en una red privada, detrás de VPN
osctrl-tlsosctrl-admin operator

osctrl-cli
▪Línea de comandos para osctrl

▪Utilidad para evitar acciones directas en la DB

▪Pensada para automatizar tareas

Demostración!

osctrl TODO
▪Loggers para ELK, Kinesis, Kafka…
▫Idealmente con un sistema modular

▪Soporte de s3 para file carving

▪Caché con Redis para osctrl-tls

▪Documentación y tests

Bonus: osquery avanzado
▪FIM (File Integrity Monitoring)

▪Tablas de eventos / audit

▪Extensiones de osquery (C/C++, Go, Python)

▪Tablas custom con ATC (Automated Table
Construction)

Documentación osquery
▪Wiki
https://osquery.readthedocs.io

▪Código
https://osquery.io


https://osquery-slack.herokuapp.com

¿Alguna pregunta?

¡Muchas gracias!
@javutin @javuto