Detection rules › Splunk

pypykatz commands (Windows Event Log)

Group by
_time, host
Source
github.com/anvilogic-forge/armory

pypykatz is a Mimikatz implementation in Python. This use case looks for command parameters associated with pypykatz

MITRE ATT&CK coverage

TacticTechniques
Credential Access

References

Telemetry coverage

Rule body

id: '8301.10294'
title: pypykatz commands
description: 'pypykatz is a Mimikatz implementation in Python. This use case looks
  for command parameters associated with pypykatz. -- Threat Actor Association: APT15,
  Muddled Libra, Mustang Panda (aka. Stately Taurus//Earth Preta/BRONZE PRESIDENT/TA416/RedDelta)
  -- Software Association: BianLian, Vice Society, Yanluowang -- Atomics T1003.001
  Test #7 Atomics T1003.002 Test #2'
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
  "<EventID>4688<") (TERM(live) (TERM(lsa) OR TERM(kerberos) OR TERM(smbapi) OR TERM(users)
  OR TERM(token) OR TERM(process) OR TERM(dpapi) OR TERM(smb) OR TERM(ldap) OR TERM(registry)))
  OR (TERM(lsa) (TERM(minidump) OR TERM(rekall))) OR TERM(registry) OR (TERM(crypto)
  (TERM(nt) OR TERM(lm) OR TERM(dcc) OR TERM(dcc2) OR TERM(gppass))) OR (TERM(kerberos)
  (TERM(tgt) OR TERM(tgs) OR TERM(brute) OR TERM(asreproast) OR TERM(spnroast) OR
  TERM(s4u) OR TERM(keytab) OR TERM(ccache) OR TERM(kirbi))) OR (TERM(dpapi) (TERM(prekey)
  OR TERM(minidump) OR TERM(masterkey) OR TERM(credential) OR TERM(vcred) OR TERM(vpol)
  OR TERM(securestring) OR TERM(blob))) OR (TERM(SMB) (TERM(client) OR TERM(lsassfile)
  OR TERM(lsassdump) OR TERM(regfile) OR TERM(regdump) OR TERM(dcsync) OR TERM(secretsdump)
  OR TERM(shareenum) OR TERM(printnightmare) OR TERM(parprintnightmare))) OR (TERM(ldap)
  (client)) | table _time, host, user, signature_id, signature, process, process_*,
  parent_* | bin span=1s | stats values(*) as * by _time, host | where match(process,
  "(?i)\s+live\s+(lsa|registry|smb|kerberos|users|token|dpapi|process|ldap)") OR match(process,
  "(?i)\s+((lsa\s+(minidump|rekall|\-\-?\w))|(registry\s+(\-\-?\w|hk|\x5c).+)|(crypto\s+(nt|lm|dcc|gppass|\-\-?\w))|(kerberos\s+(tgt|tgs|brute|asreproast|spnroast|s4u|keytab|ccache|kirbi|\-\-?\w))|(dpapi\s+(prekey|minidump|masterkey|credential|vcred|vpol|securestring|blob|\-\-?\w))|(smb\s+(client|lsassfile|lsassdump|regfile|regdump|dcsync|secretsdump|shareenum|printnightmare|parprintnightmare|\-\-?\w))|(ldap\s+(client|\-\-?\w)))") '
techniques:
- credential-access:os credential dumping
- credential-access:os credential dumping:lsass memory
technique_id:
- T1003
- T1003.001
data_category:
- Windows event logs
- Process command-line parameters
references:
- https://blog.talosintelligence.com/2020/04/poetrat-covid-19-lures.html
- https://github.com/skelsec/pypykatz/wiki
- https://github.com/redcanaryco/atomic-red-team/blob/717757d539c1e7d5b8a2ab05b029f4697fbcc978/atomics/T1003.002/T1003.002.md#atomic-test-2---registry-parse-with-pypykatz

Stages and Predicates

Stage 1: search

