Detection rules › Splunk
rundll32 with No DLL in Command Line (Sysmon)
rundll32.exe is a legitimate Windows utility used to run functions stored in Dynamic Link Libraries. Typical usage would involve specifying a DLL file and a function to execute. Because rundll32 is a trusted system utility with the ability to execute code, it is a high value target for abuse by threat actors. This use case detects executions of rundll32.exe without a .dll referenced in the command line. Benign false positives from Internet Explorer parent processes have been filtered out
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Stealth | T1218.011 System Binary Proxy Execution: Rundll32 |
References
Event coverage
| Provider | Event | Title |
|---|---|---|
| Sysmon | Event ID 1 | Process creation |
Rule body yaml
id: '26999.49289'
title: rundll32 with No DLL in Command Line
description: rundll32.exe is a legitimate Windows utility used to run functions stored
in Dynamic Link Libraries. Typical usage would involve specifying a DLL file and
a function to execute. Because rundll32 is a trusted system utility with the ability
to execute code, it is a high value target for abuse by threat actors. This use
case detects executions of rundll32.exe without a .dll referenced in the command
line. Benign false positives from Internet Explorer parent processes have been filtered
out. Living Off the Land Binary and Scripts (LOLBAS) (LOLBIN)
logic_format: Splunk
logic: '`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<")
TERM(rundll32) OR "rundll32.exe" | where (match(process_name, "(?i)rundll32\.exe")
and not match(process, "(?i)(^\"C:\x5cWindows\x5csystem32\x5crundll32\.exe\"$)|(\.dll)"))
and (not match(parent_process_name, "(?i)iexplore\.exe") and not match(process,
"(?i)InetCpl\.cpl\,ClearMyTracksByProcess")) | table _time, host, user, process,
process_*, parent_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:
- Windows Sysmon
references:
- https://redcanary.com/threat-detection-report/techniques/rundll32/
Stages and Predicates
Stage 1: search
`get_endpoint_data` `get_endpoint_data_sysmon` (TERM(EventCode=1) OR "<EventID>1<") TERM(rundll32) OR "rundll32.exe"
Stage 2: where
| where (match(process_name, "(?i)rundll32\.exe") and not match(process, "(?i)(^\"C:\x5cWindows\x5csystem32\x5crundll32\.exe\"$)|(\.dll)")) and (not match(parent_process_name, "(?i)iexplore\.exe") and not match(process, "(?i)InetCpl\.cpl\,ClearMyTracksByProcess"))
Stage 3: table
| table _time, host, user, process, process_*, parent_process, parent_process_*
Stage 4: bucket
| bin span=1s
Stage 5: stats
| stats values(*) as * by _time, host
Exclusions
Top-level NOT(...) conjuncts: predicates this rule actively suppresses.
| Field | Kind | Excluded values |
|---|---|---|
parent_process_name | match | "(?i)iexplore\.exe" |
process | match | "(?i)(^\"C:\x5cWindows\x5csystem32\x5crundll32\.exe\"$)|(\.dll)" |
process | match | "(?i)InetCpl\.cpl\,ClearMyTracksByProcess" |
Indicators
Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.
| Field | Kind | Values |
|---|---|---|
EventCode | eq |
|
process_name | match |
|
Search terms
Bare-string tokens in the SPL search body. Splunk matches each token against _raw (the untyped raw event text) anywhere it appears, not against a specific field. These don't surface in the Indicators table because they aren't predicates on a known field.
| Stage | Term |
|---|---|
| 1 | TERM |
| 1 | "<EventID>1<" |
| 1 | TERM |
| 1 | rundll32 |
| 1 | "rundll32.exe" |