Skip to content

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

Siemphony’s repertoire

BITS job creation or notify command set from the command line

Matches the first step of AN0274's chain — a BITS job being created or reconfigured — at process creation, either through bitsadmin.exe carrying one of the switches MITRE lists under its `SuspiciousCliSwitches` knob (/transfer, /addfile, /SetNotifyCmdLine, /resume, /setcustomheaders, /setminretrydelay, used here exactly as MITRE gives them) or through the BITS PowerShell cmdlets, whose names are authored here. Both legs are written with `|windash` where the switch is dash-like, so the slash and dash spellings and the Unicode dashes all match. The analytic's other log sources are deliberately not used, and the reason matters more than the rule: BITS transfers are performed by the BITS service inside `svchost.exe -k netsvcs`, not by the process that queued the job, so a Sysmon EventID 3 or EventID 22 rule keyed on bitsadmin.exe would translate cleanly into every backend and never match a single event. AN0274 says this itself when it describes the notify command being launched from svchost. Two further gaps are structural. A job created through the COM interface directly, which is how tooling more capable than bitsadmin does it, produces no command line at all and is invisible here; and the correlation MITRE actually asks for — job creation, then a transfer, then the notify command firing hours later — needs a timeframe, so the `TimeWindow`, `JobLifetimeThreshold` and `ExpectedUpdateHosts` knobs all have to be applied downstream rather than in this rule. The rule is written in the Sysmon EventID 1 process_creation vocabulary (`Image`, `CommandLine`); the log source AN0274 names is Security 4688, where the same values arrive as `NewProcessName` and need mapping onto `Image` first, and where the command line is only present if both the *Audit Process Creation* policy and the separate *Include command line in process creation events* policy are enabled — neither is on in a default install or in the MS and CIS baselines, and without them this rule returns zero rows, which reads as quiet when it means blind. UNVERIFIED — derived from MITRE ATT&CK DET0098 and never executed against logs.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: BITS job creation or notify command set from the command lineid: dc55b732-9417-4838-ac13-9f5a2d83331astatus: experimentaldescription: |  Matches the first step of AN0274's chain — a BITS job being created or  reconfigured — at process creation, either through bitsadmin.exe carrying one  of the switches MITRE lists under its `SuspiciousCliSwitches` knob  (/transfer, /addfile, /SetNotifyCmdLine, /resume, /setcustomheaders,  /setminretrydelay, used here exactly as MITRE gives them) or through the BITS  PowerShell cmdlets, whose names are authored here. Both legs are written with  `|windash` where the switch is dash-like, so the slash and dash spellings and  the Unicode dashes all match. The analytic's other log sources are  deliberately not used, and the reason matters more than the rule: BITS  transfers are performed by the BITS service inside `svchost.exe -k netsvcs`,  not by the process that queued the job, so a Sysmon EventID 3 or EventID 22  rule keyed on bitsadmin.exe would translate cleanly into every backend and  never match a single event. AN0274 says this itself when it describes the  notify command being launched from svchost. Two further gaps are structural.  A job created through the COM interface directly, which is how tooling more  capable than bitsadmin does it, produces no command line at all and is  invisible here; and the correlation MITRE actually asks for — job creation,  then a transfer, then the notify command firing hours later — needs a  timeframe, so the `TimeWindow`, `JobLifetimeThreshold` and  `ExpectedUpdateHosts` knobs all have to be applied downstream rather than in  this rule. The rule is written in the Sysmon EventID 1 process_creation  vocabulary (`Image`, `CommandLine`); the log source AN0274 names is Security  4688, where the same values arrive as `NewProcessName` and need mapping onto  `Image` first, and where the command line is only present if both the *Audit  Process Creation* policy and the separate *Include command line in process  creation events* policy are enabled — neither is on in a default install or  in the MS and CIS baselines, and without them this rule returns zero rows,  which reads as quiet when it means blind.  UNVERIFIED — derived from MITRE ATT&CK DET0098 and never executed against logs.references:  - https://attack.mitre.org/techniques/T1197  - https://attack.mitre.org/detectionstrategies/DET0098author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.defense-evasion  - attack.persistence  - attack.execution  - attack.t1197logsource:  category: process_creation  product: windowsdetection:  selection_bitsadmin:    Image|endswith: '\bitsadmin.exe'    CommandLine|contains|windash:      - '/transfer'      - '/addfile'      - '/setnotifycmdline'      - '/resume'      - '/setcustomheaders'      - '/setminretrydelay'  selection_ps_host:    Image|endswith:      - '\powershell.exe'      - '\pwsh.exe'  selection_ps_bits:    CommandLine|contains:      - 'Start-BitsTransfer'      - 'Add-BitsFile'      - 'Set-BitsTransfer'      - 'Complete-BitsTransfer'  condition: selection_bitsadmin or (selection_ps_host and selection_ps_bits)falsepositives:  - "Software distribution, patching and imaging that still shells out to bitsadmin /transfer to stage a package. Configuration-management task sequences, vendor updaters and OS deployment scripts all do this, and on any estate running one of them it is the rule's top talker by a clear margin; MITRE's ExpectedUpdateHosts knob is aimed at exactly this, but the destination is not on the process-creation event, so the allowlist has to key on the parent process or the service account instead."  - "Administrators and helpdesk runbooks using Start-BitsTransfer, which is the supported PowerShell way to download a file on a server and appears in a great many internal scripts, module bootstrappers and vendor installation guides."  - "Backup, log-shipping and content-replication jobs that use /resume or /setminretrydelay to nurse a large transfer over a slow or intermittent link, producing repeated matches from the same account on a fixed schedule."level: medium