`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<") (TERM(live) (TERM(lsa) OR TERM(kerberos) OR TERM(smbapi) OR TERM(users) OR TERM(token) OR TERM(process) OR TERM(dpapi) OR TERM(smb) OR TERM(ldap) OR TERM(registry))) OR (TERM(lsa) (TERM(minidump) OR TERM(rekall))) OR TERM(registry) OR (TERM(crypto) (TERM(nt) OR TERM(lm) OR TERM(dcc) OR TERM(dcc2) OR TERM(gppass))) OR (TERM(kerberos) (TERM(tgt) OR TERM(tgs) OR TERM(brute) OR TERM(asreproast) OR TERM(spnroast) OR TERM(s4u) OR TERM(keytab) OR TERM(ccache) OR TERM(kirbi))) OR (TERM(dpapi) (TERM(prekey) OR TERM(minidump) OR TERM(masterkey) OR TERM(credential) OR TERM(vcred) OR TERM(vpol) OR TERM(securestring) OR TERM(blob))) OR (TERM(SMB) (TERM(client) OR TERM(lsassfile) OR TERM(lsassdump) OR TERM(regfile) OR TERM(regdump) OR TERM(dcsync) OR TERM(secretsdump) OR TERM(shareenum) OR TERM(printnightmare) OR TERM(parprintnightmare))) OR (TERM(ldap) (client))

Stage 2: table

| table _time, host, user, signature_id, signature, process, process_*, parent_*

Stage 3: bucket

| bin span=1s

Stage 4: stats

| stats values(*) as * by _time, host

Stage 5: where

| where match(process, "(?i)\s+live\s+(lsa|registry|smb|kerberos|users|token|dpapi|process|ldap)") OR match(process, "(?i)\s+((lsa\s+(minidump|rekall|\-\-?\w))|(registry\s+(\-\-?\w|hk|\x5c).+)|(crypto\s+(nt|lm|dcc|gppass|\-\-?\w))|(kerberos\s+(tgt|tgs|brute|asreproast|spnroast|s4u|keytab|ccache|kirbi|\-\-?\w))|(dpapi\s+(prekey|minidump|masterkey|credential|vcred|vpol|securestring|blob|\-\-?\w))|(smb\s+(client|lsassfile|lsassdump|regfile|regdump|dcsync|secretsdump|shareenum|printnightmare|parprintnightmare|\-\-?\w))|(ldap\s+(client|\-\-?\w)))")

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
EventCodeeq
  • 4688 corpus 317 (splunk 283, kusto 33, elastic 1)
field:"EventID" kind:eq value:"4688"
processregex_match
  • "(?i)\s+((lsa\s+(minidump|rekall|\-\-?\w))|(registry\s+(\-\-?\w|hk|\x5c).+)|(crypto\s+(nt|lm|dcc|gppass|\-\-?\w))|(kerberos\s+(tgt|tgs|brute|asreproast|spnroast|s4u|keytab|ccache|kirbi|\-\-?\w))|(dpapi\s+(prekey|minidump|masterkey|credential|vcred|vpol|securestring|blob|\-\-?\w))|(smb\s+(client|lsassfile|lsassdump|regfile|regdump|dcsync|secretsdump|shareenum|printnightmare|parprintnightmare|\-\-?\w))|(ldap\s+(client|\-\-?\w)))"
  • "(?i)\s+live\s+(lsa|registry|smb|kerberos|users|token|dpapi|process|ldap)"
field:"CommandLine" kind:regex_match

Search terms

These SPL tokens match against raw event text.

StageTerm
1"<EventID>4688<"
1live
1lsa
1kerberos
1smbapi
1users
1token
1process
1dpapi
1smb
1ldap
1registry
1lsa
1minidump
1rekall
1registry
1crypto
1nt
1lm
1dcc
1dcc2
1gppass
1kerberos
1tgt
1tgs
1brute
1asreproast
1spnroast
1s4u
1keytab
1ccache
1kirbi
1dpapi
1prekey
1minidump
1masterkey
1credential
1vcred
1vpol
1securestring
1blob
1SMB
1client
1lsassfile
1lsassdump
1regfile
1regdump
1dcsync
1secretsdump
1shareenum
1printnightmare
1parprintnightmare
1ldap
1client