Detection rules › Elastic

Long Base64 Command Execution via Interactive Shell

Source
github.com/elastic/protections-artifacts

Identifies attempts to execute commands with long base64 encoded command lines via an interactive shell. Adversaries may abuse this technique to execute malicious commands.

MITRE ATT&CK coverage

Rule body

[rule]
description = """
Identifies attempts to execute commands with long base64 encoded command lines via an interactive shell. Adversaries may
abuse this technique to execute malicious commands.
"""
id = "e7b95c3e-9640-4836-85f9-2aaf6c14cebc"
license = "Elastic License v2"
name = "Long Base64 Command Execution via Interactive Shell"
os_list = ["linux"]
version = "1.0.4"

query = '''
process where event.type == "start" and event.action == "exec" and
process.parent.interactive == true and process.interactive == true and
(
  (
    process.name like~ "python*" and
    (
      process.command_line like~ "*b64decode*" or
      (
        process.command_line like "*-c *" and
        process.command_line like~ "*base64*"
      )
    )
  ) or
  (
    process.name like~ ("powershell*", "pwsh*") and
    process.command_line like~ (
      "* -e *", "* -en *", "* -enc *", "* -enco *", "* -encod *", "* -encode *", "* -encoded *",
      "* -encodedcommand *", "*frombase64string*"
    )
  ) or
  (
    process.name like~ ("node*", "deno*") and
    (
      process.command_line like~ ("*atob(*", "*eval(*") or
      (
        process.command_line like~ "*buffer.from*" and
        process.command_line like~ "*base64*"
      )
    )
  ) or
  (
    process.name like~ "php*" and
    process.command_line like~ ("*base64_decode(*", "*convert.base64-decode*")
  ) or
  (
    process.name like~ "perl*" and
    process.command_line like~ ("*MIME::Base64*", "*decode_base64(*")
  ) or
  (
    process.name like~ "ruby*" and
    process.command_line like~ ("*require*base64*", "*Base64.decode64(*")
  ) or
  (
    process.name like~ "java*" and
    process.command_line like~ "*base64*decode(*"
  ) or
  (
    process.name like~ "lua*" and
    process.command_line like~ ("*mime.decode(*base64*", "*mime.unb64(*")
  ) or
  (
    process.name like~ "openssl*" and
    process.command_line like~ ("*base64 -d*", "*-base64*")
  ) or
  (
    process.name in ("base64", "basez", "base64plain", "base64url", "base64mime", "base64pem", "basenc", "base32", "base16") and
    process.command_line like~ ("* -d*", "* --decode*")
  ) or
  (
    process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
    process.command_line like~ ("*base64 -d*", "*base64 --decode*")
  )
) and length(process.command_line) >= 4000 and
not (
  process.parent.executable like (
  "/usr/bin/claude-bin", "/home/*/.local/share/claude/versions/*", "/opt/tm/gemini/node/bin/node",
  "/home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/vendor/portable-ruby/*/bin/ruby",
  "/usr/bin/sudo", "/usr/local/xars/standalone-tools/claude/*", "/usr/bin/su", "/mnt/fast/nobackup/users/*",
  "/opt/local/share/claude/versions/*", "/home/*/.nvm/versions/node/*", "/usr/share/devin-desktop/devin-desktop",
  "/opt/linuxbrew/.linuxbrew/Homebrew/*", "/usr/bin/bwrap", "/root/.local/share/claude/versions/*",
  "/tmp/.mount_*/usr/share/cursor/cursor", "/home/*/.local/share/cursor-agent/versions/*/node",
  "/usr/local/lib/claude-code/claude-bin", "/opt/local/*/dotfolders/.local/share/claude/versions/*",
  "/scratch/user/*/.local/bin/claude-science", "/usr/bin/make", "/home/*/.cache/JetBrains/*/dist-package/node",
  "/home/*/.aimee-code/bin/*", "/opt/*/.local/share/claude/versions/*"
  ) or
  process.parent.name in ("claude", "claude.exe", "cursor") or
  process.parent.args like (
    "/root/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py", "source /home/*/.claude/shell-snapshots/snapshot-*", "claude",
    "/home/*/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py", "/tmp/cmdickens/tmp/eb-*", "/tmp/thangha/tmp/eb-*"
  ) or
  process.parent.command_line like "*mitogen:ansible*" or
  (process.parent.executable == "/usr/bin/timeout" and process.working_directory == "/workspace") or
  process.working_directory in ("/workspace/race/codex", "/workspace/race/claude")
)
'''

min_endpoint_version = "8.3.0"
optional_actions = []
[[actions]]
action = "kill_process"
field = "process.entity_id"
state = 0

[[actions]]
action = "kill_process"
field = "process.parent.entity_id"
state = 0

