Detection rules › Kusto

C2-NamedPipe

Status
available
Severity
high
Time window
1d
Source
github.com/Azure/Azure-Sentinel

Detects the creation of a named pipe used by known APT malware. Reference - https://docs.microsoft.com/openspecs/windows_protocols/ms-wpo/4de75e21-36fd-440a-859b-75accc74487c

MITRE ATT&CK coverage

TacticTechniques
Command & Control

Telemetry coverage

Rule body

id: 7ce00cba-f76f-4026-ab7f-7e4f1b67bd18
name: C2-NamedPipe
description: |
  Detects the creation of a named pipe used by known APT malware.
  Reference - https://docs.microsoft.com/openspecs/windows_protocols/ms-wpo/4de75e21-36fd-440a-859b-75accc74487c
severity: High
status: Available
requiredDataConnectors:
  - connectorId: MicrosoftThreatProtection
    dataTypes:
      - DeviceEvents
queryFrequency: 1d
queryPeriod: 1d
triggerOperator: gt
triggerThreshold: 0
tactics:
  - CommandAndControl
relevantTechniques:
  - T1105
tags:
  - APT Malware
query: |
  // this is what should be constantly tweaked with default C2 framework names, search uses has_any (wildcard)
  let badPipeNames = pack_array(
      '\\psexec',                                     // PSexec default pipe
      '\\paexec',                                     // PSexec default pipe
      '\\remcom',                                     // PSexec default pipe
      '\\csexec',                                     // PSexec default pipe
      '\\isapi_http',                                 // Uroburos Malware Named Pipe
      '\\isapi_dg',                                   // Uroburos Malware Named Pipe
      '\\isapi_dg2',                                  // Uroburos Malware Named Pipe
      '\\sdlrpc',                                     // Cobra Trojan Named Pipe http://goo.gl/8rOZUX
      '\\ahexec',                                     // Sofacy group malware
      '\\winsession',                                 // Wild Neutron APT malware https://goo.gl/pivRZJ
      '\\lsassw',                                     // Wild Neutron APT malware https://goo.gl/pivRZJ
      '\\46a676ab7f179e511e30dd2dc41bd388',           // Project Sauron https://goo.gl/eFoP4A
      '\\9f81f59bc58452127884ce513865ed20',           // Project Sauron https://goo.gl/eFoP4A
      '\\e710f28d59aa529d6792ca6ff0ca1b34',           // Project Sauron https://goo.gl/eFoP4A
      '\\rpchlp_3',                                   // Project Sauron https://goo.gl/eFoP4A - Technical Analysis Input
      '\\NamePipe_MoreWindows',                       // US-CERT Alert - RedLeaves https://www.us-cert.gov/ncas/alerts/TA17-117A
      '\\pcheap_reuse',                               // Pipe used by Equation Group malware 77486bb828dba77099785feda0ca1d4f33ad0d39b672190079c508b3feb21fb0
      '\\gruntsvc',                                   // Covenant default named pipe
      '\\583da945-62af-10e8-4902-a8f205c72b2e',       // SolarWinds SUNBURST malware report https://www.fireeye.com/blog/threat-research/2020/12/evasive-attacker-leverages-solarwinds-supply-chain-compromises-with-sunburst-backdoor.html
      '\\bizkaz',                                     // Snatch Ransomware https://thedfirreport.com/2020/06/21/snatch-ransomware/
      '\\atctl',                                      // https://www.virustotal.com/#/file/a4ddb2664a6c87a1d3c5da5a5a32a5df9a0b0c8f2e951811bd1ec1d44d42ccf1/detection
      '\\userpipe',                                   // ruag apt case
      '\\iehelper',                                   // ruag apt case
      '\\sdlrpc',                                     // project cobra https://www.gdatasoftware.com/blog/2015/01/23926-analysis-of-project-cobra
      '\\comnap',                                     // https://www.gdatasoftware.com/blog/2015/01/23926-analysis-of-project-cobra
      '\\lsadump',                                    // Cred Dump-Tools Named Pipes
      '\\cachedump',                                  // Cred Dump-Tools Named Pipes
      '\\wceservicepipe',                             // Cred Dump-Tools Named Pipes
      '\\jaccdpqnvbrrxlaf',                           // PoshC2 default named pipe
      '\\svcctl',                                     // CrackMapExec default named pipe
      '\\csexecsvc'                                   // CSEXEC default named pipe
      '\\status_',                                    // CS default named pipes https://github.com/Neo23x0/sigma/issues/253
      '\\MSSE-',                                      // CobaltStrike default named pipe
      '\\status_',                                    // CobaltStrike default named pipe
      '\\msagent_',                                   // (target) CobaltStrike default named pipe
      '\\postex_ssh_',                                // CobaltStrike default named pipe
      '\\postex_',                                    // CobaltStrike default named pipe
      '\\Posh'                                        // PoshC2 default named pipe
  );
  DeviceEvents
  | where ActionType == "NamedPipeEvent"
  | extend ParsedFields=parse_json(AdditionalFields)
  | where ParsedFields.FileOperation == "File created"
  | where ParsedFields.PipeName has_any (badPipeNames)
  | project TimeGenerated, ActionType, DeviceName, InitiatingProcessAccountDomain, InitiatingProcessAccountName, InitiatingProcessFolderPath, InitiatingProcessCommandLine, ParsedFields.FileOperation, ParsedFields.PipeName
  | 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

