Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

Shell one-liner encodes data and pipes it to a network transfer tool

Matches AN0303's Linux observable: a single shell invocation that both names a binary-to-text or compression encoder and a network transfer tool, which is how a piped one-liner (`... | base64 | curl -d @- http://...`) actually surfaces on the process_creation category — auditd's own type=EXECVE record carries only one program's argv, so this rule matches the interpreter's own record, written when a caller passes the whole pipeline as a single string to `sh -c`/`bash -c`, as cron, a downloader stage, a configuration-management task or a webshell all commonly do. It cannot see the equivalent typed interactively at a live shell, or run from a script file invoked by path, where the encoder and the transfer tool are separate child processes with no shared field to join across. Prerequisite: auditd ships no execve rule by default, so without an explicit -a always,exit -F arch=b64 -S execve there is no process_creation telemetry on the host at all and this rule returns zero rows regardless of what ran — the silence means the syscall is not being recorded, not that the host is quiet. This is deliberately distinct from the technique's Windows sub-techniques T1132.001 and T1132.002, both scoped to PowerShell Script Block Logging and 4104 events that do not exist on Linux, and from T1048.001's openssl/gpg selectors, which match encryption keywords rather than encoding-and-transfer in one line. Of AN0303's two knobs, UserContext is the usable one here — scoping out build and orchestration service accounts is the tuning that removes most of the noise below — while TimeWindow assumes the encode and the transfer arrive as two correlatable events, which is exactly what this rule collapses into a single record and therefore cannot apply. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0108, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.

detection.yml

title: Shell one-liner encodes data and pipes it to a network transfer toolid: ae1169e5-82cb-4aef-b6c6-e1aaaff773f1status: experimentaldescription: |  Matches AN0303's Linux observable: a single shell invocation that both names a  binary-to-text or compression encoder and a network transfer tool, which is how  a piped one-liner (`... | base64 | curl -d @- http://...`) actually surfaces on  the process_creation category — auditd's own type=EXECVE record carries only  one program's argv, so this rule matches the interpreter's own record, written  when a caller passes the whole pipeline as a single string to `sh -c`/`bash -c`,  as cron, a downloader stage, a configuration-management task or a webshell all  commonly do. It cannot see the equivalent typed interactively at a live shell,  or run from a script file invoked by path, where the encoder and the transfer  tool are separate child processes with no shared field to join across.  Prerequisite: auditd ships no execve rule by default, so without an explicit  -a always,exit -F arch=b64 -S execve there is no process_creation telemetry on  the host at all and this rule returns zero rows regardless of what ran — the  silence means the syscall is not being recorded, not that the host is quiet.  This is deliberately distinct from the technique's Windows sub-techniques  T1132.001 and T1132.002, both scoped to PowerShell Script Block Logging and  4104 events that do not exist on Linux, and from T1048.001's openssl/gpg  selectors, which match encryption keywords rather than encoding-and-transfer in  one line. Of AN0303's two knobs, UserContext is the usable one here — scoping  out build and orchestration service accounts is the tuning that removes most of  the noise below — while TimeWindow assumes the encode and the transfer arrive  as two correlatable events, which is exactly what this rule collapses into a  single record and therefore cannot apply.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0108, not hand-written and not tested by its author. Any lab result is on this rule's own page.references:  - https://attack.mitre.org/techniques/T1132  - https://attack.mitre.org/detectionstrategies/DET0108author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.command-and-control  - attack.t1132logsource:  category: process_creation  product: linuxdetection:  selection_shell:    Image|endswith:      - '/bash'      - '/sh'      - '/dash'  selection_encode:    CommandLine|contains:      - 'base64'      - 'gzip'      - 'xxd'      - 'uuencode'      - 'b64encode'  selection_transfer:    CommandLine|contains:      - 'curl'      - 'wget'      - 'netcat'      - ' nc '  condition: selection_shell and selection_encode and selection_transferfalsepositives:  - "CI/CD build and deployment one-liners that base64- or gzip-encode an artifact and curl it to an internal registry or API — this is a routine pattern in container build scripts and deploy hooks and is the single largest source of noise in build infrastructure."  - "Configuration-management and orchestration tooling — Ansible, SaltStack, Chef — which runs provisioning tasks as sh -c \"<whole line>\" as its normal mechanism, the exact invocation shape this rule keys on. Any task that both encodes something and curls or wgets it matches identically to a build one-liner."  - "Shell installer scripts that fetch a payload with curl or wget and pipe it through base64 --decode before unpacking it, when the whole pipeline is passed as one sh -c or bash -c argument (a Dockerfile RUN step, a cron line, a CM shell task). The direction is inbound, not exfiltration, but the vocabulary is identical."  - "Diagnostic and support-bundle scripts that gzip a log collection and upload it with curl or wget to a vendor endpoint, again only where the collection and upload share one sh -c line rather than living in a script file the agent invokes by path."level: medium

Sentinel · KQL

Run this as a search.

DeviceProcessEvents| where (((FolderPath endswith "/bash" or FolderPath endswith "/sh" or FolderPath endswith "/dash") and (ProcessCommandLine contains "base64" or ProcessCommandLine contains "gzip" or ProcessCommandLine contains "xxd" or ProcessCommandLine contains "uuencode" or ProcessCommandLine contains "b64encode")) and (ProcessCommandLine contains "curl" or ProcessCommandLine contains "wget" or ProcessCommandLine contains "netcat" or ProcessCommandLine contains " nc "))

Splunk · SPL

Run this as a search.

index=* (((Image="*/bash" OR Image="*/sh" OR Image="*/dash") AND (CommandLine="*base64*" OR CommandLine="*gzip*" OR CommandLine="*xxd*" OR CommandLine="*uuencode*" OR CommandLine="*b64encode*")) AND (CommandLine="*curl*" OR CommandLine="*wget*" OR CommandLine="*netcat*" OR CommandLine="* nc *"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (((TO_LOWER(process.executable) LIKE "*/bash" OR TO_LOWER(process.executable) LIKE "*/sh" OR TO_LOWER(process.executable) LIKE "*/dash") AND (TO_LOWER(process.command_line) LIKE "*base64*" OR TO_LOWER(process.command_line) LIKE "*gzip*" OR TO_LOWER(process.command_line) LIKE "*xxd*" OR TO_LOWER(process.command_line) LIKE "*uuencode*" OR TO_LOWER(process.command_line) LIKE "*b64encode*")) AND (TO_LOWER(process.command_line) LIKE "*curl*" OR TO_LOWER(process.command_line) LIKE "*wget*" OR TO_LOWER(process.command_line) LIKE "*netcat*" OR TO_LOWER(process.command_line) LIKE "* nc *"))

Wazuh · XML rule

Deploy to your manager — this is a rule, not a search.

<group name="sigma,linux,process_creation,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for linux so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)(/bash$|/sh$|/dash$)</field>    <field name="CommandLine" type="pcre2">(?i)(base64|gzip|xxd|uuencode|b64encode)</field>    <field name="CommandLine" type="pcre2">(?i)(curl|wget|netcat| nc )</field>    <description>Shell one-liner encodes data and pipes it to a network transfer tool</description>    <mitre>      <id>T1132</id>    </mitre>  </rule></group>

Verdicts · reactions · comments

Community

Verdicts from engineers who actually deployed it, and the conversation around it.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.

Log in to report a verdict.

Log in to join the discussion.

No comments yet. Someone who deploys this will have something to say about it.