Detection rules › Elastic
Long Base64 Command Execution via Interactive Shell
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
| Tactic | Techniques |
|---|---|
| Execution | |
| Stealth |
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.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process.parent.executable | eq | /usr/bin/timeout | excludes:process.parent.executable field:"process.parent.executable" value:"/usr/bin/timeout" |
process.working_directory | eq | /workspace | excludes:process.working_directory field:"process.working_directory" value:"/workspace" |
process.parent.args | wildcard | /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_line | match | mitogen:ansible | excludes:process.parent.command_line field:"process.parent.command_line" value:"mitogen:ansible" |
process.parent.executable | wildcard | /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.name | in | claude, claude.exe, cursor | excludes:process.parent.name field:"process.parent.name" value:"claude" field:"process.parent.name" value:"claude.exe" field:"process.parent.name" value:"cursor" |
process.working_directory | in | /workspace/race/claude, /workspace/race/codex | excludes: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.
| Field | Kind | Values | Search |
|---|---|---|---|
event.action | eq |
| field:"EventType" kind:eq value:"exec" |
event.type | eq |
| field:"event.type" kind:eq value:"start" |
process.command_line | wildcard |
| field:"CommandLine" kind:wildcard |
process.interactive | eq |
| field:"process.interactive" kind:eq value:"true" |
process.name | in |
| field:"process_name" kind:in |
process.name | wildcard |
| field:"process_name" kind:wildcard |
process.parent.interactive | eq |
| field:"process.parent.interactive" kind:eq value:"true" |