Let binding: badPipeNames used in Stage 5

let badPipeNames = pack_array(
    '\\psexec',
    '\\paexec',
    '\\remcom',
    '\\csexec',
    '\\isapi_http',
    '\\isapi_dg',
    '\\isapi_dg2',
    '\\sdlrpc',
    '\\ahexec',
    '\\winsession',
    '\\lsassw',
    '\\46a676ab7f179e511e30dd2dc41bd388',
    '\\9f81f59bc58452127884ce513865ed20',
    '\\e710f28d59aa529d6792ca6ff0ca1b34',
    '\\rpchlp_3',
    '\\NamePipe_MoreWindows',
    '\\pcheap_reuse',
    '\\gruntsvc',
    '\\583da945-62af-10e8-4902-a8f205c72b2e',
    '\\bizkaz',
    '\\atctl',
    '\\userpipe',
    '\\iehelper',
    '\\sdlrpc',
    '\\comnap',
    '\\lsadump',
    '\\cachedump',
    '\\wceservicepipe',
    '\\jaccdpqnvbrrxlaf',
    '\\svcctl',
    '\\csexecsvc'
    '\\status_',
    '\\MSSE-',
    '\\status_',
    '\\msagent_',
    '\\postex_ssh_',
    '\\postex_',
    '\\Posh'
);

Stage 1: source

DeviceEvents

Stage 2: where

| where ActionType == "NamedPipeEvent"

Stage 3: extend

| extend ParsedFields=parse_json(AdditionalFields)

Stage 4: where

| where ParsedFields.FileOperation == "File created"

Stage 5: where

| where ParsedFields.PipeName has_any (badPipeNames)

Stage 6: project

| project TimeGenerated, ActionType, DeviceName, InitiatingProcessAccountDomain, InitiatingProcessAccountName, InitiatingProcessFolderPath, InitiatingProcessCommandLine, ParsedFields.FileOperation, ParsedFields.PipeName

Stage 7: extend

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

Stage 8: 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.

Output fields

These fields are emitted when the rule matches.

FieldSource
ActionTypeproject
DeviceNameproject
FileOperationproject
InitiatingProcessAccountDomainproject
InitiatingProcessAccountNameproject
InitiatingProcessCommandLineproject
InitiatingProcessFolderPathproject
PipeNameproject
TimeGeneratedproject
HostNameextend
DnsDomainextend