Question Analysis
A Windows host logs show PowerShell fetching and executing a remote script to gain SeDebugPrivilege token duplication. Which Empire module was invoked?
34f0a430-9d04-4d98-bcb5-1989f14719f0
Question ID
6/23
Models Correct
1
Valid Answer
26%
Success Rate
Reference Answer
Human-validated correct answer for this question
Get-System
Model Performance Comparison
See how different AI models performed on this question
Model | Answer | KQL Query | Status | Attempts | Time | Cost |
---|---|---|---|---|---|---|
gemini-2.5-flash-preview-04-17 | Get-System | DeviceProcessEvents
| where FileName in~ ('powershell.exe', 'pwsh.exe')
| where ActionType == 'ProcessCreated'
| where ProcessCommandLine has_any ('iex', 'Invoke-Expression') and ProcessCommandLine has_any ('DownloadString', 'Invoke-WebRequest', 'http://', 'https://')
| project Timestamp, DeviceName, AccountName, InitiatingProcessCommandLine, ProcessCommandLine, ReportId | Correct | 1 | 20.51s | 0.0098 |
gpt-35-turbo | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0115 |
gpt-4-turbo-2024-04-09 | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.2320 |
gpt-4.1 | Get-System | DeviceProcessEvents
| where FileName =~ "powershell.exe"
| where ProcessCommandLine has_any ("SeDebugPrivilege", "token", "Invoke-TokenManipulation", "Invoke-Token")
| where ProcessCommandLine has_any ("http://", "https://") // Indicates remote script fetch
| project TimeGenerated, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, FileName, FolderPath
| top 20 by TimeGenerated desc | Correct | 1 | 5.32s | 0.0118 |
gpt-4.1-finetuned | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0420 |
gpt-4.1-mini | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0079 |
gpt-4.1-nano | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0017 |
gpt-4o | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0556 |
gpt-5-high | Get-System | // Detect the Empire module used to gain SeDebugPrivilege via token duplication
// Time range is set by the query invocation context
// 1) PowerShell process events (attempt to decode -EncodedCommand)
let ps_proc =
DeviceProcessEvents
| where FileName in~ ("powershell.exe", "pwsh.exe", "powershell_ise.exe")
| extend RawCmd = tostring(ProcessCommandLine)
// Extract possible -EncodedCommand payload (quoted or unquoted)
| extend Enc1 = extract(@'(?i)(?:^|\s)(?:-|/)(?:e|enc|encodedcommand)\s+"([^"]+)"', 1, RawCmd)
| extend Enc2 = extract(@"(?i)(?:^|\s)(?:-|/)(?:e|enc|encodedcommand)\s+'([^']+)'", 1, RawCmd)
| extend Enc3 = extract(@'(?i)(?:^|\s)(?:-|/)(?:e|enc|encodedcommand)\s+([A-Za-z0-9+/=]{8,})', 1, RawCmd)
| extend Enc = coalesce(Enc1, Enc2, Enc3)
| extend Decoded = iff(isnotempty(Enc), base64_decode_tostring(replace_string(Enc, " ", "")), "")
| extend FullText = trim(' ', strcat(RawCmd, ' ', Decoded))
| extend FullText_l = tolower(FullText)
// Remote fetch indicators (relaxed) + execution
| where FullText_l has_any ("downloadstring","invoke-webrequest","iwr","start-bitstransfer","bitsadmin","system.net.webclient","new-object net.webclient","curl","wget")
| where FullText_l has_any ("invoke-expression","iex","|iex"," | iex",".downloadstring(")
// Token duplication / SeDebugPrivilege / Empire module cues
| where FullText_l has_any ("invoke-tokenmanipulation","get-system","getsystem","sedebugprivilege","duplicatetoken","duplicate token","impersonat")
| extend EmpireModule = case(
FullText_l matches regex @"\binvoke[-_ ]?tokenmanipulation\b", "Invoke-TokenManipulation",
FullText_l matches regex @"\bget[-_ ]?system\b", "Get-System",
FullText_l has "sedebugprivilege" and FullText_l has_any ("duplicatetoken","duplicate token","impersonat"), "Invoke-TokenManipulation",
"Unknown"
)
| project TimeGenerated, DeviceId, DeviceName, AccountName, ProcessId, FullText, EmpireModule;
// 2) PowerShell command/script logging (ScriptBlock, etc.)
let ps_logs =
DeviceEvents
| where ActionType in~ ("PowerShellCommand","PowerShellScript","PowerShellScriptBlockLogging","PowerShellSuspiciousCommand")
| extend PsText = coalesce(
tostring(AdditionalFields.ScriptBlockText),
tostring(AdditionalFields.Command),
tostring(AdditionalFields.ScriptContent),
tostring(AdditionalFields.ScriptName),
tostring(AdditionalFields.Payload)
)
| where isnotempty(PsText)
| extend Text_l = tolower(PsText)
| where Text_l has_any ("downloadstring","invoke-webrequest","iwr","start-bitstransfer","bitsadmin","system.net.webclient","new-object net.webclient","curl","wget")
| where Text_l has_any ("invoke-expression","iex","|iex"," | iex",".downloadstring(")
| where Text_l has_any ("invoke-tokenmanipulation","get-system","getsystem","sedebugprivilege","duplicatetoken","duplicate token","impersonat")
| extend EmpireModule = case(
Text_l matches regex @"\binvoke[-_ ]?tokenmanipulation\b", "Invoke-TokenManipulation",
Text_l matches regex @"\bget[-_ ]?system\b", "Get-System",
Text_l has "sedebugprivilege" and Text_l has_any ("duplicatetoken","duplicate token","impersonat"), "Invoke-TokenManipulation",
"Unknown"
)
| project TimeGenerated, DeviceId, DeviceName, AccountName, ProcessId=tolong(AdditionalFields.ProcessId), FullText=PsText, EmpireModule;
// 3) Combine and answer: which Empire module(s) were invoked
union isfuzzy=true ps_proc, ps_logs
| where EmpireModule != "Unknown"
| summarize
FirstSeen=min(TimeGenerated),
LastSeen=max(TimeGenerated),
Devices=make_set(DeviceName, 10),
Samples=make_set(substring(FullText, 0, 220), 5)
by EmpireModule
| order by LastSeen desc | Correct | 5 | 668.71s | 0.3114 |
gpt-5-mini-high | Get-System | // Find PowerShell commands that fetch/execute remote scripts and reference SeDebug/token behavior, extract Invoke-* names (likely Empire module names)
let hits =
(
union isfuzzy=true
(
DeviceProcessEvents
| project TimeGenerated, DeviceName, ProcessId, CommandLine = ProcessCommandLine, InitiatingCommandLine = InitiatingProcessCommandLine, InitiatingFileName = InitiatingProcessFileName, RemoteUrl = ""
),
(
DeviceEvents
| project TimeGenerated, DeviceName, ProcessId = ProcessId, CommandLine = ProcessCommandLine, InitiatingCommandLine = InitiatingProcessCommandLine, InitiatingFileName = InitiatingProcessFileName, RemoteUrl = FileOriginUrl
)
)
| where tolower(CommandLine) has "powershell"
// indicators of remote fetch/execute
| where tolower(CommandLine) has_any ("iex", "invoke-expression", "invoke-webrequest", "invoke-restmethod", "downloadstring", "downloadfile", "-encodedcommand", "iwr ", "irm ")
// indicators of token/SeDebug usage or explicit Invoke-Module names
| where tolower(CommandLine) has_any ("sedebug", "sedebugprivilege", "se_debug", "token", "invoke-")
| extend Modules = extract_all(@"(?i)(Invoke-[A-Za-z0-9_]+)", CommandLine)
| mv-expand Modules
| extend Module = tostring(Modules)
;
// Summary of candidate modules (likely Empire module names)
hits
| summarize Count = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) by Module
| order by Count desc
// Recent sample events for analyst review (top 50)
| union (
hits
| top 50 by TimeGenerated desc
| project TimeGenerated, DeviceName, ProcessId, Module, CommandLine, InitiatingCommandLine, InitiatingFileName, RemoteUrl
)
| Correct | 1 | 35.67s | 0.0088 |
gpt-5-mini-low | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0173 |
gpt-5-mini-medium | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0322 |
gpt-5-nano-high | Get-System | let psRemoteEvents =
DeviceProcessEvents
| where InitiatingProcessFileName in ("powershell.exe","pwsh.exe")
| where (InitiatingProcessCommandLine contains "IEX" or InitiatingProcessCommandLine contains "Invoke-Expression" or InitiatingProcessCommandLine contains "DownloadString" or InitiatingProcessCommandLine contains "Invoke-WebRequest" or InitiatingProcessCommandLine contains "New-Object System.Net.WebClient")
| join kind=inner (
DeviceNetworkEvents
| where isnotempty(RemoteUrl)
| extend NetTimeGenerated = TimeGenerated
| project InitiatingProcessId, RemoteUrlUsed = RemoteUrl, NetTimeGenerated
) on InitiatingProcessId
| extend RemoteUrlUsed = RemoteUrlUsed
| extend EmpireModuleCandidate = coalesce(tostring(extract(@"([^/?#]+)\\.ps1$", 1, RemoteUrlUsed)), tostring(extract(@"([^/?#]+)$", 1, RemoteUrlUsed)))
| where isnotempty(EmpireModuleCandidate)
| project TimeGenerated = NetTimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrlUsed, EmpireModuleCandidate;
psRemoteEvents | Correct | 3 | 68.28s | 0.0056 |
gpt-5-nano-medium | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0088 |
grok-3-beta | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.1036 |
grok-3-mini-beta | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0078 |
o1-high | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.8012 |
o1-low | Get-System | DeviceProcessEvents
| where FileName in~ ("powershell.exe", "powershell_ise.exe")
// Filter for PowerShell processes.
| where isnotempty(ProcessCommandLine)
// Ensure we have a command line to investigate.
| where ProcessCommandLine has_any ("IEX", "Invoke-Expression", "SeDebugPrivilege", "Invoke-TokenManipulation", "empire")
// Look for script loading, token manipulation, or Empire references.
| parse kind=regex ProcessCommandLine with * "powershell/" ModuleName " " *
// Attempt to parse out the Empire module name from the command.
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine, ModuleName
| order by TimeGenerated desc | Correct | 1 | 38.59s | 0.2849 |
o3-high | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0938 |
o3-mini-high | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0395 |
o3-mini-low | No answer provided | No query generated | Incorrect | 5 | 0.00s | 0.0432 |
o4-mini-high | WinPwn | DeviceProcessEvents
| where FileName =~ "powershell.exe"
| where ProcessCommandLine contains "DownloadString" and ProcessCommandLine contains "IEX"
| extend EmpireModuleWithExt = extract(@"\/([^\/]+\.ps1)", 1, ProcessCommandLine)
| extend EmpireModule = replace(@"\.ps1$", "", EmpireModuleWithExt)
| project TimeGenerated, DeviceName, InitiatingProcessAccountName, ProcessCommandLine, EmpireModule | Incorrect | 2 | 63.39s | 0.0218 |
o4-mini-low | Invoke-Seatbelt | DeviceProcessEvents
| where ProcessCommandLine matches regex "(?i)powershell.*DownloadString.*Invoke-[A-Za-z-]+"
// Extract the Empire module name (Invoke-…)
| extend EmpireModule = extract(@"(Invoke-[A-Za-z-]+)", 1, ProcessCommandLine)
| project TimeGenerated, DeviceName, ProcessCommandLine, EmpireModule
| summarize Count = count() by EmpireModule, DeviceName
| order by Count desc | Incorrect | 1 | 26.97s | 0.0067 |