Este es el nombre que se usara para las alertas de la regla actual
La severidad que van a atener las alertas de esta regla. Usar la inicial mayuscula. Posibles valores: Low, Medium, High.
Descripcion que aparecera en las alertas
Si existe una solucion conocida para este incidente especificar aqui
Si existe alguna categoria en la que se pueda agrupar la alerta
Si un incidente detectado por esta regla encaja en alguna de las tacticas de ataque
Lista de URLs donde se pueda obtener mas informacion sobre el ataque
Cada que tiempo se debe chequear en segundos
Este campo declara que las iteraciones ocurriran sobre la cache del correlation engine y encierra la definicion de dichas iteraciones. Cuando se usa este campo no se usa el de search y viceversa.
Todas las comparaciones dentro de este campo deben cumplirse para que la regla genere una alerta
Cualquier comparacion dentro de este campo debe cumplirse para que la regla genere una alerta
El field sobre el que se va a aplicar la comparacion.
Un field es una serie de claves separadas por puntos. Puede contener caracteres comodín especiales '*' y '?'. Para acceder a un valor de un slice, use el índice como clave. Para obtener el número de elementos en un slice o para acceder a una ruta secundaria, use el caracter '#'. Los caracteres de punto y comodín se pueden escapar con '\'.
También puede consultar un slice para la primera coincidencia usando #(...), o buscar todas las coincidencias con #(...)#. Se admiten los operadores de comparación ==, !=, <, <=, >, >= y los operadores de coincidencia de patrones simples % y !%
Esta descripcion aplica tambien para [cache | search] -> save -> field
{
"name": {"first": "Tom", "last": "Anderson"},
"age":37,
"children": ["Sara","Alex","Jack"],
"fav.movie": "Deer Hunter",
"friends": [
{"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
{"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
{"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
]
}
"name.last" >> "Anderson"
"age" >> 37
"children" >> ["Sara","Alex","Jack"]
"children.#" >> 3
"children.1" >> "Alex"
"child*.2" >> "Jack"
"c?ildren.0" >> "Sara"
"fav\.movie" >> "Deer Hunter"
"friends.#.first" >> ["Dale","Roger","Jane"]
"friends.1.last" >> "Craig"
"friends.#(last=="Murphy").first" >> "Dale"
"friends.#(last=="Murphy")#.first" >> ["Dale","Jane"]
"friends.#(age>45)#.last" >> ["Craig","Murphy"]
"friends.#(first%"D*").last" >> "Murphy"
"friends.#(first!%"D*").last" >> "Craig"
"friends.#(nets.#(=="fb"))#.first" >> ["Dale","Roger"]
Operador que se va a usar en la comparacion. Ver informacion sobre los operadores en Operadores
Valor con el que se va a comparar el contenido de "cache -> [allOff | oneOff] -> field". En el caso de la segunda iteracion o en adelante podra usarse un alias para usar el contenido de ese alias como value.
Cuanto tiempo hacia atras se va a revisar en los logs en segundos
Cuantos logs minimo deben obtenerse como resultado para que esta regla se cumpla
Fields que se quieren guardar para usar en la siguiente iteracion del ciclo o para completar la informacion de las alertas.
El nombre origial del campo que se quiere almacenar
El alias o nombre con el que se podra acceder al campo
No pueden existir dos o mas alias con el mismo nombre en la misma iteracion.
Los siguientes alias seran usados por el sistema de encontrarse en la ultima iteracion para rellenar los detalles de la alerta:
- Protocol
- SourceUser
- SourceHost
- SourceIP
- SourcePort
- DestinationUser
- DestinationHost
- DestinationIP
- DestinationPort
Otros detalles como la geolocalizacion seran rellenados automaticamente a partir de los alias SourceIP y DestinationIP.
En el caso de que no existan los alias SourceIP o DestinationIP el sistema tratara de generarlos usando SourceHost y DestinationHost y viceversa.
Si algun campo se guarda con los alias AlertName y AlertCategory en la ultima iteracion, se sobreescribira el nombre o la categoria de la alerta con el contenido de esos alias segun corresponda.
Este campo declara que las iteraciones ocurriran sobre Elasticsearch y encierra la definicion de dichas iteraciones. Cuando se usa este campo no se usa el de cache y viceversa.
La query de elasticsearch u opensearch en json format. Recuerde encerrar la query entre comillas simples.
Es verdadero si el contenido del field es exactamente igual al contenido de "value", sencible a las mayusculas
- hello == Hello //False
- hello == hello //True
Es verdadero si el contenido del field es igual al contenido de "value", no sencible a las mayusculas
- hello :: Hello //True
- hello :: hello //True
Es verdadero si el contenido del field es diferente al contenido de "value", sencible a las mayusculas
- hello != Hello //True
- hello != hello //False
Es verdadero si el contenido del field es diferente al contenido de "value", no sencible a las mayusculas
- hello !! Hello //False
- hello !! hello //False
Es verdadero si el contenido de "value" es parte del contenido del field
- "hola mundo" contains "mundo" //True
- "hola mundo" contains "mundos" //False
Es verdadero si el contenido de "value" no es parte del contenido del field
- "hola mundo" not contain "mundo" //False
- "hola mundo" not contain "mundos" //True
Es verdadero si el contenido del field es parte del contenido de "value"
- "mundo" in "hola, mundo, esto, es, una, prueba" //True
- "mundos" in "hola, mundo, esto, es, una, prueba" //False
Es verdadero si el contenido del field no es parte del contenido de "value"
- "mundo" in "hola, mundo, esto, es, una, prueba" //False
- "mundos" in "hola, mundo, esto, es, una, prueba" //True
Es verdadero si el contenido de "value" es prefijo del contenido del field
- "hola mundo" start with "mundo" //False
- "hola mundo" start with "hola" //True
Es verdadero si el contenido de "value" no es prefijo del contenido del field
- "hola mundo" not start with "mundo" //True
- "hola mundo" not start with "hola" //False
Es verdadero si el contenido de "value" es sufijo del contenido del field
- "hola mundo" end with "mundo" //True
- "hola mundo" end with "hola" //False
Es verdadero si el contenido de "value" no es sufijo del contenido del field
- "hola mundo" not end with "mundo" //False
- "hola mundo" not end with "hola" //True
Es verdadero si el contenido del field concuerda con la expresion regular de "value"
- "adam[23]" regexp "^[a-z]+\[[0-9]+\]$" //True
- "hola mundo" regexp "^[a-z]+\[[0-9]+\]$" //False
Es verdadero si el contenido del field no concuerda con la expresion regular de "value"
- "adam[23]" not regexp "^[a-z]+\[[0-9]+\]$" //False
- "hola mundo" not regexp "^[a-z]+\[[0-9]+\]$" //True
Es verdadero si existe el field. El value debe quedar vacio, pues debe existir pero no se va a utilizar
Es verdadero si no existe el field. El value debe quedar vacio, pues debe existir pero no se va a utilizar
Es verdadero si la IP en field esta en el rango de value
Es verdadero si la IP en field no esta en el rango de value
Operadores matematicos clasicos que solo aplican a numeros. Usar solo cuando el contenido del field y el "value" son numericos.
- <
- >
- <=
- >=
Recomendamos usar la cache para las reglas que van a analisar logs en un periodo maximo de 1h.
Recomendamos usar search cuando el periodo de analisis excede 1h o la complejidad de la regla es muy alta y aun no existe forma de hacerla usando la cache.
- name: Windows authentication failure
severity: Low
description: A Windows user was unable to authenticate with the server or workstation more than 5 times.
solution: Refer to NIST guidelines when creating password policies and set account lockout policies after a certain number of failed login attempts to prevent passwords from being guessed. Too strict a policy may create a denial of service condition and render environments un-usable, with all accounts used in the brute force being locked-out.
category: User Account Authentication
tactic: "Brute Force: Password Guessing"
reference:
- "https://attack.mitre.org/techniques/T1110/001/"
frequency: 10
cache:
- allOf:
- field: logx.wineventlog.event_id
operator: "=="
value: 4625
minCount: 1
timeLapse: 15
save:
- field: logx.wineventlog.event_data.TargetUserName
alias: DestinationUser
- field: logx.wineventlog.host.name
alias: DestinationHost
- allOf:
- field: logx.wineventlog.event_id
operator: "=="
value: 4625
- field: logx.wineventlog.event_data.TargetUserName
operator: "=="
value: "{{.DestinationUser}}"
- field: logx.wineventlog.host.name
operator: "=="
value: "{{.DestinationHost}}"
minCount: 5
timeLapse: 60
save:
- field: logx.wineventlog.event_data.TargetUserName
alias: DestinationUser
- field: logx.wineventlog.host.name
alias: DestinationHost
- field: logx.wineventlog.event_data.WorkstationName
alias: SourceHost
- field: logx.wineventlog.event_data.IpAddress
alias: SourceIP
- name: Windows authentication failure
severity: Low
description: A Windows user was unable to authenticate with the server or workstation more than 5 times.
solution: Refer to NIST guidelines when creating password policies and set account lockout policies after a certain number of failed login attempts to prevent passwords from being guessed. Too strict a policy may create a denial of service condition and render environments un-usable, with all accounts used in the brute force being locked-out.
category: User Account Authentication
tactic: "Brute Force: Password Guessing"
reference:
- "https://attack.mitre.org/techniques/T1110/001/"
frequency: 10
search:
- query: '{"size": 500, "query": {"bool": {"must": [{"match_phrase": {"logx.wineventlog.event_id": 4625}}], "filter": [{"range": {"@timestamp": {"gte": "now-15s", "lte": "now"}}}], "should": [], "must_not": []}}}'
minCount: 1
save:
- field: logx.wineventlog.event_data.TargetUserName
alias: DestinationUser
- field: logx.wineventlog.host.name
alias: DestinationHost
- query: '{"size": 500, "query": {"bool": {"must": [{"match_phrase": {"logx.wineventlog.event_id": 4625}}, {"match_phrase": {"logx.wineventlog.event_data.TargetUserName": "{{.DestinationUser}}"}}], "filter": [{"range": {"@timestamp": {"gte": "now-60s", "lte": "now"}}}], "should": [], "must_not": [{"match_phrase": {"logx.wineventlog.event_data.TargetUserName": "{{.DestinationHost}}$"}}]}}}'
minCount: 5
save:
- field: logx.wineventlog.event_data.TargetUserName
alias: DestinationUser
- field: logx.wineventlog.host.name
alias: DestinationHost
- field: logx.wineventlog.event_data.WorkstationName
alias: SourceHost
- field: logx.wineventlog.event_data.IpAddress
alias: SourceIP