Detection rules › Splunk
rundll32.exe Executing DLL from Non-standard Directory (Windows Event Log)
rundll32.exe is a legitimate Windows utility used to run functions stored in Dynamic Link Libraries. Because rundll32 is a trusted system utility with the ability to execute code, it is a high value target for abuse by threat actors. Threat actors leveraging Qbot malware have been observed dropping DLLs into writeable paths and calling them with rundll32.exe. This use case detects when a DLL in a nonstandard directory is called by rundll32
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Stealth |
References
Telemetry coverage
| Provider | Record / event type |
|---|---|
| Security-Auditing | Event ID 4688: A new process has been created. |
Rule body
id: '27238.49666'
title: rundll32.exe Executing DLL from Non-standard Directory
description: rundll32.exe is a legitimate Windows utility used to run functions stored
in Dynamic Link Libraries. Because rundll32 is a trusted system utility with the
ability to execute code, it is a high value target for abuse by threat actors. Threat
actors leveraging Qbot malware have been observed dropping DLLs into writeable paths
and calling them with rundll32.exe. This use case detects when a DLL in a nonstandard
directory is called by rundll32. Living Off the Land Binary and Scripts (LOLBAS)
(LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR
"<EventID>4688<" OR Type=Process) "rundll32" ".dll" | regex process_name="(?i)rundll32\.exe"|
regex process!="(?i)(rundll32(\.exe)?\"?\s+(\/\w+\s+)?[\w.]+\.dll)|(C:\x5c(Windows\x5c(System32|WinSxS|SysWoW64)|Program\sFiles(\s\(x86\))?\x5c.+\.dll))"|
table _time, host, user process, process_*, parent_process_* | bin span=1s | stats
values(*) as * by _time, host '
techniques:
- defense-evasion:system binary proxy execution:rundll32
technique_id:
- T1218.011
data_category:
- Process command-line parameters
- Windows event logs
references:
- https://redcanary.com/blog/lolbins-abuse/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_winevent` (TERM(EventCode=4688) OR "<EventID>4688<" OR Type=Process) "rundll32" ".dll"
Stage 2: regex
| regex process_name="(?i)rundll32\.exe"
Stage 3: regex
| regex process!="(?i)(rundll32(\.exe)?\"?\s+(\/\w+\s+)?[\w.]+\.dll)|(C:\x5c(Windows\x5c(System32|WinSxS|SysWoW64)|Program\sFiles(\s\(x86\))?\x5c.+\.dll))"
Stage 4: table
| table _time, host, user process, process_*, parent_process_*
Stage 5: bucket
| bin span=1s
Stage 6: stats
| stats values(*) as * by _time, host
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
process | regex_match | "(?i)(rundll32(.exe)?\"?\s+(\/\w+\s+)?[\w.]+.dll), (C:\x5c(Windows\x5c(System32|WinSxS|SysWoW64)|Program\sFiles(\s(x86))?\x5c.+.dll))" | excludes:process |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventCode | eq |
| field:"EventID" kind:eq value:"4688" |
process_name | regex_match |
| field:"process_name" kind:regex_match |
Search terms
These SPL tokens match against raw event text.
| Stage | Term |
|---|---|
| 1 | "<EventID>4688<" |
| 1 | "rundll32" |
| 1 | ".dll" |