Detection rules › Kusto

Detect Suspicious Commands Initiated by Webserver Processes

Status
available
Severity
high
Time window
1h
Group by
DeviceId, DeviceName
Source
github.com/Azure/Azure-Sentinel

This query was originally published in the threat analytics report, Operation Soft Cell. Operation Soft Cell is a series of campaigns targeting users' call logs at telecommunications providers throughout the world. These attacks date from as early as 2012. Operation Soft Cell operators sometimes use legitimate web server processes to launch commands, especially for network discovery and user/owner discovery. The following query detects activity of this kind. Reference - https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers

MITRE ATT&CK coverage

Telemetry coverage

Rule body

id: fa2f7d8a-6726-465a-aa72-6f6e3d4c99d7
name: Detect Suspicious Commands Initiated by Webserver Processes
description: |
  This query was originally published in the threat analytics report, Operation Soft Cell.
  Operation Soft Cell is a series of campaigns targeting users' call logs at telecommunications providers throughout the world. These attacks date from as early as 2012.
  Operation Soft Cell operators sometimes use legitimate web server processes to launch commands, especially for network discovery and user/owner discovery. The following query detects activity of this kind.
  Reference - https://www.cybereason.com/blog/operation-soft-cell-a-worldwide-campaign-against-telecommunications-providers
severity: High
status: Available
requiredDataConnectors:
  - connectorId: MicrosoftThreatProtection
    dataTypes:
      - DeviceProcessEvents
queryFrequency: 1h
queryPeriod: 1h
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Execution
  - DefenseEvasion
  - Discovery
relevantTechniques:
  - T1059
  - T1574
  - T1087
  - T1082
tags:
  - Operation Soft Cell
  - Webserver Process
  - Discovery
query: |
  // Suspicious commands launched by web server processes
  DeviceProcessEvents 
  | where (((InitiatingProcessParentFileName in("w3wp.exe", "beasvc.exe",
      "httpd.exe") or InitiatingProcessParentFileName startswith "tomcat")
      or InitiatingProcessFileName in("w3wp.exe", "beasvc.exe", "httpd.exe") or
      InitiatingProcessFileName startswith "tomcat"))
      and FileName in~('cmd.exe', 'powershell.exe')
  | where ProcessCommandLine contains '%temp%'
      or ProcessCommandLine has 'wget'
      or ProcessCommandLine has 'whoami'
      or ProcessCommandLine has 'certutil'
      or ProcessCommandLine has 'systeminfo'
      or ProcessCommandLine has 'ping'
      or ProcessCommandLine has 'ipconfig'
      or ProcessCommandLine has 'timeout'
  | summarize
      take_any(FileName),
      make_set(ProcessCommandLine, 100000),
      take_any(InitiatingProcessFileName),
      take_any(InitiatingProcessParentFileName)
      by DeviceId, DeviceName
  | extend HostName = iff(DeviceName has '.', substring(DeviceName, 0, indexof(DeviceName, '.')), DeviceName)
  | extend DnsDomain = iff(DeviceName has '.', substring(DeviceName, indexof(DeviceName, '.') + 1), "")
entityMappings:
  - entityType: Host
    fieldMappings:
      - identifier: FullName
        columnName: DeviceName
      - identifier: HostName
        columnName: HostName
      - identifier: DnsDomain
        columnName: DnsDomain
version: 1.0.0
kind: Scheduled

Stages and Predicates

Stage 1: source

DeviceProcessEvents

Stage 2: where

| where (((InitiatingProcessParentFileName in("w3wp.exe", "beasvc.exe",
    "httpd.exe") or InitiatingProcessParentFileName startswith "tomcat")
    or InitiatingProcessFileName in("w3wp.exe", "beasvc.exe", "httpd.exe") or
    InitiatingProcessFileName startswith "tomcat"))
    and FileName in~('cmd.exe', 'powershell.exe')

Stage 3: where

| where ProcessCommandLine contains '%temp%'
    or ProcessCommandLine has 'wget'
    or ProcessCommandLine has 'whoami'
    or ProcessCommandLine has 'certutil'
    or ProcessCommandLine has 'systeminfo'
    or ProcessCommandLine has 'ping'
    or ProcessCommandLine has 'ipconfig'
    or ProcessCommandLine has 'timeout'

Stage 4: summarize

| summarize
    take_any(FileName),
    make_set(ProcessCommandLine, 100000),
    take_any(InitiatingProcessFileName),
    take_any(InitiatingProcessParentFileName)
    by DeviceId, DeviceName

Stage 5: extend

| extend HostName = iff(DeviceName has '.', substring(DeviceName, 0, indexof(DeviceName, '.')), DeviceName)
HostName =
ifDeviceName has "."substring(DeviceName, 0, indexof(DeviceName, '.'))
elseDeviceName

Stage 6: extend

| extend DnsDomain = iff(DeviceName has '.', substring(DeviceName, indexof(DeviceName, '.') + 1), "")
DnsDomain =
ifDeviceName has "."substring(DeviceName, (indexof(DeviceName, '.') + 1))
else""

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
FileNamein
  • cmd.exe
  • powershell.exe corpus 3 (kusto 3)
field:"file_name" kind:in
InitiatingProcessFileNamein
  • beasvc.exe
  • httpd.exe corpus 2 (elastic 2)
  • w3wp.exe corpus 8 (elastic 8)
field:"parent_process_name" kind:in
InitiatingProcessFileNamestarts_with
  • tomcat
field:"parent_process_name" kind:starts_with value:"tomcat"
InitiatingProcessParentFileNamein
  • beasvc.exe
  • httpd.exe
  • w3wp.exe
field:"GrandParentImage" kind:in
InitiatingProcessParentFileNamestarts_with
  • tomcat
field:"GrandParentImage" kind:starts_with value:"tomcat"
ProcessCommandLinecontains
  • %temp% corpus 16 (sigma 13, chronicle 2, kusto 1)
field:"CommandLine" kind:contains value:"%temp%"
ProcessCommandLinematch
  • certutil transforms: term corpus 12 (sigma 10, kusto 2)
  • ipconfig transforms: term corpus 4 (sigma 3, kusto 1)
  • ping transforms: term corpus 6 (sigma 4, splunk 1, kusto 1)
  • systeminfo transforms: term corpus 6 (sigma 4, splunk 1, kusto 1)
  • timeout transforms: term
  • wget transforms: term corpus 13 (sigma 8, elastic 3, splunk 1, kusto 1)
  • whoami transforms: term corpus 16 (sigma 9, elastic 4, splunk 2, kusto 1)
field:"CommandLine" kind:match

Output fields

These fields are emitted when the rule matches.

FieldSource
DeviceIdsummarize
DeviceNamesummarize
HostNameextend
DnsDomainextend