Detection rules › Splunk
Rubeus Password Change (Windows Event Log)
The changepw module will take a user's TGT .kirbi blog and execute a MS kpasswd password change with the specified /new:PASSWORD value. If a /dc is not specified, the computer's current domain controller is extracted and used as the destination for the password reset traffic. This is the Aorato Kerberos password reset disclosed in 2014, and is equivalent to Kekeo's misc::changepw function.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Initial Access | |
| Persistence | |
| Privilege Escalation | |
| Stealth | |
| Credential Access |
References
Telemetry coverage
Rule body
id: '5471.5637'
title: Rubeus Password Change
description: The changepw module will take a user's TGT .kirbi blog and execute a
MS kpasswd password change with the specified /new:PASSWORD value. If a /dc is not
specified, the computer's current domain controller is extracted and used as the
destination for the password reset traffic. This is the Aorato Kerberos password
reset disclosed in 2014, and is equivalent to Kekeo's misc::changepw function.
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4738) OR
"<EventID>4738<") TERM(ANONYMOUS) TERM(LOGON) ) OR (TERM(EventCode=4723) OR "<EventID>4723<")
| eval user=mvappend(coi_user, user) | table _time, host, user, signature_id, session_id,
signature | bin span=5s | stats values(*) as * by _time, host | where match(signature_id,
"4738") AND match(signature_id, "4723") '
techniques:
- persistence:valid accounts
- privilege-escalation:valid accounts
- defense-evasion:valid accounts
- credential-access:steal or forge kerberos tickets
technique_id:
- T1078
- T1558
data_category:
- Windows event logs
references:
- https://github.com/GhostPack/Rubeus/blob/master/Rubeus/Commands/Changepw.cs
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` ((TERM(EventCode=4738) OR "<EventID>4738<") TERM(ANONYMOUS) TERM(LOGON) ) OR (TERM(EventCode=4723) OR "<EventID>4723<")
Stage 2: eval
| eval user=mvappend(coi_user, user)
Stage 3: table
| table _time, host, user, signature_id, session_id, signature
Stage 4: bucket
| bin span=5s
Stage 5: stats
| stats values(*) as * by _time, host
Stage 6: where
| where match(signature_id, "4738") AND match(signature_id, "4723")
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq |
signature_id | regex_match |
| field:"signature_id" kind:regex_match |
Search terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4738<" |
| 1 | ANONYMOUS |
| 1 | LOGON |
| 1 | "<EventID>4723<" |