[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1059"
name = "Command and Scripting Interpreter"
reference = "https://attack.mitre.org/techniques/T1059/"
[[threat.technique.subtechnique]]
id = "T1059.001"
name = "PowerShell"
reference = "https://attack.mitre.org/techniques/T1059/001/"

[[threat.technique.subtechnique]]
id = "T1059.004"
name = "Unix Shell"
reference = "https://attack.mitre.org/techniques/T1059/004/"

[[threat.technique.subtechnique]]
id = "T1059.006"
name = "Python"
reference = "https://attack.mitre.org/techniques/T1059/006/"

[[threat.technique.subtechnique]]
id = "T1059.007"
name = "JavaScript"
reference = "https://attack.mitre.org/techniques/T1059/007/"

[[threat.technique.subtechnique]]
id = "T1059.011"
name = "Lua"
reference = "https://attack.mitre.org/techniques/T1059/011/"



[threat.tactic]
id = "TA0002"
name = "Execution"
reference = "https://attack.mitre.org/tactics/TA0002/"
[[threat]]
framework = "MITRE ATT&CK"
[[threat.technique]]
id = "T1027"
name = "Obfuscated Files or Information"
reference = "https://attack.mitre.org/techniques/T1027/"

[[threat.technique]]
id = "T1140"
name = "Deobfuscate/Decode Files or Information"
reference = "https://attack.mitre.org/techniques/T1140/"


[threat.tactic]
id = "TA0005"
name = "Defense Evasion"
reference = "https://attack.mitre.org/tactics/TA0005/"

[internal]
min_endpoint_version = "8.3.0"

Stages and Predicates

Stage 1: process

process where event.type == "start" and event.action == "exec" and
process.parent.interactive == true and process.interactive == true and
(
  (
    process.name like~ "python*" and
    (
      process.command_line like~ "*b64decode*" or
      (
        process.command_line like "*-c *" and
        process.command_line like~ "*base64*"
      )
    )
  ) or
  (
    process.name like~ ("powershell*", "pwsh*") and
    process.command_line like~ (
      "* -e *", "* -en *", "* -enc *", "* -enco *", "* -encod *", "* -encode *", "* -encoded *",
      "* -encodedcommand *", "*frombase64string*"
    )
  ) or
  (
    process.name like~ ("node*", "deno*") and
    (
      process.command_line like~ ("*atob(*", "*eval(*") or
      (
        process.command_line like~ "*buffer.from*" and
        process.command_line like~ "*base64*"
      )
    )
  ) or
  (
    process.name like~ "php*" and
    process.command_line like~ ("*base64_decode(*", "*convert.base64-decode*")
  ) or
  (
    process.name like~ "perl*" and
    process.command_line like~ ("*MIME::Base64*", "*decode_base64(*")
  ) or
  (
    process.name like~ "ruby*" and
    process.command_line like~ ("*require*base64*", "*Base64.decode64(*")
  ) or
  (
    process.name like~ "java*" and
    process.command_line like~ "*base64*decode(*"
  ) or
  (
    process.name like~ "lua*" and
    process.command_line like~ ("*mime.decode(*base64*", "*mime.unb64(*")
  ) or
  (
    process.name like~ "openssl*" and
    process.command_line like~ ("*base64 -d*", "*-base64*")
  ) or
  (
    process.name in ("base64", "basez", "base64plain", "base64url", "base64mime", "base64pem", "basenc", "base32", "base16") and
    process.command_line like~ ("* -d*", "* --decode*")
  ) or
  (
    process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish", "busybox") and
    process.command_line like~ ("*base64 -d*", "*base64 --decode*")
  )
) and length(process.command_line) >= 4000 and
not (
  process.parent.executable like (
  "/usr/bin/claude-bin", "/home/*/.local/share/claude/versions/*", "/opt/tm/gemini/node/bin/node",
  "/home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/vendor/portable-ruby/*/bin/ruby",
  "/usr/bin/sudo", "/usr/local/xars/standalone-tools/claude/*", "/usr/bin/su", "/mnt/fast/nobackup/users/*",
  "/opt/local/share/claude/versions/*", "/home/*/.nvm/versions/node/*", "/usr/share/devin-desktop/devin-desktop",
  "/opt/linuxbrew/.linuxbrew/Homebrew/*", "/usr/bin/bwrap", "/root/.local/share/claude/versions/*",
  "/tmp/.mount_*/usr/share/cursor/cursor", "/home/*/.local/share/cursor-agent/versions/*/node",
  "/usr/local/lib/claude-code/claude-bin", "/opt/local/*/dotfolders/.local/share/claude/versions/*",
  "/scratch/user/*/.local/bin/claude-science", "/usr/bin/make", "/home/*/.cache/JetBrains/*/dist-package/node",
  "/home/*/.aimee-code/bin/*", "/opt/*/.local/share/claude/versions/*"
  ) or
  process.parent.name in ("claude", "claude.exe", "cursor") or
  process.parent.args like (
    "/root/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py", "source /home/*/.claude/shell-snapshots/snapshot-*", "claude",
    "/home/*/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py", "/tmp/cmdickens/tmp/eb-*", "/tmp/thangha/tmp/eb-*"
  ) or
  process.parent.command_line like "*mitogen:ansible*" or
  (process.parent.executable == "/usr/bin/timeout" and process.working_directory == "/workspace") or
  process.working_directory in ("/workspace/race/codex", "/workspace/race/claude")
)

Exclusions

The rule actively suppresses these predicates.

FieldKindExcluded valuesSearch
process.parent.executableeq/usr/bin/timeoutexcludes:process.parent.executable field:"process.parent.executable" value:"/usr/bin/timeout"
process.working_directoryeq/workspaceexcludes:process.working_directory field:"process.working_directory" value:"/workspace"
process.parent.argswildcard/root/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py, source /home/*/.claude/shell-snapshots/snapshot-*, claude, /home/*/.ansible/tmp/ansible-tmp-*/AnsiballZ_command.py, /tmp/cmdickens/tmp/eb-*, /tmp/thangha/tmp/eb-*excludes:process.parent.args
process.parent.command_linematchmitogen:ansibleexcludes:process.parent.command_line field:"process.parent.command_line" value:"mitogen:ansible"
process.parent.executablewildcard/usr/bin/claude-bin, /home/*/.local/share/claude/versions/*, /opt/tm/gemini/node/bin/node, /home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/vendor/portable-ruby/*/bin/ruby, /usr/bin/sudo, /usr/local/xars/standalone-tools/claude/*, /usr/bin/su, /mnt/fast/nobackup/users/*, /opt/local/share/claude/versions/*, /home/*/.nvm/versions/node/*, /usr/share/devin-desktop/devin-desktop, /opt/linuxbrew/.linuxbrew/Homebrew/*, /usr/bin/bwrap, /root/.local/share/claude/versions/*, /tmp/.mount_*/usr/share/cursor/cursor, /home/*/.local/share/cursor-agent/versions/*/node, /usr/local/lib/claude-code/claude-bin, /opt/local/*/dotfolders/.local/share/claude/versions/*, /scratch/user/*/.local/bin/claude-science, /usr/bin/make, /home/*/.cache/JetBrains/*/dist-package/node, /home/*/.aimee-code/bin/*, /opt/*/.local/share/claude/versions/*excludes:process.parent.executable
process.parent.nameinclaude, claude.exe, cursorexcludes:process.parent.name field:"process.parent.name" value:"claude" field:"process.parent.name" value:"claude.exe" field:"process.parent.name" value:"cursor"
process.working_directoryin/workspace/race/claude, /workspace/race/codexexcludes:process.working_directory field:"process.working_directory" value:"/workspace/race/claude" field:"process.working_directory" value:"/workspace/race/codex"

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
event.actioneq
  • exec
field:"EventType" kind:eq value:"exec"
event.typeeq
  • start
field:"event.type" kind:eq value:"start"
process.command_linewildcard
  • * --decode*
  • * -d*
  • * -e *
  • * -en *
  • * -enc *
  • * -enco *
  • * -encod *
  • * -encode *
  • * -encoded *
  • * -encodedcommand *
  • *-base64*
  • *-c *
  • *Base64.decode64(*
  • *MIME::Base64*
  • *atob(*
  • *b64decode*
  • *base64 --decode*
  • *base64 -d*
  • *base64*
  • *base64*decode(*
  • *base64_decode(*
  • *buffer.from*
  • *convert.base64-decode*
  • *decode_base64(*
  • *eval(*
  • *frombase64string*
  • *mime.decode(*base64*
  • *mime.unb64(*
  • *require*base64*
field:"CommandLine" kind:wildcard
process.interactiveeq
  • true transforms: boolean
field:"process.interactive" kind:eq value:"true"
process.namein
  • base16
  • base32
  • base64
  • base64mime
  • base64pem
  • base64plain
  • base64url
  • basenc
  • basez
  • bash
  • busybox
  • csh
  • dash
  • fish
  • ksh
  • sh
  • tcsh
  • zsh
field:"process_name" kind:in
process.namewildcard
  • deno*
  • java*
  • lua*
  • node*
  • openssl*
  • perl*
  • php*
  • powershell*
  • pwsh*
  • python*
  • ruby*
field:"process_name" kind:wildcard
process.parent.interactiveeq
  • true transforms: boolean
field:"process.parent.interactive" kind:eq value:"true"