Sentinel · KQL

Run this as a search.

DeviceProcessEvents| where ((FolderPath endswith "\\bitsadmin.exe" and (ProcessCommandLine contains "-transfer" or ProcessCommandLine contains "/transfer" or ProcessCommandLine contains "–transfer" or ProcessCommandLine contains "—transfer" or ProcessCommandLine contains "―transfer" or ProcessCommandLine contains "-addfile" or ProcessCommandLine contains "/addfile" or ProcessCommandLine contains "–addfile" or ProcessCommandLine contains "—addfile" or ProcessCommandLine contains "―addfile" or ProcessCommandLine contains "-setnotifycmdline" or ProcessCommandLine contains "/setnotifycmdline" or ProcessCommandLine contains "–setnotifycmdline" or ProcessCommandLine contains "—setnotifycmdline" or ProcessCommandLine contains "―setnotifycmdline" or ProcessCommandLine contains "-resume" or ProcessCommandLine contains "/resume" or ProcessCommandLine contains "–resume" or ProcessCommandLine contains "—resume" or ProcessCommandLine contains "―resume" or ProcessCommandLine contains "-setcustomheaders" or ProcessCommandLine contains "/setcustomheaders" or ProcessCommandLine contains "–setcustomheaders" or ProcessCommandLine contains "—setcustomheaders" or ProcessCommandLine contains "―setcustomheaders" or ProcessCommandLine contains "-setminretrydelay" or ProcessCommandLine contains "/setminretrydelay" or ProcessCommandLine contains "–setminretrydelay" or ProcessCommandLine contains "—setminretrydelay" or ProcessCommandLine contains "―setminretrydelay")) or ((FolderPath endswith "\\powershell.exe" or FolderPath endswith "\\pwsh.exe") and (ProcessCommandLine contains "Start-BitsTransfer" or ProcessCommandLine contains "Add-BitsFile" or ProcessCommandLine contains "Set-BitsTransfer" or ProcessCommandLine contains "Complete-BitsTransfer")))

Splunk · SPL

Run this as a search.

index=* ((Image="*\\bitsadmin.exe" AND (CommandLine="*-transfer*" OR CommandLine="*/transfer*" OR CommandLine="*–transfer*" OR CommandLine="*—transfer*" OR CommandLine="*―transfer*" OR CommandLine="*-addfile*" OR CommandLine="*/addfile*" OR CommandLine="*–addfile*" OR CommandLine="*—addfile*" OR CommandLine="*―addfile*" OR CommandLine="*-setnotifycmdline*" OR CommandLine="*/setnotifycmdline*" OR CommandLine="*–setnotifycmdline*" OR CommandLine="*—setnotifycmdline*" OR CommandLine="*―setnotifycmdline*" OR CommandLine="*-resume*" OR CommandLine="*/resume*" OR CommandLine="*–resume*" OR CommandLine="*—resume*" OR CommandLine="*―resume*" OR CommandLine="*-setcustomheaders*" OR CommandLine="*/setcustomheaders*" OR CommandLine="*–setcustomheaders*" OR CommandLine="*—setcustomheaders*" OR CommandLine="*―setcustomheaders*" OR CommandLine="*-setminretrydelay*" OR CommandLine="*/setminretrydelay*" OR CommandLine="*–setminretrydelay*" OR CommandLine="*—setminretrydelay*" OR CommandLine="*―setminretrydelay*")) OR ((Image="*\\powershell.exe" OR Image="*\\pwsh.exe") AND (CommandLine="*Start-BitsTransfer*" OR CommandLine="*Add-BitsFile*" OR CommandLine="*Set-BitsTransfer*" OR CommandLine="*Complete-BitsTransfer*")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(process.executable) LIKE "*\\\\bitsadmin.exe" AND (TO_LOWER(process.command_line) LIKE "*-transfer*" OR TO_LOWER(process.command_line) LIKE "*/transfer*" OR TO_LOWER(process.command_line) LIKE "*–transfer*" OR TO_LOWER(process.command_line) LIKE "*—transfer*" OR TO_LOWER(process.command_line) LIKE "*―transfer*" OR TO_LOWER(process.command_line) LIKE "*-addfile*" OR TO_LOWER(process.command_line) LIKE "*/addfile*" OR TO_LOWER(process.command_line) LIKE "*–addfile*" OR TO_LOWER(process.command_line) LIKE "*—addfile*" OR TO_LOWER(process.command_line) LIKE "*―addfile*" OR TO_LOWER(process.command_line) LIKE "*-setnotifycmdline*" OR TO_LOWER(process.command_line) LIKE "*/setnotifycmdline*" OR TO_LOWER(process.command_line) LIKE "*–setnotifycmdline*" OR TO_LOWER(process.command_line) LIKE "*—setnotifycmdline*" OR TO_LOWER(process.command_line) LIKE "*―setnotifycmdline*" OR TO_LOWER(process.command_line) LIKE "*-resume*" OR TO_LOWER(process.command_line) LIKE "*/resume*" OR TO_LOWER(process.command_line) LIKE "*–resume*" OR TO_LOWER(process.command_line) LIKE "*—resume*" OR TO_LOWER(process.command_line) LIKE "*―resume*" OR TO_LOWER(process.command_line) LIKE "*-setcustomheaders*" OR TO_LOWER(process.command_line) LIKE "*/setcustomheaders*" OR TO_LOWER(process.command_line) LIKE "*–setcustomheaders*" OR TO_LOWER(process.command_line) LIKE "*—setcustomheaders*" OR TO_LOWER(process.command_line) LIKE "*―setcustomheaders*" OR TO_LOWER(process.command_line) LIKE "*-setminretrydelay*" OR TO_LOWER(process.command_line) LIKE "*/setminretrydelay*" OR TO_LOWER(process.command_line) LIKE "*–setminretrydelay*" OR TO_LOWER(process.command_line) LIKE "*—setminretrydelay*" OR TO_LOWER(process.command_line) LIKE "*―setminretrydelay*")) OR ((TO_LOWER(process.executable) LIKE "*\\\\powershell.exe" OR TO_LOWER(process.executable) LIKE "*\\\\pwsh.exe") AND (TO_LOWER(process.command_line) LIKE "*start-bitstransfer*" OR TO_LOWER(process.command_line) LIKE "*add-bitsfile*" OR TO_LOWER(process.command_line) LIKE "*set-bitstransfer*" OR TO_LOWER(process.command_line) LIKE "*complete-bitstransfer*")))

Wazuh · XML rule

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

<group name="sigma,windows,process_creation,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <!-- 2 rules: the Sigma condition ORs across different fields,       which one rule cannot express. Any one matching is a hit. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)\\bitsadmin\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(-transfer|/transfer|–transfer|—transfer|―transfer|-addfile|/addfile|–addfile|—addfile|―addfile|-setnotifycmdline|/setnotifycmdline|–setnotifycmdline|—setnotifycmdline|―setnotifycmdline|-resume|/resume|–resume|—resume|―resume|-setcustomheaders|/setcustomheaders|–setcustomheaders|—setcustomheaders|―setcustomheaders|-setminretrydelay|/setminretrydelay|–setminretrydelay|—setminretrydelay|―setminretrydelay)</field>    <description>BITS job creation or notify command set from the command line (1/2)</description>    <mitre>      <id>T1197</id>    </mitre>  </rule>   <rule id="100001" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)(\\powershell\.exe$|\\pwsh\.exe$)</field>    <field name="CommandLine" type="pcre2">(?i)(Start-BitsTransfer|Add-BitsFile|Set-BitsTransfer|Complete-BitsTransfer)</field>    <description>BITS job creation or notify command set from the command line (2/2)</description>    <mitre>      <id>T1197</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.